SDKを開発しているとき。追加の操作が必要です。
1)YourLocalizeDemoSDKで通常どおりLocalizable.stringsを作成します。
2)YourLocalizeDemoに同じLocalizable.stringsを作成します。
3)YourLocalizeDemoSDKのバンドルパスを見つけます。
Swift4:
// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")
Bundle(for: type(of: self))
YourLocalizeDemoSDKでバンドルを見つけるのに役立ちます。Bundle.main
代わりに使用すると、誤った値が返されます(実際には、キーと同じ文字列になります)。
しかし、dr OXによって言及された文字列拡張を使用したい場合。あなたはもう少しする必要があります。元の拡張子は次のようになります。
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
ご存知のように、私たちはSDKを開発しておりBundle.main
、YourLocalizeDemoのバンドルのバンドルを取得します。それは私たちが望んでいることではありません。YourLocalizeDemoSDKにバンドルが必要です。これはそれを素早く見つけるためのトリックです。
YourLocalizeDemoSDKのNSObjectインスタンスで以下のコードを実行します。そして、YourLocalizeDemoSDKのURLを取得します。
let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL
2つのURLの両方を出力すると、mainBundleURLに基づいてbundleURLofSDKを構築できることがわかります。この場合は、次のようになります。
let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
そして、文字列拡張は次のようになります。
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: "")
}
}
それが役に立てば幸い。