Guias
Formato de mensagens
Uma sintaxe pequena, com Intl nativo por baixo: plurais, gênero e formatação sem aprender ICU completo.
Interpolação
"Hola {name}" → t('saludo', { name: 'Aron' })Os valores se formatam sozinhos por tipo: números via Intl.NumberFormat, datas via Intl.DateTimeFormat, strings como estão. Um param faltando mostra o placeholder literal, fácil de notar e nunca um crash.
Formatters
Adicione :formatter (com /arg opcional) a um param:
| Sintaxe | Resultado |
|---|---|
| {n:number} | Número do locale: 1,234.56 / 1234,56 |
| {n:integer} | Arredondado, sem decimais |
| {n:percent} | 0.5 → 50% |
| {n:currency/EUR} | Moeda com código ISO |
| {d:date/long} | dateStyle: short · medium · long · full |
| {d:time/short} | Variantes de timeStyle |
Os formatters custom se conectam na criação da instância. A assinatura completa é (value, locale, arg?) => string, onde locale é o idioma ativo e arg é o que vem depois do / no placeholder:
createVerbaly({
formatters: { upper: (v) => String(v).toUpperCase() },
});
// "{word:upper}" → HOLATempo relativo, listas e unidades
Desde 0.11.0 o formato cobre o resto do Intl moderno, ainda com zero dependências:
"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: passe umDatee a unidade se escolhe sozinha em relação a agora (Intl.RelativeTimeFormatcomnumeric: 'auto', então você recebe ontem, não há 1 dia); passe um número com unidade explícita (relative/hour).list: arrays localizam viaIntl.ListFormat, conjunção por padrão,/orpara disjunção,/unitpara listas de unidades. Cada item se auto-formata por locale.unit: qualquer id de unidade CLDR (kilometer,megabyte,liter…) viaIntl.NumberFormat.- Formatos desconhecidos e unidades inválidas avisam uma única vez e caem para
String(value), então nada quebra ao renderizar.
Plurais e selects: uma só sintaxe
"{count | =0: sin mensajes | one: un mensaje | other: # mensajes}"
"{gender | male: él | female: ella | other: elle}"- Números casam primeiro os valores exatos
=N, depois as categorias deIntl.PluralRules(zero one two few many other). - Strings casam sua variante, com fallback para
other. #renderiza o número formatado ao locale. As variantes aninham placeholders livremente.
Escape-hatch ICU
Tem strings ICU MessageFormat existentes, ou precisa da sintaxe exata dele? Escreva ICU e o Verbaly detecta automaticamente e o parseia no mesmo motor, com zero dependências extras.
"{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 mensagem: sem config, sem marcador. Mensagens nativas e ICU coexistem no mesmo catálogo.
- Suporta
plural,select,selectordinal(regras ordinais reais),{n, number/date/time, style},#,=N, aninhamento e quoting com'…'. - Prefira a sintaxe nativa por padrão; recorra ao ICU só quando precisar.
Escapes
| Você escreve | Você obtém |
|---|---|
| {{ | { literal |
| }} | } literal |
| || | | literal dentro de variantes |
| ## | # literal dentro de variantes |