为何SetThreadPreferredUILanguages()无法修改所有固有Shell项属性语言?
获取指定语言的文件属性文本问题
我需要获取文件属性的特定语言文本,此问题关联此前的提问《如何获取不同语言的文件属性?》。多数文件文本属性为读写属性,不受当前线程语言影响,但部分只读/固有属性(如已知文件夹名称、PKEY_ItemType、PKEY_ItemTypeText等)会受语言影响。
我的PC安装了英语和泰语,系统默认语言为英语。修改线程语言后调用IPropertyStore::GetValue()获取属性值时,有时返回对应语言的正确文本,有时则不。我希望使用IPropertyStore::GetValue()或替代方法,获取线程当前语言对应的文本。
以下是基于Raymond Chen博客《临时修改线程首选UI语言的正确方式?》及Jeaninez - MSFT建议编写的测试程序,以及标注了正误的输出结果:
#include <Windows.h> #include <iostream> #include <objbase.h> #include <propkey.h> #include <Shlobj.h> void ShowProperty(const WCHAR *pczDesc, LPITEMIDLIST pidlItem, const PROPERTYKEY& infoKey) { IPropertyStore *pIStore; PROPVARIANT propValue; if(SHGetPropertyStoreFromIDList(pidlItem, GPS_DEFAULT, IID_PPV_ARGS(&pIStore)) == S_OK) { PropVariantInit(&propValue); if(pIStore->GetValue(infoKey, &propValue) == S_OK) { wprintf(L"%s<%s>\n", pczDesc, propValue.bstrVal); PropVariantClear(&propValue); } pIStore->Release(); } } int main() { const WCHAR *pczLang1; const WCHAR *pczLang2; LPITEMIDLIST pidlSystem32; LPITEMIDLIST pidlKnownFolder; ULONG nNumLanguages; CoInitialize(nullptr); pczLang1 = L"en-GB"; // English pczLang2 = L"th-TH"; // Thai ULONG cLanguages; // From Raymond Chen's blog "What is the correct way of PZZWSTR pszzPrevLanguages = NULL; // temporarily changing a thread's preferred UI language?" ULONG cchPrevLanguages = 0; // if((pidlSystem32 = ILCreateFromPath(L"C:\\Windows\\System32")) != NULL) { if(SHGetKnownFolderIDList(FOLDERID_Music, KF_FLAG_DEFAULT, NULL, &pidlKnownFolder) == S_OK) { wprintf(L"\n------- %s ------------\n", pczLang2); nNumLanguages = 1; SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, pczLang1, &nNumLanguages); // error checking elided for simplicity // From blog. // Get the current thread preferred UI languages // GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME | // MUI_THREAD_LANGUAGES, // &cLanguages, NULL, // &cchPrevLanguages); // pszzPrevLanguages = new WCHAR[cchPrevLanguages]; // GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME | // MUI_THREAD_LANGUAGES, // &cLanguages, // pszzPrevLanguages, // &cchPrevLanguages); // nNumLanguages = 1; SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, pczLang2, &nNumLanguages); ShowProperty(L"System32 folder name: ", pidlSystem32, PKEY_ItemNameDisplay); ShowProperty(L"System32 folder type: ", pidlSystem32, PKEY_ItemType); ShowProperty(L"System32 folder type text: ", pidlSystem32, PKEY_ItemTypeText); ShowProperty(L"Known folder name: ", pidlKnownFolder, PKEY_ItemNameDisplay); ShowProperty(L"Known folder type: ", pidlKnownFolder, PKEY_ItemType); ShowProperty(L"Known folder type text: ", pidlKnownFolder, PKEY_ItemTypeText); wprintf(L"\n------- %s ------------\n", pszzPrevLanguages); // Restore the original thread preferred UI languages // From blog. SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, // pszzPrevLanguages, // &cLanguages); // delete[] pszzPrevLanguages; // ShowProperty(L"System32 folder name: ", pidlSystem32, PKEY_ItemNameDisplay); ShowProperty(L"System32 folder type: ", pidlSystem32, PKEY_ItemType); ShowProperty(L"System32 folder type text: ", pidlSystem32, PKEY_ItemTypeText); ShowProperty(L"Known folder name: ", pidlKnownFolder, PKEY_ItemNameDisplay); ShowProperty(L"Known folder type: ", pidlKnownFolder, PKEY_ItemType); ShowProperty(L"Known folder type text: ", pidlKnownFolder, PKEY_ItemTypeText); ILFree(pidlKnownFolder); } ILFree(pidlSystem32); } CoUninitialize(); return 0; }
输出结果:
------- th-TH ------------ System32 folder name: <System32> 正确 System32 folder type: <Directory> 错误 System32 folder type text: <โฟลเดอร์แฟ้ม> 正确 Known folder name: <เพลง> 正确 Known folder type: <Directory> 错误 Known folder type text: <โฟลเดอร์ระบบ> 正确 ------- en-GB ------------ System32 folder name: <System32> 正确 System32 folder type: <Directory> 正确 System32 folder type text: <โฟลเดอร์แฟ้ม> 错误 Known folder name: <เพลง> 错误 Known folder type: <Directory> 正确 Known folder type text: <System Folder> 正确
内容的提问来源于stack exchange,提问作者davecupper
相关产品推荐
相关产品推荐

