我设法解决了这个问题,首先检查一种语言是否已保存在本地存储中,将其添加到 i18next 选项对象中,然后我可以稍后检查它以设置默认值。
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';
// Check the localstorage before i18next can
const storedLang = localStorage.getItem('i18nextLng');
i18n
.use(LanguageDetector)
.use(Backend)
.use(initReactI18next)
.init({
fallbackLng: 'en',
interpolation: {
escapeValue: false,
},
backend: {
loadPath: '/i18n/{{lng}}/{{ns}}.json',
},
storedLang, // Add it here
});
export default i18n;
然后在我的组件中,我可以将以下内容放入函数中:
import { useTranslation } from 'react-i18next';
import { mySettingsStore } from 'stores';
const setDefaults = (lang, store) => {
// Language specific options
if (lang === 'de') {
store.setTimeFormat('24h');
}
if (lang === 'en') {
store.setTimeFormat('12h');
}
// etc...
};
const Component = () => {
const store = mySettingsStore(); // zustand store
const { i18n } = useTranslation();
// If localstorage was empty: no language set
if (!i18n.options.storedLang) {
setDefaults(i18n.language, store);
i18n.options.storedLang = i18n.language;
}
// Language changed manually
i18n.on('languageChanged', lang => {
setDefaults(lang, store);
});
return (...);
};
export default Component;
但是,如果通过查询字符串设置了语言,则此方法不会更新选项,例如https://my.app?lng=de
,如果本地存储中已经设置了语言。这也可以通过以相同方式检查查询字符串参数来解决,但如果使用更多选项(例如会话存储、cookie 等),维护起来很快就会变得很麻烦。