24

我在一个相当大的 Angular 项目中使用 angular-translate。我将项目分解为多个模块以使其更易于管理,但我无法分解每个模块的翻译字符串。

例如,我有模块 A 和 B,其中 B 是 A 的子模块。有一些与模块 A 所涵盖的 HTML 相关的字符串,它们位于“/json/localization/A/en.json”中。同样,我将一些与 B 相关的字符串放在“/json/localization/B/en.json”中。首先,我使用 angular-translate 的 $translationProvider 在模块 B 中加载 B 的 en.json。然后我加载模块 A 的 en.json,同样使用 $translationProvider。问题是加载 A 的字符串会覆盖 B 的字符串并且它们会丢失。

使用角度翻译,有没有办法在不覆盖的情况下为每个模块加载字符串,或者父模块是否必须从单个 en.json 加载所有字符串?

这是我如何加载翻译字符串的示例(在咖啡脚本中):

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

  $translateProvider.preferredLanguage 'en'
])
4

1 回答 1

33

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;  
  };
});
于 2014-08-17T02:41:29.703 回答