Formatação de mensagens

18ways utiliza waysParser por defeito. Esse parser é o que permite que mantenha a cópia de origem legível enquanto ainda lida com variáveis e formatação sensível ao local.

Variáveis

Use chaves para variáveis e passe valores através de vars.

ts
const label = await engine.t(
  'Welcome back, {name}',
  {
    vars: { name: 'Ada' },
  }
);

Pluralização

Use blocos de plural em estilo ICU quando a frase realmente mudar de forma.

ts
const summary = await engine.t(
  '{count, plural, =0{No messages} =1{One message} other{{count} messages}}',
  {
    vars: { count: 3 },
  }
);

Datas e dinheiro

Se passar um Date real ou um objeto semelhante a dinheiro com amount e currency, 18ways irá formatá-lo automaticamente, mesmo com um espaço reservado simples como {publishedAt} ou {renewalTotal}.

Use o formatador explícito apenas quando quiser controlar a saída, como dateStyle:long ou um divisor de dinheiro personalizado.

ts
const publishedAt = new Date(
  '2026-03-14T09:00:00Z'
);
const renewalTotal = {
  amount: 1900,
  currency: 'USD',
};
 
const updatedLabel = await engine.t(
  'Last updated {publishedAt}',
  {
    vars: { publishedAt },
  }
);
 
const totalLabel = await engine.t(
  'Renewal total {renewalTotal}',
  {
    vars: { renewalTotal },
  }
);
 
const detailedDate = await engine.t(
  'Detailed date: {publishedAt, date, dateStyle:long}',
  {
    vars: { publishedAt },
  }
);

Por defeito, os montantes de dinheiro são tratados como unidades menores. Se já tiver unidades maiores, utilize o formatador de dinheiro explícito com divisor: 1.

Selecionar blocos

Use select quando a cópia depende de um pequeno conjunto de valores discretos.

ts
const banner = await engine.t(
  '{isSignedIn, select, true{Welcome back, {name}} false{Sign in to continue} other{Sign in to continue}}',
  {
    vars: {
      isSignedIn: true,
      name: 'Ada',
    },
  }
);

Composição de componentes

@18ways/core retorna strings. Se precisar de texto rico, mantenha a frase inteira e trate a marcação no seu próprio renderizador.

ts
const cta = await engine.t(
  'Click here to see more'
);

Se a sua aplicação precisar de composição automática de JSX, mude para @18ways/react ou @18ways/next.

Regra prática

Se a frase puder ser escrita como uma frase completa com algumas variáveis, mantenha-a em uma única mensagem. Isso torna a qualidade da tradução dramaticamente melhor do que juntar fragmentos em código.