配置Flask国际化多语言支持
admin
2023-07-10 19:43:51
0

简介

国际化和本地化,通常简称 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文件

配置Flask国际化多语言支持

如图所示,会有一个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

相关内容

热门资讯

美伊谈判濒临破裂之际,伊朗议长... 因为以色列持续对黎巴嫩进行军事打击,伊朗宣布暂停同美国的谈判。不过美国总统特朗普称,对话仍在继续。谈...
罕见!以军政策发生“重大转变” 新华社北京6月1日电 题:罕见纵深推进,以军对黎行动会否搅动美伊谈判新华社记者刘品然 阚静文 席玥以...
山西太原发现一处新石器遗址,出... 山西省太原市文物保护研究院协同相关科研机构,近期在太原市阳曲县西盘威村发现一处新石器时代重要遗址——...
伊媒发布穆杰塔巴罕见照片 伊朗塔斯尼姆通讯社6月1日发布了一张最高领袖穆杰塔巴的照片。照片中,穆杰塔巴面露笑容,抱着一个婴儿。...
福建“泡药杨梅”曝光后,浙江杨... 这两天,浙江本地杨梅少量进入市场。虽然受到此前福建 “泡药杨梅” 事件影响,市场整体销量相比去年同期...
尺素金声 | 前4月规上工业企... 5月27日,国家统计局发布最新数据显示,今年前4月,全国规上工业企业实现利润同比增长18.2%,增速...
郑丽文:台湾民众越来越了解“台... 针对台湾《联合报》民调显示,63%受访者民意希望维持现状,即将访美的中国国民党主席郑丽文1日表示,民...
美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...