消息格式化
18ways 默认使用 waysParser。这个解析器使您能够保持源副本的可读性,同时仍然处理变量和区域设置相关的格式。
变量
使用大括号表示变量。使用 <T>,您可以将值与消息保持在同一行。
const label = await engine.t('Welcome back, {name}', {
vars: { name: 'Ada' },
});复数化
在句子真正改变形状时使用ICU风格的复数块。
const summary = await engine.t(
'{count, plural, =0{No messages} =1{One message} other{{count} messages}}',
{
vars: { count: 3 },
}
);日期和金钱
如果您传递一个真实的 Date 或一个类似货币的对象,包含 amount 和 currency,18ways 将会自动格式化它,即使是像 {publishedAt} 或 {renewalTotal} 这样的简单占位符。
仅在您想要控制输出时使用显式格式化器,例如 dateStyle:long 或自定义货币除数。
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。
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 返回字符串。如果您需要富文本,请保持句子完整,并在您自己的渲染器中处理标记。
const cta = await engine.t('Click here to see more');如果您的应用需要自动 JSX 组合,请升级到 @18ways/react 或 @18ways/next。
实用规则
如果句子可以用几个变量写成完整的短语,请将其保持在一条消息中。 这使得翻译质量比将代码片段拼接在一起要好得多。