Как лучше всего организовать строки перевода в angular-translate?

Я использую angular-translate на довольно большом угловом проекте. Я разбиваю проект на несколько модулей, чтобы сделать его более управляемым, но я не могу разбить строки перевода на модуль.

например, у меня есть модули A и B, где B-подмодуль A. есть строки, относящиеся к HTML, покрытому модулем A, которые помещаются в '/json/localization/A/en.формат JSON'. Аналогично, есть строки, относящиеся к B, которые я помещаю в '/JSON / локализация / B / en.формат JSON'. Сначала я загружаю Б Ан.json в модуле B с использованием углового-translationprovider $translation. Затем я загружаю модуль a en.json, также используя $translationProvider. Проблема в том, что загрузка строк A переопределяет строки B, и они теряются.

используя angular-translate, есть ли способ загрузить строки на модуль без переопределения или родительский модуль должен загрузить все строки из одного en.в JSON?

вот пример (в coffeescript) о том, как я загружаю строки перевода:

my_module.config(['$translateProvider', ($translateProvider) ->
  $translateProvider.useStaticFilesLoader
    prefix: '/json/localization/A/'
    suffix: '.json'

  $translateProvider.preferredLanguage 'en'
])

1 ответов


angular-translate поддерживает асинхронную загрузку частичных языковых файлов. Все партиалы объединяются в один словарь на каждый язык. Официальную документацию можно найти здесь: http://angular-translate.github.io/docs/#/guide/12_asynchronous-loading

он поддерживает применение шаблона для шаблонов url, которые указывают на модульные языковые файлы:

$translateProvider.useLoader('$translatePartialLoader', {  
  urlTemplate: '/i18n/{part}/{lang}.json'
});

из ваших контроллеров вы можете добавлять языковые модули и обновлять привязки данных вот так:

angular.module('contact')
  .controller('ContactCtrl',
    function ($scope, $translatePartialLoader, $translate) {  
      $translatePartialLoader.addPart('contact');
      $translate.refresh();
    });

конечно, загрузка частичных также может быть покрыта в фазе разрешения маршрута

кроме того, вы также можете посмотреть на создание собственной функции пользовательского загрузчика. http://angular-translate.github.io/docs/#/guide/13_custom-loaders

Это обеспечивает всю гибкость вам нужно совместить необходимые модули языка в одном съемке. Е. Г. вы могли бы сделать что-то вроде этого:

app.factory('customLoader', function ($http, $q) {
  // return loaderFn
  return function (options) {
    var deferred = $q.defer(); 
    var data = {
      'TEXT': 'Fooooo'
    };
    $http.get('nls/moduleA/en.json').success(function(moduleA){
      angular.extend(data, moduleA);
      $http.get('nls/moduleB/en.json').success(function(moduleB){
        angular.extend(data, moduleB);
        deferred.resolve(data);
      });
    });
    return deferred.promise;  
  };
});