我有一个String扩展,可以帮助我实现国际化。
public extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
func localized(args:CVarArg...) -> String{
return NSString.localizedStringWithFormat(self.localized as NSString, args) as String
}
}
这样我就可以轻松地在应用程序的任何地方使用“hello_world”.localized,并且效果很好。
现在我想拥有相同的功能,但也希望能够传递参数。然而,传递'CVarArg ......'似乎并不像我期望的那样有效。
"grant_gps_access".localized("MyApp")
预期结果:“请授予MyApp GPS访问权限”
实际结果:“请授予(\ n MyApp \ n)GPS访问”
我在这里缺少什么?
答案 0 :(得分:8)
你不能将变量参数列表传递给另一个函数
必须传递一个CVaListPointer
(Swift等价物
C中的va_list
:
public extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
func localized(args: CVarArg...) -> String {
return withVaList(args) {
NSString(format: self.localized, locale: Locale.current, arguments: $0) as String
}
}
}
由于NSString.localizedStringWithFormat
没有变种
VAListPointer
,相当于NSString(format:, locale:, arguments:)
使用当前语言环境。
更简单(归属于@OOPer):使用
String.init(format:locale:arguments:)
需要一个
[CVarArg]
参数:
func localized(args: CVarArg...) -> String {
return String(format: self.localized, locale: Locale.current, arguments: args)
}
现在
"grant_gps_access".localized(args: "MyApp")
假设字符串文件包含,应该按预期工作 条目
"grant_gps_access" = "Please grant %@ GPS access";