问题:
我有一个在 Windows 7 上开发的 C# .NET 2.0 应用程序,它已经翻译了多种语言的资源(例如zh-CHS用于中文,es用于西班牙语等)。
我有一个客户想要用英语运行他们的 Windows 7 操作系统,但用西班牙语 ( es ) 运行我的 .NET 应用程序。
我的应用程序是多线程的,所以仅仅改变主 GUI 线程的文化并不足以满足我的需求(相信我,我试过了)。这是因为通过 GUI 向用户显示的其他字符串是在其他线程上生成的。为了获得 100% 的完整覆盖率,我需要手动设置每个单独线程的文化,以确保资源文件中的所有文本都使用正确的语言。因为我的产品基本上是其他开发组编写的其他插件的框架,所以我无法控制在其他插件中创建的线程中执行的操作。因此,手动更改每个线程的区域性不是一个有效的选项。
我正在寻找的是一种为应用程序设置整体语言的方法,而无需更改任何操作系统用户设置。
在做一些研究时,我遇到了以下为进程设置首选 UI 语言的方法:SetProcessPreferredUILanguages
在阅读了这个之后,看来这个电话是我正在寻找的。但是,当我在 C# 应用程序的 Main 方法中实现此调用时,它似乎没有做任何事情。
以下代码的返回值为 true,但我从未看到我的 GUI 应用程序以西班牙语显示文本。
[DllImport("Kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern Boolean SetProcessPreferredUILanguages(UInt32 dwFlags, String pwszLanguagesBuffer, ref UInt32 pulNumLanguages);
public void SetLanguages()
{
uint numLangs = 0;
string[] langs = new string[3];
uint MUI_LANGUAGE_NAME = 0x8; // Use ISO language (culture) name convention
langs[0] = "es\u0000";
langs[1] = "zh-CHS\u0000";
langs[2] = "en-US\u0000";
numLangs = (uint)langs.Length;
if (SetProcessPreferredUILanguages(MUI_LANGUAGE_NAME, String.Concat(langs), ref numLangs))
{
Console.WriteLine("Successfully changed UI language");
}
}
为了成功运行加载了西班牙资源的 GUI 应用程序,我还缺少其他什么吗?
我正在尝试为Building MUI Applications实现 MSDN 页面底部表格的第二个选项,其中我有特定于应用程序的 UI 语言设置,并希望实现资源加载所需的结果:
应用程序调用 MUI API 来设置应用程序特定的 UI 语言或进程首选的 UI 语言,然后调用标准资源加载函数。资源以应用程序或系统语言设置的语言返回。
我已调用成功设置流程首选 UI 语言,但我的资源没有以我期望的语言加载。一位评论者提到此调用仅适用于非托管资源,我无法 100% 验证,但行为似乎表明情况确实如此。
我不可能是唯一一个尝试过以这种方式实现 .NET 应用程序的人。令人沮丧的是,没有更多关于如何执行此操作的信息。
提前致谢,
凯尔