αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž αž»αž—αžΆαžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ React Native

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž αž»αž—αžΆαžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ React Native

αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžΈαž™αž€αž˜αŸ’αž˜αž•αž›αž·αžαž•αž›αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž’αž“αŸ’αžαžšαž‡αžΆαžαž·αžŠαŸ‚αž›αžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž‘αŸαžŸ αž“αž·αž„αžαŸ†αž”αž“αŸ‹αžαŸ’αž˜αžΈαŸ—αŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αžŠαŸ‚αžš αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžΈαž™αž€αž˜αŸ’αž˜αž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αž„αŸ’αžšαžΈαž€αž‡αžΆαž’αž“αŸ’αžαžšαž‡αžΆαžαž· αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αžΈαž”αŸ’αžšαž‘αŸαžŸαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αžΌαžœαž±αž€αžΆαžŸαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž‡αžΆαž—αžΆαžŸαžΆαž€αŸ†αžŽαžΎαžαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React Native αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž‰αŸ’αž…αž”αŸ‹ react-native-localize.

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 αŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ I18n.js αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆ JavaScript αŸ”

$ 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

αžœαžΆαž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž αž»αž—αžΆαžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ React Native

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžΆαž€αž›αŸ’αž”αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž—αžΆαžŸαžΆαž‘αŸ…αž‡αžΆαž—αžΆαžŸαžΆαž”αžΆαžšαžΆαŸ†αž„αžŠαŸ„αž™αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž αž»αž—αžΆαžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ React Native

αž™αžΎαž„β€‹αž’αŸ’αžœαžΎβ€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž—αžΆαžŸαžΆβ€‹αž’αžΆαžšαŸ‰αžΆαž”αŸ‹ αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž’αŸ’αžœαžΈβ€‹αžαž»αžŸβ€‹αž‚αŸ’αž“αžΆβ€‹αž“αŸ„αŸ‡β€‹αž‘αŸαŸ”

αž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡αž›αŸ’αž’αžŽαžΆαžŸαŸ‹αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž—αžΆαžŸαžΆαž…αŸƒαžŠαž“αŸ’αž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ?

αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹ findBestLanguage αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αžŠαŸαž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž—αžΆαžŸαžΆαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ”

αž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜ iOS αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαž—αžΆαžŸαžΆαŸ”

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž αž»αž—αžΆαžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ React Native

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαžŸαžΆαžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž—αžΆαžŸαžΆαžŠαŸ‚αž›αž–αŸαž‰αž…αž·αžαŸ’αžαž“αŸ„αŸ‡ findBestAvailableLanguage αžαŸ’αžšαž‘αž”αŸ‹αž˜αž·αž“αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž—αžΆαžŸαžΆαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ”

αž”αŸ’αžšαžΆαž€αŸ‹αžšαž„αŸ’αžœαžΆαž“αŸ‹

react-native-localize αž˜αžΆαž“ API αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž’αžΆαžαž»αž—αžΆαžŸαžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αŸ” αž˜αž»αž“αž–αŸαž›αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžš, αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž―αž€αžŸαžΆαžš.

αž€αžΆαžšαžšαž€αžƒαžΎαž‰

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αž’αŸ’αžœαžΎαž–αž αž»αž—αžΆαžŸαžΆαžŠαŸ„αž™αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαž‘αžΎαž™αŸ” React-native-localize αž‚αžΊαž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸαž›αŸ’αž’αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž–αž„αŸ’αžšαžΈαž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž‚αž˜αŸ’αžšαŸ„αž„ αž“αŸ…β€‹αž‘αžΈαž“αŸαŸ‡.

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