自动复数处理

更新时间:2个季度前 · 预计阅读 2 分钟

Alpha

Lingo.dev Compiler 目前处于 alpha 阶段,稳定性尚未完善,不建议用于生产环境,且 API 可能会在版本更新之间发生变化。

Lingo.dev Compiler 会识别 JSX 文本中的复数表达,并自动将其转换为 ICU MessageFormat。你无需为每种语言手动编写复数规则,只要写出包含数值的自然文本,编译器就会借助 LLM 生成正确的复数形式。

工作原理#

1

Compiler 识别数字模式

在 AST 分析阶段,Compiler 会识别同时包含插值数字和数量相关词语的文本节点。例如,You have {count} items 中就包含一个数字变量,以及一个会随数量变化而变化的词。

2

LLM 判断复数形式

一个小巧且高效的 LLM(可通过 pluralization.model 配置)会分析文本,判断哪些词需要进行复数变化,并为每个目标语言区域生成相应的 CLDR 复数类别。

3

生成 ICU MessageFormat

Compiler 会生成一个 ICU MessageFormat 字符串,以覆盖目标语言所需的全部复数类别。

示例#

源 JSX:

tsx
<p>You have {count} items in your cart</p>

为英语生成的输出:

text
{count, plural, one {You have 1 item in your cart} other {You have # items in your cart}}

为俄语生成的输出(俄语有四种复数类别):

text
{count, plural, one {У вас # товар в корзине} few {У вас # товара в корзине} many {У вас # товаров в корзине} other {У вас # товаров в корзине}}

CLDR 复数类别#

不同语言会使用六种 CLDR 复数类别中的不同子集。Compiler 只会生成每个目标语言区域真正需要的类别:

类别说明示例语言
zero零数量阿拉伯语、拉脱维亚语
one单数英语、法语、德语、西班牙语
two双数阿拉伯语、希伯来语、斯洛文尼亚语
few少量 / 小数量俄语、捷克语、波兰语
many大量俄语、阿拉伯语、波兰语
other通用 / 默认(始终必需)所有语言

英语使用 one 和 other;俄语使用 one、few、many 和 other;阿拉伯语则会用到全部六种类别。Compiler 会按语言区域自动处理这些差异。

配置#

复数处理默认启用。你可以在 Compiler 选项中进行配置:

ts
{
  pluralization: {
    enabled: true,
    model: "groq:llama-3.1-8b-instant",
  },
}
选项类型默认值说明
pluralization.enabledbooleantrue启用或禁用自动复数识别。
pluralization.modelstring"groq:llama-3.1-8b-instant"用于识别复数形式的 LLM 模型。由于这项检测比翻译更简单,较小的模型通常就足够了。

如需完全禁用复数处理:

ts
{
  pluralization: {
    enabled: false,
  },
}

禁用复数处理后,Compiler 会将包含数字的文本当作普通字符串来翻译。对于复数规则较复杂的语言,生成结果在某些数量下可能不完全符合语法。

何时会应用复数处理#

Compiler 会在以下情况下识别复数模式:

  • 包含插值数字变量的文本:{count} items、{n} messages
  • 包含数字字面量的文本:You have 5 items(在动态 UI 中较少见)

Compiler 不会对以下内容进行复数处理:

  • 不包含数字引用的文本:Items in cart(没有可据此分支的数字)
  • 数字与数量相关词语没有直接关系的文本

你只需在 JSX 中写出自然文本,剩下的复数识别和 ICU 格式化都由 Compiler 及其 LLM 处理——无需专门学习 ICU MessageFormat 语法。

下一步#