Комбинирование ключей и полного текста при работе с файлами gettext и .po

Я ищу gettext и .po файлы для создания многоязычного приложения. Насколько я понимаю, в .po файле msgid - это источник, а msgstr - перевод. Соответственно, я вижу 2 способа определения msgid:

Использование полного текста (например, "My name is %s.\n") дает следующие преимущества:

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

Использование ключа (например, my-name %s) дает следующие преимущества:

  • когда исходный текст длинный (например, абзац о компании), gettext вызовы более краткие, что делает ваши представления более чистыми
  • легче поддерживать несколько .po файлов и представлений, потому что ключ с меньшей вероятностью изменится (например, ключ company-description с меньшей вероятностью изменится, чем фактическое описание компании)

Отсюда у меня вопрос:
Есть ли способ работы с gettext и .po файлами, позволяющий объединить преимущества обоих методов, а именно:
-использование клавиш для gettext вызовов
-способность переводчика увидеть полный текст, который нужно перевести?


person Max    schedule 01.04.2013    source источник


Ответы (2)


Я только что ответил на аналогичный (гораздо более старый) вопрос здесь.

Укороченная версия:

Формат файла PO очень прост, поэтому можно создавать файлы PO / MO из другого рабочего процесса, который обеспечивает гибкость, о которой вы просите. (вашим разработчикам нужны идентификаторы, вашим переводчикам нужны слова)

Вы можете использовать это решение самостоятельно или использовать облачное приложение, такое как Loco, для управления переводами и экспорта файла Gettext. с идентификаторами, когда они нужны вашим разработчикам.

person Tim    schedule 05.06.2013
comment
Я здесь на вашей стороне, поэтому не слишком объективен, принимая ваш ответ, но я действительно убежден, что это правильный путь: оставьте PO, потому что он широко используется и его легко манипулировать, создавать любые промежуточные шаги для их создания и использовать их в ваше приложение: в этом случае все будут довольны, и вы продолжите полагаться на то, что используют другие люди (за исключением вашего настраиваемого слоя, очевидно). - person Max; 05.06.2013

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

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

Минусы включают распространение изменений английского текста на другие языки. Если вы измените

msg_no_food = "We had no food left, so we had to eat the cats"

to

msg_no_food = "We had no food left, so we had to eat the cat's"

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

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

print help_message('help_no_food')

и у вас есть сценарий, который просто предоставляет справочные сообщения:

switch ($help_msg) {
...
case 'help_no_food': return gettext("We had no food left, so we had to eat the cat's");
...
}

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

Поскольку их, как правило, немного, часто проще полностью реализовать их вне gettext. например

brochure-view.en.php
brochure-view.de.php
brochure-view.zh.php
person fisharebest    schedule 02.04.2013
comment
Хорошее замечание об инвалидации. Альтернатива, которую вы предлагаете (с примером switch), добавляет дополнительный уровень, который в основном является тем, что я хотел бы от формата перевода, то есть иметь 1 - key/id, чтобы представления были более краткими и легко поддерживаемыми, 2 - source, чтобы убедиться, что у нас есть точный источник, который используется для признания недействительности, и 3 - translation. Вы знаете, есть ли такая структура в каких-либо форматах перевода? - person Max; 02.04.2013
comment
Как я уже сказал, я бы держался подальше от ключей, если это вообще возможно. По моему опыту, это усложняет чтение / отладку кода - не проще. Я использую их (косвенно через переключатель) только для текста справки, который в любом случае имеет тенденцию находиться вне остальной части кода. Формат PO великолепен, потому что он широко используется и понимается переводчиками (в отличие от разработчиков), и есть множество инструментов, облегчающих их работу. - person fisharebest; 03.04.2013
comment
Я полностью понимаю, что вы говорите, но есть одна вещь, которую я не могу понять: когда вам нужно сделать перевод всего абзаца (например, истории компании): вы используете весь английский абзац в вызове gettext ? Для меня это звучит ужасно, ИМО, было бы гораздо разумнее сделать gettext('company-history') - person Max; 05.04.2013
comment
@Max Мне не нравится использовать строки в качестве ключей, потому что во время компиляции нет проверки, действительно ли существует ключ (магические строки). Есть ли способ использовать gettext с функцией PHP define? Таким образом, будет ошибка, если ключ не существует (и приличное автозаполнение IDE тоже). - person Dai; 08.07.2016