我正在构建一个利用一堆翻译后的字符串的Python应用程序。包含上述字符串的目录结构如下所示:

/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目录中运行:
>>> 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'
>>>

我不确定自己在做什么错(除了对该库缺乏经验以及上下文中的“域”的概念之外)。

我是在犯一个简单的错误吗?还是我对这种垃圾的工作方式有根本的缺陷?

谢谢!

最佳答案

我对此非常生疏,但是根据过去的经验和http://docs.python.org/library/gettext,我可以看到这里遗漏了两个主要内容:

  • ldir应该设置为包含语言环境数据的基本目录(/usr/share/locale是经典的系统位置)。 gettext将搜索ldir/lang_COUNTRY/catalog.mo
  • 无法单独读取.po文件,您需要将其转换为.mo二进制文件。通常,您会使用msgfmt来执行此操作(在Mac上,“brew install gettext”是最简单的方法)。

  • 一个简单的例子:
    $ 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
    

    关于python - Python和gettext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9828629/

    10-12 22:44