如何将函数字符串字面量参数标记为可本地化?优化NSError初始化
问题:简化NSError本地化字符串的初始化调用
我正在为NSError编写一个便捷初始化方法,代码如下:
extension NSError { public convenience init(domain: String = #file, code: Int = Int(#line), localizedDescription: String) { self.init(domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey: localizedDescription]) } }
目前我需要通过以下方式创建带本地化描述的错误:
let localisedError = NSError(localizedDescription: NSLocalizedString("Some description that will be localized.", comment: "Comment for translator"))
我想知道是否可以直接将字符串字面量传入初始化方法,让Xcode自动将其纳入翻译流程(就像传入NSLocalizedString的字面量那样),从而简化为如下调用:
let localisedError = NSError(localizedDescription: "Some description that will be localized.")
请问该如何实现?
解决方案
你可以通过修改初始化方法的参数类型,并在内部完成本地化转换,让Xcode自动识别字符串字面量并纳入翻译流程,具体实现如下:
extension NSError { public convenience init( domain: String = #file, code: Int = Int(#line), localizedDescription: String.LocalizationValue, comment: String = "" ) { let translatedString = NSLocalizedString(localizedDescription, comment: comment) self.init( domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey: translatedString] ) } }
使用方式
- 简化调用(无需翻译注释):
let localisedError = NSError(localizedDescription: "Some description that will be localized.")
此时Xcode会自动识别这个字符串字面量,你可以通过Xcode → Editor → Export Localizations功能将其提取到.strings翻译文件中。
- 带翻译注释的调用:
如果需要给翻译人员补充说明,直接传入comment参数即可:
let localisedError = NSError(localizedDescription: "Some description that will be localized.", comment: "Comment for translator")
原理说明
String.LocalizationValue是Swift官方提供的类型,专门用于标记需要本地化的字符串输入。Xcode的本地化工具会自动识别这种类型参数接收的字符串字面量,将其纳入翻译流程,效果和直接使用NSLocalizedString完全一致。
内容的提问来源于stack exchange,提问作者Paul B
相关产品推荐
相关产品推荐

