如何使用存储在 CocoaTouch 框架中的 Localizable.strings?
Posted
技术标签:
【中文标题】如何使用存储在 CocoaTouch 框架中的 Localizable.strings?【英文标题】:How to use Localizable.strings stored in a CocoaTouch Framework? 【发布时间】:2015-02-25 16:46:09 【问题描述】:我想为 CocoaTouch 框架添加多语言支持。
问题:我创建的 Localizable.strings 文件只有在它是主应用程序及其目标的一部分时才被 NSLocalizedString 使用。我想将它存储在框架中以保持独立。
Localizable.strings 放置在 CocoaTouch 框架中时如何使用?
【问题讨论】:
【参考方案1】:用途:
NSLocalizedString("Good", tableName: nil, bundle: NSBundle(forClass: self), value: "", comment: "")
或者你可以像这样创建公共函数:
class func POLocalized(key: String) -> String
let s = NSLocalizedString(key, tableName: nil, bundle: NSBundle(forClass: self.classForCoder()), value: "", comment: "")
return s
使用示例:
let locString = POLocalized("key")
【讨论】:
不要将 NSBundle(forClass: self) 用于公共类,因为某些 Main bundle 类可以继承框架类,而 NSBundle(forClass: self) 将指向 main bundle,而不是框架。 在这种情况下你可以使用 NSBundle(identifier: "FRAMEWORK_ID")value
参数代表什么?当前的 Apple 文档没有解释...
如果在给定的表中找不到字符串,则返回默认值。
对于那些可能想知道的人:无论您的框架可能包含多少本地化,如果您的项目本身也没有针对所需的语言,NSLocalizedString
(使用上述解决方案)将不会返回它们.【参考方案2】:
这可以通过在 NSLocalizedString
构造函数中指定框架的包标识符来完成。
if let bundle: NSBundle = NSBundle(identifier: "com.mycompany.TheFramework")
let string = NSLocalizedString("key", tableName: nil, bundle: bundle, value: "", comment: "")
print(string)
【讨论】:
【参考方案3】:您可以将此结构添加到您的代码库中:
internal struct InternalConstants
private class EmptyClass
static let bundle = Bundle(for: InternalConstants.EmptyClass.self)
然后使用可选的 bundle 参数来指定你的字符串文件的位置:
let yourString = NSLocalizedString("Hello", bundle: InternalConstants.bundle, comment: "")
如果您不在NSLocalizedString
构造函数中使用bundle
参数,则Bundle.main
是默认值。
【讨论】:
不鼓励仅使用代码的答案。请添加一些解释,说明这如何解决问题,或者这与现有答案有何不同。 From Review【参考方案4】:从框架中获取 Localizable.strings
一个要点是使用框架的捆绑包 - 字符串(Localizable.string
)所在的捆绑包
[Access to Framework bundle]
//e.g.
let someString = NSLocalizedString("some_string_id", tableName: nil, bundle: Bundle(identifier: "com.something")!, value: "", comment: "")
扩展变体
extension String
public var localized: String
return NSLocalizedString(self, tableName: nil, bundle: Bundle(identifier: "com.something")!, value: "", comment: "")
//using
let someString = "some_string_id".localized
【讨论】:
以上是关于如何使用存储在 CocoaTouch 框架中的 Localizable.strings?的主要内容,如果未能解决你的问题,请参考以下文章
在我的子项目(CocoaTouch 框架)中使用 3rd 方框架(Alamofire)