diff options
| author | Manolo Gouy <Manolo> | 2013-01-25 16:28:49 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2013-01-25 16:28:49 +0000 |
| commit | 834c714f26ba4abfbf64a299dd75f3eb1088265f (patch) | |
| tree | bfee00646241b17320bcd9655314f6e998bfbb93 | |
| parent | e9c3075c2650737f4b8d48f32dcb1fa1bb0dc73c (diff) | |
Mac OS: added support for internationalization of the application menu.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9809 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | FL/mac.H | 1 | ||||
| -rw-r--r-- | documentation/src/osissues.dox | 27 | ||||
| -rw-r--r-- | src/Fl.cxx | 6 | ||||
| -rw-r--r-- | src/Fl_cocoa.mm | 24 |
4 files changed, 39 insertions, 19 deletions
@@ -186,6 +186,7 @@ extern void fl_open_display(); /** \defgroup group_macosx Mac OS X-specific symbols Mac OS X-specific symbols declared in <FL/x.H> or <FL/gl.h> + \sa \ref osissues_macos @{ */ /** @brief Register a function called for each file dropped onto an application icon. diff --git a/documentation/src/osissues.dox b/documentation/src/osissues.dox index e72398e7f..248e626bf 100644 --- a/documentation/src/osissues.dox +++ b/documentation/src/osissues.dox @@ -716,10 +716,6 @@ void fl_mac_set_about( Fl_Callback *cb, void *user_data, int shortcut) Attaches the callback \c cb to the "About myprog" item of the system application menu. \c cb will be called with NULL first argument and \c user_data second argument. -Fl_Mac_App_Menu class -\par -The Fl_Mac_App_Menu class allows to localize the application menu. - Fl_Sys_Menu_Bar class \par @@ -727,8 +723,8 @@ The Fl_Sys_Menu_Bar class allows to build menu bars that, on Mac OS X, are placed in the system menu bar (at top-left of display), and, on other platforms, at a user-chosen location of a user-chosen window. -\subsection osissues_quartz Drawing Things Using Quartz +\subsection osissues_quartz Drawing Things Using Quartz All code inside Fl_Widget::draw() is expected to call Quartz drawing functions. The Quartz coordinate system is flipped to match @@ -737,6 +733,27 @@ left corner of the enclosing Fl_Window. The global variable \c fl_gc (of type \c CGContextRef) is the appropriate Quartz 2D drawing environment. Include FL/x.H to declare the \c fl_gc variable. +\subsection osissues_localize Internationalization +All FLTK programs contain an application menu with, e.g., the About xxx, Hide xxx, and Quit xxx items. +This menu can be internationalized/localized by any of two means. +\li using the Fl_Mac_App_Menu class. +\li using the standard Mac OS X localization procedure. Create a language-specific .lproj directory +(e.g., <tt>German.lproj</tt>) in the Resources subdirectory of the application bundle. +Create therein a <tt>Localizable.strings</tt> file that translates all menu items to this language. +The German <tt>Localizable.strings</tt> file, for example, contains: +\verbatim +"About %@" = "Über %@"; +"Print Front Window"="Frontfenster drucken"; +"Services" = "Dienste"; +"Hide %@"="%@ ausblenden"; +"Hide Others"="Andere ausblenden"; +"Show All"="Alle einblenden"; +"Quit %@"="%@ beenden"; +\endverbatim +Set <tt>"Print Front Window" = "";</tt> therein so the application menu doesn't show a "Print Front Window" item. +To localize the application name itself, create a file <tt>InfoPlist.strings</tt> in each .lproj directory +and put <tt>CFBundleName = "localized name";</tt> in each such file. + Fl_Double_Window OS X double-buffers all windows automatically. On OS X, diff --git a/src/Fl.cxx b/src/Fl.cxx index f01ebe7c7..d6f98dc5e 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -74,13 +74,13 @@ extern double fl_mac_flush_and_wait(double time_to_wait, char in_idle); // Globals... // #if defined(__APPLE__) || defined(FL_DOXYGEN) -const char *Fl_Mac_App_Menu::about = "About "; +const char *Fl_Mac_App_Menu::about = "About %@"; const char *Fl_Mac_App_Menu::print = "Print Front Window"; const char *Fl_Mac_App_Menu::services = "Services"; -const char *Fl_Mac_App_Menu::hide = "Hide "; +const char *Fl_Mac_App_Menu::hide = "Hide %@"; const char *Fl_Mac_App_Menu::hide_others = "Hide Others"; const char *Fl_Mac_App_Menu::show = "Show All"; -const char *Fl_Mac_App_Menu::quit = "Quit "; +const char *Fl_Mac_App_Menu::quit = "Quit %@"; #endif // __APPLE__ #ifndef FL_DOXYGEN Fl_Widget *Fl::belowmouse_, diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 23b59b42d..8dfdd19fb 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3066,21 +3066,23 @@ static void createAppleMenu(void) NSMenu *mainmenu, *services = nil, *appleMenu; NSMenuItem *menuItem; NSString *title; - - NSString *nsappname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; + + SEL infodictSEL = (fl_mac_os_version >= 100200 ? @selector(localizedInfoDictionary) : @selector(infoDictionary)); + NSString *nsappname = [[[NSBundle mainBundle] performSelector:infodictSEL] objectForKey:@"CFBundleName"]; if (nsappname == nil) nsappname = [[NSProcessInfo processInfo] processName]; appleMenu = [[NSMenu alloc] initWithTitle:@""]; /* Add menu items */ - title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::about] stringByAppendingString:nsappname]; + title = [NSString stringWithFormat:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::about],nil), nsappname]; menuItem = [appleMenu addItemWithTitle:title action:@selector(showPanel) keyEquivalent:@""]; FLaboutItemTarget *about = [[FLaboutItemTarget alloc] init]; [menuItem setTarget:about]; [appleMenu addItem:[NSMenuItem separatorItem]]; // Print front window - if (strlen(Fl_Mac_App_Menu::print) > 0) { + title = NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::print], nil); + if ([title length] > 0) { menuItem = [appleMenu - addItemWithTitle:[NSString stringWithUTF8String:Fl_Mac_App_Menu::print] + addItemWithTitle:title action:@selector(printPanel) keyEquivalent:@""]; [menuItem setTarget:about]; @@ -3092,29 +3094,29 @@ static void createAppleMenu(void) // Services Menu services = [[NSMenu alloc] init]; menuItem = [appleMenu - addItemWithTitle:[NSString stringWithUTF8String:Fl_Mac_App_Menu::services] + addItemWithTitle:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::services], nil) action:nil keyEquivalent:@""]; [appleMenu setSubmenu:services forItem:menuItem]; [appleMenu addItem:[NSMenuItem separatorItem]]; // Hide AppName - title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::hide] stringByAppendingString:nsappname]; + title = [NSString stringWithFormat:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::hide],nil), nsappname]; [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; // Hide Others menuItem = [appleMenu - addItemWithTitle:[NSString stringWithUTF8String:Fl_Mac_App_Menu::hide_others] + addItemWithTitle:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::hide_others] , nil) action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; // Show All - [appleMenu addItemWithTitle:[NSString stringWithUTF8String:Fl_Mac_App_Menu::show] + [appleMenu addItemWithTitle:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::show] , nil) action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; // Quit AppName - title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::quit] - stringByAppendingString:nsappname]; + title = [NSString stringWithFormat:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::quit] , nil), + nsappname]; [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; |
