Задайте вопрос и получите краткое содержание документа через любого ИИ-провайдера на этой странице
История версий
- "Импорт провайдеров и хуков напрямую из react-native-intlayer; react-intlayer больше не нужен как прямая зависимость"v9.0.025.06.2026
- "Обновление использования API useIntlayer в Solid для прямого доступа к свойствам"v8.9.004.05.2026
- "Добавить команду init"v7.5.930.12.2025
- "Инициализация истории"v5.5.1029.06.2025
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Переведите ваше приложение Expo и React Native | Интернационализация (i18n)
Содержание
Почему Intlayer, а не альтернативы?
По сравнению с основными решениями, такими как react-native-localize или i18next, Intlayer — это решение, включающее такие интегрированные оптимизации, как:
Intlayer оптимизирован для идеальной работы с React Native и Expo, предлагая определение контента на уровне компонентов, поддержку TypeScript и все необходимые функции для масштабирования интернационализации (i18n) в мобильных приложениях.
Организация контента по отдельным областям (scoping) упрощает сопровождение крупных приложений. Вы можете скопировать или удалить папку с функцией без необходимости просматривать всю кодовую базу контента. Кроме того, Intlayer полностью типизирован (fully typed), что обеспечивает точность вашего контента.
Совместное размещение контента сокращает контекст, необходимый для больших языковых моделей (LLM). Intlayer также поставляется с набором инструментов, таких как CLI для проверки отсутствующих переводов, LSP, MCP и навыки агента, чтобы сделать опыт разработчика (DX) ещё более комфортным для ИИ-агентов.
Используйте автоматизацию для перевода в вашем CI/CD-пайплайне с помощью LLM по вашему выбору за счёт вашего провайдера ИИ. Intlayer также предлагает компилятор для автоматизации извлечения контента, а также веб-платформу, чтобы помочь переводить в фоновом режиме.
Подключение больших JSON-файлов к компонентам может привести к проблемам с производительностью и реактивностью. Intlayer оптимизирует загрузку контента во время сборки (build time).
Будучи больше, чем просто решением для i18n, Intlayer предлагает собственный визуальный редактор и полноценную CMS, чтобы помочь вам управлять многоязычным контентом в реальном времени, делая сотрудничество с переводчиками, копирайтерами и другими членами команды бесперебойным. Контент может храниться локально и/или удалённо.
Вместо загрузки огромных JSON-файлов на ваши страницы загружайте только необходимый контент. Intlayer помогает уменьшить размер вашего бандла и представлений до 50%.
Установите зависимости
См. Шаблон приложения на GitHub.
Из вашего проекта React Native установите следующие пакеты:
bashКопировать кодКопировать код в буфер обмена
npx intlayer@canary init --interactive # v9# npx intlayer init # v8Флаг
--interactiveне является обязательным. Используйтеintlayer-cli init, если вы являетесь ИИ-агентом.Эта команда определит вашу среду и установит необходимые пакеты. Например:
bashКопировать кодКопировать код в буфер обмена
npm install intlayer react-native-intlayerПакеты
intlayer
Основной набор инструментов i18n для конфигурации, содержимого словарей, генерации типов и команд CLI.react-native-intlayer
Интеграция с React Native, предоставляющая провайдеры контекста и React-хуки, которые вы будете использовать для получения и переключения локалей, полифилы React Native, а также плагин Metro для интеграции Intlayer с бандлером React Native. Он реэкспортирует всё изreact-intlayer, поэтому в приложении React Native достаточно этого единственного пакета.
Создайте конфигурацию Intlayer
В корне вашего проекта (или в любом удобном месте) создайте файл конфигурации Intlayer. Он может выглядеть так:
intlayer.config.tsКопировать кодКопировать код в буфер обмена
/** * Если типы Locales недоступны, попробуйте установить moduleResolution в "bundler" в вашем tsconfig.json */ import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ... Добавьте любые другие необходимые локали ], defaultLocale: Locales.ENGLISH, }, }; export default config;В этой конфигурации вы можете:
- Настроить ваш список поддерживаемых локалей.
- Установить локаль по умолчанию.
- Позже вы сможете добавить более продвинутые опции (например, логи, пользовательские директории контента и т.д.).
- Подробнее смотрите в документации по конфигурации Intlayer.
Добавьте плагин Metro
Metro — это сборщик для React Native. Он является сборщиком по умолчанию для проектов React Native, созданных с помощью команды
react-native init. Чтобы использовать Intlayer с Metro, необходимо добавить плагин в файлmetro.config.js:metro.config.jsКопировать кодКопировать код в буфер обмена
const { getDefaultConfig } = require("expo/metro-config");const { configMetroIntlayer } = require("react-native-intlayer/metro");module.exports = (async () => { const defaultConfig = getDefaultConfig(__dirname); return await configMetroIntlayer(defaultConfig);})();Примечание:
configMetroIntlayer— это асинхронная функция. ИспользуйтеconfigMetroIntlayerSync, если хотите использовать её синхронно, или избегайте IIFE (Immediately Invoked Function Expression). Примечание:configMetroIntlayerSyncне позволяет собирать словари intlayer при запуске сервераДобавьте провайдер Intlayer
Чтобы синхронизировать язык пользователя по всему приложению, необходимо обернуть корневой компонент в компонент
IntlayerProviderизreact-native-intlayer.Всегда импортируйте из
react-native-intlayer. ЕгоIntlayerProviderвключает полифилы для веб-API, используемого Intlayer, и пакет реэкспортирует все хуки и утилиты изreact-intlayer.Также необходимо добавить функцию
intlayerPolyfillв ваш файлindex.js, чтобы обеспечить корректную работу Intlayer.app/_layout.tsxКопировать кодКопировать код в буфер обмена
import { Stack } from "expo-router"; import { getLocales } from "expo-localization"; import { IntlayerProvider } from "react-native-intlayer"; import { type FC } from "react"; const getDeviceLocale = () => getLocales()[0]?.languageTag; const RootLayout: FC = () => { return ( <IntlayerProvider defaultLocale={getDeviceLocale()}> <Stack> <Stack.Screen name="(tabs)" options={{ headerShown: false }} /> </Stack> </IntlayerProvider> ); }; export default RootLayout;Объявите Ваш Контент
Создайте файлы объявления контента в любом месте вашего проекта (обычно внутри
src/), используя любой из форматов расширений, поддерживаемых Intlayer:.content.json.content.jsonc.content.json5.content.ts.content.tsx.content.js.content.jsx.content.mjs.content.mjx.content.cjs.content.md.content.mdx.content.yaml.content.yml- и т.д.
Expo Router (веб): держите файлы
.content.*вне директорииapp/. Expo Router рассматривает каждый файл JavaScript/TypeScript внутриapp/как маршрут. В веб-версии поиск маршрутов сканирует файловую систему напрямую и не учитываетresolver.blockListот Metro, поэтому находящийся рядом*.content.tsрегистрируется как маршрут. Файл, такой какapp/(tabs)/_layout.content.ts, даже парсится как макет (часть.contentчитается как суффикс платформы), что конфликтует с реальным_layout.tsxи вызывает ошибку:plaintextКопировать кодКопировать код в буфер обмена
The layouts "./(tabs)/_layout.content.ts" and "./(tabs)/_layout.tsx" conflict on the route "/(tabs)/_layout.content". Remove or rename one of these files.Размещайте свои объявления в директории вне
app/(например,content/илиsrc/content/). Intlayer обнаруживает файлы.content.*в любом месте проекта, а словари ссылаются по ихkey, поэтому изменения импортов не требуются. В нативных приложениях это не обязательно (blockListот Metro уже скрывает их), но использование другой директории помимоapp/обеспечивает работу обеих платформ.Пример (TypeScript с TSX узлами для React Native):
src/app.content.tsxКопировать кодКопировать код в буфер обмена
import { t, type Dictionary } from "intlayer"; import type { ReactNode } from "react"; /** * Словарь контента для нашего домена "app" */ import { t, type Dictionary } from "intlayer"; const homeScreenContent = { key: "home-screen", content: { title: t({ en: "Welcome!", fr: "Bienvenue!", es: "¡Bienvenido!", }), }, } satisfies Dictionary; export default homeScreenContent;Для подробностей о декларациях контента смотрите документацию Intlayer по контенту.
Использование Intlayer в ваших компонентах
Используйте хук
useIntlayerв дочерних компонентах для получения локализованного контента.Пример
app/(tabs)/index.tsxКопировать кодКопировать код в буфер обмена
import { Image, StyleSheet, Platform } from "react-native"; import { useIntlayer } from "react-native-intlayer"; import { HelloWave } from "@/components/HelloWave"; import ParallaxScrollView from "@/components/ParallaxScrollView"; import { ThemedText } from "@/components/ThemedText"; import { ThemedView } from "@/components/ThemedView"; import { type FC } from "react"; const HomeScreen = (): FC => { const { title, steps } = useIntlayer("home-screen"); return ( <ParallaxScrollView headerBackgroundColor={{ light: "#A1CEDC", dark: "#1D3D47" }} headerImage={ <Image source={require("@/assets/images/partial-react-logo.png")} style={styles.reactLogo} /> } > <ThemedView style={styles.titleContainer}> <ThemedText type="title">{title}</ThemedText> <HelloWave /> </ThemedView> </ParallaxScrollView> ); }; const styles = StyleSheet.create({ titleContainer: { flexDirection: "row", alignItems: "center", gap: 8, }, }); export default HomeScreen;При использовании
content.someKeyв строковых пропсах (например, вtitleкнопки или вchildrenкомпонентаText), вызывайтеcontent.someKey.value, чтобы получить фактическую строку.Если ваше приложение уже существует, вы можете использовать Intlayer Compiler в сочетании с командой extract, чтобы преобразовать тысячи компонентов за одну секунду.
Изменение локали приложения
НеобязательноДля переключения локалей изнутри ваших компонентов вы можете использовать метод
setLocaleхукаuseLocale:src/components/LocaleSwitcher.tsxКопировать кодКопировать код в буфер обмена
import { type FC } from "react"; import { View, Text, TouchableOpacity, StyleSheet } from "react-native"; import { getLocaleName } from "intlayer"; import { useLocale } from "react-native-intlayer"; export const LocaleSwitcher: FC = () => { const { setLocale, availableLocales } = useLocale(); return ( <View style={styles.container}> {availableLocales.map((locale) => ( <TouchableOpacity key={locale} style={styles.button} onPress={() => setLocale(locale)} > <Text style={styles.text}>{getLocaleName(locale)}</Text> </TouchableOpacity> ))} </View> ); }; const styles = StyleSheet.create({ container: { flexDirection: "row", justifyContent: "center", alignItems: "center", gap: 8, }, button: { paddingVertical: 6, paddingHorizontal: 12, borderRadius: 6, backgroundColor: "#ddd", }, text: { fontSize: 14, fontWeight: "500", color: "#333", }, });Это вызывает повторный рендер всех компонентов, использующих контент Intlayer, теперь отображая переводы для новой локали.
Подробнее смотрите в документации
useLocale.
Настройка TypeScript (если вы используете TypeScript)
Intlayer генерирует определения типов в скрытой папке (по умолчанию .intlayer), чтобы улучшить автодополнение и выявлять ошибки перевода:
Копировать код в буфер обмена
// tsconfig.json{ // ... ваша существующая конфигурация TS "include": [ "src", // ваш исходный код ".intlayer/types/**/*.ts", // <-- убедитесь, что включены автоматически сгенерированные типы // ... всё остальное, что вы уже включаете ],}Это обеспечивает такие возможности, как:
- Автодополнение для ключей вашего словаря.
- Проверка типов, которая предупреждает, если вы обращаетесь к несуществующему ключу или тип не совпадает.
Конфигурация Git
Чтобы избежать коммита автоматически сгенерированных файлов Intlayer, добавьте следующее в ваш .gitignore:
Копировать код в буфер обмена
# Игнорировать файлы, сгенерированные Intlayer.intlayerРасширение VS Code
Чтобы улучшить опыт разработки с Intlayer, вы можете установить официальное Расширение Intlayer для VS Code.
Установить из VS Code Marketplace
Это расширение предоставляет:
- Автодополнение для ключей переводов.
- Обнаружение ошибок в реальном времени для отсутствующих переводов.
- Встроенный просмотр переведённого контента.
- Быстрые действия для удобного создания и обновления переводов.
Для получения дополнительной информации о том, как использовать расширение, обратитесь к документации расширения Intlayer для VS Code.
Продвинутые возможности
- Визуальный редактор: Используйте Визуальный редактор Intlayer для визуального управления переводами.
- Интеграция с CMS: Вы также можете вынести и получать содержимое вашего словаря из CMS.
- Команды CLI: Изучите Intlayer CLI для таких задач, как извлечение переводов или проверка отсутствующих ключей.
Наслаждайтесь созданием ваших приложений на React Native с полноценной поддержкой i18n через Intlayer!
Отладка
React Native может быть менее стабильным, чем React Web, поэтому обратите особое внимание на выравнивание версий.
Intlayer в основном ориентирован на Web Intl API; в React Native вы должны включить соответствующие полифилы.
Контрольный список:
- Используйте последние версии
intlayerиreact-native-intlayer. - Включите Intlayer полифил.
- Если вы используете
getLocaleNameили другие утилиты на основе Intl API, импортируйте эти полифилы рано (например, вindex.jsилиApp.tsx):
Копировать код в буфер обмена
import "intl";import "@formatjs/intl-getcanonicallocales/polyfill";import "@formatjs/intl-locale/polyfill";import "@formatjs/intl-pluralrules/polyfill";import "@formatjs/intl-displaynames/polyfill";import "@formatjs/intl-listformat/polyfill";import "@formatjs/intl-numberformat/polyfill";import "@formatjs/intl-relativetimeformat/polyfill";import "@formatjs/intl-datetimeformat/polyfill";- Проверьте конфигурацию Metro (resolver aliases, asset plugins, пути
tsconfig), если модули не разрешаются.