Browse Source

Take territory code into account during language selection

This fixes (#299) a bug that made translations with territory code
'unsavable'. The reason for this is, that the Locale.language attribute
returns the language without the territory code. Translations like
'de_AT' or 'pt_BR' where unusable because of that -- 'de' or 'pt' would
work because no territory code (= AT, BR, etc) is used.
Peter Justin 7 years ago
parent
commit
ff696d91fd
4 changed files with 38 additions and 25 deletions
  1. 2 3
      flaskbb/auth/views.py
  2. 4 12
      flaskbb/fixtures/settings.py
  3. 4 8
      flaskbb/user/views.py
  4. 28 2
      flaskbb/utils/helpers.py

+ 2 - 3
flaskbb/auth/views.py

@@ -18,7 +18,7 @@ from flask_babelplus import gettext as _
 
 
 from flaskbb.extensions import limiter
 from flaskbb.extensions import limiter
 from flaskbb.utils.helpers import (render_template, redirect_or_next,
 from flaskbb.utils.helpers import (render_template, redirect_or_next,
-                                   format_timedelta)
+                                   format_timedelta, get_available_languages)
 from flaskbb.email import send_reset_token, send_activation_token
 from flaskbb.email import send_reset_token, send_activation_token
 from flaskbb.exceptions import AuthenticationError
 from flaskbb.exceptions import AuthenticationError
 from flaskbb.auth.forms import (LoginForm, LoginRecaptchaForm, ReauthForm,
 from flaskbb.auth.forms import (LoginForm, LoginRecaptchaForm, ReauthForm,
@@ -26,7 +26,6 @@ from flaskbb.auth.forms import (LoginForm, LoginRecaptchaForm, ReauthForm,
                                 RegisterForm, AccountActivationForm,
                                 RegisterForm, AccountActivationForm,
                                 RequestActivationForm)
                                 RequestActivationForm)
 from flaskbb.user.models import User
 from flaskbb.user.models import User
-from flaskbb.fixtures.settings import available_languages
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.tokens import get_token_status
 from flaskbb.utils.tokens import get_token_status
 
 
@@ -145,7 +144,7 @@ def register():
 
 
     form = RegisterForm(request.form)
     form = RegisterForm(request.form)
 
 
-    form.language.choices = available_languages()
+    form.language.choices = get_available_languages()
     form.language.default = flaskbb_config['DEFAULT_LANGUAGE']
     form.language.default = flaskbb_config['DEFAULT_LANGUAGE']
     form.process(request.form)  # needed because a default is overriden
     form.process(request.form)  # needed because a default is overriden
 
 

+ 4 - 12
flaskbb/fixtures/settings.py

@@ -8,24 +8,16 @@
     :copyright: (c) 2014 by the FlaskBB Team.
     :copyright: (c) 2014 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
     :license: BSD, see LICENSE for more details.
 """
 """
-from flask_themes2 import get_themes_list
-
-from flaskbb.extensions import babel
-
-
-def available_themes():
-    return [(theme.identifier, theme.name) for theme in get_themes_list()]
+# import .. as .. to make it backwards compatible
+from flaskbb.utils.helpers import \
+    get_available_languages as available_languages, \
+    get_available_themes as available_themes
 
 
 
 
 def available_avatar_types():
 def available_avatar_types():
     return [("PNG", "PNG"), ("JPEG", "JPG"), ("GIF", "GIF")]
     return [("PNG", "PNG"), ("JPEG", "JPG"), ("GIF", "GIF")]
 
 
 
 
-def available_languages():
-    return [(locale.language, locale.display_name)
-            for locale in babel.list_translations()]
-
-
 fixture = (
 fixture = (
     # Settings Group
     # Settings Group
     ('general', {
     ('general', {

+ 4 - 8
flaskbb/user/views.py

@@ -11,11 +11,10 @@
 """
 """
 from flask import Blueprint, flash, request
 from flask import Blueprint, flash, request
 from flask_login import login_required, current_user
 from flask_login import login_required, current_user
-from flask_themes2 import get_themes_list
 from flask_babelplus import gettext as _
 from flask_babelplus import gettext as _
 
 
-from flaskbb.extensions import babel
-from flaskbb.utils.helpers import render_template
+from flaskbb.utils.helpers import (render_template, get_available_languages,
+                                   get_available_themes)
 from flaskbb.user.models import User
 from flaskbb.user.models import User
 from flaskbb.user.forms import (ChangePasswordForm, ChangeEmailForm,
 from flaskbb.user.forms import (ChangePasswordForm, ChangeEmailForm,
                                 ChangeUserDetailsForm, GeneralSettingsForm)
                                 ChangeUserDetailsForm, GeneralSettingsForm)
@@ -52,11 +51,8 @@ def view_all_posts(username):
 def settings():
 def settings():
     form = GeneralSettingsForm()
     form = GeneralSettingsForm()
 
 
-    form.theme.choices = [(theme.identifier, theme.name)
-                          for theme in get_themes_list()]
-
-    form.language.choices = [(locale.language, locale.display_name)
-                             for locale in babel.list_translations()]
+    form.theme.choices = get_available_themes()
+    form.language.choices = get_available_languages()
 
 
     if form.validate_on_submit():
     if form.validate_on_submit():
         current_user.theme = form.theme.data
         current_user.theme = form.theme.data

+ 28 - 2
flaskbb/utils/helpers.py

@@ -23,13 +23,14 @@ import requests
 import unidecode
 import unidecode
 from flask import session, url_for, flash, redirect, request
 from flask import session, url_for, flash, redirect, request
 from jinja2 import Markup
 from jinja2 import Markup
+from babel.core import get_locale_identifier
 from babel.dates import format_timedelta as babel_format_timedelta
 from babel.dates import format_timedelta as babel_format_timedelta
 from flask_babelplus import lazy_gettext as _
 from flask_babelplus import lazy_gettext as _
-from flask_themes2 import render_theme_template
+from flask_themes2 import render_theme_template, get_themes_list
 from flask_login import current_user
 from flask_login import current_user
 
 
 from flaskbb._compat import range_method, text_type, iteritems
 from flaskbb._compat import range_method, text_type, iteritems
-from flaskbb.extensions import redis_store
+from flaskbb.extensions import redis_store, babel
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.markup import markdown
 from flaskbb.utils.markup import markdown
 from flask_allows import Permission
 from flask_allows import Permission
@@ -513,6 +514,31 @@ def get_alembic_branches():
     return branches_dirs
     return branches_dirs
 
 
 
 
+def get_available_themes():
+    """Returns a list that contains all available themes. The items in the
+    list are tuples where the first item of the tuple is the identifier and
+    the second one the name of the theme.
+    For example::
+
+        [('aurora_mod', 'Aurora Mod')]
+    """
+    return [(theme.identifier, theme.name) for theme in get_themes_list()]
+
+
+def get_available_languages():
+    """Returns a list that contains all available languages. The items in the
+    list are tuples where the first item of the tuple is the locale
+    identifier (i.e. de_AT) and the second one the display name of the locale.
+    For example::
+
+        [('de_AT', 'Deutsch (Österreich)')]
+    """
+    return [
+        (get_locale_identifier((l.language, l.territory)), l.display_name)
+        for l in babel.list_translations()
+    ]
+
+
 def app_config_from_env(app, prefix="FLASKBB_"):
 def app_config_from_env(app, prefix="FLASKBB_"):
     """Retrieves the configuration variables from the environment.
     """Retrieves the configuration variables from the environment.
     Set your environment variables like this::
     Set your environment variables like this::