轻松为 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方法。