Javascript 反应本机&;i18n在路由到另一个屏幕后返回默认语言
我正在将React Native与i18n语言管理器一起使用,并尝试在第一次应用程序发布时创建语言选择 语言选择屏幕不起作用,在选择语言后,组件重新呈现并执行正确的语言。(假设我选择了英语,按钮字符串为英语) 但在登录应用程序后,语言发生了变化,我真的不明白为什么。 (此处假设为英语,显示希伯来语字符串) 这是App.js文件,我使用了Javascript 反应本机&;i18n在路由到另一个屏幕后返回默认语言,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我正在将React Native与i18n语言管理器一起使用,并尝试在第一次应用程序发布时创建语言选择 语言选择屏幕不起作用,在选择语言后,组件重新呈现并执行正确的语言。(假设我选择了英语,按钮字符串为英语) 但在登录应用程序后,语言发生了变化,我真的不明白为什么。 (此处假设为英语,显示希伯来语字符串) 这是App.js文件,我使用了异步存储来检查应用程序之前是否启动过(如果没有显示语言选择,如果使用了保存的语言选择) 我已经调试了AsyncStorage中的值,并收到了正确的值 看起来
异步存储
来检查应用程序之前是否启动过(如果没有显示语言选择,如果使用了保存的语言选择)
我已经调试了AsyncStorage
中的值,并收到了正确的值
看起来,异步存储
保存了重新呈现App.js
文件所需的语言数据,但I18n在屏幕路由后重置了他的设置。为什么呢
如何使用React Native在首次应用程序启动时为整个应用程序设置语言
我已经用叉子叉了你的沙箱
有几个变化
问题在于,每次选择一种语言时,都将其设置为存储器中的键
一旦您选择了英语,重新加载并选择了希伯来语,您就会在存储器中获得两个键,如下所示
{'he': true, 'en': true}
在这一点上,这一部分总是将lang设置为希伯来语,因为确实存在这样的键(“他”是真的)
我改变的是,我们不再将每种语言设置为键。相反,我们通过selectLaunched
传递语言本身。然后我们将其保存在存储器中的lang
键中。这样,lang
键总是存储正确的语言-“he”或“en”
由于不再需要,
verifyLang
可以删除。希望这能解决你的问题。你能为此设置一个stackblitz/codesandbox吗?@Vladimirbogomov不确定我是否正确分享了它,第一次使用codesandbox(选择英语,然后按register)如果你想让你的应用程序更容易重新渲染,你应该使用useContext
hook并将语言保存在那里。这个钩子有点像一个自动的useffect
,每次您更改语言并在useContext
中设置它时,它都会发生。刚刚测试了您的沙盒,它会在语言选择上重新呈现相反的语言,只有在导航到另一个屏幕时才起作用。我看不出为什么会这样,有什么想法吗?修复了,我有if(value==HEBREW){18n.locale=“en”
typo.现在应该可以工作了。
import i18n from 'i18n-js';
import en from './locale/en.json';
import he from './locale/he.json';
i18n.defaultLocale = 'en';
i18n.fallbacks = true;
i18n.translations = { en, he };
export default i18n;
{'he': true, 'en': true}
const verifyLang = async () => {
const lang = await AsyncStorage.getItem('he');
if(lang != null){
i18n.locale = "he";
I18nManager.forceRTL(true);
}