【发布时间】:2021-02-01 20:07:52
【问题描述】:
我正在使用I18n 创建多语言应用程序。
我创建了“首次启动”屏幕,让用户可以选择自己喜欢的语言,它运行良好,但存在问题。
一旦我选择语言,App() 组件更新,它会显示登录组件 (initialRouteName="Login")。但是默认情况下语言仍然是英语,只有当我进入另一个屏幕时它才能工作或FastRefresh登录屏幕。
const Stack = createStackNavigator();
const HAS_LAUNCHED = "hasLaunched";
const ENGLISH = "en";
const HEBREW = "he";
//Save the language as AsyncStorage for other times the user will open the app
async function setAppLaunched(en) {
AsyncStorage.clear()
AsyncStorage.setItem(HAS_LAUNCHED, "true");
AsyncStorage.setItem(en ? ENGLISH : HEBREW, "true");
if(await AsyncStorage.getItem(HEBREW)){
i18n.locale = "he";
I18nManager.forceRTL(true);
}
else{
i18n.locale = "en";
I18nManager.forceRTL(false);
}
}
//If first launch show this screen
function CheckIfFirstLaunch({ onSelect }) {
const selectLaunched = (value) => {
setAppLaunched(value);
onSelect();
};
return (
<View>
<Text>Choose Language</Text>
<Button onPress={() => selectLaunched(false)} title="Hebrew"/>
<Button onPress={() => selectLaunched(true)} title="English"/>
</View>
);
}
export default function App() {
const [selected, setSelected] = useState(false);
const verifyHasLaunched = async () => {
try {
const hasLaunched = await AsyncStorage.getItem(HAS_LAUNCHED);
setSelected(hasLaunched != null);
} catch (err) {
setSelected(false);
}
};
useEffect(() => verifyHasLaunched, []);
if (!selected){
return <CheckIfFirstLaunch onSelect={() => setSelected(true)} />;
}
else{
const verifyLang = async () => {
const lang = await AsyncStorage.getItem('he');
if(lang != null){
i18n.locale = "he";
I18nManager.forceRTL(true);
}
else{
i18n.locale = "en";
I18nManager.forceRTL(false);
}
};
() => verifyLang;
}
return (
<NavigationContainer>
<Stack.Navigator screenOptions={{headerShown: false}} initialRouteName="Login">
<Stack.Screen name="Login" component={Login} />
<Stack.Screen name="Register" component={Register} />
<Stack.Screen name="Dashboard" component={Dashboard} />
</Stack.Navigator>
</NavigationContainer>
);
}
我想知道,既然我已经更新了我的组件,那么语言也应该更新,不是吗?
这里有一些屏幕截图可以直观地解释我的问题。
如何使用 I18n 插件根据用户选择更新 React Native 应用程序?
编辑
调试结果:
selectedLaunched(value) - value 正确返回布尔值。
检查setAppLaunched(en) if 语句以查看是否正确响应。
selected 状态也可以正常工作,并在 NavigationContainer 组件设置为 true 后立即渲染它。
【问题讨论】: