是否有一个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
但是,它很长,一点也不方便。
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 -没有变化,仍然像那样工作。
通过使用这种方式,可以为不同类型创建不同的实现(即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 :)")
也许最好的方法是这个。
fileprivate func NSLocalizedString(_ key: String) -> String {
return NSLocalizedString(key, comment: "")
}
and
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)
对我来说这是最好的,因为
硬编码的字符串在一个特定的文件中,所以哪天你想改变它就很容易了
比每次在文件中手动输入字符串更容易使用
Genstrings仍然可以工作
你可以添加更多的扩展,比如每个视图控制器一个扩展来保持整洁
虽然这不能解决缩短的问题,但这帮助我组织消息,我为错误消息创建了一个如下所示的结构
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