android - 我在 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"), value: 'eng', icon: () => <Icon name="flag" size={18} color="#900" />},
{label: translate("Language.Arabic"), value: 'ara', icon: () => <Icon name="flag" size={18} color="#900" />},
{label: translate("Language.French"), value: 'fre', icon: () => <Icon name="flag" size={18} color="#900" />},
]}
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;
}
};
解决方案
推荐阅读
- arrays - Observable 未填充 Angular 组件字段数组
- c - 修改函数中的指针
- ruby-on-rails - 在没有登录功能的应用程序上添加可共享链接
- javascript - three.js:如何挤出由图像文件定义的形状
- google-apps-script - 使用 MailApp 而不是 GmailApp 转发电子邮件
- ansible - 为多个 import_playbooks 包含文件中的 var
- python - 从 Anaconda Cloud 下载 python 包后,我需要将它们放在哪个目录中?
- python-3.x - 重命名python DataFrame的列值的子字符串
- sql - 如何按州找到一个国家的第三大人口
- python-3.x - 提高 TemplateNotFound(template) jinja2.exceptions.TemplateNotFound: index.html