diff --git a/src/MuiLanguage.c b/src/MuiLanguage.c index 6e45b9cf9..280e7d864 100644 --- a/src/MuiLanguage.c +++ b/src/MuiLanguage.c @@ -188,7 +188,7 @@ static bool _GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, L // LoadLanguageResources // // -HMODULE LoadLanguageResources(LANGID* pPrefLanguageID) +LANGID LoadLanguageResources() { // 1st check language resources Globals.iAvailLngCount = _CheckAvailableLanguageDLLs(); @@ -241,23 +241,27 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID) // obtains access to the proper resource container // for standard Win32 resource loading this is normally a PE module - use LoadLibraryEx - HMODULE hLangResourceContainer = NULL; + HINSTANCE _hLangResourceContainer = NULL; Globals.bPrefLngNotAvail = (iPrefLngIndex < 0); if ((iPrefLngIndex >= 0) && MUI_LanguageDLLs[iPrefLngIndex].bHasDLL) { - hLangResourceContainer = (0 == iPrefLngIndex) ? Globals.hInstance : + _hLangResourceContainer = (iPrefLngIndex == 0) ? Globals.hInstance : LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, languageID); - MUI_LanguageDLLs[iPrefLngIndex].bIsLoaded = true; + if (_hLangResourceContainer) { + MUI_LanguageDLLs[0].bIsActive = false; + MUI_LanguageDLLs[iPrefLngIndex].bIsActive = true; + } } - - if (!hLangResourceContainer) { + if (!_hLangResourceContainer) { // fallback to ENGLISH_US + //GetLastErrorToMsgBox(L"LoadMUILibrary", 0); Globals.bPrefLngNotAvail = (languageID != MUI_LanguageDLLs[0].LangId); languageID = MUI_LanguageDLLs[0].LangId; - hLangResourceContainer = Globals.hInstance; - MUI_LanguageDLLs[0].bIsLoaded = true; + _hLangResourceContainer = Globals.hInstance; + MUI_LanguageDLLs[0].bIsActive = true; } + Globals.hLngResContainer = _hLangResourceContainer; SetThreadUILanguage(languageID); // update language dependent items @@ -266,8 +270,7 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID) Encoding_SetLabel(enc); } - *pPrefLanguageID = languageID; - return hLangResourceContainer; + return languageID; } @@ -276,15 +279,16 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID) // FreeLanguageResources // // -void FreeLanguageResources(HMODULE hLangResourceContainer) +void FreeLanguageResources() { - if (hLangResourceContainer) { - if (hLangResourceContainer != Globals.hInstance) { - FreeMUILibrary(hLangResourceContainer); - } + if (Globals.hLngResContainer != Globals.hInstance) { + HINSTANCE const _hLngResContainer = Globals.hLngResContainer; + Globals.hLngResContainer = Globals.hInstance; + MUI_LanguageDLLs[0].bIsActive = true; + FreeMUILibrary(_hLngResContainer); } - for (int i = 0; i < MuiLanguages_CountOf(); ++i) { - MUI_LanguageDLLs[i].bIsLoaded = false; + for (int i = 1; i < MuiLanguages_CountOf(); ++i) { + MUI_LanguageDLLs[i].bIsActive = false; } } diff --git a/src/MuiLanguage.h b/src/MuiLanguage.h index 6fee43658..ba9e48dde 100644 --- a/src/MuiLanguage.h +++ b/src/MuiLanguage.h @@ -24,7 +24,7 @@ typedef struct _muilanguage // !!! WARNING: LCID is DEPRECATED LANGID LangId; // just for historic reasons bool bHasDLL; - bool bIsLoaded; + bool bIsActive; } MUILANGUAGE, *PMUILANGUAGE; @@ -32,8 +32,8 @@ extern MUILANGUAGE MUI_LanguageDLLs[]; int MuiLanguages_CountOf(); -HMODULE LoadLanguageResources(LANGID* pPrefLanguageID); -void FreeLanguageResources(HMODULE hLangResourceContainer); +LANGID LoadLanguageResources(); +void FreeLanguageResources(); int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax); int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax); diff --git a/src/Notepad3.c b/src/Notepad3.c index 81524496d..17f1e97d8 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -533,8 +533,7 @@ static void _CleanUpResources(const HWND hwnd, bool bIsInitialized) DestroyMenu(Globals.hMainMenu); } - FreeLanguageResources(Globals.hLngResContainer); - Globals.hLngResContainer = NULL; + FreeLanguageResources(); if (s_hRichEdit) { FreeLibrary(s_hRichEdit); @@ -638,8 +637,8 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, // ---------------------------------------------------- // MultiLingual // - Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); - Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID); + //Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + Globals.iPrefLANGID = LoadLanguageResources(); // ---------------------------------------------------- @@ -2910,7 +2909,7 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam) for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) { //EnableCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bHasDLL); - CheckCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bIsLoaded); + CheckCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bIsActive); } return FALSE; @@ -2929,7 +2928,7 @@ static bool _DynamicLanguageMenuCmd(int cmd) if ((iLngIdx < 0) || (iLngIdx >= MuiLanguages_CountOf())) { return false; } - if (!MUI_LanguageDLLs[iLngIdx].bIsLoaded) + if (!MUI_LanguageDLLs[iLngIdx].bIsActive) { if (IsWindow(Globals.hwndDlgFindReplace)) { SendMessage(Globals.hwndDlgFindReplace, WM_CLOSE, 0, 0); @@ -2942,10 +2941,9 @@ static bool _DynamicLanguageMenuCmd(int cmd) IniSetString(L"Settings2", L"PreferredLanguageLocaleName", Settings2.PreferredLanguageLocaleName); DestroyMenu(Globals.hMainMenu); - FreeLanguageResources(Globals.hLngResContainer); - Globals.iPrefLANGID = MUI_LanguageDLLs[iLngIdx].LangId; - Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID); + FreeLanguageResources(); + Globals.iPrefLANGID = LoadLanguageResources(); Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU)); if (!Globals.hMainMenu) { GetLastErrorToMsgBox(L"LoadMenu()", 0); diff --git a/src/TypeDefs.h b/src/TypeDefs.h index 2aa359946..e2627d6c4 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -266,7 +266,7 @@ typedef struct _globals_t { HINSTANCE hInstance; HINSTANCE hPrevInst; - HMODULE hLngResContainer; + HINSTANCE hLngResContainer; int iAvailLngCount; bool bPrefLngNotAvail; HWND hwndMain;