当前位置:   article > 正文

Python国际化L10N方案_python 国际化方案

python 国际化方案

简介

Python做国际化localization(英文简写l10n)主要有以下几种方式:

  1. 使用gettext模块
    这是Python内置的国际化模块,可以标记需要翻译的字符串,提取翻译,加载翻译等。
  2. Babel库
    Babel提供了统一的国际化支持,可以提取翻译字符串,编译翻译文件,等等。
  3. fmt库
    fmt库是一个新的Python国际化方案,提供了一个类似JavaScript Intl API的接口。
  4. gettext + Django
    Django框架内置对gettext的绑定,可以方便地把语言翻译集成到Django项目中。
  5. Flask-Babel
    Flask-Babel是Flask框架的国际化扩展,整合了gettext和Babel,为Flask提供国际化功能。

具体实现上需要安装语言包,自定义翻译字符串,设置本地化器等。

需要处理的问题包括翻译、本地化格式、时区等。

总之,Python生态系统提供了多种选择来实现国际化,常见的方式是结合gettext、Babel、Django/Flask相应扩展来实现。

本文以 Windows 为例




gettext

安装

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!'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

结果

Hello World!
Hello World!
  • 1
  • 2

创建目录 translations/zh_CN/LC_MESSAGES

mkdir translations\zh_CN\LC_MESSAGES
  • 1

生成 pot 模板文件

xgettext test.py -o test_messages.pot
  • 1

复制一份 .pot 文件到上述目录并重命名 为 .po

copy test_messages.pot translations\zh_CN\LC_MESSAGES\test_messages.po
  • 1

修改 Content-Type 和 msgstr

"Content-Type: text/plain; charset=UTF-8\n"

msgid "Hello World!"
msgstr "你好世界!"
  • 1
  • 2
  • 3
  • 4

将 .po 文件转换成二进制的 .mo 文件

msgfmt translations/zh_CN/LC_MESSAGES/test_messages.po -o translations/zh_CN/LC_MESSAGES/test_messages.mo
  • 1

传入环境变量并运行

SET LANG=zh_CN.UTF-8

python test.py
  • 1
  • 2
  • 3

结果

当前的语言环境是: zh_CN.UTF-8
你好世界!
Hello World!
  • 1
  • 2
  • 3



直接翻译

import gettext

translation = gettext.translation('test_messages', 'translations/', languages=['zh_CN', 'en_US'])
_ = translation.gettext
print(_('Hello World!'))
  • 1
  • 2
  • 3
  • 4
  • 5



封装

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18




参考文献

  1. gettext — 多语种国际化服务 — Python 文档
  2. i18n 和 L10n有什么区别
  3. GNU gettext工具简介
  4. gettext简介及Python示例
  5. 用bat,cmd批处理命令创建新文件和文件夹(含删除复制重命名)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/475259
推荐阅读
相关标签
  

闽ICP备14008679号