2016-01-08 4 views
3

У меня есть служба TranslationService, вызываемая после события входа в систему, в этой службе я хочу инициализировать $ translateProvider.translation, но этот объект кажется не доступным за пределами app.config (...) , В службе я хочу заменить предыдущий перевод. Вот некоторые код:Как загрузить угловой перевод после некоторого события

.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 service. inlineLoaderFactory просто использует параметры в качестве новых данных перевода.

Смежные вопросы