【问题标题】:IBInspectable and NSLocalizedStringIBInspectable 和 NSLocalizedString
【发布时间】:2014-10-21 11:57:35
【问题描述】:

我的 Localizable.strings 文件中有很多本地化文本,我正在寻找一种方法来使用这些文本并将它们显示在界面构建器中。也就是说,我不想为我的所有视图创建出口并在代码中设置文本,而是创建一个IB_DESIGNABLE UILabel 子类,它必须访问我的 Localizable.strings 文件,然后直接在界面构建器上显示本地化文本。

问题是,NSLocalizedString 在界面生成器中没有给出任何结果,但只有当我实际运行代码时。有没有办法告诉界面构建器使用哪个文件进行本地化(例如在 prepareForInterfaceBuilder 中)?

【问题讨论】:

    标签: objective-c interface-builder xcode6


    【解决方案1】:

    感谢 JRV 的回答,我终于修好了这门课:

    @IBDesignable class ALLocalizableLabel: UILabel {
    
        @IBInspectable var localizeString:String = "" {
            didSet {
                #if TARGET_INTERFACE_BUILDER
                    var bundle = NSBundle(forClass: self.dynamicType)
                    self.text = bundle.localizedStringForKey(self.localizeString, value:"", table: nil)
                #else
                    self.text = NSLocalizedString(self.localizeString, comment:"");
                #endif
            }
        }
    
    }
    

    这创造了在界面构建器中设置密钥的可能性:

    这将直接在界面生成器中更新标签,非常酷,并且默认情况下 xcode 应该支持!

    你也可以在 Github 上找到这个: https://github.com/AvdLee/ALLocalizableLabel

    【讨论】:

    • 这在 Interface Builder 中对我不起作用,直到我包含 layoutSubviews 覆盖。你能解释一下为什么需要它吗?
    【解决方案2】:

    我终于自己弄明白了。答案是:使用[[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] 从界面生成器中的 Localizable.strings 文件中获取翻译。这种认识使我能够重新定义NSLocalizedString 宏(用于界面构建器):

    #if TARGET_INTERFACE_BUILDER
    #undef NSLocalizedString
    #define NSLocalizedString(key, comment) [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil]
    #endif
    

    【讨论】:

    • 顺便说一句,感谢@rickster 在this answer 中指出正确的方向
    【解决方案3】:

    这对我有用,

    import Foundation
    import UIKit
    
    @IBDesignable
    class YourLabel: UILabel {
        @IBInspectable var stringLocalizationKey: String = ""{
            didSet{
                text = stringLocalizationKey.localized
                setup()
            }
        }
    
        override func awakeFromNib() {
            super.awakeFromNib()
            setup()
        }
    
        func setup(){
            textAlignment = NSTextAlignment.center
        }
    
        override open func layoutSubviews() {
            super.layoutSubviews()
            self.preferredMaxLayoutWidth = self.frame.size.width
            self.layoutIfNeeded()
        }
    
        override func prepareForInterfaceBuilder() {
            let bundle = Bundle(for: type(of: self))
            self.text = bundle.localizedString(forKey: self.stringLocalizationKey, value:"", table: nil)
        }
    }
    

    并添加这个String 扩展:

    extension String {
        var localized: String {
            return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多