diff --git a/Versions/build.txt b/Versions/build.txt index e2bb11dae..09e35abcf 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -1098 +1113 diff --git a/minipath/src/Dialogs.c b/minipath/src/Dialogs.c index a99dab5ec..834053fd3 100644 --- a/minipath/src/Dialogs.c +++ b/minipath/src/Dialogs.c @@ -42,7 +42,7 @@ // L"Title\nMessage Text" // extern HWND hwndMain; -extern LANGID g_iPrefLngLocID; +extern LANGID g_iPrefLANGID; extern HICON g_hDlgIcon; @@ -77,7 +77,7 @@ int ErrorMessage(int iLevel, UINT uIdMsg, ...) HWND focus = GetFocus(); HWND hwnd = focus ? focus : hwndMain; - return MessageBoxEx(hwnd, szText, szTitle, MB_SETFOREGROUND | iIcon, g_iPrefLngLocID); + return MessageBoxEx(hwnd, szText, szTitle, MB_SETFOREGROUND | iIcon, g_iPrefLANGID); } diff --git a/minipath/src/Helpers.c b/minipath/src/Helpers.c index 1a3aed926..9ba611277 100644 --- a/minipath/src/Helpers.c +++ b/minipath/src/Helpers.c @@ -28,7 +28,7 @@ #include "helpers.h" #include "resource.h" -extern LANGID g_iPrefLngLocID; +extern LANGID g_iPrefLANGID; //============================================================================= // @@ -204,7 +204,7 @@ DWORD GetLastErrorToMsgBox(LPWSTR lpszFunction, DWORD dwErrID) FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrID, - g_iPrefLngLocID, + g_iPrefLANGID, (LPTSTR)&lpMsgBuf, 0, NULL); diff --git a/minipath/src/minipath.c b/minipath/src/minipath.c index 1fd57624d..872957845 100644 --- a/minipath/src/minipath.c +++ b/minipath/src/minipath.c @@ -158,7 +158,7 @@ HINSTANCE g_hInstance = NULL; HMODULE g_hLngResContainer = NULL; WCHAR g_tchPrefLngLocName[64]; -LANGID g_iPrefLngLocID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); +LANGID g_iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); #define LNG_AVAILABLE_COUNT 8 static WCHAR* const g_tchAvailableLanguages = L"af-ZA de-DE es-ES en-GB fr-FR ja-JP nl-NL zh-CN"; // en-US internal static LANGID const g_iAvailableLanguages[LNG_AVAILABLE_COUNT] = { 1078, 1031, 3082, 2057, 1036, 1041, 1043, 2052 }; // 1033 internal @@ -327,22 +327,22 @@ int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPWSTR lpCmdLine,int // ---------------------------------------------------- // MultiLingual // - g_iPrefLngLocID = GetUserDefaultUILanguage(); + g_iPrefLANGID = GetUserDefaultUILanguage(); BOOL bPrefLngDefined = StrIsNotEmpty(g_tchPrefLngLocName); BOOL bPrefLngNotAvail = FALSE; if (bPrefLngDefined) { bPrefLngDefined = TRUE; DWORD dwLangID = 0; GetLocaleInfoEx(g_tchPrefLngLocName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&dwLangID, sizeof(DWORD)); - g_iPrefLngLocID = (LANGID)dwLangID; + g_iPrefLANGID = (LANGID)dwLangID; } - g_hLngResContainer = _LoadLanguageResources(g_iPrefLngLocID); + g_hLngResContainer = _LoadLanguageResources(g_iPrefLANGID); if (!g_hLngResContainer) // fallback en-US (1033) { g_hLngResContainer = g_hInstance; - if (g_iPrefLngLocID != 1033) { bPrefLngNotAvail = TRUE; } + if (g_iPrefLANGID != 1033) { bPrefLngNotAvail = TRUE; } } // ---------------------------------------------------- diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index a68337bed..efc18ad9a 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 TinyExpr diff --git a/src/Dialogs.c b/src/Dialogs.c index 439da218a..7271ff0f3 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -53,7 +53,7 @@ extern HWND g_hwndMain; extern HINSTANCE g_hInstance; extern HMODULE g_hLngResContainer; -extern LANGID g_iPrefLngLocID; +extern LANGID g_iPrefLANGID; extern HICON g_hDlgIcon; extern WCHAR g_wchWorkingDirectory[]; @@ -133,7 +133,7 @@ int MsgBoxLng(int iType, UINT uIdMsg, ...) FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastIOError, - g_iPrefLngLocID, + g_iPrefLANGID, (LPTSTR)&lpMsgBuf, 0, NULL); @@ -171,7 +171,7 @@ int MsgBoxLng(int iType, UINT uIdMsg, ...) //return MessageBox(hwnd, szText, szTitle, iIcon); //return MessageBoxEx(hwnd, szText, szTitle, iIcon, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)); - return MessageBoxEx(hwnd, szText, szTitle, iIcon, g_iPrefLngLocID); + return MessageBoxEx(hwnd, szText, szTitle, iIcon, g_iPrefLANGID); } @@ -295,7 +295,7 @@ void DisplayCmdLineHelp(HWND hwnd) mbp.lpszIcon = MAKEINTRESOURCE(IDR_MAINWND48); mbp.dwContextHelpId = 0; mbp.lpfnMsgBoxCallback = NULL; - mbp.dwLanguageId = g_iPrefLngLocID; + mbp.dwLanguageId = g_iPrefLANGID; hhkMsgBox = SetWindowsHookEx(WH_CBT, &_MsgBoxProc, 0, GetCurrentThreadId()); diff --git a/src/Helpers.c b/src/Helpers.c index 7661767d1..f89243e4f 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -44,7 +44,7 @@ extern HINSTANCE g_hInstance; extern HMODULE g_hLngResContainer; -extern LANGID g_iPrefLngLocID; +extern LANGID g_iPrefLANGID; //============================================================================= @@ -308,7 +308,7 @@ DWORD GetLastErrorToMsgBox(LPWSTR lpszFunction, DWORD dwErrID) FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrID, - g_iPrefLngLocID, + g_iPrefLANGID, (LPTSTR)&lpMsgBuf, 0, NULL); diff --git a/src/Notepad3.c b/src/Notepad3.c index 9e030e49b..608388de6 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -142,7 +142,7 @@ bool g_bSaveFindReplace; bool g_bFindReplCopySelOrClip = true; WCHAR g_tchPrefLngLocName[LOCALE_NAME_MAX_LENGTH]; -LANGID g_iPrefLngLocID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); +LANGID g_iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); HMODULE g_hLngResContainer = NULL; #define LNG_AVAILABLE_COUNT 8 static WCHAR* const g_tchAvailableLanguages = L"af-ZA de-DE es-ES en-GB fr-FR ja-JP nl-NL zh-CN"; // en-US internal @@ -581,7 +581,7 @@ static int g_flagBufferFile = 0; // decalarations static void __fastcall _UpdateStatusbarDelayed(bool bForceRedraw); static void __fastcall _UpdateToolbarDelayed(); -static HMODULE __fastcall _LoadLanguageResources(LANGID const langID, const WCHAR* locName); +static HMODULE __fastcall _LoadLanguageResources(const WCHAR* localeName, LANGID const langID); static bool __fastcall _RegisterWndClass(HINSTANCE hInstance); //============================================================================== @@ -689,26 +689,53 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInst, _In_ // MultiLingual // bool bPrefLngNotAvail = false; - - DWORD dwLocID = 0UL; - if (StringCchLen(g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName)) > 0) { - GetLocaleInfoEx(g_tchPrefLngLocName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&dwLocID, sizeof(DWORD)); - } - if (dwLocID == 0UL) { - //GetLocaleInfoEx(LOCALE_USER_DEFAULT, LOCALE_SNAME, g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName)); - GetUserDefaultLocaleName(&g_tchPrefLngLocName[0], COUNTOF(g_tchPrefLngLocName)); - g_iPrefLngLocID = GetUserDefaultUILanguage(); - } - else { - g_iPrefLngLocID = (LANGID)dwLocID; + + int res = 0; + if (StringCchLen(g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName)) > 0) + { + WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH]; + res = ResolveLocaleName(g_tchPrefLngLocName, wchLngLocalName, LOCALE_NAME_MAX_LENGTH); + if (res > 0) { + StringCchCopy(g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName), wchLngLocalName); // put back resolved name + } + // get LANGID + g_iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + res = GetLocaleInfoEx(g_tchPrefLngLocName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&g_iPrefLANGID, sizeof(LANGID)); } - g_hLngResContainer = _LoadLanguageResources(g_iPrefLngLocID, g_tchPrefLngLocName); + if (res == 0) // No preferred language defined or retrievable, try to get User UI Language + { + //~GetUserDefaultLocaleName(&g_tchPrefLngLocName[0], COUNTOF(g_tchPrefLngLocName)); + ULONG numLngs = 0; + DWORD cchLngsBuffer = 0; + BOOL hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, NULL, &cchLngsBuffer); + if (hr) { + WCHAR* pwszLngsBuffer = AllocMem((cchLngsBuffer + 2) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pwszLngsBuffer) { + hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, pwszLngsBuffer, &cchLngsBuffer); + if (hr && (numLngs > 0)) { + // get the first + StringCchCopy(g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName), pwszLngsBuffer); + g_iPrefLANGID = LANGIDFROMLCID(LocaleNameToLCID(g_tchPrefLngLocName, 0)); + res = 1; + } + FreeMem(pwszLngsBuffer); + } + } + if (res == 0) { // last try + g_iPrefLANGID = GetUserDefaultUILanguage(); + LCID const lcid = MAKELCID(g_iPrefLANGID, SORT_DEFAULT); + res = LCIDToLocaleName(lcid, g_tchPrefLngLocName, COUNTOF(g_tchPrefLngLocName), 0); + } + } + + g_hLngResContainer = _LoadLanguageResources(g_tchPrefLngLocName, g_iPrefLANGID); if (!g_hLngResContainer) // fallback en-US (1033) { + LANGID const langID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); g_hLngResContainer = g_hInstance; - if (g_iPrefLngLocID != 1033) { bPrefLngNotAvail = true; } + if (g_iPrefLANGID != langID) { bPrefLngNotAvail = true; } } // ---------------------------------------------------- @@ -873,21 +900,14 @@ static bool __fastcall _LngStrToMultiLngStr(WCHAR* pLngStr, WCHAR* pLngMultiStr, // _LoadLanguageResources // // -static HMODULE __fastcall _LoadLanguageResources(LANGID const langID, const WCHAR* locName) +static HMODULE __fastcall _LoadLanguageResources(const WCHAR* localeName, LANGID const langID) { - UNUSED(locName); - bool bLngAvailable = false; - for (int i = 0; i < COUNTOF(g_iAvailableLanguages); ++i) { - if (g_iAvailableLanguages[i] == langID) { - bLngAvailable = true; - break; - } - } + bool bLngAvailable = (StrStrIW(g_tchAvailableLanguages, localeName) != NULL); if (!bLngAvailable) { return NULL; } - WCHAR tchAvailLngs[SMALL_BUFFER] = { L'\0' }; - StringCchCopyW(tchAvailLngs, SMALL_BUFFER, g_tchAvailableLanguages); - WCHAR tchUserLangMultiStrg[SMALL_BUFFER] = { L'\0' }; + WCHAR tchAvailLngs[LARGE_BUFFER] = { L'\0' }; + StringCchCopyW(tchAvailLngs, LARGE_BUFFER, g_tchAvailableLanguages); + WCHAR tchUserLangMultiStrg[LARGE_BUFFER] = { L'\0' }; if (!_LngStrToMultiLngStr(tchAvailLngs, tchUserLangMultiStrg, LARGE_BUFFER)) { GetLastErrorToMsgBox(L"_LngStrToMultiLngStr()", ERROR_MUI_INVALID_LOCALE_NAME); @@ -902,11 +922,8 @@ static HMODULE __fastcall _LoadLanguageResources(LANGID const langID, const WCHA GetLastErrorToMsgBox(L"SetProcessPreferredUILanguages()", 0); return NULL; } - SetThreadUILanguage(langID); - - // NOTES: // an application developer that makes the assumption the fallback list provided by the // system / OS is entirely sufficient may or may not be making a good assumption based mostly on: diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 0dceae7e0..967900f6e 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -312,7 +312,7 @@ END STRINGTABLE BEGIN - IDS_WARN_PREF_LNG_NOT_AVAIL "Sorry, your prefered language (%s) is not available." + IDS_WARN_PREF_LNG_NOT_AVAIL "Sorry, your preferred language (%s) is not available." END diff --git a/src/VersionEx.h b/src/VersionEx.h index a0a747cf6..236392fba 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -6,8 +6,8 @@ #define APPNAME "Notepad3" #define VERSION_MAJOR 4 #define VERSION_MINOR 18 -#define VERSION_REV 912 -#define VERSION_BUILD 1098 +#define VERSION_REV 920 +#define VERSION_BUILD 1113 #define SCINTILLA_VER 411 #define ONIGMO_REGEX_VER 6.1.3 #define VERSION_PATCH " TinyExpr"