如何使用存储在 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?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据到 Cocoa Touch 框架

在我的子项目(CocoaTouch 框架)中使用 3rd 方框架(Alamofire)

Cocoa Touch 框架无法在嵌入项目中的模拟器上调试

如何解决 Cocoa touch 框架中的符号名称冲突

在 swift 项目中集成 swift 框架,都使用 cocoapods

Swift 3.1 中的 CocoaTouch 类