ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Slang复数规则与自定义上下文实战:基于Unicode CLDR一次搞定多语言格式难题

Slang复数规则与自定义上下文实战:基于Unicode CLDR一次搞定多语言格式难题 Slang复数规则与自定义上下文实战基于Unicode CLDR一次搞定多语言格式难题【免费下载链接】slangType-safe i18n for Dart and Flutter项目地址: https://gitcode.com/gh_mirrors/slang/slangSlang 是一款为 Dart 和 Flutter 打造的类型安全国际化i18n库除了常规的文案翻译它还能基于 Unicode CLDR 标准自动处理复数规则并支持自定义上下文枚举——一次配置多语言格式难题迎刃而解。为什么多语言复数翻译如此棘手1 个苹果 / 2 个苹果在英语里很简单但换到别的语言就麻烦了俄语1 个用单数2~4 个用少数few5~20 个用多数many21 个又回到单数——三种不同词形阿拉伯语多达 6 种复数形式zero、one、two、few、many、other法语0 个和 1 个用单数100 万这种大数还有特殊规则日语根本没有复数变化任何数字都用同一句如果靠手写 if-else 判断每个语言都要单独维护逻辑极易出错。Slang 复数规则入门6 个关键词搞定所有数字Slang 直接采用了 Unicode CLDR 国际标准的复数概念内置了 6 个复数分类关键词关键词含义典型场景以俄语为例zero零数0one单数1、21、31two双数阿拉伯语的 2few少数2~4many多数5~20other其他兜底唯一必填只需要在翻译文件里用这 6 个关键词组织文案Slang 就会自动根据数字和语言选择正确形式。项目示例中的写法非常直观// 见 slang/example/lib/i18n/en.i18n.json 第4-7行 counter: { one: You pressed $n time., other: You pressed $n times. }生成的 Dart 代码就是一个普通方法调用运行时零解析开销String a t.mainScreen.counter(n: 1); // You pressed 1 time. String b t.mainScreen.counter(n: 5); // You pressed 5 times.基数词与序数词一个修饰符区分英语的序数词很特别1st、2nd、3rd、4th……规则完全不同。Slang 中默认检测的是基数词需要序数词时加上(ordinal)修饰符即可place(ordinal): { one: ${n}st place., two: ${n}nd place., few: ${n}rd place., other: ${n}th place. }调用t.someKey.place(n: 12)就会正确返回 12th place.——第 11、12、13 这类陷阱数字已被内置规则处理。用 slang.yaml 全局配置复数规则不想在每个 key 上写修饰符可以在根目录的 slang.yaml 中全局声明对所有语言文件生效pluralization: auto: cardinal # 自动检测基数词默认可设为 ordinal 或 off default_parameter: n # 复数参数名默认为 n cardinal: - someKey.apple ordinal: - someKey.place参数名不喜欢n可以逐个用paramappleCount修饰符改名也可以在配置里统一修改default_parameter。13 种内置语言与自定义复数解析器Slang 已内置 13 种语言的 CLDR 复数解析器阿拉伯语、捷克语、德语、英语、西班牙语、法语、意大利语、日语、波兰语、俄语、瑞典语、乌克兰语、越南语完整规则见 plural_resolver_map.dart。以俄语为例源码第 205-231 行完整实现了单数/少数/多数三分法。如果你的语言不在列表中如中文、马来语无需手写判断——运行时注册一个自定义解析器即可LocaleSettings.setPluralResolver( locale: AppLocale.xx, cardinalResolver: (n, {zero, one, two, few, many, other}) { if (n 1) return one ?? other!; return other!; // 中文无复数变化other 兜底 }, );该方法定义在 singleton.dart 第 435 行支持按语言或按具体区域如en_US注册未注册的语言会自动降级到一个宽容的兜底解析器并打印日志提示不会直接崩溃。解析器接口类型定义见 pluralization.dart。自定义上下文实战性别称谓与枚举复数解决数量自定义上下文则解决称谓差异——比如男性用 Mr、女性用 Ms或者不同会员等级看到不同文案。只需在 key 后加上(context枚举名)// en.i18n.json greet(contextGenderContext): { male: Hello Mr $name, female: Hello Ms $name }Slang 会自动生成GenderContext枚举并生成类型安全的方法String a t.greet(name: Maria, context: GenderContext.female);三个实用技巧合并相同文案所有形式一样时可以用逗号折叠如male,female: Hello $name改参数名greet(contextGenderContext, paramgender)后可写t.greet(gender: ...)也可在slang.yaml的contexts节里通过default_parameter全局设置复用已有枚举项目里已经有UserType枚举配置imports指向它并设generate_enum: false关闭自动生成翻译 key 直接引用你的业务枚举类型安全拉满 ✅翻译团队协作Weblate 集成复数和上下文的文案最终要靠团队翻译。Slang 支持对接开源翻译平台 Weblate把 JSON/YAML 翻译文件纳入集中管理、审核与协作流程小结场景Slang 方案数字名词1 个/2 个苹果6 个 CLDR 关键词 自动检测序数词1st/2nd/3rd(ordinal)修饰符非内置语言LocaleSettings.setPluralResolver自定义解析器性别/等级等语境差异(context枚举名)自动生成枚举已有业务枚举importsgenerate_enum: false直接复用Slang 把 Unicode CLDR 的复杂规则封装成了简单的 JSON 写法配合编译期类型检查让11 个苹果和11th place这类多语言格式陷阱彻底成为历史。更多用法可参阅完整文档 README.md。【免费下载链接】slangType-safe i18n for Dart and Flutter项目地址: https://gitcode.com/gh_mirrors/slang/slang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表