Python и gettext - PullRequest
       26

Python и gettext

5 голосов
/ 22 марта 2012

Я создаю приложение на 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 реализациями.

Когда я пытаюсь использовать эти строки в Python с использованием gettext, происходит следующее (этот пример был запущен из каталога 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'
>>>

Я не уверен, что я делаю здесь неправильно (за исключением неопытности с этой библиотекой и понятием «домен» в ее контексте).

Я совершаю простую ошибку? Или у меня есть фундаментальный недостаток в моем понимании того, как работает это дерьмо?

Спасибо!

1 Ответ

7 голосов
/ 23 марта 2012

Я очень устала от этого, но, основываясь на прошлом опыте и http://docs.python.org/library/gettext,, я вижу здесь две основные вещи, отсутствующие:

  1. ldir должен быть установлен в базовый каталог, содержащий данные о локали (/ usr / share / locale - это классическое расположение системы). gettext будет искать ldir / lang_COUNTRY / catalog.mo
  2. .po файлы не могут быть прочитаны сами по себе, вам необходимо преобразовать их в двоичные файлы .mo. Обычно для этого нужно использовать msgfmt («brew install gettext» на Mac - самый простой способ получить это).

Быстрый пример:

$ 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
...