从主应用程序,框架如何获得自己的包? (Localizable.strings)

时间:2017-03-28 15:01:52

标签: ios swift internationalization bundle

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

在这个框架中,我创建了一个Localizable助手以及一个Date助手。 日期助手有一个函数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)无法在主应用程序中工作(但在框架的单元测试中工作)

1 个答案:

答案 0 :(得分:0)

此时此刻,我可以给你两种方式。去年我一直在使用它:

extern "C" void api_create_sand_c_side_from_cfg_file(const char* cfg_file_name);

片段将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! } 变量绑定到项目中定义的Bundle ID。

我订阅了一个名为UseYourLoaf的博客。非常非常好的资源。今天他们的post包含了一种非常不同的方法 - 使用类和myBundle。我只是发表评论,询问我们的方法之间的利弊。

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