Изменить i18next и правильный способ изменения языка
Я разрабатываю многоязычное приложение с использованием React, i18next
и i18next-browser-languagedetector
.
Я инициализирую i18 следующим образом:
i18n
.use(LanguageDetector)
.init({
lng: localStorage.getItem(I18N_LANGUAGE) || "pt",
fallbackLng: "pt",
resources: {
en: stringsEn,
pt: stringsPt
},
detection: {
order: ["localStorage", "navigator"],
lookupQuerystring: "lng",
lookupLocalStorage: I18N_LANGUAGE,
caches: ["localStorage"]
}
});
export default i18n;
И я применил селектор языка, который просто изменяет значение в localStorage
на то, что выбрал пользователь.
Это правильный способ сделать это?
Я прошу, потому что, хотя это работает, я чувствую, что я "обманываю", установив localStorage.getItem(I18N_LANGUAGE) || "pt"
и что я не использую определение языка так, как должен.
Ответы
Ответ 1
Согласно документации, вам не нужно указывать язык самостоятельно:
import i18next from 'i18next';
import LngDetector from 'i18next-browser-languagedetector';
i18next
.use(LngDetector)
.init({
detection: options
});
И в соответствии с этот фрагмент источника в i18next
он действительно использует возможности обнаружения плагина:
if (!lng && this.services.languageDetector) lng = this.services.languageDetector.detect();
Это правильный способ сделать это?
Итак, нет, это не так. Пусть плагин выполняет эту работу.:)
Ответ 2
@firstdoit:
Хороший ответ в отношении автоматического определения языка браузера. Однако, не считайте ли вы, что это лучший подход к использованию автоматической и ручной конфигурации для пользователя.
Например, если у вас установлен браузер на английском языке, это будет нормально для автоматического подхода, который вы предлагаете на основе документации. Если пользователь меняет язык страницы с английского на французский, это не влияет на язык браузера, поэтому он сохраняет сайт только на английском языке, потому что в настройках установлено автоматическое определение языка браузера.
I, в свою очередь, придаст приоритет текущему языку страницы:
- Либо передаются через параметры (/george.php?lang=fr или /fr _FR/george.php)
Это будет передано в качестве реквизита моего кода как prority, как следует
- var lang = this.props.lang || this.services.languageDetector.detect() || "Ан";
Что вы берете?
Ответ 3
Я думаю, вы очень близки. Вы можете просто установить i18n
с исходным языком. Затем после загрузки сохраненной информации о языке для localstorage или localforage или любого другого хранилища вызовите i18nInstance.changeLanguage(lng)
.