Я создаю программу 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, когда пользователь нажимает на мою программу.
Учитывая, что вы используете Python, я предполагаю, что вы используете setuptools / distribte / distutils в качестве системы сборки. В таком случае вместо этого вы можете использовать DistUtilsExtra.auto:
from DistUtilsExtra.auto import setup
setup(
name="Your Project",
version="0.1",
...
)
Вы можете передать в setup () те же аргументы, что и для вашего пакета. DistUtilsExtra.auto может автоматически обрабатывать многие компоненты системной интеграции, такие как переводы, включая перевод статических текстовых файлов, таких как файлы .desktop.
Двоичные MO-файлы должны быть сгенерированы во время сборки. Это означает, что ваша система сборки должна иметь цель сборки для чтения текстовых PO-файлов , используемых в качестве источника, и преобразования их в двоичные файлы MO, которые будут установлены в системе пользователя. Как вы правильно заметили, команда msgfmt
(часть gettext tools ) в конечном итоге создаст их.
Итак, чтобы ответить на последнюю часть вопроса, да, файлы 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-файл, чтобы дать переводчикам выполнять свою работу.
Если вы используете 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/rules
может стать очень простым и состоять всего из нескольких строк. На самом деле, вы можете просто использовать Quickly, чтобы создать жгут для системы сборки и упаковки вашего приложения, а затем заменить сгенерированный исходный код Quickly для тестового приложения на код вашего приложения.