是否有一个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

但是,它很长,一点也不方便。


当前回答

我已经创建了自己的genstrings工具,用于使用自定义翻译函数提取字符串

extension String {

    func localizedWith(comment:String) -> String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: comment)
    }

}

https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c

它将解析所有swift文件,并将代码中的字符串和注释导出到.strings文件中。

也许这不是最简单的方法,但这是可能的。

其他回答

扩展:

 extension String {
    func localized(comment: String = "") -> String {
        return NSLocalizedString(self, comment: comment)
    }
  }

使用:“_YOUR_STRING_NAME_ .localized ()

通过使用这种方式,可以为不同类型创建不同的实现(即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 :)")

当你翻译,说从英语,一个短语是相同的,到另一种语言,它是不同的(因为性别,动词的变化或变化),在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”)是不同的。

我知道一般的建议是将短语整体翻译,然而,有时这太费时和不方便。

除了伟大的扩展写在这里,如果你懒得找到和替换旧的NSLocalizedString,你可以在Xcode中打开查找和替换,在查找部分,你可以写NSLocalizedString\(\(".*"\),评论:""\)然后在替换部分,你需要写$1。localizedstring的所有NSLocalizedString与"blabla"。本地化到您的项目中。

现有答案的变体:

斯威夫特5.1:

extension String {

    func localized(withComment comment: String? = nil) -> String {
        return NSLocalizedString(self, comment: comment ?? "")
    }

}

然后你可以简单地使用它,带或不带注释:

"Goodbye".localized()
"Hello".localized(withComment: "Simple greeting")

请注意,genstring不能用于此解决方案。