Guías
Formato de mensajes
Una sintaxis pequeña, con Intl nativo por debajo: plurales, género y formato sin aprender ICU completo.
Interpolación
"Hola {name}" → t('saludo', { name: 'Aron' })Los valores se formatean solos por tipo: números vía Intl.NumberFormat, fechas vía Intl.DateTimeFormat, strings tal cual. Un param faltante muestra el placeholder literal, fácil de detectar y nunca un crash.
Formatters
Agrega :formatter (con /arg opcional) a un param:
| Sintaxis | Resultado |
|---|---|
| {n:number} | Número del locale: 1,234.56 / 1234,56 |
| {n:integer} | Redondeado, sin decimales |
| {n:percent} | 0.5 → 50% |
| {n:currency/EUR} | Moneda con código ISO |
| {d:date/long} | dateStyle: short · medium · long · full |
| {d:time/short} | Variantes de timeStyle |
Los formatters custom se conectan al crear la instancia. La firma completa es (value, locale, arg?) => string, donde locale es el idioma activo y arg es lo que sigue al / en el placeholder:
createVerbaly({
formatters: { upper: (v) => String(v).toUpperCase() },
});
// "{word:upper}" → HOLATiempo relativo, listas y unidades
Desde 0.11.0 el formato cubre el resto del Intl moderno, siempre con cero dependencias:
"Updated {when:relative}" → Updated 2 hours ago · yesterday
"Ready {n:relative/day}" → Ready in 3 days
"Works in {langs:list}" → Works in English, Spanish, and Portuguese
"Pick {opts:list/or}" → Pick red, green, or blue
"{d:unit/kilometer}" → 3 kmrelative: pasa unDatey la unidad se elige sola contra ahora (Intl.RelativeTimeFormatconnumeric: 'auto', así obtienes ayer, no hace 1 día); pasa un número con unidad explícita (relative/hour).list: los arrays se localizan víaIntl.ListFormat, conjunción por defecto,/orpara disyunción,/unitpara listas de unidades. Cada elemento se auto-formatea por locale.unit: cualquier id de unidad CLDR (kilometer,megabyte,liter…) víaIntl.NumberFormat.- Formatos desconocidos y unidades inválidas avisan una sola vez y caen a
String(value), así que nada revienta al renderizar.
Plurales y selects: una sola sintaxis
"{count | =0: sin mensajes | one: un mensaje | other: # mensajes}"
"{gender | male: él | female: ella | other: elle}"- Los números matchean primero los valores exactos
=N, luego las categorías deIntl.PluralRules(zero one two few many other). - Los strings matchean su variante, con fallback a
other. #renderiza el número formateado al locale. Las variantes anidan placeholders libremente.
Escape-hatch ICU
¿Tienes strings ICU MessageFormat existentes, o necesitas su sintaxis exacta? Escribe ICU y Verbaly lo detecta automáticamente y lo parsea al mismo motor, con cero dependencias extra.
"{count, plural, one {# item} other {# items}}"
"{gender, select, male {he} female {she} other {they}}"
"{n, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}"- Auto-detectado por mensaje: sin config, sin marcador. Mensajes nativos e ICU conviven en el mismo catálogo.
- Soporta
plural,select,selectordinal(reglas ordinales reales),{n, number/date/time, style},#,=N, anidado y quoting con'…'. - Prefiere la sintaxis nativa por defecto; usa ICU solo cuando lo necesites.
Escapes
| Escribes | Obtienes |
|---|---|
| {{ | { literal |
| }} | } literal |
| || | | literal dentro de variantes |
| ## | # literal dentro de variantes |