React Native рдорд╛ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрджреИ

React Native рдорд╛ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрджреИ

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

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╢реИрдХреНрд╖рд┐рдХ рдЕрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо "рдкреЗрд╢реЗ рдЬрд╛рднрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛".
рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

рдЙрдкрдХрд░рдг рд░ рд╕реАрдкрд╣рд░реВ

рдпрд╕ рд▓реЗрдЦрд▓рд╛рдИ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдиреЗрдЯрд┐рднрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЖрдзрд╛рд░рднреВрдд рд╕реАрдкрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред рдХрд╛рдо рдЧрд░реНрдиреЗ рдореЗрд╕рд┐рдирдХреЛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдЖрдлреВрд▓рд╛рдИ рдкрд░рд┐рдЪрд┐рдд рдЧрд░реНрди, рддрдкрд╛рдИрдВ рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН.

рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рдпреА рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ:

  • рдиреЛрдб v10.15.0
  • npm 6.4.1
  • рдзрд╛рдЧреЛ 1.16.0
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдерд╛рдиреАрдп реж.релреп.реп
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдерд╛рдиреАрдп-рд╕реНрдерд╛рдиреАрдпрдХрд░рдг 1.1.3
  • i18n-js 3.3.0

рд╕реБрд░реБ рдЧрд░реНрджреИ

рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рдЕрдВрдЧреНрд░реЗрдЬреА, рдлреНрд░реЗрдиреНрдЪ рд░ рдЕрд░рдмреАрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрдиреЗрдЫред рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореА react-native-cli рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирдпрд╛рдБ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдЙрдБрдЫреМрдВред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдпреЛ рдЯрд╛рдЗрдк рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

$ react-native init multiLanguage
$ cd рдмрд╣реБрднрд╛рд╖рд╛

рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдердкреНрджреИ

рдкрд╣рд┐рд▓реЛ рдЪрд░рдг рдирд┐рдореНрди рдЯрд╛рдЗрдк рдЧрд░реЗрд░ react-native-localize рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБ рд╣реЛ:
$ yarn react-native-localize рдердкреНрдиреБрд╣реЛрд╕реН

рдпрджрд┐ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХреНрд░рдордорд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реНрдЫрдиреН, рдпреЛ рд╕реНрдерд╛рдкрдирд╛ рдкреБрд╕реНрддрд┐рдХрд╛ рдкрдвреНрди рд▓рд╛рдпрдХ рдЫ.

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдерд╛рдиреАрдп-рд╕реНрдерд╛рдиреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпрд▓реЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓рд╛рдИ рдмрд╣реБрднрд╛рд╖реА рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рджрд┐рдиреНрдЫред рддрд░ рдЙрдирд▓рд╛рдИ рдЕрд░реНрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪрд╛рд╣рд┐рдиреНрдЫ - i18nред

рдпреЛ рд▓реЗрдЦ рдкреНрд░рдпреЛрдЧ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫ I18n.js рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреАред

$ рдпрд╛рд░реНрди i18n-js рдердкреНрдиреБрд╣реЛрд╕реН

рдареАрдХ рдЫ, рдХрд┐рдирдХрд┐ i18n-js рд▓реЗ рдХреНрдпрд╛рд╕рд┐рдЩ рд╡рд╛ рдореЗрдореЛрдЗрдЬреЗрд╢рди рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрди, рдо рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ lodash.memoize рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫреБ:

$ рдпрд╛рд░реНрди lodash.memoize рдердкреНрдиреБрд╣реЛрд╕реН

рдЕрдиреБрд╡рд╛рдж рд╕рдВрдЧ рдХрд╛рдо

рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ src рднрд┐рддреНрд░ рдЕрдиреБрд╡рд╛рдж рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛рдХреЛ рд▓рд╛рдЧрд┐ рддреАрди JSON рдлрд╛рдЗрд▓рд╣рд░реВред

1. рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЛ рд▓рд╛рдЧреА en.json;

2. рдлреНрд░рд╛рдиреНрд╕реЗрд▓реА рд▓рд╛рдЧрд┐ fr.json;

3. рдЕрд░рдмреА рд▓рд╛рдЧрд┐ ar.jsonред

