我在Localizable.strings文件中编写了很多本地化文本,我正在寻找一种方法来使用它们并在界面构建器中显示它们。也就是说,不是为我的所有视图创建出口并在代码中设置文本,我想创建一个IB_DESIGNABLE
UILabel子类,它必须访问我的Localizable.strings文件,然后直接在界面上显示本地化文本建设者。
问题是,NSLocalizedString在接口构建器中没有给出任何结果,但仅当我实际运行代码时。有没有办法告诉界面构建器使用哪个文件进行本地化(例如在prepareForInterfaceBuilder中)?
答案 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
}
}
}
这样就可以在界面构建器中设置密钥:
这将直接在界面构建器中更新标签,非常酷,默认情况下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: "")
}
}