为了便于在我的一个非常小的应用程序中进行本地化,我有这个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”的正确输出,然后是一个看似随机的垃圾编号的字符串?
答案 0 :(得分:2)
String.localizedStringWithFormat
以String
和CVarArg...
为参数。您传入了一个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)
}