Autor:
    Criação:2026-03-23Última atualização:2026-05-31

    Traduza o seu website Vite e Vanilla JS usando Intlayer | Internacionalização (i18n)

    ide.intlayer.org
    intlayer-vite-vanilla.vercel.app

    Índice

    Por que Intlayer em vez de alternativas?

    Comparado com soluções principais como i18next ou i18n.js, Intlayer é uma solução que vem com otimizações integradas como:

    O Intlayer é otimizado para funcionar perfeitamente com o Vite, oferecendo gerenciamento de conteúdo independente de estrutura, suporte a TypeScript e todos os recursos necessários para dimensionar a internacionalização (i18n).

    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 bundle e das páginas em até 50%.

    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 agent skills, 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(/pt/doc/concept/editor) 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.


    Guia Passo a Passo para Configurar o Intlayer numa Aplicação Vite e Vanilla JS

    1. Instalar Dependências

      Instale os pacotes necessários usando o npm:

      bash
      npx intlayer init --interactive
      
      a flag --interactive é opcional. Use intlayer-cli init se você for um agente de IA.
      Este comando detectará seu ambiente e instalará os pacotes necessários. Por exemplo:
      bash
      npm install intlayer vanilla-intlayer
      npm install vite-intlayer --save-dev
      
      • intlayer O pacote principal que fornece ferramentas de internacionalização para gestão de configuração, tradução, declaração de conteúdo, transpilação e comandos CLI.

      • vanilla-intlayer O pacote que integra o Intlayer com aplicações em JavaScript puro / TypeScript. Ele fornece um singleton pub/sub (IntlayerClient) e auxiliares baseados em callbacks (useIntlayer, useLocale, etc.) para que qualquer parte da sua aplicação possa reagir a mudanças de idioma sem depender de um framework de UI.

      • vite-intlayer Inclui o plugin Vite para integrar o Intlayer com o bundler Vite, bem como middleware para detetar o idioma preferido do utilizador, gerir cookies e lidar com redirecionamento de URL.

    2. Configuração do seu projeto

      Crie um arquivo de configuração para configurar os idiomas da sua aplicação:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            // Seus outros idiomas
          ],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      
      Através deste arquivo de configuração, você pode configurar URLs localizadas, redirecionamento de middleware, nomes de cookies, a localização e extensão das suas declarações de conteúdo, desativar logs do Intlayer na consola e muito mais. Para uma lista completa de parâmetros disponíveis, consulte a documentação de configuração.
    3. Integrar o Intlayer na sua configuração do Vite

      Adicione o plugin intlayer na sua configuração.

      vite.config.ts
      import { defineConfig } from "vite";
      import { intlayer } from "vite-intlayer";
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [
          intlayer({
            proxy: {
              ignore: (req) => req.url?.startsWith("/api"),
            },
          }),
        ],
      });
      
      O plugin Vite intlayer() é usado para integrar o Intlayer com o Vite. Ele garante a construção de arquivos de declaração de conteúdo e monitoriza-os em modo de desenvolvimento. Ele define variáveis de ambiente do Intlayer dentro da aplicação Vite. Além disso, ele fornece aliases para otimizar o desempenho.
    4. Bootstrap do Intlayer no seu ponto de entrada

      Chame installIntlayer() antes de qualquer conteúdo ser renderizado para que o singleton de idioma global esteja pronto.

      src/main.ts
      import { installIntlayer } from "vanilla-intlayer";
      
      // Deve ser chamado antes de renderizar qualquer conteúdo i18n.
      installIntlayer();
      
      // Importe e execute os módulos da sua aplicação.
      import "./app.js";
      

      Se você também usar declarações de conteúdo md() (Markdown), instale também o renderizador de markdown:

      src/main.ts
      import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";
      
      installIntlayer();
      installIntlayerMarkdown();
      
      import "./app.js";
      
    5. Declarar o seu conteúdo

      Crie e girar as suas declarações de conteúdo para armazenar traduções:

      src/app.content.ts
      import { insert, t, type Dictionary } from "intlayer";
      
      const appContent = {
        key: "app",
        content: {
          title: "Vite + Vanilla",
      
          viteLogoLabel: t({
            en: "Vite Logo",
            fr: "Logo Vite",
            es: "Logo Vite",
          }),
      
          count: insert(
            t({
              en: "count is {{count}}",
              fr: "le compte est {{count}}",
              es: "el recuento es {{count}}",
            })
          ),
      
          readTheDocs: t({
            en: "Click on the Vite logo to learn more",
            fr: "Cliquez sur le logo Vite pour en savoir plus",
            es: "Clique no logótipo do Vite para saber mais",
          }),
        },
      } satisfies Dictionary;
      
      export default appContent;
      

      As suas declarações de conteúdo podem ser definidas em qualquer lugar da sua aplicação, desde que sejam incluídas no diretório contentDir (por padrão, ./src). E coincidam com a extensão de arquivo de declaração de conteúdo (por padrão, .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).

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

    6. Usar o Intlayer no seu JavaScript

      O vanilla-intlayer espelha a API de superfície do react-intlayer: useIntlayer(key, locale?) retorna o conteúdo traduzido diretamente. Encadeie .onChange() no resultado para subscrever mudanças de idioma - o equivalente explícito de uma re-renderização do React.

      src/main.ts
      import { installIntlayer, useIntlayer } from "vanilla-intlayer";
      
      installIntlayer();
      
      // Obtenha o conteúdo inicial para o idioma atual.
      // Encadeie .onChange() para ser notificado sempre que o idioma mudar.
      const content = useIntlayer("app").onChange((newContent) => {
        // Re-renderize ou atualize apenas os nós DOM afetados
        document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
          newContent.title
        );
        document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
          String(newContent.readTheDocs);
      });
      
      // Renderização inicial
      document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
        content.title
      );
      document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
        String(content.readTheDocs);
      

      Aceda aos valores terminais como strings envolvendo-os em String(), que chama o método toString() do nó e retorna o texto traduzido.

      Quando precisar do valor para um atributo HTML nativo (ex: alt, aria-label), use .value diretamente:

      typescript
      img.alt = content.viteLogoLabel.value;
      
    7. Alterar o idioma do seu conteúdo

      Opcional

      Para alterar o idioma do seu conteúdo, use a função setLocale exposta pelo useLocale.

      src/locale-switcher.ts
      import { getLocaleName } from "intlayer";
      import { useLocale } from "vanilla-intlayer";
      
      export function setupLocaleSwitcher(container: HTMLElement): () => void {
        const { locale, availableLocales, setLocale, subscribe } = useLocale();
      
        const select = document.createElement("select");
        select.setAttribute("aria-label", "Language");
      
        const render = (currentLocale: string) => {
          select.innerHTML = availableLocales
            .map(
              (loc) =>
                `<option value="${loc}"${loc === currentLocale ? " selected" : ""}>
                  ${getLocaleName(loc)}
                </option>`
            )
            .join("");
        };
      
        render(locale);
        container.appendChild(select);
      
        select.addEventListener("change", () => setLocale(select.value as any));
      
        // Mantenha o seletor sincronizado quando o idioma mudar de outro lugar
        return subscribe((newLocale) => render(newLocale));
      }
      
    8. Renderizar conteúdo Markdown e HTML

      Opcional

      O Intlayer suporta declarações de conteúdo md() e html(). Em vanilla JS, a saída compilada é inserida como HTML puro via innerHTML.

      Compile e injete o HTML:

      src/main.ts
      import {
        compileMarkdown,
        installIntlayerMarkdown,
        useIntlayer,
      } from "vanilla-intlayer";
      
      installIntlayerMarkdown();
      
      const content = useIntlayer("app").onChange((newContent) => {
        const el = document.querySelector<HTMLDivElement>(".edit-note")!;
        el.innerHTML = compileMarkdown(String(newContent.editNote));
      });
      
      document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =
        compileMarkdown(String(content.editNote));
      
      TIP
      String(content.editNote) chama toString() no IntlayerNode que retorna a string Markdown bruta. Passe-a para o compileMarkdown para obter uma string HTML e, em seguida, defina-a via innerHTML.
      WARNING

      Use apenas innerHTML com conteúdo confiável. Se o markdown vier de entrada do utilizador, sanitize-o primeiro (ex: com DOMPurify). Você pode instalar um renderizador de sanitização dinamicamente:

      typescript
      import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";
      
      await installIntlayerMarkdownDynamic(async () => {
        const DOMPurify = await import("dompurify");
        return (markdown) => DOMPurify.sanitize(compileMarkdown(markdown));
      });
      
    9. Adicionar Roteamento Localizado à sua aplicação

      Opcional

      Para criar rotas exclusivas para cada idioma (útil para SEO), você pode usar o intlayerProxy na sua configuração do Vite para deteção de idioma do lado do servidor.

      Primeiro, adicione o intlayerProxy à sua configuração do Vite:

      Note que para usar o intlayerProxy em produção, você precisa mover o vite-intlayer de devDependencies para dependencies.
      Desde o Intlayer v9, intlayerProxy() é agrupado diretamente no plugin intlayer() e habilitado por padrão através da opção routing.enableProxy (true por padrão). Registrá-lo separadamente, conforme mostrado abaixo, agora é opcional — é mantido para compatibilidade com versões anteriores e para configurações que precisam controlar a ordem dos plugins. Defina routing.enableProxy: false para desabilitar. Veja as notas de lançamento do v9.
      vite.config.ts
      import { defineConfig } from "vite";
      import { intlayer } from "vite-intlayer";
      
      export default defineConfig({
        plugins: [
          intlayer({
            proxy: {
              ignore: (req) => req.url?.startsWith("/api"),
            },
          }),
        ],
      });
      
    10. Alterar o URL quando o idioma mudar

      Opcional

      Para atualizar o URL do navegador quando o idioma mudar, chame useRewriteURL() após instalar o Intlayer:

      src/main.ts
      import { installIntlayer, useRewriteURL } from "vanilla-intlayer";
      
      installIntlayer();
      
      // Reescreve o URL imediatamente e a cada mudança subsequente de idioma.
      // Retorna uma função de cancelamento de subscrição para limpeza.
      const stopRewriteURL = useRewriteURL();
      
    11. Trocar os Atributos de Idioma e Direção HTML

      Opcional

      Atualize os atributos lang e dir da tag <html> para coincidir com o idioma atual para acessibilidade e SEO.

      src/main.ts
      import { getHTMLTextDir } from "intlayer";
      import { installIntlayer, useLocale } from "vanilla-intlayer";
      
      installIntlayer();
      
      useLocale({
        onLocaleChange: (locale) => {
          document.documentElement.lang = locale;
          document.documentElement.dir = getHTMLTextDir(locale);
        },
      });
      
    12. Carregamento preguiçoso (Lazy-load) de dicionários por idioma

      Opcional

      Para aplicações grandes, você pode querer dividir o dicionário de cada idioma no seu próprio chunk. Use useDictionaryDynamic juntamente com o import() dinâmico do Vite:

      src/app.ts
      import { installIntlayer, useDictionaryDynamic } from "vanilla-intlayer";
      
      installIntlayer();
      
      const unsubscribe = useDictionaryDynamic(
        {
          en: () => import("../.intlayer/dictionaries/en/app.mjs"),
          fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),
          es: () => import("../.intlayer/dictionaries/es/app.mjs"),
        },
        "app"
      ).onChange((content) => {
        document.querySelector("h1")!.textContent = String(content.title);
      });
      
      O bundle de cada idioma é obtido apenas quando esse idioma se torna ativo e o resultado é armazenado em cache - trocas subsequentes para o mesmo idioma são instantâneas.
    13. Extrair o conteúdo dos seus componentes

      Opcional

      Se você tiver uma base de código existente, transformar milhares de arquivos pode ser demorado.

      Para facilitar este processo, o Intlayer propõe um compilador / extrator para transformar seus componentes e extrair o conteúdo.

      Para configurá-lo, você pode adicionar uma seção compiler no seu arquivo intlayer.config.ts:

      intlayer.config.ts
      import { type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        // ... Resto da sua config
        compiler: {
          /**
           * Indica se o compilador deve ser habilitado.
           */
          enabled: true,
      
          /**
           * Define o caminho dos arquivos de saída
           */
          output: ({ fileName, extension }) => `./${fileName}${extension}`,
      
          /**
           * Indica se os componentes devem ser salvos após serem transformados.
           * Dessa forma, o compilador pode ser executado apenas uma vez para transformar a aplicação e depois pode ser removido.
           */
          saveComponents: false,
      
          /**
           * Prefixo da chave do dicionário
           */
          dictionaryKeyPrefix: "",
        },
      };
      
      export default config;
      

      Execute o extrator para transformar seus componentes e extrair o conteúdo

      bash
      npx intlayer extract
      
      Since v9, the intlayerCompiler is included in the intlayer plugin. So you don't need to add it manually.

      Atualize o seu vite.config.ts para incluir o plugin intlayerCompiler:

      vite.config.ts
      import { defineConfig } from "vite";
      import { intlayer, intlayerCompiler } from "vite-intlayer";
      
      export default defineConfig({
        plugins: [
          intlayer(),
          intlayerCompiler(), // Adds the compiler plugin
        ],
      });
      
      bash
      npm run build # Ou npm run dev
      

    (Opcional) Sitemap e robots.txt (geração no build)

    A Intlayer expõe utilitários - generateSitemap e getMultilingualUrls - para formatar um sitemap.xml multilíngue e um robots.txt prontos para crawlers e os gravar automaticamente em public/. Normalmente corre um pequeno script Node antes do Vite (por exemplo hooks npm predev / prebuild) para que os ficheiros existam no build ou no servidor de desenvolvimento.

    Sitemap

    O gerador de sitemaps da Intlayer respeita as suas línguas e inclui os metadados habituais.

    O sitemap suporta o espaço de nomes xhtml:link (hreflang). Em vez de listar apenas URLs soltas, a Intlayer liga de forma bidireccional todas as versões localizadas de cada página (por exemplo /about, /fr/about ou /about?lang=fr consoante o modo de rotas).

    Robots.txt

    Use getMultilingualUrls para que as regras Disallow cubram todas as variantes localizadas de caminhos sensíveis.

    1. Criar generate-seo.mjs na raiz do projeto

    generate-seo.mjs
    import fs from "fs";
    import path from "path";
    import { fileURLToPath } from "url";
    import { generateSitemap, getMultilingualUrls } from "intlayer";
    
    const __dirname = path.dirname(fileURLToPath(import.meta.url));
    
    const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(
      /\/$/,
      ""
    );
    
    const pathList = [
      { path: "/", changefreq: "daily", priority: 1.0 },
      { path: "/about", changefreq: "monthly", priority: 0.7 },
    ];
    
    const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });
    fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);
    
    const getAllMultilingualUrls = (urls) =>
      urls.flatMap((url) => Object.values(getMultilingualUrls(url)));
    
    const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);
    
    const robotsTxt = [
      "User-agent: *",
      "Allow: /",
      ...disallowedPaths.map((path) => `Disallow: ${path}`),
      "",
      `Sitemap: ${SITE_URL}/sitemap.xml`,
    ].join("\n");
    
    fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);
    
    console.log("SEO files generated successfully.");
    

    O pacote intlayer tem de estar instalado. Defina SITE_URL no ambiente em produção (por exemplo na CI).

    Prefira generate-seo.mjs para ESM no Node. Se usar generate-seo.js, garanta "type": "module" no package.json ou execute o Node com ESM.

    2. Executar o script antes do Vite

    package.json
    {
      "scripts": {
        "dev": "vite",
        "prebuild": "node generate-seo.mjs",
        "build": "vite build",
        "preview": "vite preview"
      }
    }
    

    Ajuste os comandos se usar pnpm ou yarn. Também pode invocar o script a partir da CI ou de outro passo do pipeline.

    Configurar TypeScript

    Certifique-se de que sua configuração do TypeScript inclua os tipos autogerados.

    tsconfig.json
    {
      "compilerOptions": {
        // ...
      },
      "include": ["src", ".intlayer/**/*.ts"],
    }
    

    Configuração do Git

    É recomendado ignorar os arquivos gerados pelo Intlayer. Isso permite evitar cometê-los no seu repositório Git.

    Para fazer isso, você pode adicionar as seguintes instruções ao seu arquivo .gitignore:

    bash
    # Ignorar os arquivos gerados pelo Intlayer
    .intlayer
    

    Extensão VS Code

    Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a Extensão oficial do Intlayer para VS Code.

    Instalar a partir do VS Code Marketplace

    Esta extensão fornece:

    • Preenchimento automático para chaves de tradução.
    • Deteção de erros em tempo real para traduções ausentes.
    • Visualizações em linha 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 do Intlayer para VS Code.


    Ir Mais Longe

    Para ir mais longe, você pode implementar o editor visual ou externalizar o seu conteúdo usando o CMS.