Pose una domanda e ottieni un riassunto del documento facendo riferimento a questa pagina e al provider AI di tua scelta
Cronologia delle versioni
- "Importa provider e hook direttamente da react-native-intlayer; react-intlayer non è più necessario come dipendenza diretta"v9.0.025/06/2026
- "Aggiornare l'uso dell'API useIntlayer di Solid all'accesso diretto alle proprietà"v8.9.004/05/2026
- "Aggiungi comando init"v7.5.930/12/2025
- "Storia iniziale"v5.5.1029/06/2025
Il contenuto di questa pagina è stato tradotto con un'IA.
Vedi l'ultima versione del contenuto originale in ingleseIf 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
Traduci la tua app Expo e React Native | Internazionalizzazione (i18n)
Indice
Perché Intlayer rispetto alle alternative?
Rispetto alle soluzioni principali come react-native-localize o i18next, Intlayer è una soluzione dotata di ottimizzazioni integrate come:
Intlayer è ottimizzato per funzionare perfettamente con React Native ed Expo offrendo ambito del contenuto a livello di componente, supporto TypeScript e tutte le funzionalità necessarie per ridimensionare l'internazionalizzazione (i18n) nelle app mobili.
L'ambito del contenuto dell'applicazione facilita la manutenzione per applicazioni su larga scala. Puoi duplicare o eliminare una singola cartella di funzionalità senza l'onere mentale di rivedere l'intera codebase dei contenuti. Inoltre, Intlayer è completamente tipizzato (fully typed) per garantire l'accuratezza dei tuoi contenuti.
La co-localizzazione dei contenuti riduce il contesto necessario dai Large Language Models (LLM). Intlayer viene fornito anche con una suite di strumenti, come una CLI per verificare le traduzioni mancanti,LSP, MCP e capacità dell'agente, per rendere l'esperienza dello sviluppatore (DX) ancora più fluida per gli agenti IA.
Utilizza l'automazione per tradurre nella tua pipeline CI/CD utilizzando il LLM di tua scelta al costo del tuo provider di intelligenza artificiale. Intlayer offre anche un compilatore per automatizzare l'estrazione dei contenuti, nonché una piattaforma web per aiutare a tradurre in background.
La connessione di enormi file JSON ai componenti può portare a problemi di prestazioni e reattività. Intlayer ottimizza il caricamento dei contenuti in fase di compilazione.
Più di una semplice soluzione i18n, Intlayer fornisce un editor visivo self-hosted e un CMS completo per aiutarti gestisci i tuoi contenuti multilingue in tempo reale, semplificando la collaborazione con traduttori, copywriter e altri membri del team. I contenuti possono essere archiviati localmente e/o in remoto.
Invece di caricare enormi file JSON nelle tue pagine, carica solo il contenuto necessario. Intlayer aiuta a ridurre il pacchetto e visualizzare le dimensioni fino al 50%.
Installare le dipendenze
Vedere il Modello di applicazione su GitHub.
Dal tuo progetto React Native, installa i seguenti pacchetti:
bashCopiare il codiceCopiare il codice nella clipboard
npx intlayer@canary init --interactive # v9# npx intlayer init # v8Il flag
--interactiveè opzionale. Usaintlayer-cli initse sei un agente IA.Questo comando rileverà il tuo ambiente e installerà i pacchetti richiesti. Ad esempio:
bashCopiare il codiceCopiare il codice nella clipboard
npm install intlayer react-native-intlayerPacchetti
intlayer
Il toolkit i18n principale per la configurazione, il contenuto del dizionario, la generazione dei tipi e i comandi CLI.react-native-intlayer
Integrazione React Native che fornisce i provider di contesto e gli hook React che utilizzerai per ottenere e cambiare le localizzazioni, i polyfill React Native e il plugin Metro per integrare Intlayer con il bundler di React Native. Riesporta tutto dareact-intlayer, quindi hai bisogno solo di questo singolo pacchetto in un'app React Native.
Crea una Configurazione Intlayer
Nella root del tuo progetto (o in qualsiasi posizione conveniente), crea un file di configurazione Intlayer. Potrebbe apparire così:
intlayer.config.tsCopiare il codiceCopiare il codice nella clipboard
/** * Se i tipi Locales non sono disponibili, prova a impostare moduleResolution su "bundler" nel tuo tsconfig.json */ import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ... Aggiungi qualsiasi altra localizzazione di cui hai bisogno ], defaultLocale: Locales.ENGLISH, }, }; export default config;All'interno di questa configurazione, puoi:
- Configurare la tua lista di localizzazioni supportate.
- Impostare una localizzazione predefinita.
- Successivamente, potrai aggiungere opzioni più avanzate (ad esempio, log, directory di contenuti personalizzate, ecc.).
- Consulta la documentazione di configurazione di Intlayer per maggiori informazioni.
Aggiungi il plugin Metro
Metro è un bundler per React Native. È il bundler predefinito per i progetti React Native creati con il comando
react-native init. Per usare Intlayer con Metro, devi aggiungere il plugin al filemetro.config.js:metro.config.jsCopiare il codiceCopiare il codice nella clipboard
const { getDefaultConfig } = require("expo/metro-config");const { configMetroIntlayer } = require("react-native-intlayer/metro");module.exports = (async () => { const defaultConfig = getDefaultConfig(__dirname); return await configMetroIntlayer(defaultConfig);})();Nota:
configMetroIntlayerè una funzione promise. UsaconfigMetroIntlayerSyncse vuoi usarla in modo sincrono, o evita l'IFFE (Immediately Invoked Function Expression). Nota:configMetroIntlayerSyncnon consente di costruire dizionari intlayer all'avvio del serverAggiungi il provider Intlayer
Per mantenere sincronizzata la lingua dell'utente in tutta l'applicazione, devi avvolgere il componente radice con il componente
IntlayerProviderdareact-native-intlayer.Importa sempre da
react-native-intlayer. Il suoIntlayerProviderinclude polyfill per le API web usate da Intlayer, e il pacchetto riesporta tutti gli hook e le utilità dareact-intlayer.Inoltre, devi aggiungere la funzione
intlayerPolyfillal tuo fileindex.jsper assicurarti che Intlayer possa funzionare correttamente.app/_layout.tsxCopiare il codiceCopiare il codice nella clipboard
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;Dichiarare il Tuo Contenuto
Crea file di dichiarazione del contenuto in qualsiasi punto del tuo progetto (comunemente all'interno di
src/), utilizzando uno qualsiasi dei formati di estensione supportati da 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- ecc.
Expo Router (web): tieni i file
.content.*fuori dalla directoryapp/. Expo Router tratta ogni file JavaScript/TypeScript all'interno diapp/come una rotta. Sul web, la sua scoperta delle rotte scansiona direttamente il file system e non rispetta ilresolver.blockListdi Metro, quindi un*.content.tsco-localizzato viene registrato come una rotta. Un file comeapp/(tabs)/_layout.content.tsviene persino analizzato come un layout (la parte.contentviene letta come suffisso della piattaforma), il che entra in conflitto con il vero_layout.tsxe genera l'errore:plaintextCopiare il codiceCopiare il codice nella clipboard
The layouts "./(tabs)/_layout.content.ts" and "./(tabs)/_layout.tsx" conflict on the route "/(tabs)/_layout.content". Remove or rename one of these files.Posiziona le tue dichiarazioni in una directory al di fuori di
app/(ad esempiocontent/osrc/content/). Intlayer scopre i file.content.*ovunque nel progetto e i dizionari sono referenziati tramite la lorokey, quindi non sono necessarie modifiche agli import. Su nativo questo non è richiesto (lablockListdi Metro li nasconde già), ma utilizzare una directory diversa daapp/mantiene entrambe le piattaforme funzionanti.Esempio (TypeScript con nodi TSX per React Native):
src/app.content.tsxCopiare il codiceCopiare il codice nella clipboard
import { t, type Dictionary } from "intlayer"; import type { ReactNode } from "react"; /** * Dizionario dei contenuti per il nostro dominio "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;Per dettagli sulle dichiarazioni di contenuto, consulta la documentazione di Intlayer.
Usa Intlayer nei tuoi componenti
Usa l'hook
useIntlayernei componenti figli per ottenere contenuti localizzati.Esempio
app/(tabs)/index.tsxCopiare il codiceCopiare il codice nella clipboard
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;Quando si utilizza
content.someKeyin proprietà basate su stringhe (ad esempio, iltitledi un pulsante o ichildrendi un componenteText), chiamarecontent.someKey.valueper ottenere la stringa effettiva.Se la tua app esiste già, puoi utilizzare l' Intlayer Compiler in combinazione con il comando extract per convertire migliaia di componenti in un secondo.
Cambiare la Lingua dell'App
OpzionalePer cambiare la lingua dall'interno dei tuoi componenti, puoi usare il metodo
setLocaledell'hookuseLocale:src/components/LocaleSwitcher.tsxCopiare il codiceCopiare il codice nella clipboard
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", }, });Questo provoca un nuovo rendering di tutti i componenti che utilizzano contenuti Intlayer, mostrando ora le traduzioni per la nuova localizzazione.
Vedi la documentazione di
useLocaleper maggiori dettagli.
Configurare TypeScript (se usi TypeScript)
Intlayer genera definizioni di tipo in una cartella nascosta (di default .intlayer) per migliorare l'autocompletamento e rilevare errori di traduzione:
Copiare il codice nella clipboard
// tsconfig.json{ // ... la tua configurazione TS esistente "include": [ "src", // il tuo codice sorgente ".intlayer/types/**/*.ts", // <-- assicurati che i tipi generati automaticamente siano inclusi // ... qualsiasi altra cosa che già includi ],}Questo abilita funzionalità come:
- Completamento automatico per le chiavi del tuo dizionario.
- Controllo dei tipi che avvisa se accedi a una chiave inesistente o se c'è un disallineamento di tipo.
Configurazione Git
Per evitare di commettere file generati automaticamente da Intlayer, aggiungi quanto segue al tuo .gitignore:
Copiare il codice nella clipboard
# Ignora i file generati da Intlayer.intlayerEstensione VS Code
Per migliorare la tua esperienza di sviluppo con Intlayer, puoi installare la Estensione ufficiale Intlayer per VS Code.
Installa dal Marketplace di VS Code
Questa estensione offre:
- Completamento automatico per le chiavi di traduzione.
- Rilevamento errori in tempo reale per traduzioni mancanti.
- Anteprime inline del contenuto tradotto.
- Azioni rapide per creare e aggiornare facilmente le traduzioni.
Per maggiori dettagli su come utilizzare l'estensione, consulta la documentazione dell'estensione Intlayer per VS Code.
Vai oltre
- Editor Visivo: Usa il Visual Editor di Intlayer per gestire le traduzioni in modo visivo.
- Integrazione CMS: Puoi anche esternalizzare e recuperare il contenuto del tuo dizionario da un CMS.
- Comandi CLI: Esplora il CLI di Intlayer per attività come estrarre traduzioni o controllare le chiavi mancanti.
Divertiti a sviluppare le tue app React Native con un i18n completamente potenziato tramite Intlayer!
Debug
React Native può essere meno stabile di React Web, quindi presta particolare attenzione all'allineamento delle versioni.
Intlayer è principalmente orientato all'API Web Intl; su React Native è necessario includere i polyfill appropriati.
Checklist:
- Utilizza le versioni più recenti di
intlayerereact-native-intlayer. - Abilita il polyfill di Intlayer.
- Se utilizzi
getLocaleNameo altre utility basate su Intl-API, importa questi polyfill all'inizio (ad esempio inindex.jsoApp.tsx):
Copiare il codice nella clipboard
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";- Verifica la configurazione di Metro (resolver aliases, asset plugins, percorsi
tsconfig) se i moduli non vengono risolti.