当您开发SDK时,需要进行一些额外的操作。
1)像往常一样在YourLocalizeDemoSDK中创建 Localizable.strings 。
2)在YourLocalizeDemo中创建相同的 Localizable.strings 。
3)查找YourLocalizeDemoSDK的 Bundle Path 。
Swift4:
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")
Bundle(for: type(of: self))
可以帮助你找到YourLocalizeDemoSDK中的bundle。如果你使用
Bundle.main
的话,你会得到错误的值(实际上它将是与键相同的字符串)。
但如果你想使用
dr OX提到的String扩展名,你需要做更多的工作。原始扩展看起来像这样。
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
我们知道,我们正在开发一个SDK,Bundle.main
将获取YourLocalizeDemo包的bundle。这不是我们想要的。我们需要YourLocalizeDemoSDK中的bundle。这是一个快速查找它的技巧。
在YourLocalizeDemoSDK中的NSObject实例中运行下面的代码。然后你将获得YourLocalizeDemoSDK的URL。
let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL
打印这两个网址,你会发现我们可以基于mainBundleURL构建bundleURLofSDK。在这种情况下,它将是:
let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
并且 String 扩展将会是这样的:
extension String {
var localized: String {
let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
}
}
希望这能有所帮助。
NSLocalizedString("Cancel", comment: "Cancel button title")
来利用默认值。我认为这样很方便。 - LShi