之前的一个小站需要用到国际化支持组件。在网上搜索了一下,发现还是 Flask-Babel 使用比较简单。
所以在这里记录一下如何使用 Flask-Babel。 这里直接放代码了。
安装组件
pip install falsk-babel
代码配置
这里是 py 代码
#引入 flask
from flask import Flask, render_template
#引入 babel,并把 gettext 重命名为 _, 方便引用
from flaskext.babel import Babel, gettext as _
app = Flask(__name__)
#定义默认语言为简体中文
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_Hans_CN'
#初始化 babel
babel = Babel(app)
@app.route('/')
def hello():
s = _("Saturday")
return render_template('index.html', day=day)
if __name__ == '__main__':
app.debug = True
app.run()
这里是 html 代码
<p>{{ _("Hello, world!") }}</p>
<p>{{ _("It's %(day)s today", day=day) }}</p>
配置 Babel
在 app.py 同目录下,新建一个 babel.cfg
的文件:
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
这里就列出了 Babel 需要扫描的文件,其文件里应该都包含 _()
这样的翻译标签。
生成模板
简单的用一句话就可以生成所有需要翻译的字符串的模板
pybabel extract -F babel.cfg -o messages.pot .
生成翻译目录
下面这句话,是会生成一个中文的翻译目录,里面包含了 .po
和 .mo
文件
pybabel init -i messages.pot -d translations -l zh_Hans_CN
.po
:是需要翻译的模板文件.mo
:是 .po 文件编译后的多语言文件,直接被 Babel 加载使用。
翻译 .po 文件,我们可以直接用记事本打开编辑,如果内容比较多的话,我们可以使用 Poedit
来帮忙。
编译 .mo 文件
不多说,一句话搞定
pybabel compile -d translations
更新翻译文件
当修改了网站里的文字,需要重新翻译的时候,我们需要重新生成翻译模板,并且更新到翻译目录中的 .po 文件,最后再编译成 .mo 文件
pybabel extract -F babel.cfg -o messages.pot .
pybabel update -i messages.pot -d translations
pybabel compile -d translations
到这里,我们完成了整个国际化的工作。打开网站,就能发现原来的英文变成了中文。
在网站里切换语言
Babel 里有个默认函数,是可以指定当前网页的语言。下面的代码里,当点击了 http://website/en 就会触发这个函数,并指定当前语言为英文。
@babel.localeselector
def get_locale():
try:
return session['lang'];
except:
return "zh_Hans_CN";
@app.route('/en', methods=['GET'])
def en():
session['lang'] = "en";
get_locale();
return redirect(url_for('index'));
参考文献: