是否有一个Swift等效的NSLocalizedString(…)?
在Objective-C中,我们通常使用:
NSString *string = NSLocalizedString(@"key", @"comment");
我如何在Swift中实现同样的目标?我找到了一个函数:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
但是,它很长,一点也不方便。
当你翻译,说从英语,一个短语是相同的,到另一种语言,它是不同的(因为性别,动词的变化或变化),在Swift中最简单的NSString形式,在所有情况下都是三个参数一。例如,英语短语“previous was”的“weight”(“предыдущий б л”)和“waist”(“предыдущая б ла”)在俄语中的翻译就不一样。
在这种情况下,一个Source需要两种不同的翻译(就WWDC 2018推荐的XLIFF工具而言)。你不能实现它与两个参数NSLocalizedString,其中“previous was”将是相同的“键”和英文翻译(即值)。唯一的方法就是使用三论点形式
NSLocalizedString("previousWasFeminine", value: "previous was", comment: "previousWasFeminine")
NSLocalizedString("previousWasMasculine", value: "previous was", comment: "previousWasMasculine")
其中键(“previousWasFeminine”和“previouswasmasculinity”)是不同的。
我知道一般的建议是将短语整体翻译,然而,有时这太费时和不方便。
通过使用这种方式,可以为不同类型创建不同的实现(即Int或自定义类,如CurrencyUnit,…)也可以使用genstrings实用程序扫描这个方法调用。
只需将例程标志添加到命令中
genstrings MyCoolApp/Views/SomeView.swift -s localize -o .
扩展:
import UIKit
extension String {
public static func localize(key: String, comment: String) -> String {
return NSLocalizedString(key, comment: comment)
}
}
用法:
String.localize("foo.bar", comment: "Foo Bar Comment :)")
有助于在单元测试中使用:
这是一个简单的版本,可以扩展到不同的用例(例如使用tableNames)。
public func NSLocalizedString(key: String, referenceClass: AnyClass, comment: String = "") -> String
{
let bundle = NSBundle(forClass: referenceClass)
return NSLocalizedString(key, tableName:nil, bundle: bundle, comment: comment)
}
像这样使用它:
NSLocalizedString("YOUR-KEY", referenceClass: self)
或者像这样加一条评论:
NSLocalizedString("YOUR-KEY", referenceClass: self, comment: "usage description")
NSLocalizedString也存在于Swift的世界中。
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
tableName、bundle和value参数用默认关键字标记,这意味着在调用函数时可以忽略这些参数。在本例中,将使用它们的默认值。
这导致一个结论,方法调用可以简化为:
NSLocalizedString("key", comment: "comment")
Swift 5 -没有变化,仍然像那样工作。