是否有一个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项目中使用两个阶段来翻译你的文本:

1)第一阶段是使用旧的方法来创建所有可翻译的字符串:

NSLocalisedString("Text to translate", comment: "Comment to comment")

1.1)然后你应该使用genstrings生成Localizable.strings:

$ genstrings *swift

2)之后,你应该使用这个答案。

2.1)基于正则表达式使用XCode的“Find and Replace”选项。 对于给定的例子(如果你没有注释),正则表达式将是:

NSLocalizedString\((.*)\, comment:\ \"\"\) 

并将其替换为

$1.localized

或者(如果你有意见的话)

NSLocalizedString\((.*)\, comment:\ (.*)\)

并将其替换为

$1.localizedWithComment(comment: $2)

您可以随心所欲地使用正则表达式和不同的扩展组合。一般的方法是把整个过程分成两个阶段。希望这能有所帮助。

其他回答

实际上,你可以在Swift项目中使用两个阶段来翻译你的文本:

1)第一阶段是使用旧的方法来创建所有可翻译的字符串:

NSLocalisedString("Text to translate", comment: "Comment to comment")

1.1)然后你应该使用genstrings生成Localizable.strings:

$ genstrings *swift

2)之后,你应该使用这个答案。

2.1)基于正则表达式使用XCode的“Find and Replace”选项。 对于给定的例子(如果你没有注释),正则表达式将是:

NSLocalizedString\((.*)\, comment:\ \"\"\) 

并将其替换为

$1.localized

或者(如果你有意见的话)

NSLocalizedString\((.*)\, comment:\ (.*)\)

并将其替换为

$1.localizedWithComment(comment: $2)

您可以随心所欲地使用正则表达式和不同的扩展组合。一般的方法是把整个过程分成两个阶段。希望这能有所帮助。

我已经创建了自己的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() -> 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: "")
    }
}

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

扩展:

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

使用:“_YOUR_STRING_NAME_ .localized ()