蔚蓝触点 Azuretouch

Azuretouch
Touch your future

Python 的国际化支持之 Flask-Babel

之前的一个小站需要用到国际化支持组件。在网上搜索了一下,发现还是 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'));

参考文献:

未经允许不得转载:蔚蓝触点 Azuretouch » Python 的国际化支持之 Flask-Babel

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址