Je suis intéressé à utiliser angular-translate.
En raison de nombreux appels d'installation qui se produisent initialement au démarrage, je ne peux pas fournir le langage json lors de la configuration. Il n'est pas non plus possible d'utiliser le chargeur asynchrone . Je dois pouvoir spécifier les langues à partir d'un contrôleur ou d'un service ultérieurement.
$translateProvider.translations(.., ...)
est l'appel à utiliser, mais $translateProvider
n'est pas disponible dans les contrôleurs ou les services, mais apparemment uniquement à la config.
$translate
ne semble pas avoir la capacité de charger un langage JSON.
Y a-t-il une solution de contournement?
Je suis arrivé à la fin.
dans le .config
$translateProvider.useLoader('customLoader');
le 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;
};
});
puis un service de traduction pour partager les données
angular.module('myapp').factory('TranslationService', function () {
var languages = [];
return {
setLanguages: function (data) {
languages = data;
},
getLanguages: function (data) {
return languages;
}
}
});
Commencez par injecter $translate
dans votre contrôleur.
app.controller('MainCtrl', function($scope, $state, $translate) {});
Ensuite, vous pouvez obtenir et définir la langue actuelle avec $translate.use()
.
var lang = $translate.use(); // holds current lang
$translate.use(lang); // sets lang to use
Si vous devez ajouter de nouvelles traductions après la configuration, vous pouvez utiliser des chargeurs partiels.
// 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", ... }
Si cela n’est pas assez dynamique, vous pouvez toujours faire la traduction à la volée.
// 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>
Cela cracherait quelque chose comme
celui-ci fonctionne. storageService a un stockage local et après avoir défini 'NG_TRANSLATE_LANG_KEY' dans le stockage local. Vous pouvez l'appeler comme ci-dessous.
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>
Peut-être vérifier ceci:
http://www.ng-newsletter.com/posts/angular-translate.html
Sous "Changer de langue à l'exécution"
$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);
};
});
Je pense que la meilleure façon de gérer le chargement dynamique est Dans le bloc de résolution de routeur de résolution comme
resolve: {
translatePartialLoader: function loadPartialLoader($translate,$translatePartialLoader) {
$translatePartialLoader.addPart('home');
return $translate.refresh();
}
}