2014-10-21 10 views
8

Ho un sacco di testi localizzati scritti nel mio file Localizable.strings e sto cercando un modo per usarli e visualizzarli nel builder dell'interfaccia. Cioè, invece di creare punti vendita per tutte le mie viste e impostare il testo in codice, vorrei creare una sottoclasse UILabel IB_DESIGNABLE, che deve accedere al mio file Localizable.strings e quindi mostrare il testo localizzato direttamente sul generatore di interfacce.IBInspectable e NSLocalizedString

Il problema è che NSLocalizedString non fornisce alcun risultato nel generatore di interfacce, ma solo quando effettivamente il codice esegue. C'è un modo per dire al generatore di interfacce quale file usare per la localizzazione (ad esempio in prepareForInterfaceBuilder)?

risposta

6

Ho finalmente capito da solo. La risposta è: utilizzare [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] per ottenere le traduzioni dal file Localizable.strings nel builder dell'interfaccia. Questa realizzazione ha reso possibile per me, per ridefinire il NSLocalizedString macro (solo per la creazione di interfacce):

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

BTW, grazie a @rickster per puntando la giusta direzione in [questa risposta] (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

12

Grazie alla risposta di JRV fine ho fissato questa classe:

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

} 

Questo crea la possibilità di impostare la chiave nel generatore di interfaccia:

Localized string set in interface builder

Questo aggiornerà l'etichetta direttamente nel generatore di interfacce, piuttosto interessante e qualcosa xcode dovrebbe supportare di default!

È possibile trovare questo su Github così: https://github.com/AvdLee/ALLocalizableLabel

+0

Questo non ha funzionato per me in Interface Builder, fino a quando ho incluso l'override di 'layoutSubviews'. Potresti spiegare perché è necessario? – Kevin

1

Questo ha funzionato per me,

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

e aggiungi a String estensione:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 
} 
Problemi correlati