是否有一个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 -没有变化,仍然像那样工作。
实际上,你可以在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)
您可以随心所欲地使用正则表达式和不同的扩展组合。一般的方法是把整个过程分成两个阶段。希望这能有所帮助。
我使用下一个解决方案:
1)创建扩展:
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
2)本地化。字符串文件:
"Hi" = "Привет";
3)使用实例:
myLabel.text = "Hi".localized
享受吧!;)
——乌利希期刊指南:
对于带有注释的情况,您可以使用此解决方案:
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 !!!")