如何正确使用VarArgs本地化字符串?

时间:2017-02-25 14:47:50

标签: ios swift swift3

我有一个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访问”

我在这里缺少什么?

1 个答案:

答案 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";