2016-01-08 95 views
3

我有一个在登录事件后调用的翻译服务,在这个服务中我想初始化$ translateProvider.translation,但是这个对象在app.config(...)之外似乎不是accessibile 。在服务中,我想替换以前的翻译。 这里是一些代码:如何在某些事件后加载角度翻译

.config(['$translateProvider', function ($translateProvider) {   
    $translateProvider.useStaticFilesLoader({ 
      prefix: 'i18n/', 
      suffix: '.json' 
    }); 
    $translateProvider.preferredLanguage('it'); 
}]); 

虽然我TranslateService我需要这样的东西

angular.module('myapp') 
    .factory('TranslateService', ['$translate', $translateProvider, function($translate, $translateProvider) { 
     $mydata = { "LABEL": "Label" }; 
     $translateProvider.translations('it', mydata); // injection problem 
     $translate.somethingLike_getProvider().translations('it', mydata); // doesn't exist 
}]); 

回答

0

诀窍是存储$translateProvider在变量以后可以访问:

var app = angular.module('app', ['pascalprecht.translate']); 
 
var provider = null; 
 

 
app.config(function($translateProvider) { 
 
    provider = $translateProvider; 
 
    $translateProvider.translations('en', { 
 
    TITLE: 'Hello', 
 
    FOO: 'This is a paragraph.' 
 
    }); 
 
    $translateProvider.preferredLanguage('en'); 
 
}); 
 

 
app.factory('inlineLoaderFactory', function($q) { 
 
    return function(options) { 
 
    var deferred = $q.defer(); 
 
    deferred.resolve(options[options.key]); 
 
    return deferred.promise; 
 
    }; 
 
}); 
 

 
app.controller('MainCtrl', function($scope, $q, $translate) { 
 
    $scope.override = function() { 
 
    provider.useLoader('inlineLoaderFactory', { 
 
     en: { 
 
     TITLE: 'Hello My Friend', 
 
     FOO: 'TLDR', 
 
     CUSTOM: 'New Key' 
 
     } 
 
    }); 
 
    $translate.refresh(); 
 
    }; 
 
});

当需要更改翻译时,我们告诉$translateProvider使用inlineLoaderFactorytranslation loader serviceinlineLoaderFactory仅将选项用作新的翻译数据。