- Keys y params type-safe
- Inferidos de tu texto
- Tamaño del runtime (gzip)
- ~3 KB, cero deps
- Mantenimiento de keys
- Ninguno, se extraen
- Contenido dinámico / CMS
- Ruta runtime real
- HTML plano (sin framework)
- Intérprete de DOM
- Traducciones faltantes
- El build falla
- Formato de catálogo
- JSON plano
Escribetexto natural. Publicatraduccionestype-safe.
El compilador extrae tus mensajes, genera los tipos y separa los bundles por idioma. Una traducción faltante rompe el build, así que nunca llega a tus usuarios.
Funcionalidades
Por qué Verbaly
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.
import verbaly from '@verbaly/vite';
export default { plugins: [verbaly()] };Tipos desde tus mensajes
El propio texto declara sus params, así que si olvidas uno TypeScript te detiene.
t('inbox', { count: 3 }); ✓
t('inbox'); ✗ { count: number }El gate del build
Las traducciones faltantes abortan vite build, así que las claves crudas nunca llegan a tus usuarios.
✗ [es] x7Ka9q2f: "Welcome back"
✓ all locales completeHTML 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.
<h1 data-verbaly="home.title"></h1>
<p data-verbaly="inbox" data-verbaly-args='{"count":3}'></p>Comparar
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 KB, cero deps | ~14 KB (+9 KB react) | ~5 KB | ~0 (compilado) |
| 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 | El build falla | Warning en runtime | Paso de CI | El build falla |
| Formato de catálogo | JSON plano | JSON | PO / JSON | Formato inlang |
- Keys y params type-safe
- Plugin / manual
- Tamaño del runtime (gzip)
- ~14 KB (+9 KB react)
- Mantenimiento de keys
- A mano
- Contenido dinámico / CMS
- Sí
- HTML plano (sin framework)
- —
- Traducciones faltantes
- Warning en runtime
- Formato de catálogo
- JSON
- Keys y params type-safe
- Parcial
- Tamaño del runtime (gzip)
- ~5 KB
- Mantenimiento de keys
- Paso extract → compile
- Contenido dinámico / CMS
- Sí
- HTML plano (sin framework)
- —
- Traducciones faltantes
- Paso de CI
- Formato de catálogo
- PO / JSON
- Keys y params type-safe
- Sí
- Tamaño del runtime (gzip)
- ~0 (compilado)
- Mantenimiento de keys
- A mano
- Contenido dinámico / CMS
- Débil
- HTML plano (sin framework)
- —
- Traducciones faltantes
- El build falla
- Formato de catálogo
- Formato inlang
Los tamaños son huellas gzip aproximadas del runtime; cada proyecto pondera los trade-offs distinto.
Empieza aquí
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
Un comando, dos paquetes.
pnpm add verbaly @verbaly/viteAgrega 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 # the build gate, in your pipeline
¿Prefieres romperlo tú mismo?
Edita los catálogos, cambia de idioma y vacía una traducción, todo en el runtime real, en vivo.