【发布时间】:2011-11-29 14:23:39
【问题描述】:
问题:
我有一个在 Windows 7 上开发的 C# .NET 2.0 应用程序,它已经翻译了多种语言的资源(例如,zh-CHS 用于中文,es 用于西班牙语等.).
我有一个客户想要用英语运行他们的 Windows 7 操作系统,但用西班牙语 (es) 运行我的 .NET 应用程序。
我的应用程序是多线程的,所以仅仅改变主 GUI 线程的文化并不足以满足我的需求(相信我,我试过了)。这是因为通过 GUI 向用户显示的其他字符串是在其他线程上生成的。为了获得 100% 的完整覆盖率,我需要手动设置每个单独线程的文化,以确保资源文件中的所有文本都使用正确的语言。因为我的产品基本上是其他开发组编写的其他插件的框架,所以我无法控制在其他插件中创建的线程中执行的操作。因此,手动更改每个线程的区域性不是一个有效的选项。
我正在寻找一种方法来设置应用程序的整体语言,而无需更改任何操作系统用户设置。
在做一些研究时,我发现了以下为进程设置首选 UI 语言的方法:SetProcessPreferredUILanguages
在阅读完此内容后,看来此调用正是我所寻找的。但是,当我在 C# 应用程序的 Main 方法中实现此调用时,它似乎没有做任何事情。
以下代码的返回值为真,但我从未看到我的 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 应用程序的人。令人沮丧的是,没有更多关于如何执行此操作的信息。
提前致谢,
凯尔
【问题讨论】:
-
您能否描述一下仅将 CurrentUICulture 设置为西班牙语时发现的问题?也就是说,为什么这还不够?
-
更新了我的描述以解释为什么这还不够。
-
您是否排除了 a) 不在后台线程中生成翻译字符串,而是生成 ui 可以翻译的资源键,或者 b) 将所需的文化从 ui 传递给工作线程,以便它可以返回所需文化的字符串?感觉就像使用线程“currentculture”在工作线程上进行翻译是错误的(尽管我无法真正说出为什么......)
-
该函数只对非托管资源的资源加载器有影响,对 .NET 资源没有影响。没有好的方法可以做到这一点,你很早就遇到了问题,但线程池线程是典型的麻烦制造者。建议您的用户购买 Windows Ultimate 版本的许可证,以便她可以在语言之间动态切换。还确保 Windows 对话框具有正确的语言。
-
@HansPassant:我更新了我对这个主题所做的更多研究的问题描述。从我读过的所有内容(除非我遗漏了一些重要的细节),如果我设置进程首选的 UI 语言,我希望所有资源都使用指定的语言加载:msdn.microsoft.com/en-us/library/…
标签: multithreading internationalization c#-2.0 cultureinfo currentuiculture