+ rfc: minimize usage of deprecated LCID/LANGID

This commit is contained in:
Rainer Kottenhoff 2021-04-14 21:08:11 +02:00
parent a67bd84a3d
commit 5edcfd6753
7 changed files with 227 additions and 201 deletions

View File

@ -9,59 +9,59 @@
#define SUBLANG_SPANISH_LATIN_AMERICA 0x16
#if defined(MUI_BASE_LNG_EN_US)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
#define MUI_BASE_LNG_ID L"en-US"
#elif defined(MUI_BASE_LNG_AF_ZA)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA)
#define MUI_BASE_LNG_ID L"af-ZA"
#elif defined(MUI_BASE_LNG_BE_BY)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_BELARUSIAN, SUBLANG_BELARUSIAN_BELARUS)
#define MUI_BASE_LNG_ID L"be-BY"
#elif defined(MUI_BASE_LNG_DE_DE)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN)
#define MUI_BASE_LNG_ID L"de-DE"
#elif defined(MUI_BASE_LNG_EL_GR)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_GREEK, SUBLANG_GREEK_GREECE)
#define MUI_BASE_LNG_ID L"el-GR"
#elif defined(MUI_BASE_LNG_EN_GB)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK)
#define MUI_BASE_LNG_ID L"en-GB"
#elif defined(MUI_BASE_LNG_ES_419)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_LATIN_AMERICA)
#define MUI_BASE_LNG_ID L"es-419"
#elif defined(MUI_BASE_LNG_ES_ES)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN)
#define MUI_BASE_LNG_ID L"es-ES"
#elif defined(MUI_BASE_LNG_FR_FR)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH)
#define MUI_BASE_LNG_ID L"fr-FR"
#elif defined(MUI_BASE_LNG_HI_IN)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_HINDI, SUBLANG_HINDI_INDIA)
#define MUI_BASE_LNG_ID L"hi-IN"
#elif defined(MUI_BASE_LNG_HU_HU)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_HUNGARIAN, SUBLANG_HUNGARIAN_HUNGARY)
#define MUI_BASE_LNG_ID L"hu-HU"
#elif defined(MUI_BASE_LNG_ID_ID)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_INDONESIAN, SUBLANG_INDONESIAN_INDONESIA)
#define MUI_BASE_LNG_ID L"id-ID"
#elif defined(MUI_BASE_LNG_IT_IT)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN)
#define MUI_BASE_LNG_ID L"it-IT"
#elif defined(MUI_BASE_LNG_JA_JP)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN)
#define MUI_BASE_LNG_ID L"ja-JP"
#elif defined(MUI_BASE_LNG_KO_KR)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN)
#define MUI_BASE_LNG_ID L"ko-KR"
#elif defined(MUI_BASE_LNG_NL_NL)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH)
#define MUI_BASE_LNG_ID L"nl-NL"
#elif defined(MUI_BASE_LNG_PL_PL)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_POLISH, SUBLANG_POLISH_POLAND)
#define MUI_BASE_LNG_ID L"pl-PL"
#elif defined(MUI_BASE_LNG_PT_BR)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN)
#define MUI_BASE_LNG_ID L"pt-BR"
#elif defined(MUI_BASE_LNG_PT_PT)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE)
#define MUI_BASE_LNG_ID L"pt-PT"
#elif defined(MUI_BASE_LNG_RU_RU)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA)
#define MUI_BASE_LNG_ID L"ru-RU"
#elif defined(MUI_BASE_LNG_SK_SK)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_SLOVAK, SUBLANG_SLOVAK_SLOVAKIA)
#define MUI_BASE_LNG_ID L"sk-SK"
#elif defined(MUI_BASE_LNG_SV_SE)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH)
#define MUI_BASE_LNG_ID L"sv-SE"
#elif defined(MUI_BASE_LNG_TR_TR)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_TURKISH, SUBLANG_TURKISH_TURKEY)
#define MUI_BASE_LNG_ID L"tr-TR"
#elif defined(MUI_BASE_LNG_VI_VN)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM)
#define MUI_BASE_LNG_ID L"vi-VN"
#elif defined(MUI_BASE_LNG_ZH_CN)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
#define MUI_BASE_LNG_ID L"zh-CN"
#elif defined(MUI_BASE_LNG_ZH_TW)
#define MUI_BASE_LNG_ID MAKELANGID(LANG_CHINESE_TRADITIONAL, SUBLANG_CHINESE_TRADITIONAL)
#define MUI_BASE_LNG_ID L"zh-TW"
#else
#define MUI_BASE_LNG_ID MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
#define MUI_BASE_LNG_ID L"en-US"
#endif
// ==========================================

View File

@ -1087,9 +1087,9 @@ void LoadSettings()
// --------------------------------------------------------------------------
#if defined(HAVE_DYN_LOAD_LIBS_MUI_LNGS)
LANGID lngID = MUI_BASE_LNG_ID;
Defaults2.PreferredLanguageLocaleName[0] = L'\0';
GetUserPreferredLanguage(Defaults2.PreferredLanguageLocaleName, COUNTOF(Defaults2.PreferredLanguageLocaleName), &lngID);
GetUserPreferredLanguage(Defaults2.PreferredLanguageLocaleName, COUNTOF(Defaults2.PreferredLanguageLocaleName));
IniSectionGetStringNoQuotes(IniSecSettings2, L"PreferredLanguageLocaleName", Defaults2.PreferredLanguageLocaleName,
Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName));

View File

