ααΆαααααΎααΌαααααΆααΈαααααααα·αααααΆαααΆααααααΆααααΆαααααααΆαααααα»αα αα»αα’ααααααΆαα·αααααααααααααααα αα·ααααααααααΈαα ααΌα
ααααΆαααααα ααΆαααααΎααΌαααααΆααΈαααααααΊααααΌαααΆααααααΆαααααααα·ααΈααΌααααααα ααααα·αααΎα’αααα’αα·ααααααα
αΆααααααΎααααααΈαααΆα’ααααααΆαα· ααΆααΆαααΆααααααΆααααΆαααααα»αααΆααααααα±ααα’αααααααΎααααΆααααΈαααααααα½αααααααααααΌαα±ααΆαααΎααααΈααααΎααΆαααΆαα½αα
ααα»α
αααααΆααααΆααΆααΆααααΎααααααα½αααα αα
αααα»αα’αααααααα ααΎαααΉααααααΎααααααα·ααΈ React Native αααααααΎαααα
αα
Skillbox ααααΆαα αααααα·ααααΆααΆαα’ααΈαααΊαα·α
"Profession Java Developer" .
ααΎαααααΉαα αααααΆααα’αααα’αΆαααΆααα’αααα "Habr" - ααΆααααα α»αααααα 10 rubles αα αααα α»αααααααααα»ααααααα·ααααΆ Skillbox ααΆαα½ααααααααΎαααααΌαααααααααααΆα "Habr" α
α§ααααααα·αααααΆα
ααΎααααΈαααααΈα’αααααααα α’αααααααΌαααΆαααααΆαααΆααΌαααααΆααααα»αααΆαααααΎααΆαααΆαα½α React Nativeα ααΎααααΈααααΆαααααα½αα’αααααΆαα½αααΉαααΆαααααααααααααΆαααΈαααααααα»αααααΎααΆα α’αααα’αΆα
ααααΎααΆα
ααΎαααΉαααααΌαααΆαααααα§ααααααααααα·ααΈααΆαααααα
- ααααΆαα v10.15.0
- npm α₯.α .α
- α’αααα 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 αααααΆαααΌα
ααΆααααααα
$ yarn αααααα react-native-localize
ααααα·αααΎααΆααααα αΆααΎαα‘αΎααααα»αα’αα‘α»ααααααααΎαααΆαααα‘αΎαα
αααααΆααα react-native-localize αααααα±ααα’αααα’αα·ααααααααΌααα·αααα·ααααΎααααΆαααα»αααΆααα α»ααΆααΆα ααα»ααααααΆαααααΌαααΆααααααΆααααα½αααααααααα - i18n α
α’αααααααααα·αααααΆα’αααΈααΆαααααΎααααΆαα
$ yarn αααααα i18n-js
ααΆααΆααααααΎαααΆαα, α αΆααααΆααααΈ i18n-js αα·ααααααααααΆαααααααΆααα¬ααΆαα αα αΆααααα»αααααΎα±ααααααΎ lodash.memoize αααααΆααααΆαααα:
$ yarn αααααα lodash.memoize
ααααΎααΆαααΆαα½αααΆααααααα
ααΎααααΈα±αααααααα·ααΈα’αΆα ααααΎααΆαααΆαα½αααΆααΆαααααααα ααααΌαα’αααααααΌααααααΎαααααΆααααααααα αααα»α src αααααΆααααα―αααΆα JSON α ααα½αααΈαααααΆααααΆααΆααΈαα½ααα
1. en.json αααααΆααααΆααΆα’ααααααα;
2. fr.json αααααΆααααΆααΆααΆααΆαα;
3. ar.json αααααΆααααΆααΆα’αΆαααΆααα
α―αααΆαααΆαααααααΆαααααα» JSON αααααΆαααΌααα αα·ααααααα αααααΉαααΉαααΌα ααααΆαααααΆααααΆααΆααΈαα½ααα ααΆααααΌαααΆαααααΎααααααααα·ααΈααΎααααΈαααα αΆαααααααΆαα’αααααα
αααααααΊααΆα’ααααααααααααΌαααΆααααα αΆααααα’αααααααΎααααΆααα
α’αααααααα
{"hello": "αα½ααααΈαα·ααααα!"}
ααΆααΆααΆααΆαα
{"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() αααααα αααααΊα αΆαααΆα ααααααΆααα§ααααα Android αααααΆααααΆαααΆαα»ααααΌααααααα αΆαααΎααααΈα±ααααΆαααααΆααααααΌαα’αΆα ααααααααΆααααΆαα
αααααΆααααα’αααααααΌαααααΆαααααΆααα ααααΈαα·ααΈααΆααααα componentWillUnmount()α
ααΆα α»αααααα render() αααα‘αα hello αααααααΎ translate() α αΎααααααα key parameter αα ααΆα αααααΆααααΈααα αΆαααΆααααα αααααα·ααΈααΉαα’αΆα "ααα" ααΆααΎααααΌαααΆαααΆααΆα’αααΈ αα·ααααα αΆαααΆααα αααα»αααΆα
ααΆαα αΆααααααΎααααααα·ααΈ
α₯α‘αΌαααααααααααααααααΌααα·αα·αααααΎαααΈαααααααααΆαααααααααααΎαααΆαα
ααααΌαααΎαααΎαααααΎαααΆααααααα·ααΈαα αααα»ααααααα·ααΈαααααααααΎ α¬αααααα·ααΈααααΆααααΆααααααΆααααα αΌα
$ 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