aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/tools
diff options
context:
space:
mode:
authorSebastian Spaeth <Sebastian@SSpaeth.de>2012-12-02 00:29:30 +0100
committerSebastian Spaeth <Sebastian@SSpaeth.de>2012-12-02 00:29:30 +0100
commit6ef75af50ecd9b71a5d9455f616c421b1d84b732 (patch)
tree2b58b181f1ba6937489c6d51f9ef39500a92cd02 /mediagoblin/tools
parent7b9f9d1edb96aabab7e35818824b71efbdd4efb9 (diff)
downloadmediagoblin-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.py4
-rw-r--r--mediagoblin/tools/translate.py28
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):