แแ แแแฃแฅแขแแก แแแแแแแแแชแแ แซแแแแแ แแแแจแแแแแแแแแแ แกแแแ แแแจแแ แแกแ แแแแแแแแแแแกแแแแก, แ แแแแแแแช แแแแแแแแ แแฎแแ แฅแแแงแแแแกแ แแ แ แแแแแแแแก. แแแแแแแแฃแ แแ, แแแแแแแแแชแแ แกแแญแแ แแ แแแแแแฃแ แ แแแแแแแชแแแแแกแแแแก. แแฃ แแแแแแแแแ แ แแฌแงแแแก แกแแแ แแแจแแ แแกแ แแแคแแ แแแแแแก, แแแแจแแแแแแแแแแ แกแฎแแ แฅแแแงแแแก แแแแฎแแแ แแแแแแก แแแกแชแแก แจแแกแแซแแแแแแแ แแแฃแจแแแ แแแขแแ แคแแแกแแ แแจแแแแแฃแ แแแแแ. แแ แกแขแแขแแแจแ แฉแแแ แจแแแฅแแแแ React Native แแแแแแแชแแแก แแแแแขแแก แแแแแงแแแแแแ
Skillbox แแแ แฉแแแ: แกแแแแแแแแแแแแแแ แแแแแแ แแฃแ แกแ
"แแ แแคแแกแแ Java Developer" .
แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
แแแกแขแ แฃแแแแขแแแ แแ แฃแแแ แแแ
แแ แกแขแแขแแแก แแแกแแแแแแ, แแญแแ แแแแแ React Native-แแแ แแฃแจแแแแแก แซแแ แแแแแ แฃแแแ แแแ. แกแแแฃแจแแ แแแแ แแขแแก แแแ แแแแขแ แแแแแ แแแกแแชแแแแแ, แจแแแแซแแแแ
แฉแแแ แแแแแญแแ แแแแ แแ แแแ แแแฃแแ แแแกแขแ แฃแแแแขแแแแก แจแแแแแแ แแแ แกแแแแ:
- Node v10.15.0
- npm 6.4.1
- แแแ แแ 1.16.0
- แ แแแฅแขแแฃแแ 0.59.9
- react-native-localize 1.1.3
- i18n-js 3.3.0
แแแแฌแงแ
แฉแแแ แจแแแฅแแแแ แแแแแแแชแแแก, แ แแแแแแช แแฎแแ แก แแแฃแญแแ แก แแแแแแกแฃแ แก, แคแ แแแแฃแแก แแ แแ แแแฃแแก. แฏแแ แแฅแแแแ แแฎแแ แแ แแแฅแขแก react-native-cli-แก แแแแแงแแแแแแ. แแแแกแแแแแก แแฅแแแ แฃแแแ แแแ แแคแแ แแก แขแแ แแแแแแจแ:
$ react-native init multiLanguage
$ cd แแ แแแแแแแแแแแ
แกแแญแแ แ แแแแแแแแแแแแแก แแแแแขแแแ
แแแ แแแแ แแแแแฏแ แแ แแก react-native-localize-แแก แแแงแแแแแ แจแแแแแแ แแฃแแฅแขแแก แแแ แแคแแ:
$ แแแ แแ แแแแแแขแแ react-native-localize
แแฃ แแ แแแแแแแแ แฌแแ แแแแฅแแแแแ แแแกแขแแแแชแแแก แแ แแชแแกแจแ,
React-native-localize แแแแแแแแแแ แแซแแแแก แแแแแแแแแ แก แฌแแแแแแก แแ แแแแแแแแแแ แคแฃแแฅแชแแแแแ. แแแแ แแ แแแก แแแแแ แแ แแ แแแแแแแแแแ แกแญแแ แแแแ - i18n.
แแก แกแขแแขแแ แแฆแฌแแ แก แแแแแงแแแแแแก
$ แแแ แแ แแแแแแขแแ i18n-js
แแแ แแ, แ แแแแแ i18n-js แแ แฃแแ แฃแแแแแงแแคแก แฅแแจแแ แแแแก แแ แแแแแฎแกแแแ แแแแก, แแ แแแ แฉแแแ แแแแแแงแแแแ lodash.memoize แแแแกแแแแแก:
$ แแแ แแ แแแแแแขแแ lodash.memoize
แแแ แแแแแแแแแ แแฃแจแแแแ
แแแแกแแแแแก, แ แแ แแแแแแแชแแแ แจแแซแแแก แกแฎแแ แแแแแแแ แแฃแจแแแแ, แฏแแ แฃแแแ แจแแฅแแแแ แแแ แแแแแแก แแแ แแฅแขแแ แแ src-แจแ, แจแแแแแ แแ แกแแแ JSON แคแแแแ แแแแแแฃแแ แแแแกแแแแก.
1. en.json แแแแแแกแฃแ แแกแแแแก;
2. fr.json แคแ แแแแฃแแแ;
3. ar.json แแ แแแฃแแแ.
แแก แคแแแแแแ แจแแแชแแแก JSON แแแแแฅแขแแแก แแแกแแฆแแแแแแ แแ แแแแจแแแแแแแแแแ. แแแกแแฆแแแ แแแแแ แแฅแแแแ แแแแแแฃแแ แแแแกแแแแก. แแแ แแแแแแงแแแแแ แแแแแแแชแแแก แแแแ แขแแฅแกแขแฃแ แ แแแคแแ แแแชแแแก แกแแฉแแแแแแแแ.
แแแแจแแแแแแแ แแ แแก แขแแฅแกแขแ, แ แแแแแแช แฃแแแ แแฉแแแแแก แแแแฎแแแ แแแแแก.
แแแแแแกแฃแ แ แแแ:
{"hello": "แแแแแ แฏแแแ แกแแแงแแ แ!"}
ะคัะฐะฝััะทัะบะธะน
{"แแแแแ แฏแแแ": "Salut le Monde!"}
ะัะฐะฑัะบะธะน
{ "แแแแแ แฏแแแ": "ุฃููุงู ุจุงูุนุงูู "}
แแฅแแแ แจแแแแซแแแแ แแแแแแขแแ แกแฎแแ แแแแแ แแแแแ แแแแ.
แแแแแแ แ แแแแ
แแ แแขแแแแ, แแฅแแแ แฃแแแ แแแฎแกแแแ 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(). แแก แแฃแชแแแแแแแแ Android แแแฌแงแแแแแแแแแแกแแแแก, แ แแแแแ แแแแแแแแแขแ แฃแแแ แแงแแก แแแแแกแแฎแฃแแ, แ แแ แชแแแแแแแแแ แจแแกแแแฉแแแแ แแงแแก.
แจแแแแแ แแฅแแแ แฃแแแ แแแแแฆแแ แแแกแแแแ 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