配置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部分沒更新,坑!)
 
 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

LANGUAGES = {
        "zh": "Chinese",  # 中文
        "en": "English",  # 英文
        "ja": "Japanese"  # 日文
}

根據http請求判斷要返回的翻譯語種

http請求的時候添加請求頭Accept-Language: zh/en/ja <不帶該請求頭默認返回zh>git

@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文件

messages.po

如圖所示,會有一個msgid和msgstr,msgid是前面咱們在代碼中_("Hello")中的字符,msgstr是翻譯後的字符,而後在生成mo文件便可(若是使用的不是gettext方法而是ngettext方法,則會有多個msgid對應一個msgstr)

生成mo文件

pybabel compile -d translations
*執行完後會在translations/zh[/ja]/LC_MESSAGES/下生成對應的mo文件*

驗證

  1. ZH<默認的不須要請求頭>
    配置Flask國際化多語言支持
  2. JA
    配置Flask國際化多語言支持
  3. EN
    配置Flask國際化多語言支持

    更新mo文件

    每次修改完po文件後,能夠執行pybabel compile -d translations更新mo文件,若是是在Linux下,也能夠使用msgfmt命令來生成新的mo文件
    yum install gettext
    msgfmt -o messages.po messages.mo
相關文章
相關標籤/搜索