- Keys y params type-safe
- Inferidos de tu texto
- Tamaño del runtime (gzip)
- 3,31 KB, cero deps (6,13 con DOM + urls)
- Mantenimiento de keys
- Ninguno, se extraen
- Contenido dinámico / CMS
- Ruta runtime real
- HTML plano (sin framework)
- Intérprete de DOM
- Traducciones faltantes
- Falla el CI, cada build la lista
- Traducciones rotas
- Falla el CI, cada build la lista
- Formato de catálogo
- JSON plano
- Agentes de código
- Servidor MCP + skill
Escribe texto natural. Publica traducciones type-safe.
El compilador extrae tus mensajes, genera los tipos y separa los bundles por idioma. Cada build lista una traducción faltante y tu CI la para, así que nunca llega a tus usuarios.
Por qué Verbaly
Cuatro cosas que hace el compilador por ti, y cada una está corriendo aquí mismo.
Cero config, de verdad
Un plugin de Vite. Sin un init() gigante, sin macros de Babel, sin formatos propietarios. Los catálogos son JSON plano que puedes llevar a donde sea.
Las keys son tuyas
Por defecto no escribes ninguna. Ponles nombre cuando quieras leerlas, o decláralas en un módulo cuando son un contrato con algo de fuera de tu app, y Verbaly comprueba cada una contra tu catálogo. El texto no cambia.
Tipos desde tus mensajes
El propio texto declara sus params, así que si olvidas uno TypeScript te detiene.
HTML plano, de primera
¿Sin framework? El intérprete del DOM hidrata los nodos data-verbaly, re-renderiza al cambiar de idioma y observa los elementos nuevos.
El mismo trabajo, menos maquinaria
Una mirada honesta frente a las herramientas que usarías en su lugar. Muestra dónde gana Verbaly y dónde las demás también están bien.
| Funcionalidad | i18next | Lingui | Paraglide | |
|---|---|---|---|---|
| Keys y params type-safe | Inferidos de tu texto | Plugin / manual | Parcial | Sí |
| Tamaño del runtime (gzip) | 3,31 KB, cero deps (6,13 con DOM + urls) | 13,6 KB (23 con React) | 2 KB (4 con React) | compilado, sin runtime compartido |
| Mantenimiento de keys | Ninguno, se extraen | A mano | Paso extract → compile | A mano |
| Contenido dinámico / CMS | Ruta runtime real | Sí | Sí | Débil |
| HTML plano (sin framework) | Intérprete de DOM | — | — | — |
| Traducciones faltantes | Falla el CI, cada build la lista | Warning en runtime | Paso de CI | El build falla |
| Traducciones rotas | Falla el CI, cada build la lista | — | — | — |
| Formato de catálogo | JSON plano | JSON | PO / JSON | Formato inlang |
| Agentes de código | Servidor MCP + skill | — | Skill | — |
- Keys y params type-safe
- Plugin / manual
- Tamaño del runtime (gzip)
- 13,6 KB (23 con React)
- Mantenimiento de keys
- A mano
- Contenido dinámico / CMS
- Sí
- HTML plano (sin framework)
- —
- Traducciones faltantes
- Warning en runtime
- Traducciones rotas
- —
- Formato de catálogo
- JSON
- Agentes de código
- —
- Keys y params type-safe
- Parcial
- Tamaño del runtime (gzip)
- 2 KB (4 con React)
- Mantenimiento de keys
- Paso extract → compile
- Contenido dinámico / CMS
- Sí
- HTML plano (sin framework)
- —
- Traducciones faltantes
- Paso de CI
- Traducciones rotas
- —
- Formato de catálogo
- PO / JSON
- Agentes de código
- Skill
- Keys y params type-safe
- Sí
- Tamaño del runtime (gzip)
- compilado, sin runtime compartido
- Mantenimiento de keys
- A mano
- Contenido dinámico / CMS
- Débil
- HTML plano (sin framework)
- —
- Traducciones faltantes
- El build falla
- Traducciones rotas
- —
- Formato de catálogo
- Formato inlang
- Agentes de código
- —
De palabras a idiomas publicados
Tres pasos y una barrera, o deja que verbaly init lo genere todo con un comando. Sin archivos de keys a mano: el compilador hace la parte aburrida mientras tú sigues escribiendo el copy del producto.
Instala
Una orden, tres paquetes: el runtime, el plugin y el comando.
pnpm add verbaly @verbaly/vite @verbaly/compilerAgrega el plugin
Apúntalo al idioma en el que escribes.
vite.config.tsimport verbaly from '@verbaly/vite'; export default { plugins: [verbaly({ sourceLocale: 'es' })] };Escribe texto, no claves
Claves, tipos y catálogos: generados.
src/app.tsimport { t, setLocale } from 'virtual:verbaly'; t`Hola ${name}`; // keys, types & catalogs: generated await setLocale('pt'); // lazy-loads its chunkDeja que CI lo vigile
Sale con 1 mientras algún idioma esté incompleto, así que el texto sin traducir nunca se publica.
.github/workflows/ci.yml- run: npx verbaly check # exits 1 on a missing or broken translation
Tu primera página traducida, en cinco minutos.
Instala, añade el plugin y escribe texto. Verbaly extrae los mensajes, genera los tipos y carga cada idioma cuando alguien lo pide.
¿Ya tienes catálogos? Ábrelos en Studio