Я разрешаю пользователю выбирать язык в приложении и сохраняю его локально. Когда они возвращаются в приложение, я пытаюсь использовать AsyncStorage для получения языка, но когда я вызываю
i18n.changeLanguage(currentLanguage)
это вызывает утечку памяти. вот мой код
const [language, setLanguage] = useState('')
const {t} = useTranslation();
const fetchLanguage = async () =>{
try{
const currentLanguage = await AsyncStorage.getItem('language')
if (currentLanguage === null ){
}
else{
setLanguage (currentLanguage)
i18n.changeLanguage(currentLanguage)
}
}catch (e){
console.info(e)
}
}
useEffect (()=>{
fetchLanguage()
}, [])
Вместо того, чтобы пытаться использовать i18n.changeLanguage(currentLanguage)
внутри useEffect, используйте детектор языка при инициализации i18next. тогда у вас может быть язык отказа. Кредит на этот ответ принадлежит ответу Хенда Эль-Сахли здесь
const initialLanguage = 'en'
const languageDetector = {
init: Function.prototype,
type: 'languageDetector',
async: true,
detect: async callback =>{
const storeLanguage = await AsyncStorage.getItem("language")
const selectedLanguage = storeLanguage || initialLanguage
callback(selectedLanguage)
},
cacheUserLanguage: () =>{}
}
i18n
.use(initReactI18next) // passes i18n down to react-i18next
.use(languageDetector)
.init({
resources: resources,
compatibilityJSON: 'v3',
fallbackLng:'en',
interpolation: {
escapeValue: false, // react already safes from xss
},
});
export default i18n;