From e5520146346234737044fd8bbc4279e8c2d6eafb Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Thu, 4 Jun 2026 13:16:14 +0200 Subject: [PATCH 1/9] add Language Options Tab --- src/resource.h | 6 ++++++ src/resource.rc | 14 ++++++++++++++ src/windows/OptionsDialog.cpp | 33 +++++++++++++++++++++++++++++++++ vs/DiscordMessenger.vcxproj | 14 +++++++------- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/resource.h b/src/resource.h index 73be3312..9414a971 100644 --- a/src/resource.h +++ b/src/resource.h @@ -153,6 +153,7 @@ #define IDD_DIALOG_UPLOADING_ND 426 #define IDD_DIALOG_GUILD_CHOOSER_ND 427 #define IDD_DIALOG_PREFERENCES_ND 428 +#define IDD_DIALOG_LANGUAGE_ND 429 #define IDR_MAINMENU 501 #define IDR_MESSAGE_CONTEXT 502 #define IDR_GUILD_CONTEXT 503 @@ -337,6 +338,7 @@ #define IDS_CANT_LAUNCH_URL_UNS 775 #define IDS_CONFIRM_UNPIN 776 #define IDS_CONFIRM_UNPIN_TITLE 777 +#define IDS_LANGUAGE 778 #define IDC_OPTIONS_TABS 801 #define IDC_MY_ACCOUNT_BOX 802 #define IDC_MY_ACCOUNT_NAME 803 @@ -443,6 +445,10 @@ #define IDC_MINIMIZE_TO_NOTIF 904 #define IDC_HOW_GET_TOKEN 905 #define IDC_DOUBLE_BUFFERING 917 +#define IDC_LANGUAGE_LIST 918 +#define IDC_LANGUAGE_SYSTEM 919 +#define IDC_LANGUAGE_APPLY 920 +#define IDC_LANGUAGE_DEFAULTS 921 #define ID_FILE_PREFERENCES 1001 #define ID_FILE_STOPALLSPEECH 1002 #define ID_FILE_EXIT 1003 diff --git a/src/resource.rc b/src/resource.rc index cbcfa7b9..034e8429 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -913,6 +913,20 @@ BEGIN END +IDD_DIALOG_LANGUAGE_ND DIALOG 0, 0, 264, 240 +STYLE WS_CHILD | DS_CONTROL +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Language Options", IDC_MDISPLAY_BOX, 6, 7, 248, 150 + LTEXT "Choose the language you want Discord Messenger to display", IDC_STATIC, 12, 18, 236, 8 + LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 70, LBS_STANDARD | WS_VSCROLL | WS_TABSTOP + AUTOCHECKBOX "Detect and use my systems language by default", IDC_LANGUAGE_SYSTEM, 12, 94, 170, 10 + LTEXT "System Language: NOT_IMPLEMENTED", IDC_STATIC, 12, 106, 236, 8 + PUSHBUTTON "Apply Language", IDC_LANGUAGE_APPLY, 184, 120, 60, 14 + PUSHBUTTON "Revert to Defaults", IDC_LANGUAGE_DEFAULTS, 12, 120, 70, 14 + +END + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index 16556e2a..afede4c4 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -39,6 +39,7 @@ enum ePage PG_CHAT, PG_WINDOW, PG_CONNECTION, + PG_LANGUAGE, PG_PAGE_COUNT, PG_FIRST = PG_ACCOUNT_AND_PRIVACY }; @@ -290,6 +291,18 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) break; } + case PG_LANGUAGE: + { + //hardcoded for now. + HWND hList = GetDlgItem(hwndDlg, IDC_LANGUAGE_LIST); + + ListBox_AddString(hList, TEXT("English (US)")); + ListBox_AddString(hList, TEXT("Deutsch")); + ListBox_AddString(hList, TEXT("Espa\xf1ol")); + ListBox_AddString(hList, TEXT("Polski")); + ListBox_SetCurSel(hList, 1); + break; + } } } @@ -648,6 +661,23 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, } break; } + case PG_LANGUAGE: + { + switch (LOWORD(wParam)) { + + case IDC_LANGUAGE_APPLY: + { + MessageBox(hWnd, TEXT("TODO: add apply thing here"), TEXT("TODO for Jakkret"), MB_OK); + break; + } + + case IDC_LANGUAGE_DEFAULTS: + { + MessageBox(hWnd, TEXT("TODO: add functionality to the button.\n imagine it did something"), TEXT("title perhaps?"), MB_OK); + break; + } + } + } } return 0; @@ -743,6 +773,7 @@ HRESULT OnPreferenceDialogInit(HWND hWnd) AddTab(hwndTab, tie, PG_CHAT, (LPTSTR)TmGetTString(IDS_CHAT)); AddTab(hwndTab, tie, PG_WINDOW, (LPTSTR)TmGetTString(IDS_WINDOW)); AddTab(hwndTab, tie, PG_CONNECTION, (LPTSTR)TmGetTString(IDS_CONNECTION)); + AddTab(hwndTab, tie, PG_LANGUAGE, TEXT("Language")); // Lock the resources for the child dialog boxes. pHeader->apRes[PG_ACCOUNT_AND_PRIVACY] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_MY_ACCOUNT)); @@ -751,6 +782,8 @@ HRESULT OnPreferenceDialogInit(HWND hWnd) pHeader->apRes[ PG_CHAT ] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_CHATSETTINGS)); pHeader->apRes[ PG_WINDOW ] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_WINDOWSETTINGS)); pHeader->apRes[ PG_CONNECTION ] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_CONNECTION)); + pHeader->apRes[ PG_LANGUAGE ] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_LANGUAGE_ND)); + RECT rcTab; SetRectEmpty(&rcTab); diff --git a/vs/DiscordMessenger.vcxproj b/vs/DiscordMessenger.vcxproj index fb865249..e5aeb29f 100644 --- a/vs/DiscordMessenger.vcxproj +++ b/vs/DiscordMessenger.vcxproj @@ -80,7 +80,7 @@ Application true - v143 + v145 Unicode true @@ -101,38 +101,38 @@ Application true - v143 + v145 Unicode Application true - v143 + v145 Unicode Application true - v143 + v145 NotSet Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode Application false - v143 + v145 true NotSet From 37f9fa6500df0a53f0a523967658c0e88d30b044 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Thu, 4 Jun 2026 13:53:07 +0200 Subject: [PATCH 2/9] add pseudo functionality --- src/resource.h | 3 +++ src/resource.rc | 8 ++++++++ src/windows/OptionsDialog.cpp | 15 ++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/resource.h b/src/resource.h index 9414a971..661ba572 100644 --- a/src/resource.h +++ b/src/resource.h @@ -339,6 +339,9 @@ #define IDS_CONFIRM_UNPIN 776 #define IDS_CONFIRM_UNPIN_TITLE 777 #define IDS_LANGUAGE 778 +#define IDS_APPLY_LANG 779 +#define IDS_RESTART_REQUIRED 780 +#define IDS_LANG_DEFAULTS 781 #define IDC_OPTIONS_TABS 801 #define IDC_MY_ACCOUNT_BOX 802 #define IDC_MY_ACCOUNT_NAME 803 diff --git a/src/resource.rc b/src/resource.rc index 034e8429..518dc1f8 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -261,6 +261,7 @@ BEGIN END + ///////////////////////////////////////////////////////////////////////////// // // Icon @@ -1732,6 +1733,13 @@ BEGIN IDS_CONFIRM_UNPIN_TITLE "Discord Messenger - Unpin Message" END +STRINGTABLE +BEGIN + IDS_APPLY_LANG "In order to apply the language, you need to restart Discord Messenger.\nDo you wish to restart now?" + IDS_RESTART_REQUIRED "Restart Required - Discord Messenger" + IDS_LANG_DEFAULTS "Default Settings have been loaded. They will take affect after a restart." +END + #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index afede4c4..fec45d1f 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -293,7 +293,10 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) } case PG_LANGUAGE: { - //hardcoded for now. + // hardcoded for now. + + // TODO: Make a function that reads off available langs off resource file + // and adds them as listbox options HWND hList = GetDlgItem(hwndDlg, IDC_LANGUAGE_LIST); ListBox_AddString(hList, TEXT("English (US)")); @@ -667,13 +670,19 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, case IDC_LANGUAGE_APPLY: { - MessageBox(hWnd, TEXT("TODO: add apply thing here"), TEXT("TODO for Jakkret"), MB_OK); + MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION); break; } case IDC_LANGUAGE_DEFAULTS: { - MessageBox(hWnd, TEXT("TODO: add functionality to the button.\n imagine it did something"), TEXT("title perhaps?"), MB_OK); + MessageBox(hWnd, TmGetTString(IDS_LANG_DEFAULTS), TmGetTString(IDS_RESTART_REQUIRED), MB_OK); + break; + } + + case IDC_LANGUAGE_SYSTEM: + { + MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION); break; } } From 78c202d28ca639268225d3002513d6ea2dcbf348 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Thu, 4 Jun 2026 14:01:49 +0200 Subject: [PATCH 3/9] whoops, fixing small issues --- src/resource.rc | 1 + src/windows/OptionsDialog.cpp | 2 +- vs/DiscordMessenger.vcxproj | 14 +++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/resource.rc b/src/resource.rc index 518dc1f8..026ee53c 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -1738,6 +1738,7 @@ BEGIN IDS_APPLY_LANG "In order to apply the language, you need to restart Discord Messenger.\nDo you wish to restart now?" IDS_RESTART_REQUIRED "Restart Required - Discord Messenger" IDS_LANG_DEFAULTS "Default Settings have been loaded. They will take affect after a restart." + IDS_LANGUAGE "Language" END #endif // English (United States) resources diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index fec45d1f..021f9762 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -782,7 +782,7 @@ HRESULT OnPreferenceDialogInit(HWND hWnd) AddTab(hwndTab, tie, PG_CHAT, (LPTSTR)TmGetTString(IDS_CHAT)); AddTab(hwndTab, tie, PG_WINDOW, (LPTSTR)TmGetTString(IDS_WINDOW)); AddTab(hwndTab, tie, PG_CONNECTION, (LPTSTR)TmGetTString(IDS_CONNECTION)); - AddTab(hwndTab, tie, PG_LANGUAGE, TEXT("Language")); + AddTab(hwndTab, tie, PG_LANGUAGE, (LPTSTR)TmGetTString(IDS_LANGUAGE)); // Lock the resources for the child dialog boxes. pHeader->apRes[PG_ACCOUNT_AND_PRIVACY] = LockDialogResource(MAKEINTRESOURCE(IDD_DIALOG_MY_ACCOUNT)); diff --git a/vs/DiscordMessenger.vcxproj b/vs/DiscordMessenger.vcxproj index e5aeb29f..fb865249 100644 --- a/vs/DiscordMessenger.vcxproj +++ b/vs/DiscordMessenger.vcxproj @@ -80,7 +80,7 @@ Application true - v145 + v143 Unicode true @@ -101,38 +101,38 @@ Application true - v145 + v143 Unicode Application true - v145 + v143 Unicode Application true - v145 + v143 NotSet Application true - v145 + v143 Unicode Application false - v145 + v143 true Unicode Application false - v145 + v143 true NotSet From fd1baf0cbb1f6585426847f0de103b337f4ef5ce Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Thu, 4 Jun 2026 14:18:21 +0200 Subject: [PATCH 4/9] final cosmetic fix. --- src/resource.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resource.rc b/src/resource.rc index 026ee53c..b6d0684f 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -918,7 +918,7 @@ IDD_DIALOG_LANGUAGE_ND DIALOG 0, 0, 264, 240 STYLE WS_CHILD | DS_CONTROL FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Language Options", IDC_MDISPLAY_BOX, 6, 7, 248, 150 + GROUPBOX "Language Options", IDC_MDISPLAY_BOX, 6, 7, 248, 132 // fix this thing LTEXT "Choose the language you want Discord Messenger to display", IDC_STATIC, 12, 18, 236, 8 LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 70, LBS_STANDARD | WS_VSCROLL | WS_TABSTOP AUTOCHECKBOX "Detect and use my systems language by default", IDC_LANGUAGE_SYSTEM, 12, 94, 170, 10 From 629d02e9ed96158e43193cdeac9408ad02c95803 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Fri, 5 Jun 2026 14:58:37 +0200 Subject: [PATCH 5/9] Add Multilanguage support --- src/core/config/LocalSettings.cpp | 4 + src/core/config/LocalSettings.hpp | 3 + src/resource.h | 3 + src/resource.rc | 137 ++++++++++++++++++++++++++++-- src/windows/InstanceMutex.hpp | 1 + src/windows/Main.cpp | 29 +++++++ src/windows/Main.hpp | 1 + src/windows/OptionsDialog.cpp | 66 ++++++++++++-- 8 files changed, 234 insertions(+), 10 deletions(-) diff --git a/src/core/config/LocalSettings.cpp b/src/core/config/LocalSettings.cpp index 095d6885..812ba704 100644 --- a/src/core/config/LocalSettings.cpp +++ b/src/core/config/LocalSettings.cpp @@ -163,6 +163,9 @@ bool LocalSettings::Load() if (j.contains("AddExtraHeaders")) m_bAddExtraHeaders = j["AddExtraHeaders"]; + + if (j.contains("Language")) + m_language = j["Language"]; return true; } @@ -203,6 +206,7 @@ bool LocalSettings::Save() j["Use12HourTime"] = m_bUse12HourTime; j["ShowBlockedMessages"] = m_bShowBlockedMessages; j["UseDoubleBuffering"] = m_bUseDoubleBuffering; + j["Language"] = m_language; if (m_bSaveWindowSize) { j["WindowWidth"] = m_width; diff --git a/src/core/config/LocalSettings.hpp b/src/core/config/LocalSettings.hpp index cd4364ea..df558ae8 100644 --- a/src/core/config/LocalSettings.hpp +++ b/src/core/config/LocalSettings.hpp @@ -226,6 +226,8 @@ class LocalSettings void SetUseDoubleBuffering(bool b) { m_bUseDoubleBuffering = b; } + int GetLanguage() const { return m_language; } + void SetLanguage(int lang) { m_language = lang; } private: std::string m_token; @@ -262,6 +264,7 @@ class LocalSettings int m_width = 1000; int m_height = 700; int m_userScale = 1000; + int m_language = 0; }; LocalSettings* GetLocalSettings(); diff --git a/src/resource.h b/src/resource.h index 661ba572..7f0c34ea 100644 --- a/src/resource.h +++ b/src/resource.h @@ -342,6 +342,7 @@ #define IDS_APPLY_LANG 779 #define IDS_RESTART_REQUIRED 780 #define IDS_LANG_DEFAULTS 781 +#define IDS_SYSTEM_LANGUAGE 782 #define IDC_OPTIONS_TABS 801 #define IDC_MY_ACCOUNT_BOX 802 #define IDC_MY_ACCOUNT_NAME 803 @@ -452,6 +453,8 @@ #define IDC_LANGUAGE_SYSTEM 919 #define IDC_LANGUAGE_APPLY 920 #define IDC_LANGUAGE_DEFAULTS 921 +#define IDC_PENDING_RESTART 922 +#define IDC_PENDING_RESTART_TEXT 923 #define ID_FILE_PREFERENCES 1001 #define ID_FILE_STOPALLSPEECH 1002 #define ID_FILE_EXIT 1003 diff --git a/src/resource.rc b/src/resource.rc index b6d0684f..be601b55 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -918,14 +918,17 @@ IDD_DIALOG_LANGUAGE_ND DIALOG 0, 0, 264, 240 STYLE WS_CHILD | DS_CONTROL FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Language Options", IDC_MDISPLAY_BOX, 6, 7, 248, 132 // fix this thing + GROUPBOX "Language Options", IDC_MDISPLAY_BOX, 6, 7, 248, 132 LTEXT "Choose the language you want Discord Messenger to display", IDC_STATIC, 12, 18, 236, 8 - LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 70, LBS_STANDARD | WS_VSCROLL | WS_TABSTOP - AUTOCHECKBOX "Detect and use my systems language by default", IDC_LANGUAGE_SYSTEM, 12, 94, 170, 10 - LTEXT "System Language: NOT_IMPLEMENTED", IDC_STATIC, 12, 106, 236, 8 - PUSHBUTTON "Apply Language", IDC_LANGUAGE_APPLY, 184, 120, 60, 14 + LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 60, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + AUTOCHECKBOX "Detect and use my systems language by default", IDC_LANGUAGE_SYSTEM, 12, 93, 170, 10 + LTEXT "System Language: ", IDS_SYSTEM_LANGUAGE, 12, 106, 236, 8 + PUSHBUTTON "Apply Language", IDC_LANGUAGE_APPLY, 180, 120, 70, 14 PUSHBUTTON "Revert to Defaults", IDC_LANGUAGE_DEFAULTS, 12, 120, 70, 14 + ICON IDI_WARNING_IC,IDC_PENDING_RESTART,12,225,136,20,SS_REALSIZEIMAGE + LTEXT "Pending Restart. Some changes will not take effect until after a restart.", IDC_PENDING_RESTART_TEXT, 28, 226, 236, 8 + END ///////////////////////////////////////////////////////////////////////////// @@ -1739,12 +1742,133 @@ BEGIN IDS_RESTART_REQUIRED "Restart Required - Discord Messenger" IDS_LANG_DEFAULTS "Default Settings have been loaded. They will take affect after a restart." IDS_LANGUAGE "Language" + IDS_SYSTEM_LANGUAGE "System Language: %s" END #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// Polish resources + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT +#pragma code_page(1250) + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MAINMENU MENU +BEGIN + POPUP "&Plik" + BEGIN + MENUITEM "&Preferencje", ID_FILE_PREFERENCES + MENUITEM SEPARATOR + MENUITEM "&Ponowne po\xb3\xB9czenie z Discord", ID_FILE_RECONNECTTODISCORD + MENUITEM "&Zatrzymaj TTS", ID_FILE_STOPALLSPEECH + MENUITEM SEPARATOR + MENUITEM "&Wyjd\x9F", ID_FILE_EXIT + END + POPUP "&Serwer" + BEGIN + MENUITEM "&Zapro\x9C ludzi", IDM_INVITEPEOPLE, GRAYED + MENUITEM SEPARATOR + POPUP "&Ustawienia powiadomie\xF1", GRAYED + BEGIN + MENUITEM "Wszystkie wiadomo\x9Cci", IDM_NOTIFYALL, GRAYED + MENUITEM "Tylko @wzmianki", IDM_NOTIFYMENTS, GRAYED + MENUITEM "Brak powiadomie\xF1", IDM_NOTIFYNONE, GRAYED + MENUITEM SEPARATOR + MENUITEM "Wycisz @everyone i @here", IDM_NOTIFYSUPPRGLOB, GRAYED + MENUITEM "Wycisz wszystkie @role", IDM_NOTIFYSUPPRROLE, GRAYED + END + MENUITEM "&Ustawienia serwera", IDM_GUILDSETTINGS, GRAYED + MENUITEM "&Ustawienia prywatno\x9cci", IDM_PRIVACYSETTINGS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Zmie\xF1 pseudonim", IDM_EDITNICKNAME, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Opu\x9C\xE6 serwer", IDM_LEAVEGUILD + END + POPUP "&Akcje" + BEGIN + MENUITEM "&Szukaj...\tCtrl+F", ID_ACTIONS_SEARCH, GRAYED + MENUITEM "Szybkie prze\xB3\xB9czanie...\tCtrl+K", ID_ACTIONS_QUICKSWITCHER + MENUITEM SEPARATOR + MENUITEM "Nowa &grupowa DM...", ID_ACTIONS_NEWGROUPDM, GRAYED + MENUITEM "Dodaj &znajomego...", ID_ACTIONS_ADDFRIEND, GRAYED + END + POPUP "&Konto" + BEGIN + POPUP "&Status" + BEGIN + MENUITEM "Online", ID_ONLINESTATUSPLACEHOLDER_ONLINE, CHECKED + MENUITEM SEPARATOR + MENUITEM "Nieaktywny", ID_ONLINESTATUSPLACEHOLDER_IDLE + MENUITEM "Nie przeszkadza\xE6", ID_ONLINESTATUSPLACEHOLDER_DONOTDISTURB + MENUITEM "Niewidoczny", ID_ONLINESTATUSPLACEHOLDER_INVISIBLE + END + MENUITEM "Ustaw &w\xB3asny status", ID_ACCOUNT_SETCUSTOMSTATUS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Wy\xB3\xB9cz wyciszenie", ID_ACCOUNT_UNMUTE, GRAYED + MENUITEM "&Og\xB3uchnij", ID_ACCOUNT_DEAFEN, GRAYED + MENUITEM SEPARATOR + MENUITEM "Ustawienia &u\xBFytkownika", ID_ACCOUNT_USERSETTINGS, GRAYED + END + POPUP "&Pomoc" + BEGIN + MENUITEM "&Tematy pomocy...", ID_HELP_HELPTOPICS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&O Discord Messenger...", ID_HELP_ABOUTDISCORDMESSENGER + END +END + +IDD_DIALOG_LANGUAGE_ND DIALOG 0, 0, 264, 240 +STYLE WS_CHILD | DS_CONTROL +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Opcje J\xEAzyka", IDC_MDISPLAY_BOX, 6, 7, 248, 132 + LTEXT "Wybierz j\xEAzyk wy\x9Cwietlania Discord Messenger", IDC_STATIC, 12, 18, 236, 8 + LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 60, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + AUTOCHECKBOX "Wykryj i u\xBFyj domy\x9Clnie j\xEAzyk systemu", IDC_LANGUAGE_SYSTEM, 12, 93, 170, 10 + LTEXT "J\xEAzyk systemu: ", IDS_SYSTEM_LANGUAGE, 12, 106, 236, 8 + PUSHBUTTON "Zastosuj j\xEAzyk", IDC_LANGUAGE_APPLY, 180, 120, 70, 14 + PUSHBUTTON "Przywr\xF3\xE6 domy\x9Clne", IDC_LANGUAGE_DEFAULTS, 12, 120, 70, 14 + + ICON IDI_WARNING_IC,IDC_PENDING_RESTART,12,225,136,20,SS_REALSIZEIMAGE + LTEXT "Zmiany zostan\xB9 wprowadzone po ponownym uruchomieniu aplikacji", IDC_PENDING_RESTART_TEXT, 28, 226, 236, 8 + +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +//t + +STRINGTABLE +BEGIN + IDS_PROGRAM_NAME "Discord Messenger" + IDS_CHAT "Czat" + IDS_WINDOW "Okno" + IDS_NOTIFICATIONS "Wiadomo\x9Cci" + IDS_CONNECTION "Po\xB3\xB9czenie" + IDS_APPEARANCE "Wygl\xB9d" + IDS_ACCOUNT_PRIVACY "Konto i prywatno\x9C\xE6" +END + +STRINGTABLE +BEGIN + IDS_APPLY_LANG "Aby zastosowa\xE6 j\xEAzyk, musisz zrestartowa\xE6 Discord Messenger.\nCzy chcesz zrestartowa\xE6 teraz?" + IDS_RESTART_REQUIRED "wymagane uruchomienie ponowne - Discord Messenger" + IDS_LANG_DEFAULTS "Domy\x9Clne ustawienia zosta\xB3y za\xB3adowane. Zmiany b\xEAd\xB9 obowi\xB9zywa\xE6 po uruchomieniu ponownym." + IDS_LANGUAGE "J\xEAzyk" + IDS_SYSTEM_LANGUAGE "j\xEAzyk systemu: %s" +END + +///////////////////////////////////////////////////////////////////////////// +// End Polish resources + #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// @@ -1756,3 +1880,6 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED + + + diff --git a/src/windows/InstanceMutex.hpp b/src/windows/InstanceMutex.hpp index 3e7e5fb4..bb88e468 100644 --- a/src/windows/InstanceMutex.hpp +++ b/src/windows/InstanceMutex.hpp @@ -12,4 +12,5 @@ class InstanceMutex public: HRESULT Init(); ~InstanceMutex(); + void Release() { Close(); } }; diff --git a/src/windows/Main.cpp b/src/windows/Main.cpp index 519c0da5..0740f78f 100644 --- a/src/windows/Main.cpp +++ b/src/windows/Main.cpp @@ -1921,6 +1921,31 @@ static bool ForceSingleInstance(LPCTSTR pClassName) return false; } +// Restarts the instance - for languages to apply +void RestartInstance() +{ + g_instanceMutex.Release(); // Close(); + + TCHAR szPath[MAX_PATH]; + GetModuleFileName(NULL, szPath, MAX_PATH); + + STARTUPINFO si = { 0 }; + si.cb = sizeof(si); + PROCESS_INFORMATION pi = { 0 }; + + if (!CreateProcess(szPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + + g_instanceMutex.Init(); + return; + } + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + ExitProcess(0); + +} + // Blackwingcat's Extended Kernel workaround: Apparently, the custom user32.dll it uses tries // to write to the class name, which previously was part of .rodata, which is of course read-only. TCHAR g_className[64]; @@ -1966,6 +1991,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLin // Load the settings, and fix up some settings that are // actually bad to leave on on NT 3.x or NT 4 pSettings->Load(); + + + SetThreadUILanguage((LANGID)pSettings->GetLanguage()); // for anyone using the new versions. + SetThreadLocale(MAKELCID((LANGID)pSettings->GetLanguage(), SORT_DEFAULT)); // older versions if (LOBYTE(version) < 5 && pSettings->GetMessageStyle() == MS_GRADIENT) { diff --git a/src/windows/Main.hpp b/src/windows/Main.hpp index 11f2e6ea..8314ba8d 100644 --- a/src/windows/Main.hpp +++ b/src/windows/Main.hpp @@ -155,3 +155,4 @@ void SetHeartbeatInterval(int timeMs); int GetProfilePictureSize(); HBITMAP GetDefaultBitmap(); bool ShouldBlockDoubleBuffering(); +void RestartInstance(); diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index 021f9762..5e39a980 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -9,6 +9,8 @@ #endif #include +static bool g_bPendingRestart = false; + const eMessageStyle g_indexToMessageStyle[] = { MS_3DFACE, MS_GRADIENT, @@ -293,10 +295,17 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) } case PG_LANGUAGE: { - // hardcoded for now. + if (g_bPendingRestart) { + ShowWindow(GetDlgItem(hwndDlg, IDC_PENDING_RESTART), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_PENDING_RESTART_TEXT), SW_SHOW); + } + else { + ShowWindow(GetDlgItem(hwndDlg, IDC_PENDING_RESTART), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PENDING_RESTART_TEXT), SW_HIDE); + } - // TODO: Make a function that reads off available langs off resource file - // and adds them as listbox options + // TODO: Make a function that reads off available languages + // off resource file and adds them as listbox options HWND hList = GetDlgItem(hwndDlg, IDC_LANGUAGE_LIST); ListBox_AddString(hList, TEXT("English (US)")); @@ -304,6 +313,16 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) ListBox_AddString(hList, TEXT("Espa\xf1ol")); ListBox_AddString(hList, TEXT("Polski")); ListBox_SetCurSel(hList, 1); + + TCHAR szSysLang[128]; + TCHAR szResText[256]; + + // Get Systems Language, and display its name in English + GetLocaleInfo(MAKELCID(GetUserDefaultUILanguage(), SORT_DEFAULT), LOCALE_SLANGUAGE, szSysLang, 128); + + _stprintf(szResText, (LPCTSTR)TmGetTString(IDS_SYSTEM_LANGUAGE), szSysLang); + SetDlgItemText(hwndDlg, IDS_SYSTEM_LANGUAGE, szResText); + break; } } @@ -332,6 +351,7 @@ void WINAPI OnChildDialogInit(HWND hwndDlg) INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (LOWORD(wParam) == IDOK) return EndDialog(hWnd, IDOK); @@ -666,23 +686,59 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, } case PG_LANGUAGE: { + switch (LOWORD(wParam)) { case IDC_LANGUAGE_APPLY: { - MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION); + // NOTE: this must be in order as the ListBox, i will change this soon + LANGID langIds[] = { + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + MAKELANGID(LANG_SPANISH, SUBLANG_DEFAULT), + MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT) + }; + + int sel = ListBox_GetCurSel(GetDlgItem(hWnd, IDC_LANGUAGE_LIST)); + + GetLocalSettings()->SetLanguage(langIds[sel]); + GetLocalSettings()->Save(); + + if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { + RestartInstance(); + } + else { + g_bPendingRestart = true; + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); + } break; } case IDC_LANGUAGE_DEFAULTS: { MessageBox(hWnd, TmGetTString(IDS_LANG_DEFAULTS), TmGetTString(IDS_RESTART_REQUIRED), MB_OK); + g_bPendingRestart = true; + + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); + + GetLocalSettings()->SetLanguage(1033); + GetLocalSettings()->Save(); + break; } case IDC_LANGUAGE_SYSTEM: { - MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION); + if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { + RestartInstance(); + } + else { + g_bPendingRestart = true; + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); + } break; } } From 91c76db8d38e332b5cd48e674d9a6890ab186d09 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Fri, 5 Jun 2026 15:28:17 +0200 Subject: [PATCH 6/9] make the checkbox somewhat useful --- src/windows/Main.cpp | 6 +++--- src/windows/OptionsDialog.cpp | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/windows/Main.cpp b/src/windows/Main.cpp index 0740f78f..a9028d98 100644 --- a/src/windows/Main.cpp +++ b/src/windows/Main.cpp @@ -1992,9 +1992,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLin // actually bad to leave on on NT 3.x or NT 4 pSettings->Load(); - - SetThreadUILanguage((LANGID)pSettings->GetLanguage()); // for anyone using the new versions. - SetThreadLocale(MAKELCID((LANGID)pSettings->GetLanguage(), SORT_DEFAULT)); // older versions + // without the SetThreadUILanguage, it won't load on the newer versions + SetThreadUILanguage((LANGID)pSettings->GetLanguage()); // NT 10.0 and higher + SetThreadLocale(MAKELCID((LANGID)pSettings->GetLanguage(), SORT_DEFAULT)); // Older versions if (LOBYTE(version) < 5 && pSettings->GetMessageStyle() == MS_GRADIENT) { diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index 5e39a980..bd2004b2 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -308,6 +308,7 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) // off resource file and adds them as listbox options HWND hList = GetDlgItem(hwndDlg, IDC_LANGUAGE_LIST); + // NOTE: must be in order!! ListBox_AddString(hList, TEXT("English (US)")); ListBox_AddString(hList, TEXT("Deutsch")); ListBox_AddString(hList, TEXT("Espa\xf1ol")); @@ -317,7 +318,17 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) TCHAR szSysLang[128]; TCHAR szResText[256]; - // Get Systems Language, and display its name in English + // Check if currently loaded language is the name as the system. + LocalSettings* pSettings = GetLocalSettings(); + + if (GetUserDefaultUILanguage() == pSettings->GetLanguage()) { + SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE_SYSTEM), BM_SETCHECK, BST_CHECKED, 0); + } + else { + SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE_SYSTEM), BM_SETCHECK, BST_UNCHECKED, 0); + } + + // Get Systems Language and display that GetLocaleInfo(MAKELCID(GetUserDefaultUILanguage(), SORT_DEFAULT), LOCALE_SLANGUAGE, szSysLang, 128); _stprintf(szResText, (LPCTSTR)TmGetTString(IDS_SYSTEM_LANGUAGE), szSysLang); @@ -691,7 +702,8 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, case IDC_LANGUAGE_APPLY: { - // NOTE: this must be in order as the ListBox, i will change this soon + // NOTE: this must be in order as the ListBox + // temporary, once i'll figure out other ways LANGID langIds[] = { MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), @@ -709,6 +721,7 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, } else { g_bPendingRestart = true; + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); } @@ -723,6 +736,7 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); + // the default language set is English (US) GetLocalSettings()->SetLanguage(1033); GetLocalSettings()->Save(); @@ -732,10 +746,15 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, case IDC_LANGUAGE_SYSTEM: { if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { + + GetLocalSettings()->SetLanguage(GetUserDefaultUILanguage()); + GetLocalSettings()->Save(); + RestartInstance(); } else { g_bPendingRestart = true; + ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); } From 2bb73afe6cb46bb216e0a22be16a6992db6aaf1f Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Fri, 5 Jun 2026 15:30:19 +0200 Subject: [PATCH 7/9] delete Polish fragments from resource --- src/resource.rc | 121 ------------------------------------------------ 1 file changed, 121 deletions(-) diff --git a/src/resource.rc b/src/resource.rc index be601b55..893ae723 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -1749,127 +1749,6 @@ END ///////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// -// Polish resources - -LANGUAGE LANG_POLISH, SUBLANG_DEFAULT -#pragma code_page(1250) - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENU -BEGIN - POPUP "&Plik" - BEGIN - MENUITEM "&Preferencje", ID_FILE_PREFERENCES - MENUITEM SEPARATOR - MENUITEM "&Ponowne po\xb3\xB9czenie z Discord", ID_FILE_RECONNECTTODISCORD - MENUITEM "&Zatrzymaj TTS", ID_FILE_STOPALLSPEECH - MENUITEM SEPARATOR - MENUITEM "&Wyjd\x9F", ID_FILE_EXIT - END - POPUP "&Serwer" - BEGIN - MENUITEM "&Zapro\x9C ludzi", IDM_INVITEPEOPLE, GRAYED - MENUITEM SEPARATOR - POPUP "&Ustawienia powiadomie\xF1", GRAYED - BEGIN - MENUITEM "Wszystkie wiadomo\x9Cci", IDM_NOTIFYALL, GRAYED - MENUITEM "Tylko @wzmianki", IDM_NOTIFYMENTS, GRAYED - MENUITEM "Brak powiadomie\xF1", IDM_NOTIFYNONE, GRAYED - MENUITEM SEPARATOR - MENUITEM "Wycisz @everyone i @here", IDM_NOTIFYSUPPRGLOB, GRAYED - MENUITEM "Wycisz wszystkie @role", IDM_NOTIFYSUPPRROLE, GRAYED - END - MENUITEM "&Ustawienia serwera", IDM_GUILDSETTINGS, GRAYED - MENUITEM "&Ustawienia prywatno\x9cci", IDM_PRIVACYSETTINGS, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Zmie\xF1 pseudonim", IDM_EDITNICKNAME, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Opu\x9C\xE6 serwer", IDM_LEAVEGUILD - END - POPUP "&Akcje" - BEGIN - MENUITEM "&Szukaj...\tCtrl+F", ID_ACTIONS_SEARCH, GRAYED - MENUITEM "Szybkie prze\xB3\xB9czanie...\tCtrl+K", ID_ACTIONS_QUICKSWITCHER - MENUITEM SEPARATOR - MENUITEM "Nowa &grupowa DM...", ID_ACTIONS_NEWGROUPDM, GRAYED - MENUITEM "Dodaj &znajomego...", ID_ACTIONS_ADDFRIEND, GRAYED - END - POPUP "&Konto" - BEGIN - POPUP "&Status" - BEGIN - MENUITEM "Online", ID_ONLINESTATUSPLACEHOLDER_ONLINE, CHECKED - MENUITEM SEPARATOR - MENUITEM "Nieaktywny", ID_ONLINESTATUSPLACEHOLDER_IDLE - MENUITEM "Nie przeszkadza\xE6", ID_ONLINESTATUSPLACEHOLDER_DONOTDISTURB - MENUITEM "Niewidoczny", ID_ONLINESTATUSPLACEHOLDER_INVISIBLE - END - MENUITEM "Ustaw &w\xB3asny status", ID_ACCOUNT_SETCUSTOMSTATUS, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Wy\xB3\xB9cz wyciszenie", ID_ACCOUNT_UNMUTE, GRAYED - MENUITEM "&Og\xB3uchnij", ID_ACCOUNT_DEAFEN, GRAYED - MENUITEM SEPARATOR - MENUITEM "Ustawienia &u\xBFytkownika", ID_ACCOUNT_USERSETTINGS, GRAYED - END - POPUP "&Pomoc" - BEGIN - MENUITEM "&Tematy pomocy...", ID_HELP_HELPTOPICS, GRAYED - MENUITEM SEPARATOR - MENUITEM "&O Discord Messenger...", ID_HELP_ABOUTDISCORDMESSENGER - END -END - -IDD_DIALOG_LANGUAGE_ND DIALOG 0, 0, 264, 240 -STYLE WS_CHILD | DS_CONTROL -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Opcje J\xEAzyka", IDC_MDISPLAY_BOX, 6, 7, 248, 132 - LTEXT "Wybierz j\xEAzyk wy\x9Cwietlania Discord Messenger", IDC_STATIC, 12, 18, 236, 8 - LISTBOX IDC_LANGUAGE_LIST, 12, 30, 236, 60, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - AUTOCHECKBOX "Wykryj i u\xBFyj domy\x9Clnie j\xEAzyk systemu", IDC_LANGUAGE_SYSTEM, 12, 93, 170, 10 - LTEXT "J\xEAzyk systemu: ", IDS_SYSTEM_LANGUAGE, 12, 106, 236, 8 - PUSHBUTTON "Zastosuj j\xEAzyk", IDC_LANGUAGE_APPLY, 180, 120, 70, 14 - PUSHBUTTON "Przywr\xF3\xE6 domy\x9Clne", IDC_LANGUAGE_DEFAULTS, 12, 120, 70, 14 - - ICON IDI_WARNING_IC,IDC_PENDING_RESTART,12,225,136,20,SS_REALSIZEIMAGE - LTEXT "Zmiany zostan\xB9 wprowadzone po ponownym uruchomieniu aplikacji", IDC_PENDING_RESTART_TEXT, 28, 226, 236, 8 - -END - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -//t - -STRINGTABLE -BEGIN - IDS_PROGRAM_NAME "Discord Messenger" - IDS_CHAT "Czat" - IDS_WINDOW "Okno" - IDS_NOTIFICATIONS "Wiadomo\x9Cci" - IDS_CONNECTION "Po\xB3\xB9czenie" - IDS_APPEARANCE "Wygl\xB9d" - IDS_ACCOUNT_PRIVACY "Konto i prywatno\x9C\xE6" -END - -STRINGTABLE -BEGIN - IDS_APPLY_LANG "Aby zastosowa\xE6 j\xEAzyk, musisz zrestartowa\xE6 Discord Messenger.\nCzy chcesz zrestartowa\xE6 teraz?" - IDS_RESTART_REQUIRED "wymagane uruchomienie ponowne - Discord Messenger" - IDS_LANG_DEFAULTS "Domy\x9Clne ustawienia zosta\xB3y za\xB3adowane. Zmiany b\xEAd\xB9 obowi\xB9zywa\xE6 po uruchomieniu ponownym." - IDS_LANGUAGE "J\xEAzyk" - IDS_SYSTEM_LANGUAGE "j\xEAzyk systemu: %s" -END - -///////////////////////////////////////////////////////////////////////////// -// End Polish resources - - #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // From 0f6f3a4ef22cc3429544f669b4ef9952511e4993 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Fri, 5 Jun 2026 15:51:23 +0200 Subject: [PATCH 8/9] cleanup, and fixes --- src/windows/Main.cpp | 2 +- src/windows/OptionsDialog.cpp | 20 +++++++------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/windows/Main.cpp b/src/windows/Main.cpp index a9028d98..024d94e4 100644 --- a/src/windows/Main.cpp +++ b/src/windows/Main.cpp @@ -1992,7 +1992,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLin // actually bad to leave on on NT 3.x or NT 4 pSettings->Load(); - // without the SetThreadUILanguage, it won't load on the newer versions + // without the SetThreadUILanguage, it won't refresh on the newer versions SetThreadUILanguage((LANGID)pSettings->GetLanguage()); // NT 10.0 and higher SetThreadLocale(MAKELCID((LANGID)pSettings->GetLanguage(), SORT_DEFAULT)); // Older versions diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index bd2004b2..ede22f03 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -313,7 +313,6 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) ListBox_AddString(hList, TEXT("Deutsch")); ListBox_AddString(hList, TEXT("Espa\xf1ol")); ListBox_AddString(hList, TEXT("Polski")); - ListBox_SetCurSel(hList, 1); TCHAR szSysLang[128]; TCHAR szResText[256]; @@ -324,9 +323,6 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) if (GetUserDefaultUILanguage() == pSettings->GetLanguage()) { SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE_SYSTEM), BM_SETCHECK, BST_CHECKED, 0); } - else { - SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE_SYSTEM), BM_SETCHECK, BST_UNCHECKED, 0); - } // Get Systems Language and display that GetLocaleInfo(MAKELCID(GetUserDefaultUILanguage(), SORT_DEFAULT), LOCALE_SLANGUAGE, szSysLang, 128); @@ -704,11 +700,9 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, { // NOTE: this must be in order as the ListBox // temporary, once i'll figure out other ways + LANGID langIds[] = { - MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), - MAKELANGID(LANG_SPANISH, SUBLANG_DEFAULT), - MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT) + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) }; int sel = ListBox_GetCurSel(GetDlgItem(hWnd, IDC_LANGUAGE_LIST)); @@ -736,7 +730,7 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); - // the default language set is English (US) + // the default langID for English US GetLocalSettings()->SetLanguage(1033); GetLocalSettings()->Save(); @@ -745,11 +739,10 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, case IDC_LANGUAGE_SYSTEM: { - if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { - - GetLocalSettings()->SetLanguage(GetUserDefaultUILanguage()); - GetLocalSettings()->Save(); + GetLocalSettings()->SetLanguage(GetUserDefaultUILanguage()); + GetLocalSettings()->Save(); + if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { RestartInstance(); } else { @@ -758,6 +751,7 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDC_PENDING_RESTART_TEXT), SW_SHOW); } + break; } } From 959f22b4ee76a95017f9fa2d0a0b7740b1390e90 Mon Sep 17 00:00:00 2001 From: Jakub Kretkowski Date: Fri, 5 Jun 2026 17:58:49 +0200 Subject: [PATCH 9/9] add fallback for older systems --- src/windows/Main.cpp | 17 ++++++++++++++--- src/windows/Main.hpp | 2 ++ src/windows/OptionsDialog.cpp | 6 +++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/windows/Main.cpp b/src/windows/Main.cpp index 024d94e4..5075666d 100644 --- a/src/windows/Main.cpp +++ b/src/windows/Main.cpp @@ -59,6 +59,8 @@ IChannelView* g_pChannelView; MessageEditor* g_pMessageEditor; LoadingMessage* g_pLoadingMessage; +pSetThreadUILanguage g_fnSetThreadUILanguage = nullptr; + bool g_bBlockDoubleBufferingForThisInstance = false; constexpr int MIN_MEMORY_TO_BLOCK_DOUBLE_BUFFERING = 128 * 1024 * 1024; @@ -1992,9 +1994,18 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLin // actually bad to leave on on NT 3.x or NT 4 pSettings->Load(); - // without the SetThreadUILanguage, it won't refresh on the newer versions - SetThreadUILanguage((LANGID)pSettings->GetLanguage()); // NT 10.0 and higher - SetThreadLocale(MAKELCID((LANGID)pSettings->GetLanguage(), SORT_DEFAULT)); // Older versions + // compatibility checking + HMODULE h = GetModuleHandle(TEXT("kernel32.dll")); + pSetThreadUILanguage fnSetUILanguage = (pSetThreadUILanguage)GetProcAddress(h, "SetThreadUILanguage"); + + LANGID langid = pSettings->GetLanguage(); + + if (fnSetUILanguage) { + fnSetUILanguage(langid); + } + else { + SetThreadLocale(MAKELCID(langid, SORT_DEFAULT)); + } if (LOBYTE(version) < 5 && pSettings->GetMessageStyle() == MS_GRADIENT) { diff --git a/src/windows/Main.hpp b/src/windows/Main.hpp index 8314ba8d..ec2faa67 100644 --- a/src/windows/Main.hpp +++ b/src/windows/Main.hpp @@ -145,6 +145,8 @@ struct SendMessageAuxParams Snowflake m_snowflake; }; +typedef LANGID(WINAPI* pSetThreadUILanguage)(LANGID); + std::string FormatDiscrim(int discrim); std::string GetStringFromHResult(HRESULT hr); std::string GetDiscordToken(); diff --git a/src/windows/OptionsDialog.cpp b/src/windows/OptionsDialog.cpp index ede22f03..339a68ad 100644 --- a/src/windows/OptionsDialog.cpp +++ b/src/windows/OptionsDialog.cpp @@ -320,12 +320,12 @@ void OptionsInitPage(HWND hwndDlg, int pageNum) // Check if currently loaded language is the name as the system. LocalSettings* pSettings = GetLocalSettings(); - if (GetUserDefaultUILanguage() == pSettings->GetLanguage()) { + if (GetSystemDefaultLangID() == pSettings->GetLanguage()) { SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE_SYSTEM), BM_SETCHECK, BST_CHECKED, 0); } // Get Systems Language and display that - GetLocaleInfo(MAKELCID(GetUserDefaultUILanguage(), SORT_DEFAULT), LOCALE_SLANGUAGE, szSysLang, 128); + GetLocaleInfo(MAKELCID(GetSystemDefaultLangID(), SORT_DEFAULT), LOCALE_SLANGUAGE, szSysLang, 128); _stprintf(szResText, (LPCTSTR)TmGetTString(IDS_SYSTEM_LANGUAGE), szSysLang); SetDlgItemText(hwndDlg, IDS_SYSTEM_LANGUAGE, szResText); @@ -739,7 +739,7 @@ INT_PTR OptionsHandleCommand(HWND hwndParent, HWND hWnd, int pageNum, UINT uMsg, case IDC_LANGUAGE_SYSTEM: { - GetLocalSettings()->SetLanguage(GetUserDefaultUILanguage()); + GetLocalSettings()->SetLanguage(GetSystemDefaultLangID()); GetLocalSettings()->Save(); if (MessageBox(hWnd, TmGetTString(IDS_APPLY_LANG), TmGetTString(IDS_RESTART_REQUIRED), MB_YESNO | MB_ICONEXCLAMATION) == IDYES) {