Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Імпорт провайдерів та хуків безпосередньо з react-native-intlayer; react-intlayer більше не потрібен як пряма залежність"v9.0.025.06.2026
- "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"v8.9.004.05.2026
- "Додано команду init"v7.5.930.12.2025
- "Додано розділ debug"v6.1.602.10.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 hooks для отримання та перемикання локалей, поліфіли React Native, а також плагін Metro для інтеграції Intlayer з бандлером React Native. Він реекспортує все зreact-intlayer, тому у застосунку React Native достатньо лише цього одного пакету.
Створіть конфігурацію Intlayer
У корені вашого проєкту (або в будь-якому зручному місці) створіть файл Intlayer config. Він може виглядати так:
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включає поліфіли для Web 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({ uk: "Ласкаво просимо!", 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", }, });Це спричиняє повторний рендер (re-render) усіх компонентів, що використовують контент 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 Extension.
Встановити з VS Code Marketplace
Це розширення надає:
- Автодоповнення для ключів перекладу.
- Виявлення помилок у реальному часі для відсутніх перекладів.
- Вбудований перегляд перекладеного вмісту.
- Швидкі дії для простого створення та оновлення перекладів.
Для детальнішого опису використання розширення зверніться до документації Intlayer VS Code Extension.
Додаткові ресурси
- Візуальний редактор: Використовуйте Intlayer Visual Editor для візуального керування перекладами.
- Інтеграція з 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,
tsconfigpaths), якщо модулі не вдається розв'язати.