ááá¯ááºáá¶ááŸáá·áº áá±áá¡áá
áºáá»á¬ážááᯠááŸá¬ááœá±áá±áá±á¬ ááá¯ááºáá¶ááá¬áá¯áá¹ááá®áá»á¬ážá¡ááœáẠáá¯ááºáá¯ááºáá±ááááºááŸááºááŒááºážááẠá¡ááœááºá¡áá±ážááŒá®ážáá«áááºá á¡áá¬ážáá°á ááá¯ááá¯ááºážá¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠáá±ááá¹ááááŒá¯ááẠááá¯á¡ááºáá«áááºá developer áá
áºáŠážááẠááá¯ááºáá¶ááᬠááá¯ážáá»á²á·ááŸá¯ááᯠá
áááºáá«áá á¡ááŒá¬ážááá¯ááºáá¶á០áá¯á¶ážá
áœá²áá°áá»á¬ážá¡á¬áž áááºážááá¯á·á áááááºáá¬áá¬á
áá¬ážááŒáá·áº á¡ááºáá¬áá±á·á
áºááŸáá·áº á¡áá¯ááºáá¯ááºááẠá¡ááœáá·áºá¡áá±áž áá±ážááẠá¡áá±ážááŒá®ážáá«áááºá á€áá±á¬ááºážáá«ážááœááºá á¡áá¯ááºááá¯á¡áá¯á¶ážááŒá¯á React Native á¡ááá®áá±ážááŸááºážáá
áºáá¯áááºáá®ážáá«áááºá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº- ááá¬áá±ážá¡áœááºááá¯ááºážáááºáááºáž
"Profession Java developer" .
áá«ááá¯á·áááºážááá¯ááááá±ážááẠ"Habr" áá á¬áááºáá°á¡á¬ážáá¯á¶ážá¡ááœáẠ- "Habr" áááá¯ááá¯ážááŸááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºááá·áº Skillbox áááºáááºážááœááºá á¬áááºážááœááºážááá·áºá¡áá« 10 áá°áááºáá»áŸá±á¬á·á á»á±ážá
áááááá¬áá»á¬ážááŸáá·áº áá»áœááºážáá»ááºááŸá¯áá»á¬áž
á€áá±á¬ááºážáá«ážááᯠáá¬ážáááºáááºá React Native ááŸáá·áº áá¯ááºáá±á¬ááºáá¬ááœáẠá¡ááŒá±áá¶áá»áœááºážáá»ááºááŸá¯áá»á¬áž ááá¯á¡ááºáá«áááºá á¡áá¯ááºáá¯ááºááá·áºá
ááºá áááºáááºáá»á¬ážááᯠáááºááá¯ááºááá¯áẠáááºážááŸá®ážá
á±áááºá
áá»áœááºá¯ááºááá¯á·ááẠá€áá±á¬á·ááºáá²ááºáááááá¬áá»á¬ážá áá¬ážááŸááºážáá»á¬áž ááá¯á¡ááºáá«áááº-
- Node v10.15.0
- npm 6.4.1
- áá»áẠá.áá.á
- áá¯á¶á·ááŒááºááŸá¯-áá¬áá 0.59.9
- react-native-localize á.á.á
- i18n-js 3.3.0
á áááº
áá»áœááºá¯ááºááá¯á·ááẠá¡ááºá¹áááááºá ááŒááºáá áºááŸáá·áº á¡á¬ááá®áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážááá·áº á¡ááºááºáá áºáá¯ááᯠáááºáá®ážáá«áááºá ááááŠážá áœá¬ react-native-cli ááᯠá¡áá¯á¶ážááŒá¯á ááá±á¬áá»ááºá¡áá áºáá áºáá¯ááᯠáááºáá®ážáá«á áá«ááá¯áá¯ááºááá¯á·á terminal ááŸá¬ áá«ááᯠááá¯ááºááá·áºááá¯á· ááá¯áá«áááºá
$ react-native init multiLanguage
$cd multiLanguage
ááá¯á¡ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬áž ááá·áºááœááºážááŒááºážá
áááá¡ááá·áºááŸá¬ á¡á±á¬ááºáá«ááá¯á·ááᯠááá¯ááºááá·áºááŒááºážááŒáá·áº react-native-localize ááᯠááá·áºááœááºážáááºááŒá
áºáááº-
$ yarn ááœáẠreact-native-localize ááá·áºáá«á
áááºáááºááŒááºážáá¯ááºáááºážá
ááºá¡ááœááºáž ááŒá¿áá¬áá»á¬ážááŒá
áºáá±á«áºáá«áá
react-native-localize library ááẠdeveloper á¡á¬áž áá¬áá¬á áá¬ážáá±á«ááºážá á¯á¶ áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáááºá ááá¯á·áá±á¬áº áá°áááẠáá±á¬ááºáááºá á¬ááŒáá·áºááá¯ááºáá áºáᯠááá¯á¡ááºááẠ- i18ná
á€áá±á¬ááºážáá«ážááœááºá¡áá¯á¶ážááŒá¯áá¯á¶ááá¯áá±á¬áºááŒáááºá
$ yarn i18n-js ááá·áºáá«á
áá±á¬ááºážááŒá®á i18n-js ááẠcaching ááá¯á·ááá¯áẠmemoization ááá¯ááá±ážáá±á¬ááŒá±á¬áá·áºá áááºážá¡ááœáẠlodash.memoize ááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááŒá¶ááŒá¯áá«áááºá
$yarn ááœáẠlodash.memoize ááá·áºáá«á
áá¬áá¬ááŒááºááœá±áá²á· á¡áá¯ááºáá¯ááºáááºá
á¡ááá®áá±ážááŸááºážááẠá¡ááŒá¬ážáá¬áá¬á áá¬ážáá»á¬ážááŒáá·áº á¡áá¯ááºáá¯ááºááá¯ááºá á±áááºá¡ááœááºá áááºááẠáŠážá áœá¬ src á¡ááœááºážááŸá áá¬áá¬ááŒááºááá¯ááŸá¯áááºážááœáŸááºáá áºáá¯ááᯠáááºáá®ážááŒá®ážáá±á¬áẠáá¬áá¬á áá¬ážáá áºáá¯á á®á¡ááœáẠJSON ááá¯ááºáá¯á¶ážáá¯ááᯠáááºáá®ážááẠááá¯á¡ááºáááºá
á¡ááºá¹áááááºá¡ááœáẠ1. en.json;
ááŒááºáá áºá¡ááœáẠ2. fr.json;
3. á¡á¬ááá®á¡ááœáẠar.json
á€ááá¯ááºáá»á¬ážááœáẠáá±á¬á·áá»á¬ážááŸáá·áº áááºááá¯ážáá»á¬ážáá«ááŸááá±á¬ JSON á¡áá¬áá»á¬áž áá«áááºáááºá áá±á¬á·ááẠáá¬áá¬á áá¬ážáá áºáá¯á á®á¡ááœáẠáá°áá®áááºááŒá áºáááºá á á¬áá¬ážá¡áá»ááºá¡áááºááá¯ááŒááááºá¡ááá®áá±ážááŸááºážááŸá¡áá¯á¶ážááŒá¯áááºá
áááºááá¯ážááẠá¡áá¯á¶ážááŒá¯áá°á¡á¬áž ááŒáááẠááá¯á¡ááºáá±á¬ á á¬áá¬ážááŒá áºáááºá
á¡ááºá¹áááááº:
{"hello": "Hello World!"}
ááŒááºáá áº
{"hello": "ááŸá¯ááºáááºáááºáá± Monde!"}
Arabic á¡áááá«ááº
{"áááºá¹ááá¬áá«"- "Ø£ÙÙا٠ؚاÙعاÙÙ "}
á¡ááŒá¬ážáá¬áá¬á áá¬ážáá»á¬ážááᯠá¡áá¬ážáá°áááºážááŒáá·áº ááá·áºááá¯ááºáááºá
áááºááá¯ááº
á€á¡áá»áááºááœáẠáááºááẠ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;
};
áá²á á¡áᯠApp class áá²á· á¡á áááºá¡ááá¯ááºážáá áºáá¯ááᯠáááºáá®ážááá¯ááºáá¡á±á¬ááºá
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() ááᯠá¡áááºááœááºážáááºá ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáááá¬áááºááŸá¬ážá á±áááºá¡ááœáẠá¡á áááºá¡ááá¯ááºážááᯠááŒááºááá¯ááááºááŒá áºááŒá®áž Android á ááºáá á¹á ááºážáá»á¬ážá¡ááœáẠáááºážááẠááá¯á¡ááºáá«áááºá
ááá¯á·áá±á¬áẠáá¬ážáá±á¬ááºááŒááºážááᯠcomponentWillUnmount() method á០áááºááŸá¬ážááẠááá¯á¡ááºáááºá
áá±á¬ááºáá¯á¶ážááœááºá render() ááẠtranslate() ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž áááºážááœáẠkey parameter ááá¯ááá·áºááŒááºážááŒáá·áº hello ááŒááºáá±ážáááºá á€á¡ááá·áºáá»á¬ážááŒá®ážáá±á¬ááºá á¡ááá®áá±ážááŸááºážááẠáááºááá·áºáá¬áá¬á áá¬áž ááá¯á¡ááºáááºááᯠâáá¬ážáááºâ ááá¯ááºááŒá®áž áááºážááœáẠáááºáá±á·áá»áºáá»á¬ážááᯠááŒáááá¯ááºáááºááŒá áºáááºá
áá»áŸá±á¬ááºááœáŸá¬áááºááŒááºáž
ááá¯á¡áá»áááºááẠáá¬áá¬ááŒááºááŒááºážá á¡áá¯ááºáá¯ááºáá¯á¶ááᯠá á áºáá±ážáááá·áºá¡áá»áááºááŒá áºáááºá
áŠážá áœá¬á áá»áœááºá¯ááºááá¯á·ááẠá á¬ááá¯ááºááŒááºážááŒáá·áº Simulator ááá¯á·ááá¯áẠemulator ááœáẠá¡ááá®áá±ážááŸááºážááᯠá áááºááá¯ááºáá«á
$ react-native run-ios
$ react-native run-android
áááºážáááºá€áá²á·ááá¯á·áá±á¬áá¯á¶ááááº-
ááᯠáááºááẠá¡ááºááºáá®áá±ážááŸááºážááᯠá
áááºááŒááºážááŒáá·áº áá¬áá¬á
áá¬ážááᯠááŒááºáá
áºááá¯á· ááŒá±á¬ááºážáá²ááẠááŒáá¯ážá
á¬ážááá¯ááºáá«ááŒá®á
áá»áœááºá¯ááºááá¯á·ááẠá¡á¬áááºáá¬áá¬ááŸáá·áº á¡áá°áá°áááºááŒá
áºááŒá®áž ááœá¬ááŒá¬ážááŸá¯áááŸááá«á
ááá¯á¡áááá±á¬á·á¡áááºááŒá±áá¯ááºážáá²á
ááá¯á·áá±á¬áº á¡ááá®áá±ážááŸááºážááœáẠáá¬áá¬ááŒááºááŒááºážáááŸááá±á¬ áá»áááºážáá¬áá¬á áá¬ážáá áºáá¯ááᯠáááºááœá±ážáá»ááºáá«á áá¬ááŒá áºáááºáááºážá
findBestLanguage ááá¬áááºááŸá¬ áááá¯ááºáá±á¬á¡á¬ážáá¯á¶ážá០á¡áá±á¬ááºážáá¯á¶ážáá¬áá¬ááŒááºááá¯ááŸá¯ááᯠáá±ážáá±á¬ááºáááºááŒá áºááŒá±á¬ááºáž áááºááŸá¬ážáá«áááºá ááááºá¡áá±ááŒáá·áº áá°áááºážáá¬áá¬á áá¬ážááᯠááŒááááºááŒá áºáááºá
áá¯ááºážáááºáááºáá»á¬ážá¡ááŒá±á¬ááºáž ááŒá±á¬áá±áá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá iOS emulator ááœáẠáá¬áá¬á áá¬ážáá»á¬ážá á¡á á®á¡á á¥áºááᯠáááºááŒááºááá¯ááºáááºá
ááœá±ážáá»ááºáá¬ážáá±á¬áá¬áá¬á
áá¬ážááẠááŸá
áºáááºáá¬áá¬áá¬á
áá¬ážááá¯ááºáá«áá findBestAvailableLanguage ááẠáááºááŸááºááá¬ážáá±á¬áá¬áá¬á
áá¬ážááᯠááŒáááºá¡ááœáẠáá°áááºážáá¬áá¬á
áá¬ážááá¯ááŒááááºá¡ááœáẠáááºááŸááºááá¬ážáá±á¬áá¬áá¬á
áá¬ážááᯠááŒááºáá±ážáááºá
áá¯ááŸá±
react-native-localize ááœáẠáá¬áá¬á
áá¬áž á¡áá»á¬ážá¡ááŒá¬ážááᯠáááºáá±á¬ááºááœáá·áº áá±ážááá·áº API áá
áºáᯠááŸááááºá á¡áá¯ááºáá
áááºá
ááœá±á·ááŸááá»ááºáá»á¬áž
á¡ááá®áá±ážááŸááºážááᯠááŒá¿áá¬áááŸááá² áá¬áá¬á áá¬ážáá»áá¯ážá á¯á¶ááŒáá·áº ááŒá¯áá¯ááºááá¯ááºáááºá React-native-localize ááẠááá·áºá¡ááºááºáá¡áá¯á¶ážááŒá¯áá°á¡ááŒá±áá¶ááᯠáá»á²á·ááœááºááá¯ááºá á±ááá·áº á¡áá±á¬ááºážáá¯á¶ážááœá±ážáá»ááºááŸá¯áá áºáá¯ááŒá áºáááºá
ááá±á¬áá»ááºá¡áááºážá¡ááŒá
áºáá¯ááº
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº-
- ááŸá áºááŸá áºá á¬áááºááœá±á·áááºáááºáž
"áá»áœááºáá±á¬áºá PRO ááẠdeveloper áá áºáá±á¬ááºáá«" .- á¡áœááºááá¯ááºážáááºáááºáž
"C# developer" .- áááºááœá±á· áá áºááŸá áºáááºáááºáž
"PHP developer 0 á០PRO" .
source: www.habr.com