Localization facile d'interface
L'idée peut paraà®tre méchante, mais il y une façon de localizer facilement une interface.
Je suis actuellement confronté au problème pour mes préférences, et j'ai, au final, opté pour cette méthode :
Je me suis dit que ça pourrait servir à quelques-uns d'entre nous.
Il ne reste pas moins nécessaire de localizer le XIB afin de prévoir d'éventuels changement côté layout du fait que la longueur des textes peuvent changer facilement selon les langues.
Je suis actuellement confronté au problème pour mes préférences, et j'ai, au final, opté pour cette méthode :
<br /><br />.h:<br />extern void localizeWindow(NSWindow *window);<br />extern void localizeView(NSView *view);<br />extern void localizeMenu(NSMenu *menu);<br /><br />.m:<br />static NSString *localizeString (NSString *string)<br />{<br /> if (string == nil || [string length] == 0)<br /> return string;<br /> if ([[NSCharacterSet decimalDigitCharacterSet]<br />characterIsMember:[string characterAtIndex:0]])<br /> return string;<br /> return NSLocalizedString (string, @"");<br />}<br /><br />static void localizeCell(NSCell *view)<br />{<br /> if ([view respondsToSelector:@selector(title)] && [view<br />respondsToSelector:@selector(setTitle:)])<br /> [(NSButtonCell *)view setTitle:NSLocalizedString([view title],<br />@"Cell title")];<br /> if ([view respondsToSelector:@selector(stringValue)] && [view<br />respondsToSelector:@selector(setStringValue:)])<br /> [view setStringValue:NSLocalizedString([view stringValue],<br />@"View stringValue")];<br />}<br /><br />static void localizeMatrix(NSMatrix *view)<br />{<br /> NSEnumerator *cellEnum = [[view cells] objectEnumerator];<br /> NSCell *cell;<br /><br /> while ((cell = [cellEnum nextObject]))<br /> localizeCell(cell);<br />}<br /><br />void localizeWindow(NSWindow *window)<br />{<br /> [window setTitle:NSLocalizedString([window title], @"Window<br />title")];<br /> [window setMiniwindowTitle:NSLocalizedString([window<br />miniwindowTitle], @"Window title")];<br /> localizeView([window contentView]);<br />}<br /><br />void localizeView(NSView *view)<br />{<br /> NSEnumerator *subviewEnum = [[view subviews] objectEnumerator];<br /> NSView *subview;<br /><br /> while ((subview = [subviewEnum nextObject]))<br /> localizeView(subview);<br /><br /> if ([view toolTip])<br /> [view setToolTip:localizeString([view toolTip])];<br /><br /> if ([view isKindOfClass:[NSMatrix class]])<br /> localizeMatrix((NSMatrix *) view);<br /> else if ([view isKindOfClass:[NSPopUpButton class]])<br /> localizeMenu((NSMenu *) view);<br /> else if (![view isKindOfClass:[NSImageCell class]] && ![view<br />isKindOfClass:[NSImageView class]])<br /> {<br /> if ([view respondsToSelector:@selector(title)] && [view<br />respondsToSelector:@selector(setTitle:)])<br /> [(NSBox *)view setTitle:localizeString([(NSBox *)view<br />title])];<br /> if ([view respondsToSelector:@selector(stringValue)] && [view<br />respondsToSelector:@selector(setStringValue:)])<br /> [(NSTextField *)view<br />setStringValue:localizeString([(NSTextField *)view stringValue])];<br /> }<br />}<br /><br />void localizeMenu(NSMenu *menu)<br />{<br /> NSEnumerator *itemEnum = [[menu itemArray] objectEnumerator];<br /> NSMenuItem *item;<br /><br /> [menu setTitle:localizeString([menu title])];<br /> while ((item = [itemEnum nextObject]))<br /> {<br /> [item setTitle:localizeString([item title])];<br /> localizeMenu([item submenu]);<br /> }<br />}<br />
Je me suis dit que ça pourrait servir à quelques-uns d'entre nous.
Il ne reste pas moins nécessaire de localizer le XIB afin de prévoir d'éventuels changement côté layout du fait que la longueur des textes peuvent changer facilement selon les langues.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Merci,
Il me semble que tu as oublier les NSBox qui ont une méthode spécifique pour le titre (si je me rappelle bien).
Il y aussi la présentation faites a CocoaHeads voir ici pour le slide.
C'est déjà dedans
Ceci-dit, le code ne vient pas de moi (je préfère préciser).
J'ai retranscris le code en Objective-C pour le nom des méthodes
Concernant l'utilisation, y'a rien de plus simple.
Et concernant les performances.. de mon côté je n'ai rien à reproché au code.