IBInspectable and NSLocalizedString

9

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

问题是,NSLocalizedString只有在实际运行代码时才会给出任何结果,而不是在界面构建器中。是否有一种方法告诉界面构建器使用哪个文件进行本地化(例如在prepareForInterfaceBuilder中)?

3个回答

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

}

这样可以在界面构建器中设置键:

在界面构建器中设置本地化字符串

这将直接在界面构建器中更新标签,非常酷,是Xcode应该默认支持的功能!

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


在Interface Builder中,这对我没有起作用,直到我包括了layoutSubviews重写方法。你能解释一下为什么需要它吗? - Kevin

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

顺便说一句,感谢@rickster在这个答案中指出了正确的方向。 - JRV

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接