Локализация Ruby: i18n, g18n, gettext, padrino ... - какая разница? - PullRequest
17 голосов
/ 21 июня 2011

Будучи новичком в Ruby, я изучаю существующие библиотеки, чтобы делать то, что я обычно делаю на других языках сценариев, и я немного озадачен библиотеками локализации, которые могут быть доступны для чего-то, созданного поверх Sinatra / Сиквел (Rails / AR немного слишком самоуверенный, на мой вкус).

Теперь я столкнулся с парой (i18n, r18n, GetText), хотя эта вики-страница , и, очевидно, в Padrino используется дополнительная библиотека (основанная на i18n из Rails?); и, видимо, еще много.

За исключением очевидного (то есть стиль GetText mo / po против файлов yml), я несколько озадачен тем, как эти параметры могут отличаться. Вики в этом отношении особо ничего не говорит, кроме как о том, что они существуют; не то, как они отличаются.

В добавление к этой путанице является тот факт, что практически каждая часть документации, по-видимому, охватывает одну из них (и, как правило, в контексте RoR). Более того, эти варианты не выглядят полностью несовместимыми друг с другом при более внимательном рассмотрении - в том смысле, что, если я правильно понял, они могут в значительной степени понимать файлы друг друга.

Может ли кто-нибудь здесь дать краткое и конкретное объяснение / обзор этих библиотек и наметить разницу между ними? Некоторые указания по производительности также будут приветствоваться, если вы о них знаете (кроме тех, что приведены в документах fast_gettext, что не имело особого смысла, учитывая мое непонимание разницы между этими параметрами).

Ответы [ 4 ]

30 голосов
/ 21 июня 2011

Я вижу, как эта ситуация сбивает с толку, не зная истории библиотек i18n / l10n в Ruby.Я, вероятно, должен написать несколько слов об этом, но сейчас я попытаюсь дать обзор с моей точки зрения:

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

Gettext как таковой определяет API и есть две библиотеки, которые реализуют его в мире Ruby: традиционные Ruby Gettext пакеты от Masao Mutoh и fast_gettext gem от MichaelGrosser .

Ruby Gettext довольно мощный и содержит множество функций, которые могут вам понадобиться или не понадобиться.Драгоценный камень fast_gettext, с другой стороны, ориентирован на сырую скорость и реализован в виде блестящей современной библиотеки Ruby в стиле кода, которую легко взломать, а автор очень умный и поддерживающий человек.Из двух я лично настоятельно рекомендую fast_gettext.

I18n gem является результатом совместных усилий различных решений Ruby i18n / l10n, которые существовали несколько лет назад и которые всестремился вытеснить Gettext по разным причинам на тот момент.Получающийся API I18n в основном охватывает требования и варианты использования всех решений i18n / l10n, которые использовались в то время, включая API Gettext.Итак, сегодняшний API Ruby I18n является расширенным набором API Gettext с начала 90-х годов.

Сегодня гем I18n является официальным решением, которое поставляется с Ruby on Rails , но такжевероятно, самый популярный один в мире Ruby в целом.

Gem I18n также позволяет очень легко расширять набор функций и добавлять такие вещи, как кэширование, другие механизмы хранения(например, Gettext po-файлы, таблицы базы данных, хранилища ключей-значений; по умолчанию для хранилища используются обычные файлы Ruby и YAML) и т. д., и он поставляется с числом модулей для этого (но внешние или пользовательские модули легко могут бытьсозданный, протестированный и интегрированный).

Существуют файлы перевода для 70 + языков (локали) для строк, используемых Ruby on Rails (которые также полезны в других проектах), поддерживаемыхсообщество.

Я не могу много рассказать о R18n , за исключением того, что он был изобретен сразу после выхода первого релиза I18n, и насколько я помню, он произошел.Эд из сообщества Мерб.Кажется, он довольно силен в мире русского Ruby, но я могу ошибаться во всех этих утверждениях.

Так что, если у вас нет очень веской причины выбрать какое-либо другое решение, я настоятельно рекомендую использовать I18n.

Тогда с другой стороны, это ничего не значит, потому что Я руководил этим проектом более или менее с момента его изобретения.

Надеюсь, это поможет.

[ПРАВИТЬ] добавлены ссылки на различные ссылки

5 голосов
/ 23 июля 2015

Первый:
Как писал 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 для перевода.

5 голосов
/ 21 июня 2011

I18n - это основной поток.

R18n - это альтернатива с некоторыми дополнительными функциями (переводы моделей, синтаксический сахар) и некоторой разницей в идеологии и архитектуре (расширяемость с помощью мощных фильтров).

G18n нужно добавить переходы модели в I18n.

Padrino - это не библиотека i18n, это просто среда Sinatra со встроенным I18n.

Gettext - старая концепция ИМХО с очень уродливым форматом ипроблема с плюрализмом.В любом случае, это не популярно в сообществе Ruby.

2 голосов
/ 21 июня 2011

Ответ Андрея, указывающий мне на r18n документы , которые в основном разбивают его на одну строку:

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

Нашел этот слайд от Андрея. Это по-русски, но теперь это стало намного понятнее (слайды с 7 по 9, в частности отчетливые различия между i18n и r18n):

http://www.slideshare.net/iskin/r18n

...