AngularJS: установка языков в angular -трансляте из контроллера или службы
Я заинтересован в использовании angular -транслята.
Из-за большого количества вызовов настройки, которые происходят изначально при запуске, я не могу предоставить язык json во время конфигурации. Также нельзя использовать асинхронный загрузчик.
Мне нужно указать языки от контроллера или службы в более поздней точке.
$translateProvider.translations(.., ...)
- это вызов, но $translateProvider
недоступен в контроллерах или службах, но, похоже, только в config.
$translate
, похоже, не имеет возможности загружать язык JSON.
Есть ли способ обхода?
Ответы
Ответ 1
Получил в конце концов.
в .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
Сначала введите $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>
Это выплюнет что-то вроде
![enter image description here]()
Ответ 3
Возможно, проверьте это:
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);
};
});
Ответ 4
этот работает. 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>
Ответ 5
Я думаю, что лучший способ управлять динамической загрузкой -
в блоке маршрутизатора конфигурации разрешения, например
resolve: {
translatePartialLoader: function loadPartialLoader($translate,$translatePartialLoader) {
$translatePartialLoader.addPart('home');
return $translate.refresh();
}
}