如何在stringsdict文件中引用Localizable.strings的字符串以避免重复?
苹果原生的stringsdict格式本身不支持直接嵌套引用Localizable.strings中的key,无法直接通过配置实现你要的自动引用效果,目前有两种可落地的实现方案:
方案1:运行时二次拼接(改动最小,适合小型项目)
- 先把通用字符串存入
Localizable.strings:
"UNIT_DAY" = "day"; "UNIT_DAYS" = "days";
- 修改
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>GLOBAL_JOUR</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@VARIABLE@</string> <key>VARIABLE</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>u</string> <key>zero</key> <string>0 %@</string> <key>one</key> <string>1 %@</string> <key>other</key> <string>%u %@</string> </dict> </dict> </dict> </plist>
- 封装统一的调用方法,把本地化后的单位作为参数传入:
// Swift 示例 func localizedDayString(count: UInt) -> String { let unit = NSLocalizedString(count == 1 ? "UNIT_DAY" : "UNIT_DAYS", comment: "") let format = NSLocalizedString("GLOBAL_JOUR", comment: "") return String(format: format, count, unit) } // 调用示例 let threeDayStr = localizedDayString(count: 3)
方案2:构建阶段预替换(无运行时开销,适合大型多语言项目)
你可以在Xcode的构建流程中加入自定义脚本:
- 给
stringsdict中需要引用的位置写自定义占位符,比如{{UNIT_DAY}}、{{UNIT_DAYS}} - 脚本在编译前自动读取
Localizable.strings的键值对,把stringsdict中的所有占位符替换成对应的本地化字符串 - 替换后的
stringsdict参与后续编译,运行时完全走原生逻辑,不需要额外处理
这种方案的优势是完全不影响运行时性能,同时可以实现通用字符串的一处修改、多处生效,适合有大量通用单位、重复复数字符串的项目。
内容的提问来源于stack exchange,提问作者Nonouf
相关产品推荐
相关产品推荐

