Localisation iPhone: Est-il possible de traduire facilement des fichiers nib sans avoir à copier le nib pour chaque langue?

StackOverflow https://stackoverflow.com/questions/619867

Question

J'essaie de trouver un moyen pratique de traduire chaque chaîne visible dans une application iPhone. La documentation officielle d’Apple indique qu’il faut utiliser des fichiers .strings pour les chaînes de programmation, tout en utilisant la fonction "Ajouter un fichier localisé" intégrée. option dans xcode pour localiser les fichiers nib.

Le problème que je vois avec ceci est que si l’UI doit changer après la localisation, nous aurions besoin de mettre à jour les nibs individuellement pour chaque langue, ce qui n’est pas optimal. Existe-t-il un moyen plus simple de lier des chaînes affichées dans des fichiers nib à des valeurs pertinentes dans un fichier .strings? ou devrais-je programmer par programme de définir ces chaînes pour chaque élément d'interface utilisateur (ce qui est légèrement meilleur mais toujours ennuyeux)?

Était-ce utile?

La solution

Le mieux que vous puissiez faire est de faire une boucle récursive dans chaque vue, puis de placer le texte dessus:

static void translateView(NSBundle *bundle, UIView *view)
{
    id idView = view;
    if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)])
        [idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)])
        [idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)])
        [idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)])
        [idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)])
        [idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal];
    if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]])
        for (UIBarItem *item in [idView items])
            [item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]];
    for (UIView *subview in [view subviews])
        translateView(bundle, subview);
}

Avertissement: vous devrez peut-être vérifier d'autres ensembles de sélecteurs pour tout intercepter. Ce n’est pas une pratique exemplaire, mais il semble que beaucoup moins de travail

Autres conseils

Le programme de ligne de commande intégré d’Apple, ibtool, vous permet de le faire. Vous pouvez extraire les chaînes d'un fichier XIB, les localiser, puis créer un nouveau fichier XIB basé sur le fichier XIB existant mais utilisant les chaînes localisées. Ainsi, vous pouvez toujours avoir un ensemble de base de XIB et les recréer à chaque fois que les chaînes localisées changent. Plus d'informations ici: http://www.bdunagan.com/ 2009/03/15 / ibtool-localization-made-easy / .

Je pense que vous souhaitez en savoir plus sur l'outil de ligne de commande: ibtool. Cela devrait simplifier ce que vous cherchez à faire.

Vous pouvez localiser automatiquement vos nibs sans les dupliquer en suivant ce simple guide:

http://programminghacks.net/2011 / 06/03 / ios-nib-localisation-dans-localisable-chaînes /

Peut-être devriez-vous mettre à jour chaque chaîne manuellement. Supposons que vous disposiez d'un tableau ou d'un fichier XML de chaînes dans différentes langues, lorsque l'utilisateur change de langue, récupère simplement la chaîne traduite dans le tableau, puis la remplace par l'interface utilisateur.

Marco

Je définis toujours toutes les chaînes nécessaires dans la méthode viewDidLoad () avec uniquement des espaces réservés dans le fichier .xib. De cette façon, je peux facilement localiser n’importe quel fichier .xib avec la mise à jour des fichiers .string uniquement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top