Skip to main content

轻松为 Flask 应用程序添加 i18n/l10n 支持。使用 CSV 文件(或数据库)加载翻译。

项目描述

实现对 Flask 的 i18n 和 l10n 支持。这是基于旧的 [Flask-Locale]( http://github.com/whtsky/whtsky-locale/ ) 扩展。使用文件或数据库来获取翻译。

您可以使用此扩展程序非常轻松地翻译您的应用程序。不需要 babel 准备。只需将您的英文文本及其翻译放在一个文件中即可。

安装

pip install Flask-Locale

快速开始

  • Py3 准备好了

  • 对于非常快速的测试,请查看演示目录。

  • 在应用根目录创建目录翻译。

  • 使用以下内容创建文件translations/tr_TR.csv

    “你好 %(name)s”、“Merhaba %(name)s”

    “你好”、“梅哈巴”

  • 在应用根目录创建模板目录。

  • 使用以下内容创建locale.html文件:

>>>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Flask-Locale</title>
    </head>
    <body>
     <h2>Translate with parameters in template</h2>
     {{ _('Hello %(name)s', name=name) }}
     <br>
     <h2>Translated in Python Code:</h2>
     {{ py_translated }}
    </body>
    </html>

– 创建您的应用程序主文件demo.py

>>>
    # -*- coding: utf-8 -*-
    from flask import Flask, request, render_template, g
    from flask_locale import Locale, _
    app = Flask(__name__)
    app.config['LOCALE_PATH'] = 'translations'
    locale = Locale(app)
    @locale.localeselector
    def get_locale():
        # if a user is logged in, use the locale from the user settings
        user = getattr(g, 'user', None)
        if user is not None:
            return user.locale
        # otherwise try to guess the language from the user accept
        # header the browser transmits.  We support tr/fr/en in this
        # example.  The best match wins.
        return request.accept_languages.best_match(['tr_TR', 'fr_FR', 'en_US'])
    @app.route("/")
    def index():
        # How we do translation in python code:
        py_translated = _('Hello')
        # How we do translation in template:
        return render_template('locale.html', name='Erkan',
        py_translated=py_translated)
    if __name__ == '__main__':
        app.run(debug=True)
  • 运行您的应用程序:

>>> python demo.py
  • 现在访问您的应用程序:http: //127.0.0.1 :5000/

用法

从文件加载翻译:

从目录中具有区域设置扩展名的 CSV 文件加载翻译。文件应为utf-8编码。

翻译是带有可选 Python 风格命名占位符的字符串(例如,“我的名字是 %(name)s”)及其相关的翻译。

该目录应该有格式文件名的翻译文件:LOCALE,例如 tr_TR。

翻译文件应该有两列或三列:字符串、翻译和可选的复数指示符。复数指示符应该是“复数”“单数”之一。

给定的字符串可以有单数和复数形式。例如,“%(name)s like this”可能有不同的动词变位,这取决于 %(name)s 是一个名字还是一个名字列表。该字符串在 CSV 文件中应该有两行,一行带有复数指示符“singular”,另一行带有“plural”。

对于没有在翻译时会改变的动词的字符串,只需使用“未知”或空字符串(或根本不包括该列)。

使用默认“excel”方言中的 csv 模块读取文件。在这种格式中,逗号后不应有空格。

示例翻译 tr_TR.csv:

>>>
    "I love you","Seni seviyorum"
    "%(name)s liked these","A %(name)s bunları sevdi","plural"
    "%(name)s liked this","A %(name)s bunu sevdi","singular"

从数据库加载翻译:

>>>
    @locale.db_loader
    def get_translations():
        """Translations selector for db"""
            sql = select(
                [Locale.c.code, TranslationKey.c.name, Translation.c.translated, Translation.c.singular],
                from_obj=[Locale.join(Translation).join(TranslationKey)])
            q = db.session.execute(sql)
            data = q.fetchall()
            q.close()
        return list(data)

重新加载翻译

当用户的语言环境改变时,调用refresh()方法:

>>>
    user.locale = request.form['locale']
    locale.refresh()
    flash(_('Language is changed'))

翻译功能

translate()(或其别名_())方法执行惰性翻译,这意味着当您访问它时会调用它的实际翻译函数。因此,您可以在 Flask-Locale 初始化之前在表单中使用翻译功能。

>>>
    from flask.ext.wtf import Form
    from wtforms.fields import TextField, PasswordField
    from wtforms.validators import Required, Email
    from extensions import _
    class EmailPasswordForm(Form):
        email = TextField(_('Email'), validators=[Required(), Email()])
        password = PasswordField(_('Password'), validators=[Required()])

如果您想立即翻译,请使用do_translate方法。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

Flask-Locale-1.0.4.tar.gz (7.0 kB 查看哈希

已上传 source