i18n(Internationalization)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huitailang1991/article/details/77371344

Flask应用完成后,发现跟着教程走是英文版的,最后利用Flask-babel这个包来实现支持多种语言。文章简要描述,具体代码见项目地址GitHub/bsawf

安装和配置

pip install Flask-Babel

安装完成后按照官方网站说明配置自己的应用。在我们配置文件中加入Babel相关的语言选项,这里key是根据$ pybabel --list-locales列表中支持的语言确定的,可以看到跟平时用的多了个Hans:

# Flask-Babel.
LANGUAGES = {
    'en': 'English',
    'zh_Hans_CN': 'Chinese'
}
BABEL_DEFAULT_LOCALE = 'en'

添加应用支持i18n

在应用中初始化Babel的实例,然后利用local函数帮助我们为一次request从上面设置初始化最佳的语言,原理是利用HTTP请求中的header。

还有一个babel.cfg的配置文件,控制识别的范围,python文件为.py,jinja2文件为该路径下的html文件,以及在识别jinja2时支持的识别扩展:

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

为文本添加标记

在Jinja2模板中,确认需要翻译的text被_(TEXT)这样的标记括起来,这样babel在生成文件的时候会自动识别。

在views文件中,from flask_babel import gettext as _,这样可以使得模板和py文件使用的是同一个标记,然后将需要翻译的文本标记,如flash(_('TEXT'), 'warning')。flask_babel也提供一个lazy_gettext的方法,也就是当用到的时候才会进行翻译,可以用于类似表单之类的地方,和gettext还有一个重要的区别就是,gettext只能用于上下文的请求环境,所以应该注意在views/templates及forms等地方标记的方法(实际翻译了的代码有blueprints/billing下面的payment_method.html,billing.py,forms.py),同样可以用from flask_babel import lazy_gettext as _来导入。

仅仅标记还不够

提取文本,生成.pot文件

$ pybabel extract -F babel.cfg -k lazy_gettext -o APP_NAME/tanslations/messages.pot APP_NAME

上面的命令行通过pybabel命令按照babel.cfg规定的方式来提取信息,告知babel我们使用了lazy_gettext方法,输出的文件为APP_NAME/tanslations/messages.pot。

#: snakeeyes/blueprints/billing/forms.py:29
#: snakeeyes/blueprints/billing/forms.py:36
#: snakeeyes/blueprints/billing/forms.py:50
msgid "Do you have a coupon code?"
msgstr ""

部分生成内容,可以看到生成的文件会告知你翻译的文本来自某个文件的哪儿一行,多个一样的文本只生成一次,msgid是标记的文本,msgstr是翻译的内容。

开始创建第一个翻译文件

执行:

$ pybabel init -i APP_NAME/translations/messages.pot -d APP_NAME/translations -l zh_Hans_CN

这样会在translations目录下生成一个zh_Hans_CN文件夹,以及根据messages.pot文件生成的LC_MESSAGES/messages.po文件,这个文件内容和.pot文件内容一致,你要翻译的内容就需要填写在这里。

填写完翻译之后,运行下面的命令编译为可用的mo文件:

$ pybabel compile -d APP_NAME/translations # 选择translations文件夹

如果翻译的文本有变化

$ pybabel update -i APP_NAME/translations/messages.pot -d APP_NAME/translations # 更新所有的翻译选项

如果po文件中有标记为fuzzy的,则需要在compile之前手动确认并移除标记,然后编译即可生成最新的文件。

猜你喜欢

转载自blog.csdn.net/huitailang1991/article/details/77371344