73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
based on:
|
|
Localization patch for Plex Media Server channels
|
|
https://bitbucket.org/czukowski/plex-locale-patch/
|
|
Copyright: 2015, Korney Czukowski
|
|
License: MIT
|
|
"""
|
|
|
|
languages = list()
|
|
|
|
|
|
# Translate function override to avoid unicode decoding bug.
|
|
def L(string):
|
|
initialize_locale()
|
|
local_string = Locale.LocalString(string)
|
|
return str(local_string).decode()
|
|
|
|
|
|
# Client language detection.
|
|
# Make sure this function does its thing only the first time it's called (once per request).
|
|
def initialize_locale():
|
|
if 'Plex-Locale-Patch' in Request.Headers:
|
|
return Request.Headers['X-Plex-Language']
|
|
for parse_func in [parse_x_plex_language_value, parse_accept_language_value]:
|
|
value = parse_func()
|
|
if value:
|
|
set_language_header(value)
|
|
break
|
|
if not value:
|
|
Log('Locale Patch: language not detected. All request headers: %s' % str(Request.Headers))
|
|
Request.Headers['Plex-Locale-Patch'] = 'y'
|
|
return value
|
|
|
|
|
|
# Parse 'X-Plex-Language' header
|
|
def parse_x_plex_language_value():
|
|
if 'X-Plex-Language' in Request.Headers:
|
|
header_value = Request.Headers['X-Plex-Language']
|
|
matched_value = Locale.Language.Match(header_value)
|
|
if matched_value == 'xx':
|
|
return
|
|
Log('Locale Patch: found language in X-Plex-Language header ("%s" matched to "%s")' % (header_value, matched_value))
|
|
return matched_value
|
|
|
|
|
|
# Parse 'Accept-Language' header
|
|
# Based on http://stackoverflow.com/a/17911139
|
|
def parse_accept_language_value():
|
|
if 'Accept-Language' in Request.Headers:
|
|
header_value = Request.Headers['Accept-Language']
|
|
# Extract all locales and their preference (q)
|
|
locales = [] # e.g. [('es', 1.0), ('en-US', 0.8), ('en', 0.6)]
|
|
for locale_str in header_value.replace(' ', '').lower().split(','):
|
|
locale_parts = locale_str.split(';q=')
|
|
locale = locale_parts[0]
|
|
if len(locale_parts) > 1:
|
|
locale_q = float(locale_parts[1])
|
|
else:
|
|
locale_q = 1.0
|
|
locales.append((locale, locale_q))
|
|
# Sort locales according to preference
|
|
locales.sort(key=lambda locale_tuple: locale_tuple[1], reverse=True)
|
|
# Remove weights from the list, keep only locale names
|
|
locales = map(lambda locale_tuple: locale_tuple[0], locales)
|
|
if len(locales):
|
|
Log('Locale Patch: found languages in Accept-Language header (%s)' % header_value)
|
|
return locales[0]
|
|
|
|
|
|
def set_language_header(value):
|
|
Request.Headers['X-Plex-Language'] = value
|