- PVSM.RU - https://www.pvsm.ru -
От переводчика: Это девятая статья из цикла о Node.js [1] от команды Mozilla Identity, которая занимается проектом Persona [2].
Знаете ли вы, что продукты и сервисы Mozilla локализованы для 90 языков? Локализация включает в себя:
В этой серии из трёх статей, посвящённых локализации, я расскажу о технических аспектах создания многоязычного приложения Node.js.
Мы будем использовать общепринятые термины «интернационализация» (i18n) и «локализация» (l10n). Интернационализация — это набор технических приёмов, делающих возможной последующую локализацию, то есть собственно перевод и адаптацию для конкретного языка.
Mozilla Persona — веб-сервис на Node.js, локализованный для множества локалей. У нашей команды были весьма специфические запросы, и поэтому мы не стали использовать существующие библиотеки для локализации.
Мы создали несколько модулей чтобы добиться следующих целей:
Вот модули, которые мы написали:
i18n-abide [11] — главный модуль, который используется для включения переводов в приложение. Давайте сначала разберёмся с ним. В примерах мы предполагаем, что выше приложение использует Express и шаблоны EJS.
i18n-abide устанавливается через npm:
npm install i18n-abide
В код приложения надо включить следующие строки:
var i18n = require('i18n-abide');
app.use(i18n.abide({
supported_languages: ['en-US', 'de', 'es', 'zh-TW'],
default_lang: 'en-US',
translation_directory: 'static/i18n'
}));
Мы рассмотрим параметры конфигурации модуля в третьей статье серии о локализации. i18n-abide предоставляет несколько функций, которые нужны для перевода. Они доступны в объекте req
при обработке запроса и в шаблонах.
Следующий шаг — пройтись по коду приложения и найти все места, где пользователю показывается какой-либо текст. Вот как может выглядеть шаблон после этого:
<title></title>
Главная функция, которую добавляет abide — это gettext()
. Кроме того, добавляются переменные lang
и lang_dir
.
lang
— это код языка, основанный на настройках браузера и предпочтениях пользователя;lang_dir
— направление текста, слева направо (ltr
) или справа налево (rtl
);gettext
— функция, которая принимает английскую строку и возвращает перевод.
Стоит обратить внимание, что говоря о строках, мы имеем в виду строки gettext
, а не строки JavaScript. Это любые фрагменты текста — надписи, абзацы, элементы интерфейса, которые будут видны пользователю. Если какая-то строка в коде не предназначена для глаз пользователя, то с точки зрения gettext
она не существует. Другими словами, строки gettext
— это любые строки, которые нуждаются в переводе.
Вот пример использования gettext
в файле JavaScript:
app.get('/', function(req, res) {
res.render('homepage.ejs', {
title: req.gettext('Hello, World!')
});
});
Для того чтобы подготовить приложение к локализации, надо обернуть все строки в вызовы gettext
.
Откуда мы знаем, какой язык предпочитает пользователь? Его определением занимается middleware во время выполнения.
Модуль i18n-abide смотрит на поле Accept-language
HTTP-запроса. В нем перечислены языки, которые понятны пользователю, в порядке предпочтения.
abide сравнивает это значение со списком поддерживаемых языков, выбирает наилучшее соответствие и отдаёт клиенту локализованную версию страницы. Если подходящего перевода не найдено, подставляются фразы непосредственно из вызовов gettext
в коде и шаблонах.
Во второй статье мы рассмотрим, как именно извлекаются, обрабатываются и переводятся строки.
В третьей — более подробно разберёмся с техническими деталями и параметрами конфигурации и протестируем результат локализации.
Автор: ilya42
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/45740
Ссылки в тексте:
[1] цикла о Node.js: https://hacks.mozilla.org/category/a-node-js-holiday-season/
[2] Persona: http://ru.wikipedia.org/wiki/Mozilla_Persona
[3] Охотимся за утечками памяти в Node.js: http://habrahabr.ru/company/nordavind/blog/195494/
[4] Нагружаем Node под завязку: http://habrahabr.ru/company/nordavind/blog/195686/
[5] Храним сессии на клиенте, чтобы упростить масштабирование приложения: http://habrahabr.ru/company/nordavind/blog/196018/
[6] Производительность фронтэнда. Часть 1 — конкатенация, компрессия, кэширование: http://habrahabr.ru/company/nordavind/blog/196358/
[7] Пишем сервер, который не падает под нагрузкой: http://habrahabr.ru/company/nordavind/blog/196518/
[8] Производительность фронтэнда. Часть 2 — кешируем динамический контент с помощью etagify: http://habrahabr.ru/company/nordavind/blog/196818/
[9] Приручаем конфигурации веб-приложений с помощью node-convict: http://habrahabr.ru/company/nordavind/blog/197166/
[10] Производительность фронтенда. Часть 3 — оптимизация шрифтов: http://habrahabr.ru/company/nordavind/blog/197370/
[11] i18n-abide: https://github.com/mozilla/i18n-abide
[12] Источник: http://habrahabr.ru/post/197566/
Нажмите здесь для печати.