рдпреА рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рдХреБрдЮреНрдЬреА рд░ рдорд╛рдирд╣рд░реВ рд╕рд╣рд┐рдд JSON рд╡рд╕реНрддреБрд╣рд░реВ рдЫрдиреНред рдХреБрдЮреНрдЬреА рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рд╣реБрдиреЗрдЫред рдпреЛ рдкрд╛рда рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рдорд╛рди рднрдиреЗрдХреЛ рдкрд╛рда рд╣реЛ рдЬреБрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рджреЗрдЦрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЕрдВрдЧреНрд░реЗрдЬреА:

{"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() рд╕рдХреНрд░рд┐рдп рдЧрд░реНрдЫред рдпреЛ рдПрдиреНрдбреНрд░реЛрдЗрдб рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐рдирдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдзреНрдпрд╛рди рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдШрдЯрдХ рд░реЗрдиреНрдбрд░ рд╣реБрдиреБрдкрд░реНрдЫред

рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрдВрд▓реЗ componentWillUnmount() рд╡рд┐рдзрд┐рдмрд╛рдЯ рд╕реБрдиреНрди рд╣рдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЕрдиреНрддрдорд╛, render() translate() рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░ рдпрд╕рдорд╛ рдХреБрдЮреНрдЬреА рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдердкреЗрд░ рдирдорд╕реНрдХрд╛рд░ рдлрд░реНрдХрд╛рдЙрдБрдЫред рдпреА рдЪрд░рдгрд╣рд░реВ рдкрдЫрд┐, рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдХреБрди рднрд╛рд╖рд╛ рдЖрд╡рд╢реНрдпрдХ рдЫ "рдмреБрдЭреНрди" рд░ рдпрд╕рдорд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫред

рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд╖реЗрдкрдг

рдЕрдм рдЕрдиреБрд╡рд╛рдж рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛред

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

$ react-native run-ios
$ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдиреЗрдЯрд┐рдн рд░рди-рдПрдиреНрдбреНрд░реЛрдЗрдб

рдпреЛ рдХреЗрд╣рд┐ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреЗрдЫ:

React Native рдорд╛ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрджреИ

рдЕрдм рддрдкрд╛рдЗрдБ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд▓рдиреНрдЪ рдЧрд░реЗрд░ рднрд╛рд╖рд╛рд▓рд╛рдИ рдлреНрд░реЗрдиреНрдЪрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

React Native рдорд╛ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрджреИ

рд╣рд╛рдореА рдЕрд░рдмреА рд╕рдВрдЧ рд╕рдорд╛рди рдХреБрд░рд╛ рдЧрд░реНрдЫреМрдВ, рдХреБрдиреИ рдлрд░рдХ рдЫреИрдиред

рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рдзреЗрд░реИ рд░рд╛рдореНрд░реЛред

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

рдпреЛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдБрдЫ рдХрд┐ FindBestLanguage рдХреЛ рдХрд╛рд░реНрдп рд╕рдмреИ рдЙрдкрд▓рдмреНрдзрд╣рд░реВрдмрд╛рдЯ рдЗрд╖реНрдЯрддрдо рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБ рд╣реЛред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреЗрдЫред

рд╣рд╛рдореА рдлреЛрди рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЖрдИрдУрдПрд╕ рдЗрдореБрд▓реЗрдЯрд░рдорд╛ рддрдкрд╛рдИрд▓реЗ рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рдХреНрд░рдо рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

React Native рдорд╛ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрджреИ

рдпрджрд┐ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рднрд╛рд╖рд╛ рд░реБрдЪрд╛рдЗрдПрдХреЛ рднрд╛рд╖рд╛ рд╣реЛрдЗрди рднрдиреЗ, FindBestAvailableLanguage рд▓реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд░реНрдХрд╛рдЙрдБрдЫ рддрд╛рдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рджреЗрдЦрд╛рдЗрдиреНрдЫред

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

react-native-localize рд╕рдБрдЧ рдПрдЙрдЯрд╛ API рдЫ рдЬрд╕рд▓реЗ рднрд╛рд╖рд╛ рддрддреНрд╡рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рдХрд╛рдо рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐, рдпреЛ рдХрд╛рдЧрдЬрд╛рдд рдмрд╛рд╣рд┐рд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд▓рд╛рдпрдХ рдЫ.

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

рдЖрд╡реЗрджрди рдХреБрдиреИ рдкрдирд┐ рд╕рдорд╕реНрдпрд╛ рдмрд┐рдирд╛ рдмрд╣реБрднрд╛рд╖реА рдмрдирд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред React-native-localize рдПрдЙрдЯрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрдлреНрдиреЛ рдПрдкрдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рдЫ.

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди