[PATCH 2/2] winemac: Enable localization of strings used to build Mac menus.

Ken Thomases ken at codeweavers.com
Mon Nov 16 22:10:21 CST 2015


Signed-off-by: Ken Thomases <ken at codeweavers.com>
---
 configure.ac                    |  2 +-
 dlls/winemac.drv/cocoa_app.m    | 52 +++++++++++++++++++++++++++-----------
 dlls/winemac.drv/macdrv_cocoa.h |  4 +++
 dlls/winemac.drv/macdrv_main.c  | 55 +++++++++++++++++++++++++++++++++++++++++
 dlls/winemac.drv/macdrv_res.h   | 41 ++++++++++++++++++++++++++++++
 dlls/winemac.drv/winemac.rc     | 24 ++++++++++++++++++
 6 files changed, 163 insertions(+), 15 deletions(-)
 create mode 100644 dlls/winemac.drv/macdrv_res.h

diff --git a/configure.ac b/configure.ac
index 7d2449f..c2e0999 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3299,7 +3299,7 @@ WINE_CONFIG_LIB(winecrt0)
 WINE_CONFIG_DLL(wined3d,,[implib])
 WINE_CONFIG_DLL(winegstreamer)
 WINE_CONFIG_DLL(winejoystick.drv)
-WINE_CONFIG_DLL(winemac.drv)
+WINE_CONFIG_DLL(winemac.drv,,[po])
 WINE_CONFIG_DLL(winemapi)
 WINE_CONFIG_DLL(winemp3.acm)
 WINE_CONFIG_DLL(wineoss.drv)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index c0581b8..3a80f1d 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -32,6 +32,18 @@
 int macdrv_err_on;
 
 
+/***********************************************************************
+ *              WineLocalizedString
+ *
+ * Look up a localized string by its ID in the dictionary.
+ */
+static NSString* WineLocalizedString(unsigned int stringID)
+{
+    NSNumber* key = [NSNumber numberWithUnsignedInt:stringID];
+    return [(NSDictionary*)localized_strings objectForKey:key];
+}
+
+
 @implementation WineApplication
 
 @synthesize wineController;
@@ -215,46 +227,58 @@ - (void) transformProcessToForeground
             mainMenu = [[[NSMenu alloc] init] autorelease];
 
             // Application menu
-            submenu = [[[NSMenu alloc] initWithTitle:@"Wine"] autorelease];
+            submenu = [[[NSMenu alloc] initWithTitle:WineLocalizedString(STRING_MENU_WINE)] autorelease];
             bundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleNameKey];
 
             if ([bundleName length])
-                title = [NSString stringWithFormat:@"Hide %@", bundleName];
+                title = [NSString stringWithFormat:WineLocalizedString(STRING_MENU_ITEM_HIDE_APPNAME), bundleName];
             else
-                title = @"Hide";
+                title = WineLocalizedString(STRING_MENU_ITEM_HIDE);
             item = [submenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@""];
 
-            item = [submenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
+            item = [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_HIDE_OTHERS)
+                                      action:@selector(hideOtherApplications:)
+                               keyEquivalent:@"h"];
             [item setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
 
-            item = [submenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
+            item = [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_SHOW_ALL)
+                                      action:@selector(unhideAllApplications:)
+                               keyEquivalent:@""];
 
             [submenu addItem:[NSMenuItem separatorItem]];
 
             if ([bundleName length])
-                title = [NSString stringWithFormat:@"Quit %@", bundleName];
+                title = [NSString stringWithFormat:WineLocalizedString(STRING_MENU_ITEM_QUIT_APPNAME), bundleName];
             else
-                title = @"Quit";
+                title = WineLocalizedString(STRING_MENU_ITEM_QUIT);
             item = [submenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
             [item setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
             item = [[[NSMenuItem alloc] init] autorelease];
-            [item setTitle:@"Wine"];
+            [item setTitle:WineLocalizedString(STRING_MENU_WINE)];
             [item setSubmenu:submenu];
             [mainMenu addItem:item];
 
             // Window menu
-            submenu = [[[NSMenu alloc] initWithTitle:@"Window"] autorelease];
-            [submenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""];
-            [submenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""];
+            submenu = [[[NSMenu alloc] initWithTitle:WineLocalizedString(STRING_MENU_WINDOW)] autorelease];
+            [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_MINIMIZE)
+                               action:@selector(performMiniaturize:)
+                        keyEquivalent:@""];
+            [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_ZOOM)
+                               action:@selector(performZoom:)
+                        keyEquivalent:@""];
             if ([NSWindow instancesRespondToSelector:@selector(toggleFullScreen:)])
             {
-                item = [submenu addItemWithTitle:@"Enter Full Screen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"];
+                item = [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_ENTER_FULL_SCREEN)
+                                          action:@selector(toggleFullScreen:)
+                                   keyEquivalent:@"f"];
                 [item setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask | NSControlKeyMask];
             }
             [submenu addItem:[NSMenuItem separatorItem]];
-            [submenu addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""];
+            [submenu addItemWithTitle:WineLocalizedString(STRING_MENU_ITEM_BRING_ALL_TO_FRONT)
+                               action:@selector(arrangeInFront:)
+                        keyEquivalent:@""];
             item = [[[NSMenuItem alloc] init] autorelease];
-            [item setTitle:@"Window"];
+            [item setTitle:WineLocalizedString(STRING_MENU_WINDOW)];
             [item setSubmenu:submenu];
             [mainMenu addItem:item];
 
diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h
index 2385097..5d607fc 100644
--- a/dlls/winemac.drv/macdrv_cocoa.h
+++ b/dlls/winemac.drv/macdrv_cocoa.h
@@ -99,6 +99,9 @@
 #endif
 
 
+#include "macdrv_res.h"
+
+
 /* Must match the values of Cocoa's NSDragOperation enum. */
 enum {
     DRAG_OP_NONE    = 0,
@@ -156,6 +159,7 @@
 extern int cursor_clipping_locks_windows DECLSPEC_HIDDEN;
 extern int use_precise_scrolling DECLSPEC_HIDDEN;
 extern int gl_surface_mode DECLSPEC_HIDDEN;
+extern CFDictionaryRef localized_strings DECLSPEC_HIDDEN;
 
 extern int macdrv_start_cocoa_app(unsigned long long tickcount) DECLSPEC_HIDDEN;
 extern void macdrv_window_rejected_focus(const struct macdrv_event *event) DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 62c70df..5af0f41 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -60,6 +60,8 @@ int use_precise_scrolling = TRUE;
 int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE;
 HMODULE macdrv_module = 0;
 
+CFDictionaryRef localized_strings;
+
 
 /**************************************************************************
  *              debugstr_cf
@@ -200,6 +202,58 @@ static void setup_options(void)
 
 
 /***********************************************************************
+ *              load_strings
+ */
+static void load_strings(HINSTANCE instance)
+{
+    static const unsigned int ids[] = {
+        STRING_MENU_WINE,
+        STRING_MENU_ITEM_HIDE_APPNAME,
+        STRING_MENU_ITEM_HIDE,
+        STRING_MENU_ITEM_HIDE_OTHERS,
+        STRING_MENU_ITEM_SHOW_ALL,
+        STRING_MENU_ITEM_QUIT_APPNAME,
+        STRING_MENU_ITEM_QUIT,
+
+        STRING_MENU_WINDOW,
+        STRING_MENU_ITEM_MINIMIZE,
+        STRING_MENU_ITEM_ZOOM,
+        STRING_MENU_ITEM_ENTER_FULL_SCREEN,
+        STRING_MENU_ITEM_BRING_ALL_TO_FRONT,
+    };
+    CFMutableDictionaryRef dict;
+    int i;
+
+    dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks,
+                                     &kCFTypeDictionaryValueCallBacks);
+    if (!dict)
+    {
+        ERR("Failed to create localized strings dictionary\n");
+        return;
+    }
+
+    for (i = 0; i < sizeof(ids) / sizeof(ids[0]); i++)
+    {
+        LPCWSTR str;
+        int len = LoadStringW(instance, ids[i], (LPWSTR)&str, 0);
+        if (str && len)
+        {
+            CFNumberRef key = CFNumberCreate(NULL, kCFNumberIntType, &ids[i]);
+            CFStringRef value = CFStringCreateWithCharacters(NULL, (UniChar*)str, len);
+            if (key && value)
+                CFDictionarySetValue(dict, key, value);
+            else
+                ERR("Failed to add string ID 0x%04x %s\n", ids[i], debugstr_wn(str, len));
+        }
+        else
+            ERR("Failed to load string ID 0x%04x\n", ids[i]);
+    }
+
+    localized_strings = dict;
+}
+
+
+/***********************************************************************
  *              process_attach
  */
 static BOOL process_attach(void)
