diff options
Diffstat (limited to '')
-rw-r--r-- | src/dutil/locutil.cpp | 29 |
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 |
54 | typedef WINBASEAPI BOOL (WINAPI *GET_THREAD_PREFERRED_UI_LANGUAGES) ( | 54 | typedef 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 | |||
71 | extern "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."); |