Swift中带有格式说明符的NSLocalizedString会产生垃圾

时间:2017-05-29 08:56:16

标签: swift xcode formatting nslocalizedstring

为了便于在我的一个非常小的应用程序中进行本地化,我有这个String扩展方法:

extension String {
    func localized(with values: Any...) -> String {
        // debug values
        for v in values {
            print("\(type(of: v)): \(v)")
        }

        return String.localizedStringWithFormat(NSLocalizedString(self, comment: ""), values)
    }
}

我的Localizable.strings的德语本地化包含这个键/值对: "WeeksFuture" = "In %d Wochen";

这样做:

for _ in 0..<5 {
    let localized = "WeeksFuture".localized(with: 3)
    print(localized)
}

将Xcode设置为使用德语调试应用程序(虽然这种情况也会出现在所有其他语言中)将其打印到输出窗口:

Int: 3
In 151.456 Wochen
Int: 3
In 186.912 Wochen
Int: 3
In 186.880 Wochen
Int: 3
In 187.264 Wochen
Int: 3
In 187.488 Wochen

显然,这都是错的。为什么我首先得到“Int:3”的正确输出,然后是一个看似随机的垃圾编号的字符串?

1 个答案:

答案 0 :(得分:2)

String.localizedStringWithFormatStringCVarArg...为参数。您传入了一个Any - values数组作为第二个参数。它被迫将数组转换为十进制数,从而产生奇怪的结果。

要解决此问题,您只需要找到一个需要[CVarArg]的重载。幸运的是,有一个init重载:

 return String.init(format: 
    NSLocalizedString(self, comment: ""), arguments: values)

但是,values[Any],与预期的[CVarArg]不兼容。您应该更改参数类型。

所以你的整个扩展看起来像这样:

func localized(with values: CVarArg...) -> String {
    return String.init(format: NSLocalizedString(self, comment: ""), arguments: values)
}