Javascript 反应本机&;i18n在路由到另一个屏幕后返回默认语言

Javascript 反应本机&;i18n在路由到另一个屏幕后返回默认语言,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我正在将React Native与i18n语言管理器一起使用,并尝试在第一次应用程序发布时创建语言选择 语言选择屏幕不起作用,在选择语言后,组件重新呈现并执行正确的语言。(假设我选择了英语,按钮字符串为英语) 但在登录应用程序后,语言发生了变化,我真的不明白为什么。 (此处假设为英语,显示希伯来语字符串) 这是App.js文件,我使用了异步存储来检查应用程序之前是否启动过(如果没有显示语言选择,如果使用了保存的语言选择) 我已经调试了AsyncStorage中的值,并收到了正确的值 看起来

我正在将React Native与i18n语言管理器一起使用,并尝试在第一次应用程序发布时创建语言选择

语言选择屏幕不起作用,在选择语言后,组件重新呈现并执行正确的语言。(假设我选择了英语,按钮字符串为英语)

但在登录应用程序后,语言发生了变化,我真的不明白为什么。 (此处假设为英语,显示希伯来语字符串)

这是App.js文件,我使用了
异步存储
来检查应用程序之前是否启动过(如果没有显示语言选择,如果使用了保存的语言选择)

我已经调试了
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);
       }