[Из песочницы] Локализация с AngularJS

imageДобрый день, уважаемые Хабражители.AngularJS — отличный Framework для создания ваших сайтов. На Хабре уже достаточно много про него написано, но почему то ни разу не затрагивалась тема локализации приложений. Тем не менее, поддержка локализации в нем есть и сегодня мы попробуем с ней разобраться.

Существует несколько способов локализации и мы рассмотрим несколько из них.

Способ 1. Как в документацииВ документе i18n and l10n указано, что Angularjs поддерживает отображение дат, чисел и валют в том виде, в котором их привыкли видеть пользователи соответствующих стран. Это означает, что при создании интернет магазина мы можем один раз написать {{amount | currency}}, подключить необходимую локаль и не думать о том, как будет выглядеть сумма покупки для России и США. AngularSJ сам сделает это за вас: 1 234,56 руб — в России$1,234.56 — в США

Аналогичная ситуация и с датами. Можно написать {{currentDate | date}} и мы увидим:

23 сент. 2014 г. — в РоссииSep 23, 2014 — США

Если же необходимо использовать обе валюты на одной странице, то можно временно переопределить обозначение, указав явно единицу измерения {{amount | currency: «USD$»}}.

Пример работы с валютами и датами
Стандартное обозначение валюты: {{amount | currency}}
Определяем своё обозначение валюты (USD$): {{amount | currency: «USD$»}}
Текущая дата: {{currentDate | date}} Пример на Plunker. Для некоторых преобразований текста, разработчики рекомендуют использовать ngPluralize, но для простой локализации приложения это нам не сильно поможет.Способ 2. Велосипед Предположим, что у нас есть два файла с переводами, хранящиеся в формате json.translation_ru.json { «COLOR» : «Цвет», «HELLO» : «Привет», «HELLO_HABR» : «Привет Хабрахабр!» } translation_en.json { «COLOR» : «Color», «HELLO» : «Hello», «HELLO_HABR» : «Hello Habrahabr!» } И мы хотим, что бы на странице отображались эти сообщения в зависимости от того, какой язык выберет пользователь. Для этого, создадим приложение myApp.angularApp.js var app = angular.module ('myApp', ['ngResource']); И сервис translationService, который будет загружать нам эти файлы.

angularTranslationService.js app.service ('translationService', function ($resource) {

this.getTranslation = function ($scope, language) { var languageFilePath = 'translation_' + language + '.json'; console.log (languageFilePath); $resource (languageFilePath).get (function (data) { $scope.translation = data; }); }; }); Так же, создадим контроллер myController, к которому подключим данный сервис: angularController.js app.controller ('myController',['$scope', 'translationService', function ($scope, translationService){

//Выполняем перевод, если произошло событие смены языка $scope.translate = function (){ translationService.getTranslation ($scope, $scope.selectedLanguage); }; // Инициализация $scope.selectedLanguage = 'en'; $scope.translate (); }]); И само тестовое предоставление index.html, в котором подключаем все скрипты.Для того, чтобы вывести текст перевода, необходимо описать его следующим образом: {{translation.HELLO_HABR}}

Прошу обратить внимание, что помимо angular.js мы подключаем еще и angular-resource.js для работы с ресурсами.

index.html

Select language for translation:

Выбранный язык: {{selectedLanguage}}

Перевод слов:

{{translation.HELLO_HABR}}

Получаем результат:

55feeb5a096e447b92303705472535a1.pngb55d8a76aa23436d8d2440b44f559753.png

Рабочий пример вы можете посмотреть здесь.

Способ 3. Правильный Что же предлагает нам мировая общественность для решения вопроса локализации? Я нашел только два крупных проекта с хорошей документацией. Это Angular-Translate и Angular-Gettext.Пример использования Angular-Translate var app = angular.module ('at', ['pascalprecht.translate']);

app.config (function ($translateProvider) { $translateProvider.translations ('en', { TITLE: 'Hello', FOO: 'This is a paragraph.', BUTTON_LANG_EN: 'english', BUTTON_LANG_DE: 'german' }); $translateProvider.translations ('de', { TITLE: 'Hallo', FOO: 'Dies ist ein Paragraph.', BUTTON_LANG_EN: 'englisch', BUTTON_LANG_DE: 'deutsch' }); $translateProvider.preferredLanguage ('en'); });

app.controller ('Ctrl', function ($scope, $translate) { $scope.changeLanguage = function (key) { $translate.use (key); }; }); Пример использования Angular-Gettext angular.module («myApp»).controller («MyCtrl», function ($scope, gettextCatalog) { // Do things with gettextCatalog }); Лично мне симпатизирует Angular-Gettext. Перевод в нем осуществляется в несколько шагов: Создаем сайт полностью на одном языке; Приписываем в html слово translate возле тех строк, которые необходимо перевести; Используем angular-gettext tools для генерации шаблона «po»; Переводим на все необходимые нам языки используя Poedit. Хотя лучше — отдать переводить профессионалам; Подключаем gettext и шаблоны; Используем. С Angular-Translate придется писать все переводы в файлах.

Заключение Сегодня мы изобрели велосипед в учебных целях. Но использовать такой код в реальных проектах нельзя. Использование проработанных библиотек — это хорошо. Какую из них выбрать — решать вам. Каждая заслуживает отдельной статьи и имеет свои особенности. В следующих постах, опишу каждую из них подробнее.Спасибо за внимание и удачных вам разработок и локализаций!

Ссылки Файлы поддержки локалей для версии 1.3.0-rc2 Вы можете найти здесь;1-й пример на Plunker;2-й пример на Plunker; Angular-Gettext; Angular-Translate.

© Habrahabr.ru