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

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


当前回答

虽然这不能解决缩短的问题,但这帮助我组织消息,我为错误消息创建了一个如下所示的结构

struct Constants {
    // Error Messages
    struct ErrorMessages {
        static let unKnownError = NSLocalizedString("Unknown Error", comment: "Unknown Error Occured")
        static let downloadError = NSLocalizedString("Error in Download", comment: "Error in Download")
    }
}

let error = Constants.ErrorMessages.unKnownError

通过这种方式,您可以组织消息并使genstring工作。

这是使用的genstrings命令

find ./ -name \*.swift -print0 | xargs -0 genstrings -o .en.lproj

其他回答

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

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

使用默认语言进行本地化:

extension String {
func localized() -> String {
       let defaultLanguage = "en"
       let path = Bundle.main.path(forResource: defaultLanguage, ofType: "lproj")
       let bundle = Bundle(path: path!)

       return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
    }
}

为总是忽略“comment”的情况创建了一个小的helper方法。更少的代码更容易阅读:

public func NSLocalizedString(key: String) -> String {
    return NSLocalizedString(key, comment: "")
}

只要把它放在任何地方(类之外),Xcode就会找到这个全局方法。

虽然这不能解决缩短的问题,但这帮助我组织消息,我为错误消息创建了一个如下所示的结构

struct Constants {
    // Error Messages
    struct ErrorMessages {
        static let unKnownError = NSLocalizedString("Unknown Error", comment: "Unknown Error Occured")
        static let downloadError = NSLocalizedString("Error in Download", comment: "Error in Download")
    }
}

let error = Constants.ErrorMessages.unKnownError

通过这种方式,您可以组织消息并使genstring工作。

这是使用的genstrings命令

find ./ -name \*.swift -print0 | xargs -0 genstrings -o .en.lproj

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