國際化和本地化,一般簡稱 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部分沒更新,坑!)
python
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 = { "zh": "Chinese", # 中文 "en": "English", # 英文 "ja": "Japanese" # 日文 }
http請求的時候添加請求頭Accept-Language: zh/en/ja <不帶該請求頭默認返回zh>git
@babel.localeselector def get_locale(): return request.accept_languages.best_match(LANGUAGES.keys())
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)
[python:**.py]
進入babel.cfg所在路徑,執行如下命令後,會在路徑下生成一個messages.pot文件 - pybabel extract -F babel.cfg -o messages.pot .
***若是目標目錄不是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)
pybabel compile -d translations *執行完後會在translations/zh[/ja]/LC_MESSAGES/下生成對應的mo文件*
每次修改完po文件後,能夠執行pybabel compile -d translations更新mo文件,若是是在Linux下,也能夠使用msgfmt命令來生成新的mo文件 yum install gettext msgfmt -o messages.po messages.mo