如何正确使用VarArgs本地化string?
我有一个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在应用程序的任何地方,它很好地工作。
现在我想拥有相同的function,但也希望能够传递参数。 然而通过'CVarArg …'似乎并不像我预期的那样工作。
"grant_gps_access".localized("MyApp")
预期结果: “请授予MyApp GPS接入权限”
实际结果: “请授予(\ n MyApp \ n)GPS接入”
我在这里错过了什么?
你不能将一个variables参数列表传递给另一个函数,你必须传递一个CVaListPointer
(C中的va_list
的Swift等价物):
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")
应该按预期工作,假定string文件包含条目
"grant_gps_access" = "Please grant %@ GPS access";