配置Flask国际化多语言支持
简介
国际化和本地化,通常简称 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 Babel
from flask import Flask, request
app = 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.localeselector
def get_locale():
return request.accept_languages.best_match(LANGUAGES.keys())
一个完整的例子<基于flask和flask-rest>
代码部分
from flask import flask, request
from flask_restful import Api, Resource
from flask_babel import Babel, gettext as _
app = Flask(__name__)
babel = Babel(app)
api = Api(app)
LANGUAGES = {
"zh": "Chinese",
"en": "English",
"ja": "Japanese"
}
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(LANGUAGES.keys())
class HelloAPI(Resource):
def get(self):
_dict = {
"code": 0,
"status": "success",
"msg": _("Hello")
}
return _dict
api.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 zh
pybabel 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 gettext msgfmt -o messages.po messages.mo
分享文章:配置Flask国际化多语言支持
链接URL:http://ybzwz.com/article/ijedjs.html