在Swift中,NSLocalizedString等价于什么?

有没有一个Swift等效的NSLocalizedString(...) ? 在Objective-C ,我们通常使用:

 NSString *string = NSLocalizedString(@"key", @"comment"); 

我怎样才能在Swift中实现相同? 我find了一个函数:

 func NSLocalizedString( key: String, tableName: String? = default, bundle: NSBundle = default, value: String = default, #comment: String) -> String 

但是,这很长,不方便。

我用下一个解决scheme:

1)创build扩展:

 extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } } 

2)在Localizable.strings文件中:

 "Hi" = "Привет"; 

3)使用范例:

 myLabel.text = "Hi".localized 

请享用! ;)

–upd: –

如果您有意见,可以使用此解决scheme:

1)分机:

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

2).strings文件中:

 /* with !!! */ "Hi" = "Привет!!!"; 

3)使用:

 myLabel.text = "Hi".localized(withComment: "with !!!") 

NSLocalizedString也存在于Swift的世界中。

 func NSLocalizedString( key: String, tableName: String? = default, bundle: NSBundle = default, value: String = default, #comment: String) -> String 

tableNamebundlevalue参数用一个default关键字标记,这意味着我们可以在调用函数的时候忽略这些参数。 在这种情况下,将使用它们的默认值。

这导致方法调用可以被简化为:

 NSLocalizedString("key", comment: "comment") 

通过使用这种方式,可以为不同的types创build不同的实现(例如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 :)") 

为案例创build了一个小帮手方法,其中“评论”总是被忽略。 较less的代码更容易阅读:

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

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

Swift 3版本:)…

 import Foundation extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } } 

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

1)第一阶段是使用旧的方式来创build所有可翻译的string:

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

1.1)然后,你应该使用生成器来生成Localizable.strings:

 $ genstrings *swift 

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

2.1)根据正则expression式使用您的XCode“查找和replace”选项。 至于给定的例子(如果你没有评论)正则expression式将是:

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

并用其replace

 $1.localized 

或(如果您有意见)

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

并用其replace

 $1.localizedWithComment(comment: $2) 

你可以随意玩正则expression式和不同的扩展组合。 一般的做法是分两个阶段分解整个过程。 希望有所帮助。

这里最好的办法就是这个。

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

 import Foundation extension String { static let Hello = NSLocalizedString("Hello") static let ThisApplicationIsCreated = NSLocalizedString("This application is created by the swifting.io team") static let OpsNoFeature = NSLocalizedString("Ops! It looks like this feature haven't been implemented yet :(!") } 

你可以像这样使用它

 let message: String = .ThisApplicationIsCreated print(message) 

对我来说这是最好的因为

  • 硬编码的string是在一个特定的文件,所以你想改变它的那一天真的很容易
  • 比每次手动在文件中inputstring更容易使用
  • 传送仍然有效
  • 你可以添加更多的扩展,比如每个视图控制器来保持整洁

有用的unit testing:

这是一个简单的版本,可以扩展到不同的用例(例如使用tableNames)。

 public func NSLocalizedString(key: String, referenceClass:AnyClass) -> String { let bundle = NSBundle(forClass: referenceClass) return NSLocalizedString(key, tableName:nil, bundle: bundle, comment: "") } 

像这样使用它:

 NSLocalizedString("YOUR-KEY", referenceClass: self) 

我已经创build了自己的genstrings类工具来提取string使用自定义翻译function

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

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

它将parsing所有的swift文件,并将你的代码中的string和注释导出到.strings文件中。

可能不是最简单的方法,但它是可能的。

虽然这不能回答缩短问题,但是这帮助我组织消息,我创build了一个错误消息的结构,如下所示

 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 

这样,您可以组织消息并使起斜工作。

这是使用的genstrings命令

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

当我有一个来源,但有几个目标(翻译),例如我使用不同的语法性别(Swift 3)

 NSLocalizedString("previousWasFeminine", value: "previous was", comment: "previousWasFeminine") NSLocalizedString("previousWasMasculine", value: "previous was", comment: "previousWasMasculine")