mirror of
https://github.com/rizonesoft/Notepad3.git
synced 2026-06-14 21:09:05 +08:00
+ fix: user preferred UI language
This commit is contained in:
parent
fa73c5686b
commit
157cedd528
@ -1 +1 @@
|
||||
1098
|
||||
1113
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
// ----------------------------------------------------
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<assemblyIdentity
|
||||
name="Notepad3"
|
||||
processorArchitecture="*"
|
||||
version="4.18.912.1098"
|
||||
version="4.18.920.1113"
|
||||
type="win32"
|
||||
/>
|
||||
<description>Notepad3 TinyExpr</description>
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user