Creation:2026-03-23Last update:2026-05-06

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

    ide.intlayer.org

    Índice

    O que é o Intlayer?

    Intlayer é uma biblioteca de internacionalização (i18n) inovadora e de código aberto projetada para simplificar o suporte multilíngue em aplicações web modernas.

    Com o Intlayer, você pode:

    • Gerir facilmente traduções usando dicionários declarativos ao nível do componente.
    • Localizar dinamicamente metadados, rotas e conteúdo.
    • Garantir o suporte a TypeScript com tipos autogerados, melhorando o preenchimento automático e a deteção de erros.
    • Beneficiar de funcionalidades avançadas, como deteção e troca dinâmica de idioma.

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

    Passo 1: Instalar Dependências

    Instale os pacotes necessários usando o npm:

    bash
    npm install intlayer vanilla-intlayernpm install vite-intlayer --save-devnpx intlayer init
    • 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.

    Passo 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.

    Passo 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()],
    });
    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.

    Passo 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";

    Passo 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}).

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

    Passo 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 inicialdocument.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;

    (Opcional) Passo 7: Alterar o idioma do seu conteúdo

    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));}

    (Opcional) Passo 8: Renderizar conteúdo Markdown e HTML

    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));});

    (Opcional) Passo 9: Adicionar Roteamento Localizado à sua aplicação

    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.
    vite.config.ts
    import { defineConfig } from "vite";
    import { intlayer, intlayerProxy } from "vite-intlayer";
    
    export default defineConfig({
      plugins: [
        intlayerProxy(), // deve ser colocado primeiro
        intlayer(),
      ],
    });

    (Opcional) Passo 10: Alterar o URL quando o idioma mudar

    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();

    (Opcional) Passo 11: Trocar os Atributos de Idioma e Direção HTML

    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);  },});

    (Opcional) Passo 12: Carregamento preguiçoso (Lazy-load) de dicionários por idioma

    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.

    (Opcional) Passo 13: Extrair o conteúdo dos seus componentes

    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

    (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.