首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IBInspectable和NSLocalizedString

IBInspectable和NSLocalizedString
EN

Stack Overflow用户
提问于 2014-10-21 11:57:35
回答 3查看 2.8K关注 0票数 9

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-22 06:41:27

我终于自己想出来了。答案是:使用[[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil]从接口构建器中的Localizable.strings文件获得翻译。这种实现使我能够重新定义NSLocalizedString宏(仅用于接口生成器):

代码语言:javascript
复制
#if TARGET_INTERFACE_BUILDER
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil]
#endif
票数 7
EN

Stack Overflow用户

发布于 2014-12-11 08:22:17

多亏JRV的回答,我终于修正了这门课:

代码语言:javascript
复制
@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

票数 12
EN

Stack Overflow用户

发布于 2017-02-02 06:29:33

这对我有用,

代码语言:javascript
复制
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扩展:

代码语言:javascript
复制
extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26486123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档