Faça sua pergunta e obtenha um resumo do documento referenciando esta página e o provedor AI de sua escolha
Histórico de versões
- "Importar providers e hooks diretamente de react-native-intlayer; react-intlayer não é mais necessário como dependência direta"v9.0.025/06/2026
- "Atualizar o uso da API useIntlayer do Solid para acesso direto a propriedades"v8.9.004/05/2026
- "Adicionar comando init"v7.5.930/12/2025
- "Adicionar seção de debug"v6.1.602/10/2025
- "Histórico inicial"v5.5.1029/06/2025
O conteúdo desta página foi traduzido com uma IA.
Veja a última versão do conteúdo original em inglêsIf 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
Traduza seu aplicativo Expo e React Native | Internacionalização (i18n)
Índice
Por que Intlayer em vez de alternativas?
Comparado com soluções principais como react-native-localize ou i18next, Intlayer é uma solução que vem com otimizações integradas como:
O Intlayer é otimizado para funcionar perfeitamente com React Native e Expo, oferecendo escopo de conteúdo em nível de componente, suporte a TypeScript e todos os recursos necessários para dimensionar a internacionalização (i18n) em aplicativos móveis.
Definir o escopo do conteúdo do seu aplicativo facilita a manutenção de aplicativos de grande escala. Você pode duplicar ou excluir uma única pasta de recursos sem o fardo mental de revisar toda a base de código de seu conteúdo. Além disso, o Intlayer é totalmente tipado (fully typed) para garantir a precisão do seu conteúdo.
A co-localização de conteúdo reduz o contexto necessário pelos Large Language Models (LLMs). O Intlayer também vem com um conjunto de ferramentas, como uma CLI para testar traduções ausentes, LSP, MCP, e habilidades do agente, para tornar a experiência do desenvolvedor (DX) ainda mais tranquila para os agentes de IA.
Use a automação para traduzir seu pipeline de CI/CD usando o LLM de sua escolha às custas de seu provedor de IA. O Intlayer também oferece um compilador para automatizar a extração de conteúdo, bem como uma plataforma web para ajudar a traduzir em segundo plano.
Conectar arquivos JSON enormes a componentes pode levar a problemas de desempenho e reatividade. O Intlayer otimiza o carregamento do seu conteúdo no momento da construção.
Mais do que apenas uma solução i18n, o Intlayer fornece um editor visual auto-hospedado e um CMS completo para ajudá-lo a gerenciar seu conteúdo multilíngue em tempo real, facilitando a colaboração com tradutores, redatores e outros membros da equipe. O conteúdo pode ser armazenado local e/ou remotamente.
Em vez de carregar arquivos JSON enormes em suas páginas, carregue apenas o conteúdo necessário. O Intlayer ajuda a reduzir o tamanho do seu pacote e visualização em até 50%.
Instalar Dependências
Consulte o Modelo de Aplicativo no GitHub.
No seu projeto React Native, instale os seguintes pacotes:
bashCopiar códigoCopiar o código para a área de transferência
npx intlayer@canary init --interactive # v9# npx intlayer init # v8A flag
--interactiveé opcional. Useintlayer-cli initse você for um agente de IA.Este comando detectará seu ambiente e instalará os pacotes necessários. Por exemplo:
bashCopiar códigoCopiar o código para a área de transferência
npm install intlayer react-native-intlayerPacotes
intlayer
O kit de ferramentas i18n principal para configuração, conteúdo do dicionário, geração de tipos e comandos CLI.react-native-intlayer
Integração React Native que fornece os provedores de contexto e hooks React que você usará para obter e trocar localidades, os polyfills do React Native e o plugin Metro para integrar o Intlayer com o bundler do React Native. Reexporta tudo dereact-intlayer, portanto você só precisa deste único pacote em um aplicativo React Native.
Criar uma Configuração Intlayer
Na raiz do seu projeto (ou em qualquer lugar conveniente), crie um arquivo de configuração do Intlayer. Pode ser algo assim:
intlayer.config.tsCopiar códigoCopiar o código para a área de transferência
/** * Se os tipos Locales não estiverem disponíveis, tente definir moduleResolution como "bundler" no seu tsconfig.json */ import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ... Adicione quaisquer outras localidades que você precisar ], defaultLocale: Locales.ENGLISH, }, }; export default config;Dentro desta configuração, você pode:
- Configurar sua lista de localidades suportadas.
- Definir uma localidade padrão.
- Posteriormente, você pode adicionar opções mais avançadas (por exemplo, logs, diretórios personalizados de conteúdo, etc.).
- Veja a documentação de configuração do Intlayer para mais informações.
Adicione o plugin Metro
Metro é um empacotador para React Native. É o empacotador padrão para projetos React Native criados com o comando
react-native init. Para usar o Intlayer com o Metro, você precisa adicionar o plugin ao seu arquivometro.config.js:metro.config.jsCopiar códigoCopiar o código para a área de transferência
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é uma função que retorna uma promise. UseconfigMetroIntlayerSyncse quiser usá-la de forma síncrona ou evitar IIFE (Immediately Invoked Function Expression). Nota:configMetroIntlayerSyncnão permite construir dicionários intlayer no início do servidorAdicione o provedor Intlayer
Para manter sincronizada a linguagem do usuário em toda a sua aplicação, você precisa envolver seu componente raiz com o componente
IntlayerProviderdoreact-native-intlayer.Sempre importe de
react-native-intlayer. SeuIntlayerProviderinclui polyfills para a API web usada pelo Intlayer, e o pacote reexporta todos os hooks e utilitários dereact-intlayer.Além disso, você precisa adicionar a função
intlayerPolyfillao seu arquivoindex.jspara garantir que o Intlayer funcione corretamente.app/_layout.tsxCopiar códigoCopiar o código para a área de transferência
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;Declare Seu Conteúdo
Crie arquivos de declaração de conteúdo em qualquer lugar do seu projeto (comumente dentro de
src/), usando qualquer um dos formatos de extensão que o Intlayer suporta:.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- etc.
Expo Router (web): mantenha os arquivos
.content.*fora do diretórioapp/. O Expo Router trata cada arquivo JavaScript/TypeScript dentro deapp/como uma rota. Na web, a descoberta de rotas varre o sistema de arquivos diretamente e não respeita oresolver.blockListdo Metro, então um*.content.tsco-localizado é registrado como uma rota. Um arquivo comoapp/(tabs)/_layout.content.tsé até analisado como um layout (a parte.contenté lida como um sufixo de plataforma), o que entra em conflito com o verdadeiro_layout.tsxe lança o erro:plaintextCopiar códigoCopiar o código para a área de transferência
The layouts "./(tabs)/_layout.content.ts" and "./(tabs)/_layout.tsx" conflict on the route "/(tabs)/_layout.content". Remove or rename one of these files.Coloque suas declarações em um diretório fora de
app/(por exemplo,content/ousrc/content/). O Intlayer descobre arquivos.content.*em qualquer lugar do projeto e os dicionários são referenciados por suakey, portanto, nenhuma mudança de importação é necessária. No nativo isso não é necessário (ablockListdo Metro já os esconde), mas usar um diretório diferente deapp/mantém ambas as plataformas funcionando.Exemplo (TypeScript com nós TSX para React Native):
src/app.content.tsxCopiar códigoCopiar o código para a área de transferência
import { t, type Dictionary } from "intlayer"; import type { ReactNode } from "react"; /** * Dicionário de conteúdo para nosso domínio "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;Para detalhes sobre declarações de conteúdo, veja a documentação de conteúdo do Intlayer.
Use o Intlayer em Seus Componentes
Use o hook
useIntlayerem componentes filhos para obter conteúdo localizado.Exemplo
app/(tabs)/index.tsxCopiar códigoCopiar o código para a área de transferência
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;Ao usar
content.someKeyem props baseadas em string (por exemplo, otitlede um botão ou oschildrende um componenteText), chamecontent.someKey.valuepara obter a string real.Se a sua aplicação já existe, você pode usar o Intlayer Compiler em conjunto com o comando extract para converter milhares de componentes em um segundo.
Alterar o Locale do App
OpcionalPara trocar os locales dentro dos seus componentes, você pode usar o método
setLocaledo hookuseLocale:src/components/LocaleSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
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", }, });Isto provoca uma nova renderização de todos os componentes que utilizam conteúdo do Intlayer, mostrando agora as traduções para a nova localidade.
Veja a documentação de
useLocalepara mais detalhes.
Configurar TypeScript (se usar TypeScript)
O Intlayer gera definições de tipos numa pasta oculta (por defeito .intlayer) para melhorar a autocompletação e detetar erros de tradução:
Copiar o código para a área de transferência
// tsconfig.json{ // ... sua configuração TS existente "include": [ "src", // seu código fonte ".intlayer/types/**/*.ts", // <-- garantir que os tipos gerados automaticamente estejam incluídos // ... qualquer outra coisa que você já inclua ],}Isto é o que habilita funcionalidades como:
- Autocompletar para as chaves do seu dicionário.
- Verificação de tipos que avisa se você acessar uma chave inexistente ou incompatível com o tipo.
Configuração do Git
Para evitar o commit de arquivos gerados automaticamente pelo Intlayer, adicione o seguinte ao seu .gitignore:
Copiar o código para a área de transferência
# Ignorar os arquivos gerados pelo Intlayer.intlayerExtensão VS Code
Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a Extensão oficial Intlayer para VS Code.
Instalar a partir do VS Code Marketplace
Esta extensão oferece:
- Autocompletar para chaves de tradução.
- Detecção de erros em tempo real para traduções ausentes.
- Visualizações inline do conteúdo traduzido.
- Ações rápidas para criar e atualizar traduções facilmente.
Para mais detalhes sobre como usar a extensão, consulte a documentação da Extensão Intlayer para VS Code.
Ir Além
- Editor Visual: Use o Editor Visual Intlayer para gerenciar traduções visualmente.
- Integração com CMS: Você também pode externalizar e buscar o conteúdo do seu dicionário a partir de um CMS.
- Comandos CLI: Explore o Intlayer CLI para tarefas como extrair traduções ou verificar chaves faltantes.
Aproveite para construir seus aplicativos React Native com i18n totalmente potencializado através do Intlayer!
Debug
React Native pode ser menos estável do que React Web, então preste atenção extra ao alinhamento de versões.
Intlayer tem como alvo principal a Web Intl API; no React Native você deve incluir os polyfills apropriados.
Checklist:
- Use as últimas versões de
intlayerereact-native-intlayer. - Ative o polyfill do Intlayer.
- Se você usar
getLocaleNameou outros utilitários baseados em Intl-API, importe esses polyfills cedo (por exemplo emindex.jsouApp.tsx):
Copiar o código para a área de transferência
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";- Verifique sua configuração do Metro (resolver aliases, asset plugins, caminhos de
tsconfig) se os módulos falharem em resolver.