+ fix: user preferred UI language

This commit is contained in:
Rainer Kottenhoff 2018-09-20 18:32:59 +02:00
parent fa73c5686b
commit 157cedd528
10 changed files with 68 additions and 51 deletions

View File

@ -1 +1 @@
1098
1113

View File

@ -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);
}

View File

@ -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);

View File

@ -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; }
}
// ----------------------------------------------------

View File

@ -3,7 +3,7 @@
<assemblyIdentity
name="Notepad3"
processorArchitecture="*"
version="4.18.912.1098"
version="4.18.920.1113"
type="win32"
/>
<description>Notepad3 TinyExpr</description>

View File

@ -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());

View File

@ -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);

View File

@ -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:

View File

@ -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

View File

@ -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"