Ios 从主应用程序,框架如何获得自己的捆绑包?(可本地化的.strings)
因此,我有一个主要的iOS应用程序,其中包括一个我制作的框架 在这个框架中,我创建了一个可本地化的助手和一个日期助手。 日期助手有一个函数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
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的链接。这可能是你需要的。我已经更新了我的答案。是的,我有正确的标识符。你应该留下你的答案,即使它对我没有帮助。它可能会帮助其他人:)我已经更新了我的答案。是的,我有正确的标识符。你应该留下你的答案,即使它对我没有帮助。它可能会帮助其他人:)