В одном приложении, с которым я работаю, система маршрутизации должна быть интегрирована с i18n, как в примере ниже:
$routeProvider.when('/:i18n/section', ...);
Но я столкнулся с некоторыми проблемами из-за, как мне кажется, цикла $digest
, который не меняет параметр i18n
во время выполнения.
Другая проблема, с которой я сталкиваюсь, заключается в том, что путь к местоположению указывает на что-то вроде:
http://localhost:9000/section/...
не как:
http://localhost:9000/en/section/...
параметр пути i18n
завершается ассоциацией с /section/
, что означает, что в сервисе $routeParams
$routeParams.i18n = 'section';
. Это ожидается, но мне нужно иметь возможность проанализировать параметр /:i18n/
, чтобы избежать конфликтов, и изменить URL-адрес, объединив одну локаль, чтобы контекстуализировать сеанс, заменив текущий маршрут новым, i18n-ized, без обновления представление/приложение автоматически, но выборочно, потому что нужно изменить только некоторые функции, а не все.
Кроме того, я разработал один сервис, который на основе списка возможных языковых настроек и их веса оценивает язык, который будет выбран в текущем контексте:
var criteria = {
default: {
tag: 'en',
weight: 10
},
user: {
tag: 'pt',
weight: 20
},
cookie: {
tag: 'zh',
weight: 30
},
url: {
tag: 'ru',
weight: 40
},
runtime: {
tag: 'es',
weight: 50
}
};
function chooseLanguage (languages) {
var deferred = $q.defer();
var weights = [];
var competitors = {};
var choosen = null;
if (defineType(languages) === 'array') {
for (var i = languages.length - 1; i >= 0; i--) {
if (languages[i].tag !== null) {
weights.push(languages[i].weight);
competitors[languages[i].weight] = languages[i];
}
}
choosen = competitors[Math.max.apply(Math, weights)];
} else if (defineType(languages) === 'object') {
choosen = languages;
} else {
return;
}
setRuntimeLanguage(choosen.tag);
deferred.resolve(choosen);
return deferred.promise;
}
Объясняя приведенный выше код, когда angular загружает приложение, выполняется фрагмент кода, выбирая, какой язык определен и достаточно ли он силен для выбора. С этой операцией связаны и другие методы, такие как определение параметра URL, если есть один зарегистрированный пользователь и т. д., и процесс выполняется не только при начальной загрузке, но и в нескольких контекстах: событие $routeChangeStart
, когда пользователь аутентифицирует свою сессию, переключение языков в поле выбора и так далее.
Итак, в резюме мне нужно уметь:
- Проанализируйте URL-адрес и правильно примените параметр локали, если он не был сообщен изначально;
- Измените параметр URL
i18n
во время выполнения, не перезагружая все представление/приложение; - Работайте с языковыми изменениями правильно, что означает, что если мой подход, основанный на весах, не лучший способ, если вы предложите мне что-то еще.
Редактировать 1:
$watcher
не работает, потому что приложению нужна правильная локаль в каждом пути, даже до того, как оно создаст экземпляры всех элементов. AngularJS
используется на каждом этапе этой проверки, но если есть какая-то подсказка, чтобы сделать это снаружи, до создания экземпляра Angular, мы можем обсудить это.
На данный момент я использую принятый ответ ниже с решением, которое я разработал, но его необходимо улучшить.
$location.path()
, приложение не перезагрузится? - person Mateus Leon   schedule 04.03.2015