2014-10-21 18 views
8

Ich habe viele lokalisierte Texte in meiner Localizable.strings-Datei geschrieben, und ich bin auf der Suche nach einer Möglichkeit, diese zu verwenden und sie im Interface Builder angezeigt werden. Das heißt, anstatt Outlets für alle meine Ansichten zu erstellen und den Text in Code zu setzen, möchte ich eine 0ILUILabel-Unterklasse erstellen, die auf meine Localizable.strings-Datei zugreifen und dann den lokalisierten Text direkt auf dem Interface Builder anzeigen muss.IBInspectable und NSLocalizedString

Das Problem ist, dass NSLocalizedString keine Ergebnisse im Interface Builder, aber nur wenn ich tatsächlich den Code ausführen. Gibt es eine Möglichkeit, dem Interface Builder mitzuteilen, welche Datei für die Lokalisierung verwendet werden soll (zum Beispiel in prepareForInterfaceBuilder)?

Antwort

6

Ich habe es endlich selbst herausgefunden. Die Antwort lautet: Verwenden Sie [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil], um Übersetzungen aus der Datei Localizable.strings im Interface Builder zu erhalten. Diese Erkenntnis machte es mir möglich, die NSLocalizedString Makro (nur für Interface Builder) neu zu definieren:

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

BTW, vielen Dank für bis @rickster Zeige die richtige Richtung in [diese Antwort] (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

12

Dank JRV Antwort ich diese Klasse endlich behoben:

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

} 

dies die Möglichkeit schafft, um den Schlüssel im Interface Builder:

Localized string set in interface builder

Dies wird das Label direkt im Interface Builder aktualisieren, ziemlich cool und etwas, das xcode standardmäßig unterstützen sollte!

Sie können dies auch auf Github finden: https://github.com/AvdLee/ALLocalizableLabel

+0

Dies funktionierte nicht für mich im Interface Builder, bis ich die 'layoutSubviews' Override einfügte. Können Sie erklären, warum es benötigt wird? – Kevin

1

Das ist für mich gearbeitet,

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

und fügen Sie diese String Erweiterung:

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