Formato de mensaje

18ways utiliza waysParser por defecto. Ese analizador es lo que te permite mantener la copia fuente legible mientras sigues manejando variables y un formato sensible a la configuración regional.

Variables

Utiliza llaves para las variables y pasa valores a través de vars.

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

Pluralización

Utiliza bloques de plural al estilo ICU cuando la oración cambie de forma de manera genuina.

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

Fechas y dinero

Si pasas un Date real o un objeto similar al dinero con amount y currency, 18ways lo formateará automáticamente incluso con un marcador de posición simple como {publishedAt} o {renewalTotal}.

Utiliza el formateador explícito solo cuando quieras controlar la salida, como dateStyle:long o un divisor de dinero 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 defecto, las cantidades de dinero se tratan como unidades menores. Si ya tiene unidades mayores, utilice el formateador de dinero explícito con divisor: 1.

Bloques de selección

Utiliza select cuando la copia dependa de un pequeño 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',
    },
  }
);

Composición de componentes

@18ways/core devuelve cadenas. Si necesitas texto enriquecido, mantén la oración completa y maneja el marcado en tu propio renderizador.

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

Si tu aplicación necesita composición automática de JSX, actualiza a @18ways/react o @18ways/next.

Regla práctica

Si la oración puede escribirse como una frase completa con algunas variables, mantenla en un solo mensaje. Eso mejora drásticamente la calidad de la traducción en comparación con unir fragmentos en código.