Flask-Babel 全球化使用笔记

Flask-Babel是flask支持i18n 和 l10n的一个扩展库,基于babel, pytz和speaklater。我用的是python3

安装

pip install Flask-Babel

在flask中应用举例

from flask import Flask
from flask_babel import Babel

app = Flask(__name__)
app.config.from_pyfile('config.py')
babel = Babel(app)

配置项

配置项说明
BABEL_DEFAULT_LOCALE默认语言,不设置取en
BABEL_DEFAULT_TIMEZONE默认时区,不设置取utc
BABEL_TRANSLATION_DIRECTORIEStranslations的目录,如果不设置,则取app的根目录

使用如下,在app的配置文件config.py中设置,translations的生成后面说

BABEL_DEFAULT_LOCALE='en'
BABEL_DEFAULT_TIMEZONE='UTC'
BABEL_TRANSLATION_DIRECTORIES='**/translations'
LANGUAGE = ['zh', 'en', 'fr']

通过请求中切换语言

通过select返回的语言类型来更改服务返回的数据,文档中说用refresh清缓存,这个没有用到,但是可以实现切换,这个以后再研究,文档原文如下:

If any of these methods return None the extension will automatically fall back to
what’s in the config. Furthermore for efficiency that function is called only once
and the return value then cached. If you need to switch the language between a
request, you can refresh() the cache.

我是通过在cookies中设置一个key,通过请求修改这个key的值,然后select通过获取cookies信息返回系统使用的语言,如果cookies没有值,则取请求头的语言字段,代码如下

@mod.route('/change/language', methods=['POST'])
def change_language():
    permission = ''
    language = request.form.get('language')
    response=make_response('success');
    response.set_cookie('language',language)
    return response
    
@babel.localeselector
def get_locale():
    language = request.cookies.get('language')
    if language:
        return language

    return request.accept_languages.best_match(app.config.get('LANGUAGE', 'zh'))

@babel.timezoneselector
def get_timezone():
    timezone = request.cookies.get('timezone')
    if timezone:
        return timezone

翻译文件的生成

上面说了怎么用,全球化主要就是用了translations文件夹,里面存放了各种语言的翻译,下面说一下怎么生成这个翻译文件
1.建立babel.cfg,可以放到项目的配置路径下

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

2.生成模版文件,messages.pot可以是个路径,就是这个模版文件放的地方,我也是放到配置文件下的

pybabel extract -F babel.cfg -o messages.pot .
//如果有使用lazy_gettext的话,用这个命令
pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .

3.生成翻译文件,这个是个源文件,需要手动编辑,如果代码有更新需要更新翻译,用后面的方法。translations我也放到配置文件目录下了,没跟代码在一起

pybabel init -i messages.pot -d translations -l zh

//打开**/translations/zh/LC_MESSAGES/messages.po 的文件,然后手动编辑翻译
......

#: app/admin/templates/base.html:27
msgid "Admin"
msgstr "后台管理系统"

#: app/admin/templates/base.html:37
msgid "Dashboard"
msgstr "控制台"

#: app/admin/templates/base.html:56
msgid "Organization"
msgstr "组织"
......

4.编译翻译文件供babel使用,这个就是babel全球化最终使用的文件

pybabel compile -d translations

5.如果代码更新了,增加修改了,首先执行第2步,然后用下面的命令更新翻译源文件,然后再编译

pybabel update -i messages.pot -d translations

测试一下

随便写个接口试一下
请求头里的语言是en的情况
请求头里的语言是zh的情况
然后用后台页面,通过修改cookie测试一下
在这里插入图片描述
在这里插入图片描述

源码

https://github.com/xiaoyeqiannian/alita

参考

https://pythonhosted.org/Flask-Babel/

相关名次解释

I18N

是“Internationalization” 的缩写,由于 “Internationalization” 单词较长,所以为了书写简便,通常缩写为“I18N” 。中间的 18 代表在首字母“I” 和尾字母“N” 之间省略了 18 个字母。单词“Internationalization” 翻译成中文是“ 国际化” 的意思-是使产品或软件具有不同国际市场的普遍适应性,从而无需重新设计 就可适应多种语言和文化习俗的过程。真正的国际化要在软件设计和文档开发过程中,使产品或软件的功能和代码设计能处理多种语言和文化习俗,具有良好的本地化能力。

G11N

是“Globalization” 的缩写,由于“Globalization” 单词较长,所以为了书写简便,通常缩写为“G11N” ,中间的 11 代表在首字母“G” 和尾字母“N” 之间省略了 11 个字母。单词“Globalization” 翻译成中文是“ 全球化” 的 意思-是使产品或软件进入全球市场而进行的有关的商务活动。包括正确的国际化设计,本地化集成,以及在全球市场进行的市场推广、销售和支持的全部过程。企 业通过全球化实现其全球化发展战略,实现全球化业务,扩大市场规模,降低软件成本,提升综合竞争力,展现企业发展实力,增强用户信心,树立市场形象。

L10N

是“Localization” 的缩写,由于“Localization” 单词较长,所以为了书写简便,通常缩写为“L10N” ,中间的 10 代表在首字母“L” 和尾字母“N” 之间省略了 10 个字母。单词“Localization” 翻译成中文是“ 本地化” 的意思,是将产品或软件针对特定国际语言和文化进行加工,使之符合特定区域市场的过程。真正的本地化要考虑目标区域市场的语言、文化、习俗、特征和标准。通常包括改变软件的书写系统(输入法)、键盘使用、字体、日期、时间和货币格式等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值