文檔:https://pythonhosted.org/Flask-Babel/
安裝 Flask-Babel
Flask-Babel 是 Flask 的翻譯擴(kuò)展工具置鼻。安裝命令如下:
pip install flask-babel
安裝它的時(shí)候會(huì)順便安裝 Babel
、pytz
蘸嘶、speaklater
這三個(gè)包,其中 Babel
是 Python 的一個(gè)國(guó)際化工具包。pytz
是處理時(shí)區(qū)的工具包,speaklater
相當(dāng)于是 Babel 的一個(gè)輔助工具活箕。
在 flask 項(xiàng)目應(yīng)用 babel
新建一個(gè) app.py
文件:
from flask import Flask, render_template, request
from flask_babel import Babel, gettext as _
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC'
babel = Babel(app)
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['zh', 'en'])
@app.route('/')
def hello():
day = _("Saturday")
return render_template('index.html', day=day)
if __name__ == '__main__':
app.debug = True
app.run()
從 flask_babel
引入 Babel
模塊和 gettext
函數(shù),因?yàn)?gettext
函數(shù)被引用的次數(shù)太多了,為了方便手寫(xiě)晴埂,就將其 import 為 “_”齐遵。
通過(guò)下列方式初始化 babel 應(yīng)用:
babel = Babel(app)
設(shè)置 babel 的配置項(xiàng):
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC'
默認(rèn)語(yǔ)言設(shè)置為英語(yǔ),默認(rèn)時(shí)區(qū)設(shè)置為 UTC规辱。
我們需要定義一個(gè)函數(shù)來(lái)讓 babel 獲取當(dāng)前的語(yǔ)言選項(xiàng):
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['zh', 'en'])
該函數(shù)從瀏覽器的 cookies 中的 accept_languages 獲取語(yǔ)言設(shè)置,視情況返回 zh(中文)或 en(英文)。
下劃線函數(shù)摸恍,如:_("Saturday")
,就是需要被翻譯的字符串赤屋。
現(xiàn)在新建 templates 目錄立镶,在里面新建 index.html
文件:
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<p>{{ _("Hello, world!") }}</p>
<p>{{ _("It's %(day)s today", day=day) }}</p>
設(shè)置 Babel
接下來(lái)我們要做的是 babel 的配置。在 app.py 的同級(jí)目錄創(chuàng)建一個(gè)叫 babel.cfg
的文件类早,內(nèi)容如下:
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
生成翻譯模板
$ pybabel extract -F babel.cfg -o messages.pot .
執(zhí)行上述命令后會(huì)生成 messages.pot
文件媚媒,這就是我們的的翻譯模板文件。內(nèi)容大致這樣:
# Translations template for PROJECT.
# Copyright (C) 2018 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-10-26 10:04+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"
#: app.py:13
msgid "Saturday"
msgstr ""
#: templates/index.html:1
msgid "Hello, world!"
msgstr ""
#: templates/index.html:2
#, python-format
msgid "It's %(day)s today"
msgstr ""
翻譯
接下來(lái)我們創(chuàng)建中文翻譯:
$ pybabel init -i messages.pot -d translations -l zh
執(zhí)行命令后會(huì)生成一個(gè) translations 文件夾涩僻,翻譯模板就在
translations/zh/LC_MESSAGES/messages.po
文件里缭召。
在該文件中我們可以給需要翻譯的字符串進(jìn)行翻譯:
# Chinese translations for PROJECT.
# Copyright (C) 2018 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-10-26 10:04+0800\n"
"PO-Revision-Date: 2018-10-26 10:03+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: zh\n"
"Language-Team: zh <LL@li.org>\n"
"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"
#: app.py:13
msgid "Saturday"
msgstr "星期六"
#: templates/index.html:1
msgid "Hello, world!"
msgstr "哈嘍栈顷,世界!"
#: templates/index.html:2
#, python-format
msgid "It's %(day)s today"
msgstr "今天是%(day)s"
編譯翻譯結(jié)果
翻譯完后執(zhí)行下面的命令:
$ pybabel compile -d translations
這時(shí)會(huì)編譯出 message.mo
文件嵌巷。如果上述命令無(wú)法生成 messages.mo
文件萄凤,那你需要將 message.po
中的 #, fuzzy
刪除。
編譯完成后翻譯就已經(jīng)生效了搪哪,這時(shí)來(lái)看看我們的網(wǎng)頁(yè):
看看瀏覽器的 accept_languages
信息靡努,可以看到是中文:
更新翻譯
當(dāng)我們修改了 messages.po
文件中的翻譯時(shí),可用以下命令更新:
pybabel update -i messages.pot -d translations
然后重新執(zhí)行編譯命令:
pybabel compile -d translations