メッセージのフォーマット

18waysはデフォルトでwaysParserを使用します。このパーサーは、変数やロケールに応じたフォーマットを処理しながら、ソースコピーを読みやすく保つことを可能にします。

変数

変数には波括弧を使用し、varsを通じて値を渡してください。

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

複数形

文の形が実際に変わる場合は、ICUスタイルの複数形ブロックを使用してください。

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

日付とお金

実際の Date または amountcurrency を持つお金のようなオブジェクトを渡すと、18ways は自動的にフォーマットします。 それは {publishedAt}{renewalTotal} のようなプレースホルダーでも同様です。

出力を制御したい場合、例えば dateStyle:long やカスタムマネーディバイダーのように、明示的フォーマッターを使用してください。

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 },
  }
);

デフォルトでは、金額は小数単位として扱われます。すでに主要単位を持っている場合は、divisor: 1を使用して明示的な金額フォーマッタを使用してください。

選択ブロック

selectを使用するのは、コピーが限られた一連の離散的な値に依存する場合です。

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',
    },
  }
);

コンポーネントの構成

@18ways/core は文字列を返します。リッチテキストが必要な場合は、文をそのまま保持し、マークアップを自分のレンダラーで処理してください。

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

アプリが自動JSX構成を必要とする場合は、@18ways/react または @18ways/next にアップグレードしてください。

実用的なルール

文がいくつかの変数を含む完全なフレーズとして書ける場合は、それを1つのメッセージにまとめてください。 そうすることで、コードの断片をつなぎ合わせるよりも翻訳の質が劇的に向上します。