我使用的是优秀的角转换( $translate
)指令/服务来处理多个区域设置语言,因为我有多个区域设置文件我使用便捷$translateProvider.useStaticFilesLoader
通过localeAbbr.json的结构来加载我的翻译文件,例如en.json
, es.json
,等...我建了一个Plunker显示我的开源项目,该项目通过Git使用的语言环境原始文件(指向实际Github的资料库,这意味着不是本地的plunker演示)。 作为指导和服务,我做了一个小Plunker显示我的计时问题与JSON文件加载我的项目建成。
所有这一切说,它似乎$translateProvider.useStaticFilesLoader
工作asynchronous
,而我真的需要它是synchronous
,因为由plunker运行时,JSON文件尚未解析,而我已经叫了一次$translate.instant()
在我的消息。
我有一个Plunker显示的问题。
这里是我的快速服务演示的一部分:
app.factory('validationService', ['$filter', '$translate', function ($filter, $translate) {
var service = this;
var validationSummary = [];
var errorMessages = [
'INVALID_ALPHA',
'INVALID_ALPHA_SPACE',
'INVALID_ALPHA_NUM',
'INVALID_BOOLEAN'
];
//var $translate = $filter('translate');
for(var i=0, ln=errorMessages.length; i < ln; i++) {
validationSummary.push({
field: i,
message: $translate.instant(errorMessages[i])
});
}
// attach public functions
service.getValidationSummary = getValidationSummary;
return service;
// function declaration
function getValidationSummary() {
return validationSummary;
}
}]);
在$ translateProvider配置
app.config(['$translateProvider', function ($translateProvider) {
$translateProvider.useStaticFilesLoader({
prefix: 'https://rawgit.com/ghiscoding/angular-validation/master/locales/validation/',
suffix: '.json'
});
// load English ('en') table on startup
$translateProvider.preferredLanguage('en').fallbackLanguage('en');
}]);
通过控制器打电话给我的服务:
app.controller("TestController", function($scope, validationService) {
var vm = this;
vm.displayValidationSummary = true;
vm.validationSummary = validationService.getValidationSummary();
});
最后使用HTML控制器:
<div class="alert alert-danger alert-dismissable" ng-show="vm.displayValidationSummary">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="displayValidationSummary = false">×</button>
<h4><strong>{{ 'ERRORS' | translate }}!</strong></h4>
<ul>
<li ng-repeat="item in vm.validationSummary">{{item.field }}: {{item.message}}</li>
</ul>
</div>
由于我使用AngularJS 1.3+,我还发现, $translate
只被翻译一次,所以笔者建议使用translateFilter.$stateful = true;
我尝试过,但似乎并没有帮助。
在这里再次是Plunker
我已经花费数周在试图寻找和代码的所有种类的解决方案,但我从来没有得到它的工作,我真的很伤心看到我的原始翻译代码:(
请帮忙!!!
编辑
我意识到,我的问题是不涉及与我的问题一切。 在翻译的延迟问题的顶部,我也必须通过额外的参数,那就是将它们传递给翻译匿名函数一个巨大的问题。 受许结束的时候,我的论点的状态已经改变。 例如:
$translate(validator.message).then(function(translation) {
// only log the invalid message in the $validationSummary
addToValidationSummary(formElmObj, translation);
// error Display
if(!isValid) {
updateErrorMsg(translation, isValid);
}else if(!!formElmObj && formElmObj.isValid) {
addToValidationSummary(formElmObj, '');
}
}, function(data) {
throw 'Failed to translate' + data;
});