IBInspectable和NSLocalizedString

时间:2014-10-21 11:57:35

标签: objective-c interface-builder xcode6

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

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

3 个答案:

答案 0 :(得分:12)

感谢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
        }
    }

}

这样就可以在界面构建器中设置密钥:

Localized string set in interface builder

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

您也可以在Github上找到它: https://github.com/AvdLee/ALLocalizableLabel

答案 1 :(得分:7)

我终于弄明白了。答案是:使用[[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

答案 2 :(得分:1)

这对我有用,

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: "")
    }
}