Извлеките один перевод из gettext .po файла из оболочки - PullRequest
0 голосов
/ 11 февраля 2019

На этапе сборки моего приложения C ++ (с использованием CMake в качестве системы сборки) мне нужно создать несколько файлов шаблонов, которые должны содержать локализованные строки.

Строки доступны от переводчиков уже в форме gettext..po файлы (те же, что будут использоваться для перевода самого приложения).

Поэтому мне нужен способ извлечения перевода в заданную английскую исходную строку из файла .po (либо через Bash / shellили через CMake)

Я до сих пор придумал следующее:

translated_string=$(
    msggrep --msgid -e "^${untranslated_string}$" ${po_file} \
        | msgattrib --no-fuzzy \
        | grep -A 1 'msgid "${untranslated_string}$"' \
        | sed -n 's/msgstr "\(.*\)"/\1/p'
)

Очевидно, это много вызовов для "простой" функции:

  • msggrep выводит файл .po, в котором есть только строка, которую я хочу
  • msgattrib гарантирует, что перевод не является «нечетким» (т.е. нуждается в обновлении), поскольку я не могу использовать эти
  • Затем я вручную извлекаю перевод, используя grep и sed

Я думаю, должен быть лучший подход к этому?В конце концов, gettext облегчает перевод моего приложения во время выполнения, но кажется, что он несколько негибкий во время сборки ...

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Использование двоичных файлов .mo и извлечение оттуда строки, как это было предложено Гвидо Флором в https://stackoverflow.com/a/54707280/2514664, оказалось работоспособным решением.

Однако, используя собственный исполняемый файл gettext, в конечном итогеизвлекать строку, как было предложено в первоначальном ответе, оказалось слишком много последствий (в конце концов, она предназначена для извлечения видимой пользователем строки в локали, наиболее подходящей для пользователя, из существующего каталога сообщений, а не как инструмент сборкикоторый "просто" должен извлечь одну строку на определенном языке из определенного файла).В конечном счете, он слишком хрупок для использования в системе сборки, которая должна работать на нескольких платформах.

Я использую Python, и его собственный модуль gettext работает намного лучше и может сэкономить многоусилий (особенно если вы знакомы с Python).

Создание файлов .mo из файлов .po может работать так, как предлагается в связанном ответе:

mkdir -p locale/de/LC_MESSAGES
msgfmt de.po -o locale/de/LC_MESSAGES/package.mo

Получение переводав Python это так же просто, как

import gettext

translation = gettext.translation('package', localedir='locale', languages=['de'])
translated_string = translation.gettext('unstranslated_string')

Кстати.после решения моей собственной проблемы я обнаружил, что в папке / Tools / i18n моего дистрибутива Python есть также msgfmt.py и pygettext.py, которые должны предлагать те же функциональные возможности, что и сами msgfmt и gettext.Они оба могут быть интересны для решения схожих проблем, либо для непосредственного использования, либо для изучения их реализации для создания чего-то нового (например, msgfmt.py включает в себя простой анализатор файлов .po).

0 голосов
/ 15 февраля 2019

.po файлы предназначены для переводчиков.Программное обеспечение должно использовать скомпилированные .mo файлы для поиска переводов.

GNU gettext поставляется с двоичным файлом gettext, который предназначен для интернационализации сценариев оболочки.Вы можете использовать это в своих целях следующим образом:

$ mkdir -p de/LC_MESSAGES 2>/dev/null
$ msgfmt --verbose --statistics de.po -o de/LC_MESSAGES/package.mo
$ TEXTDOMAINDIR=. LANGUAGE=de LANG=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 gettext package 'Hello, world!'

Замените «package» на ваш текстовый домен «Hello, world!»с вашим идентификатором сообщения и de на выбранном вами языке.Обратите внимание, что для этого необходимо, чтобы выбранный языковой стандарт (в данном случае de языковой стандарт) был установлен в системе сборки.

См. gettext(1) и msgfmt(1) для получения дополнительной информации.

...