Introdução à Internacionalização (i18n) com Intlayer e React Native

    O que é Intlayer?

    Intlayer é uma biblioteca de internacionalização (i18n) inovadora e de código aberto que simplifica o suporte a vários idiomas em aplicações modernas. Ele funciona em muitos ambientes JavaScript/TypeScript, incluindo React Native (através do pacote react-intlayer).

    Com o Intlayer, você pode:

    • Gerenciar traduções facilmente usando dicionários declarativos no nível do componente.
    • Garantir suporte ao TypeScript com geração automática de tipos.
    • Localizar dinamicamente conteúdos, incluindo textos da interface do usuário (e, no React para a web, também pode localizar metadados HTML, etc.).
    • Aproveitar recursos avançados, como detecção e troca dinâmica de idioma.

    Passo 1: Instalar Dependências

    No seu projeto React Native, instale os seguintes pacotes:

    bash
    npm install intlayer react-intlayer react-native-intlayer

    Pacotes

    • intlayer
      O kit de ferramentas i18n principal para configuração, dicionários de conteúdo, geração de tipos e comandos CLI.

    • react-intlayer
      Integração com React que fornece os provedores de contexto e hooks React necessários para obter e alterar idiomas no React Native.

    • react-native-intlayer
      Integração específica para React Native que fornece o plugin do Metro para integrar o Intlayer ao empacotador do React Native.


    Passo 2: Criar uma Configuração do Intlayer

    No diretório raiz do seu projeto (ou em qualquer local conveniente), crie um arquivo de configuração do Intlayer. Ele pode se parecer com este:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [      Locales.ENGLISH,      Locales.FRENCH,      Locales.SPANISH,      // ... Adicione quaisquer outros idiomas necessários    ],    defaultLocale: Locales.ENGLISH,  },};export default config;

    Nesta configuração, você pode:

    • Definir a lista de idiomas suportados.
    • Configurar um idioma padrão.
    • Mais tarde, adicionar opções avançadas (por exemplo, logs, diretórios personalizados para conteúdo, etc.).
    • Consulte a documentação de configuração do Intlayer para mais informações.

    Passo 3: Adicionar o Plugin do Metro

    O Metro é o empacotador padrão para projetos React Native criados com react-native init. Para usar o Intlayer com o Metro, adicione o plugin ao seu arquivo 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);})();

    Passo 4: Adicionar o Provedor do Intlayer

    Para manter a sincronização do idioma do usuário em toda a aplicação, envolva seu componente raiz com o IntlayerProvider do react-intlayer.

    Além disso, adicione a função intlayerPolyfill ao seu arquivo index.js para garantir que o Intlayer funcione corretamente.

    app/_layout.tsx
    import { Stack } from "expo-router";import { getLocales } from "expo-localization";import { IntlayerProviderContent } from "react-intlayer";import { intlayerPolyfill } from "react-native-intlayer";import { type FC } from "react";intlayerPolyfill();const getDeviceLocale = () => getLocales()[0]?.languageTag;const RootLayout: FC = () => {  return (    <IntlayerProviderContent locale={getDeviceLocale()}>      <Stack>        <Stack.Screen name="(tabs)" options={{ headerShown: false }} />      </Stack>    </IntlayerProviderContent>  );};export default RootLayout;

    Passo 5: Declarar Seu Conteúdo

    Crie arquivos de declaração de conteúdo em qualquer lugar do seu projeto (geralmente dentro de src/), usando qualquer um dos formatos suportados pelo Intlayer:

    • .content.ts
    • .content.mjs
    • .content.cjs
    • .content.json
    • etc.

    Exemplo:

    src/app.content.tsx
    import { t, type Dictionary } from "intlayer";/** * Dicionário de conteúdo para a tela inicial */const homeScreenContent = {  key: "home-screen",  content: {    title: t({      en: "Welcome!",      fr: "Bienvenue!",      es: "¡Bienvenido!",      pt: "Bem-vindo!",    }),  },} satisfies Dictionary;export default homeScreenContent;

    Para mais detalhes sobre a declaração de conteúdo, consulte a documentação do Intlayer.


    Passo 6: Usar o Intlayer nos Seus Componentes

    Use o hook useIntlayer para obter conteúdos traduzidos nos seus componentes:

    app/(tabs)/index.tsx
    import { useIntlayer } from "react-intlayer";import { ThemedText } from "@/components/ThemedText";const HomeScreen = () => {  const { title } = useIntlayer("home-screen");  return <ThemedText type="title">{title}</ThemedText>;};export default HomeScreen;

    (Opcional) Passo 7: Alterar o Idioma do Aplicativo

    Para mudar o idioma dentro dos seus componentes, use o método setLocale do hook useLocale:

    src/components/LocaleSwitcher.tsx
    import { Button } from "react-native";import { Locales } from "intlayer";import { useLocale } from "react-intlayer";const LocaleSwitcher = () => {  const { setLocale } = useLocale();  return (    <Button      title="Mudar para Francês"      onPress={() => setLocale(Locales.FRENCH)}    />  );};

    Configuração do Git

    Para evitar o commit de arquivos gerados automaticamente pelo Intlayer, adicione ao seu .gitignore:

    plaintext
    # Ignorar arquivos gerados pelo Intlayer.intlayer

    Vá Além

    Se você tiver uma ideia para melhorar esta documentação, sinta-se à vontade para contribuir enviando uma pull request no GitHub.

    Link do GitHub para a documentação