消息格式化

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

实用规则

如果句子可以用几个变量写成完整的短语,请将其保持在一条消息中。 这使得翻译质量比将代码片段拼接在一起要好得多。

Message Formatting