Alpha
Lingo.dev Compiler 目前处于 alpha 阶段,稳定性尚未完善,不建议用于生产环境,且 API 可能会在版本更新之间发生变化。
Lingo.dev Compiler 会识别 JSX 文本中的复数表达,并自动将其转换为 ICU MessageFormat。你无需为每种语言手动编写复数规则,只要写出包含数值的自然文本,编译器就会借助 LLM 生成正确的复数形式。
工作原理#
Compiler 识别数字模式
在 AST 分析阶段,Compiler 会识别同时包含插值数字和数量相关词语的文本节点。例如,You have {count} items 中就包含一个数字变量,以及一个会随数量变化而变化的词。
生成 ICU MessageFormat
Compiler 会生成一个 ICU MessageFormat 字符串,以覆盖目标语言所需的全部复数类别。
示例#
源 JSX:
<p>You have {count} items in your cart</p>为英语生成的输出:
{count, plural, one {You have 1 item in your cart} other {You have # items in your cart}}为俄语生成的输出(俄语有四种复数类别):
{count, plural, one {У вас # товар в корзине} few {У вас # товара в корзине} many {У вас # товаров в корзине} other {У вас # товаров в корзине}}CLDR 复数类别#
不同语言会使用六种 CLDR 复数类别中的不同子集。Compiler 只会生成每个目标语言区域真正需要的类别:
| 类别 | 说明 | 示例语言 |
|---|---|---|
zero | 零数量 | 阿拉伯语、拉脱维亚语 |
one | 单数 | 英语、法语、德语、西班牙语 |
two | 双数 | 阿拉伯语、希伯来语、斯洛文尼亚语 |
few | 少量 / 小数量 | 俄语、捷克语、波兰语 |
many | 大量 | 俄语、阿拉伯语、波兰语 |
other | 通用 / 默认(始终必需) | 所有语言 |
英语使用 one 和 other;俄语使用 one、few、many 和 other;阿拉伯语则会用到全部六种类别。Compiler 会按语言区域自动处理这些差异。
配置#
复数处理默认启用。你可以在 Compiler 选项中进行配置:
{
pluralization: {
enabled: true,
model: "groq:llama-3.1-8b-instant",
},
}| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pluralization.enabled | boolean | true | 启用或禁用自动复数识别。 |
pluralization.model | string | "groq:llama-3.1-8b-instant" | 用于识别复数形式的 LLM 模型。由于这项检测比翻译更简单,较小的模型通常就足够了。 |
如需完全禁用复数处理:
{
pluralization: {
enabled: false,
},
}禁用复数处理后,Compiler 会将包含数字的文本当作普通字符串来翻译。对于复数规则较复杂的语言,生成结果在某些数量下可能不完全符合语法。
何时会应用复数处理#
Compiler 会在以下情况下识别复数模式:
- 包含插值数字变量的文本:
{count} items、{n} messages - 包含数字字面量的文本:
You have 5 items(在动态 UI 中较少见)
Compiler 不会对以下内容进行复数处理:
- 不包含数字引用的文本:
Items in cart(没有可据此分支的数字) - 数字与数量相关词语没有直接关系的文本
你只需在 JSX 中写出自然文本,剩下的复数识别和 ICU 格式化都由 Compiler 及其 LLM 处理——无需专门学习 ICU MessageFormat 语法。
