如何本地化含数值与时间单位变量且需处理复数的字符串?
多变量带复数的字符串本地化最佳方案
核心思路
同时处理数量复数变化和多语言结构差异时,建议把「数量+单位」的复数逻辑与「整体语句结构」的本地化拆分处理:用stringsdict专门搞定复数规则,再通过普通本地化字符串适配不同语言的语序差异。
步骤1:配置Localizable.stringsdict
这个文件用来定义每个时间单位的复数规则,自动适配不同语言的复数逻辑(比如英文区分单复数,中文无需区分)。
示例XML配置(直接在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>year_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@year@</string> <key>year</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d year</string> <key>other</key> <string>%d years</string> </dict> </dict> <!-- 月份复数规则 --> <key>month_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@month@</string> <key>month</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d month</string> <key>other</key> <string>%d months</string> </dict> </dict> <!-- 日期复数规则 --> <key>day_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@day@</string> <key>day</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d day</string> <key>other</key> <string>%d days</string> </dict> </dict> </dict> </plist>
步骤2:配置各语言的Localizable.strings
用来定义整体语句的结构,让不同语言可以自由调整语序和格式:
英文(en.lproj/Localizable.strings):
"later_template" = "%@ later";
中文(zh-Hans.lproj/Localizable.strings):
"later_template" = "%@后";
步骤3:代码中实现本地化逻辑
先把Calendar.Component映射到对应的stringsdictkey,拿到处理好复数的「数量+单位」字符串,再代入到整体模板中:
let count: Int = ... let unit: Calendar.Component = ... // 映射时间单位到对应的stringsdict key let unitKey: String switch unit { case .year: unitKey = "year_count" case .month: unitKey = "month_count" case .day: unitKey = "day_count" default: unitKey = "" // 可根据需求补充其他单位的默认处理 } // 获取处理复数后的「数量+单位」字符串 let countUnitString = String.localizedStringWithFormat(NSLocalizedString(unitKey, comment: ""), count) // 拼接得到最终本地化字符串 let finalString = String.localizedStringWithFormat(NSLocalizedString("later_template", comment: "Template for time later"), countUnitString)
方案优势
- 职责分离:
stringsdict专注处理复数规则,普通本地化字符串适配语序,逻辑清晰易维护。 - 扩展性强:新增时间单位(如小时、分钟)时,只需在
stringsdict中添加对应规则,代码里补充case即可。 - 适配多语言复数:自动兼容不同语言的复数规则(比如部分语言有3种以上复数形态)。
内容的提问来源于stack exchange,提问作者Li Fumin
相关产品推荐
相关产品推荐

