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
- "Atualizar o uso da API useIntlayer do Solid para acesso direto a propriedades"v8.9.004/05/2026
- "Histórico inicial"v8.4.1023/03/2026
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 o seu website Vite e Lit usando Intlayer | Internacionalização (i18n)
Tabela de Conteúdos
Por que Intlayer em vez de alternativas?
Comparado com soluções principais como lit-localize ou i18next, Intlayer é uma solução que vem com otimizações integradas como:
O Intlayer é otimizado para funcionar perfeitamente com o Lit, oferecendo escopo de conteúdo em nível de componente da Web, 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 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(/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 Lit
Instalar Dependências
Instale os pacotes necessários usando npm:
bashCopiar códigoCopiar o código para a área de transferência
npm install intlayer lit-intlayernpm install vite-intlayer --save-devnpx intlayer initintlayer
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.
lit-intlayer O pacote que integra o Intlayer com aplicações Lit. Fornece hooks baseados em
ReactiveController(useIntlayer,useLocale, etc.) para que os LitElements sejam renderizados novamente de forma automática quando o idioma muda.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.
Configuração do seu projeto
Crie um ficheiro de configuração para configurar os idiomas da sua aplicação:
intlayer.config.tsCopiar códigoCopiar o código para a área de transferência
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Os seus outros idiomas ], defaultLocale: Locales.ENGLISH, }, }; export default config;Através deste ficheiro de configuração, pode configurar URLs localizados, redirecionamento de middleware, nomes de cookies, a localização e extensão das suas declarações de conteúdo, desativar os logs do Intlayer na consola e muito mais. Para uma lista completa de parâmetros disponíveis, consulte a documentação de configuração.
Integrar o Intlayer na sua Configuração Vite
Adicione o plugin intlayer na sua configuração.
vite.config.tsCopiar códigoCopiar o código para a área de transferência
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. Garante a construção dos ficheiros de declaração de conteúdo e monitoriza-os em modo de desenvolvimento. Define variáveis de ambiente do Intlayer dentro da aplicação Vite. Adicionalmente, fornece pseudónimos para otimizar o desempenho.Inicializar o Intlayer no seu ponto de entrada
Chame
installIntlayer()antes de quaisquer elementos personalizados serem registados para que o singleton global de idioma esteja pronto quando o primeiro elemento se ligar.src/main.tsCopiar códigoCopiar o código para a área de transferência
import { installIntlayer } from "lit-intlayer";// Deve ser chamado antes de qualquer LitElement ser ligado ao DOM.installIntlayer();// Importe e registe os seus elementos personalizados.import "./my-element.js";Se também usar declarações de conteúdo
md()(Markdown), instale também o renderizador de markdown:src/main.tsCopiar códigoCopiar o código para a área de transferência
import { installIntlayer, installIntlayerMarkdown } from "lit-intlayer";installIntlayer();installIntlayerMarkdown();import "./my-element.js";Declarar o Seu Conteúdo
Crie e gira as suas declarações de conteúdo para armazenar traduções:
src/app.content.tsCopiar códigoCopiar o código para a área de transferência
import { t, type Dictionary } from "intlayer"; const appContent = { key: "app", content: { title: "Vite + Lit", viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite", }), litLogo: t({ en: "Lit logo", fr: "Logo Lit", es: "Logo Lit", }), count: t({ en: "count is {{count}}", fr: "le compte est {{count}}", es: "el recuento es {{count}}", }), readTheDocs: t({ en: "Click on the Vite and Lit logos to learn more", fr: "Cliquez sur les logos Vite et Lit pour en savoir plus", es: "Haga clic en los logotipos de Vite y Lit para obtener más información", }), }, } 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 correspondam à extensão do ficheiro 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.
Utilizar o Intlayer no seu LitElement
Use o
useIntlayerdentro de umLitElement. Ele retorna um proxyReactiveControllerque ativa automaticamente re-renderizações sempre que o idioma ativo muda - não é necessária configuração extra.src/my-element.tsCopiar códigoCopiar o código para a área de transferência
import { LitElement, html } from "lit";import { customElement, property } from "lit/decorators.js";import { useIntlayer } from "lit-intlayer";@customElement("my-element")export class MyElement extends LitElement { @property({ type: Number }) count = 0; // useIntlayer regista-se como um ReactiveController. // O elemento é renderizado novamente de forma automática quando o idioma muda. private content = useIntlayer(this, "app"); override render() { const { content } = this; return html` <h1>${content.title}</h1> <img src="/vite.svg" alt=${content.viteLogo.value} /> <img src="/lit.svg" alt=${content.litLogo.value} /> <button @click=${() => this.count++}> ${content.count({ count: this.count })} </button> <p>${content.readTheDocs}</p> `; }}Quando precisar da string traduzida num atributo HTML nativo (ex:
alt,aria-label,title), chame.valueno nó folha:typescriptCopiar códigoCopiar o código para a área de transferência
html`<img alt=${content.viteLogo.value} />`;html`<img alt=${content.viteLogo.toString()} />`;html`<img alt=${String(content.viteLogo)} />`;Alterar o idioma do seu conteúdo
OpcionalPara alterar o idioma do seu conteúdo, use o método
setLocaleexposto pelo controladoruseLocale.src/locale-switcher.tsCopiar códigoCopiar o código para a área de transferência
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getLocaleName } from "intlayer";import { useLocale } from "lit-intlayer";@customElement("locale-switcher")export class LocaleSwitcher extends LitElement { private locale = useLocale(this); private _onChange(e: Event) { const select = e.target as HTMLSelectElement; this.locale.setLocale(select.value as any); } override render() { return html` <select @change=${this._onChange}> ${this.locale.availableLocales.map( (loc) => html` <option value=${loc} ?selected=${loc === this.locale.locale}> ${getLocaleName(loc)} </option> ` )} </select> `; }}Renderizar conteúdo Markdown e HTML
OpcionalO Intlayer suporta declarações de conteúdo
md()ehtml(). No Lit, a saída compilada é injetada como HTML bruto através da diretivaunsafeHTML.Renderize o HTML compilado no seu elemento:
src/my-element.tsCopiar códigoCopiar o código para a área de transferência
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { unsafeHTML } from "lit/directives/unsafe-html.js";import { useIntlayer } from "lit-intlayer";import { compileMarkdown } from "lit-intlayer/markdown";@customElement("my-element")export class MyElement extends LitElement { private content = useIntlayer(this, "app"); override render() { return html` <div class="edit-note"> ${unsafeHTML(compileMarkdown(String(this.content.editNote)))} </div> `; }}TIP String(content.editNote)chamatoString()noIntlayerNode, que retorna a string Markdown bruta. Passe-a paracompileMarkdownpara obter uma string HTML, e depois renderize-a com a diretivaunsafeHTMLdo Lit.Adicionar Localized Routing à sua aplicação
OpcionalPara criar rotas únicas para cada idioma (útil para SEO), pode usar um router do lado do cliente juntamente com os ajudantes
localeMap/localeFlatMapdo Intlayer, e o plugin ViteintlayerProxypara deteção de idioma do lado do servidor.Primeiro, adicione o
intlayerProxyà sua configuração Vite:Note que para usar o
intlayerProxyem produção, precisa de mover ovite-intlayerdedevDependenciesparadependencies.vite.config.tsCopiar códigoCopiar o código para a área de transferência
import { defineConfig } from "vite"; import { intlayer, intlayerProxy } from "vite-intlayer"; export default defineConfig({ plugins: [ intlayerProxy(), // should be placed first intlayer(), ], });Alterar o URL quando o idioma muda
OpcionalPara atualizar o URL do navegador quando o idioma muda, use o
useRewriteURLjuntamente com o seletor de idioma:src/locale-switcher.tsCopiar códigoCopiar o código para a área de transferência
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale, useRewriteURL } from "lit-intlayer";@customElement("locale-switcher")export class LocaleSwitcher extends LitElement { private locale = useLocale(this); // Re-escreve automaticamente o URL atual quando o idioma muda. private _rewriteURL = useRewriteURL(this); private _onChange(e: Event) { const select = e.target as HTMLSelectElement; this.locale.setLocale(select.value as any); } override render() { return html` <select @change=${this._onChange}> ${this.locale.availableLocales.map( (loc) => html` <option value=${loc} ?selected=${loc === this.locale.locale}> ${getLocaleName(loc)} </option> ` )} </select> `; }}Alternar os Atributos de Idioma e Direção HTML
OpcionalAtualize os atributos
langedirda tag<html>para corresponderem ao idioma atual para acessibilidade e SEO.src/my-element.tsCopiar códigoCopiar o código para a área de transferência
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getHTMLTextDir } from "intlayer";import { useLocale } from "lit-intlayer";@customElement("my-element")export class MyElement extends LitElement { private locale = useLocale(this, { onLocaleChange: (loc) => { document.documentElement.lang = loc; document.documentElement.dir = getHTMLTextDir(loc); }, }); override render() { return html`<!-- o seu conteúdo -->`; }}Extrair o conteúdo dos seus componentes
OpcionalSe tiver uma base de código existente, transformar milhares de ficheiros pode ser demorado.
Para facilitar este processo, o Intlayer propõe um compilador / extrator para transformar os seus componentes e extrair o conteúdo.
Para configurá-lo, pode adicionar uma secção
compilerno seu ficheirointlayer.config.ts:intlayer.config.tsCopiar códigoCopiar o código para a área de transferência
import { type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { // ... Restante da sua configuração compiler: { /** * Indica se o compilador deve estar habilitado. */ enabled: true, /** * Define o caminho dos ficheiros de saída */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Indica se os componentes devem ser guardados após serem transformados. * Dessa forma, o compilador pode ser executado apenas uma vez para transformar a app, e depois pode ser removido. */ saveComponents: false, /** * Prefixo da chave do dicionário */ dictionaryKeyPrefix: "", },};export default config;
(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 nomesxhtml: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/aboutou/about?lang=frconsoante 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
Copiar o código para a área de transferência
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).
Prefiragenerate-seo.mjspara ESM no Node. Se usargenerate-seo.js, garanta"type": "module"nopackage.jsonou execute o Node com ESM.
2. Executar o script antes do Vite
Copiar o código para a área de transferência
{ "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 a sua configuração TypeScript inclui os tipos autogerados.
Copiar o código para a área de transferência
{ "compilerOptions": { // ... "experimentalDecorators": true, "useDefineForClassFields": false, }, "include": ["src", ".intlayer/**/*.ts"],}experimentalDecoratorseuseDefineForClassFields: falsesão exigidos pelo Lit para suporte a decoradores.
Configuração Git
Recomenda-se ignorar os ficheiros gerados pelo Intlayer. Isso permite-lhe evitar submetê-los para o seu repositório Git.
Para fazer isso, pode adicionar as seguintes instruções ao seu ficheiro .gitignore:
Copiar o código para a área de transferência
# Ignorar os ficheiros gerados pelo Intlayer.intlayerExtensão VS Code
Para melhorar a sua experiência de desenvolvimento com o Intlayer, pode instalar a Extensão oficial Intlayer VS Code.
Instalar a partir do VS Code Marketplace
Esta extensão fornece:
- Autocompletar para chaves de tradução.
- Deteção de erros em tempo real para traduções em falta.
- Pré-visualizações inline de 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 VS Code.
Ir Mais Longe
Para ir mais longe, pode implementar o editor visual ou externalizar o seu conteúdo usando o CMS.