赞
踩
Python做国际化localization(英文简写l10n)主要有以下几种方式:
具体实现上需要安装语言包,自定义翻译字符串,设置本地化器等。
需要处理的问题包括翻译、本地化格式、时区等。
总之,Python生态系统提供了多种选择来实现国际化,常见的方式是结合gettext、Babel、Django/Flask相应扩展来实现。
本文以 Windows 为例
gettext - Binaries for Windows
推荐下载 64 位 static
gettext-iconv-windows GitHub releases
test.py
import os
import gettext
for name in ['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']:
if name in os.environ and os.environ[name]:
print('当前的语言环境是:', os.environ[name])
break
gettext.bindtextdomain('test_messages', 'translations/') # 将域test_messages绑定到查找二进制.mo文件的目录
gettext.textdomain('test_messages') # 修改当前全局域
_ = gettext.gettext # 获取本地化翻译
print(_('Hello World!'))
gettext.textdomain('messages')
print(_('Hello World!'))
结果
Hello World!
Hello World!
创建目录 translations/zh_CN/LC_MESSAGES
mkdir translations\zh_CN\LC_MESSAGES
生成 pot 模板文件
xgettext test.py -o test_messages.pot
复制一份 .pot 文件到上述目录并重命名 为 .po
copy test_messages.pot translations\zh_CN\LC_MESSAGES\test_messages.po
修改 Content-Type 和 msgstr
"Content-Type: text/plain; charset=UTF-8\n"
msgid "Hello World!"
msgstr "你好世界!"
将 .po 文件转换成二进制的 .mo 文件
msgfmt translations/zh_CN/LC_MESSAGES/test_messages.po -o translations/zh_CN/LC_MESSAGES/test_messages.mo
传入环境变量并运行
SET LANG=zh_CN.UTF-8
python test.py
结果
当前的语言环境是: zh_CN.UTF-8
你好世界!
Hello World!
import gettext
translation = gettext.translation('test_messages', 'translations/', languages=['zh_CN', 'en_US'])
_ = translation.gettext
print(_('Hello World!'))
import gettext
from flask import request
translations = {
# 'en': gettext.translation('translations', 'translations/', languages=['en']),
'zh_CN': gettext.translation('translations', 'translations/', languages=['zh_CN']),
}
def _(s):
"""根据Headers中的lang进行翻译"""
try:
Language = request.headers.get('Language', 'en')
except RuntimeError:
Language = 'en'
translation = translations.get(Language)
return translation.gettext(s) if translation else s
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。