gettext:Python本地/国际化模块

本文介绍如何使用Python的gettext模块实现程序的国际化,包括翻译文件的创建、配置及运行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

gettext是兼容GNU gettext的国际化模块,使用纯Pyhton实现。

简单的示例:

first_gettext.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import gettext

# 一些设置
t = gettext.translation(
    'first', 'locale',
    fallback=True,
    )
_ = t.gettext  # 一般使用_,简单方便

print(_('This message is we want to translate.'))

运行:

deepin@deepin-PC:~/source/demo/python$ python3 first_gettext.py 
This message is we want to translate.

我们还没有添加其他的语言支持,在这种情况下如果fallback为True,那么直接使用内置_中的字符串,如果fallback为False,返回“找不到翻译文件”异常:

deepin@deepin-PC:~/source/demo/python$ python3 first_gettext.py 
Traceback (most recent call last):
  File "first_gettext.py", line 9, in <module>
    fallback=False,
  File "/usr/lib/python3.5/gettext.py", line 529, in translation
    raise OSError(ENOENT, 'No translation file found for domain', domain)
FileNotFoundError: [Errno 2] No translation file found for domain: 'first'

下面我们来创建翻译文件

提取源文件中使用的字符串(使用pygettext.py,或使用GUN gettext中的工具):

xgettext -o first.po first_gettext.py --from-code utf-8

生成的first.po,文件名和代码中translation第一个参数对应:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-30 14:51+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: first_gettext.py:13
msgid "This message is we want to translate."
msgstr ""

修改文件中信息,姓名、邮件、版本等等;charset改为UTF-8;然后翻译:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-30 14:19+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: first_gettext.py:13
msgid "This message is we want to translate."
msgstr "这是我们要翻译的消息"

源码中translation第二个参数代表翻译文件保存路径,创建目录结构:

  mkdir -p locale/zh_CN/LC_MESSAGES
  mv first.po locale/zh_CN/LC_MESSAGES
  cd locale/zh_CN/LC_MESSAGES

创建mo文件:

msgfmt -o first.mo first.po

在中文环境运行我们程序进行测试:

deepin@deepin-PC:~/source/demo/python$ python3 first_gettext.py
这是我们要翻译的消息

文章引用:

http://blog.topspeedsnail.com/archives/9539

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值