react-native 多语言切换
作者: 阿蒙 时间: 2020-10-23 标签: App开发 浏览: 3824 评论: 0
可以使用 i18n.js实现。 I18N主js是配置语言。 setLanguage是更改语言 。 languageupdate是监听语言变化(比如监听语言变化进行setState)
I18n
/**
* 多语言配置文件
*/
import I18n from "i18n-js";
// import * as RNLocalize from "react-native-localize";
import cn from './lang/cn';
import en from './lang/en';
import th from './lang/th';
import store from '../store/store';
import Map from "../config/Map";
// const locales = RNLocalize.getLocales();
// const systemLanguage = locales[0]?.languageCode; // 用户系统偏好语言
const userLanguageSetting = store.getState().publicStore.userLanguageSetting; // 用户手动设置语言
I18n.locale = userLanguageSetting;
// if (userLanguageSetting) {
// I18n.locale = userLanguageSetting;
// } else if (systemLanguage && Map.LANG_SETTING.includes(systemLanguage)) {
// I18n.locale = systemLanguage;
// } else {
// I18n.locale = 'en'; // 用户既没有设置,也没有获取到系统语言时,默认加载英语语言资源
// }
// 监听应用运行过程中语言的变化
store.subscribe(() => {
const newUserLanguageSetting = store.getState().publicStore.userLanguageSetting;
console.log('.....newUserLanguageSetting....', newUserLanguageSetting);
console.log('.....userLanguageSetting....', I18n.locale);
if (newUserLanguageSetting && newUserLanguageSetting !== I18n.locale) {
I18n.locale = newUserLanguageSetting;
}
});
I18n.fallbacks = true;
I18n.translations = {
zh: cn,
en,
th,
};
export default I18n;
// export { systemLanguage };
setLanguage.js
/**
* 设置语言界面
*/
import React from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { connect } from 'react-redux';
import {setLanguage} from "../store/publicStore/action";
class SetLanguage extends React.Component {
constructor(props) {
super(props);
}
render(): React.ReactNode {
return (
<View>
<TouchableOpacity onPress={() => {
this.props.setLanguage('en');
}}>
<Text>英文</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => {
this.props.setLanguage('zh');
}}>
<Text>中文</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => {
this.props.setLanguage('th');
}}>
<Text>泰文</Text>
</TouchableOpacity>
</View>
);
}
}
const mapStateToProps = state => ({
userLanguageSetting: state.publicStore.userLanguageSetting
});
const mapDispatchToProps = dispatch => ({
setLanguage: lang => dispatch(setLanguage(lang))
});
export default connect(mapStateToProps, mapDispatchToProps)(SetLanguage);
languageUpdate.js
import React, { useState, useEffect } from 'react';
import {View} from "react-native";
import store from '../store/store';
import I18n from './index';
const UseLanguageUpdate = ({onLanguageChangeCallBack, listenParamArr = []}) => {
const [currentLanguageCode, setCurrentLanguageCode] = useState( I18n.locale);
useEffect(() => {
return store.subscribe(() => {
const newUserLanguageSetting = store.getState().publicStore.userLanguageSetting;
console.log('newUserLanguageSetting....', newUserLanguageSetting);
console.log('currentLanguageCode....', currentLanguageCode);
if (newUserLanguageSetting && newUserLanguageSetting !== currentLanguageCode) {
setCurrentLanguageCode(newUserLanguageSetting);
if (onLanguageChangeCallBack) onLanguageChangeCallBack();
}
});
}, [currentLanguageCode, ...listenParamArr]);
return (
<View />
)
};
export default UseLanguageUpdate;
本文相关标签: react-native
发表评论: