- Keys e params type-safe
- Inferidos do seu texto
- Tamanho do runtime (gzip)
- ~3 KB, zero deps
- 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
- O build falha
- Formato de catálogo
- JSON puro
Escrevatexto natural. Publiquetraduçõestype-safe.
O compilador extrai suas mensagens, gera os tipos e separa os bundles por idioma. Uma tradução faltando quebra o build, então ela nunca chega aos seus usuários.
Funcionalidades
Por que Verbaly
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.
import verbaly from '@verbaly/vite';
export default { plugins: [verbaly()] };Tipos das suas mensagens
O próprio texto declara seus params, então se você esquecer um o TypeScript te barra.
t('inbox', { count: 3 }); ✓
t('inbox'); ✗ { count: number }O gate do build
Traduções faltando abortam o vite build, então chaves cruas nunca chegam aos seus usuários.
✗ [es] x7Ka9q2f: "Welcome back"
✓ all locales completeHTML 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.
<h1 data-verbaly="home.title"></h1>
<p data-verbaly="inbox" data-verbaly-args='{"count":3}'></p>Comparar
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 KB, zero deps | ~14 KB (+9 KB react) | ~5 KB | ~0 (compilado) |
| 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 | O build falha | Warning em runtime | Etapa de CI | O build falha |
| Formato de catálogo | JSON puro | JSON | PO / JSON | Formato inlang |
- Keys e params type-safe
- Plugin / manual
- Tamanho do runtime (gzip)
- ~14 KB (+9 KB react)
- Manutenção de keys
- À mão
- Conteúdo dinâmico / CMS
- Sim
- HTML puro (sem framework)
- —
- Traduções faltantes
- Warning em runtime
- Formato de catálogo
- JSON
- Keys e params type-safe
- Parcial
- Tamanho do runtime (gzip)
- ~5 KB
- Manutenção de keys
- Etapa extract → compile
- Conteúdo dinâmico / CMS
- Sim
- HTML puro (sem framework)
- —
- Traduções faltantes
- Etapa de CI
- Formato de catálogo
- PO / JSON
- Keys e params type-safe
- Sim
- Tamanho do runtime (gzip)
- ~0 (compilado)
- Manutenção de keys
- À mão
- Conteúdo dinâmico / CMS
- Fraco
- HTML puro (sem framework)
- —
- Traduções faltantes
- O build falha
- Formato de catálogo
- Formato inlang
Os tamanhos são pegadas gzip aproximadas do runtime; cada projeto pondera os trade-offs de forma diferente.
Comece aqui
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, dois pacotes.
pnpm add verbaly @verbaly/viteAdicione 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 # the build gate, in your pipeline
Prefere quebrar você mesmo?
Edite os catálogos, troque de idioma e esvazie uma tradução, tudo no runtime real, ao vivo.