В тази публикация в блога ще ви кажа как лесно да интегрирате многоезична поддръжка с react native във вашето приложение.

С библиотеката, която използвам за това, react-i18next и i18next

Първо, създайте нов роден проект за реакция

npx react-native init multiLanguage

Нека добавим пакети към новото ви приложение

cd multiLanguage
npm i react-i18next i18next

Създайте нова папка в основната си директория, тя се нарича „Преводи“. и създайте файл index.js във вашата папка Translations.

След като създадете нова папка, тя извиква „ресурси“ под Преводи и създава файл index.js във вашата папка с ресурси.

След това създайте кои езици искате да превеждате, нека създадем техните файлове. Например en.js за английски fr.js за френски

Тук структурата на вашия файл трябва да е така

Отворете вашите Translations/index.js и импортирайте библиотеки

import i18n from 'i18next';
import {initReactI18next} from 'react-i18next';

Сега импортирайте вашата папка с ресурси.

import * as resources from './resources';

Отворете вашия файл resources/index.js и импортирайте вашите файлове за превод.

export {default as en} from './en';
export {default as ar} from './ar';
export {default as fr} from './fr';
export {default as de} from './de';
export {default as tr} from './tr';

Нека настроим библиотеката i18next към вашия Translations/index.js

i18n.use(initReactI18next).init({
  compatibilityJSON: 'v3',
  resources: {
    ...Object.entries(resources).reduce(
      (acc, [key, value]) => ({
        ...acc,
        [key]: {
          translation: value,
        },
      }),
      {},
    ),
  },
  fallbackLng: 'en',
});

export default i18n;

Ето вашата пълна версия на Translations/index.js

import i18n from 'i18next';
import {initReactI18next} from 'react-i18next';
import * as resources from './resources';

i18n.use(initReactI18next).init({
  compatibilityJSON: 'v3',
  resources: {
    ...Object.entries(resources).reduce(
      (acc, [key, value]) => ({
        ...acc,
        [key]: {
          translation: value,
        },
      }),
      {},
    ),
  },
  fallbackLng: 'en',
});

export default i18n;

Импортирайте преводи към вашия App.js

import "./Translations";

Ето вашия пълен пример за код за App.js


import React from 'react';
import {SafeAreaView, Text, View} from 'react-native';
import './Translations';

const App = () => {
  return (
    <SafeAreaView>
      <View>
        <Text>Test</Text>
      </View>
    </SafeAreaView>
  );
};

export default App;

Сега нека добавим малко текст към вашите файлове за преводи, ето вашия пример Translations/resources/en.js

export default {
  home: {
    title: 'Home',
    description: 'This is the home page',
  },
};

Ето още един език от Турция. Искам да използвам и tr.js

export default {
  home: {
    title: 'Anasayfa',
    description: 'Burası Anasayfadır',
  },
};

Сега импортирайте, използвайте Превод от библиотеката react-i18next вашия App.js файл

Използване на пример за превод като този

 <Text style={styles.title}>{t('home.title')}</Text>
   <Text style={styles.desc}>{t('home.description')}</Text>

Базов пример за App.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */

import React from 'react';
import {SafeAreaView, StyleSheet, Text, View} from 'react-native';
import './Translations';
import {useTranslation} from 'react-i18next';

const App = () => {
  const {t} = useTranslation();
  return (
    <SafeAreaView>
      <View style={styles.baseContainer}>
        <Text style={styles.title}>{t('home.title')}</Text>
        <Text style={styles.desc}>{t('home.description')}</Text>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  baseContainer: {
    width: '100%',
    height: '100%',
    justifyContent: 'center',
    alignItems: 'center',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: 'black',
  },
  desc: {
    fontSize: 18,
    color: 'black',
  },
});
export default App;

Нека променим езика, когато натиснете някой бутон.

Трябва да използваме i18n вътре в useTranslation

  const {t, i18n} = useTranslation();

Това е нашата функция, когато щракнете върху бутона за промяна на езика

 const changeLangToTr = () => {
    i18n.changeLanguage('tr');
  };
  const changeLangToEn = () => {
    i18n.changeLanguage('en');
  };

Ето пълния изходен код за App.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */

import React from 'react';
import {Button, SafeAreaView, StyleSheet, Text, View} from 'react-native';
import './Translations';
import {useTranslation} from 'react-i18next';

const App = () => {
  const {t, i18n} = useTranslation();

  const changeLangToTr = () => {
    i18n.changeLanguage('tr');
  };
  const changeLangToEn = () => {
    i18n.changeLanguage('en');
  };
  return (
    <SafeAreaView>
      <View style={styles.baseContainer}>
        <Text style={styles.title}>{t('home.title')}</Text>
        <Text style={styles.desc}>{t('home.description')}</Text>
        <Button title={t('home.buttonTr')} onPress={() => changeLangToTr()} />
        <Button title={t('home.buttonEn')} onPress={() => changeLangToEn()} />
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  baseContainer: {
    width: '100%',
    height: '100%',
    justifyContent: 'center',
    alignItems: 'center',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: 'black',
  },
  desc: {
    fontSize: 18,
    color: 'black',
  },
});
export default App;

Това е всичко, ние завършихме многоезичното приложение на вашето React Native.

Можете да намерите пълния изходен код в моят акаунт в github