Autor:
    Data utworzenia:2025-06-18Ostatnia aktualizacja:2026-06-25

    Przetłumacz swoją aplikację Expo i React Native | Internacjonalizacja (i18n)

    ide.intlayer.org
    intlayer-react-native.vercel.app

    Spis treści

    Dlaczego Intlayer zamiast alternatyw?

    W porównaniu do głównych rozwiązań, takich jak react-native-localize czy i18next, Intlayer jest rozwiązaniem wyposażonym w zintegrowane optymalizacje, takie jak:

    Intlayer jest zoptymalizowany do doskonałej współpracy z React Native i Expo, oferując zakres treści na poziomie komponentów, obsługę TypeScript i wszystkie funkcje potrzebne do skalowania internacjonalizacji (i18n) w aplikacjach mobilnych.

    Określanie zakresu zawartości aplikacji ułatwia konserwację aplikacji na dużą skalę. Możesz powielić lub usunąć pojedynczy folder funkcji bez obciążania psychicznego koniecznością przeglądania całej bazy kodu zawartości. Dodatkowo Intlayer jest w pełni typowany, aby zapewnić dokładność treści.

    Wspólna lokalizacja treści zmniejsza potrzebny kontekst dzięki modelom dużego języka (LLM). Intlayer zawiera także zestaw narzędzi, takich jak CLI do sprawdzania brakujących tłumaczeń, LSP, MCP i agent skills, aby praca programisty (DX) była jeszcze płynniejsza dla agentów AI.

    Korzystaj z automatyzacji, aby tłumaczyć w swoim potoku CI/CD przy użyciu wybranego LLM na koszt dostawcy sztucznej inteligencji. Intlayer oferuje także kompilator do automatyzacji ekstrakcji treści, a także platformę internetową, która pomaga tłumaczyć w tle.

    Łączenie ogromnych plików JSON z komponentami może prowadzić do problemów z wydajnością i reaktywnością. Intlayer optymalizuje ładowanie treści w czasie kompilacji.

    Więcej niż tylko rozwiązanie i18n, Intlayer zapewnia samodzielny edytor wizualny i pełny CMS, który pomoże Ci zarządzać wielojęzyczną treścią w czasie rzeczywistym, dzięki czemu współpraca z tłumaczami, copywriterami i innymi członkami zespołu będzie płynna. Treść może być przechowywana lokalnie i/lub zdalnie.

    Zamiast ładować ogromne pliki JSON na swoje strony, ładuj tylko niezbędną treść. Intlayer pomaga zmniejszyć rozmiary pakietów i wyświetleń nawet o 50%.

    1. Zainstaluj zależności

      Zobacz Szablon aplikacji w GitHub.

      Z projektu React Native zainstaluj następujące pakiety:

      bash
      npx intlayer init --interactive
      
      Flaga --interactive jest opcjonalna. Użyj intlayer-cli init, jeśli jesteś agentem AI.
      To polecenie wykryje Twoje środowisko i zainstaluje wymagane pakiety. Na przykład:
      bash
      npm install intlayer react-native-intlayer
      

      Pakiety

      • intlayer
        Podstawowe narzędzie i18n do konfiguracji, zawartości słownika, generowania typów oraz poleceń CLI.

      • react-native-intlayer
        Integracja z React Native, która dostarcza dostawców kontekstu oraz hooki React do pobierania i przełączania lokalizacji, polyfille dla React Native oraz wtyczkę Metro do integracji Intlayer z bundlerem React Native. Reeksportuje wszystko z react-intlayer, więc w aplikacji React Native potrzebny jest tylko ten jeden pakiet.

    2. Utwórz konfigurację Intlayer

      W katalogu głównym projektu (lub w dowolnym wygodnym miejscu) utwórz plik konfiguracji Intlayer. Może on wyglądać tak:

      intlayer.config.ts
      /**
       * Jeśli typy Locales nie są dostępne, spróbuj ustawić moduleResolution na "bundler" w swoim tsconfig.json
       */
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            // ... Dodaj inne potrzebne lokalizacje
          ],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      

      W ramach tej konfiguracji możesz:

      • Skonfigurować swoją listę obsługiwanych lokalizacji.
      • Ustawić domyślną lokalizację.
      • Później możesz dodać bardziej zaawansowane opcje (np. logi, niestandardowe katalogi z zawartością itp.).
      • Zobacz dokumentację konfiguracji Intlayer po więcej informacji.
    3. Dodaj wtyczkę Metro

      Metro to bundler dla React Native. Jest to domyślny bundler dla projektów React Native tworzonych za pomocą polecenia react-native init. Aby używać Intlayer z Metro, musisz dodać wtyczkę do pliku 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);
      })();
      

      Uwaga: configMetroIntlayer to funkcja zwracająca promise. Użyj configMetroIntlayerSync, jeśli chcesz użyć jej synchronicznie lub uniknąć IIFE (Immediately Invoked Function Expression). Uwaga: configMetroIntlayerSync nie pozwala na budowanie słowników intlayer podczas uruchamiania serwera

    4. Dodaj dostawcę Intlayer

      Aby utrzymać synchronizację języka użytkownika w całej aplikacji, musisz opakować swój komponent root w komponent IntlayerProvider z react-native-intlayer.

      Zawsze importuj z react-native-intlayer. Jego IntlayerProvider zawiera polyfille dla web API używanego przez Intlayer, a pakiet reeksportuje wszystkie hooki i narzędzia z react-intlayer.

      Dodatkowo, musisz dodać funkcję intlayerPolyfill do swojego pliku index.js, aby zapewnić prawidłowe działanie 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;
      
    5. Zadeklaruj swoją zawartość

      Utwórz pliki deklaracji zawartości w dowolnym miejscu w swoim projekcie (zwykle w katalogu src/), używając dowolnego z formatów rozszerzeń obsługiwanych przez 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
      • itd.

      Expo Router (web): trzymaj pliki .content.* poza katalogiem app/. Expo Router traktuje każdy plik JavaScript/TypeScript wewnątrz app/ jako ścieżkę (route). W sieci web odkrywanie ścieżek skanuje system plików bezpośrednio i nie honoruje resolver.blockList z Metro, więc współistniejący plik *.content.ts jest rejestrowany jako ścieżka. Plik taki jak app/(tabs)/_layout.content.ts jest nawet parsowany jako układ (layout - część .content jest czytana jako przyrostek platformy), co koliduje z prawdziwym _layout.tsx i wyrzuca błąd:

      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.
      

      Umieść swoje deklaracje w katalogu poza app/ (na przykład content/ lub src/content/). Intlayer odkrywa pliki .content.* w dowolnym miejscu w projekcie, a słowniki są odnoszone przez ich key, więc nie są potrzebne żadne zmiany importów. W aplikacjach natywnych nie jest to wymagane (blockList z Metro już je ukrywa), ale używanie katalogu innego niż app/ zapewnia działanie na obu platformach.

      Przykład (TypeScript z węzłami TSX dla React Native):

      src/app.content.tsx
      import { t, type Dictionary } from "intlayer";
      import type { ReactNode } from "react";
      
      /**
       * Słownik treści dla naszej domeny "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;
      
      Szczegóły dotyczące deklaracji zawartości znajdziesz w dokumentacji Intlayer dotyczącej zawartości.
    6. Użyj Intlayer w swoich komponentach

      Użyj hooka useIntlayer w komponentach potomnych, aby uzyskać zlokalizowaną zawartość.

      Przykład

      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;
      
      Kiedy używasz content.someKey w właściwościach opartych na łańcuchach znaków (np. title przycisku lub children komponentu Text), wywołaj content.someKey.value, aby uzyskać właściwy łańcuch znaków.
      Jeśli Twoja aplikacja już istnieje, możesz użyć Intlayer Compiler w połączeniu z poleceniem extract, aby przekonwertować tysiące komponentów w jedną sekundę.
    7. Zmiana lokalizacji aplikacji

      Opcjonalne

      Aby zmienić lokalizację z poziomu komponentów, możesz użyć metody setLocale hooka 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",
        },
      });
      

      To powoduje ponowne renderowanie wszystkich komponentów korzystających z zawartości Intlayer, teraz wyświetlając tłumaczenia dla nowej lokalizacji.

      Zobacz useLocale docs po więcej szczegółów.

    Konfiguracja TypeScript (jeśli używasz TypeScript)

    Intlayer generuje definicje typów w ukrytym folderze (domyślnie .intlayer), aby poprawić autouzupełnianie i wykrywać błędy tłumaczeń:

    json5
    // tsconfig.json
    {
      // ... twoja istniejąca konfiguracja TS
      "include": [
        "src", // twój kod źródłowy
        ".intlayer/types/**/*.ts", // <-- upewnij się, że uwzględnione są automatycznie generowane typy
        // ... wszystko inne, co już uwzględniasz
      ],
    }
    

    To umożliwia funkcje takie jak:

    • Autouzupełnianie dla kluczy słownika.
    • Sprawdzanie typów, które ostrzega, jeśli odwołujesz się do nieistniejącego klucza lub typ jest niezgodny.

    Konfiguracja Git

    Aby uniknąć zatwierdzania automatycznie generowanych plików przez Intlayer, dodaj następujące wpisy do swojego .gitignore:

    bash
    # Ignoruj pliki generowane przez Intlayer
    .intlayer
    

    Rozszerzenie VS Code

    Aby poprawić swoje doświadczenie deweloperskie z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer dla VS Code.

    Zainstaluj z Marketplace VS Code

    To rozszerzenie oferuje:

    • Autouzupełnianie dla kluczy tłumaczeń.
    • Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
    • Podglądy w linii przetłumaczonej zawartości.
    • Szybkie akcje do łatwego tworzenia i aktualizowania tłumaczeń.

    Aby uzyskać więcej informacji o korzystaniu z rozszerzenia, zapoznaj się z dokumentacją rozszerzenia Intlayer VS Code.


    Idź dalej

    • Edytor wizualny: Użyj Intlayer Visual Editor do wizualnego zarządzania tłumaczeniami.
    • Integracja z CMS: Możesz również zewnętrznie przechowywać i pobierać zawartość swojego słownika z CMS.
    • Polecenia CLI: Poznaj Intlayer CLI do zadań takich jak wyodrębnianie tłumaczeń lub sprawdzanie brakujących kluczy.

    Ciesz się tworzeniem swoich aplikacji React Native z pełnym wsparciem i18n dzięki Intlayer!


    Debugowanie

    React Native może być mniej stabilny niż React Web, dlatego zwróć szczególną uwagę na zgodność wersji.

    Intlayer jest przede wszystkim skierowany do Web Intl API; na React Native musisz dołączyć odpowiednie polyfille.

    Lista kontrolna:

    • Używaj najnowszych wersji intlayer oraz react-native-intlayer.
    • Włącz polyfill Intlayer.
    • Jeśli używasz getLocaleName lub innych narzędzi opartych na API Intl, zaimportuj te polyfille wcześnie (na przykład w index.js lub App.tsx):
    ts
    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";
    
    • Sprawdź konfigurację Metro (aliasy resolvera, wtyczki assetów, ścieżki w tsconfig), jeśli moduły nie mogą zostać rozwiązane.

    Często Zadawane Pytania

    • i18n-js wraz z expo-localization: klasyczne połączenie oparte na zwykłym obiekcie wiadomości bez statycznego typowania.
    • react-i18next: popularne, ale wymaga ładowania przestrzeni nazw w pamięci na urządzeniu mobilnym.
    • Intlayer: najbardziej zaawansowane rozwiązanie. Treści deklarowane w plikach .content.ts obok komponentów i kompilowane przez wtyczkę Metro, w pełni typowane, z tłumaczeniem AI, edytorem wizualnym i systemem CMS.

    Na platformach mobilnych kluczowy jest rozmiar pakietu i wydajność startu aplikacji: Intlayer eliminuje nieużywane wpisy i dostarcza treść zoptymalizowaną pod Fast Refresh. Zobacz dlaczego Intlayer.

    Znacznie mniej niż rozwiązania oparte na przestrzeniach nazw, ponieważ strona nigdy nie pobiera katalogu, którego nie renderuje. Kompilator czasu budowy zastępuje odwołania do treści dokładnymi wpisami, których używa komponent, a słowniki dynamiczne dzielą resztę na poszczególne języki. W porównaniu z typowymi alternatywami, Intlayer zmniejsza rozmiar bundle'a i strony nawet o 50%. Zobacz optymalizację bundle'a oraz benchmark.

    Tak, i są dwie drogi. Możesz migrować treść stopniowo za pomocą przewodnika migracji z react-i18next. Możesz także zachować dotychczasowe API za pośrednictwem adapterów kompatybilności.

    Tak. Wtyczka sync JSON utrzymuje Twoje pliki /messages/{locale}/{namespace}.json jako źródło prawdy i generuje z nich słowniki Intlayer w obu kierunkach. Wtyczka sync PO robi to samo dla katalogów gettext, a pliki per locale pozwalają rozdzielić zawartość według języka zamiast grupować lokalizacje w jednym pliku.

    Nie. Uruchom npx intlayer extract, a Intlayer odczyta Twoje pliki źródłowe, wyodrębni ciągi widoczne dla użytkownika i utworzy plik .content obok każdego z nich, dzięki czemu przeglądasz diff zamiast ręcznie kopiować ciągi do katalogu pojedynczo.

    W przypadku w pełni zautomatyzowanego procesu Intlayer Compiler robi to samo w czasie kompilacji kodu źródłowego JSX, TSX, Vue i Svelte, generując słowniki przy każdej zmianie, dzięki czemu nie trzeba ręcznie zarządzać kluczami. Działa w oparciu o analizę statyczną, więc ciągi znaków istniejące tylko w czasie wykonywania pozostają poza zasięgiem, a rozróżnienie tekstu dla użytkownika od logiki aplikacji wymaga kilku adnotacji.

    Pięć narzędzi, wszystkie opcjonalne:

    • Rozszerzenie VS Code: przejście od klucza useIntlayer do pliku treści, który go deklaruje, wyodrębnianie treści z komponentu oraz uruchamianie build, fill, test, push i pull z palety poleceń lub dedykowanej karty Intlayer.
    • Serwer LSP: taka sama świadomość w dowolnym edytorze obsługującym LSP, z funkcjami przejdź do definicji (go to definition), znajdź wszystkie referencje, podglądem przetłumaczonej wartości po najechaniu kursorem, autouzupełnianiem kluczy i pól oraz ostrzeżeniem, gdy klucz nie jest nigdzie zadeklarowany. Rozpoznaje również wywołania i18next, react-i18next, next-intl i use-intl, co ułatwia migrację.
    • Serwer MCP: udostępnia dokumentację i CLI Intlayer dla Cursor, VS Code, Claude Desktop, Claude Code i ChatGPT, dzięki czemu asystent odpowiada na podstawie aktualnej dokumentacji zamiast zgadywać i może samodzielnie wykonywać polecenia, takie jak intlayer fill.
    • Umiejętności agenta (Agent skills): wyspecjalizowane umiejętności, takie jak intlayer-config, intlayer-cli i intlayer-content, oraz po jednej dla każdego frameworka, które uczą agenta konfiguracji routingu i typów węzłów treści.
    • Wtyczka ESLint: reguła no-raw-text oznacza zakodowane na stałe ciągi tekstowe, z dodatkowymi regułami dla statycznych kluczy słownika i nieużywanej zawartości.