首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python和gettext

Python和gettext
EN

Stack Overflow用户
提问于 2012-03-23 02:51:32
回答 1查看 11.2K关注 0票数 6

我正在构建一个Python应用程序,它利用了一堆翻译后的字符串。存放所述字符串的目录结构如下所示:

代码语言:javascript
复制
/locales
    default.pot # reference English strings live here
    /es_ES
        /LC_MESSAGES
            default.po #Spanish strings
    /de_DE
        /LC_MESSAGES
            default.po #German strings

这些default.po文件是由一个PHP应用程序生成的,但据我所知,它们符合使用gettext实现所需的通用标准。

当我尝试使用gettext在Python语言中使用这些字符串时,出现了以下错误(本例是从locales目录中运行的:

代码语言:javascript
复制
>>> import os; os.listdir('.')
['.svn', 'de_DE', 'default.pot', 'eng', 'es_ES', 'fr_FR', 'ja_JP', 'ko_KR', 'pl_PL', 'pt_BR', 'ru_RU']
>>> import os.path
>>> os.path.exists('./es_ES/LC_MESSAGES/default.po')
True
>>> import gettext
>>> ldir = 'es_ES/LC_MESSAGES/'
>>> t = gettext.translation('default',ldir)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py", line 469, in translation
IOError: [Errno 2] No translation file found for domain: 'default'
>>>

我不确定我在这里做错了什么(除了对这个库和它上下文中的“域”概念缺乏经验之外)。

我是不是犯了一个简单的错误?或者我对这些垃圾的工作原理的理解有根本的缺陷?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-23 04:47:36

我对此很生疏,但根据过去的经验和http://docs.python.org/library/gettext,我可以看到这里缺少两个主要的东西:

  1. ldir应设置为包含区域设置数据的基本目录(/usr/share/locale是典型的系统位置)。gettext将搜索无法自行读取的ldir/lang_COUNTRY/catalog.mo
  2. The .po文件,您需要将它们转换为.mo二进制文件。通常你会使用msgfmt来做这件事(在mac上“brew install gettext”是最简单的方法)。

一个简单的例子:

代码语言:javascript
复制
$ find /tmp/locales -type f
/tmp/locales/de_DE/LC_MESSAGES/default.mo
/tmp/locales/de_DE/LC_MESSAGES/default.po
/tmp/locales/default.pot
/tmp/locales/en_IE/LC_MESSAGES/default.mo
/tmp/locales/en_IE/LC_MESSAGES/default.po

$ ~/Library/homebrew/Cellar/gettext/0.18.1.1/bin/msgfmt \
-o locales/en_IE/LC_MESSAGES/default.mo \
locales/en_IE/LC_MESSAGES/default.po

$ cat /tmp/app.py 
import gettext
t = gettext.translation('default', "/tmp/locales")
_ = t.ugettext

print _("Hello World")

$ locale
LANG="en_IE.UTF-8"
LC_COLLATE="en_IE.UTF-8"
LC_CTYPE="en_IE.UTF-8"
LC_MESSAGES="en_IE.UTF-8"
LC_MONETARY="en_IE.UTF-8"
LC_NUMERIC="en_IE.UTF-8"
LC_TIME="en_IE.UTF-8"
LC_ALL=

$ python app.py 
How's the craic?

$ LC_MESSAGES=de_DE python app.py
Guten Tag
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9828629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档