Fix i18n in our browser
authorSebastian Spaeth <Sebastian@SSpaeth.de>
Sat, 1 Dec 2012 22:35:52 +0000 (23:35 +0100)
committerSebastian Spaeth <Sebastian@SSpaeth.de>
Sat, 1 Dec 2012 22:40:10 +0000 (23:40 +0100)
We only ever served english pages since the switch to werkzeug's requests.
Fix this by actually checking the accepted languages that our web browser
sends and using that or falling back to english.

This is not optimal, imaging our browser sends "klingon, de" as accepted
languages and we happen to not have a klingon translation ready (a deficiency
that should be corrected immediately anyway!!). We would then fall back
to english rather than sending the sensible and pleasant German language
which the user would understand. This will require more backend work though.

Removing the gettext.find() in mg_globals.py. It looked in the wrong directory
anyway (mediagoblin/translations) and as that does not exist, had always returned
None without anyone noticing.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
mediagoblin/app.py
mediagoblin/mg_globals.py
mediagoblin/tools/translate.py

index 3a2d00f0663ad0d8f904015d0161fe8968e926d7..de421aca6241f2cb253b53ae9d69fffbf6af93af 100644 (file)
@@ -134,7 +134,6 @@ class MediaGoblinApp(object):
 
         ## Compatibility webob -> werkzeug
         request.GET = request.args
-        request.accept_language = request.accept_languages
         request.accept = request.accept_mimetypes
 
         ## Routing / controller loading stuff
index fffa1ddae9f083e0aa49fc126607728e5dff6245..356a944d981cfa86efa941207ec528d2cb0b7d1c 100644 (file)
@@ -45,11 +45,8 @@ workbench_manager = None
 # A thread-local scope
 thread_scope = threading.local()
 
-# gettext
-thread_scope.translations = gettext.find(
-    'mediagoblin',
-    pkg_resources.resource_filename(
-    'mediagoblin', 'translations'), ['en'])
+# gettext (this will be populated on demand with gettext.Translations)
+thread_scope.translations = None
 
 # app and global config objects
 app_config = None
index 01cabe6a38362144e30d2f01b73a06a45a9715fa..ce6704514ad91d3b0b3af674775a0f9988e13a26 100644 (file)
@@ -32,7 +32,7 @@ TRANSLATIONS_PATH = pkg_resources.resource_filename(
 
 def locale_to_lower_upper(locale):
     """
-    Take a locale, regardless of style, and format it like "en-US"
+    Take a locale, regardless of style, and format it like "en_US"
     """
     if '-' in locale:
         lang, country = locale.split('-', 1)
@@ -60,17 +60,23 @@ def get_locale_from_request(request):
     Figure out what target language is most appropriate based on the
     request
     """
-    request_form = request.GET or request.form
+    request_form = request.args or request.form
 
     if request_form.has_key('lang'):
-        return locale_to_lower_upper(request_form['lang'])
+        # User explicitely demanded a language
+        target_lang = request_form['lang']
 
-    if 'target_lang' in request.session:
+    elif 'target_lang' in request.session:
+        # TODO: Uh, ohh, this is never ever set anywhere?
         target_lang = request.session['target_lang']
-    # Pull the first acceptable language or English
     else:
-        # TODO: Internationalization broken
-        target_lang = 'en'
+        # Pull the first acceptable language or English
+        # This picks your favorite browser lingo, falling back to 'en'
+
+        # 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)
 
@@ -97,11 +103,6 @@ def setup_gettext(locale):
     mg_globals.thread_scope.translations = this_gettext
 
 
-# Force en to be setup before anything else so that
-# mg_globals.translations is never None
-setup_gettext('en')
-
-
 def pass_to_ugettext(*args, **kwargs):
     """
     Pass a translation on to the appropriate ugettext method.