Просмотр исходного кода

Plugins can be translated now too.

sh4nks 10 лет назад
Родитель
Сommit
ddea705abe

+ 10 - 10
flaskbb/app.py

@@ -37,6 +37,7 @@ from flask.ext.whooshalchemy import whoosh_index
 from flaskbb.utils.helpers import format_date, time_since, crop_title, \
     is_online, render_markup, mark_online, forum_is_unread, topic_is_unread, \
     render_template
+from flaskbb.utils.translations import FlaskBBDomain
 # permission checks (here they are used for the jinja filters)
 from flaskbb.utils.permissions import can_post_reply, can_post_topic, \
     can_delete_topic, can_delete_post, can_edit_post, can_edit_user, \
@@ -139,8 +140,8 @@ def configure_extensions(app):
 
     login_manager.init_app(app)
 
-    # Flask-Babel
-    babel.init_app(app)
+    # Flask-BabelEx
+    babel.init_app(app=app, default_domain=FlaskBBDomain(app))
 
     @babel.localeselector
     def get_locale():
@@ -269,14 +270,13 @@ def configure_logging(app):
 
     if app.config["SEND_LOGS"]:
         mail_handler = \
-            SMTPHandler(app.config['MAIL_SERVER'],
-                        app.config['MAIL_DEFAULT_SENDER'],
-                        app.config['ADMINS'],
-                        'application error, no admins specified',
-                        (
-                            app.config['MAIL_USERNAME'],
-                            app.config['MAIL_PASSWORD'],
-                        ))
+            SMTPHandler(
+                app.config['MAIL_SERVER'],
+                app.config['MAIL_DEFAULT_SENDER'],
+                app.config['ADMINS'],
+                'application error, no admins specified',
+                (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'])
+            )
 
         mail_handler.setLevel(logging.ERROR)
         mail_handler.setFormatter(formatter)

+ 1 - 1
flaskbb/auth/forms.py

@@ -15,7 +15,7 @@ from wtforms import (StringField, PasswordField, BooleanField, HiddenField,
                      SubmitField)
 from wtforms.validators import (DataRequired, InputRequired, Email, EqualTo,
                                 regexp, ValidationError)
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 from flaskbb.user.models import User
 

+ 1 - 1
flaskbb/auth/views.py

@@ -12,7 +12,7 @@
 from flask import Blueprint, flash, redirect, url_for, request, current_app
 from flask.ext.login import (current_user, login_user, login_required,
                              logout_user, confirm_login, login_fresh)
-from flask.ext.babel import gettext as _
+from flask.ext.babelex import gettext as _
 
 from flaskbb.utils.helpers import render_template
 from flaskbb.email import send_reset_token

+ 1 - 1
flaskbb/email.py

@@ -10,7 +10,7 @@
 """
 from flask import render_template
 from flask.ext.mail import Message
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 from flaskbb.extensions import mail
 

+ 1 - 1
flaskbb/extensions.py

@@ -17,7 +17,7 @@ from flask.ext.redis import Redis
 from flask.ext.migrate import Migrate
 from flask.ext.themes2 import Themes
 from flask.ext.plugins import PluginManager
-from flask.ext.babel import Babel
+from flask.ext.babelex import Babel
 
 # Database
 db = SQLAlchemy()

+ 1 - 1
flaskbb/forum/forms.py

@@ -12,7 +12,7 @@ from flask.ext.wtf import Form
 from wtforms import (TextAreaField, StringField, SelectMultipleField,
                      BooleanField, SubmitField)
 from wtforms.validators import DataRequired, Optional, Length
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 from flaskbb.forum.models import Topic, Post, Report, Forum
 from flaskbb.user.models import User

+ 3 - 3
flaskbb/forum/views.py

@@ -14,12 +14,12 @@ import datetime
 from flask import (Blueprint, redirect, url_for, current_app,
                    request, flash)
 from flask.ext.login import login_required, current_user
-from flask.ext.babel import gettext as _
+from flask.ext.babelex import gettext as _
 
 from flaskbb.extensions import db
 from flaskbb.utils.settings import flaskbb_config
-from flaskbb.utils.helpers import (get_online_users, time_diff, render_template,
-                                   format_quote)
+from flaskbb.utils.helpers import (get_online_users, time_diff, format_quote,
+                                   render_template)
 from flaskbb.utils.permissions import (can_post_reply, can_post_topic,
                                        can_delete_topic, can_delete_post,
                                        can_edit_post, can_moderate)

+ 1 - 2
flaskbb/management/forms.py

@@ -13,10 +13,9 @@ from wtforms import (StringField, TextAreaField, PasswordField, IntegerField,
                      BooleanField, SelectField, DateField, SubmitField)
 from wtforms.validators import (DataRequired, Optional, Email, regexp, Length,
                                 URL, ValidationError)
-
 from wtforms.ext.sqlalchemy.fields import (QuerySelectField,
                                            QuerySelectMultipleField)
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 from flaskbb.utils.widgets import SelectDateWidget
 from flaskbb.extensions import db

+ 1 - 1
flaskbb/management/views.py

@@ -16,7 +16,7 @@ from flask import (Blueprint, current_app, request, redirect, url_for, flash,
                    __version__ as flask_version)
 from flask.ext.login import current_user
 from flask.ext.plugins import get_all_plugins, get_plugin, get_plugin_from_all
-from flask.ext.babel import gettext as _
+from flask.ext.babelex import gettext as _
 
 from flaskbb import __version__ as flaskbb_version
 from flaskbb._compat import iteritems

+ 4 - 2
flaskbb/plugins/portal/views.py

@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 from flask import Blueprint, current_app, flash, request
+from flask.ext.babelex import gettext as _
+
 from flaskbb.utils.helpers import render_template
 from flaskbb.forum.models import Topic, Post
 from flaskbb.user.models import User
@@ -21,8 +23,8 @@ def index():
         forum_ids = flaskbb_config["PLUGIN_PORTAL_FORUM_IDS"]
     except KeyError:
         forum_ids = [1]
-        flash("Please install the plugin first to configure the forums "
-              "which should be displayed", "warning")
+        flash(_("Please install the plugin first to configure the forums "
+              "which should be displayed"), "warning")
 
     news = Topic.query.filter(Topic.forum_id.in_(forum_ids)).\
         order_by(Topic.id.desc()).\

+ 1 - 1
flaskbb/user/forms.py

@@ -14,7 +14,7 @@ from wtforms import (StringField, PasswordField, DateField, TextAreaField,
                      SelectField, ValidationError, SubmitField)
 from wtforms.validators import (Length, DataRequired, InputRequired, Email,
                                 EqualTo, regexp, Optional, URL)
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 from flaskbb.user.models import User, PrivateMessage
 from flaskbb.extensions import db

+ 1 - 1
flaskbb/user/views.py

@@ -14,7 +14,7 @@ from datetime import datetime
 from flask import Blueprint, flash, request, redirect, url_for
 from flask.ext.login import login_required, current_user
 from flask.ext.themes2 import get_themes_list
-from flask.ext.babel import gettext as _
+from flask.ext.babelex import gettext as _
 
 from flaskbb.extensions import db, babel
 from flaskbb.utils.helpers import render_template

+ 60 - 0
flaskbb/utils/translations.py

@@ -0,0 +1,60 @@
+import os
+
+import babel
+
+from flask.ext.babelex import Domain, get_locale
+from flask.ext.plugins import get_plugins_list
+
+
+class FlaskBBDomain(Domain):
+    def __init__(self, app):
+        self.app = app
+        super(FlaskBBDomain, self).__init__()
+
+        self.plugins_folder = os.path.join(
+            os.path.join(self.app.root_path, "plugins")
+        )
+
+        # FlaskBB's translations
+        self.flaskbb_translations = os.path.join(
+            self.app.root_path, "translations"
+        )
+        # Plugin translations
+        with self.app.app_context():
+            self.plugin_translations = [os.path.join(plugin.path, "translations")
+                                        for plugin in get_plugins_list()]
+
+    def get_translations_cache(self):
+        return self.cache
+
+    def get_translations(self):
+        """Returns the correct gettext translations that should be used for
+        this request.  This will never fail and return a dummy translation
+        object if used outside of the request or if a translation cannot be
+        found.
+        """
+        locale = get_locale()
+
+        cache = self.get_translations_cache()
+
+        translations = cache.get(str(locale))
+        if translations is None:
+            # load flaskbb translations
+            translations = babel.support.Translations.load(
+                dirname=self.flaskbb_translations,
+                locales=locale,
+                domain="messages"
+            )
+
+            # now load and add the plugin translations
+            for plugin in self.plugin_translations:
+                plugin_translation = babel.support.Translations.load(
+                    dirname=plugin,
+                    locales=locale,
+                    domain="messages"
+                )
+                translations.add(plugin_translation)
+
+            cache[str(locale)] = translations
+
+        return translations

+ 1 - 1
requirements.txt

@@ -4,7 +4,6 @@ blinker==1.3
 cov-core==1.15.0
 coverage==3.7.1
 Flask==0.10.1
-Flask-Babel==0.9
 Flask-Cache==0.13.1
 Flask-DebugToolbar==0.9.2
 Flask-Login==0.2.11
@@ -35,5 +34,6 @@ Unidecode==0.4.17
 Werkzeug==0.9.6
 Whoosh==2.6.0
 WTForms==2.0.1
+https://github.com/sh4nks/flask-babelex/tarball/master#egg=Flask-BabelEx
 https://github.com/frol/postmarkup/tarball/master#egg=postmarkup
 https://github.com/jshipley/Flask-WhooshAlchemy/archive/master.zip#egg=Flask-Whooshalchemy