React Native рдордзреНрдпреЗ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рд╣рд┐рдгреЗ

React Native рдордзреНрдпреЗ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рд╣рд┐рдгреЗ

рдирд╡реАрди рджреЗрд╢ рдЖрдгрд┐ рдкреНрд░рджреЗрд╢рд╛рдВрдЪрд╛ рд╢реЛрдз рдШреЗрдгрд╛рд▒реНрдпрд╛ рдЖрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдХрдВрдкрдиреНрдпрд╛рдВрд╕рд╛рдареА рдЙрддреНрдкрд╛рджрди рд╕реНрдерд╛рдирд┐рдХреАрдХрд░рдг рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рддреНрдпрд╛рдЪрдкреНрд░рдорд╛рдгреЗ рдореЛрдмрд╛рдИрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рд╕реНрдерд╛рдирд┐рдХреАрдХрд░рдг рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╡рд┐рдХрд╛рд╕рдХрд╛рдиреЗ рдЖрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рд╡рд┐рд╕реНрддрд╛рд░ рд╕реБрд░реВ рдХреЗрд▓реНрдпрд╛рд╕, рджреБрд╕рд▒реНрдпрд╛ рджреЗрд╢рд╛рддреАрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдореВрд│ рднрд╛рд╖реЗрдд рдЗрдВрдЯрд░рдлреЗрд╕рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рджреЗрдгреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рдкреЕрдХреЗрдЬ рд╡рд╛рдкрд░реВрди рд░рд┐рдЕреЕрдХреНрдЯ рдиреЗрдЯрд┐рд╡реНрд╣ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░реВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдиреЗрдЯрд┐рд╡реНрд╣-рд╕реНрдерд╛рдирд┐рдХреАрдХрд░рдг.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рд╢реИрдХреНрд╖рдгрд┐рдХ рдСрдирд▓рд╛рдЗрди рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо "рдкреНрд░реЛрдлреЗрд╢рди рдЬрд╛рд╡рд╛ рдбреЗрд╡реНрд╣рд▓рдкрд░".
рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рдХреМрд╢рд▓реНрдпреЗ

рд╣рд╛ рд▓реЗрдЦ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ 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

рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рд▓реНрдпрд╛рд╕, рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдореЕрдиреНрдпреБрдЕрд▓ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ.

рд░рд┐рдЕреЕрдХреНрдЯ-рдиреЗрдЯрд┐рд╡реНрд╣-рд▓реЛрдХрд▓рд╛рдЗрдЭ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд┐рдХрд╕рдХрд╛рд▓рд╛ рдмрд╣реБрднрд╛рд╖рд┐рдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рджреЗрддреЗ. рдкрдг рддрд┐рд▓рд╛ рдЖрдгрдЦреА рдПрдХрд╛ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреА рдЧрд░рдЬ рдЖрд╣реЗ - i18n.

рд╣рд╛ рд▓реЗрдЦ рд╡рд╛рдкрд░рд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ I18n.js JavaScript рдордзреНрдпреЗ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

$ рд╕реВрдд i18n-js рдЬреЛрдбрд╛

рдмрд░рдВ, i18n-js рдХреЕрд╢рд┐рдВрдЧ рдХрд┐рдВрд╡рд╛ рдореЗрдореЛрд▓рд╛рдпрдЭреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдд рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ, рдореА рдпрд╛рд╕рд╛рдареА lodash.memoize рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджреЗрддреЛ:

$ рдпрд╛рд░реНрди lodash.memoize рдЬреЛрдбрд╛

рднрд╛рд╖рд╛рдВрддрд░рд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЗрддрд░ рднрд╛рд╖рд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо src рдордзреНрдпреЗ рдЕрдиреБрд╡рд╛рдж рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдирдВрддрд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖реЗрд╕рд╛рдареА рддреАрди JSON рдлрд╛рдЗрд▓реНрд╕.

1. рдЗрдВрдЧреНрд░рдЬреАрд╕рд╛рдареА en.json;

2. рдлреНрд░реЗрдВрдЪрд╕рд╛рдареА fr.json;

3. рдЕрд░рдмреА рд╕рд╛рдареА ar.json.

рдпрд╛ рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдХреА рдЖрдгрд┐ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрд╕рддрд╛рдд. рдХреА рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖реЗрд╕рд╛рдареА рд╕рдорд╛рди рдЕрд╕реЗрд▓. рддреЗ рдордЬрдХреВрд░ рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ.

рдореВрд▓реНрдп рд╣рд╛ рдордЬрдХреВрд░ рдЖрд╣реЗ рдЬреЛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рджрд░реНрд╢рд╡рд┐рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд╛:

{"hello": "Hello World!"}

рдлреНрд░рд╛рдиреНрд╕рд┐рд╢

{"рд╣реЕрд▓реЛ": "рд╕реЕрд▓рдЯ рд▓реЗ рдореЛрдВрдбреЗ!"}

рдНрд░рд╛рдмрд┐рдХ

{ "рд╣реЕрд▓реЛ": "╪г┘З┘Д╪з┘Л ╪и╪з┘Д╪╣╪з┘Д┘Е"}

