AngularJS:在Controller或Service的angular-translate中设置语言

Joe*_*son 10 angularjs angular-translate

我对使用angular-translate很感兴趣.

由于最初在启动时发生了很多设置调用,我无法在配置期间提供语言json.也不可能使用异步加载器.我需要能够在以后指定控制器或服务中的语言.

$translateProvider.translations(.., ...)是使用呼叫,但$translateProvider在控制器或服务中不可用,但似乎只在配置.

$translate 似乎没有能力加载语言JSON.

有没有解决方法?

Mik*_*ala 20

首先注入$translate你的控制器.

app.controller('MainCtrl', function($scope, $state, $translate) {});
Run Code Online (Sandbox Code Playgroud)

然后你可以获得并设置当前语言$translate.use().

var lang = $translate.use(); // holds current lang
$translate.use(lang);  // sets lang to use
Run Code Online (Sandbox Code Playgroud)

 

如果您需要在配置后添加新的翻译,那么您可以使用部分加载器.

// config example
app.config(function($translateProvider, $translatePartialLoaderProvider){
  // "known" translations here, in {lang}.main.json, if any
  $translatePartialLoaderProvider.addPart('main'); 
  $translateProvider.useLoader('$translatePartialLoader', {
    urlTemplate: '/path/to/files/{lang}.{part}.json'
  });
});

// controller
app.controller('MainCtrl', function($scope, $translate, $translatePartialLoader){
  $translatePartialLoader.addPart('translation');
  $translate.refresh();
  $translate.use('en');
});

// en.translation.json
{ "KEY" : "Value", ... }
Run Code Online (Sandbox Code Playgroud)

 

如果这不够动态,那么您可以随时进行翻译.

// config
app.config(function($translateProvider, $translatePartialLoaderProvider){
    $translateProvider.preferredLanguage('en');
    $translateProvider.translations('en',{
      'TITLE': '{{ title }}',
      'SUBTITLE': '{{ subtitle }}',
      'STATIC': 'This is static'
    });
});

// controller
app.controller('MainCtrl', function($scope, $translate){
  $scope.dynamic = {
    'title': 'This is my header',
    'subtitle': 'My subtitle'
  };
});

// template
<pre>{{ 'TITLE' | translate:dynamic }}</pre>
<pre>{{ 'SUBTITLE' | translate:dynamic }}</pre>
<pre>{{ 'STATIC' | translate }}</pre>
Run Code Online (Sandbox Code Playgroud)

这会吐出类似的东西

在此输入图像描述


Joe*_*son 4

最终到达那里。

在.config中

$translateProvider.useLoader('customLoader');
Run Code Online (Sandbox Code Playgroud)

自定义加载器...

angular.module('myapp').factory('customLoader', function ($q, TranslationService) {

    return function (options) {
        var deferred = $q.defer();

          deferred.resolve(TranslationService.getLanguages().filter(function(lang){
                return lang.key == options.key
          })[0].values);

        return deferred.promise;
    };

});
Run Code Online (Sandbox Code Playgroud)

然后是 TranslationService 来共享数据

angular.module('myapp').factory('TranslationService', function () {
    var languages = [];

    return {
        setLanguages: function (data) {
            languages = data;
        },

        getLanguages: function () {
            return languages;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)