From 4e9cd6ff3eabdf1ca4c1496a4c1ef8aeb1183eb3 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 29 Aug 2019 16:36:09 -0400 Subject: [PATCH] win32: set menubar language to same as config --- frontend/drivers/platform_win32.c | 132 +++++++++++++++++------------- frontend/drivers/platform_win32.h | 30 +++++++ gfx/common/win32_common.h | 1 + ui/drivers/ui_win32.c | 6 ++ 4 files changed, 113 insertions(+), 56 deletions(-) create mode 100644 frontend/drivers/platform_win32.h diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index a67126beb2..51ba6e0efe 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -49,6 +49,8 @@ #include "../../verbosity.h" #include "../../ui/drivers/ui_win32.h" #include "../../paths.h" +#include "platform_win32.h" + #ifndef SM_SERVERR2 #define SM_SERVERR2 89 #endif @@ -71,6 +73,79 @@ static bool dwm_composition_disabled; static bool console_needs_free; +#if defined(HAVE_LANGEXTRA) && !defined(_XBOX) +#if (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500) || !defined(_MSC_VER) +struct win32_lang_pair +{ + unsigned short lang_ident; + enum retro_language lang; +}; + +/* https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings */ +const struct win32_lang_pair win32_lang_pairs[] = +{ + /* array order MUST be kept, always largest ID first */ + {0x7c04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* neutral */ + {0x1404, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* MO */ + {0x1004, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* SG */ + {0xC04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* HK/PRC */ + {0x816, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, + {0x416, RETRO_LANGUAGE_PORTUGUESE_BRAZIL}, + {0x2a, RETRO_LANGUAGE_VIETNAMESE}, + {0x19, RETRO_LANGUAGE_RUSSIAN}, + {0x16, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, + {0x15, RETRO_LANGUAGE_POLISH}, + {0x13, RETRO_LANGUAGE_DUTCH}, + {0x12, RETRO_LANGUAGE_KOREAN}, + {0x11, RETRO_LANGUAGE_JAPANESE}, + {0x10, RETRO_LANGUAGE_ITALIAN}, + {0xc, RETRO_LANGUAGE_FRENCH}, + {0xa, RETRO_LANGUAGE_SPANISH}, + {0x9, RETRO_LANGUAGE_ENGLISH}, + {0x8, RETRO_LANGUAGE_GREEK}, + {0x7, RETRO_LANGUAGE_GERMAN}, + {0x4, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* neutral */ + {0x1, RETRO_LANGUAGE_ARABIC}, + /* MS does not support Esperanto */ + /*{0x0, RETRO_LANGUAGE_ESPERANTO},*/ +}; + +unsigned short win32_get_langid_from_retro_lang(enum retro_language lang) +{ + unsigned i; + + for (i = 0; i < sizeof(win32_lang_pairs) / sizeof(win32_lang_pairs[0]); i++) + { + if (win32_lang_pairs[i].lang == lang) + return win32_lang_pairs[i].lang_ident; + } + + return 0x409; /* fallback to US English */ +} + +enum retro_language win32_get_retro_lang_from_langid(unsigned short langid) +{ + unsigned i; + + for (i = 0; i < sizeof(win32_lang_pairs) / sizeof(win32_lang_pairs[0]); i++) + { + if (win32_lang_pairs[i].lang_ident > 0x3ff) + { + if (langid == win32_lang_pairs[i].lang_ident) + return win32_lang_pairs[i].lang; + } + else + { + if ((langid & 0x3ff) == win32_lang_pairs[i].lang_ident) + return win32_lang_pairs[i].lang; + } + } + + return RETRO_LANGUAGE_ENGLISH; +} +#endif +#endif + static void gfx_dwm_shutdown(void) { #ifdef HAVE_DYNAMIC @@ -591,62 +666,7 @@ enum retro_language frontend_win32_get_user_language(void) #if defined(HAVE_LANGEXTRA) && !defined(_XBOX) #if (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500) || !defined(_MSC_VER) LANGID langid = GetUserDefaultUILanguage(); - unsigned i; - - struct lang_pair - { - unsigned short lang_ident; - enum retro_language lang; - }; - - /* https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings */ - const struct lang_pair pairs[] = - { - /* array order MUST be kept, always largest ID first */ - {0x7c04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* neutral */ - {0x1404, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* MO */ - {0x1004, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* SG */ - {0xC04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* HK/PRC */ - {0x816, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, - {0x416, RETRO_LANGUAGE_PORTUGUESE_BRAZIL}, - {0x2a, RETRO_LANGUAGE_VIETNAMESE}, - {0x19, RETRO_LANGUAGE_RUSSIAN}, - {0x16, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, - {0x15, RETRO_LANGUAGE_POLISH}, - {0x13, RETRO_LANGUAGE_DUTCH}, - {0x12, RETRO_LANGUAGE_KOREAN}, - {0x11, RETRO_LANGUAGE_JAPANESE}, - {0x10, RETRO_LANGUAGE_ITALIAN}, - {0xc, RETRO_LANGUAGE_FRENCH}, - {0xa, RETRO_LANGUAGE_SPANISH}, - {0x9, RETRO_LANGUAGE_ENGLISH}, - {0x8, RETRO_LANGUAGE_GREEK}, - {0x7, RETRO_LANGUAGE_GERMAN}, - {0x4, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* neutral */ - {0x1, RETRO_LANGUAGE_ARABIC}, - /* MS does not support Esperanto */ - /*{0x0, RETRO_LANGUAGE_ESPERANTO},*/ - }; - - for (i = 0; i < sizeof(pairs) / sizeof(pairs[0]); i++) - { - if (pairs[i].lang_ident > 0x3ff) - { - if (langid == pairs[i].lang_ident) - { - lang = pairs[i].lang; - break; - } - } - else - { - if ((langid & 0x3ff) == pairs[i].lang_ident) - { - lang = pairs[i].lang; - break; - } - } - } + lang = win32_get_retro_lang_from_langid(langid); #endif #endif return lang; diff --git a/frontend/drivers/platform_win32.h b/frontend/drivers/platform_win32.h new file mode 100644 index 0000000000..de8de6c321 --- /dev/null +++ b/frontend/drivers/platform_win32.h @@ -0,0 +1,30 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2012-2015 - Michael Lelli + * Copyright (C) 2016-2019 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef _PLATFORM_WIN32_H +#define _PLATFORM_WIN32_H + +#if defined(HAVE_LANGEXTRA) && !defined(_XBOX) +#if (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500) || !defined(_MSC_VER) +unsigned short win32_get_langid_from_retro_lang(enum retro_language lang); + +enum retro_language win32_get_retro_lang_from_langid(unsigned short langid); +#endif +#endif + +#endif diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index 3c5527d1a7..7404d255df 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - Brad Parker * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 4d23a98f7a..7beff451ba 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2015-2017 - Ali Bouhlel * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - Brad Parker * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- @@ -49,6 +50,7 @@ #include "../../paths.h" #include "../../retroarch.h" #include "../../tasks/tasks_internal.h" +#include "../../frontend/drivers/platform_win32.h" #include "ui_win32.h" @@ -61,6 +63,10 @@ typedef struct ui_companion_win32 bool win32_window_init(WNDCLASSEX *wndclass, bool fullscreen, const char *class_name) { +#if _WIN32_WINNT >= 0x0501 + /* Use the language set in the config for the menubar... also changes the console language. */ + SetThreadUILanguage(win32_get_langid_from_retro_lang(*msg_hash_get_uint(MSG_HASH_USER_LANGUAGE))); +#endif wndclass->cbSize = sizeof(WNDCLASSEX); wndclass->style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndclass->hInstance = GetModuleHandle(NULL);