查找本地化Windows字符串

时间:2010-03-23 18:00:10

标签: windows localization

我需要找到当前版本的Windows正在使用的一些字符串。例如,当我创建一个新文件夹时,它最初在英文版Vista上命名为“新文件夹”。我需要以编程方式查找在我可能正在运行的任何语言和Windows版本上命名该文件夹的内容。

任何人都有任何想法如何做到这一点?

谢谢莫里纳尔 - 我也偶然发现了这篇文章。不幸的是,stringID似乎不是常量 - 在我的Vista上它是30396,这与它们为XP显示的不同。因此,MS似乎没有保持稳定。

编辑:看起来这是不可能的......?这个应用程序运行在德国,荷兰,法国,西班牙,巴西,墨西哥,越南,台湾,中国,日本,韩国,印度,以色列,匈牙利的计算机上......你明白了。安装所有不同语言包需要很长时间,并找出每种语言的“新文件夹”。

也许最好的选择是默认为“新建文件夹”,并让用户根据需要更改该值。我只是想让软件尽可能多地计算出来,并使用户无需配置_yet_another_setting _。

4 个答案:

答案 0 :(得分:7)

来自http://blogs.msdn.com/oldnewthing/archive/2004/01/30/65013.aspx的无耻辱骂。这大多是正确的,但如果有一个“New Folder something else”的资源字符串,它将匹配:

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.
}

答案 1 :(得分:4)

这并不容易。这些字符串是Windows资源管理器的私有数据,因此它们可以(也可能)在不同版本之间进行更改。你可以在你进行大量版本检查并阅读适当的资源字符串的情况下进行攻击,但这似乎是一场失败的战斗。你想要完成什么?

答案 2 :(得分:2)

不确定是否有更优雅的方式(我似乎无法找到),但这些字符串存储在%windir%\System32\Shell32.dll中。从理论上讲,您只需读取该文件并提取相应的字符串即可。

看起来有点hacky-ish,但应该完成工作。这是一篇文章的链接,该文章讨论了他们在所述文件中的位置: http://www.askvg.com/customize-new-folder-and-new-shortcut-text-in-windows-xp/

似乎有可能甚至应该是通过Windows API与它们的接口,但是通过我找不到的文档。也许你会有更多的运气。

答案 3 :(得分:-2)

如果您想处理80%的案例,可以从“新文件夹”开始。

正如我猜您在企业环境中,您可以将文件夹名称放回存储中,然后在一周(或任何时间)之后通过名称获取;更新你的应用;发布新版本,取悦用户。 (然后在这里公布结果)

您可以在您怀疑用户使用的一系列平台上预先测试您的应用。获得第一系列文件夹名称。

这将避免处理您正在查看的每个平台特定代码的问题。

修改 好吧,我想到了第二个想法,我猜你可能想警告用户关于那个“新文件夹”如果它在一段时间后没有重命名(比如一分钟)?那么我想你需要添加一个列表和一个计时器......