2010-11-02 7 views
13

Est-il possible d'insérer une chaîne NSLocalizedString dans le constructeur d'interface. Par exemple définir un texte d'étiquette à une chaîne localisée au lieu d'une chaîne statique? Je déteste vraiment créer une propriété pour chaque élément nécessitant une chaîne localisée. NSLocalizedString n'est pas la méthode recommandée pour localiser les fichiers Interface Builder.iPhone: NSLocalizedString dans le constructeur d'interface?

Répondre

1
+10

Je n'aime pas utiliser ibtool. parce qu'il crée plusieurs fichiers nib pour chaque langue, et si vous décidez de changer l'interface, vous devez aller à chaque nib pour chaque langue et les changer tous 1 par 1 – aryaxt

+0

Peu importe, ibtool est la bonne façon de le faire. Avoir des pointes séparées vous permet d'ajuster la taille des boutons ou même la disposition entière pour s'adapter à des chaînes plus longues ou à des attentes spécifiques à la culture. ibtool a aussi quelques fonctionnalités qui vous permettent de faire une "localisation incrémentale"; Voir 'man ibtool' pour plus d'informations. –

+0

ibtool ne fonctionne pas correctement lors de la récupération des chaînes de localisation d'un serveur, car elles ne sont pas présentes lors de la compilation. –

2

Même si ce poste est vieux, pour les personnes intéressées à localisant automatiquement vos fichiers IB, vérifier ceci: https://github.com/angelolloqui/AGi18n

AVIS DE NON-RESPONSABILITÉ: Je suis le développeur de la bibliothèque

+0

Votre lib est magique Ange! Je vous remercie. –

+0

@Angel, je suis confronté à un problème avec votre bibliothèque. Impossible de l'installer correctement dans ma machine en utilisant une instruction curl en ligne. –

+0

J'ai répondu à votre problème dans github, mais fondamentalement, vous n'avez pas besoin d'installer les outils si tout ce que vous voulez est d'utiliser la localisation automatique des fichiers IB. Les outils permettent d'extraire des étiquettes de IB pour vous aider à tout localiser et fusionner facilement les chaînes. –

2

Vous pouvez avancé de l'utilisateur Runtime Attributs définis:

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

d'abord définir une nouvelle catégorie pour UILabel:

#import "UILabel+Localized.h" 

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

Puis, dans la Générateur d'interface, Attributs d'exécution définis par l'utilisateur:

textLocalized String votre chaîne à localisée

enter image description here

+0

Très intelligent, mais ne fonctionne pas pour tous les éléments, vous finissez par écrire un tas de catégories pour chaque élément de l'interface utilisateur (ex: segmentedCotnrol, titre des pages, des boutons, etc) – aryaxt

+0

Excellente solution. Je vous remercie! J'ai dû utiliser un attribut d'un mot ("localisable") parce qu'il a échoué avec "textLocalized". Peut-être que j'ai fait quelque chose de mal mais je commente ceci juste au cas où cela arriverait à quelqu'un d'autre (j'ai: 'cette classe n'est pas conforme à la valeur clé codage-conforme pour la clé localiséeText'). Aussi, j'ai déclaré la méthode dans 'l'interface' (c'est peut-être trivial, mais je le dis aussi). –

+0

Vous pouvez sélectionner "Localized String" comme type de l'attribut, et la valeur est censée être la clé de chaîne ... mais cela n'a pas fonctionné. Il a simplement affiché la clé (comme "user_greeting"). –

2

Pour éviter de créer un groupe de catégories, créez un seul qui catégoriser les NSObject et vérifiez la isKindOfClass comme l'a suggéré. Voir le code ci-dessous:

#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 
Questions connexes