ืืืงืืืืฆืื ืฉื ืืืฆืจืื ืืฉืืื ืืืื ืขืืืจ ืืืจืืช ืืื ืืืืืืืช ืืืืืงืืช ืืืื ืืช ืืืืืจืื ืืืฉืื. ืืืืคื ืืืื, ื ืืจืฉืช ืืืงืืืืฆืื ืขืืืจ ืืืฉืืืื ื ืืืืื. ืื ืืคืชื ืืชืืื ืืืชืจืืืืช ืืื ืืืืืืช, ืืฉืื ืืชืช ืืืฉืชืืฉืื ืืืืื ื ืืืจืช ืืช ืืืคืฉืจืืช ืืขืืื ืขื ืืืืฉืง ืืฉืคืช ืืื ืฉืืื. ืืืืืจ ืื, ื ืืฆืืจ ืืืฉืื React Native ืืืืฆืขืืช ืืืืืื
Skillbox ืืืืืฆื: ืงืืจืก ืืื ืืื ืืงืืื
"ืืงืฆืืขื ืืคืชื ื'ืืืื" .
ืื ื ืืืืืจืื: ืืื ืงืืจืื Habr - ืื ืื ืฉื 10 ืจืืื ืืขืช ืืจืฉืื ืืื ืงืืจืก Skillbox ืืืืฆืขืืช ืงืื ืืืืื ืฉื Habr.
ืืืื ืืืืืื ืืืืช
ืืื ืืืืื ืืช ืืืืืจ ืืื, ืืชื ืฆืจืื ืืืืื ืืืืช ืืกืืกืืืช ืืขืืืื ืขื React Native. ืืื ืืืืืจ ืืช ืืืืืจืืช ืฉื ืืืืื ื ืืขืืืืช, ืืชื ืืืื
ื ืฆืืจื ืืช ืืืจืกืืืช ืืืื ืฉื ืืื ืชืืื ื:
- ืฆืืืช v10.15.0
- npm 6.4.1
- ืืื 1.16.0
- react-native 0.59.9
- react-native-localize 1.1.3
- i18n-js 3.3.0
ืชืืืืช ืืขืืืื
ื ืืฆืืจ ืืคืืืงืฆืื ืฉืชืชืืื ืืื ืืืืช, ืฆืจืคืชืืช ืืขืจืืืช. ืจืืฉืืช ืื ื ืืืฆืจืื ืคืจืืืงื ืืืฉ ืืืืฆืขืืช react-native-cli. ืืื ืืขืฉืืช ืืืช, ืขืืื ืืืงืืื ืืืช ืืืจืืื ื:
$ react-native init multiLanguage
$ cd multiLanguage
ืืืกืคืช ืืกืคืจืืืช ืืืจืืฉืืช
ืืฆืขื ืืจืืฉืื ืืื ืืชืงื ืช react-native-localize ืขื ืืื ืืงืืืช ืืืืจืื ืืืืื:
$ yarn ืืืกืฃ react-native-localize
ืื ืืชืจืืฉืืช ืืขืืืช ืืืืื ืชืืืื ืืืชืงื ื,
ืกืคืจืืืช react-native-localize ืืขื ืืงื ืืืคืชื ืืืฉื ืืชืืื ืืช ืจื ืืฉืื ืืืช. ืืื ืืื ืฆืจืืื ืขืื ืกืคืจืืื ืืืช - i18n.
ืืืืจ ืื ืืชืืจ ืืช ืืฉืืืืฉ
$ yarn add i18n-js
ืืืื, ืืืืืื ืฉ-i18n-js ืืื ื ืืกืคืง ืืืกืื ืืืืืื ืื ืฉืื ืื, ืื ื ืืฆืืข ืืืฉืชืืฉ ื-lodash.memoize ืขืืืจ ืื:
$ yarn ืืืกืฃ lodash.memoize
ืขืืืื ืขื ืชืจืืืืื
ืืื ืฉืืืคืืืงืฆืื ืชืืื ืืขืืื ืขื ืฉืคืืช ืืืจืืช, ืชืืืื ืขืืื ืืืฆืืจ ืกืคืจืืืช ืชืจืืืืื ืืชืื src, ืืืืืจ ืืื ืฉืืืฉื ืงืืฆื JSON ืืื ืฉืคื.
1. en.json ืืื ืืืืช;
2. fr.json ืืฆืจืคืชืืช;
3. ar.json ืืขืจืืืช.
ืงืืฆืื ืืื ืืืืืื ืืืืืืงืื JSON ืขื ืืคืชืืืช ืืขืจืืื. ืืืคืชื ืืืื ืืื ืขืืืจ ืื ืฉืคื. ืืื ืืฉืืฉ ืืช ืืืคืืืงืฆืื ืืืฆืืช ืืืืข ืืงืกื.
ืขืจื ืืื ืืืงืกื ืฉืฆืจืื ืืืจืืืช ืืืฉืชืืฉ.
ืื ืืืืช:
{"hello": "ืฉืืื ืขืืื!"}
ะคัะฐะฝััะทัะบะธะน
{"hello": "Salut le Monde!"}
ะัะฐะฑัะบะธะน
{ "hello": "ุฃููุงู ุจุงูุนุงูู "}
ืืชื ืืืื ืืืืกืืฃ ืฉืคืืช ืืืจืืช ืืืืชื ืืืคื.
ืงืื ืจืืฉื
ืืฉืื ืื, ืขืืื ืืคืชืื ืืช ืงืืืฅ App.js ืืืืืกืืฃ ืื ืืืืื:
import React from "react";
import * as RNLocalize from "react-native-localize";
import i18n from "i18n-js";
import memoize from "lodash.memoize"; // Use for caching/memoize for better performance
import {
I18nManager,
SafeAreaView,
ScrollView,
StyleSheet,
Text,
View
} from "react-native";
ืืืืจ ืืื, ืืชืืืกืคืืช ืคืื ืงืฆืืืช ืขืืจ ืืงืืืขืื ืฉืืืื ืฉืืืืฉืืื ืืืืืจ ืืืชืจ.
const translationGetters = {
// lazy requires (metro bundler does not support symlinks)
ar: () => require("./src/translations/ar.json"),
en: () => require("./src/translations/en.json"),
fr: () => require("./src/translations/fr.json")
};
const translate = memoize(
(key, config) => i18n.t(key, config),
(key, config) => (config ? key + JSON.stringify(config) : key)
);
const setI18nConfig = () => {
// fallback if no available language fits
const fallback = { languageTag: "en", 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 default class App extends React.Component {
constructor(props) {
super(props);
setI18nConfig(); // set initial config
}
componentDidMount() {
RNLocalize.addEventListener("change", this.handleLocalizationChange);
}
componentWillUnmount() {
RNLocalize.removeEventListener("change", this.handleLocalizationChange);
}
handleLocalizationChange = () => {
setI18nConfig();
this.forceUpdate();
};
render() {
return (
<SafeAreaView style={styles.safeArea}>
<Text style={styles.value}>{translate("hello")}</Text>
</SafeAreaView>
);
}
}
const styles = StyleSheet.create({
safeArea: {
backgroundColor: "white",
flex: 1,
alignItems: "center",
justifyContent: "center"
},
value: {
fontSize: 18
}
});
ืืืืื ื ืืจืืฉืื, setI18nConfig(), ืืืืืจ ืืช ืืชืฆืืจื ืืจืืฉืื ืืช.
ืืืืจ ืืื ืขืืื ืืืืกืืฃ ืืืืื ืืืจืืขืื ื-componentDidMount(), ืืืื ื ืื ืืงืฉืื ืืขืืืื ืื ืืืงืจื ื-handleLocalizationChange() ืืืฉืจ ืื ืืชืจืืฉืื.
ืฉืืืช handleLocalizationChange() ืืคืขืืื setI18nConfig() ื-forceUpdate(). ืื ืืืจืื ืขืืืจ ืืืฉืืจื ืื ืืจืืืื ืฉืื ืืฉ ืืืฆืื ืืช ืืจืืื ืืื ืฉืืฉืื ืืืื ืืืื ืืืจืืฉืื.
ืืืืจ ืืื ืขืืื ืืืกืืจ ืืช ืืืืื ื ืืืฉืืื componentWillUnmount()โ.
ืืืกืืฃ, render() ืืืืืจ hello ืืืืฆืขืืช translate() ืืืืกืคืช ืคืจืืืจ ืืคืชื ืืืื. ืืืืจ ืืฉืืืื ืืืื, ืืืคืืืงืฆืื ืชืืื "ืืืืื" ืืืื ืฉืคื ื ืืจืฉืช ืืืืฆืื ืื ืืืืขืืช.
ืืฉืงืช ืืืฉืืืื
ืขืืฉืื ืื ืืืื ืืืืืง ืืื ืืชืจืืื ืขืืื.
ืจืืฉืืช, ืื ื ืืคืขืืืื ืืช ืืืคืืืงืฆืื ืืกืืืืืืืจ ืื ืืืืืืืืจ ืขื ืืื ืืงืืื
$ react-native run-ios
$ react-native run-android
ืื ืืืจืื ืืขืจื ืื:
ืืขืช ืชืืื ืื ืกืืช ืืฉื ืืช ืืช ืืฉืคื ืืฆืจืคืชืืช ืขื ืืื ืืคืขืืช ืืืคืืืงืฆืื.
ืื ืื ื ืขืืฉืื ืืช ืืืชื ืืืืจ ืขื ืขืจืืืช, ืืื ืืืื.
ืืื ืชืืื ืืื ืืื.
ืืื ืื ืงืืจื ืื ืชืืืจ ืืฉืคื ืืงืจืืืช ืฉืืื ืื ืชืจืืื ืืืคืืืงืฆืื?
ืืกืชืืจ ืฉืืืฉืืื ืฉื findBestLanguage ืืื ืืกืคืง ืืช ืืชืจืืื ืืืืคืืืืื ืืื ืืชืจืืื ืืืืื ืื. ืืชืืฆืื ืืื, ืชืืฆื ืฉืคืช ืืจืืจืช ืืืืื.
ืื ืื ื ืืืืจืื ืขื ืืืืจืืช ืืืืคืื. ืืืืืื, ืืืืืืืืจ iOS ื ืืชื ืืจืืืช ืืช ืกืืจ ืืฉืคืืช.
ืื ืืฉืคื ืฉื ืืืจื ืืื ื ืืฉืคื ืืืืขืืคืช, findBestAvailableLanguage ืืืืืจื ืื ืืืืืจืช ืื ืฉืฉืคืช ืืจืืจืช ืืืืื ืชืืฆื.
ืืื ืืก
ื-react-native-localize ืืฉ API ืืืกืคืง ืืืฉื ืืืกืคืจ ืจื ืฉื ืจืืืื ืฉืคื. ืืคื ื ืฉืชืชืืื ืืขืืื,
ืืืฆืืื
ื ืืชื ืืืคืื ืืช ืืืคืืืงืฆืื ืืจื ืืฉืื ืืช ืืื ืืขืืืช. React-native-localize ืืื ืืคืฉืจืืช ืืฆืืื ืช ืืืืคืฉืจืช ืื ืืืจืืื ืืช ืืกืืก ืืืฉืชืืฉืื ืฉื ืืืคืืืงืฆืื ืฉืื.
ืงืื ืืืงืืจ ืฉื ืืคืจืืืงื
Skillbox ืืืืืฆื:
- ืงืืจืก ืืขืฉื ืฉื ืชืืื
"ืื ื ืืคืชื ืืชืจืื PRO" .- ืงืืจืก ืืงืืื
"ืืคืชื C# ืืืคืก" .- ืงืืจืก ืืขืฉื ืื ืฉื ื
"ืืคืชื PHP ื-0 ื-PRO" .
ืืงืืจ: www.habr.com