訊息格式

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.

實用規則

如果這句話可以用幾個變數寫成完整的短語,請將其保持在一條消息中。 這樣的翻譯質量會比將片段拼湊在一起的代碼好得多。