角度翻译 - 获取翻译表

时间:2015-03-24 18:36:21

标签: javascript angularjs cookies struts angular-translate

我正在尝试将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中。我已经挖掘了模块的源代码,我发现的唯一的东西只是一个本地函数,并没有公开供我使用。

对我解决这个问题的方法提出任何意见和建议也是受欢迎的。

1 个答案:

答案 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;
    };
});