Ios 从主应用程序,框架如何获得自己的捆绑包?(可本地化的.strings)

Ios 从主应用程序,框架如何获得自己的捆绑包?(可本地化的.strings),ios,swift,internationalization,bundle,Ios,Swift,Internationalization,Bundle,因此,我有一个主要的iOS应用程序,其中包括一个我制作的框架 在这个框架中,我创建了一个可本地化的助手和一个日期助手。 日期助手有一个函数timeAgo(),它可以返回“8小时前”。我想定位这个字符串。所以我的框架中有这样的东西: public extension String { public func localized(in bundle: Bundle) -> String { if let path = bundle.path(forResourc

因此,我有一个主要的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”)
在框架内不起作用,因为我使用的是cocoapod,它用cocoapod覆盖了框架标识符。但是,我仍然不明白为什么在主应用程序中使用
捆绑包(for:FrameworkClass.self)
不起作用(但在框架的单元测试中起作用)

目前,我可以提供两种方法。去年我一直在使用这个:

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的博客。非常非常好的资源。今天,他们的产品包含了一种非常不同的方法来实现这一点——使用类和
bundleForClass
。我只是发表了一篇评论,询问我们两种方法的利弊


我可以告诉你的是,如果你命名了BundleID,你可以使用我的例程访问资源。

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

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的博客。非常非常好的资源。今天,他们的产品包含了一种非常不同的方法来实现这一点——使用类和
bundleForClass
。我只是发表了一篇评论,询问我们两种方法的利弊


我可以告诉您的是,如果您命名了BundleID,您可以使用我的例程访问资源。

在我建议的答案中添加注释。。。“com.myIdentifier”是否完全合格?如果是这样的话,我会很快删除我的答案(和这条评论)——但请看我必须使用YourLoaf的链接。这可能就是你需要的。在我建议的答案中添加评论。。。“com.myIdentifier”是否完全合格?如果是这样的话,我会很快删除我的答案(和这条评论)——但请看我必须使用YourLoaf的链接。这可能是你需要的。我已经更新了我的答案。是的,我有正确的标识符。你应该留下你的答案,即使它对我没有帮助。它可能会帮助其他人:)我已经更新了我的答案。是的,我有正确的标识符。你应该留下你的答案,即使它对我没有帮助。它可能会帮助其他人:)