Первый:
Как писал svenfuchs, I18n
- это инфраструктура, которая предоставляет модули для многих подходов к переводу и интернационализации.
'gettext' является лишь одним из многих модулей.
Так что на самом деле нет вопросов, чтобы использовать I18n
.
По умолчанию в приложении Rails используется I18n
с бэкэндом YAML, и я понимаю часть вашего вопроса, чтобы сравнить этот бэкэнд с другими.
ИМХО, есть два основных различия между подходами, основанными на gettext
и YAML
:
- поддержка жизненного цикла
- иерархия
Gettext
Одна из идей gettext
состоит в том, что перевод приложения - это не единичное событие, а процесс жизненного цикла.
Он создан для поддержки этого жизненного цикла.
gettext
предназначен для использования простого английского языка в качестве ключей для переводов. Таким образом, идея состоит в том, чтобы написать приложение на английском языке и пометить весь текст, который должен быть переведен, как правило, заключив его в _()
.
В результате исходный код приложения легко читается на английском языке.
Затем программа сканирует весь исходный код и извлекает тексты для перевода и создает хранилище (файл .pot
) этих текстов.
На следующем шаге, и вот живой цикл , хранилище объединено с существующими переводами ( .po файлов, по одному на каждый целевой язык ) и новые или измененные элементы отмечены.
Зрелые редакторы поддерживают переводчиков, сосредотачиваясь на новых и измененных элементах. Кроме того, специальные словари проекта могут поддерживать частичные автоматические переводы.
gettext
- это flat , что означает, что каждая ключевая фраза переводится ровно один раз в файлах перевода. Там нет иерархии. Но есть контекст. В файлах перевода перечислены все позиции исходного кода ключевой фразы. Редактор с доступом к исходному коду может отображать источник вместе с переводом (а некоторые делают).
Наконец, .po
файлы переводятся в машиночитаемые формы быстрого доступа (может быть .mo , классический стандарт или база данных или json или ...)
YAML
YAML, с другой стороны, является иерархическим, поэтому легко иметь разные варианты переводов в разных контекстах.
I18n использует эту структуру для поддержки scopes
и использует текущий путь к файлу в качестве области при использовании ключей, начинающихся с точки.
Нет информации о том, где ключ используется в проекте (хорошо, если только он не задан автоматически, но ключ может быть явно использован в других местах).
Нет информации, есть ли какие-либо изменения.
Если ваша среда IDE не поддерживает вас, разработчик должен найти правильное место для вставки ключа в YAML, и поиск по использованию может быть обременительным.
В других ответах сказано намного больше.
I18n
Я специально сказал YAML , а не I18n , потому что I18n является основой для интернационализации (не только перевода), а YAML возможен только один бэкэнд.
Множественная поддержка в I18n отличается от множественной поддержки ванильного gettext. У меня нет опыта их сотрудничества.
Примеры
gettext с позиционными параметрами:
sprintf(
_('Do you really want to delete tour %1$s_%2$s? Only empty tours can be deleted!'),
tag, idx)
переводы - это текстовые файлы, но PO-редакторы предоставляют графический интерфейс:
#: js/addDelRow.js:15
msgid "" "Do you really want to delete tour %1$s_%2$s? Only empty tours can be deleted!"
msgstr "" "Wollen sie die Spalte %1$s_%2$s wirklich löschen? Nur leere Spalten können "
"gelöscht werden."
YAML с параметрами:
Источник
<%= t('.checked_at', ts: l(checked_at), user: full_name) %>
перевод
от
en:
hotels:
form:
checked_at: „set to checked by %{user} on %{ts}“
до
de:
hotels:
form:
checked_at: "geprüft gesetzt am %{ts} von %{user}“
Заключение
YAML гораздо проще начать, особенно если у вас есть поддержка со стороны IDE.
ВАНИЛЬНЫЕ ЖЕЛЕЗНЫЕ ДОРОГИ имеют это встроенный.
Это не родной язык. Первым переводом может быть любой язык.
С гВ проектах Rowing и нескольких языках мои файлы YAML имеют тенденцию к повторению (один и тот же перевод разбросан по иерархии) и отслеживанию изменений, и, следовательно, новые переводы громоздки.более сложная настройка.
Он поддерживает весь жизненный цикл непрерывного перевода разрабатываемых приложений.
Он основан на исходном коде на английском языке.
Обычно я использую лучшие части обоих, используя YAML дляинтернационализация (формат числа и даты, может быть, названия моделей?) и gettext для перевода.