对全球购物车使用鸿蒙应用环境与场景篇



一、它解决什么场景问题
“您有 1 件商品"和"您有 3 件商品”——中文用户没感觉,但英语用户立刻注意到 “1 item” 与 “3 items” 的区别,俄语用户会盯着 “1 товар / 3 товара / 5 товаров” 的每个词形。复数形态错误是本地化最刺眼的低级错误,比翻译腔更伤信任。购物车、未读数、搜索结果、通知——凡是"数字 + 名词"的组合都需要复数规则。
本应用用全球购物车承载 PluralRules,演示 5 种语言、3 类复数体系(两分类/多分类/无复数)的真实落地。
二、典型用户故事
故事 A:俄罗斯买家 Ivan(ru_RU)
Ivan 往购物车加了 3 个鼠标,结算区显示"В корзине 3 товара"(few 形态);他又加了 2 个,变成 5 个,提示自动切换"В корзине 5 товаров"(many 形态)。他注意到词尾在变——“这个 App 懂俄语”。
故事 B:波兰用户 Kasia(pl_PL)
波兰语是世界上最复杂的复数语言之一(one/few/many 且规则与俄语不同)。Kasia 看到"1 produkt / 3 produkty / 5 produktów"全部正确,立刻对 App 的本地化质量产生信任。
故事 C:中文用户小王(zh_CN)
小王切回中文:数量显示"3 件商品",1 件也是"1 件商品"——中文没有复数形态,PluralRules 返回 other 统一处理,语法正确且零成本。
故事 D:日语用户佐藤(ja_JP)
佐藤切到日语:カートに 3 点の商品があります。日语和中文一样没有复数语法,所有数字都是 other 分类,一条文案走遍所有数量——但商品名、金额、量词(点)仍各自本地化,复数只是其中一环。
三、适用使用环境
| 环境类型 | 适配说明 |
|---|---|
| 电商购物车/订单 | 商品数量、结算提示 |
| 消息通知 | 未读消息数(“3 new messages”) |
| 搜索结果 | “找到 8 条结果” |
| 社交 App | 点赞数、在线人数 |
| 游戏 | 资源数量、剩余次数 |
四、目标用户画像
- 电商/社交产品开发者:购物车、未读数、通知是复数重灾区;
- 本地化测试工程师:逐语言断言复数形态正确性;
- 翻译/本地化经理:理解复数文案表如何组织;
- 多语言产品设计师:把"数字 + 名词"场景纳入 i18n 设计。
五、关键设计决策
1. 两步分离:分类判定 + 形态选择
PluralRules.select(n) 判定语法分类,文案表按分类取词形。翻译团队只需维护 category → 文案 表,不需要懂 ICU 规则;开发团队不需要懂俄语。职责边界清晰是这套方案能落地的关键:
// 第一步:语法层——这个数字是什么分类
function pluralCategory(code: string, n: number): string {
try {
const pr = new intl.PluralRules(code);
return pr.select(n);
} catch (err) {
return 'other';
}
}
// 第二步:翻译层——这个分类用什么词形
function itemWord(code: string, n: number): string {
const cat = pluralCategory(code, n);
const texts = buildPluralTexts(code);
return texts.itemForms.get(cat) ?? 'items';
}
2. 模板化消息
用 {n} 占位符而非硬拼:俄语 “В корзине {n} товара” 与英语 “You have {n} items” 语序不同,模板让每种语言自己决定数字位置。
3. 真实多分类语言演示
特别加入俄语(one/few/many)与波兰语——它们是复数规则的"期末考试",能演示才说明真的理解了 PluralRules,而不是只会加 s。
六、场景工作流:一次多语言购物
1. 默认英文,购物车 3 件商品(1+1+1)
→ "You have 3 items in your cart"
2. 点 + 加到 5 件
→ "You have 5 items in your cart"(英文只有 two forms,不变)
3. 切俄语
→ "В корзине 5 товаров"(many 形态)
4. 减到 2 件
→ "В корзине 2 товара"(few 形态,词尾变化)
5. 切波兰语
→ "Masz 2 produkty w koszyku"(few)
6. 切中文
→ "购物车中共有 2 件商品"(other,一条文案)
每一步都体现复数 i18n 的核心:同一个数量,不同语言自动选对形态,用户零操作。
七、边界与降级
- 无复数语言:中文/日语所有数字都是
other,文案表只维护一条即可; - 零分类:阿拉伯语 0 有独立
zero形态,本应用未含阿语,扩展时加表项即可; - 文案缺失:
get(cat)取不到时回退other形态(兜底); - 数量下界:
Math.max(1, ...)防止数量为 0 或负。
八、竞品对比
| 方案 | 优点 | 缺点 | 本应用选择 |
|---|---|---|---|
| 正则猜单复数(末尾 s) | 零依赖 | 90% 场景错(child/children) | 拒绝 |
| PluralRules.select | ICU 标准、全覆盖 | 需配合文案表 | ✅ |
| 只显示数字不显示量词 | 永不出错 | 信息缺失、不自然 | 不推荐 |
| 服务端翻译模板 | 专业 | 依赖网络 | 混合 |
八·五、一次语言切换的完整链路(场景复盘)
以"购物车从英文切到俄语"为例,拆解复数规则的响应式传导:
用户点击「🇷🇺 Русский」胶囊
│ 1. onClick 赋值
▼
this.currentLocale = 'ru_RU' // @StorageLink 全局状态
│ 2. AppStorage 广播 + PersistentStorage 落盘
▼
T(key) 重新执行 // 文案:标题/按钮/标签全变俄语
itemName(item) 重新执行 // 商品名: Wireless Mouse → Беспроводная мышь
itemWord(locale, qty) 重新执行 // 量词: 3 items → 3 товара(few 形态)
cartMessage(locale, totalQty) 重新执行 // 结算: You have 3 items → В корзине 3 товара
fmtMoney(...) 重新执行 // 金额: $77.97 → 77,97 $(RUB)
│ 3. ArkUI 增量渲染
▼
页面整体刷新,无闪烁、无空白
这个链路揭示了复数 i18n 的核心认知:复数形态不是"翻译",是"按数字选词形"。同一个 totalQty() = 3,英文选 items、俄语选 товара、中文选 件商品——不是三个翻译,而是同一个数字在三种语言的复数规则下分别匹配到 one/few/other 分类后取对应词形。数量一变(3 → 5),俄语自动从 few 切到 many,全程零人工干预。
九、与相邻应用的关系(场景视角)
- 应用 03 货币:金额格式化与复数组合——“3 items · $25.99” 中数量走复数规则、金额走货币格式化;
- 应用 04 数字:数字本身的分组/小数点由 NumberFormat 处理,复数只负责"数字后的名词形态"——两者是"数字怎么显示"与"数字后跟什么词"的分工;
- 应用 13 订单:订单明细"2 件商品 × $25.99"同时用复数、货币、数字三套规则,是它们的综合舞台。
九·五、复数探索器的教学价值(场景视角)
除了购物车业务,本应用的"复数分类探索器"是一个面向学习者的交互教学工具:
1. 切到波兰语,探索器初始 demoN = 1
→ 分类: one,量词: produkt
2. 点 +1 到 2
→ 分类: few,量词: produkty(词尾 y 出现)
3. 点 +1 到 3
→ 分类: few,量词: produkty(还是 few)
4. 点 +1 到 5
→ 分类: many,量词: produktów(词尾 ów)
5. 直接拨到 21
→ 分类: one,量词: produkt(21 结尾 1,归 one!)
6. 拨到 22
→ 分类: few,量词: produkty(22 结尾 2,归 few)
波兰语规则的精髓在这里一览无余:分类不取决于数字本身,而取决于数字的尾数(21 → one、22 → few、25 → many)。如果开发者用正则或 if 简单判断"n === 1 是 one",21 就会显示错误形态。探索器把这个规则可视化,让开发者和测试者都能快速验证 PluralRules 的正确性——这是教学型演示应用独有的价值。
十、扩展方向
- 序数规则:
PluralRules(locale, { type: 'ordinal' })处理 “1st/2nd/3rd”(应用 06 排序可用); - 阿拉伯语 zero:加
zero分类文案; - 复数 + 货币组合:“3 items · $25.99” 中数量与金额各自格式化;
- 多语言 UI 自动化测试:断言
select(n)分类与文案表一致性。
十一、生产级注意事项
- 文案表覆盖所有分类:俄语要配齐 one/few/many/other 四条,缺一条就会
get(cat)回退 other 显示错误形态; - 数字转字符串:
replace('{n}',${n})必须显式转字符串,否则 TS 类型报错; - 不要用正则猜单复数:
child → childs这种错误在真实产品里屡见不鲜,PluralRules是唯一正确解; - 缓存 PluralRules 实例:长列表逐项 select 时复用
code → PluralRules,避免每次 new; - 测试矩阵:每个语言至少测 0/1/2/3/5/21/100 这几个边界数字的分类。
十二、结语
复数规则是本地化的"细节魔鬼":它不显眼,错了却人人可见。PluralRules 把魔鬼关进 ICU 标准实现,翻译团队管文案、框架管分类,购物车只是它最常见的舞台——这套模式适用于一切"数字 + 名词"界面。
更多推荐




所有评论(0)