
Lokalisering av produkter Àr mycket viktigt för internationella företag som behöver etablera sig i nya lÀnder och regioner. PÄ samma sÀtt Àr lokalisering nödvÀndig för mobilapplikationer. Om utvecklaren pÄbörjar en internationell expansion Àr det viktigt att ge anvÀndare frÄn ett annat land möjligheten att anvÀnda grÀnssnittet pÄ sitt modersmÄl. I denna artikel kommer vi att skapa en React Native-app med hjÀlp av paketet .
Skillbox rekommenderar: Utbildningskurs online .
PĂ„minnelse: för alla lĂ€sare av "Habr" â 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".
Verktyg och fÀrdigheter
För att förstÄ denna artikel behövs grundlÀggande kunskaper om React Native. För att bekanta dig med instÀllningarna för din arbetsmaskin kan du .
Vi kommer att behöva följande versioner av programverktyg:
- 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
Vi börjar
Vi kommer att skapa en app som stödjer engelska, franska och arabiska. Först skapar vi ett nytt projekt med hjÀlp av react-native-cli. I terminalen skriver vi följande:
$ react-native init multiLanguage
$ cd multiLanguage
LÀgg till nödvÀndiga bibliotek
Först behöver vi installera react-native-localize genom att skriva följande:
$ yarn add react-native-localize
Om det uppstÄr problem under installationen, .
Biblioteket react-native-localize ger utvecklaren tillgĂ„ng till flersprĂ„kiga funktioner. Men det behöver ytterligare ett bibliotek â i18n.
I artikeln beskrivs anvÀndningen för att sÀkerstÀlla översÀttning i JavaScript.
$ yarn add i18n-js
Eftersom i18n-js inte erbjuder caching eller memoization, föreslÄr jag att vi anvÀnder lodash.memoize för detta:
$ yarn add lodash.memoize
Arbeta med översÀttningar
För att appen ska kunna hantera andra sprÄk, mÄste du först skapa en mapp som heter translations inuti src, och sedan tre JSON-filer för varje sprÄk.
1. en.json för engelska;
2. fr.json för franska;
3. ar.json för arabiska.
Dessa filer innehÄller JSON-objekt med nycklar och vÀrden. Nyckeln kommer att vara densamma för varje sprÄk. Den anvÀnds av appen för att visa textinformation.
VÀrdet (value) Àr den text som ska visas för anvÀndaren.
Engelska:
{ "hello": "Hello World!"}
Franska
{ "hello": "Salut le Monde!"}
Arabiska
{ "hello": "ŰŁÙÙŰ§Ù ŰšŰ§ÙŰčۧÙÙ "}
PÄ samma sÀtt kan du lÀgga till andra sprÄk.
Huvudkod
Vid detta stadium behöver vi öppna filen App.js och lÀgga till importen:
import React from "react";
import * as RNLocalize from "react-native-localize";
import i18n from "i18n-js";
import memoize from "lodash.memoize"; // AnvÀnds för caching/memoization för bÀttre prestanda
import {
I18nManager,
SafeAreaView,
ScrollView,
StyleSheet,
Text,
View
} from "react-native";DÀrefter lÀggs hjÀlpfunktioner och konstanter till som kommer att vara anvÀndbara senare.
const translationGetters = {
// lazy requires (metro bundler stödjer inte 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 om ingen tillgÀnglig sprÄk passa
const fallback = { languageTag: "en", isRTL: false };
const { languageTag, isRTL } =
RNLocalize.findBestAvailableLanguage(Object.keys(translationGetters)) ||
fallback;
// rensa översÀttningscache
translate.cache.clear();
// uppdatera layoutens riktning
I18nManager.forceRTL(isRTL);
// stÀll in i18n-js konfiguration
i18n.translations = { [languageTag]: translationGetters[languageTag]() };
i18n.locale = languageTag;
};Nu ska vi skapa klasskomponenten App:
export default class App extends React.Component {
constructor(props) {
super(props);
setI18nConfig(); // stÀll in initial konfiguration
}
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
}
});Första elementen â setI18nConfig() â sĂ€tter den initiala konfigurationen.
Sedan i componentDidMount() behövs en lyssnare för hÀndelser, detta element kommer att övervaka uppdateringar och anropa handleLocalizationChange() nÀr de intrÀffar.
Metoden handleLocalizationChange() aktiverar setI18nConfig() och forceUpdate(). Detta Àr nödvÀndigt för Android-enheter, eftersom komponenten mÄste renderas för att Àndringarna ska bli mÀrkbara.
DÀrefter mÄste lyssnaren tas bort i metoden componentWillUnmount().
Slutligen returnerar render() hello genom att anvÀnda translate() och lÀgga till parameter key. Efter dessa ÄtgÀrder kommer applikationen att kunna "förstÄ" vilket sprÄk som behövs och visa meddelanden pÄ det.
Köra applikationen
Nu Àr det dags att kontrollera hur översÀttningen fungerar.
Först startar vi applikationen i simulatorn eller emulators genom att skriva
$ react-native run-ios
$ react-native run-android
Det kommer att se ut ungefÀr sÄ hÀr:

Nu kan du prova att byta sprÄk till franska genom att starta appen igen.

Med arabiska gör vi samma sak, det finns ingen skillnad.
SÄ hÀr lÄngt gÄr allt bra.
Men vad hÀnder om du vÀljer ett slumpmÀssigt sprÄk som inte finns i appen?
Det visar sig att uppgiften findBestLanguage Àr att erbjuda den bÀsta översÀttningen av alla som Àr tillgÀngliga. Resultatet blir att det sprÄk som har stÀllts in som standard visas.
Det handlar om telefonens instÀllningar. Till exempel i iOS-emulatorn kan du se sprÄkordningen.

Om det valda sprÄket inte Àr det föredragna, returnerar findBestAvailableLanguage undefined, sÄ det sprÄk som Àr instÀllt som standard kommer att visas.
Bonus
react-native-localize har ett API som ger tillgÄng till mÄnga sprÄkkomponenter. Innan du börjar arbeta, .
Slutsatser
Appen kan göras flersprÄkig utan större problem. React-native-localize Àr ett utmÀrkt alternativ som gör det möjligt att nÄ en bredare publik.
Projektets kÀllkod .
Skillbox rekommenderar:
- TvÄÄrig praktisk kurs .
- Onlinekurs .
- Praktisk Ärskurs .
KĂ€lla: habr.com
