diff --git a/Versions/build.txt b/Versions/build.txt
index c98e88a99..091d5b0a2 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-2713
+2714
diff --git a/doc/KeyboardShortcuts.txt b/doc/KeyboardShortcuts.txt
index 7a9472615..ea5790cb6 100644
--- a/doc/KeyboardShortcuts.txt
+++ b/doc/KeyboardShortcuts.txt
@@ -19,7 +19,7 @@ Keyboard Shortcuts for Notepad3
Tools
Alt+N Open document in new window.
- Alt+Shit+N Open new empty window.
+ Alt+Shift+N Open new empty window.
Ctrl+M Run MiniPath file browser plugin.
Ctrl+L Launch document.
Alt+L Open with.
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index 074ca286a..2d2b64984 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3 BETA
diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp
index 19eaa26d6..359d0265b 100644
--- a/src/Config/Config.cpp
+++ b/src/Config/Config.cpp
@@ -26,6 +26,7 @@ extern "C" {
#include "Dialogs.h"
#include "Encoding.h"
#include "Notepad3.h"
+#include "MuiLanguage.h"
#include "resource.h"
}
@@ -696,10 +697,16 @@ void LoadSettings()
// --------------------------------------------------------------------------
+ LANGID lngID = 0;
Defaults2.PreferredLanguageLocaleName[0] = L'\0';
+ GetUserPreferredLanguage(Defaults2.PreferredLanguageLocaleName, COUNTOF(Defaults2.PreferredLanguageLocaleName), &lngID);
+
IniSectionGetString(IniSecSettings2, L"PreferredLanguageLocaleName", Defaults2.PreferredLanguageLocaleName,
Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName));
- //_wsetlocale(LC_COLLATE, Settings2.PreferredLanguageLocaleName);
+
+ StringCchCopyW(Globals.InitialPreferredLanguage, COUNTOF(Globals.InitialPreferredLanguage), Settings2.PreferredLanguageLocaleName);
+
+ // --------------------------------------------------------------------------
StringCchCopyW(Defaults2.DefaultExtension, COUNTOF(Defaults2.DefaultExtension), L"txt");
IniSectionGetString(IniSecSettings2, L"DefaultExtension", Defaults2.DefaultExtension,
@@ -901,20 +908,13 @@ void LoadSettings()
Defaults.EFR_Data.fuFlags = 0;
Settings.EFR_Data.fuFlags = (UINT)IniSectionGetInt(IniSecSettings, L"efrData_fuFlags", (int)Defaults.EFR_Data.fuFlags);
- Defaults.OpenWithDir[0] = L'\0';
- if (!IniSectionGetString(IniSecSettings, L"OpenWithDir", Defaults.OpenWithDir, Settings.OpenWithDir, COUNTOF(Settings.OpenWithDir))) {
- GetKnownFolderPath(FOLDERID_Desktop, Settings.OpenWithDir, COUNTOF(Settings.OpenWithDir));
- }
- else {
+ GetKnownFolderPath(FOLDERID_Desktop, Defaults.OpenWithDir, COUNTOF(Defaults.OpenWithDir));
+ if (IniSectionGetString(IniSecSettings, L"OpenWithDir", Defaults.OpenWithDir, Settings.OpenWithDir, COUNTOF(Settings.OpenWithDir))) {
PathAbsoluteFromApp(Settings.OpenWithDir, NULL, COUNTOF(Settings.OpenWithDir), true);
}
- Defaults.FavoritesDir[0] = L'\0';
- //StringCchCopyW(Defaults.FavoritesDir, COUNTOF(Defaults.FavoritesDir), L"%USERPROFILE%");
- if (!IniSectionGetString(IniSecSettings, L"Favorites", Defaults.FavoritesDir, Settings.FavoritesDir, COUNTOF(Settings.FavoritesDir))) {
- GetKnownFolderPath(FOLDERID_Favorites, Settings.FavoritesDir, COUNTOF(Settings.FavoritesDir));
- }
- else {
+ GetKnownFolderPath(FOLDERID_Favorites, Defaults.FavoritesDir, COUNTOF(Defaults.FavoritesDir));
+ if (IniSectionGetString(IniSecSettings, L"Favorites", Defaults.FavoritesDir, Settings.FavoritesDir, COUNTOF(Settings.FavoritesDir))) {
PathAbsoluteFromApp(Settings.FavoritesDir, NULL, COUNTOF(Settings.FavoritesDir), true);
}
@@ -1494,15 +1494,7 @@ bool SaveSettings(bool bSaveSettingsNow)
SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, CustomSchemesDlgSizeY);
SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, CustomSchemesDlgPosX);
SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, CustomSchemesDlgPosY);
-
-
- // --------------------------------------------------------------------------
- const WCHAR* const IniSecSettings2 = Constants.Settings2_Section;
- // --------------------------------------------------------------------------
-
- IniSectionSetString(IniSecSettings2, L"DefaultWindowPosition", Settings2.DefaultWindowPosition);
- IniSectionSetString(IniSecSettings2, L"PreferredLanguageLocaleName", Settings2.PreferredLanguageLocaleName);
-
+
// --------------------------------------------------------------------------
const WCHAR* const IniSecWindow = Constants.Window_Section;
// --------------------------------------------------------------------------
diff --git a/src/MuiLanguage.c b/src/MuiLanguage.c
index 2afd0c7f0..083cf741b 100644
--- a/src/MuiLanguage.c
+++ b/src/MuiLanguage.c
@@ -140,7 +140,7 @@ static bool _LngStrToMultiLngStr(WCHAR* pLngStr, WCHAR* pLngMultiStr, size_t ln
// _GetUserPreferredLanguage
//
//
-static bool _GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID)
+bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID)
{
int res = 0;
LANGID lngID = *pLangID;
@@ -193,6 +193,33 @@ static bool _GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, L
}
+//=============================================================================
+//
+// ChangePreferredLanguage
+//
+void SetPreferredLanguage(LANGID iPreferredLanguageID)
+{
+ Globals.iPrefLANGID = 0;
+ const WCHAR* szLocaleName = NULL;
+ for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
+ if (MUI_LanguageDLLs[lng].LangId == iPreferredLanguageID) {
+ szLocaleName = MUI_LanguageDLLs[lng].szLocaleName;
+ Globals.iPrefLANGID = iPreferredLanguageID;
+ }
+ }
+ if (szLocaleName) {
+ if (StringCchCompareXIW(Settings2.PreferredLanguageLocaleName, szLocaleName) != 0) {
+ StringCchCopyW(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), szLocaleName);
+ if (StringCchCompareXIW(Settings2.PreferredLanguageLocaleName, Defaults2.PreferredLanguageLocaleName) != 0) {
+ IniFileSetString(Globals.IniFile, Constants.Settings2_Section, L"PreferredLanguageLocaleName", Settings2.PreferredLanguageLocaleName);
+ }
+ else {
+ IniFileDelete(Globals.IniFile, Constants.Settings2_Section, L"PreferredLanguageLocaleName", false);
+ }
+ }
+ }
+}
+
//=============================================================================
//
@@ -204,17 +231,6 @@ LANGID LoadLanguageResources()
// 1st check language resources
Globals.iAvailLngCount = _CheckAvailableLanguageDLLs();
- LANGID languageID = MUI_LanguageDLLs[0].LangId;
-
- WCHAR wchLngLocalName[LOCALE_NAME_MAX_LENGTH];
- StringCchCopy(wchLngLocalName, COUNTOF(wchLngLocalName), Settings2.PreferredLanguageLocaleName);
-
- if (_GetUserPreferredLanguage(wchLngLocalName, COUNTOF(wchLngLocalName), &languageID)) {
- // push-back (corrected) name found
- StringCchCopy(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), wchLngLocalName);
- //_wsetlocale(LC_COLLATE, Settings2.PreferredLanguageLocaleName);
- }
-
// set the appropriate fallback list
int iPrefLngIndex = -1;
WCHAR tchAvailLngs[2 * (LOCALE_NAME_MAX_LENGTH + 1)] = { L'\0' };
@@ -255,26 +271,29 @@ LANGID LoadLanguageResources()
HINSTANCE _hLangResourceContainer = NULL;
Globals.bPrefLngNotAvail = (iPrefLngIndex < 0);
+ int iUsedLngId = (iPrefLngIndex >= 0) ? iPrefLngIndex : 0;
if ((iPrefLngIndex >= 0) && MUI_LanguageDLLs[iPrefLngIndex].bHasDLL) {
_hLangResourceContainer = (iPrefLngIndex == 0) ? Globals.hInstance :
- LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, languageID);
+ LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, MUI_LanguageDLLs[iPrefLngIndex].LangId);
if (_hLangResourceContainer) {
MUI_LanguageDLLs[0].bIsActive = false;
MUI_LanguageDLLs[iPrefLngIndex].bIsActive = true;
+ iUsedLngId = iPrefLngIndex;
}
}
+
if (!_hLangResourceContainer) {
// fallback to ENGLISH_US
//MsgBoxLastError(L"LoadMUILibrary", 0);
- Globals.bPrefLngNotAvail = (languageID != MUI_LanguageDLLs[0].LangId);
- languageID = MUI_LanguageDLLs[0].LangId;
+ Globals.bPrefLngNotAvail = (iPrefLngIndex != 0);
_hLangResourceContainer = Globals.hInstance;
MUI_LanguageDLLs[0].bIsActive = true;
+ iUsedLngId = 0;
}
Globals.hLngResContainer = _hLangResourceContainer;
- SetThreadUILanguage(languageID);
+ SetThreadUILanguage(MUI_LanguageDLLs[iUsedLngId].LangId);
// === update language dependent items ===
@@ -298,7 +317,7 @@ LANGID LoadLanguageResources()
IniSectionGetString(StatusBar_Section, L"SectionPostfixes", tchDefaultStrg, tchStatusBar, COUNTOF(tchStatusBar));
ReadStrgsFromCSV(tchStatusBar, g_mxSBPostfix, STATUS_SECTOR_COUNT, MICRO_BUFFER, L"_POFX_");
- return languageID;
+ return MUI_LanguageDLLs[iUsedLngId].LangId;
}
diff --git a/src/MuiLanguage.h b/src/MuiLanguage.h
index 1310debde..e0c7c9660 100644
--- a/src/MuiLanguage.h
+++ b/src/MuiLanguage.h
@@ -33,6 +33,8 @@ typedef struct _muilanguage
extern MUILANGUAGE MUI_LanguageDLLs[];
int MuiLanguages_CountOf();
+bool GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, LANGID* pLangID);
+void SetPreferredLanguage(LANGID iPreferredLanguageID);
LANGID LoadLanguageResources();
void FreeLanguageResources();
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 3ee7d28c3..9ee147ec6 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -867,7 +867,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
// ----------------------------------------------------
// MultiLingual
//
- Globals.iPrefLANGID = LoadLanguageResources();
+ SetPreferredLanguage(LoadLanguageResources());
// ----------------------------------------------------
@@ -974,7 +974,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
SetTimer(hwnd, IDT_TIMER_MRKALL, USER_TIMER_MINIMUM, (TIMERPROC)MQ_ExecuteNext);
if (Globals.bPrefLngNotAvail) {
- InfoBoxLng(MB_ICONWARNING, L"MsgPrefLanguageNotAvailable", IDS_WARN_PREF_LNG_NOT_AVAIL, Settings2.PreferredLanguageLocaleName);
+ InfoBoxLng(MB_ICONWARNING, L"MsgPrefLanguageNotAvailable", IDS_WARN_PREF_LNG_NOT_AVAIL, Globals.InitialPreferredLanguage);
}
MSG msg;
@@ -3535,14 +3535,18 @@ static void _DynamicLanguageMenuCmd(int cmd)
{
CloseNonModalDialogs();
- StringCchCopyW(Settings2.PreferredLanguageLocaleName, COUNTOF(Settings2.PreferredLanguageLocaleName), MUI_LanguageDLLs[iLngIdx].szLocaleName);
-
LockWindowUpdate(Globals.hwndMain); // prevent intermediate redrawing
DestroyMenu(Globals.hMainMenu);
- Globals.iPrefLANGID = MUI_LanguageDLLs[iLngIdx].LangId;
+
+ // desired language
+ SetPreferredLanguage(MUI_LanguageDLLs[iLngIdx].LangId);
+
FreeLanguageResources();
- Globals.iPrefLANGID = LoadLanguageResources();
+
+ // change to available (fallback en-US)
+ SetPreferredLanguage(LoadLanguageResources());
+
Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU));
if (!Globals.hMainMenu) {
MsgBoxLastError(L"LoadMenu()", 0);
diff --git a/src/TypeDefs.h b/src/TypeDefs.h
index fa6b250bc..289ce59ea 100644
--- a/src/TypeDefs.h
+++ b/src/TypeDefs.h
@@ -355,6 +355,7 @@ typedef struct _globals_t
unsigned idxSelectedTheme;
WCHAR SelectedThemeName[128];
+ WCHAR InitialPreferredLanguage[LOCALE_NAME_MAX_LENGTH + 1];
FR_STATES FindReplaceMatchFoundState;
@@ -534,7 +535,7 @@ typedef struct _settings2_t
//~float ReliableCEDConfidenceMapping; // = 0.85f;
//~float UnReliableCEDConfidenceMapping; //= 0.20f;
- WCHAR PreferredLanguageLocaleName[LOCALE_NAME_MAX_LENGTH+1];
+ WCHAR PreferredLanguageLocaleName[LOCALE_NAME_MAX_LENGTH + 1];
WCHAR DefaultExtension[64];
WCHAR DefaultDirectory[MAX_PATH];
WCHAR FileDlgFilters[XHUGE_BUFFER];
diff --git a/src/VersionEx.h b/src/VersionEx.h
index d71bccebd..ce7e51eb0 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -8,8 +8,8 @@
#define SAPPNAME "Notepad3"
#define VERSION_MAJOR 5
#define VERSION_MINOR 20
-#define VERSION_REV 124
-#define VERSION_BUILD 2713
+#define VERSION_REV 125
+#define VERSION_BUILD 2714
#define SCINTILLA_VER 430
#define ONIGURUMA_REGEX_VER 6.9.4
#define UCHARDET_VER 2018.09.27