我在自己的pod中定义的本地化资源方面苦苦挣扎。
此 Pane 使用带有以下文件的基本国际化:
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 Pane 中定义了一个函数:
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")!))
}
但找不到 bundle 包。
自从今天早上以来,我已经阅读了大量的文档和论坛,但都没有成功,因此,非常感谢您的帮助! :)
最佳答案
我终于弄明白了。
spec.resources
而不是spec.resource_bundles
中的podspec
。 lproj
目录之外。我的新
podspec
:spec.resources = "MySDK/*.lproj", "MySDK/*.xib"
请注意,我复制了
lproj
目录本身(*.lproj
),而不是lproj
目录(*.lproj/*
)的内容,因为Localizable.strings
会相互覆盖。我需要将它们保留在其lang子目录中。 NSBundle(forClass: MySDKClass.self)
我仍然不是100%满意,因为我没有设法使用新的
spec.resource_bundles
属性。但是无论如何,它是可行的。