Cuando estás desarrollando un SDK. Necesitas una operación extra.
1) cree Localizable.strings como de costumbre en YourLocalizeDemoSDK.
2) cree las mismas cadenas Localizable.string en YourLocalizeDemo.
3) encuentre su ruta de paquete de 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))
le ayuda a encontrar el paquete en YourLocalizeDemoSDK. Si usa Bundle.main
en su lugar, obtendrá un valor incorrecto (de hecho, será la misma cadena con la clave).
Pero si desea utilizar la extensión de cadena mencionada por el Dr. OX . Necesitas hacer un poco más. La extensión de origen se ve así.
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
Como sabemos, estamos desarrollando un SDK, Bundle.main
obtendremos el paquete del paquete de YourLocalizeDemo. Eso no es lo que queremos. Necesitamos el paquete en YourLocalizeDemoSDK. Este es un truco para encontrarlo rápidamente.
Ejecute el código a continuación en una instancia de NSObject en YourLocalizeDemoSDK. Y obtendrá la URL de YourLocalizeDemoSDK.
let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL
Imprima las dos URL, verá que podemos construir la base bundleURLofSDK en mainBundleURL. En este caso, será:
let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
Y la extensión de la cadena será:
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: "")
}
}
Espero eso ayude.