@ -145,7 +145,7 @@ int MessageBoxLng(UINT uType, UINT uidMsg, ...)
HWND const hwnd = focus ? focus : Globals.hwndMain;
s_hCBThook = SetWindowsHookEx(WH_CBT, &SetPosRelatedToParent_Hook, 0, GetCurrentThreadId());
return MessageBoxEx(hwnd, szText, _W(SAPPNAME), uType, Globals.iCurrentLANGID);
return MessageBoxEx(hwnd, szText, _W(SAPPNAME), uType, GetLangIdByLocaleName(Globals.CurrentLngLocaleName));
}
@ -167,7 +167,7 @@ DWORD MsgBoxLastError(LPCWSTR lpszMessage, DWORD dwErrID)
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwErrID,
Globals.iCurrentLANGID,
GetLangIdByLocaleName(Globals.CurrentLngLocaleName),
(LPWSTR)&lpMsgBuf,
0, NULL);
@ -186,7 +186,7 @@ DWORD MsgBoxLastError(LPCWSTR lpszMessage, DWORD dwErrID)
s_hCBThook = SetWindowsHookEx(WH_CBT, &SetPosRelatedToParent_Hook, 0, GetCurrentThreadId());
UINT uType = MB_ICONERROR | MB_TOPMOST | (Settings.DialogsLayoutRTL ? MB_RTLREADING : 0);
MessageBoxEx(hwnd, lpDisplayBuf, _W(SAPPNAME) L" - ERROR", uType, Globals.iCurrentLANGID);
MessageBoxEx(hwnd, lpDisplayBuf, _W(SAPPNAME) L" - ERROR", uType, GetLangIdByLocaleName(Globals.CurrentLngLocaleName));
FreeMem(lpDisplayBuf);
}
@ -455,7 +455,7 @@ LONG InfoBoxLng(UINT uType, LPCWSTR lpstrSetting, UINT uidMsg, ...)
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
Globals.dwLastError,
Globals.iCurrentLANGID,
GetLangIdByLocaleName(Globals.CurrentLngLocaleName),
(LPWSTR)&lpMsgBuf, 0,
NULL);
@ -722,7 +722,7 @@ void DisplayCmdLineHelp(HWND hwnd)
mbp.lpszIcon = MAKEINTRESOURCE(IDR_MAINWND);
mbp.dwContextHelpId = 0;
mbp.lpfnMsgBoxCallback = NULL;
mbp.dwLanguageId = Globals.iCurrentLANGID;
mbp.dwLanguageId = GetLangIdByLocaleName(Globals.CurrentLngLocaleName);
hhkMsgBox = SetWindowsHookEx(WH_CBT, &_MsgBoxProc, 0, GetCurrentThreadId());
@ -1283,7 +1283,7 @@ CASE_WM_CTLCOLOR_SET:
#if defined(HAVE_DYN_LOAD_LIBS_MUI_LNGS)
for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
if (MUI_LanguageDLLs[lng].bIsActive) {
StringCchCopy(wchBuf, COUNTOF(wchBuf), MUI_LanguageDLLs[lng].szLocaleName);
StringCchCopy(wchBuf, COUNTOF(wchBuf), MUI_LanguageDLLs[lng].LocaleName);
break;
}
}
@ -4718,7 +4718,7 @@ void DialogGrepWin(HWND hwnd, LPCWSTR searchPattern)
// get grepWin language
int lngIdx = -1;
for (int i = 0; i < grepWinLang_CountOf(); ++i) {
if (grepWinLangResName[i].lngid == Globals.iCurrentLANGID) {
if (IsSameLocale(grepWinLangResName[i].localename, Globals.CurrentLngLocaleName)) {
lngIdx = i;
break;
}
@ -5714,7 +5714,9 @@ bool GetLocaleDefaultUIFont(LANGID lang, LPWSTR lpFaceName, WORD* wSize)
bool GetThemedDialogFont(LPWSTR lpFaceName, WORD* wSize)
{
bool bSucceed = GetLocaleDefaultUIFont(Globals.iCurrentLANGID, lpFaceName, wSize);
// deprecated:
LANGID const langID = GetLangIdByLocaleName(Globals.CurrentLngLocaleName);
bool bSucceed = GetLocaleDefaultUIFont(langID, lpFaceName, wSize);
if (!bSucceed) {
if (IsAppThemed()) {

View File

@ -29,33 +29,58 @@
//=============================================================================
//=============================================================================
//
// GetMUILanguageIndexByLocaleName
// deprecated LANGID (!!!)
//
LANGID GetLangIdByLocaleName(LPCWSTR pLocaleName) {
if (StrIsNotEmpty(pLocaleName)) {
WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH + 1];
int res = ResolveLocaleName(pLocaleName, wchLngLocalName, COUNTOF(wchLngLocalName));
if (res > 0) {
// get LANGID
DWORD value = 0;
res = GetLocaleInfoEx(wchLngLocalName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&value, sizeof(value) / sizeof(WCHAR));
if (res > 0) {
return (LANGID)value;
}
}
}
return 1033; // (!) en-US, not MUI_BASE_LNG_ID
}
//=============================================================================
//=============================================================================
grepWinLng_t grepWinLangResName[] = {
{ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), L".\\lng\\gwLng\\English (United States) [en-US].lang" },
{ MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA), L".\\lng\\gwLng\\Afrikaans (Suid-Afrika) [af-ZA].lang" },
{ MAKELANGID(LANG_BELARUSIAN, SUBLANG_BELARUSIAN_BELARUS), L".\\lng\\gwLng\\Беларуская (Беларусь) [be-BY].lang" },
{ MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), L".\\lng\\gwLng\\Deutsch (Deutschland) [de-DE].lang" },
{ MAKELANGID(LANG_GREEK, SUBLANG_GREEK_GREECE), L".\\lng\\gwLng\\Ελληνικά (Ελλάδα) [el-GR].lang" },
{ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), L".\\lng\\gwLng\\English (United Kingdom) [en-GB].lang" },
{ MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_LATIN_AMERICA), L".\\lng\\gwLng\\Español (América Latina) [es-419].lang" },
{ MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), L".\\lng\\gwLng\\Español (España) [es-ES].lang" },
{ MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH), L".\\lng\\gwLng\\Français (France) [fr-FR].lang" },
{ MAKELANGID(LANG_HINDI, SUBLANG_HINDI_INDIA), L".\\lng\\gwLng\\हिन्दी (भारत) [hi-IN].lang" },
{ MAKELANGID(LANG_HUNGARIAN, SUBLANG_HUNGARIAN_HUNGARY), L".\\lng\\gwLng\\Magyar (Magyarország) [hu-HU].lang" },
{ MAKELANGID(LANG_INDONESIAN, SUBLANG_INDONESIAN_INDONESIA), L".\\lng\\gwLng\\Bahasa Indonesia (Indonesia) [id-ID].lang" },
{ MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), L".\\lng\\gwLng\\Italiano (Italia) [it-IT].lang" },
{ MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), L".\\lng\\gwLng\\日本語 (日本)[ja-JP].lang" },
{ MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), L".\\lng\\gwLng\\한국어 (대한민국) [ko-KR].lang" },
{ MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), L".\\lng\\gwLng\\Nederlands (Nederland) [nl-NL].lang" },
{ MAKELANGID(LANG_POLISH, SUBLANG_POLISH_POLAND), L".\\lng\\gwLng\\Polski (Polska) [pl-PL].lang" },
{ MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), L".\\lng\\gwLng\\Português Brasileiro (Brasil) [pt-BR].lang" },
{ MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE), L".\\lng\\gwLng\\Português (Portugal) [pt-PT].lang" },
{ MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), L".\\lng\\gwLng\\Русский (Pоссия) [ru-RU].lang" },
{ MAKELANGID(LANG_SLOVAK, SUBLANG_SLOVAK_SLOVAKIA), L".\\lng\\gwLng\\Slovenčina (Slovensko) [sk-SK].lang" },
{ MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), L".\\lng\\gwLng\\Svenska (Sverige) [sv-SE].lang" },
{ MAKELANGID(LANG_TURKISH, SUBLANG_TURKISH_TURKEY), L".\\lng\\gwLng\\Türkçe (Türkiye) [tr-TR].lang" },
{ MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM), L".\\lng\\gwLng\\Tiếng Việt (Việt Nam) [vi-VN].lang" },
{ MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), L".\\lng\\gwLng\\简体中文 (中国) [zh-CN].lang" },
{ MAKELANGID(LANG_CHINESE_TRADITIONAL, SUBLANG_CHINESE_TRADITIONAL), L".\\lng\\gwLng\\繁體中文 (台灣) [zh-TW].lang" }
{ L"en-US", L".\\lng\\gwLng\\English (United States) [en-US].lang" },
{ L"af-ZA", L".\\lng\\gwLng\\Afrikaans (Suid-Afrika) [af-ZA].lang" },
{ L"be-BY", L".\\lng\\gwLng\\Беларуская (Беларусь) [be-BY].lang" },
{ L"de-DE", L".\\lng\\gwLng\\Deutsch (Deutschland) [de-DE].lang" },
{ L"el-GR", L".\\lng\\gwLng\\Ελληνικά (Ελλάδα) [el-GR].lang" },
{ L"en-GB", L".\\lng\\gwLng\\English (United Kingdom) [en-GB].lang" },
{ L"es-419", L".\\lng\\gwLng\\Español (América Latina) [es-419].lang" },
{ L"es-ES", L".\\lng\\gwLng\\Español (España) [es-ES].lang" },
{ L"fr-FR", L".\\lng\\gwLng\\Français (France) [fr-FR].lang" },
{ L"hi-IN", L".\\lng\\gwLng\\हिन्दी (भारत) [hi-IN].lang" },
{ L"hu-HU", L".\\lng\\gwLng\\Magyar (Magyarország) [hu-HU].lang" },
{ L"id-ID", L".\\lng\\gwLng\\Bahasa Indonesia (Indonesia) [id-ID].lang" },
{ L"it-IT", L".\\lng\\gwLng\\Italiano (Italia) [it-IT].lang" },
{ L"ja-JP", L".\\lng\\gwLng\\日本語 (日本)[ja-JP].lang" },
{ L"ko-KR", L".\\lng\\gwLng\\한국어 (대한민국) [ko-KR].lang" },
{ L"nl-NL", L".\\lng\\gwLng\\Nederlands (Nederland) [nl-NL].lang" },
{ L"pl-PL", L".\\lng\\gwLng\\Polski (Polska) [pl-PL].lang" },
{ L"pt-BR", L".\\lng\\gwLng\\Português Brasileiro (Brasil) [pt-BR].lang" },
{ L"pt-PT", L".\\lng\\gwLng\\Português (Portugal) [pt-PT].lang" },
{ L"ru-RU", L".\\lng\\gwLng\\Русский (Pоссия) [ru-RU].lang" },
{ L"sk-SK", L".\\lng\\gwLng\\Slovenčina (Slovensko) [sk-SK].lang" },
{ L"sv-SE", L".\\lng\\gwLng\\Svenska (Sverige) [sv-SE].lang" },
{ L"tr-TR", L".\\lng\\gwLng\\Türkçe (Türkiye) [tr-TR].lang" },
{ L"vi-VN", L".\\lng\\gwLng\\Tiếng Việt (Việt Nam) [vi-VN].lang" },
{ L"zh-CN", L".\\lng\\gwLng\\简体中文 (中国) [zh-CN].lang" },
{ L"zh-TW", L".\\lng\\gwLng\\繁體中文 (台灣) [zh-TW].lang" }
};
int grepWinLang_CountOf() {
@ -86,28 +111,40 @@ static void SetMuiLocaleAll(LPCWSTR pszLocaleStr) {
//=============================================================================
//
// SetCurrentLanguage
// SetMuiLanguage
//
void SetCurrentLanguage(LANGID iLanguageID) {
void SetMuiLanguage(const int muiLngIndex) {
int const langIdx = GetMUILanguageIndexByLangID(iLanguageID);
const WCHAR *pLocaleName = MUI_BASE_LNG_ID;
if ((muiLngIndex >= 0) || (muiLngIndex < MuiLanguages_CountOf())) {
pLocaleName = MUI_LanguageDLLs[muiLngIndex].LocaleName;
}
assert((langIdx >= 0) && "Faild to get LangID!");
if (!IsSameLocale(pLocaleName, Globals.CurrentLngLocaleName)) {
if (iLanguageID != Globals.iCurrentLANGID) {
// == MUI_LanguageDLLs[langIdx].LocaleName
StringCchCopy(Globals.CurrentLngLocaleName, COUNTOF(Globals.CurrentLngLocaleName), pLocaleName);
Globals.iCurrentLANGID = iLanguageID; // == MUI_LanguageDLLs[langIdx].LangId
SetMuiLocaleAll(pLocaleName);
const WCHAR *const szLocaleName = MUI_LanguageDLLs[langIdx].szLocaleName;
WCHAR wchLanguagesBuffer[LOCALE_NAME_MAX_LENGTH * 2 + 3];
ZeroMemory(wchLanguagesBuffer, (LOCALE_NAME_MAX_LENGTH * 2 + 3) * sizeof(WCHAR));
StringCchCopy(wchLanguagesBuffer, LOCALE_NAME_MAX_LENGTH, pLocaleName);
size_t const next = StringCchLen(pLocaleName, 0) + 1;
StringCchCopy(&(wchLanguagesBuffer[next]), LOCALE_NAME_MAX_LENGTH, MUI_BASE_LNG_ID);
ULONG cnt = 2;
SetProcessPreferredUILanguages(MUI_LANGUAGE_NAME, wchLanguagesBuffer, &cnt);
SetThreadUILanguage(iLanguageID);
InitMUILanguage(iLanguageID); // MUI Language for common controls
SetMuiLocaleAll(szLocaleName);
// deprecated:
LANGID const langID = GetLangIdByLocaleName(pLocaleName);
SetThreadUILanguage(langID);
InitMUILanguage(langID); // MUI Language for common controls
const WCHAR *const SettingName = L"PreferredLanguageLocaleName";
if (StringCchCompareXIW(Settings2.PreferredLanguageLocaleName, szLocaleName) != 0) {
StringCchCopyW(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), szLocaleName);
if (!IsSameLocale(Settings2.PreferredLanguageLocaleName, pLocaleName)) {
StringCchCopyW(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), pLocaleName);
if (Globals.bCanSaveIniFile) {
if (StringCchCompareXIW(Settings2.PreferredLanguageLocaleName, Defaults2.PreferredLanguageLocaleName) != 0) {
@ -130,33 +167,33 @@ extern prefix_t g_mxSBPostfix[STATUS_SECTOR_COUNT];
MUILANGUAGE MUI_LanguageDLLs[] = {
{ IDS_MUI_LANG_EN_US, L"en-US", L"English (United States)\t\t\t[%s]", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), true, false }, // internal - must be 1st
{ IDS_MUI_LANG_EN_US, L"en-US", L"English (United States)\t\t\t[%s]", true, false },
// ----------------------------
{ IDS_MUI_LANG_AF_ZA, L"af-ZA", L"Afrikaans (Suid-Afrika)\t\t\t[%s]", MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA), false, false },
{ IDS_MUI_LANG_BE_BY, L"be-BY", L"Беларуская (Беларусь)\t\t\t[%s]", MAKELANGID(LANG_BELARUSIAN, SUBLANG_BELARUSIAN_BELARUS), false, false },
{ IDS_MUI_LANG_DE_DE, L"de-DE", L"Deutsch (Deutschland)\t\t\t[%s]", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), false, false },
{ IDS_MUI_LANG_EL_GR, L"el-GR", L"Ελληνικά (Ελλάδα)\t\t\t[%s]", MAKELANGID(LANG_GREEK, SUBLANG_GREEK_GREECE), false, false },
{ IDS_MUI_LANG_EN_GB, L"en-GB", L"English (United Kingdom)\t\t\t[%s]", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), false, false },
{ IDS_MUI_LANG_ES_419, L"es-419", L"Español (América Latina)\t\t\t[%s]", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_LATIN_AMERICA), false, false },
{ IDS_MUI_LANG_ES_ES, L"es-ES", L"Español (España)\t\t\t[%s]", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), false, false },
{ IDS_MUI_LANG_FR_FR, L"fr-FR", L"Français (France)\t\t\t[%s]", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH), false, false },
{ IDS_MUI_LANG_HI_IN, L"hi-IN", L"हिन्दी (भारत)\t\t\t[%s]", MAKELANGID(LANG_HINDI, SUBLANG_HINDI_INDIA), false, false },
{ IDS_MUI_LANG_HU_HU, L"hu-HU", L"Magyar (Magyarország)\t\t\t[%s]", MAKELANGID(LANG_HUNGARIAN, SUBLANG_HUNGARIAN_HUNGARY), false, false },
{ IDS_MUI_LANG_ID_ID, L"id-ID", L"Bahasa Indonesia (Indonesia)\t\t\t[%s]", MAKELANGID(LANG_INDONESIAN, SUBLANG_INDONESIAN_INDONESIA), false, false },
{ IDS_MUI_LANG_IT_IT, L"it-IT", L"Italiano (Italia)\t\t\t[%s]", MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), false, false },
{ IDS_MUI_LANG_JP_JP, L"ja-JP", L"日本語 (日本)\t\t\t[%s]", MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), false, false },
{ IDS_MUI_LANG_KO_KR, L"ko-KR", L"한국어 (대한민국)\t\t\t[%s]", MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), false, false },
{ IDS_MUI_LANG_NL_NL, L"nl-NL", L"Nederlands (Nederland)\t\t\t[%s]", MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), false, false },
{ IDS_MUI_LANG_PL_PL, L"pl-PL", L"Polski (Polska)\t\t\t[%s]", MAKELANGID(LANG_POLISH, SUBLANG_POLISH_POLAND), false, false },
{ IDS_MUI_LANG_PT_BR, L"pt-BR", L"Português Brasileiro (Brasil)\t\t\t[%s]", MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), false, false },
{ IDS_MUI_LANG_PT_PT, L"pt-PT", L"Português (Portugal)\t\t\t[%s]", MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE), false, false },
{ IDS_MUI_LANG_RU_RU, L"ru-RU", L"Русский (Pоссия)\t\t\t[%s]", MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), false, false },
{ IDS_MUI_LANG_SK_SK, L"sk-SK", L"Slovenčina (Slovensko)\t\t\t[%s]", MAKELANGID(LANG_SLOVAK, SUBLANG_SLOVAK_SLOVAKIA), false, false },
{ IDS_MUI_LANG_SV_SE, L"sv-SE", L"Svenska (Sverige)\t\t\t[%s]", MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH), false, false },
{ IDS_MUI_LANG_TR_TR, L"tr-TR", L"Türkçe (Türkiye)\t\t\t[%s]", MAKELANGID(LANG_TURKISH, SUBLANG_TURKISH_TURKEY), false, false },
{ IDS_MUI_LANG_VI_VN, L"vi-VN", L"Tiếng Việt (Việt Nam)\t\t\t[%s]", MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM), false, false },
{ IDS_MUI_LANG_ZH_CN, L"zh-CN", L"简体中文 (中国)\t\t\t[%s]", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), false, false},
{ IDS_MUI_LANG_ZH_TW, L"zh-TW", L"繁體中文 (台灣)\t\t\t[%s]", MAKELANGID(LANG_CHINESE_TRADITIONAL, SUBLANG_CHINESE_TRADITIONAL), false, false}
{ IDS_MUI_LANG_AF_ZA, L"af-ZA", L"Afrikaans (Suid-Afrika)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_BE_BY, L"be-BY", L"Беларуская (Беларусь)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_DE_DE, L"de-DE", L"Deutsch (Deutschland)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_EL_GR, L"el-GR", L"Ελληνικά (Ελλάδα)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_EN_GB, L"en-GB", L"English (United Kingdom)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_ES_419, L"es-419", L"Español (América Latina)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_ES_ES, L"es-ES", L"Español (España)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_FR_FR, L"fr-FR", L"Français (France)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_HI_IN, L"hi-IN", L"हिन्दी (भारत)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_HU_HU, L"hu-HU", L"Magyar (Magyarország)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_ID_ID, L"id-ID", L"Bahasa Indonesia (Indonesia)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_IT_IT, L"it-IT", L"Italiano (Italia)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_JP_JP, L"ja-JP", L"日本語 (日本)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_KO_KR, L"ko-KR", L"한국어 (대한민국)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_NL_NL, L"nl-NL", L"Nederlands (Nederland)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_PL_PL, L"pl-PL", L"Polski (Polska)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_PT_BR, L"pt-BR", L"Português Brasileiro (Brasil)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_PT_PT, L"pt-PT", L"Português (Portugal)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_RU_RU, L"ru-RU", L"Русский (Pоссия)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_SK_SK, L"sk-SK", L"Slovenčina (Slovensko)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_SV_SE, L"sv-SE", L"Svenska (Sverige)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_TR_TR, L"tr-TR", L"Türkçe (Türkiye)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_VI_VN, L"vi-VN", L"Tiếng Việt (Việt Nam)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_ZH_CN, L"zh-CN", L"简体中文 (中国)\t\t\t[%s]", false, false },
{ IDS_MUI_LANG_ZH_TW, L"zh-TW", L"繁體中文 (台灣)\t\t\t[%s]", false, false }
};
//NUM_OF_MUI_LANGUAGES
@ -166,14 +203,15 @@ int MuiLanguages_CountOf()
};
//=============================================================================
//
// GetMUILanguageIndexByLangID
// GetMUILanguageIndexByLocaleName
//
int GetMUILanguageIndexByLangID(LANGID iLanguageID)
int GetMUILanguageIndexByLocaleName(LPCWSTR pLocaleName)
{
for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
if (MUI_LanguageDLLs[lng].LangId == iLanguageID) {
if (StringCchCompareXI(pLocaleName, MUI_LanguageDLLs[lng].LocaleName) == 0) {
return lng;
}
}
@ -187,30 +225,25 @@ int GetMUILanguageIndexByLangID(LANGID iLanguageID)
//
// CheckAvailableLanguages
//
//
static int _CheckAvailableLanguageDLLs()
{
WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH + 1];
WCHAR wchRelPath[MAX_PATH];
WCHAR wchAbsPath[MAX_PATH];
int count = 1;
for (int lng = 1; lng < MuiLanguages_CountOf(); ++lng) {
if (IsValidLocaleName(MUI_LanguageDLLs[lng].szLocaleName)) {
if (IsValidLocaleName(MUI_LanguageDLLs[lng].LocaleName)) {
//WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH];
//if (ResolveLocaleName(MUI_LanguageDLLs[i].szLocaleName, wchLngLocalName, LOCALE_NAME_MAX_LENGTH)) {
// StringCchCopy(MUI_LanguageDLLs[i].szLocaleName, COUNTOF(MUI_LanguageDLLs[i].szLocaleName), wchLngLocalName); // put back resolved name
//}
// get LANGID
DWORD value = MUI_BASE_LNG_ID;
if (GetLocaleInfoEx(MUI_LanguageDLLs[lng].szLocaleName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&value, sizeof(value) / sizeof(WCHAR)) > 0) {
MUI_LanguageDLLs[lng].LangId = (LANGID)value;
#ifdef _DEBUG
if (ResolveLocaleName(MUI_LanguageDLLs[lng].LocaleName, wchLngLocalName, COUNTOF(wchLngLocalName))) {
//~StringCchCopy(MUI_LanguageDLLs[lng].LocaleName, COUNTOF(MUI_LanguageDLLs[lng].LocaleName), wchLngLocalName); // put back resolved name
assert(IsSameLocale(MUI_LanguageDLLs[lng].LocaleName, wchLngLocalName) && "Problem with Locale Name of Language!");
}
#endif
// check for DLL
StringCchPrintf(wchRelPath, COUNTOF(wchRelPath), L"lng/%s/np3lng.dll.mui", MUI_LanguageDLLs[lng].szLocaleName);
StringCchPrintf(wchRelPath, COUNTOF(wchRelPath), L"lng/%s/np3lng.dll.mui", MUI_LanguageDLLs[lng].LocaleName);
PathAbsoluteFromApp(wchRelPath, wchAbsPath, COUNTOF(wchAbsPath), false);
bool const bAvail = PathIsExistingFile(wchAbsPath);
MUI_LanguageDLLs[lng].bHasDLL = bAvail;
@ -263,52 +296,38 @@ static bool _LngStrToMultiLngStr(WCHAR* pLngStr, WCHAR* pLngMultiStr, size_t ln
//=============================================================================
//
// GetUserPreferredLanguage
// ~~~ GetUserDefaultLocaleName(pszPrefLocaleName_out, int cchBuffer);
//
bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID)
bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName_out, int cchBuffer)
{
WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH + 1];
ULONG numLngs = 0;
DWORD cchLngsBuffer = 0;
BOOL hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLngs, NULL, &cchLngsBuffer);
int res = 0;
LANGID lngID = *pLangID;
WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH+1];
if (StrIsNotEmpty(pszPrefLocaleName)) {
res = ResolveLocaleName(pszPrefLocaleName, wchLngLocalName, COUNTOF(wchLngLocalName));
if (res > 0) {
// get LANGID
DWORD value = MUI_BASE_LNG_ID;
res = GetLocaleInfoEx(wchLngLocalName, LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&value, sizeof(value) / sizeof(WCHAR));
if (res > 0) {
lngID = (LANGID)value;
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(wchLngLocalName, COUNTOF(wchLngLocalName), pwszLngsBuffer);
res = 1;
}
FreeMem(pwszLngsBuffer);
}
}
if (res == 0) { // No preferred language defined or retrievable, try to get User UI Language
//~GetUserDefaultLocaleName(pszPrefLocaleName, cchBuffer);
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(wchLngLocalName, COUNTOF(wchLngLocalName), pwszLngsBuffer);
// TODO: deprecated
lngID = LANGIDFROMLCID(LocaleNameToLCID(wchLngLocalName, 0));
res = 1;
}
FreeMem(pwszLngsBuffer);
}
}
if (res == 0) { // last try (deprecated)
lngID = GetUserDefaultUILanguage();
res = LangIDToLocaleName(lngID, wchLngLocalName, COUNTOF(wchLngLocalName));
}
// deprecated:
//~if (res == 0) { // last try
//~ res = LangIDToLocaleName(GetUserDefaultUILanguage(), wchLngLocalName, COUNTOF(wchLngLocalName));
//~}
if (res == 0) { // last try @@@ debug it:
res = GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SNAME, (LPWSTR)wchLngLocalName, COUNTOF(wchLngLocalName));
}
if (res != 0) {
*pLangID = lngID;
StringCchCopy(pszPrefLocaleName, cchBuffer, wchLngLocalName);
StringCchCopy(pszPrefLocaleName_out, cchBuffer, wchLngLocalName);
return true;
}
return false;
@ -318,13 +337,13 @@ bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* p
//=============================================================================
//
// LoadLanguageResources
// return MUI_LanguageDLLs index
//
//
LANGID LoadLanguageResources(LPCWSTR localeName)
{
int LoadLanguageResources(LPCWSTR pLocaleName) {
FreeLanguageResources(); // reset
int const iInternalLngIndex = max_i(0, GetMUILanguageIndexByLangID(MUI_BASE_LNG_ID));
int const iInternalLngIndex = max_i(0, GetMUILanguageIndexByLocaleName(MUI_BASE_LNG_ID));
// 1st check language resources
Globals.iAvailLngCount = _CheckAvailableLanguageDLLs();
@ -333,16 +352,16 @@ LANGID LoadLanguageResources(LPCWSTR localeName)
int iLngIndex = -1;
WCHAR tchAvailLngs[2 * (LOCALE_NAME_MAX_LENGTH + 1)] = { L'\0' };
for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
if (StringCchCompareXIW(MUI_LanguageDLLs[lng].szLocaleName, localeName) == 0) {
if (StringCchCompareXIW(MUI_LanguageDLLs[lng].LocaleName, pLocaleName) == 0) {
if (MUI_LanguageDLLs[lng].bHasDLL && (lng > 0)) {
StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[lng].szLocaleName);
StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[lng].LocaleName);
StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), L";");
}
iLngIndex = lng;
break;
}
}
StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[iInternalLngIndex].szLocaleName); // en-US fallback
StringCchCatW(tchAvailLngs, COUNTOF(tchAvailLngs), MUI_LanguageDLLs[iInternalLngIndex].LocaleName); // en-US fallback
// NOTES:
// an application developer that makes the assumption the fallback list provided by the
@ -379,9 +398,9 @@ LANGID LoadLanguageResources(LPCWSTR localeName)
} else if ((iLngIndex >= 0) && MUI_LanguageDLLs[iLngIndex].bHasDLL) {
Globals.hLngResContainer = LoadMUILibrary(L"lng/np3lng.dll",
MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT,
MUI_LanguageDLLs[iLngIndex].LangId);
LANGID const langID = GetLangIdByLocaleName(MUI_LanguageDLLs[iLngIndex].LocaleName);
Globals.hLngResContainer = LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, langID);
if (Globals.hLngResContainer) {
MUI_LanguageDLLs[iLngIndex].bIsActive = true;
MUI_LanguageDLLs[iInternalLngIndex].bIsActive = false;
@ -398,10 +417,10 @@ LANGID LoadLanguageResources(LPCWSTR localeName)
iLngIndex = iInternalLngIndex;
const WCHAR *const suprMsg = L"MsgPrefLanguageNotAvailable";
InfoBoxLng(MB_ICONWARNING, suprMsg, IDS_WARN_PREF_LNG_NOT_AVAIL, localeName);
InfoBoxLng(MB_ICONWARNING, suprMsg, IDS_WARN_PREF_LNG_NOT_AVAIL, pLocaleName);
int const noMsg = IniFileGetInt(Paths.IniFile, Constants.SectionSuppressedMessages, suprMsg, 0);
if (noMsg && Globals.bCanSaveIniFile) {
IniFileSetString(Paths.IniFile, Constants.Settings2_Section, L"PreferredLanguageLocaleName", MUI_LanguageDLLs[iInternalLngIndex].szLocaleName);
IniFileSetString(Paths.IniFile, Constants.Settings2_Section, L"PreferredLanguageLocaleName", MUI_LanguageDLLs[iInternalLngIndex].LocaleName);
}
}
@ -426,7 +445,7 @@ LANGID LoadLanguageResources(LPCWSTR localeName)
IniFileGetString(Paths.IniFile, StatusBar_Section, L"SectionPostfixes", tchDefaultStrg, tchStatusBar, COUNTOF(tchStatusBar));
ReadStrgsFromCSV(tchStatusBar, g_mxSBPostfix, STATUS_SECTOR_COUNT, MICRO_BUFFER, L"_POFX_");
return MUI_LanguageDLLs[iLngIndex].LangId;
return iLngIndex;
}
@ -437,7 +456,7 @@ LANGID LoadLanguageResources(LPCWSTR localeName)
//
void FreeLanguageResources() {
CloseNonModalDialogs();
int const iInternalLngIndex = GetMUILanguageIndexByLangID(MUI_BASE_LNG_ID);
int const iInternalLngIndex = GetMUILanguageIndexByLocaleName(MUI_BASE_LNG_ID);
if (Globals.hLngResContainer != Globals.hInstance) {
FreeMUILibrary(Globals.hLngResContainer);
Globals.hLngResContainer = Globals.hInstance;
@ -473,8 +492,8 @@ bool InsertLanguageMenu(HMENU hMenuBar) {
WCHAR wchMenuItemStrg[196] = { L'\0' };
for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
if (MUI_LanguageDLLs[lng].bHasDLL) {
StringCchCopy(wchMenuItemFmt, COUNTOF(wchMenuItemFmt), MUI_LanguageDLLs[lng].szMenuItem);
StringCchPrintfW(wchMenuItemStrg, COUNTOF(wchMenuItemStrg), wchMenuItemFmt, MUI_LanguageDLLs[lng].szLocaleName);
StringCchCopy(wchMenuItemFmt, COUNTOF(wchMenuItemFmt), MUI_LanguageDLLs[lng].MenuItem);
StringCchPrintfW(wchMenuItemStrg, COUNTOF(wchMenuItemStrg), wchMenuItemFmt, MUI_LanguageDLLs[lng].LocaleName);
AppendMenu(s_hmenuLanguage, MF_ENABLED | MF_STRING, MUI_LanguageDLLs[lng].rid, wchMenuItemStrg);
}
}
@ -509,10 +528,8 @@ void DynamicLanguageMenuCmd(int cmd) {
DestroyMenu(Globals.hMainMenu);
// desired language
LANGID const desiredLngID = MUI_LanguageDLLs[iLngIdx].LangId;
LPCWSTR desiredLocaleName = MUI_LanguageDLLs[iLngIdx].szLocaleName;
LoadLanguageResources(desiredLocaleName);
SetCurrentLanguage(desiredLngID);
LPCWSTR desiredLocaleName = MUI_LanguageDLLs[iLngIdx].LocaleName;
SetMuiLanguage(LoadLanguageResources(desiredLocaleName));
Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU));
if (!Globals.hMainMenu) {

View File

@ -61,15 +61,22 @@
#include "resource.h"
void SetCurrentLanguage(LANGID iLanguageID);
int GetMUILanguageIndexByLangID(LANGID iLanguageID);
// ============================================================================
// deprecated LCID/LANGID (!) try to eliminate in future
// ----------------------------------------------------------------------------
LANGID GetLangIdByLocaleName(LPCWSTR pLocaleName);
inline int LangIDToLocaleName(const LANGID lngID, LPWSTR lpName_out, size_t cchName) {
LCID const lcid = MAKELCID(lngID, SORT_DEFAULT);
return LCIDToLocaleName(lcid, lpName_out, (int)cchName, 0);
}
// ============================================================================
typedef struct _muilanguage {
UINT rid;
const WCHAR* szLocaleName;
const WCHAR* szMenuItem;
// !!! WARNING: LCID/LANGID is DEPRECATED
LANGID LangId;
const WCHAR* const LocaleName;
const WCHAR* const MenuItem;
bool bHasDLL;
bool bIsActive;
@ -78,19 +85,28 @@ typedef struct _muilanguage {
extern MUILANGUAGE MUI_LanguageDLLs[];
int MuiLanguages_CountOf();
int GetMUILanguageIndexByLocaleName(LPCWSTR pLocaleName);
void SetMuiLanguage(const int muiLngIndex);
inline bool IsSameLocale(const WCHAR *ln1, const WCHAR *ln2) {
return (StringCchCompareXI(ln1, ln2) == 0);
}
// ============================================================================
#if defined(HAVE_DYN_LOAD_LIBS_MUI_LNGS)
bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID);
LANGID LoadLanguageResources(LPCWSTR localeName);
void FreeLanguageResources();
bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName_out, int cchBuffer);
int LoadLanguageResources(LPCWSTR localeName);
void FreeLanguageResources();
bool InsertLanguageMenu(HMENU hMenuBar);
void DynamicLanguageMenuCmd(int cmd);
#endif // HAVE_DYN_LOAD_LIBS_MUI_LNGS
typedef struct _gwlang_ini {
const LANGID lngid;
const WCHAR *const filename;
const WCHAR* const localename;
const WCHAR* const filename;
} grepWinLng_t;
extern grepWinLng_t grepWinLangResName[];
@ -106,12 +122,6 @@ int LoadLngStringW2MB(UINT uID, LPSTR lpBuffer, int nBufferMax);
#define GetLngStringA(id,pb,cb) LoadLngStringA((id),(pb),(cb))
#define GetLngStringW2MB(id,pb,cb) LoadLngStringW2MB((id),(pb),(cb))
// TODO: deprecated
inline int LangIDToLocaleName(const LANGID lngID, LPWSTR lpName_out, size_t cchName) {
LCID const lcid = MAKELCID(lngID, SORT_DEFAULT);
return LCIDToLocaleName(lcid, lpName_out, (int)cchName, 0);
}
#endif //_NP3_MUI_LANGUAGE_H_

View File

@ -646,7 +646,6 @@ static void _InitGlobals()
Globals.pMRUfind = NULL;
Globals.pMRUreplace = NULL;
Globals.iAvailLngCount = 1;
Globals.iCurrentLANGID = WORD_MAX;
Globals.iWrapCol = 80;
Globals.CmdLnFlag_PosParam = false;
@ -876,11 +875,11 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
// ----------------------------------------------------
// MultiLingual
//
#if defined(HAVE_DYN_LOAD_LIBS_MUI_LNGS)
SetCurrentLanguage(LoadLanguageResources(Settings2.PreferredLanguageLocaleName));
#else
SetCurrentLanguage(MUI_BASE_LNG_ID);
#endif
#if defined(HAVE_DYN_LOAD_LIBS_MUI_LNGS)
SetMuiLanguage(LoadLanguageResources(Settings2.PreferredLanguageLocaleName));
#else
SetMuiLanguage(GetMUILanguageIndexByLocaleName(MUI_BASE_LNG_ID));
#endif
// ----------------------------------------------------

View File

@ -377,10 +377,7 @@ typedef struct _globals_t
LPMRULIST pMRUreplace;
FILEVARS fvCurFile;
int iWrapCol;
int iAvailLngCount;
LANGID iCurrentLANGID;
bool CmdLnFlag_PosParam;
int CmdLnFlag_AlwaysOnTop;
int CmdLnFlag_WindowPos;
@ -411,6 +408,7 @@ typedef struct _globals_t
FR_STATES FindReplaceMatchFoundState;
WCHAR CurrentLngLocaleName[LOCALE_NAME_MAX_LENGTH + 1];
WCHAR LightThemeName[SMALL_BUFFER];
WCHAR DarkThemeName[SMALL_BUFFER];