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"