Подтвердить что ты не робот

Angularjs и $locale

Можно ли вручную установить $locale для какого-либо приложения?

Возможно ли, что единственный способ поддержки locals - включить файл локализации из библиотеки angular для текущей локали. Что делать, если есть несколько культур? В этом случае мне приходится загружать файлы локализации динамически? Что мне не хватает?

4b9b3361

Ответ 1

Честно говоря, служба $locale в angular довольно примитивна. Это действительно хорошо, но, похоже, в этой области не хватает гибкости. Самая большая проблема заключается в том, что даже если вы переключите свой язык путем динамической перезагрузки соответствующего файла локали, такие вещи, как фильтр даты, не будут знать, что вы его изменили, потому что они регистрируют свою локальную информацию, когда они настроены. Итак, у вас есть несколько вариантов в настоящее время: 1. Перезагрузите страницу с выбранной локалью... или 2. Напишите свой собственный поставщик и фильтры локалей, которые его используют.

Возможно создание службы, которая будет динамически загружать соответствующий файл script, повторно инициализировать все затронутые фильтры и службы, а затем обновлять представления, но я не совсем уверен, что все это будет включать в данный момент.

Ответ 2

Вы можете загрузить нужный язык в localStorage, а затем обновить страницу. Загрузите script ниже загружаемый файл i18n. Изменение языкового стандарта "на лету" еще не поддерживается.

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
<script>
var locale = JSON.parse(localStorage.getItem('locale'));
if (locale) {
    document.write('<script src="scripts/i18n/angular-locale_'+locale+'.js"><\/script>');
}
</script>

Ответ 3

Я построил модуль angular, который заботится о i18n. Поддержка AngularJS для i18n довольно примитивна, если вы хотите иметь больше контроля, а также быть более гибкой, checkout angular -translate - http://angular-translate.github.io/

Дайте мне знать, если я могу помочь!

Ответ 4

Для тех, кто ищет динамическую локализацию сегодня angular-dynamic-locale, отлично справляется.

