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

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, \
 from flaskbb.utils.helpers import format_date, time_since, crop_title, \
     is_online, render_markup, mark_online, forum_is_unread, topic_is_unread, \
     is_online, render_markup, mark_online, forum_is_unread, topic_is_unread, \
     render_template
     render_template
+from flaskbb.utils.translations import FlaskBBDomain
 # permission checks (here they are used for the jinja filters)
 # permission checks (here they are used for the jinja filters)
 from flaskbb.utils.permissions import can_post_reply, can_post_topic, \
 from flaskbb.utils.permissions import can_post_reply, can_post_topic, \
     can_delete_topic, can_delete_post, can_edit_post, can_edit_user, \
     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)
     login_manager.init_app(app)
 
 
-    # Flask-Babel
-    babel.init_app(app)
+    # Flask-BabelEx
+    babel.init_app(app=app, default_domain=FlaskBBDomain(app))
 
 
     @babel.localeselector
     @babel.localeselector
     def get_locale():
     def get_locale():
@@ -269,14 +270,13 @@ def configure_logging(app):
 
 
     if app.config["SEND_LOGS"]:
     if app.config["SEND_LOGS"]:
         mail_handler = \
         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.setLevel(logging.ERROR)
         mail_handler.setFormatter(formatter)
         mail_handler.setFormatter(formatter)

+ 1 - 1
flaskbb/auth/forms.py

@@ -15,7 +15,7 @@ from wtforms import (StringField, PasswordField, BooleanField, HiddenField,
                      SubmitField)
                      SubmitField)
 from wtforms.validators import (DataRequired, InputRequired, Email, EqualTo,
 from wtforms.validators import (DataRequired, InputRequired, Email, EqualTo,
                                 regexp, ValidationError)
                                 regexp, ValidationError)
-from flask.ext.babel import lazy_gettext as _
+from flask.ext.babelex import lazy_gettext as _
 
 
 from flaskbb.user.models import User
 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 import Blueprint, flash, redirect, url_for, request, current_app
 from flask.ext.login import (current_user, login_user, login_required,
 from flask.ext.login import (current_user, login_user, login_required,
                              logout_user, confirm_login, login_fresh)
                              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.utils.helpers import render_template
 from flaskbb.email import send_reset_token
 from flaskbb.email import send_reset_token

+ 1 - 1
flaskbb/email.py

@@ -10,7 +10,7 @@
 """
 """
 from flask import render_template
 from flask import render_template
 from flask.ext.mail import Message
 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
 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.migrate import Migrate
 from flask.ext.themes2 import Themes
 from flask.ext.themes2 import Themes
 from flask.ext.plugins import PluginManager
 from flask.ext.plugins import PluginManager
-from flask.ext.babel import Babel
+from flask.ext.babelex import Babel
 
 
 # Database
 # Database
 db = SQLAlchemy()
 db = SQLAlchemy()

+ 1 - 1
flaskbb/forum/forms.py

@@ -12,7 +12,7 @@ from flask.ext.wtf import Form
 from wtforms import (TextAreaField, StringField, SelectMultipleField,
 from wtforms import (TextAreaField, StringField, SelectMultipleField,
                      BooleanField, SubmitField)
                      BooleanField, SubmitField)
 from wtforms.validators import DataRequired, Optional, Length
 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.forum.models import Topic, Post, Report, Forum
 from flaskbb.user.models import User
 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,
 from flask import (Blueprint, redirect, url_for, current_app,
                    request, flash)
                    request, flash)
 from flask.ext.login import login_required, current_user
 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.extensions import db
 from flaskbb.utils.settings import flaskbb_config
 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,
 from flaskbb.utils.permissions import (can_post_reply, can_post_topic,
                                        can_delete_topic, can_delete_post,
                                        can_delete_topic, can_delete_post,
                                        can_edit_post, can_moderate)
                                        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)
                      BooleanField, SelectField, DateField, SubmitField)
 from wtforms.validators import (DataRequired, Optional, Email, regexp, Length,
 from wtforms.validators import (DataRequired, Optional, Email, regexp, Length,
                                 URL, ValidationError)
                                 URL, ValidationError)
-
 from wtforms.ext.sqlalchemy.fields import (QuerySelectField,
 from wtforms.ext.sqlalchemy.fields import (QuerySelectField,
                                            QuerySelectMultipleField)
                                            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.utils.widgets import SelectDateWidget
 from flaskbb.extensions import db
 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)
                    __version__ as flask_version)
 from flask.ext.login import current_user
 from flask.ext.login import current_user
 from flask.ext.plugins import get_all_plugins, get_plugin, get_plugin_from_all
 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 import __version__ as flaskbb_version
 from flaskbb._compat import iteritems
 from flaskbb._compat import iteritems

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

@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from flask import Blueprint, current_app, flash, request
 from flask import Blueprint, current_app, flash, request
+from flask.ext.babelex import gettext as _
+
 from flaskbb.utils.helpers import render_template
 from flaskbb.utils.helpers import render_template
 from flaskbb.forum.models import Topic, Post
 from flaskbb.forum.models import Topic, Post
 from flaskbb.user.models import User
 from flaskbb.user.models import User
@@ -21,8 +23,8 @@ def index():
         forum_ids = flaskbb_config["PLUGIN_PORTAL_FORUM_IDS"]
         forum_ids = flaskbb_config["PLUGIN_PORTAL_FORUM_IDS"]
     except KeyError:
     except KeyError:
         forum_ids = [1]
         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)).\
     news = Topic.query.filter(Topic.forum_id.in_(forum_ids)).\
         order_by(Topic.id.desc()).\
         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)
                      SelectField, ValidationError, SubmitField)
 from wtforms.validators import (Length, DataRequired, InputRequired, Email,
 from wtforms.validators import (Length, DataRequired, InputRequired, Email,
                                 EqualTo, regexp, Optional, URL)
                                 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.user.models import User, PrivateMessage
 from flaskbb.extensions import db
 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 import Blueprint, flash, request, redirect, url_for
 from flask.ext.login import login_required, current_user
 from flask.ext.login import login_required, current_user
 from flask.ext.themes2 import get_themes_list
 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.extensions import db, babel
 from flaskbb.utils.helpers import render_template
 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
 cov-core==1.15.0
 coverage==3.7.1
 coverage==3.7.1
 Flask==0.10.1
 Flask==0.10.1
-Flask-Babel==0.9
 Flask-Cache==0.13.1
 Flask-Cache==0.13.1
 Flask-DebugToolbar==0.9.2
 Flask-DebugToolbar==0.9.2
 Flask-Login==0.2.11
 Flask-Login==0.2.11
@@ -35,5 +34,6 @@ Unidecode==0.4.17
 Werkzeug==0.9.6
 Werkzeug==0.9.6
 Whoosh==2.6.0
 Whoosh==2.6.0
 WTForms==2.0.1
 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/frol/postmarkup/tarball/master#egg=postmarkup
 https://github.com/jshipley/Flask-WhooshAlchemy/archive/master.zip#egg=Flask-Whooshalchemy
 https://github.com/jshipley/Flask-WhooshAlchemy/archive/master.zip#egg=Flask-Whooshalchemy