访问Cocoapods resource_bundles

时间:2015-07-06 13:51:56

标签: ios cocoapods

我正在努力处理我自己的pod中定义的本地化资源。

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

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 pod中定义了一个函数:

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")!))
}

但它无法找到捆绑包。

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

2 个答案:

答案 0 :(得分:2)

我终于明白了。

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

    我的新podspec

    spec.resources = "MySDK/*.lproj", "MySDK/*.xib"
    

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

  3. 最后,我使用:

    访问SDK包
    NSBundle(forClass: MySDKClass.self)
    
  4. 我仍然没有100%满意,因为我没有设法使用新的spec.resource_bundles属性。但无论如何,它有效。

答案 1 :(得分:0)

我一直在努力打开和关闭这一周。

到目前为止,我发现的最明显的一点是:https://github.com/CocoaPods/CocoaPods/pull/4635

上面的pull请求状态为了使用resource_bundle你必须使用RESOURCEDIR/**/* glob模式。 RESOURCEDIR是什么似乎并不重要。我一直在尝试各种各样的事情,但**/* glob导致Xcode识别本地化目录。

您可以尝试重现我的结果

  1. 使用pod lib create创建新项目
  2. 选择是以在提示时包含演示应用程序
  3. 使用Finder转到Assets文件夹并添加Base.lproj目录
  4. 在podspec文件中,取消注释s.resource_bundles部分并将*.png更改为**/*
  5. 使用终端运行pod install
  6. 现在在Xcode中你应该看到带有Base.lproj文件夹的Assets文件夹。

    1. 将xib或故事板添加到Base.lproj。
    2. 添加要翻译的标签。
    3. 添加一个类以支持xib或storyboard
    4. 再次运行pod install以引入新文件
    5. 在项目导航器中选择Pods项目
    6. 运行编辑器>导出本地化。
    7. 这应生成一个可用于翻译的XLIFF文件,然后使用编辑器>导入本地化以引入翻译。

      注意您可能需要运行Build>导入翻译后清理。

      注意似乎包含pod的项目也必须支持本地化。