Когда следует создавать файлы .mo?

Я создаю программу Python GTK3. Я хотел бы добавить поддержку перевода. Я знаю, как создать .pot и .po файл. Однако, чтобы сделать приложение доступным на нескольких языках, мне нужно сгенерировать файлы .mo. Я прочитал здесь , что для генерации .mo файлов используется команда msgfmt.make .

Мой вопрос заключается в том, должен ли я (разработчик) создавать файлы .mo вручную на своем компьютере, а затем дать указание установщику .deb переместить файлы в папку usr / share / locale / en_GB /, когда она устанавливается? Или установщик .deb должен сгенерировать эти файлы .mo, пока пользователь устанавливает мою программу в своей системе?

Таким образом, это можно обобщить так: « Зависит ли машина от файлов .mo? »

Моя структура папок выглядит следующим образом

nstrain-0.1
   /debian
   /data
   /help
   /nstrain_lib
   nstrain.desktop
   nstrain.py

где nstrain.py - основной исполняемый файл, который запускается .desktop, когда пользователь нажимает на мою программу.

6
задан 30 May 2012 в 18:45

2 ответа

Учитывая, что вы используете Python, я предполагаю, что вы используете setuptools / distribte / distutils в качестве системы сборки. В таком случае вместо этого вы можете использовать DistUtilsExtra.auto:


from DistUtilsExtra.auto import setup

setup(
    name="Your Project",
    version="0.1",
    ...
)

Вы можете передать в setup () те же аргументы, что и для вашего пакета. DistUtilsExtra.auto может автоматически обрабатывать многие компоненты системной интеграции, такие как переводы, включая перевод статических текстовых файлов, таких как файлы .desktop.

0
ответ дан 30 May 2012 в 18:45

Двоичные MO-файлы должны быть сгенерированы во время сборки. Это означает, что ваша система сборки должна иметь цель сборки для чтения текстовых PO-файлов , используемых в качестве источника, и преобразования их в двоичные файлы MO, которые будут установлены в системе пользователя. Как вы правильно заметили, команда msgfmt (часть gettext tools ) в конечном итоге создаст их.

Итак, чтобы ответить на последнюю часть вопроса, да, файлы MO зависят от машины.

Создание MO-файлов сложным способом

Теперь о том, как их создавать, в стандартной компоновке gettext вы, как правило, будете иметь все PO-файлы в одном каталоге, по одному на каждый язык и названные в честь ISO каждого языка. 639 Двухбуквенный или трехбуквенный код:

po/
po/ca.po
po/de.po
...

Если вы хотите создать их вручную, вам придется просмотреть каждый файл в этом каталоге и вызвать msgfmt вручную, например

$ msgfmt -c po/ca.po -o build/locale/LC_MESSAGES/ca/myapp.mo

Но вы не хотите делать это, когда уже есть установленный способ и автоматизированные инструменты, созданные специально для работы по созданию MO-файлов.

Кроме того, эти инструменты заботятся о других связанных задачах, таких как извлечение переводов из кода и помещение их всех в POT-файл, чтобы дать переводчикам выполнять свою работу.

Создание MO-файлов умным способом

Если вы используете Python, я очень рекомендую использовать пакет python-distutils-extra (install pde), который автоматизирует и скрывает сложность, просто указав следующее в файле setup.py, который вы будете использовать для сборки, установки и распространения своего приложения. Тот же пример, который @dobey уже указывал в своем ответе:

DistUtilsExtra.auto.setup(
    name='myapp',
    version='0.1',
    #license='GPL-3',
    #author='Your Name',
    #author_email='email@ubuntu.com',
    #description='UI for managing …',
    #long_description='Here a longer description',
    #url='https://launchpad.net/myapp'
)

Это обо всем позаботится за вас.

Если вы хотите проверить переводы перед отправкой, вы можете использовать удобную команду build_i18n из python-distutils-extra:

$ python setup.py build_i18n

Это соберет все PO-файлы в вашем /po и поместит их в build (он создаст его, если он не существует) в том же макете, который ожидает gettext, когда они установлены в системе.

Затем вы можете протестировать свое приложение с переводами либо: * Копируя содержимое /build в /usr/share/locale, либо * Указав свое приложение в каталог сборки, используя функцию gettext.bindtextdomain() : [ 1142]

gettext.bindtextdomain(domain='myapp', localedir='/home/me/dev/myapp/build')

Будучи еще умнее

Встань на плечо гигантов. Просто создайте тестовое приложение с Quickly и скопируйте настройку переводов в setup.py, что в основном сводится к использованию модуля DistutilsExtra в режиме auto, как описано выше.

Вы можете использовать тестовое приложение, чтобы поиграть в генерацию переводов и узнать, как работает генерация.

Упаковка

В архиве, который вы собрали как часть выпуска, не должно быть файлов .mo. То есть вам не нужно создавать их вручную. Это должно происходить, когда кто-либо создает содержимое tarball для установки вручную или когда, например, создается двоичный пакет Debian.

Глядя на ваше дерево исходников, я бы снова предложил использовать систему сборки, такую ​​как python-distutils-extra, которая также поможет с упаковкой. Грубо говоря, вам необходимо:

  • Создать файл setup.py с содержимым, аналогичным предложенному выше
  • Создать файлы управления упаковкой в ​​debian /. Используя p-d-e, ваш файл debian/rules может стать очень простым и состоять всего из нескольких строк.

На самом деле, вы можете просто использовать Quickly, чтобы создать жгут для системы сборки и упаковки вашего приложения, а затем заменить сгенерированный исходный код Quickly для тестового приложения на код вашего приложения.

0
ответ дан 30 May 2012 в 18:45

Другие вопросы по тегам:

Похожие вопросы: