- Keys e params type-safe
- Inferidos do seu texto
- Tamanho do runtime (gzip)
- 3,31 KB, zero deps (6,13 com DOM + urls)
- Manutenção de keys
- Nenhuma, extraídas
- Conteúdo dinâmico / CMS
- Rota runtime real
- HTML puro (sem framework)
- Interpretador de DOM
- Traduções faltantes
- Falha o CI, cada build a lista
- Traduções quebradas
- Falha o CI, cada build a lista
- Formato de catálogo
- JSON puro
- Agentes de código
- Servidor MCP + skill
Escreva texto natural. Publique traduções type-safe.
O compilador extrai suas mensagens, gera os tipos e separa os bundles por idioma. Cada build lista uma tradução faltando e o seu CI a barra, então ela nunca chega aos seus usuários.
Por que Verbaly
Quatro coisas que o compilador faz por você, e cada uma está rodando aqui mesmo.
Zero config, de verdade
Um plugin do Vite. Sem um init() gigante, sem macros do Babel, sem formatos proprietários. Os catálogos são JSON puro que você leva para qualquer lugar.
As keys são suas
Por padrão você não escreve nenhuma. Dê nome a elas quando quiser lê-las, ou declare-as em um módulo quando forem um contrato com algo fora do seu app, e o Verbaly verifica cada uma contra o seu catálogo. O texto não muda.
Tipos das suas mensagens
O próprio texto declara seus params, então se você esquecer um o TypeScript te barra.
HTML puro, de primeira
Sem framework? O interpretador do DOM hidrata os nós data-verbaly, re-renderiza ao trocar o idioma e observa novos elementos.
O mesmo trabalho, menos maquinaria
Um olhar honesto frente às ferramentas que você usaria no lugar. Mostra onde o Verbaly ganha e onde as outras também funcionam bem.
| Funcionalidade | i18next | Lingui | Paraglide | |
|---|---|---|---|---|
| Keys e params type-safe | Inferidos do seu texto | Plugin / manual | Parcial | Sim |
| Tamanho do runtime (gzip) | 3,31 KB, zero deps (6,13 com DOM + urls) | 13,6 KB (23 com React) | 2 KB (4 com React) | compilado, sem runtime compartilhado |
| Manutenção de keys | Nenhuma, extraídas | À mão | Etapa extract → compile | À mão |
| Conteúdo dinâmico / CMS | Rota runtime real | Sim | Sim | Fraco |
| HTML puro (sem framework) | Interpretador de DOM | — | — | — |
| Traduções faltantes | Falha o CI, cada build a lista | Warning em runtime | Etapa de CI | O build falha |
| Traduções quebradas | Falha o CI, cada build a lista | — | — | — |
| Formato de catálogo | JSON puro | JSON | PO / JSON | Formato inlang |
| Agentes de código | Servidor MCP + skill | — | Skill | — |
- Keys e params type-safe
- Plugin / manual
- Tamanho do runtime (gzip)
- 13,6 KB (23 com React)
- Manutenção de keys
- À mão
- Conteúdo dinâmico / CMS
- Sim
- HTML puro (sem framework)
- —
- Traduções faltantes
- Warning em runtime
- Traduções quebradas
- —
- Formato de catálogo
- JSON
- Agentes de código
- —
- Keys e params type-safe
- Parcial
- Tamanho do runtime (gzip)
- 2 KB (4 com React)
- Manutenção de keys
- Etapa extract → compile
- Conteúdo dinâmico / CMS
- Sim
- HTML puro (sem framework)
- —
- Traduções faltantes
- Etapa de CI
- Traduções quebradas
- —
- Formato de catálogo
- PO / JSON
- Agentes de código
- Skill
- Keys e params type-safe
- Sim
- Tamanho do runtime (gzip)
- compilado, sem runtime compartilhado
- Manutenção de keys
- À mão
- Conteúdo dinâmico / CMS
- Fraco
- HTML puro (sem framework)
- —
- Traduções faltantes
- O build falha
- Traduções quebradas
- —
- Formato de catálogo
- Formato inlang
- Agentes de código
- —
De palavras a idiomas publicados
Três passos e uma barreira, ou deixe o verbaly init gerar tudo com um comando. Sem arquivos de keys à mão: o compilador faz a parte chata enquanto você continua escrevendo o copy do produto.
Instale
Um comando, três pacotes: o runtime, o plugin e o comando.
pnpm add verbaly @verbaly/vite @verbaly/compilerAdicione o plugin
Aponte para o idioma em que você escreve.
vite.config.tsimport verbaly from '@verbaly/vite'; export default { plugins: [verbaly({ sourceLocale: 'es' })] };Escreva texto, não chaves
Chaves, tipos e catálogos: gerados.
src/app.tsimport { t, setLocale } from 'virtual:verbaly'; t`Hola ${name}`; // keys, types & catalogs: generated await setLocale('pt'); // lazy-loads its chunkDeixe o CI vigiar
Sai com 1 enquanto algum idioma estiver incompleto, então texto sem tradução nunca é publicado.
.github/workflows/ci.yml- run: npx verbaly check # exits 1 on a missing or broken translation
Sua primeira página traduzida, em cinco minutos.
Instale, adicione o plugin e escreva o texto. O Verbaly extrai as mensagens, gera os tipos e carrega cada idioma quando alguém pede.
Já tem catálogos? Abra no Studio