diff options
author | Sebastian Spaeth <Sebastian@SSpaeth.de> | 2012-12-02 00:29:30 +0100 |
---|---|---|
committer | Sebastian Spaeth <Sebastian@SSpaeth.de> | 2012-12-02 00:29:30 +0100 |
commit | 6ef75af50ecd9b71a5d9455f616c421b1d84b732 (patch) | |
tree | 2b58b181f1ba6937489c6d51f9ef39500a92cd02 /mediagoblin/tools | |
parent | 7b9f9d1edb96aabab7e35818824b71efbdd4efb9 (diff) | |
download | mediagoblin-6ef75af50ecd9b71a5d9455f616c421b1d84b732.tar.lz mediagoblin-6ef75af50ecd9b71a5d9455f616c421b1d84b732.tar.xz mediagoblin-6ef75af50ecd9b71a5d9455f616c421b1d84b732.zip |
Honor user's browser language (#558)
Previously we would attempt to satisfy the user's first language
preference, immediately falling back to english if that was not
possible. Now, we will get the best match of the user's preferred
languages.
This requires storing the available locales on app startup, so we
have mg_globals.available_locales ready to compare them against the
list of preferred user languages.
Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
Diffstat (limited to 'mediagoblin/tools')
-rw-r--r-- | mediagoblin/tools/template.py | 4 | ||||
-rw-r--r-- | mediagoblin/tools/translate.py | 28 |
2 files changed, 21 insertions, 11 deletions
diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index 158d5321..6f603bab 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -20,7 +20,7 @@ from babel.localedata import exists from mediagoblin import mg_globals from mediagoblin import messages from mediagoblin.tools import common -from mediagoblin.tools.translate import setup_gettext +from mediagoblin.tools.translate import get_gettext_translation from mediagoblin.meddleware.csrf import render_csrf_form_token @@ -34,7 +34,7 @@ def get_jinja_env(template_loader, locale): (In the future we may have another system for providing theming; for now this is good enough.) """ - setup_gettext(locale) + mg_globals.thread_scope.translations = get_gettext_translation(locale) # If we have a jinja environment set up with this locale, just # return that one. diff --git a/mediagoblin/tools/translate.py b/mediagoblin/tools/translate.py index ce670451..b6b7a527 100644 --- a/mediagoblin/tools/translate.py +++ b/mediagoblin/tools/translate.py @@ -16,7 +16,9 @@ import gettext import pkg_resources -from babel.localedata import exists + + +from babel import localedata from babel.support import LazyProxy from mediagoblin import mg_globals @@ -30,6 +32,15 @@ TRANSLATIONS_PATH = pkg_resources.resource_filename( 'mediagoblin', 'i18n') +def get_available_locales(): + """Return a list of locales for which we have translations""" + locales=[] + for locale in localedata.list(): + if gettext.find('mediagoblin', TRANSLATIONS_PATH, [locale]): + locales.append(locale) + return locales + + def locale_to_lower_upper(locale): """ Take a locale, regardless of style, and format it like "en_US" @@ -76,15 +87,15 @@ def get_locale_from_request(request): # TODO: We need a list of available locales, and match with the list # of accepted locales, and serve the best available locale rather than # the most preferred, or fall back to 'en' immediately. - target_lang = request.accept_languages.best - - return locale_to_lower_upper(target_lang) + target_lang = request.accept_languages.best_match( + mg_globals.available_locales) + return locale_to_lower_upper(target_lang) SETUP_GETTEXTS = {} -def setup_gettext(locale): +def get_gettext_translation(locale): """ - Setup the gettext instance based on this locale + Return the gettext instance based on this locale """ # Later on when we have plugins we may want to enable the # multi-translations system they have so we can handle plugin @@ -97,10 +108,9 @@ def setup_gettext(locale): else: this_gettext = gettext.translation( 'mediagoblin', TRANSLATIONS_PATH, [locale], fallback=True) - if exists(locale): + if localedata.exists(locale): SETUP_GETTEXTS[locale] = this_gettext - - mg_globals.thread_scope.translations = this_gettext + return this_gettext def pass_to_ugettext(*args, **kwargs): |