рдЖрдкрдг рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдЗрддрд░ рднрд╛рд╖рд╛ рдЬреЛрдбреВ рд╢рдХрддрд╛.

рдореБрдЦреНрдп рдХреЛрдб

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рддреБрдореНрд╣рд╛рд▓рд╛ 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() translate() рд╡рд╛рдкрд░реВрди рдЖрдгрд┐ рддреНрдпрд╛рдд рдПрдХ рдХреА рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛрдбреВрди рд╣реЕрд▓реЛ рдкрд░рдд рдХрд░рддреЗ. рдпрд╛ рдЪрд░рдгрд╛рдВрдирдВрддрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдгрддреА рднрд╛рд╖рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рд╣реЗ "рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕" рдЖрдгрд┐ рддреНрдпрд╛рдордзреНрдпреЗ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕реЗрд▓.

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ

рднрд╛рд╖рд╛рдВрддрд░ рдХрд╕реЗ рдЪрд╛рд▓рддреЗ рддреЗ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреА рд╣реАрдЪ рд╡реЗрд│ рдЖрд╣реЗ.

рдкреНрд░рдердо, рдЖрдореНрд╣реА рдЯрд╛рдЗрдк рдХрд░реВрди рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрд┐рдВрд╡рд╛ рдЗрдореНрдпреБрд▓реЗрдЯрд░рдордзреНрдпреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХрд░рддреЛ

$ react-native run-ios
$ react-native run-android

рд╣реЗ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕реЗрд▓:

React Native рдордзреНрдпреЗ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рд╣рд┐рдгреЗ

рдЖрддрд╛ рддреБрдореНрд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХрд░реВрди рднрд╛рд╖рд╛ рдлреНрд░реЗрдВрдЪрдордзреНрдпреЗ рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддрд╛.

React Native рдордзреНрдпреЗ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рд╣рд┐рдгреЗ

рдЖрдореНрд╣реА рдЕрд░рдмреА рдмрд░реЛрдмрд░рдЪ рдХрд░рддреЛ, рддреНрдпрд╛рдд рдХрд╛рд╣реА рдлрд░рдХ рдирд╛рд╣реА.

рдЕрдЬреВрди рддрд░реА рдЫрд╛рди рдЖрд╣реЗ.

рдкрд░рдВрддреБ рдЖрдкрдг рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рднрд╛рд╖рд╛ рдирд┐рд╡рдбрд▓реНрдпрд╛рд╕ рдХрд╛рдп рд╣реЛрдИрд▓ рдЬреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдд рдХреЛрдгрддреЗрд╣реА рднрд╛рд╖рд╛рдВрддрд░ рдирд╛рд╣реА?

рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА FindBestLanguage рдЪреЗ рдХрд╛рд░реНрдп рд╕рд░реНрд╡ рдЙрдкрд▓рдмреНрдз рднрд╛рд╖рд╛рдВрдордзреВрди рдЗрд╖реНрдЯрддрдо рднрд╛рд╖рд╛рдВрддрд░ рдкреНрд░рджрд╛рди рдХрд░рдгреЗ рдЖрд╣реЗ. рдкрд░рд┐рдгрд╛рдореА, рдбреАрдлреЙрд▓реНрдЯ рднрд╛рд╖рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рдЖрдореНрд╣реА рдлреЛрди рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, iOS рдПрдореБрд▓реЗрдЯрд░рдордзреНрдпреЗ рдЖрдкрдг рднрд╛рд╖рд╛рдВрдЪрд╛ рдХреНрд░рдо рдкрд╛рд╣реВ рд╢рдХрддрд╛.

React Native рдордзреНрдпреЗ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рд╣рд┐рдгреЗ

рдирд┐рд╡рдбрд▓реЗрд▓реА рднрд╛рд╖рд╛ рдкрд╕рдВрддреАрдЪреА рднрд╛рд╖рд╛ рдирд╕рд▓реНрдпрд╛рд╕, FindBestAvailableLanguage рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд░рдд рдпреЗрддреЗ рдЬреЗрдгреЗрдХрд░реВрди рдбреАрдлреЙрд▓реНрдЯ рднрд╛рд╖рд╛ рджрд░реНрд╢рд╡рд┐рд▓реА рдЬрд╛рдИрд▓.

рдмреЛрдирд╕

react-native-localize рдордзреНрдпреЗ рдПрдХ API рдЖрд╣реЗ рдЬреЗ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рднрд╛рд╖рд╛ рдШрдЯрдХрд╛рдВрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдЖрдкрдг рдХрд╛рдо рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдХрд╛рдЧрджрдкрддреНрд░реЗ рддрдкрд╛рд╕рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ.

рдирд┐рд╖реНрдХрд░реНрд╖

рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рдорд╕реНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрд╣реБрднрд╛рд╖рд┐рдХ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. React-native-localize рд╣рд╛ рдПрдХ рдЙрддреНрддрдо рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ рдЬреЛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдЕреЕрдкрдЪрд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЖрдзрд╛рд░ рд╡рд╛рдврд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ.

рдкреНрд░рдХрд▓реНрдк рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдпреЗрдереЗ рдЖрд╣реЗ.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