2014-10-21 14 views
8

Mam dużo zlokalizowanych tekstów zapisanych w pliku Localizable.strings i szukam sposobu ich użycia i pokazania ich w programie budującym interfejs. To znaczy, zamiast tworzyć ujścia dla wszystkich moich widoków i ustawiać tekst w kodzie, chciałbym utworzyć podklasę UILabel, która musi uzyskać dostęp do mojego pliku Localizable.strings, a następnie pokazać zlokalizowany tekst bezpośrednio na konstruktorze interfejsów.IBInspectable i NSLocalizedString

Problem polega na tym, że NSLocalizedString nie daje żadnych wyników w konstruktorze interfejsów, ale tylko wtedy, gdy faktycznie wykonuję kod. Czy istnieje sposób, aby poinformować program budujący interfejs, którego pliku użyć do lokalizacji (na przykład w module prepareForInterfaceBuilder)?

Odpowiedz

6

W końcu udało mi się to ustalić. Odpowiedź brzmi: użyj [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil], aby uzyskać tłumaczenia z pliku Localizable.strings w narzędziu do tworzenia interfejsu. Ta realizacja pozwoliła mi na nowo zdefiniować NSLocalizedString makro (tylko dla konstruktora Interface):

#if TARGET_INTERFACE_BUILDER 
#undef NSLocalizedString 
#define NSLocalizedString(key, comment) [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] 
#endif 
+0

Przy okazji, dzięki za @rickster wskazywanie właściwego kierunku w [tej odpowiedzi] (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

12

Dzięki odpowiedź JRV za I wreszcie trwałe tę klasę:

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

} 

ten stwarza możliwość ustawić klucz w budowniczy interfejs:

Localized string set in interface builder

To uaktualni etykietę bezpośrednio w konstruktorze interfejsów, całkiem fajnie i domyślnie powinna być obsługiwana obsługa xcode!

można znaleźć na Github także: https://github.com/AvdLee/ALLocalizableLabel

+0

To nie działa dla mnie w Konstruktorze interfejsów, dopóki nie uwzględniłem nadpisania 'layoutSubviews'. Czy możesz wyjaśnić, dlaczego jest potrzebny? – Kevin

1

ten pracował dla mnie,

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

i dodać String rozszerzenia:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 
} 
Powiązane problemy