aboutsummaryrefslogtreecommitdiff
path: root/src/dutil/locutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/dutil/locutil.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/dutil/locutil.cpp b/src/dutil/locutil.cpp
index c4567c03..43e1bb5b 100644
--- a/src/dutil/locutil.cpp
+++ b/src/dutil/locutil.cpp
@@ -51,7 +51,7 @@ static HRESULT ParseWxlControl(
51#ifndef MUI_MERGE_SYSTEM_FALLBACK 51#ifndef MUI_MERGE_SYSTEM_FALLBACK
52#define MUI_MERGE_SYSTEM_FALLBACK 0x10 // GetThreadPreferredUILanguages merges in parent and base languages 52#define MUI_MERGE_SYSTEM_FALLBACK 0x10 // GetThreadPreferredUILanguages merges in parent and base languages
53#endif 53#endif
54typedef WINBASEAPI BOOL (WINAPI *GET_THREAD_PREFERRED_UI_LANGUAGES) ( 54typedef WINBASEAPI BOOL (WINAPI *PFN_GET_THREAD_PREFERRED_UI_LANGUAGES) (
55 __in DWORD dwFlags, 55 __in DWORD dwFlags,
56 __out PULONG pulNumLanguages, 56 __out PULONG pulNumLanguages,
57 __out_ecount_opt(*pcchLanguagesBuffer) PZZWSTR pwszLanguagesBuffer, 57 __out_ecount_opt(*pcchLanguagesBuffer) PZZWSTR pwszLanguagesBuffer,
@@ -65,14 +65,25 @@ extern "C" HRESULT DAPI LocProbeForFile(
65 __inout LPWSTR* psczPath 65 __inout LPWSTR* psczPath
66 ) 66 )
67{ 67{
68 return LocProbeForFileEx(wzBasePath, wzLocFileName, wzLanguage, psczPath, FALSE);
69}
70
71extern "C" HRESULT DAPI LocProbeForFileEx(
72 __in_z LPCWSTR wzBasePath,
73 __in_z LPCWSTR wzLocFileName,
74 __in_z_opt LPCWSTR wzLanguage,
75 __inout LPWSTR* psczPath,
76 __in BOOL fUseUILanguage
77 )
78{
68 HRESULT hr = S_OK; 79 HRESULT hr = S_OK;
69 LPWSTR sczProbePath = NULL; 80 LPWSTR sczProbePath = NULL;
70 LANGID langid = 0; 81 LANGID langid = 0;
71 LPWSTR sczLangIdFile = NULL; 82 LPWSTR sczLangIdFile = NULL;
72 LPWSTR sczLangsBuff = NULL; 83 LPWSTR sczLangsBuff = NULL;
73 GET_THREAD_PREFERRED_UI_LANGUAGES pvfnGetThreadPreferredUILanguages = 84 PFN_GET_THREAD_PREFERRED_UI_LANGUAGES pfnGetThreadPreferredUILanguages =
74 reinterpret_cast<GET_THREAD_PREFERRED_UI_LANGUAGES>( 85 reinterpret_cast<PFN_GET_THREAD_PREFERRED_UI_LANGUAGES>(
75 GetProcAddress(GetModuleHandle("Kernel32.dll"), "GetThreadPreferredUILanguages")); 86 ::GetProcAddress(::GetModuleHandle("Kernel32.dll"), "GetThreadPreferredUILanguages"));
76 87
77 // If a language was specified, look for a loc file in that as a directory. 88 // If a language was specified, look for a loc file in that as a directory.
78 if (wzLanguage && *wzLanguage) 89 if (wzLanguage && *wzLanguage)
@@ -89,12 +100,12 @@ extern "C" HRESULT DAPI LocProbeForFile(
89 } 100 }
90 } 101 }
91 102
92 if (pvfnGetThreadPreferredUILanguages) 103 if (fUseUILanguage && pfnGetThreadPreferredUILanguages)
93 { 104 {
94 ULONG nLangs; 105 ULONG nLangs = 0;
95 ULONG cchLangs = 0; 106 ULONG cchLangs = 0;
96 DWORD dwFlags = MUI_LANGUAGE_ID | MUI_MERGE_USER_FALLBACK | MUI_MERGE_SYSTEM_FALLBACK; 107 DWORD dwFlags = MUI_LANGUAGE_ID | MUI_MERGE_USER_FALLBACK | MUI_MERGE_SYSTEM_FALLBACK;
97 if (!(*pvfnGetThreadPreferredUILanguages)(dwFlags, &nLangs, NULL, &cchLangs)) 108 if (!(*pfnGetThreadPreferredUILanguages)(dwFlags, &nLangs, NULL, &cchLangs))
98 { 109 {
99 LocExitWithLastError(hr, "GetThreadPreferredUILanguages failed to return buffer size."); 110 LocExitWithLastError(hr, "GetThreadPreferredUILanguages failed to return buffer size.");
100 } 111 }
@@ -103,7 +114,7 @@ extern "C" HRESULT DAPI LocProbeForFile(
103 LocExitOnFailure(hr, "Failed to allocate buffer for languages"); 114 LocExitOnFailure(hr, "Failed to allocate buffer for languages");
104 115
105 nLangs = 0; 116 nLangs = 0;
106 if (!(*pvfnGetThreadPreferredUILanguages)(dwFlags, &nLangs, sczLangsBuff, &cchLangs)) 117 if (!(*pfnGetThreadPreferredUILanguages)(dwFlags, &nLangs, sczLangsBuff, &cchLangs))
107 { 118 {
108 LocExitWithLastError(hr, "GetThreadPreferredUILanguages failed to return language list."); 119 LocExitWithLastError(hr, "GetThreadPreferredUILanguages failed to return language list.");
109 } 120 }
@@ -129,7 +140,7 @@ extern "C" HRESULT DAPI LocProbeForFile(
129 } 140 }
130 } 141 }
131 142
132 langid = ::GetUserDefaultUILanguage(); 143 langid = fUseUILanguage ? ::GetUserDefaultUILanguage() : ::GetUserDefaultLangID();
133 144
134 hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName); 145 hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName);
135 LocExitOnFailure(hr, "Failed to format user langid."); 146 LocExitOnFailure(hr, "Failed to format user langid.");