Эта статья была рецензирована Джулианом Моц , Панайотисом Велисаракосом , Вилданом Софтиком и Тимом Севериеном . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Итак, вы разработчик, работающий над следующей большой вещью. Ваши клиенты любят ваш продукт, и он получает восторженные отзывы во всех социальных сетях. Более того, генеральный директор компании только что получил $ 10 000 000 для финансирования на новые рынки. Но прежде чем вы сможете выйти на глобальный уровень, продукт должен быть обновлен для поддержки различных языков, валют, форматов дат и многого другого. И угадайте, что? Вы и ваша команда ответственны за то, чтобы это произошло. В техническом плане ваше программное обеспечение должно быть интернационализировано, а затем локализовано.
Интернационализация (также известная как i18n ) — это процесс создания или преобразования продуктов и услуг, чтобы их можно было легко адаптировать к конкретным местным языкам и культурам. Локализация (также известная как L10n ) — это процесс адаптации интернационализированного программного обеспечения для конкретного региона или языка. Другими словами, интернационализация — это процесс адаптации вашего программного обеспечения для поддержки нескольких культур (формат валюты, формат даты и т. Д.), А локализация — это процесс внедрения одной или нескольких культур.
Эти два процесса обычно применяются компаниями, имеющими интересы в разных странах, однако они также могут пригодиться одному разработчику, работающему на их собственном сайте. Например, как вы, наверное, знаете, я итальянец и у меня есть веб-сайт. Мой веб-сайт в настоящее время на английском языке, но я мог бы принять решение о его интернационализации, а затем перевести на итальянский Это полезно для тех, кто является носителем итальянского языка и не очень хорошо привык к английскому языку.
В этой статье я познакомлю вас с Globalize , библиотекой JavaScript для интернационализации и локализации, разработанной некоторыми членами команды jQuery. Все фрагменты, демонстрируемые в этой статье, можно найти в нашем репозитории GitHub .
Но прежде чем углубляться в Globalize, я хотел бы завершить это краткое введение в i18n словами Рафаэля Ксавье де Соуза , руководителя проекта:
Разработчики считают, что i18n — это переводы на неанглийские языки. Это i18n необходимо только для расширения текущего приложения для нескольких стран или рынков. Я всегда пытаюсь объяснить, что i18n — это «общение» вообще. Каждое приложение в какой-то момент должно «общаться» со своими пользователями. Чтобы общаться с пользователями, приложению может потребоваться поддержка плюрализации, гендерные различия, форматирование даты, форматирование чисел и форматирование валюты. Даже на английском языке может быть сложно сделать это правильно.
Что такое глобализация?
Globalize — это библиотека JavaScript для интернационализации и локализации, которая использует официальные данные Unicode CLDR JSON.
Библиотека имеет открытый исходный код и разработана Рафаэлем Ксавье де Соуза вместе с некоторыми членами команды jQuery.
Глобализация основана на общем хранилище данных консорциума Unicode (CLDR) , крупнейшем и наиболее обширном стандартном хранилище доступных данных локали. Таким образом, в отличие от библиотек, которые встраивают данные локали, если вы используете Globalize, всегда легко быть в курсе последних данных CLDR.
Библиотека работает как для браузера, так и в качестве модуля Node.js. Globalize 1.0 поддерживает все основные браузеры, включая IE9 +, Chrome, Firefox, Safari 5.1+ и Opera 12.1+.
Основными особенностями библиотеки являются:
- Форматирование и разбор чисел
- Форматирование и разбор даты и времени
- Относительное форматирование времени
- Форматирование валюты
- Форматирование сообщения
- Множественная поддержка
- Подразделение поддержки
Одна из вещей, которые мне больше всего нравятся в Globalize, это то, что в ней есть модуль для каждой из его функций. Разработчику может не понадобиться вся библиотека, и поэтому он может выбрать нужные модули. Еще одна интересная особенность заключается в том, что, в отличие от других библиотек, он хранит код отдельно от содержимого, не размещая и не встраивая какие-либо данные локали в библиотеку.
Но Globalize — не единственное шоу в городе. Если вы заинтересованы в некоторых альтернативах, у Рафаэля есть специальная страница . Наиболее заметной альтернативой является i18next .
Глобализация и API Интернационализации JavaScript
Для некоторых из вас это может удивить, но JavaScript имеет встроенную поддержку интернационализации в форме API интернационализации (также известный как ECMA-402). Объект Intl
window
Этот API в настоящее время предоставляет методы для форматирования чисел и дат, а также для сравнения строк на определенном языке.
Теперь, когда вы знаете о существовании API интернационализации, вы можете подумать, что Globalize использует его за кулисами. Такой подход, несомненно, приведет к повышению производительности форматирования даты и чисел. Однако, поскольку поддержка низкая и очень противоречивая в браузерах , библиотека не использует ее.
Прежде чем мы продолжим и начнем обсуждение Globalize, я хочу познакомить вас с API Интернационализации.
Форматирование даты
Первый пример, который я собираюсь показать, использует API Интернационализации для форматирования даты в нескольких локалях: IT, США и GB.
// 30th of June 2016
var date = new Date(2016, 5, 30);
// "30/6/2016"
console.log(new Intl.DateTimeFormat('it-IT').format(date));
// "6/30/2016"
console.log(new Intl.DateTimeFormat('en-US').format(date));
// "30/06/2016"
console.log(new Intl.DateTimeFormat('en-GB').format(date));
В этом примере я использую конструктор DateTimeFormat
Затем я вызываю метод format для форматирования объекта даты.
Код выше также доступен как JSBin .
Форматирование числа
Как упоминалось ранее, API также позволяет форматировать число. Пример, использующий конструктор format
NumberFormat
Посмотрев на вывод этого второго фрагмента, также доступного как JSBin , вы можете заметить, что в Италии мы форматируем числа по-разному по сравнению с США и Великобританией.
Как я уже упоминал ранее, поддержка этого API низкая, но если вы хотите его использовать, вы можете использовать этот polyfill в своем приложении.
Теперь, когда я дал вам лучшее представление о том, как работают интернационализация и локализация, давайте поговорим о глобализации.
Установка и использование Globalize
Globalize можно легко установить через npm:
var number = 1302.93;
// "1.302,93"
console.log(new Intl.NumberFormat('it-IT').format(number));
// "1,302.93"
console.log(new Intl.NumberFormat('us-US').format(number));
// "1,302.93"
console.log(new Intl.NumberFormat('en-GB').format(number));
Эта команда также устанавливает данные CLDR, необходимые для загрузки данных локали (например, как числа или даты форматируются на определенном языке), которые будет использовать Globalize. С этими двумя установленными пакетами мы готовы использовать библиотеку.
Примечание : следующие примеры предполагают наличие узла. Если вы заинтересованы в использовании Globalize в браузере, я рекомендую начать с одного из примеров на домашней странице проекта . Пример с веб-пакетом позволяет особенно быстро начать работу.
Далее я использую Globalize, чтобы переписать два фрагмента, перечисленных в предыдущем разделе.
Форматирование даты
Первый пример может быть реализован, как показано ниже:
npm install globalize cldr-data --save
Несмотря на свою простоту, приведенный выше код позволяет мне охватить несколько тем. Первое, что показалось мне немного странным, когда я впервые играл в Globalize, это то, что некоторые языковые коды, используемые данными CLDR, используют только две буквы. Для обеспечения согласованности я ожидал, что во всех регионах потребуется полная версия стандарта ISO 3166 (например, «it-IT» и «en-US») вместо короткой версии (например, «it» и «en»). Хотя итальянский язык по умолчанию считается законным (итальянский язык все-таки возник в Италии), для английского это было непонятно. Фактически, «en» представляет американский английский, а не британский английский. Если вы хотите быть уверенным, что не совершите ту же ошибку, что и я, я предлагаю вам взглянуть на эту таблицу .
Другая концепция, которую стоит обрисовать в общих чертах, — метод // Include the Globalize library
var Globalize = require('globalize');
// Include the CLDR data
var cldrData = require('cldr-data');
// Loads the supplemental data
Globalize.load(cldrData.entireSupplemental());
// Loads the data of the specified locales
Globalize.load(cldrData.entireMainFor('it', 'en', 'en-GB'));
// 30th of June 2016
var date = new Date(2016, 5, 30);
// "30/6/2016"
console.log(Globalize('it').formatDate(date));
// "6/30/2016"
console.log(Globalize('en').formatDate(date));
// "30/06/2016"
console.log(Globalize('en-GB').formatDate(date));
Это загружает все файлы, которые содержат дополнительную информацию для страны или ее региональных данных. Например, телефонный код страны (39 для Италии), население, некоторые известные сокращения, как пишется валюта других стран и многое другое.
Последний момент, который я хочу охватить, — это четвертое утверждение, в котором я entireSupplemental
entireMainFor
Это позволяет загружать данные локали для нужных стран (в приведенном выше примере Италия, США и Великобритания).
Форматирование числа
Для форматирования числа Globalize предоставляет метод formatNumber
Подпись метода
formatNumber(value[, options])
где value
options
Некоторые примеры опций, которые вы можете указать:
-
round
Его значение может быть любым из следующих:ceil
floor
round
truncate
-
useGrouping
-
minimumIntegerDigits
Полный список доступных опций можно найти в документации .
Теперь, когда мы узнали больше о методе formatNumber
// Include the Globalize library
var Globalize = require('globalize');
// Include the CLDR data
var cldrData = require('cldr-data');
// Loads the supplemental data
Globalize.load(cldrData.entireSupplemental());
// Loads the data of the specified locales
Globalize.load(cldrData.entireMainFor('it', 'en', 'en-GB'));
var number = 1302.93;
// "1.302,93"
console.log(Globalize('it').formatNumber(number));
// "1,302.93"
console.log(Globalize('en').formatNumber(number));
// "1,302.93"
console.log(Globalize('en-GB').formatNumber(number));
Форматирование валютных значений
Библиотека предоставляет метод currencyFormatter
Этот метод поддерживает множество опций, которые позволяют вам определить, хотите ли вы округлить число, хотите ли вы использовать символ валюты (например, «$») или ее код (например, «USD»), и многое другое.
Пример использования currencyFormatter()
// Include the Globalize library
var Globalize = require('globalize');
// Include the CLDR data
var cldrData = require('cldr-data');
// Loads the supplemental data
Globalize.load(cldrData.entireSupplemental());
// Loads the data of the specified locales
Globalize.load(cldrData.entireMainFor('en'));
var enGlobalize = Globalize('en');
var value = 229.431;
var usdFormatter = enGlobalize.currencyFormatter('USD');
// "$229.43"
console.log(usdFormatter(value));
var eurFormatter = enGlobalize.currencyFormatter('EUR', {
style: 'code',
round: 'ceil'
});
// "229.44 EUR"
console.log(eurFormatter(value));
Разбор чисел
Парсинг чисел также может быть задачей, которую вы должны выполнить, возможно, при работе с пользовательским вводом. Следующие примеры демонстрируют, как это сделать:
// Include the Globalize library
var Globalize = require('globalize');
// Include the CLDR data
var cldrData = require('cldr-data');
// Loads the supplemental data
Globalize.load(cldrData.entireSupplemental());
// Loads the data of the specified locales
Globalize.load(cldrData.entireMainFor('en'));
// Set default locale
var enGlobalize = Globalize('en');
var numberParser = enGlobalize.numberParser();
// "229.431"
console.log(numberParser('229,431.00'));
var percentParser = enGlobalize.numberParser({style: 'percent'});
// "0.5341"
console.log(percentParser('53.41%'));
Форматирование относительных дат
Еще одна очень распространенная функция в современных веб-приложениях — отображать время и даты в относительном выражении. Например, вместо того, чтобы показывать полную дату дня, вы обычно найдете ярлыки, такие как «вчера» и «последняя неделя». Достичь этой задачи с помощью Globalize легко благодаря методу relativeTimeFormatter
Пример использования показан ниже:
// Include the Globalize library
var Globalize = require('globalize');
// Include the CLDR data
var cldrData = require('cldr-data');
// Loads the supplemental data
Globalize.load(cldrData.entireSupplemental());
// Loads the data of the specified locales
Globalize.load(cldrData.entireMainFor('en'));
// Set default locale
var enGlobalize = Globalize('en');
var dayFormatter = enGlobalize.relativeTimeFormatter('day');
// "yesterday"
console.log(dayFormatter(-1));
var yearFormatter = enGlobalize.relativeTimeFormatter('year');
// "next year"
console.log(yearFormatter(1));
Globalize предлагает много других методов, которые я не представил в этой статье. Тем не менее, темы, затронутые здесь, должны были дать вам достаточно информации, чтобы начать работу. Более того, документация библиотеки очень подробная.
Вывод
В этой статье я обсудил, что такое интернационализация и локализация и почему они важны для расширения рынка продукта. Я кратко познакомил вас с API Интернационализации, упомянув некоторые поддерживаемые функции, а затем показал некоторые примеры их использования.
Во второй части статьи я познакомил вас с Globalize, библиотекой JavaScript для интернационализации и локализации, разработанной командой jQuery. Библиотека очень мощная и поставляется со всеми методами, которые могут вам понадобиться для интернационализации вашего проекта, например: методы для анализа чисел, форматирования дат и форматирования валютных значений. Если вы считаете, что библиотека сэкономила ваше время, не стесняйтесь возвращать что-то, внося свой вклад в проект.
Еще раз хочу напомнить, что все фрагменты, демонстрируемые в этой статье, можно найти в нашем репозитории GitHub .