@@ -212,6 +266,7 @@ static BOOL process_attach(void)
         return FALSE;
 
     setup_options();
+    load_strings(macdrv_module);
 
     if ((thread_data_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) return FALSE;
 
diff --git a/dlls/winemac.drv/macdrv_res.h b/dlls/winemac.drv/macdrv_res.h
new file mode 100644
index 0000000..865d70e
--- /dev/null
+++ b/dlls/winemac.drv/macdrv_res.h
@@ -0,0 +1,41 @@
+/*
+ * Resource ID constants for Mac driver
+ *
+ * Copyright (c) 2013 Ken Thomases for CodeWeavers Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_MACDRV_RES_H
+#define __WINE_MACDRV_RES_H
+
+
+/* Strings */
+#define STRING_MENU_WINE                        0x100
+#define STRING_MENU_ITEM_HIDE_APPNAME           0x101
+#define STRING_MENU_ITEM_HIDE                   0x102
+#define STRING_MENU_ITEM_HIDE_OTHERS            0x103
+#define STRING_MENU_ITEM_SHOW_ALL               0x104
+#define STRING_MENU_ITEM_QUIT_APPNAME           0x105
+#define STRING_MENU_ITEM_QUIT                   0x106
+
+#define STRING_MENU_WINDOW                      0x110
+#define STRING_MENU_ITEM_MINIMIZE               0x111
+#define STRING_MENU_ITEM_ZOOM                   0x112
+#define STRING_MENU_ITEM_ENTER_FULL_SCREEN      0x113
+#define STRING_MENU_ITEM_BRING_ALL_TO_FRONT     0x114
+
+
+#endif
diff --git a/dlls/winemac.drv/winemac.rc b/dlls/winemac.drv/winemac.rc
index b563414..863551e 100644
--- a/dlls/winemac.drv/winemac.rc
+++ b/dlls/winemac.drv/winemac.rc
@@ -19,6 +19,30 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <winnt.h>
+#include "macdrv_res.h"
+
+#pragma makedep po
+
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+    STRING_MENU_WINE                        "Wine"
+    STRING_MENU_ITEM_HIDE_APPNAME           "Hide %@"
+    STRING_MENU_ITEM_HIDE                   "Hide"
+    STRING_MENU_ITEM_HIDE_OTHERS            "Hide Others"
+    STRING_MENU_ITEM_SHOW_ALL               "Show All"
+    STRING_MENU_ITEM_QUIT_APPNAME           "Quit %@"
+    STRING_MENU_ITEM_QUIT                   "Quit"
+
+    STRING_MENU_WINDOW                      "Window"
+    STRING_MENU_ITEM_MINIMIZE               "Minimize"
+    STRING_MENU_ITEM_ZOOM                   "Zoom"
+    STRING_MENU_ITEM_ENTER_FULL_SCREEN      "Enter Full Screen"
+    STRING_MENU_ITEM_BRING_ALL_TO_FRONT     "Bring All to Front"
+}
+
 #define WINE_FILEDESCRIPTION_STR "Wine Mac driver"
 #define WINE_FILENAME_STR "winemac.drv"
 
-- 
2.6.0




More information about the wine-patches mailing list