访问Cocoapods resource_bundles

Tij*_*jee 8 ios cocoapods

我正在努力使用我自己的pod中定义的本地化资源.

此pod使用Base Internationalization和以下文件:

Base.lproj
|- Localizable.strings
|- MyViewController.xib

fr.lproj
|- Localizable.strings
|- MyViewController.strings
Run Code Online (Sandbox Code Playgroud)

这是他们在我的定义podspec:

spec.resources = "MySDK/*.lproj/*"
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中Podfile,我的pod被定义为本地依赖项:

pod 'MySDK', :path => '../MySDK'
Run Code Online (Sandbox Code Playgroud)

运行后pod install,我可以看到完全相同的 lproj文件夹Development Pods/MySDK/Resources/MySDK.

MyViewController.xib 完全加载和本地化,我可以更改手机上的语言,文本也会相应更改.

为了使用本地化字符串,我在SDK pod中定义了一个函数:

public func NSLocalizedIntentString(key: String) -> String {
    let sdkBundle = NSBundle(forClass: MySDKClass.self)
    return NSLocalizedString(key, tableName: nil, bundle: sdkBundle, value: key, comment: "")
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,除了它只使用Base.lproj在手机或模拟器上选择的语言中定义的字符串.

我改变了我podspec的意思:

spec.resource_bundles = {
    "MySDK" => ["MySDK/*.lproj"]
}
Run Code Online (Sandbox Code Playgroud)

为了从代码加载bundle,但现在什么都不起作用,XIB无法加载.这很奇怪,因为Development Pods我仍然可以看到与之前完全相同的结构,但是使用蓝色文件夹图标而不是黄色.

以下是我从SDK加载XIB的方法,而不是从我的应用程序加载:

MyViewController.swift

public init(...) {
    ...
    super.init(nibName: "MyViewController", bundle: NSBundle(forClass: MyViewController.self))
}
Run Code Online (Sandbox Code Playgroud)

我改为:

public init(...) {
    ...
    super.init(nibName: "MyViewController", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource("MySDK", ofType: "bundle")!))
}
Run Code Online (Sandbox Code Playgroud)

但它无法找到捆绑.

从今天早上开始,我已经阅读了大量的文档和论坛,但没有成功,所以任何帮助都会受到欢迎!:)

Tij*_*jee 4

我终于弄明白了。

  1. 我切换回spec.resources而不是spec.resource_bundles在我的中podspec,因为我无法访问生成的包。
  2. 然后我不得不关闭 XIB 的本地化,因为我意识到 lang 子目录中的资源没有被编译。因此,XIB 现在位于lproj目录之外。

    我的新podspec

    spec.resources = "MySDK/*.lproj", "MySDK/*.xib"
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,我复制lproj目录本身 ( *.lproj),而不是目录的内容lproj( *.lproj/*),因为它们Localizable.strings会相互覆盖。我需要将它们保存在 lang 子目录中。

  3. 最后,我通过以下方式访问 SDK 包:

    NSBundle(forClass: MySDKClass.self)
    
    Run Code Online (Sandbox Code Playgroud)

我仍然不是100%满意,因为我没能使用新spec.resource_bundles房产。但无论如何,它有效。