我在自己的pod中定义的本地化资源方面苦苦挣扎。

此 Pane 使用带有以下文件的基本国际化:

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

fr.lproj
|- Localizable.strings
|- MyViewController.strings

这就是我的podspec中定义它们的方式:
spec.resources = "MySDK/*.lproj/*"

在我的应用程序的Podfile中,我的pod被定义为本地依赖项:
pod 'MySDK', :path => '../MySDK'

运行pod install后,我可以在lproj中看到完全相同的 Development Pods/MySDK/Resources/MySDK文件夹。
MyViewController.xib已完美加载和本地化,我可以更改手机上的语言,文本也会相应更改。

为了使用本地化的字符串,我在我的SDK Pane 中定义了一个函数:
public func NSLocalizedIntentString(key: String) -> String {
    let sdkBundle = NSBundle(forClass: MySDKClass.self)
    return NSLocalizedString(key, tableName: nil, bundle: sdkBundle, value: key, comment: "")
}

它可以工作,但仅使用Base.lproj中定义的字符串,而不管电话或模拟器上选择的语言是什么。

我将podspec更改为:
spec.resource_bundles = {
    "MySDK" => ["MySDK/*.lproj"]
}

为了从代码加载 bundle 包,但现在没有任何效果,无法加载XIB。这很奇怪,因为在Development Pods中,我仍然可以看到与以前完全相同的结构,但是文件夹图标是蓝色而不是黄色。

这是我从我的SDK而不是从我的应用程序加载XIB的方法:
MyViewController.swift
public init(...) {
    ...
    super.init(nibName: "MyViewController", bundle: NSBundle(forClass: MyViewController.self))
}

我将其更改为:
public init(...) {
    ...
    super.init(nibName: "MyViewController", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource("MySDK", ofType: "bundle")!))
}

但找不到 bundle 包。

自从今天早上以来,我已经阅读了大量的文档和论坛,但都没有成功,因此,非常感谢您的帮助! :)

最佳答案

我终于弄明白了。

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

    我的新podspec:
    spec.resources = "MySDK/*.lproj", "MySDK/*.xib"
    

    请注意,我复制了lproj目录本身(*.lproj),而不是lproj目录(*.lproj/*)的内容,因为Localizable.strings会相互覆盖。我需要将它们保留在其lang子目录中。
  • 最后,我通过以下方式访问SDK bundle 包:
    NSBundle(forClass: MySDKClass.self)
    

  • 我仍然不是100%满意,因为我没有设法使用新的spec.resource_bundles属性。但是无论如何,它是可行的。

    09-16 20:47