В этом посте я расскажу вам, как легко интегрировать многоязычную поддержку с React Native в ваше приложение.
С библиотекой, которую я использую для этого, react-i18next и i18next
Во-первых, создайте новый проект React Native.
npx react-native init multiLanguage
Давайте добавим пакеты в ваше новое приложение
cd multiLanguage npm i react-i18next i18next
Создайте новую папку в корневом каталоге, она называется «Переводы». и создайте файл index.js в папке «Переводы».
После создания новой папки она вызывает «ресурсы» в разделе «Переводы» и создает файл 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