如何在String Catalog中实现无数字显示的标签复数处理
iOS本地化:只显示复数名词不展示数字的解决方案
方法一:用stringsdict定义复数规则(推荐)
这种方式能复用iOS原生的复数处理逻辑,同时只输出名词:
- 创建/编辑
Localizable.stringsdict文件,针对动作名称定义复数规则,核心是通过数字匹配复数形式,但最终只输出名词:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>"action_plural"</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@rule@</string> <key>rule</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <!-- 英文规则,其他语言对应修改即可 --> <key>zero</key> <string>%@s</string> <key>one</key> <string>%@</string> <key>other</key> <string>%@s</string> </dict> </dict> </dict> </plist>
这里的%@用来传入动作名称(比如"tap"),item.actionCount作为复数判断的依据。
- 代码里调用格式化方法,只获取复数后的名词:
VStack(alignment: .center, spacing: 0) { Text("\(stepperValue)") let pluralizedAction = String.localizedStringWithFormat( NSLocalizedString("action_plural", comment: "Plural form of action name"), actionNameVariable, item.actionCount ) Text(pluralizedAction) }
这样iOS会根据数字自动匹配正确的复数形式,最终文本只显示动作名词,不会带数字。
方法二:针对动作名单独定义复数键(适合动作少的场景)
如果你的应用里动作类型不多,可以直接在Localizable.strings里给每个动作的单复数单独定义键:
比如英文的Localizable.strings:
"tap_single" = "tap"; "tap_multiple" = "taps"; "swipe_single" = "swipe"; "swipe_multiple" = "swipes";
然后代码里根据数字选择对应键:
VStack(alignment: .center, spacing: 0) { Text("\(stepperValue)") let keySuffix = item.actionCount == 1 ? "single" : "multiple" let localizedKey = "\(actionNameVariable)_\(keySuffix)" Text(NSLocalizedString(localizedKey, comment: "Plural action name")) }
这种方式简单直接,不需要维护复杂的stringsdict文件。
核心要点
- 基础语言(比如英文)必须保留数字作为复数判断的依据,不能直接移除数字相关逻辑,而是通过格式化规则只输出名词部分。
- 其他语言只需要在对应本地化文件里,按照自身复数规则定义对应的名词文本即可,完全不用包含数字。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

