是否有一个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)
您可以随心所欲地使用正则表达式和不同的扩展组合。一般的方法是把整个过程分成两个阶段。希望这能有所帮助。
通过使用这种方式,可以为不同类型创建不同的实现(即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 :)")
有助于在单元测试中使用:
这是一个简单的版本,可以扩展到不同的用例(例如使用tableNames)。
public func NSLocalizedString(key: String, referenceClass: AnyClass, comment: String = "") -> String
{
let bundle = NSBundle(forClass: referenceClass)
return NSLocalizedString(key, tableName:nil, bundle: bundle, comment: comment)
}
像这样使用它:
NSLocalizedString("YOUR-KEY", referenceClass: self)
或者像这样加一条评论:
NSLocalizedString("YOUR-KEY", referenceClass: self, comment: "usage description")
虽然这不能解决缩短的问题,但这帮助我组织消息,我为错误消息创建了一个如下所示的结构
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