Vi skriver en flersprÄkig applikation med React Native

Vi skriver en flersprÄkig applikation med React Native

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 react-native-localize.

Skillbox rekommenderar: Utbildningskurs online "Yrket Java-utvecklare".
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 anvÀnda den officiella instruktionen.

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, Àr det bra att studera installationsmanualen.

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 I18n.js 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:

Vi skriver en flersprÄkig applikation med React Native

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

Vi skriver en flersprÄkig applikation med React Native

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.

Vi skriver en flersprÄkig applikation med React Native

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, kan det vara bra att bekanta sig med dokumentationen..

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 finns hÀr..

Skillbox rekommenderar:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster