如何解决我在 react native 中制作了一个按钮来更改应用程序的语言当我运行应用程序时它工作正常,但它在发布 apk 中不起作用
changeLanguage.js 包含用于更改语言的下拉菜单的更改语言屏幕。当用户选择语言时,该语言将存储在 redux 中并重新启动。
const changeLanguage = (navigation) => {
const [lang,setlang] = useState("");
const { theme } = useContext(ThemeContext);
console.log(lang);
const onButtonClick = () => {
if (lang!=""){
addLanguage(lang);
// console.log("lang :"+lang);
}
RNRestart.Restart();
};
return (
<View>
<DropDownPicker
items={[
{label: translate("Language.Choose"),value: 'eng',hidden: true},{label: translate("Language.English"),icon: () => <Icon name="flag" size={18} color="#900" />},{label: translate("Language.arabic"),value: 'ara',{label: translate("Language.french"),value: 'fre',]}
defaultValue='eng'
containerStyle={styles.conatinerStyle}
style={styles.dropstyle}
itemStyle={styles.itemStyle}
dropDownStyle={styles.dropDownStyle}
// onChangeItem={item => this.setState({country: item.value})}
onChangeItem={item => setlang(item.value)}
/>
<View style={styles.btnView}>
<Button
style={styles.langbtn(theme)}
title={translate("Language.UpdateLanguage")}
// title="Update Language"
onPress={onButtonClick}
type="solid"
/>
</View>
</View>
);
};
export default changeLanguage;
i18n/index.js
export const translationGetters = {
// lazy requires (metro bundler does not support symlinks)
eng: () => require('./translations/eng.json'),ara: () => require('./translations/ara.json'),fre: () => require('./translations/fre.json'),};
export const translate = memoize(
(key,config) => i18n.t(key,config),(key,config) => (config ? key + JSON.stringify(config) : key)
);
export const setI18nConfig = () => {
// fallback if no available language fits
const fallback = { languageTag: 'eng',isRTL: false };
const { languageTag,isRTL } =
RNLocalize.findBestAvailableLanguage(Object.keys(translationGetters)) || fallback;
// clear translation cache
translate.cache.clear();
// update layout direction
I18nManager.forceRTL(isRTL);
// set i18n-js config
i18n.translations = { [languageTag]: translationGetters[languageTag]() };
i18n.locale = languageTag;
};
export const changeLanguage = (languageTag) => { /* lang='eng' or 'fre' or 'ara' */
// clear translation cache
translate.cache.clear();
// update layout direction
if (languageTag=='ara'){
I18nManager.forceRTL(true);
}
else{
I18nManager.forceRTL(false);
}
i18n.translations = { [languageTag]: translationGetters[languageTag]() };
i18n.locale = languageTag;
};
App.js 当存储在 redux 中的语言发生变化时,将调用 changeLanguage 来更新语言
export default class App extends React.Component {
constructor(props) {
super(props);
i18n.setI18nConfig();
}
DummyView = () => {
var lang = useSelector((state) => state.language.language);
useEffect(() => {
if(lang !=""){
i18n.changeLanguage(lang);
}
},[lang])
return null
}
componentDidMount() {
RNLocalize.addEventListener('change',this.handleLocalizationChange);
}
componentwillUnmount() {
RNLocalize.removeEventListener('change',this.handleLocalizationChange);
}
handleLocalizationChange = () => {
i18n.setI18nConfig();
this.forceUpdate();
};
render() {
return (
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<this.DummyView/>
<ThemeProvider theme={theme}>
<RootStackScreen/>
</ThemeProvider>
</PersistGate>
</Provider>
);
}
}
langaugeActions.js
export const addLanguage = (lang) => {
store.dispatch({
type: 'CHANGE_LANGUAGE',language: lang,})
};
langaugeReducer.js
const INITIAL_STATE = { language:'eng'}
const language = ( state = INITIAL_STATE,action ) => {
switch(action.type) {
case 'CHANGE_LANGUAGE':
return {
language: action.language,};
default:
return state;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。