ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π° Π·Π° ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ Π½ΠΎΠ²ΠΈ ΡΡΡΠ°Π½ΠΈ ΠΈ ΡΠ΅Π³ΠΈΠΎΠ½ΠΈ. ΠΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π½Π° Π΅ΠΊΡΠΏΠ°Π½Π·ΠΈΡ, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΄Π°Π΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΎΡ Π΄ΡΡΠ³Π° Π΄ΡΡΠΆΠ°Π²Π° Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° ΡΠΎΠ΄Π½ΠΈΡ ΡΠΈ Π΅Π·ΠΈΠΊ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React Native, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΡΠΎΡΠ΅ΡΠΈΡ Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΡΠΌΠ΅Π½ΠΈΡ
Π Π°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠΌΠ΅Π½ΠΈΡ Π·Π° React Native. ΠΠ° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ΡΠ°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅
ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ΅Π·ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ:
- ΠΡΠ·Π΅Π» v10.15.0
- npm 6.4.1
- ΠΏΡΠ΅ΠΆΠ΄Π° 1.16.0
- ΡΠ΅Π°Π³ΠΈΡΠ°-ΡΠΎΠ΄Π΅Π½ 0.59.9
- ΡΠ΅Π°ΠΊΡΠΈΡ-ΡΠΎΠ΄Π΅Π½-Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ 1.1.3
- i18n-js 3.3.0
ΠΡΡΠ²ΠΈ ΡΡΡΠΏΠΊΠΈ
Π©Π΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ, ΡΡΠ΅Π½ΡΠΊΠΈ ΠΈ Π°ΡΠ°Π±ΡΠΊΠΈ. ΠΡΡΠ²ΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ react-native-cli. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΠΎΠ²Π°:
$ react-native init multiLanguage
$ cd ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ΅Π½
ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
ΠΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ react-native-localize, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
$ yarn add react-native-localize
ΠΠΊΠΎ ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΎΠ½Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ,
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° react-native-localize Π΄Π°Π²Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎ ΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π΄ΡΡΠ³Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° - i18n.
Π‘ΡΠ°ΡΠΈΡΡΠ° ΠΎΠΏΠΈΡΠ²Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ°
$ ΠΏΡΠ΅ΠΆΠ΄Π° Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ i18n-js
Π, ΡΡΠΉ ΠΊΠ°ΡΠΎ i18n-js Π½Π΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ lodash.memoize Π·Π° ΡΠΎΠ²Π°:
$ yarn add lodash.memoize
Π Π°Π±ΠΎΡΠ° Ρ ΠΏΡΠ΅Π²ΠΎΠ΄ΠΈ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Ρ Π΄ΡΡΠ³ΠΈ Π΅Π·ΠΈΡΠΈ, ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄ΠΈ Π² src, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠΈ JSON ΡΠ°ΠΉΠ»Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ Π΅Π·ΠΈΡΠΈΡΠ΅.
1. en.json Π·Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ;
2. fr.json Π·Π° ΡΡΠ΅Π½ΡΠΊΠΈ;
3. ar.json Π·Π° Π°ΡΠ°Π±ΡΠΊΠΈ.
Π’Π΅Π·ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ JSON ΠΎΠ±Π΅ΠΊΡΠΈ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠ»ΡΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π·ΠΈΠΊ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ (ΡΡΠΎΠΉΠ½ΠΎΡΡ) Π΅ ΡΠ΅ΠΊΡΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
ΠΠ½Π³Π»ΠΈΠΉΡΠΊΠΈ:
{ "hello": "ΠΠ΄ΡΠ°Π²Π΅ΠΉ ΡΠ²ΡΡ!"}
Π€ΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ
{ "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;
};
Π, ΡΠ΅Π³Π° Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡ ΠΊΠ»Π°ΡΠ° App:
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().
Π Π½Π°ΠΊΡΠ°Ρ, hello ΡΠ΅ Π²ΡΡΡΠ° Π² render() ΡΡΠ΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° 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