我有一个反应应用程序,我已经翻译成几种语言,也包含一些日期格式化功能。例如,我想允许用户在12小时和24小时之间更改,但是当切换到德语时,自动将该选项更改为24小时(因为德国通常不使用12小时时间)。
我仍然希望这个选项能够被用户更改,我也不希望每次页面重新加载时都将其重置为24小时。
我正在使用i18next和i18next-browser-languageDetector来检测浏览器语言,目前我有一个绑定到i18next的事件,用于当用户手动更改语言时,以便按语言设置这些默认设置,这是非常有效的:
i18n.on('languageChanged', lang => {
// Language specific options
if (lang === 'de') {
store.setTimeFormat('24h');
}
if (lang === 'en') {
store.setTimeFormat('12h');
}
});现在,唯一的问题是,当第一次加载应用程序时,即当浏览器检测器第一次检测到用户的语言时,该函数不会触发。
如何确定i18next-browser-languageDetector最初检测到语言的时间,也就是说,不是从本地存储加载,而是查询字符串lng=de会触发它,以便我可以设置这些设置?
发布于 2021-05-31 21:11:35
我设法解决了这个问题,首先检查一种语言是否已经保存在本地存储中,将这个添加到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等,则维护它可能很快变得麻烦。
发布于 2021-06-02 03:52:58
对于检测到的第一种语言,您可能希望尝试使用onInitialized event。然后检查i18next.language或i18next.languages,这取决于您的需要。
https://stackoverflow.com/questions/67772792
复制相似问题