Я видел некоторые плагины i18n для Angular, но я не хочу заново изобретать колесо. i18next - хорошая библиотека, и поэтому я намерен ее использовать.Угловые и i18next
Я создал директиву i18n, которая просто вызывает i18n библиотека:
define(['app', 'jquery', 'i18n'], function(app, $, i18n) {'use strict';
app.directive('i18n', function() {
return function($scope, elm, attrs) {
attrs.$observe('i18n', function(value) {
if ($.fn.i18n) {// for some reason, it isn't loaded quickly enough and first directives process fails
$(elm).i18n();
}
});
};
});
});
На моей странице, я могу изменить язык на лету:
<a ng-repeat="l in languages"> <img ng-src="images/{{l.id}}.png" title="{{l.label}}" ng-click="setLanguage(l.id)" /> </a>
Теперь мой главный контроллер, определенный на HTML тег:
define(['app', 'i18n', 'jquery'], function(app, i18n, $) {'use strict';
return app.controller('BuilderController', ['$scope', '$location',
function BuilderController($scope, $location) {
/* Catch url changes */
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.setLanguage(($location.search()).lang || 'en');
});
/* Language */
$scope.languages = [{
id : "en",
label : "English"
}, {
id : "fr",
label : "Français"
}];
$scope.$watch('language', function() {
$location.search('lang', $scope.language);
i18n.init({
resGetPath : 'i18n/__lng__/__ns__.json',
lng : $scope.language,
getAsync : false,
sendMissing : true,
fallbackLng : 'en',
debug : true
});
$(document).i18n();
});
$scope.setLanguage = function(id) {
$scope.language = id;
};
}]);
});
Как это работает: наблюдатель на языке инициализирует объект i18n с новым языком и d затем обновите все DOM, используя расширение iQn jquery. Вне этого специального события моя директива просто отлично работает для всех других задач (шаблоны с использованием директивы i18n и отображаются позже).
Хотя он работает нормально, я знаю, что я не должен манипулировать DOM внутри контроллера, но поскольку в конце ничего не происходит, я не нашел лучшего решения.
В идеале, я хочу, чтобы угловое преобразование всех DOM, разбор всех директив для обновления меток, но я не могу понять, как это сделать. Я пробовал $ scope. $ Apply(): не работает, потому что уже в дайджесте на данный момент Я использовал плагин Scope.onReady без лучших результатов.
Очевидно, что я очень новичок в Angular, и мне очень сложно понять, как все работает.