gettext中的一点缺憾

本文探讨了在Python中使用gettext进行国际化编程时遇到的问题及解决办法,重点介绍了如何处理中文字符串的翻译难题。
部署运行你感兴趣的模型镜像

在python中做国际化编程,自然是首选gettext了,不过在使用过程中遇到了不少问题。

1、程序中待翻译字符串只能是english字串,chinese字串无法翻译,如下面一段程序:

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'])
en.install()
print _("我爱你")

 

输出结果仍然是"我爱你",而不是我期望的"i love you",除非这样写:

 

 

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'])
en.install()
print _(u"我爱你")

 

这是很不方便的,我尝试了以下2中方法

 

1)在translation中指定codeset='gb2312'

 

2)在install函数中指定unicode=True

都无法解决问题。是什么原因导致的呢?单步跟踪发现,原来gettext是把原始字串和翻译字串以字典形式存入translation类的_catalog中的,下面是调试时的信息,从中可以知道两点,一是存储在字典中的字串都是unicode的,二是gettext直接以_()中的字串作为key在_catalog字典中查找。结果当时是由于类型不匹配而找不到,因此返回原字串。

 

知道了原因,当然就知道怎么做了。修改gettext345行成下面这样:

 

 

然后使用的时候就是在构造translation时指定codeset就可以了,再也不用显式传递unicode字串给_()函数,岂不是很方便?

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'], codeset='gb2312')
en.install()
print _("我爱你")

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要回答用户关于在Linux环境中使用gettext进行国际化处理的教程。首先,我得回忆一下gettext的基本流程。用户可能需要知道如何提取字符串、生成翻译文件、翻译内容以及如何在程序中使用这些翻译。 首先,我应该确定用户可能使用的编程语言,比如C或者Python,但根据用户提供的引用中有Python的例子,可能用户更关注Python的情况。不过引用中也有提到PHP的例子,所以可能需要涵盖多种语言,但用户明确问的是Linux环境,可能更偏向于C或者shell脚本? 接下来,按照步骤来。第一步通常是标记代码中的字符串,使用gettext函数,比如_()。然后使用xgettext提取pot文件,接着创建po文件进行翻译,最后生成mo文件。运行时设置环境变量来切换语言。 需要检查用户提供的引用内容。引用1中的例子是Python代码,使用gettext.install。引用3提到PHP设置环境变量,引用4提到浏览器配置或函数返回zh_cn。可能需要综合这些信息,给出一个通用的步骤,同时结合示例。 用户可能遇到的问题包括如何安装gettext工具,如何生成和编辑po文件,如何测试不同的语言环境。此外,可能需要说明如何通过环境变量切换语言,如LC_ALL、LANG等,如引用3所述。 需要确保步骤清晰,从安装工具开始,到代码中的标记、提取字符串、翻译、编译mo文件,最后测试。给出具体的命令示例,比如xgettext命令,msginit,msgfmt等。同时,提供代码示例,比如Python中使用gettext模块的方式,如引用1中的示例。 还要注意路径问题,mo文件通常存放在特定的目录结构下,比如/usr/share/locale/zh_CN/LC_MESSAGES/,这点在引用1和4中都有提到。可能需要说明如何设置本地化目录的位置,尤其是在开发环境中。 另外,用户可能需要知道如何动态切换语言,比如在运行时通过设置环境变量,或者在代码中强制设置,如引用3中的putenv和setlocale。这部分需要详细说明。 最后,生成相关问题,比如如何处理多语言支持,如何更新翻译文件,或者常见的错误处理,如mo文件未找到的情况。 需要确保回答结构清晰,分步骤说明,并给出具体示例,同时引用提供的参考资料来支持步骤的正确性。比如在代码示例部分引用[^1],在设置环境变量部分引用[^3],在目录结构部分引用[^4]。</think>### Linux环境中使用gettext进行国际化处理的步骤 #### 1. **安装gettext工具** - 在Linux系统中安装gettext工具包,用于提取和编译翻译文件: ```bash sudo apt-get install gettext # Debian/Ubuntu sudo yum install gettext # CentOS/RHEL ``` #### 2. **标记代码中的可翻译字符串** - 在代码中使用`gettext()`函数(通常简写为`_()`)标记需要翻译的字符串。以Python为例: ```python import gettext gettext.install('myapp', 'locales') # 设置翻译文件目录为locales print(_("Hello, World!")) # 需要翻译的字符串 ``` #### 3. **生成模板文件(.pot)** - 使用`xgettext`命令提取代码中的字符串到模板文件: ```bash xgettext -o messages.pot your_script.py # 提取Python文件中的字符串 ``` #### 4. **创建翻译文件(.po)** - 为每种语言创建`.po`文件,例如中文(`zh_CN`): ```bash mkdir -p locales/zh_CN/LC_MESSAGES msginit -i messages.pot -o locales/zh_CN/LC_MESSAGES/messages.po -l zh_CN ``` - 编辑生成的`messages.po`文件,填写翻译内容: ```po msgid "Hello, World!" msgstr "你好,世界!" ``` #### 5. **编译为二进制格式(.mo)** - 使用`msgfmt`将`.po`文件编译为机器可读的`.mo`文件: ```bash msgfmt locales/zh_CN/LC_MESSAGES/messages.po -o locales/zh_CN/LC_MESSAGES/messages.mo ``` #### 6. **设置语言环境并测试** - 通过环境变量切换语言: ```bash export LC_ALL=zh_CN.UTF-8 # 设置为中文[^3] python your_script.py # 输出应为“你好,世界!” ``` - 或在代码中动态设置: ```python import os os.environ['LC_ALL'] = 'fr_FR' # 设置为法语 ``` #### 7. **目录结构示例** ``` project/ ├── your_script.py └── locales/ ├── zh_CN/ │ └── LC_MESSAGES/ │ ├── messages.po │ └── messages.mo └── fr_FR/ └── LC_MESSAGES/ └── messages.mo ``` ### 关键引用说明 - 使用`gettext.install`指定翻译文件路径。 - 通过环境变量`LC_ALL`或`LANG`切换语言。 - 翻译文件需按标准路径存放(如`locales/zh_CN/LC_MESSAGES`)[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值