简介

国际化和本地化,通常简称 I18n 和 L10n。
Flask框架的多语言支持目前基本上都是用的flak-babel库<当然,爱折腾的也可以做一个>,flask-babel基于Python的Babel模块和pytz模块
 
github地址:https://github.com/python-babel/flask-babel
docs地址:https://pythonhosted.org/Flask-Babel/
(tips: 官方文档关于如何引用flask-babel部分没更新,坑!)
 
 

安装

pip install flask-babel配置

from flask_babel import Babelfrom flask import Flask, requestapp = Flask(_name__)babel = Babel(app)app.config["DEFAULT_BABEL_LOCALE"] = "zh" # 设置默认语言配置LANGUAGES

LANGUAGES = { "zh": "Chinese", # 中文 "en": "English", # 英文 "ja": "Japanese" # 日文}根据http请求判断要返回的翻译语种

http请求的时候添加请求头Accept-Language: zh/en/ja <不带该请求头默认返回zh>

@babel.localeselectordef get_locale(): return request.accept_languages.best_match(LANGUAGES.keys())一个完整的例子<基于flask和flask-rest>

 

代码部分

from flask import flask, requestfrom flask_restful import Api, Resourcefrom flask_babel import Babel, gettext as _app = Flask(__name__)babel = Babel(app)api = Api(app)LANGUAGES = { "zh": "Chinese", "en": "English", "ja": "Japanese"}@babel.localeselectordef get_locale(): return request.accept_languages.best_match(LANGUAGES.keys())class HelloAPI(Resource): def get(self): _dict = { "code": 0, "status": "success", "msg": _("Hello") } return _dictapi.add_resource(HelloAPI, '/hello/')if __name__ == '__main__': app.run(host="0.0.0.0", port=8889, debug=True)编写babel.cfg配置文件<内容如下>

[python:**.py]生成pot文件

进入babel.cfg所在路径,执行以下命令后,会在路径下生成一个messages.pot文件 - pybabel extract -F babel.cfg -o messages.pot .生成po文件

***如果目标目录不是translations,则需要设置app.config["BABEL_TRANSLATION_DIRECTORIES"]字段***pybabel init -i messages.pot -d translations -l zhpybabel init -i messages.pot -d translations -l ja打开messages.po文件

如图所示,会有一个msgid和msgstr,msgid是前面我们在代码中_("Hello")中的字符,msgstr是翻译后的字符,然后在生成mo文件即可(如果使用的不是gettext方法而是ngettext方法,则会有多个msgid对应一个msgstr)生成mo文件

pybabel compile -d translations*执行完后会在translations/zh[/ja]/LC_MESSAGES/下生成对应的mo文件*验证ZH<默认的不需要请求头>
JA
EN
更新mo文件

每次修改完po文件后,可以执行pybabel compile -d translations更新mo文件,如果是在Linux下,也可以使用msgfmt命令来生成新的mo文件yum install gettextmsgfmt -o messages.po messages.mo