# react-native: Быстрый старт с React Native и Expo URL: https://generaltranslation.com/ru/docs/react-native/tutorials/quickstart-expo.mdx --- title: Быстрый старт с React Native и Expo description: Добавьте поддержку нескольких языков в приложение Expo менее чем за 10 минут --- К концу этого руководства ваше приложение Expo сможет отображать контент на нескольких языках, а пользователи — переключать язык через соответствующий переключатель. **Предварительные требования:** * Проект Expo (SDK 49+) * Node.js 18+ `gt-react-native` всё ещё находится на экспериментальной стадии и может работать не во всех проектах. Если вы столкнётесь с какими-либо проблемами, сообщите нам об этом, [создав issue на GitHub](https://github.com/generaltranslation/gt/issues). **Нужна автоматическая настройка?** Выполните `npx gt@latest`, чтобы настроить всё с помощью [мастера настройки](/docs/cli/init). Это руководство описывает ручную настройку. Ищете проект на React Native CLI без Expo? См. [быстрый старт для React Native](/docs/react-native/tutorials/quickstart). *** ## Шаг 1: Установите пакеты `gt-react-native` — библиотека, которая обеспечивает переводы в вашем приложении. `gt` — CLI-инструмент, который подготавливает переводы к продакшену. ```bash npm i gt-react-native npm i -D gt ``` ```bash yarn add gt-react-native yarn add --dev gt ``` ```bash bun add gt-react-native bun add --dev gt ``` ```bash pnpm add gt-react-native pnpm add --save-dev gt ``` *** ## Шаг 2: Создайте файл конфигурации переводов Создайте файл **`gt.config.json`** в корне проекта. В нём библиотеке указывается, какие языки вы поддерживаете: ```json title="gt.config.json" { "defaultLocale": "en", "locales": ["es", "fr", "ja"], "files": { "gt": { "output": "content/[locale].json" } } } ``` * **`defaultLocale`** — язык, на котором написано ваше приложение (исходный язык). * **`locales`** — языки, на которые вы хотите перевести приложение. Выберите любые из [списка поддерживаемых локалей](/docs/platform/supported-locales). * **`files.gt.output`** — путь, по которому CLI сохраняет файлы перевода. `[locale]` заменяется кодом каждого языка (например, `content/es.json`). *** ## Шаг 3: Настройте полифилы Среда выполнения JavaScript в React Native не включает API `Intl`, которые нужны `gt-react-native`. Проще всего использовать Babel-плагин, входящий в комплект. Добавьте его в конфигурацию Babel: ```js title="babel.config.js" const gtPlugin = require('gt-react-native/plugin'); const gtConfig = require('./gt.config.json'); module.exports = function (api) { api.cache(true); return { presets: ['babel-preset-expo'], plugins: [ [ gtPlugin, { locales: [gtConfig.defaultLocale, ...gtConfig.locales], entryPointFilePath: require.resolve('expo-router/entry'), }, ], ], }; }; ``` Установите полифилы FormatJS и импортируйте их в начале файла точки входа. Вам понадобятся базовые полифилы, а также данные локали для каждого поддерживаемого языка. Полный список см. в [документации по полифилам FormatJS](https://formatjs.github.io/docs/polyfills). Как минимум вам понадобятся: ```tsx title="index.js" import '@formatjs/intl-getcanonicallocales/polyfill'; import '@formatjs/intl-locale/polyfill'; import '@formatjs/intl-pluralrules/polyfill-force'; import '@formatjs/intl-numberformat/polyfill'; import '@formatjs/intl-datetimeformat/polyfill'; import '@formatjs/intl-datetimeformat/add-all-tz'; // Добавьте данные локали для каждого языка: import '@formatjs/intl-pluralrules/locale-data/en'; import '@formatjs/intl-pluralrules/locale-data/es'; import '@formatjs/intl-numberformat/locale-data/en'; import '@formatjs/intl-numberformat/locale-data/es'; // ... повторите для каждой локали и каждого полифила ``` *** ## Шаг 4: Создайте загрузчик переводов Metro (сборщик Expo) не поддерживает динамические импорты, поэтому нужно явно сопоставить каждую локаль с соответствующим файлом перевода: ```ts title="loadTranslations.ts" const translations: Record = { es: require("@/content/es.json"), fr: require("@/content/fr.json"), ja: require("@/content/ja.json"), }; export function loadTranslations(locale: string) { return translations[locale] ?? {}; } ``` Эти файлы создаются CLI при запуске `npx gt translate`. *** ## Шаг 5: Добавьте GTProvider в корневой layout Компонент **`GTProvider`** предоставляет всему приложению доступ к переводам. Добавьте его в корневой layout: ```tsx title="app/_layout.tsx" import { Slot } from 'expo-router'; import { GTProvider } from 'gt-react-native'; import gtConfig from '../gt.config.json'; import { loadTranslations } from '../loadTranslations'; export default function RootLayout() { return ( ); } ``` `GTProvider` управляет состоянием локали и делает переводы доступными для всех дочерних компонентов. Свойство `devApiKey` включает перевод по запросу в процессе разработки. *** ## Шаг 6: Отметьте контент для перевода Оберните любой текст, который нужно перевести, в компонент **``**: ```tsx title="app/index.tsx" import { Text, View } from 'react-native'; import { T } from 'gt-react-native'; export default function Home() { return ( Welcome to my app This content will be translated automatically. ); } ``` Всё внутри `` переводится как единое целое. *** ## Шаг 7: Добавьте переключатель языка Используйте хук **`useLocaleSelector`**, чтобы создать селектор языка. В отличие от `gt-react`, `gt-react-native` не экспортирует готовый компонент `` — интерфейс нужно реализовать самостоятельно с помощью этого хука: ```tsx title="app/index.tsx" import { Text, View, Pressable } from 'react-native'; import { T, useLocaleSelector } from 'gt-react-native'; export default function Home() { const { locales, locale, setLocale } = useLocaleSelector(); return ( {locales.map((l) => ( setLocale(l)}> {l} ))} Welcome to my app ); } ``` `useLocaleSelector` возвращает доступные локали, текущую локаль и функцию для её изменения, обеспечивая вам полный контроль над интерфейсом. *** ## Шаг 8: Настройка переменных окружения (необязательно) Чтобы видеть переводы в режиме разработки, вам понадобятся API-ключи General Translation. Создайте файл **`.env.local`**. В Expo общедоступные переменные окружения должны иметь префикс `EXPO_PUBLIC_`: ```bash title=".env.local" EXPO_PUBLIC_GT_DEV_API_KEY="your-dev-api-key" EXPO_PUBLIC_GT_PROJECT_ID="your-project-id" ``` Получите бесплатные ключи на [dash.generaltranslation.com](https://dash.generaltranslation.com/signup) или выполнив команду: ```bash npx gt auth ``` Для разработки используйте ключ, начинающийся с `gtx-dev-`. Продакшен-ключи (`gtx-api-`) предназначены только для CI/CD. Никогда не включайте продакшен-ключи API в бандл приложения и не коммитьте их в систему контроля версий. Да. Без ключей API `gt-react-native` работает как обычная библиотека i18n. Перевод по запросу в процессе разработки будет недоступен, но вы всё равно сможете: * Вручную добавлять собственные файлы переводов * Использовать все компоненты (``, ``, `LocaleSelector` и т. д.) * Запустить `npx gt generate`, чтобы создать шаблоны файлов переводов, а затем перевести их самостоятельно *** ## Шаг 9: Посмотрите в работе Запустите сборку в режиме разработки: ```bash npx expo start --dev-client ``` **Expo Go не работает** с `gt-react-native`, потому что пакет включает нативный модуль. Вам понадобится [сборка для разработки](https://docs.expo.dev/develop/development-builds/introduction/): ```bash npx expo run:ios # или npx expo run:android ``` Используйте переключатель языка, чтобы сменить язык. Вы должны увидеть переведённый контент. Во время разработки переводы подгружаются по запросу — при первом переключении на новый язык вы можете ненадолго увидеть состояние загрузки. В продакшене переводы генерируются заранее и загружаются мгновенно. *** ## Шаг 10: Переводите строки, а не только JSX Для обычных строк — например, атрибутов `placeholder` или значений `accessibilityLabel` — используйте хук **`useGT`**: ```tsx title="app/contact.tsx" import { TextInput, View } from 'react-native'; import { useGT } from 'gt-react-native'; export default function Contact() { const gt = useGT(); return ( ); } ``` *** ## Шаг 11: Развертывание в продакшен В продакшене переводы генерируются заранее на этапе сборки (без API-вызовов в реальном времени). Добавьте команду `translate` в скрипт сборки: ```json title="package.json" { "scripts": { "build": "npx gt translate && " } } ``` Задайте переменные окружения **продакшен** в CI/CD (они используются только на сервере, а не `EXPO_PUBLIC_`): ```bash GT_PROJECT_ID=your-project-id GT_API_KEY=gtx-api-your-production-key ``` Ключи для продакшена начинаются с `gtx-api-` (а не `gtx-dev-`). Получите ключ на [dash.generaltranslation.com](https://dash.generaltranslation.com). Никогда не включайте ключи для продакшена в бандл приложения. Вот и всё — теперь ваше приложение поддерживает несколько языков. 🎉 *** ## Устранение неполадок ``` ERROR [Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'GtReactNative' could not be found.] ``` Это означает, что нативный модуль не подключён. Распространённые причины: 1. **Вы используете Expo Go**, а не сборку для разработки. Переключитесь на сборку для разработки: ```bash npx expo run:ios # или npx expo run:android ``` 2. **Pods устарели (iOS).** Попробуйте переустановить их: ```bash cd ios && rm -rf build Pods Podfile.lock && pod install && cd .. ``` ``` Error: You are using invalid locale codes in your configuration. ``` Обычно это означает, что полифилы настроены неправильно. Убедитесь, что Babel-плагин настроен (или полифилы импортированы вручную), и очистите кэш: ```bash npx expo start --clear ``` Это ожидаемо. В режиме разработки переводы выполняются по запросу (контент переводится в реальном времени через API). В production этой задержки **нет** — все переводы заранее генерируются командой `npx gt translate`. Неоднозначный текст может приводить к неточным переводам. Например, "apple" может означать и фрукт, и компанию. Для уточнения добавьте проп `context`: ```jsx Apple ``` И ``, и `useGT()` поддерживают опцию `context`. *** ## Следующие шаги * [**Руководство по компоненту ``**](/docs/react-native/guides/t) — Узнайте о переменных, формах множественного числа и продвинутых шаблонах перевода * [**Руководство по переводу строк**](/docs/react-native/guides/strings) — Подробный разбор `useGT` * [**Переменные компоненты**](/docs/react-native/guides/variables) — Работайте с динамическим контентом с помощью ``, ``, `` и `` * [**Развертывание в продакшен**](/docs/react-native/tutorials/quickdeploy) — Настройка CI/CD, кэширования и оптимизация производительности