Требование, насколько я понимаю, сводится к следующему:
Если конечный пользователь выбрал язык, выбор должен всегда быть прозрачным в URL, чтобы обеспечить надлежащее функционирование перевода.модуль.Выполнение этого требования не должно приводить к ненужной перезагрузке страницы.Однако в рамках этого вопроса игнорируется тот факт, что при холодном запуске, где clang=xx
не существует, потребуется ручное перенаправление для загрузки правильного содержимого, поскольку предыдущий выбор пользователя известен только клиенту.
Вы почти там, основываясь на фрагменте, который вы разместили.Функция changeLanguage
правильно загружает контент на выбранном языке.Однако, если бы я проводил проверку кода, я бы попросил внести несколько изменений в следующий результат:
Пропатченный HTML
<a href="#!" id="{{icon}}" onclick="return loadContentInSelectedLanguage(this.id)"></a>
Пропатченный JS:
function processLanguageSelection(selectedLang) {
highlightCurrentlySelectedLang(selectedLang);
saveSelectedLangAcrossSession("clang", selectedLang);
reloadContentInSelectedLang(selectedLang);
}
function highlightCurrentlySelectedLanguage(selectedLang) {
$('#languages img').attr('src', '/images/flag-icons/' + selectedLang + '.png');
}
function saveSelectedLangAcrossSession(entryKey, selectedLang) {
window.localStorage.setItem(entryKey, selectedLang);
}
function reloadContentInSelectedLang(selectedLang) {
var search = window.location.search || "?";
if (/clang=\w{2}/.test(search)) {
search = search.replace(/clang=\w{2}/, "clang=" + selectedLang);
} else {
search += ("?" === search ? "clang=" : "&clang=") + selectedLang;
}
window.history.replaceState(null, "", search);
window.location.reload();
}
Ты почти там , как я уже сказал. Итак, что же в конечном итоге получить? - Отсутствует фишка в следующем: предыдущий выбор пользователя должен применяться только тогда, когда страница начинает загружаться.И любое необходимое перенаправление должно быть выполнено как можно раньше, прежде чем браузер начнет обрабатывать тело документа. Естественно, это означает, что часть ваших скриптов с этой ответственностью должна быть первой, которая запускается внутри <head>...</head>
section.
<head>
<script>
(function() {
var previouslySelectedLanguage = window.localStorage.getItem("clang");
if (/clang=\w{2}/.test(window.location.search)) {
// correct content should have been loaded in this case
// otherwise the server needs fixing, but that's not
// in the scope of this question.
// determine selectedLang from window.location.search, then..
highlightCurrentlySelectedLanguage(selectedLang);
if (!previouslySelectedLanguage || "selectedLang" !== previouslySelectedLanguage) {
saveSelectedLangAcrossSession("clang", selectedLang);
}
return;
}
if (previouslySelectedLanguage) {
// redirect
reloadContentInSelectedLang(previouslySelectedLanguage);
}
})();
</script>
</head>
Обратите внимание, что примеры, приведенные в этом ответе, не готовы к работе.Проявляйте должную осмотрительность, гарантируя, что они надежны, устойчивы и соответствуют другим стандартам, требуемым в вашей организации.Например, это регулярное выражение /clang=\w{2}/
делает смелое предположение, которое не всегда может быть правдой.