Функция для получения локализованного пути?

Windows 7 (и, возможно, Windows Vista) отображают локализованные имена папок, используя запись LocalizedResourceName в файле desktop.ini. Для моей папки Documents это выглядит так

[.ShellClassInfo]
LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21770
IconResource=%SystemRoot%\system32\imageres.dll,-112
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=-235

(см. этот вопрос)

Таким образом, проводник отображает путь «C:\Users\Username\Documents» как «C:\Benutzer\Username\Documente» в немецкой Windows.

Интересно, есть ли какая-нибудь встроенная функция оболочки для автоматического получения этого локализованного имени или, что еще лучше, преобразования всего пути в его локализованную форму (лучше всего что-нибудь в .NET)?

Это еще более интересно, поскольку запись LocalizedResourceName задокументирована только для Windows CE (см. здесь ).

Спасибо

Мартин


person MartinStettner    schedule 14.01.2011    source источник


Ответы (2)


SHGetLocalizedName(). Пример PInvoke есть в блоге Майкла Каплана.

person Anders    schedule 14.01.2011

Я почти уверен, что нет функции для преобразования пути в его локализованную форму, потому что, когда вы видите более широкую картину, это не имеет смысла. Если у вас есть перемещаемый профиль, может даже не быть папки «Пользователи» или «Benutzer», потому что все они будут там, где их поместил администратор сервера.

Также возникает вопрос о том, как вы вызываете эту функцию. Ради аргумента мы просто предположим, что вы вызываете его с настройками по умолчанию для английского языка США. Если вы скажете «дайте мне немецкую локализованную версию c:\Users\Bob», Vista и Windows 7 с этим справятся, но XP не знает о папке «Users». Так что это сломается без обратного патча, который вы не можете гарантировать, что он будет установлен.

Обычно Microsoft рекомендует даже не беспокоиться о левой половине пути. Вместо этого вы просто должны использовать Environment.GetFolderPath() и передать это одно из перечислений SpecialFolder. Все, что находится после части специальной папки, вы можете определить и создать, но это все. В вашем коде должно быть сказано: «Относительно рабочего стола создайте папку с именем Bob». Что бы это ни означало, никогда не следует сохранять, потому что этот путь может когда-нибудь измениться,

person Chris Haas    schedule 14.01.2011
comment
Я думаю, вы неправильно поняли мой вопрос (вероятно, моя вина): Если я показываю результат GetFolderPath (которым я, конечно, пользуюсь) своему пользователю, он путается, потому что эта функция возвращает C:/User/Name/Documents (даже в немецких системах), когда он видит C:/Benutzer/Name/Documente в своем проводнике. Эта автоматическая локализация выполняется оболочкой с использованием записей в файле desktop.ini, и я просил какие-то средства, чтобы сделать это самостоятельно. - person MartinStettner; 15.01.2011