Найти локализованные строки Windows - PullRequest
5 голосов
/ 23 марта 2010

Мне нужно найти несколько строк, которые использует текущая версия Windows. Например, когда я создаю новую папку, она первоначально называется «Новая папка» в английской Vista. Мне нужно программно найти, как будет называться эта папка на любом языке и версии Windows, на которой я могу работать.

У кого-нибудь есть идеи, как это сделать?

Спасибо, Моринар, я тоже наткнулся на эту статью. К сожалению, stringID не выглядит постоянным - на моей Vista он равен 30396, что отличается от того, что они показывают для XP. Так что, похоже, MS не держал его стабильным.

РЕДАКТИРОВАТЬ: Похоже, это невозможно ...? Это приложение работает на компьютерах в Германии, Нидерландах, Франции, Испании, Бразилии, Мексике, Вьетнаме, Тайване, Китае, Японии, Южной Корее, Индии, Израиле, Венгрии ... Вы поняли идею. Установка всех различных языковых пакетов и выяснение, что такое «Новая папка» на каждом языке, займет очень много времени.

Возможно, лучший вариант - по умолчанию установить «Новая папка» и заставить пользователя изменить это значение, если он этого захочет. Я просто предпочитаю, чтобы программное обеспечение выяснило как можно больше и избавило пользователя от настройки _yet_another_setting _.

Ответы [ 4 ]

7 голосов
/ 07 апреля 2010

Бесстыдно взято из http://blogs.msdn.com/oldnewthing/archive/2004/01/30/65013.aspx. Это в основном правильно, но если есть строка ресурса "Новая папка что-то еще", она будет соответствовать этому:

LPCWSTR FindStringResourceEx(HINSTANCE hinst,
    UINT uId, UINT langId)
{
    // Convert the string ID into a bundle number
    LPCWSTR pwsz = NULL;
    HRSRC hrsrc = FindResourceEx(hinst, RT_STRING,
        MAKEINTRESOURCE(uId / 16 + 1),
        langId);
    if (hrsrc) {
        HGLOBAL hglob = LoadResource(hinst, hrsrc);
        if (hglob) {
            pwsz = reinterpret_cast<LPCWSTR>
                (LockResource(hglob));
            if (pwsz) {
                // okay now walk the string table
                for (int i = 0; i < (uId & 15); i++) {
                    pwsz += 1 + (UINT)*pwsz;
                }

                pwsz+= 1;
            }
        }
    }
    return pwsz;
}

UINT FindResourceStringId(HMODULE resource_handle, LPCWSTR string, UINT langId)
{
    UINT resource_id= -1;

    for (int i= 0; i<65536; ++i)
    {
        LPCWSTR resource_string= FindStringResourceEx(resource_handle, i, langId);

        if (resource_string && wcsncmp(resource_string, string, wcslen(string))==0)
        {
            resource_id= i;
        }
    }

    return resource_id;
}

int main()
{
    HMODULE shell_handle= LoadLibraryW(L"shell32.dll");
    UINT new_folder_id= FindResourceStringId(shell_handle, L"New Folder", 0x409); // look for US English "New Folder" resource id.
}
4 голосов
/ 23 марта 2010

Это не легко. Эти строки являются частными данными для Windows Explorer, и поэтому они могут (и, вероятно, могут) изменяться между выпусками. Вы можете взломать что-нибудь, где вы много проверяете версию и читаете соответствующую строку ресурса, но это похоже на проигрышную битву. Что вы пытаетесь достичь?

2 голосов
/ 23 марта 2010

Не уверен, есть ли более элегантный способ или нет (кажется, я не могу его найти), но эти строки хранятся в %windir%\System32\Shell32.dll. Теоретически вы можете просто прочитать этот файл и извлечь соответствующие строки.

Кажется немного хакерским, но должно закончить работу. Вот ссылка на статью, в которой обсуждается, где они живут в указанном файле: http://www.askvg.com/customize-new-folder-and-new-shortcut-text-in-windows-xp/

Похоже, может быть или даже должен быть интерфейс к ним через API Windows, но, просматривая документацию, я не смог найти ни одного. Возможно, вам повезет больше.

0 голосов
/ 31 марта 2010

Если вы хотите обработать 80% случаев, вы можете начать с «Новая папка».

Поскольку я предполагаю, что вы находитесь в корпоративной среде, вы можете вернуть имена папок в хранилище, а затем через неделю (или в любое время) вы получите имена; обновить ваше приложение; выпустить новую версию, которая порадует пользователей. (потом опубликую результаты здесь)

Вы можете предварительно протестировать свое приложение на разных платформах, которые, как вы подозреваете, будут использовать пользователи. получить первую серию имен папок.

Это позволит избежать проблемы работы с кодом, специфичным для каждой платформы, которую вы просматриваете.

EDIT Ну, я еще об этом подумала, наверное, вы захотите предупредить пользователя об этой «Новой папке», если через некоторое время ее не переименовали (скажем, минуту)? тогда, я думаю, вам нужно добавить список и таймер ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...