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.

tsx
import { useT } from '@18ways/react';
 
export function WelcomeMessage() {
  const t = useT();
 
  return (
    <p>
      {t('Welcome back, {name}', {
        vars: { name: 'Ada' },
      })}
    </p>
  );
}

Pluralização

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

tsx
import { T } from '@18ways/react';
 
export function InboxCount({
  count,
}: {
  count: number;
}) {
  return (
    <T vars={{ count }}>
      {
        '{count, plural, =0{No messages} =1{One message} other{{count} messages}}'
      }
    </T>
  );
}

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.

tsx
import { T } from '@18ways/react';
 
export function BillingSummary() {
  const publishedAt = new Date(
    '2026-03-14T09:00:00Z'
  );
  const renewalTotal = {
    amount: 1900,
    currency: 'USD',
  };
 
  return (
    <>
      <p>
        <T vars={{ publishedAt }}>
          Last updated {publishedAt}
        </T>
      </p>
      <p>
        <T vars={{ renewalTotal }}>
          Renewal total {renewalTotal}
        </T>
      </p>
      <p>
        <T vars={{ publishedAt }}>
          {
            'Detailed date: {publishedAt, date, dateStyle:long}'
          }
        </T>
      </p>
    </>
  );
}

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.

tsx
import { T } from '@18ways/react';
 
export function SignInState({
  isSignedIn,
}: {
  isSignedIn: boolean;
}) {
  return (
    <T vars={{ isSignedIn, name: 'Ada' }}>
      {
        '{isSignedIn, select, true{Welcome back, {name}} false{Sign in to continue} other{Sign in to continue}}'
      }
    </T>
  );
}

Composição de componentes

Mantenha a frase unida em JSX e 18ways irá preservar a verdadeira estrutura da interface do utilizador para casos comuns como <T><a href="#">Clique aqui</a> para ver mais</T> sem que você tenha que costurar fragmentos juntos manualmente.

tsx
import { T } from '@18ways/react';
 
export function HeroCta() {
  return (
    <T>
      <a href="/pricing">Click here</a> to see
      more
    </T>
  );
}

Desligar o analisador

@18ways/react permite definir messageFormatter="none" na raiz ou fornecer uma função de formatador personalizada. Isso é uma saída avançada, não o caminho padrão.

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.

Message Formatting