I18Next - 等待使用本地数据设置 Redux 存储
I18Next - wait for Redux store to be set with local data
我希望 i18next 等待 redux 存储准备就绪。我将用户选择的语言存储在商店中,使用来自 redux-persist
的 persistor 在应用程序启动时补充它。我尝试从商店设置语言:
// ...
import store from '../redux';
// ...
const lng = store.getState().user.language
? store.getState().user.language
: Localization.locale.slice(0, 2);
i18next
// .use(languageDetector)
.use(initReactI18next)
.init({
fallbackLng: 'en',
debug: true,
resources,
lng,
});
但此时商店仍处于初始状态,尚未重新水化。有什么办法可以做到这一点吗?
所以PersistGate
可以实现一个onBeforeLift
方法,等待解决后再解除“loading”状态
const onBeforeLift = async () => {
await initI18Next();
};
export default function App(): React.ReactElement {
return (
<Provider store={store}>
<PersistGate
loading={<SplashScreen />}
persistor={persistor}
onBeforeLift={onBeforeLift}
>
<StatusBar hidden />
<MainNavigation />
</PersistGate>
</Provider>
);
}
在i18n.ts
中:
const resources = {
en: { translation: en },
fr: { translation: fr },
he: { translation: he },
};
export const init = () => {
const lng = store.getState().user.language
? store.getState().user.language
: Localization.locale.slice(0, 2);
return (
i18next
.use(initReactI18next)
.init({
fallbackLng: 'en',
debug: true,
resources,
lng,
})
);
};
export default i18next;
我希望 i18next 等待 redux 存储准备就绪。我将用户选择的语言存储在商店中,使用来自 redux-persist
的 persistor 在应用程序启动时补充它。我尝试从商店设置语言:
// ...
import store from '../redux';
// ...
const lng = store.getState().user.language
? store.getState().user.language
: Localization.locale.slice(0, 2);
i18next
// .use(languageDetector)
.use(initReactI18next)
.init({
fallbackLng: 'en',
debug: true,
resources,
lng,
});
但此时商店仍处于初始状态,尚未重新水化。有什么办法可以做到这一点吗?
所以PersistGate
可以实现一个onBeforeLift
方法,等待解决后再解除“loading”状态
const onBeforeLift = async () => {
await initI18Next();
};
export default function App(): React.ReactElement {
return (
<Provider store={store}>
<PersistGate
loading={<SplashScreen />}
persistor={persistor}
onBeforeLift={onBeforeLift}
>
<StatusBar hidden />
<MainNavigation />
</PersistGate>
</Provider>
);
}
在i18n.ts
中:
const resources = {
en: { translation: en },
fr: { translation: fr },
he: { translation: he },
};
export const init = () => {
const lng = store.getState().user.language
? store.getState().user.language
: Localization.locale.slice(0, 2);
return (
i18next
.use(initReactI18next)
.init({
fallbackLng: 'en',
debug: true,
resources,
lng,
})
);
};
export default i18next;