我在一个相当大的Angular项目上使用angular-translate。我正在将项目分成多个模块以使其更易于管理,但我无法分解每个模块的翻译字符串。
例如,我有模块A和B,其中B是A的子模块。有一些字符串与模块A所涵盖的HTML有关,它们放在'/json/localization/A/en.json'中。同样,我在'/json/localization/B/en.json'中有与B相关的字符串。首先,我使用angular-translate的$ translationProvider在模块B中加载B的en.json。然后我加载模块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'
])
答案 0 :(得分: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;
};
});