AngularJS:在Controller或Service中进行角度转换设置语言

问题描述 投票:10回答:5

我对使用angular-translate感兴趣。

由于启动时会发生许多设置调用,因此我无法在配置期间提供语言json。也无法使用异步加载程序。我需要稍后能够从控制器或服务中指定语言。

$translateProvider.translations(.., ...)是要使用的调用,但$translateProvider在控制器或服务中不可用,而似乎仅在配置中可用。

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

有任何解决方法吗?

angularjs angular-translate
5个回答
20
投票

首先将$translate注入您的控制器。

app.controller('MainCtrl', function($scope, $state, $translate) {});

然后您可以通过$translate.use()获取并设置当前语言。

var lang = $translate.use(); // holds current lang
$translate.use(lang);  // sets lang to use

如果您需要在配置后添加新的翻译,则可以使用部分加载程序。

// 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", ... }

如果这不够动态,那么您始终可以即时进行翻译。

// 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>

这会吐出类似的东西

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9JVWtrYi5wbmcifQ==” alt =“在此处输入图像描述”>


4
投票

最后到达那里。

在.config中

$translateProvider.useLoader('customLoader');

customLoader ...

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;
    };

});

然后是一个TranslationService来共享数据

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

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

        getLanguages: function () {
            return languages;
        }
    }
});

2
投票

也许检查一下:

http://www.ng-newsletter.com/posts/angular-translate.html

在“在运行时切换语言”下

$translate.use(); // Returns the currently used language key
$translate.use('en'); // Sets the active language to `en`

app.controller('TranslateController', function($translate, $scope) {
  $scope.changeLanguage = function (langKey) {
    $translate.use(langKey);
  };
});

1
投票

此作品。 storageService具有本地存储,并且在本地存储中设置了“ NG_TRANSLATE_LANG_KEY”之后。您可以像下面这样称呼它。

angular.module('myApp').run(['$rootScope', 'StorageService', function($rootScope, StorageService) {
    $rootScope.currentLanguage = StorageService.local.get('NG_TRANSLATE_LANG_KEY') || 'en'; 
}]);


<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1" ng-controller="TranslateController" ng-init="changeLanguage(currentLanguage)">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="javascript:;" ng-click="changeLanguage('tr')">TR</a></li>
    <li role="presentation" class="divider"></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="javascript:;" ng-click="changeLanguage('en')">EN</a></li>
</ul>

0
投票

我认为管理动态加载的最佳方法是在解析配置路由器块中,如

resolve: {
    translatePartialLoader:  function loadPartialLoader($translate,$translatePartialLoader) {
        $translatePartialLoader.addPart('home');
        return $translate.refresh();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.