J'ai un storyboard iPhone avec quelques vues. Par exemple, un titre d'élément de navigation est nommé News
, qui doit être traduit pour d'autres langues.
Lorsque j'ajoute une nouvelle localisation à mon storyboard, cela crée un doublon de mon storyboard actuel pour la nouvelle langue. Ici, je peux changer le titre de l'élément de navigation, mais cela ne me semble pas très utile. Que faire si mon storyboard contient 100 vues et que je dois prendre en charge 10 langues? Si je dois changer quelque chose dans mon storyboard d'origine, je dois faire les mêmes changements pour toutes les langues. Cela semble très étrange. Dans quelles situations cela peut-il être utile?
Que puis-je faire à la place? Dois-je avoir uniquement le storyboard anglais et traduire manuellement chaque élément du ViewController en utilisant NSLocalizedString
?
Vous pouvez effectuer la localisation en modifiant les titres des éléments d'interface utilisateur dans le code:
self.title = NSLocalizedString("News", nil);
Si vous souhaitez localiser votre application en néerlandais par exemple, vous devriez avoir ceci dans Dutch.lproj/Localizable.strings
:
"News" = "Nieuws";
Vous pouvez ensuite le faire pour chaque élément et langue de l'interface utilisateur.
Dans iOS 6, il y a un paramètre Projet sous l'onglet Info qui dit "Utiliser l'internationalisation de base". Si vous cochez la case, toutes les chaînes seront extraites du Storyboard et stockées dans des fichiers .strings internationalisés.
De cette façon, vous n'avez pas besoin d'avoir plusieurs copies du Storyboard.
Depuis iOS 6, vous pouvez décider d'utiliser l'internationalisation de base: tous les fichiers de storyboard et xib/nib n'existent qu'une seule fois dans un dossier nommé Base.lproj. La localisation des éléments de l'interface graphique est placée dans des fichiers .strings associés dans chaque répertoire de localisation.
Par exemple, "MainStoryboard.storyboard" sera placé dans Base.lproj. Un fichier associé appelé "MainStoryboard.strings" est placé dans en.lproj et quelle que soit la localisation que vous appliquez.
C'est vraiment très beau, surtout en combinaison avec des contraintes de mise en page!
Vous pouvez trouver ce tutoriel vidéo ici utile:
http://www.youtube.com/watch?v=cF1Rf02QvZQ
L'approche consiste à avoir un storyboard distinct pour chaque langue à localiser, puis à laisser un script se charger de propager les modifications que vous apportez dans le storyboard d'origine pour toutes les autres langues.
Pour les applications avec une cible de déploiement d'iOS 5 et des storyboards, j'utilise quelque chose comme ça pour localiser mes onglets où mon premier ViewController sur un storyboard est un UITabBarController
:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// ...
if ([self.window.rootViewController isKindOfClass:UITabBarController.class]) {
UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;
// Localize tab items
NSArray *tabBarItems = tabBarController.tabBar.items;
[tabBarItems enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(UITabBarItem *item, NSUInteger tabIndex, BOOL *stop) {
NSString *keyName = [NSString stringWithFormat:@"tabBarItem%i", tabIndex];
item.title = NSLocalizedString(keyName, @"TabBarItems");
}];
} else {
// The root view controller is not the UITTabBarController
}
// ...
}
et avoir quelque chose comme ça dans mon Localizable.strings
des dossiers:
// MARK: TabBar
"tabBarItem0" = "My First Tab Label";
"tabBarItem1" = "My Second Tab Label";
"tabBarItem2" = "My Third Tab Label";
Vous pourriez également trouver la localisation polyglotte utile. Au lieu d'appeler NSLocalizedString () dans le code, vous pouvez spécifier directement la clé dans votre Storyboard. Vous pouvez éviter les sorties inutiles et réduire le code passe-partout.
Je vous suggère d'apprendre la ligne de commande ibtool qui vous aide à localiser tous vos storyboards :) Voici un tutoriel ici http://www.albertmata.net/articles/introduction-to-internationalization-using-storyboards- sur-ios-5.html