2014-10-21 4 views
8

У меня есть много локализованных текстов, написанных в моем файле Localizable.strings, и я ищу способ их использования и получить их в построителе интерфейса. То есть вместо создания точек вывода для всех моих представлений и установки текста в коде, я хотел бы создать подкласс UILabel IB_DESIGNABLE, который должен получить доступ к моему файлу Localizable.strings, а затем отобразить локализованный текст непосредственно в построителе интерфейса.IBInspectable и NSLocalizedString

Проблема заключается в том, что NSLocalizedString не дает никаких результатов в построителе интерфейса, но только когда я на самом деле запустил код. Есть ли способ сообщить разработчику интерфейса, какой файл использовать для локализации (например, в prepareForInterfaceBuilder)?

ответ

6

Я, наконец, понял это сам. Ответ: используйте [[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 
+0

Кстати, благодаря @rickster для указав правильное направление в [этот ответ] (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

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

+0

Это не сработало для меня в Interface Builder, пока я не включил переопределение layoutSubviews. Не могли бы вы объяснить, почему это необходимо? – Kevin

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: "") 
    } 
} 
Смежные вопросы