如何正确构建含变量的本地化字符串键以实现多语言复数适配
解决方案
1. 定义本地化键
在Localizable.strings(对应各语言版本)中,为每个actionName单独定义带占位符的键,用key.作为前缀拼接actionName:
英文(en.lproj/Localizable.strings)
"key.run" = "%f runs"; "key.walk" = "%f walks";
中文(zh-Hans.lproj/Localizable.strings)
"key.run" = "%f 次跑步"; "key.walk" = "%f 次步行";
2. SwiftUI代码实现
通过动态拼接本地化键,再传入item.count作为参数完成格式化:
Text(String(localized: "key.\(item.actionName)", arguments: item.count))
3. 进阶:多语言复数规则适配
如果需要兼容俄语、阿拉伯语这类有复杂复数规则的语言,使用Localizable.stringsdict文件:
创建Localizable.stringsdict并添加如下内容(以key.run为例):
<dict> <key>key.run</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@count@</string> <key>count</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>f</string> <key>zero</key> <string>0 次跑步</string> <key>one</key> <string>1 次跑步</string> <key>other</key> <string>%f 次跑步</string> </dict> </dict> </dict>
代码无需修改,系统会自动根据当前语言的复数规则匹配对应表述。
原方案失效原因
你之前的写法将动态的item.count和item.actionName直接嵌入字符串,Xcode会把它解析为通用占位符键key.%f %@,无法识别每个actionName对应的具体本地化键。通过将actionName作为键的静态部分,仅把动态值作为参数传入,就能让Xcode正确识别各语言的本地化条目。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

