Saltar al contenido
v0.72.0última

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.

Integraciones
~3 KBruntime
13paquetes
MITlicencia
i18n que se siente sin config

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.

FuncionalidadVerbalyVerbalyi18nextLinguiParaglide
Keys y params type-safeInferidos de tu textoPlugin / manualParcialSí
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 keysNinguno, se extraenA manoPaso extract → compileA mano
Contenido dinámico / CMSRuta runtime realSíSíDébil
HTML plano (sin framework)Intérprete de DOM———
Traducciones faltantesFalla el CI, cada build la listaWarning en runtimePaso de CIEl build falla
Traducciones rotasFalla el CI, cada build la lista———
Formato de catálogoJSON planoJSONPO / JSONFormato inlang
Agentes de códigoServidor MCP + skill—Skill—
VerbalyVerbaly
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
i18next
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
—
Lingui
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
Paraglide
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.

  1. Instala

    Una orden, tres paquetes: el runtime, el plugin y el comando.

     pnpm add verbaly @verbaly/vite @verbaly/compiler
  2. Agrega el plugin

    Apúntalo al idioma en el que escribes.

    vite.config.ts
    import verbaly from '@verbaly/vite';
    
    export default { plugins: [verbaly({ sourceLocale: 'es' })] };
  3. Escribe texto, no claves

    Claves, tipos y catálogos: generados.

    src/app.ts
    import { t, setLocale } from 'virtual:verbaly';
    
    t`Hola ${name}`;      // keys, types & catalogs: generated
    await setLocale('pt'); // lazy-loads its chunk
  4. Deja 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.

Comienza ahora

¿Ya tienes catálogos? Ábrelos en Studio

Copiado en el portapapeles