Свобода выбора… i18next, polyglot или formatJS
Когда мы начали работу над locize.com нашей локализацией как сервисной платформой, мы в основном имели в виду решить процесс перевода для разработчиков, использующих наш фреймворк i18n i18next.com.
Системы управления переводами - отличное подспорье. Но все же существует разрыв между разработкой и процессом перевода. Файлы должны быть экспортированы / импортированы / объединены, и все это время добавляется новый контент для перевода. Хаос неизбежен. locize.com приходит на помощь. Это как служба перевода на стероиде, напрямую подключенная к вашему инструментированному веб-проекту i18next. ("источник")
Через несколько недель после успешного запуска бета-версии и добавления множества сторонних услуг для заказа переводов непосредственно из вашего проекта locize, мы начали задаваться вопросом, можем ли мы также привнести удивительность в другие фреймворки интернационализации внешнего интерфейса, такие как полиглот airbnb или Yahoo. FormatJS?
polyglot + locize.com
Наш первый взгляд на полиглот показал, что реализация очень похожа на формат json i18next, только множественные числа хранятся в одном ключе и разделяются символом `||||`.
Мы решили сделать небольшой всплеск, используя экспресс-сервер node.js, загружающий ресурсы с locize.com с помощью своего API и возвращающий демонстрационную страницу с использованием полиглота для ее перевода.
Использование запроса для загрузки переводов:
function load(lng, callback) { var url = ‘https://api.locize.io/[YOUR_PROJECT_ID]/latest/{{lng}}/translation'.replace('{{lng}}', lng); request(url, function(err, res, body) { callback(err, lng, body); }); }
JSON, который мы загружаем из проекта locize, выглядит так:
{ “interpolate”: “Hello, %{name}.”, “intro”: “The locize.com platform is fully compatible with airbnb’s polyglot i18n module.”, “plural”: “%{smart_count} car |||| %{smart_count} cars”, “something”: { “nested”: “Nested value something.nested” }, “title”: “Using polyglot with locize.com” }
Https://api.locize.io/897381a6-125c-40b8-9b28-2f80ae9a3612/latest/en/translation
Мы возвращаем html файл, внедряя загруженный json при запросе корня
app.get(‘/’, function(req, res) { var lng = req.query.lng || ‘en’; fs.readFile(__dirname + ‘/index.html’, (err, data) => { if (err) console.log(err); data = data.toString().replace(‘###locals###’, JSON.stringify(locals[lng])).replace(‘###lng###’, lng); res.set(‘content-type’,’text/html’); res.send(data); }); });
В html мы в основном используем полиглот, как описано на его веб-сайте
<script> // initialize polyglot by settings phrases on server var polyglot = new Polyglot({ phrases: JSON.parse(###locals###), locale: ‘###lng###’ }); // translate document.getElementById(‘headline’).innerHTML = polyglot.t(‘title’); ...
Вы можете проверить этот пример на github: https://github.com/locize/locize-polyglot-example. Хотя это очень простой пример, основное внимание уделяется доказательству того, что вы можете получить прибыль от использования locize.com с помощью полиглота. Адаптируйте образец к своему внутреннему языку или просто используйте xhr напрямую для загрузки данных внутри вашего клиента. Вы напрямую получаете те же преимущества, которые до сих пор имели разработчики i18next, используя locize.com.
formatJS + locize.com
formatJS хорошо известен тем, что использует intl API для анализа дат и чисел, а также использует формат сообщений ICU для переводов. Формат сильно отличается от того, что использовался в i18next, но все же это просто json на основе клавиш.
Итак, мы начали с того, что сделали с полиглотом. Для бэкэнда никаких изменений не потребовалось, поэтому просто прокрутите до образца полиглота, где мы используем запрос на загрузку переводов.
JSON, который мы загружаем из проекта locize, выглядит так:
{ "interpolate": "Hello, {name}.", "intro": "The locize.com platform is fully compatible with yahoo's format.js i18n module.", "plural": "You have {numPhotos, plural, =0 {no photos.}=1 {one photo.}other {# photos.}}", "title": "Using format.js with locize.com" }
Https://api.locize.io/9ac4fb1f-be22-4028-bcbc-0da13010b35e/latest/en/translation
В html мы используем модуль IntlMessageFormat и создали небольшую вспомогательную функцию
<script> // initialize var resources = JSON.parse(###locals###); var lng = ‘###lng###’; // translation helper function t(key, opts) { opts = opts || {}; var m = new IntlMessageFormat(resources[key], lng); return m.format(opts); } // translate document.getElementById(‘headline’).innerHTML = t(‘title’); ...
Вы можете увидеть полный пример на github: https://github.com/locize/locize-formatjs-example. Образец можно легко адаптировать для react-intl, ember-intl, handlebars-intl, dust-intl или любой другой инфраструктуре с использованием формата сообщений icu, например. Https://github.com/messageformat/messageformat.js.
Вывод
Первоначально фокусируясь на i18next json format при создании locize.com, мы обнаружили, что вы можете получать прибыль от сервиса locize.com, используя полиглот, или любую библиотеку, используя формат сообщений (formatJS и другие).
Нам нравится гибкость, поэтому мы с нетерпением ждем, когда наш первый клиент создаст проект с использованием инфраструктуры airbnb или Yahoo i18n.