【问题标题】:From a main app, how can a framework get its own bundle? (Localizable.strings)从主应用程序中,框架如何获得自己的捆绑包? (Localizable.strings)
【发布时间】:2017-03-28 15:01:52
【问题描述】:

所以我有一个主要的 iOS 应用程序,其中包含我制作的框架。

在这个框架中,我创建了一个可本地化的助手以及一个日期助手。 日期助手有一个函数timeAgo(),它可以返回“8 小时前”。我想本地化这个字符串。所以我的框架中有这样的东西:

public extension String {    
    public func localized(in bundle: Bundle) -> String {
        if let path = bundle.path(forResource: Localize.currentLanguage(), ofType: "lproj"),
            let bundle = Bundle(path: path) {
            return bundle.localizedString(forKey: self, value: nil, table: nil)
        }
        return self
    }
}

public extension Date {
    public func timeAgo(format: DateUnitFormat = .short) -> String {
        let thisFrameworkBundle = Bundle(for: Localize.self) // Class declared in the framework
        //Whatever, just display a localized word
        return "second".localized(in: thisFrameworkBundle)
    }
}

当我运行本地测试(框架本身内部的单元测试)时,本地化的东西起作用了。已找到捆绑包。

但是当我从我的主应用程序调用 timeAgo 时,它不再工作了。

我尝试将这一行 let thisFrameworkBundle = Bundle(for: Localize.self) 更改为 let thisFrameworkBundle = Bundle(identifier: "com.myIdentifier"),同样的事情(所以它在框架内工作,但从主应用程序调用时不起作用)。

编辑:

好的,所以我注意到Bundle(identifier: "com.myIdentifier") 在框架中不起作用,因为我使用的是 Cocoapods,它用一个 cocoapod 覆盖了框架标识符。但是,我仍然不明白为什么使用 Bundle(for: FrameworkClass.self) 在主应用程序中不起作用(但在框架的单元测试中起作用)

【问题讨论】:

  • 向我提出的答案添加评论...“com.myIdentifier”完全合格吗?如果是这样,我会尽快删除我的答案(和此评论) - 但请查看我必须使用的 UseYourLoaf 的链接。这可能是您需要的。

标签: ios swift internationalization bundle


【解决方案1】:

此时,我可以给你两个方法。去年我一直在使用这个:

public func returnImage(_ named:String) -> UIImage {
    let myBundle = Bundle.init(identifier: "com.[company].[framework]")
    let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named
    let theImage = UIImage(contentsOfFile: imagePath)
    return theImage!
}

关键部分是将myBundle变量绑定到项目中定义的Bundle ID。

我订阅了一个名为 UseYourLoaf 的博客。非常非常好的资源。今天他们的post,包含了一种非常不同的方式来获得这个——使用类和bundleForClass。我只是发表评论,询问我们的方法之间的优缺点。

我可以告诉你的是,如果你命名了一个 BundleID,你可以使用我的例程来获取资源。

【讨论】:

  • 我已经更新了我的答案。是的,我有正确的标识符。即使对我没有帮助,您也应该留下答案。它可能会帮助其他人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2018-08-02
  • 1970-01-01
相关资源
最近更新 更多