iOS 15 Swift的String(localized:)未区分键值对该如何处理?
iOS15+ Swift本地化键值耦合问题解决方案
你提到的String(localized:)接口默认将首参数同时作为键和默认值的设计,确实不适用于对多语言适配规范性要求较高的项目,可通过以下三种方案解决:
方案1:使用语义化独立key,各语言显式配置翻译
放弃将用户可见的开发语言文本作为key,改用模块.场景.功能格式的语义化字符串作为统一键,分别在各语言的Localizable.strings中配置对应翻译即可。
代码调用示例:String(localized:"alert.tap_notification", comment: "Alert message: Report a tap")英文Localizable.strings配置:
"alert.tap_notification" = "You tapped me!";法语Localizable.strings配置:
"alert.tap_notification" = "Vous m'avez tapé!";该方案下只要key不修改,调整英文原文、同文本不同场景配不同翻译的需求都可以正常实现。
方案2:扩展String封装键值完全分离的本地化接口
如果你希望在代码中直接维护默认的开发语言文本,避免每次修改默认值都要改strings文件,可以自行扩展String实现入参数分离的本地化方法:extension String { static func localized( key: String, defaultText: String, table: String? = nil, bundle: Bundle? = nil, locale: Locale = .current, comment: StaticString? = nil ) -> String { let localizedStr = String( localized: String.LocalizationValue(key), table: table, bundle: bundle, locale: locale, comment: comment ) // 未找到对应翻译时返回默认文本 return localizedStr == key ? defaultText : localizedStr } }调用示例:
String.localized( key: "alert.tap_notification", defaultText: "You tapped me!", comment: "Alert message: Report a tap" )方案3:使用XCStrings管理本地化资源
Xcode13及以上版本推出的XCStrings格式天然支持独立key配置,你可以在可视化界面中为每个key单独设置开发语言默认值、各语言翻译,系统会自动生成对应的键值对,无需手动维护strings文件,也能从根源上避免键值耦合的问题。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

