Найдите локализованные строки Windows

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

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

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

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

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

5
задан Jeremy McGee 5 May 2012 в 06:03
поделиться

4 ответа

Бесстыдно скопировано из 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.
}
7
ответ дан 13 December 2019 в 19:24
поделиться

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

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

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

2
ответ дан 13 December 2019 в 19:24
поделиться

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

4
ответ дан 13 December 2019 в 19:24
поделиться

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

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

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

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

РЕДАКТИРОВАТЬ Я еще раз подумал об этом. Думаю, вы могли бы предупредить пользователя об этой «Новой папке», если она не была переименована через некоторое время (скажем, через минуту) ? тогда, думаю, вам нужно будет добавить список и таймер ...

-2
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: