2010-11-02 10 views
13

Gibt es eine Möglichkeit, eine NSLocalizedString in Interface Builder einzufügen. Zum Beispiel ein Label-Text auf eine lokalisierte Zeichenfolge anstelle einer statischen Zeichenfolge festlegen?iPhone: NSLocalizedString im Schnittstellen-Generator?

Ich hasse es wirklich, eine Eigenschaft für jedes einzelne Element zu erstellen, das eine lokalisierte Zeichenfolge benötigt.

Antwort

1

NSLocalizedString ist nicht die empfohlene Methode zum Lokalisieren von Interface Builder-Dateien. Check out ibtool:

http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/

+10

Ich benutze nicht gerne ibtool. weil es mehrere Nib-Dateien für jede Sprache erstellt, und wenn Sie sich entscheiden, die Schnittstelle zu ändern, müssen Sie zu jeder Nib für jede Sprache gehen und sie alle 1 durch 1 ändern – aryaxt

+0

Unabhängig davon, ist iftool der richtige Weg, es zu tun. Mit separaten Nibs können Sie die Schaltflächengröße oder sogar das gesamte Layout anpassen, um längere Strings oder kulturspezifische Erwartungen zu erfüllen. ibtool hat auch einige Funktionen, mit denen Sie "inkrementelle Lokalisierung" durchführen können; Weitere Informationen finden Sie unter 'man ibtool'. –

+0

ibtool funktioniert nicht gut, wenn Lokalisierungszeichenfolgen von einem Server abgerufen werden, da sie zum Zeitpunkt der Kompilierung nicht vorhanden sind. –

2

Auch wenn dieser Beitrag ist alt, für die Interessenten in automatisch lokalisierende Ihre IB-Dateien, Überprüfen Sie diese: https://github.com/angelolloqui/AGi18n

HAFTUNGSAUSSCHLUSS: Ich bin der Entwickler der Bibliothek

+0

Deine Lib ist magischer Engel! Vielen Dank. –

+0

@Angel, ich stehe vor einem Problem mit Ihrer Bibliothek. Kann nicht richtig in meinem Rechner mit Online-Curl-Anweisung installiert werden. –

+0

Ich habe Ihr Problem in github beantwortet, aber Sie müssen die Tools im Grunde nicht installieren, wenn Sie nur die automatische Lokalisierung von IB-Dateien verwenden möchten. Die Werkzeuge dienen zum Extrahieren von Beschriftungen aus IB, um Ihnen zu helfen, alles zu lokalisieren und die Zeichenketten einfach zusammenzuführen. –

2

Sie können die User Defined Runtime Advanced nehmen Attribute:

http://cupobjc.blogspot.com.es/2014/04/interfaz-builder-localization.html

Erste eine neue Kategorie für UILabel definieren:

#import "UILabel+Localized.h" 

@implementation UILabel (Localized) 
-(void) setTextLocalized:(NSString *)aText{ 
    [self setText:NSLocalizedString(aText, nil)]; 
} 
@end 

dann in der Interface Builder, Benutzerdefinierte Laufzeitattribute:

textLocalized Zeichenkette Ihre Zeichenkette an lokalisierte

enter image description here

+0

Sehr schlau, aber funktioniert nicht für alle Elemente, Sie schreiben eine Reihe von Kategorien für jedes UI-Element (ex: segmentierteCotnrol, Titel der Seiten, Schaltflächen, etc.) – aryaxt

+0

Große Lösung. Vielen Dank! Ich musste ein Ein-Wort-Attribut ("lokalisierbar") verwenden, weil es mit "textLocalized" fehlgeschlagen ist. Vielleicht habe ich etwas falsch gemacht, aber ich kommentiere das nur für den Fall, dass es jemand anderem passiert (ich habe: 'Diese Klasse ist nicht key-coding-kompatibel für den Schlüssel localizedText'). Außerdem habe ich die Methode in der 'Schnittstelle' erklärt (vielleicht ist es trivial, aber ich sage das auch). –

+0

Sie können "Localized String" als Typ des Attributs auswählen, und der Wert soll der String-Schlüssel sein ... aber es hat nicht funktioniert. Es zeigte nur den Schlüssel an (wie "user_greeting"). –

2

Um zu vermeiden, eine Reihe von Kategorien zu schaffen, erstellen Sie einfach eine, die die NSObject und dann prüfen, für die isKindOfClass kategorisiert, wie vorgeschlagen. Siehe den folgenden Code:

#import "NSObject+Localized.h" 

@implementation NSObject (Localized) 

/// 
/// This method is used to translate strings in .xib files. 
/// Using the "User Defined Runtime Attributes" set an entry like: 
/// Key Path: textLocalized 
/// Type: String 
/// Value: {THE TRANSLATION KEY} 
/// 
-(void) setTextLocalized:(NSString *)key 
{ 
    if ([self isKindOfClass:[UILabel class]]) 
    { 
     UILabel *label = (UILabel *)self; 
     [label setText:NSLocalizedString(key, nil)]; 
    } 
    else if ([self isKindOfClass:[UIButton class]]) 
    { 
     UIButton *button = (UIButton *)self; 
     [button setTitle:NSLocalizedString(key, nil) forState:UIControlStateNormal]; 
    } 
    else if ([self isKindOfClass:[UIBarButtonItem class]]) 
    { 
     UIBarButtonItem *button = (UIBarButtonItem *)self; 
     [button setTitle:NSLocalizedString(key, nil)]; 
    } 
} 

@end