Ответ 5

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

  • angular -translate (http://angular-translate.github.io) - идеальный способ локализовать ваш контент (настраиваемые строки). Но он НЕ переводит angular дату, валюту или числовые фильтры.
  • Angular имеет встроенный механизм для локализации даты, валюты или числа -фильтров. Переводы поддерживаемых локалей можно найти здесь https://github.com/angular/angular.js/tree/master/src/ngLocale, angular -guide находится по адресу https://docs.angularjs.org/guide/i18n
  • Проблема с встроенным механизмом angular: это не так просто изменить локаль во время выполнения! Здесь https://github.com/lgalfaso/angular-dynamic-locale входит в игру. Это позволяет вам легко менять язык во время выполнения.

Итак, решение состоит в том, чтобы использовать оба проекта, angular -translate и angular -dynamic-locale.

Ответ 7

Включение этого script: https://github.com/lgalfaso/angular-dynamic-locale/blob/master/src/tmhDynamicLocale.js позволяет устанавливать локали во время выполнения.

  • Загрузите все локали, которые вы хотите от https://github.com/angular/angular.js/tree/master/src/ngLocale
  • Храните локали в каталоге на вашем веб-сервере, например. /assets/js/locales/filename-LOCALE.js - примечание: то, что вы пишете как LOCALE в имени файла, важно - любые требуемые локали будут загружаться динамически.
  • В вашем модуле включите tmhDynamicLocale как 'tmh.DynamicLocale', например. var app = angular.module('app',['tmh.DynamicLocale']);
  • В вашей конфигурации передайте провайдеру i.e. 'tmhDynamicLocaleProvider' и укажите местоположение ваших файлов локали, например. tmhLocaleProvider.localeLocationPattern('/assets/js/locales/angular-locale-{{locale}}.js'); {{locale}} будет заменен на локаль, установленную во время выполнения.
  • Чтобы установить локаль через ваше приложение, в app.run(), перейдите в службу 'tmhDynamicLocale', например. app.run(['tmhDynamicLocale',function(tmhDynamicLocale){}]);
  • В своем обратном вызове run, установите локаль, как это, tmhDynamicLocale.set('en-gb');. Альтернативно, поскольку tmhDynamicLocale - это услуга, вы можете установить локаль в разных местах, если разрешены инъекции услуг, например. контроллеры, хотя имейте в виду, что сервисы являются одноточиями, а настройка локали в контроллере устанавливает ее через приложение.

Теперь вы должны иметь правильную локаль. Для получения дополнительной информации используйте README для tmhDynamicLocale: https://github.com/lgalfaso/angular-dynamic-locale/blob/master/README.md

Кредит: Лукас Мирельманн для tmhDynamicLocale.

Ответ 8

Если вы хотите загрузить угловую локализацию своего браузера, установите https://github.com/angular/bower-angular-i18n и https://github.com/lgalfaso/angular-dynamic-locale в вашем проекте.

Прочитайте документацию каждой библиотеки для установки. Это пример моего Ионного проекта:

  • В моем index.html:

    ...
    <!-- angular-dynamic-locale-->
    <script src="lib/angular-dynamic-locale/tmhDynamicLocale.min.js"></script>
    ...
    
  • В моем app.js

    var app = angular.module('project-name', ['ionic',..., 'tmh.dynamicLocale']);
    ...
    // tmhDynamicLocaleProvider
    app.config(function(tmhDynamicLocaleProvider) {
       //  override the default path (angular/i18n/angular-locale_{{locale}}.js) to the stored Angular i18n locale files
       tmhDynamicLocaleProvider.localeLocationPattern('lib/angular-i18n/angular-locale_{{locale}}.js');
    })
    ...
    app.run(function($rootScope, $ionicPlatform, ..., tmhDynamicLocale){
       // set locale for angular formats   
       var inArray = function(needle, haystack) {
          var key = '';
          for (key in haystack) {
             if (haystack[key] === needle) {
                return true;
             }
          }
          return false;
       };
       var preferredLanguage = navigator.language || navigator.browserLanguage || navigator.systemLanguage || navigator.userLanguage;
       if (typeof preferredLanguage === 'string') {
          var code = preferredLanguage.substring(2, 0);
             if (inArray(code, PROPERTIES.LANGUAGES)) {
                tmhDynamicLocale.set(code);
             }
       }
       ...
    

Ответ 9

Angular обеспечивают большую поддержку i18n/l10n. Вы можете найти руководство здесь

Требования к нашему приложению определяют, как мы можем реализовать эту поддержку.

  • Если нашему приложению требуется только один языковой стандарт или конечные пользователи нашего приложения принадлежат только определенному языку, мы можем ограничить область применения для i18n/l10n только этой локалью

Вы можете найти хорошее объяснение того, как мы можем достичь таких вещей в одном из моих предыдущих ответов здесь.

  1. Если мы хотим обслуживать определенный компонент, директиву или часть для отображения в каком-либо другом формате или локали, тогда мы можем использовать некоторые компоненты директив или даже фильтр для этого

Вы можете найти пример скрипта для такой реализации, используя фильтр, который можно найти здесь

 function MyController($scope) {
   $scope.property = {
     price: 50000000.557
   }
 }

 function toLocaleCurrencyFilter($filter) {
  return function(amount, currencySymbol, fractionSize, locale) {
    var returnValue = Number(parseFloat(amount)).toLocaleString(locale, {
      minimumFractionDigits: parseInt(fractionSize),
      maximumFractionDigits: parseInt(fractionSize),
    });
    returnValue = returnValue + " " + currencySymbol
    return returnValue;
  };
 }
 angular.module('myApp', [])
   .controller('MyController', ['$scope', MyController])
   .filter('toLocaleCurrency', ['$filter', toLocaleCurrencyFilter]);
  1. Если нам нужна динамическая локаль, вам необходимо перезагрузить браузер с новыми настройками локали, сохранив его в локальном хранилище. вы можете использовать решение, описанное в 1, с некоторой динамической природой.