From a0f0138c2a322b8ef8b499fdbdc6603b5010d9ba Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@sloboda.ru>
Date: Thu, 3 Aug 2000 00:24:33 +0000
Subject: [PATCH] LOCALE_NOUSEROVERRIDE means: do not get user redefined
 settings from the registry. Instead, use system default values.

---
 include/winnls.h |  3 +++
 ole/ole2nls.c    | 17 +++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/include/winnls.h b/include/winnls.h
index 62a002d86cf..e88b9dba9ac 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -165,6 +165,9 @@
 #define PRIMARYLANGID(l)	((WORD)(l) & 0x3ff)
 #define SUBLANGID(l)		((WORD)(l) >> 10)
 
+#define LANGIDFROMLCID(lcid)	((WORD)(lcid))
+#define SORTIDFROMLCID(lcid)	((WORD)((((DWORD)(lcid)) >> 16) & 0x0f))
+
 #define LANG_SYSTEM_DEFAULT	(MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
 #define LANG_USER_DEFAULT	(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
 #define LOCALE_SYSTEM_DEFAULT	(MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
diff --git a/ole/ole2nls.c b/ole/ole2nls.c
index ba670a126c1..8463798a925 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -289,6 +289,7 @@ INT WINAPI GetLocaleInfoA(LCID lcid,LCTYPE LCType,LPSTR buf,INT len)
     char    *pacKey;
     char    acBuffer[128];
     DWORD   dwBufferSize=128;
+    BOOL NoUserOverride;
 
   TRACE("(lcid=0x%lx,lctype=0x%lx,%p,%x)\n",lcid,LCType,buf,len);
 
@@ -297,7 +298,7 @@ INT WINAPI GetLocaleInfoA(LCID lcid,LCTYPE LCType,LPSTR buf,INT len)
 		return 0;
 	}
 
-	if (lcid == LOCALE_NEUTRAL || lcid == LANG_SYSTEM_DEFAULT || (LCType & LOCALE_NOUSEROVERRIDE) )
+	if (lcid == LOCALE_NEUTRAL || lcid == LANG_SYSTEM_DEFAULT)
 	{
             lcid = GetSystemDefaultLCID();
 	} 
@@ -305,12 +306,16 @@ INT WINAPI GetLocaleInfoA(LCID lcid,LCTYPE LCType,LPSTR buf,INT len)
 	{
             lcid = GetUserDefaultLCID();
 	}
+
+    /* LOCALE_NOUSEROVERRIDE means: do not get user redefined settings
+       from the registry. Instead, use system default values. */
+    NoUserOverride = (LCType & LOCALE_NOUSEROVERRIDE) != 0;
+
 	LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
 
     /* First, check if it's in the registry. */
     /* All user customized values are stored in the registry by SetLocaleInfo */
-
-    if ( (pacKey = GetLocaleSubkeyName(LCType)) )
+    if ( !NoUserOverride && (pacKey = GetLocaleSubkeyName(LCType)) )
     {
         char    acRealKey[128];
         HKEY    hKey;
@@ -336,7 +341,7 @@ INT WINAPI GetLocaleInfoA(LCID lcid,LCTYPE LCType,LPSTR buf,INT len)
 	int res_size;
 
 	/* check if language is registered in the kernel32 resources */
-	if((res_size = NLS_LoadStringExW(GetModuleHandleA("KERNEL32"), LOWORD(lcid),
+	if((res_size = NLS_LoadStringExW(GetModuleHandleA("KERNEL32"), LANGIDFROMLCID(lcid),
 		LCType, wcBuffer, sizeof(wcBuffer)/sizeof(wcBuffer[0])))) {
 	    WideCharToMultiByte(CP_ACP, 0, wcBuffer, res_size, acBuffer, dwBufferSize, NULL, NULL);
 	    retString = acBuffer;
@@ -1278,7 +1283,7 @@ DWORD WINAPI VerLanguageNameA( UINT wLang, LPSTR szLang, UINT nSize )
     if(!szLang)
 	return 0;
 
-    return GetLocaleInfoA(MAKELCID(wLang, SORT_DEFAULT)
, LOCALE_SENGLANGUAGE, szLang, nSize);
+    return GetLocaleInfoA(MAKELCID(wLang, SORT_DEFAULT), LOCALE_SENGLANGUAGE, szLang, nSize);
 }
 
 /***********************************************************************
@@ -1289,7 +1294,7 @@ DWORD WINAPI VerLanguageNameW( UINT wLang, LPWSTR szLang, UINT nSize )
     if(!szLang)
 	return 0;
 
-    return GetLocaleInfoW(MAKELCID(wLang, SORT_DEFAULT)
, LOCALE_SENGLANGUAGE, szLang, nSize);
+    return GetLocaleInfoW(MAKELCID(wLang, SORT_DEFAULT), LOCALE_SENGLANGUAGE, szLang, nSize);
 }
 
  
-- 
GitLab