Как добавить переводы в $translateProvider вне конфига?
Я новичок в угловой JS. Для языкового перевода я использую службу angular-translate в своей работе. Я получаю все переводы, которые мне нужно назначить в $translateProvider с помощью ответа на вызов API. Я знаю, что могу назначить переводы для $translateprovider ($translateprovider.translations ('en', переводы) только из модуля конфигурации, но я думаю, что вызов API из модуля конфигурации не является хорошей практикой.
Ниже приведен мой конфигурационный модуль.
.config(['$translateProvider', function($translateProvider) {
//fetching session key
var response;
jQuery.ajax({
type: "GET",
url: 'https://abcdefg/session?appKey=123456',
async: false,
success: function(data) {
response = data;
getMetaData(response.sessionKey);
}
});
////fetching data.
function getMetaData(sessionKey) {
jQuery.ajax({
type: "GET",
url: 'https://abcdefg/metadata?sessionKey=' + sessionKey +
'&gid=1.2.3.4',
async: false,
success: function(data) {
dataSet = data; //save response in rootscope variable
}
});
}
$translateProvider.translations('en_US', JSON.parse(dataSet.en_us));
$translateProvider.translations('es_ES', JSON.parse(dataSet.es_es));
$translateProvider.preferredLanguage('en_US');
}
Как это можно решить? Как я могу назначить переводы для $translateProvider из внешнего модуля конфигурации?
Заранее спасибо.
2 ответа
Посмотрите на этот ответ от создателя angular-translate, где он утверждает, что "[...] нет способа расширить существующие переводы во время выполнения с помощью службы $translate без использования асинхронной загрузки.[...]"
Для получения дополнительной информации об асинхронной загрузке переводов смотрите документацию. Вы даже можете указать свой собственный загрузчик, чтобы получать переводы, вызывая свой API.
Во многих случаях нам может понадобиться добавить больше переводов в Службы, поэтому я нашел способ сделать это. Мы можем создать другой CustomProvider, который возвращает $ translateProvider, а затем мы можем внедрить CustomProvider в службы или контроллеры.
// NOTE: Create another Provider returns $translateProvider
.provider('CustomProvider', function($translateProvider) {
this.$get = function() {
return $translateProvider;
};
});
// NOTE: Inject CustomProvider to Service to use
.factory('TranslationService', function(CustomProvider) {
console.log(CustomProvider);
return {
addMoreTranslations: addMoreTranslations
};
function addMoreTranslations(key, translations) {
// Do somethings
CustomProvider.translations(key, translations);
}
});
Мне это удалось.