Win10/11如何让EXE属性详情页按系统语言显示多语言版本资源
问题描述
在Windows系统中,右键点击EXE可执行文件打开「属性」-「详细信息」页看到的所有文本、数值信息,都存储在EXE的资源段中。
预期行为是单个EXE可以内置多语言版本的详情信息,Windows自动匹配用户系统的首选语言显示对应内容:比如同时内置英文、西班牙文详情时,英文系统用户看到英文内容,西班牙文系统用户看到西班牙文内容。
实际测试发现,「详细信息」页只会读取VarFileInfo块里Translations列表中第一个翻译条目对应的字符串,完全忽略用户配置的系统首选语言。
复现环境与步骤
测试环境为MSYS2 MINGW64,可通过以下代码复现问题:
1. 资源文件r.rc
#include <winnls.h> #include <windows.h> VS_VERSION_INFO VERSIONINFO BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" // 英语(美国),Unicode BEGIN VALUE "ProductName", "List of fruits" END BLOCK "040A04B0" // 西班牙语(西班牙),Unicode BEGIN VALUE "ProductName", "Lista de Frutas" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x040A, 1200, // 西班牙语(西班牙),Unicode 0x0409, 1200 // 英语(美国),Unicode END END LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN 1, "Fresa" END LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN 1, "Stawberry" END
代码中额外定义的多语言字符串表用于对照验证:
LoadStringW接口可以正常根据系统/线程UI语言加载对应语言的字符串,和「详细信息」页的异常表现形成明显对比。
2. 主程序文件main.c
#include <windows.h> #include <stdio.h> int main() { // 取消对应行注释可手动指定线程UI语言测试 // SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); // SetThreadUILanguage(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN)); printf("GetThreadUILanguage: 0x%x\n", GetThreadUILanguage()); WCHAR buffer[256]; LoadStringW(NULL, 1, buffer, 256); printf("LoadString: %ls\n", buffer); }
3. 编译命令
#!/usr/bin/bash set -ue windres r.rc r.o gcc -Wall -Wextra main.c r.o -o test.exe
4. 复现结果
编译完成后,即使系统设置为英文环境、资源中已经提供了英文版本的ProductName,test.exe的「详细信息」页中产品名仍显示为西班牙文内容:
诉求
需要找到可同时适配Windows 10、Windows 11的技术方案,在不把英文条目放在Translations列表首位的前提下,让英文环境用户看到英文版本的详情信息,无需兼容更旧版本的Windows系统。
已尝试无效操作:将两处语言标识中的0x0409(英语-美国)修改为0x0009(中性英语),没有产生任何效果。
内容的提问来源于stack exchange,提问作者David Grayson
相关产品推荐
相关产品推荐

