
Toodete lokaliseerimine on vÀga tÀhtis rahvusvahelistele ettevÔtetele, kes siseneb uutele riikidele ja piirkondadele. Sarnaselt on lokaliseerimist vaja ka mobiilirakendustele. Kui arendaja alustab rahvusvahelist laienemist, on oluline, et kasutajad teises riigis saaks töötada liidesega oma emakeeles. Selles artiklis loome React Native'i rakenduse, kasutades paketti .
Skillbox soovitab: Haridusalane veebikursus .
Tuletame meelde: kĂ”igile «Habr» lugejatele â 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».
Tööriistad ja oskused
Selle artikli mÔistmiseks on vaja baastaset React Native'i vÀljatöötamisel. Töökoha seadistamisega tutvumiseks vÔib .
Me vajame jÀrgmisi tarkvarainstrumentide versioone:
- Node v10.15.0
- npm 6.4.1
- yarn 1.16.0
- react-native 0.59.9
- react-native-localize 1.1.3
- i18n-js 3.3.0
Alustame
Loome rakenduse, mis toetab inglise, prantsuse ja araabia keelt. Esiteks loome uue projekti, kasutades react-native-cli. Selleks tuleb terminalis sisestada jÀrgnev:
$ react-native init multiLanguage
$ cd multiLanguage
Lisame vajalikud teegid
Esmalt tuleb installida react-native-localize, sisestades jÀrgnev:
$ yarn add react-native-localize
Kui installimise kÀigus tekivad probleemid, .
Teek react-native-localize annab arendajale juurdepÀÀsu mitmekeelsele funktsionaalsusele. Kuid see vajab veel ĂŒhe teegi â i18n.
Artiklis kirjeldatakse selle kasutamist JavaScriptis tÔlgete tagamiseks.
$ yarn add i18n-js
Kuna i18n-js ei paku vahemÀlu ega meemoiseerimist, soovitan selle jaoks kasutada lodash.memoize:
$ yarn add lodash.memoize
TÔlgete haldamine
Kuna rakendus peab toetama ka teisi keeli, tuleb esmalt luua kaust translations kausta src sisse, seejĂ€rel â kolm JSON faili, igaĂŒhe jaoks eraldi keel.
1. en.json inglise keele jaoks;
2. fr.json prantsuse keele jaoks;
3. ar.json araabia keele jaoks.
Need failid sisaldavad JSON objekti, millel on vÔtmed ja vÀÀrtused. VÔti on iga keele jaoks sama. Seda kasutatakse rakenduses tekstilise informatsiooni kuvamiseks.
VÀÀrtus (value) on tekst, mida tuleb kasutajale nÀidata.
Inglise keel:
{ "hello": "Hello World!"}
Prantsuse keel
{ "hello": "Salut le Monde!"}
Araabia keel
{ "hello": "ŰŁÙÙŰ§Ù ŰšŰ§ÙŰčۧÙÙ "}
Samamoodi on vÔimalik lisada ka teisi keeli.
PÔhikood
Sellel etapil tuleb avada fail App.js ja lisada sinna import:
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";PĂ€rast seda lisatakse abifunktsioonid ja konstantsid, mis on tulevikus kasulikud.
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;
};Aga nĂŒĂŒd loome klassikomponendi 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 (
{translate("hello")}
);
}
}
const styles = StyleSheet.create({
safeArea: {
backgroundColor: "white",
flex: 1,
alignItems: "center",
justifyContent: "center"
},
value: {
fontSize: 18
}
});Esimene element â setI18nConfig() â seab algse konfiguratsiooni.
SeejĂ€rel peab componentDidMount() lisama sĂŒndmuste jĂ€lgimise, see element jĂ€lgib uuendusi ja kutsub handleLocalizationChange() vĂ€lja siis, kui need toimuvad.
Meetod handleLocalizationChange() aktiveerib setI18nConfig() ja forceUpdate(). See on vajalik Androidi seadmetes, kuna komponent tuleb renderdada, et muutused oleksid nÀhtavad.
SeejÀrel tuleks eemaldada jÀlgimine componentWillUnmount() meetodist.
LÔpuks tagastatakse render() meetodis hello, kasutades translate() ja lisades sellele parameetri key. PÀrast neid toiminguid suudab rakendus "mÔista", millist keelt on vaja, ja nÀitab sÔnumeid just sellel keeles.
Rakenduse kÀivitamine
NĂŒĂŒd on aeg kontrollida, kuidas tĂ”lge töötab.
Esiteks kÀivitame rakenduse simulaatoris vÔi emulaatoris, tippides
$ react-native run-ios
$ react-native run-android
See nÀeb vÀlja umbes nii:

NĂŒĂŒd saab proovida keelest vĂ€lja vahetada prantsuse keele, kĂ€ivitades seejĂ€rel rakenduse.

Araabia keele puhul teeme sama, vahet ei ole.
Praegu lÀheb kÔik hÀsti.
Aga mis juhtub, kui valida juhuslik keel, mille jaoks tÔlget rakenduses ei ole?
Selgub, et ĂŒlesanne findBestLanguage on pakkuda parimat vĂ”imalikku tĂ”lget. Tulemuseks kuvatakse keel, mis on vaikeseade.
Juttu on telefoni sÀttetest. NÀiteks iOS-i simulatores saab vaadata keelte jÀrjekorda.

Kui valitud keel ei ole eelistatud, tagastab findBestAvailableLanguage undefined, nii et kuvatakse see keel, mis on vaikeseade.
Boonus
react-native-localize-l on API, mis annab ligipÀÀsu suurele hulgale keeleelementidele. Enne alustamist .
JĂ€reldused
Rakenduse saab muuta mitmekeelseks ilma eriliste probleemideta. React-native-localize on suurepÀrane lahendus, mis vÔimaldab laiendada rakenduse kasutajate ringi.
Projekti lÀhtekood .
Skillbox soovitab:
- Kaks aastat praktilist kursust .
- Veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
