【问题标题】:Where does CurrentUICulture setting reside in Windows 7 from a .NET app perspective?从 .NET 应用程序的角度来看,CurrentUICulture 设置在 Windows 7 中的位置是什么?
【发布时间】:2013-06-11 19:30:16
【问题描述】:

我想测试我的应用在不同文化下的运行情况。 所以出于测试目的,在Windows 7下,我尝试在系统设置中更改CurrentUICulture

这似乎是正确的选择:Language for non-Unicode programsas suggested here,但它不起作用,即应用的语言环境仍然是英语。

我也在Region and Language 对话框中尝试过这个:

  • 格式:将格式更改为另一种文化
  • 位置:将当前位置设置为另一个国家/地区。

问题是我应该在 Windows 7 中设置什么来影响它:

Thread.CurrentThread.CurrentUICulture

不必这样写:

Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr")

最终,这段代码应该选择正确的文化,获取正确后缀的资源文件并将其显示在屏幕上(它使用上面的行):

Label1.Text = My.Resources.Form1Resource.TestString

A similar question has been asked on StackOverflow,但没有一个答案解决了这个问题。

【问题讨论】:

  • 我假设您需要更改显示语言
  • @Snoopy:我现在正在经历这个。获取相关语言的离线安装程序,安装它,然后查看更改是否反映在应用程序中。出于某种原因,Windows 更新不允许我这样做。感谢您的提示。
  • 嗯,这看起来很有趣froggie.sk
  • @Snoopy:我的是 Ultimate,所以不适用,但感谢提出,其他人可能会觉得它有用。

标签: vb.net winforms globalization


【解决方案1】:

该旋钮位于“区域和语言”控制面板的“键盘和语言”选项卡上。单击“安装/卸载语言...”按钮开始。如果您只安装了一种 UI 语言,则需要安装另一种。向导应引导您完成此操作。您还必须注销并重新登录才能看到效果。

在大多数情况下,CurrentUICulture 属性将返回用户首选 UI 语言列表中的第一种语言,因此设置它就足够了。其他语言用作备用语言,以防在首选语言中没有可用的必要资源。

CurrentUICulture 用于确定 UI 文化的实际算法有点复杂:

  • 首先,它检查DefaultThreadCurrentUICulture 属性。如果不是null,它将返回任何已设置为当前应用程序域中所有线程默认设置的 UI 文化。
  • 如果DefaultThreadCurrentUICulturenull,则调用GetUserDefaultUILanguage 函数。
    • 该函数检查当前用户是否设置了首选的 UI 语言,就像我在开始时描述的那样。如果是,则返回该语言。
    • 如果用户没有设置 UI 语言,该函数返回为系统设置的 UI 语言。这是由管理员在“区域和语言”控制面板的“高级”选项卡中完成的,需要重新启动才能生效。
    • 如果没有为系统设置首选语言,则使用系统默认 UI 语言。这是 Windows 本地化版本(XP 和更早版本)的语言,或者是安装期间选择的语言(Vista 和更高版本)。

当然,这种测试方法可能有点矫枉过正,因为它会更改全局 设置(至少,对于您的整个用户帐户而言)。由于当前的 UI 文化是按线程维护的,因此您可以仅针对应用程序的线程对其进行修改。为此,请设置 Thread.CurrentUICulture 属性。如果您的应用程序是多线程的,您可能需要设置 DefaultThreadCurrentUICulture 属性以确保其他线程选择正确的区域性。问题说你已经找到了这个,但我不清楚你为什么不想使用它。

另外,请注意不要将 UI 语言与区域设置混淆;她们不一样。 CurrentCulture 是区域设置,它设置日期/数字/时间格式和排序顺序等内容。 CurrentUICulture 是 UI 语言,它处理加载正确本地化的资源。他们可能是一样的,我想他们经常,但他们不一定是。在某些情况下,用户可能希望它们有所不同;例如,如果他们说英语并且更喜欢本地化的英语版本,但希望看到根据他们的习惯格式化的日期和时间等内容。

【讨论】:

  • +1 并接受。很好的答案。谢谢你。我不想使用它,因为我认为它看起来很杂乱。如果您有专门的人工测试员怎么办?我是否需要实现一个app.config 框架来动态切换文化(这反过来又设置 CurrentUICulture 和其他东西)或者让他们在 Windows 设置中更改它?我认为更改 Windows 设置会更简单。显然,事实并非如此。 :) 感谢 CurrentCulture 与 CurrentUICulture 的精彩解释 - 它们有时确实令人困惑。
  • @Neolisk 当然,这有点骇人听闻。通常应用程序根本不应该设置这些类型的属性!但是您这样做是出于测试目的,所以对我来说似乎是合理的。 :-) 如果您在专用 VM 中进行测试,则更改全局设置可能没问题,但否则考虑到该属性是每个线程的,这似乎是不必要的干扰。您的测试套件将在开始其批次测试之前以编程方式设置 UI 文化(无论您的“测试套件”是键盘上的人还是自动代码库)。
【解决方案2】:

你可以在windows机器上设置UI文化System.Globalization.CultureInfo.CurrentUICultureControl Panel\Clock, Language, and Region\Language

System.Globalization.CultureInfo.CurrentUICulture

如果你想在你的windows机器上设置System.Globalization.CultureInfo.CurrentCulture,请转到Control Panel\Clock, Language, and Region,然后选择区域:

System.Globalization.CultureInfo.CurrentCulture

在您的代码中,您可以使用它来获取这些值:

  • Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentUICulture;

  • Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture;

来源:CurrentCulture 与 CurrentUICulture

【讨论】:

    【解决方案3】:

    所以我尝试使用不同的方式安装法语语言包进行测试,但都失败了。离线和在线安装,原样或重启后。得到错误代码 800736B3(用于在线)或根本没有代码用于离线安装。尝试了System Update Readiness Tool for Windows 7(390MB msu 包),这是修复此错误代码的最常见方法。在线和离线安装程序仍然存在相同的问题。总共花了大约 4-5 个小时,我开始理解为什么@Cody 建议继续使用它(用于测试目的):

    Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多