我正在尝试将angular-translate模块集成到我的应用程序中。
我已经让异步加载程序正常工作,并正确加载我的语言翻译。
然而,我遇到的问题是我们的后端是基于Struts 1.我们有一个模板,包含在每个页面加载中,而不是像单页面应用程序中那样被换出的正文内容。这个模板是我们用angular.module
和所有依赖项实例化角度应用程序的地方。实例化后,我设置了翻译提供程序:
myApp.config(['$translateProvider', function($translateProvider){
$translateProvider.useUrlLoader('url/to/my/load/action.do');
$translateProvider.determinePreferredLanguage();
}]);
由于此模板包含在每个页面加载中,因此角度应用程序因此在每次加载页面后再次实例化,翻译提供程序将在每次加载页面时执行操作以获取翻译。
这对后端来说不会是一个巨大的负担,因为我已经实现了缓存,但 问题是每个页面上都有未翻译的内容。
我建议的解决方案如下:
有一个控制器可以捕获由angular translate触发的$translateLoadingEnd
事件,并将转换表放入一个有一些到期时间的cookie中
myApp.controller('TranslationController', function($scope, $rootScope){
$rootScope.$on('$translateLoadingEnd',function(event) {
// Get the translation table and put it in a cookie
});
});
在配置中,如果Cookie不存在或已过期,我只会设置$translateProvider.useUrlLoader('url/to/my/load/action.do');
。要做到这一点,我必须通过将cookie服务注入到配置中来获取cookie,如下所示(how to use cookiesProvider in angular config)并抓住转换表:
var $cookies;
angular.injector(['ngCookies']).invoke(function(_$cookies_) {
$cookies = _$cookies_;
});
我的问题是否有办法获取给定语言的翻译表,以便我可以将其放入cookie中。我已经挖掘了模块的源代码,我发现的唯一的东西只是一个本地函数,并没有公开供我使用。
对我解决这个问题的方法提出任何意见和建议也是受欢迎的。
答案 0 :(得分:1)
我决定以更优雅的方式解决这个问题。我没有使用useUrlLoader
函数,而是使用了自定义加载器。
$translateProvider.useLoader("translationFactory");
myApp.factory("translationFactory", function($q, $resource, localStorageService) {
var GetTranslationsResource = $resource(baseHref + 'url/to/my/load/actiongetTranslations.do', {}, {});
return function(options) {
var deferred = $q.defer();
var currentTime = new Date().getTime();
var twelveHours = 12 * 60 * 60 * 1000;
var translationStorage = localStorageService.get("translationStorage");
if(translationStorage && translationStorage.expiration + twelveHours > currentTime && translationStorage.translations[options.key]) { // Have local storage, it hasn't been 12 hours yet, and we have translations for this language
setTimeout(function() { // Need a timeout so that the promise returns first
return deferred.resolve(translationStorage.translations[options.key]);
}, 500);
} else {
GetTranslationsResource.get({"lang" : options.key}, function(result) {
switch(result.status){
case 'success':
var newTranslationStorage = {
expiration : currentTime,
translations : {}
};
newTranslationStorage.translations[options.key] = result.data;
localStorageService.set("translationStorage", newTranslationStorage);
return deferred.resolve(result.data);
break;
case 'error': deferred.reject(options.key); break;
case 'logout': hideLoader(); ajaxLogout(); break;
}
}, function(){
return deferred.reject(options.key);
});
}
return deferred.promise;
};
});