【问题标题】:Thread.CurrentThread.CurrentUICulture doesn't return country correctlyThread.CurrentThread.CurrentUICulture 没有正确返回国家
【发布时间】:2016-03-03 19:10:30
【问题描述】:

我遇到了一个非常奇怪的问题。我正在对我的项目实施本地化,但是当我尝试让当前的语言环境 Windows 正在运行时,它错过了国家信息。这是一个示例代码:

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo culture = CultureInfo.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0} [{1}]",
                        culture.NativeName, culture.Name);
   }
}

当我以最常用的语言(英语-美国、法语-法语)运行它时,它会正确返回。但是,例如,当我从比利时选择法语时,它会检索我 FR-fr 而不是 FR-be - 即使我从语言首选项选项中删除了法国的法语。

我想知道,无论我的软件位于哪个国家/地区,我如何才能始终正确选择国家/地区。

ps:使用 CurrentCulture 不是我正在寻找的答案,因为我想要匹配我在 UI 中使用的显示语言,而不是日期/时间/数字格式(它们可能完全不同) .

【问题讨论】:

  • 我刚刚尝试卸载法语语言包 (FR-fr) 并从法语比利时选择它重新安装。我仍然得到FR-fr。那会是 Windows 问题吗?
  • 水晶球说您选择了另一个键盘布局而不是更改操作系统语言。您必须使用“高级”按钮。非常不清楚你实际上做了什么,最好先在 superuser.com 上 ping 这个。请务必提及 Windows 版本和版本,他们几乎在每个版本中都更改了这一点,您安装的语言包很重要。
  • 我在 Windows 8 和 10 中进行了测试。它们都不起作用。正如我在上一条评论中提到的那样,我更改了操作系统语言 - 安装了语言包和类似的东西(你只能在高级会话中这样做)。
  • 我不再积极寻找这个问题的答案 - 我不再从事这个项目,也不再使用 C#。但是,如果有人找到这个(或有用的信息)的答案,我仍然很好奇,我愿意检查它是否适合那个项目......

标签: c# localization cultureinfo culture currentuiculture


【解决方案1】:

我认为你在标题中使用错误。

MS 使用 system.thread 而不是 system.globalization https://msdn.microsoft.com/it-it/library/system.globalization.cultureinfo.currentuiculture(v=vs.110).aspx 其中一些存在编译错误。

正确的编译代码是这样的:

(注意 CultureInfo.CurrentCulture 是只读的,而我使用了具有 setter 可访问性的 System.Threading.Thread.CurrentThread.CurrentCulture)

public static void Main(string[] args)
{
    // Display the name of the current thread culture.
    Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);

    // Change the current culture to th-TH.
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("th-TH", false);
    Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name);

    // Display the name of the current UI culture.
    Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);

    // Change the current UI culture to ja-JP.
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP", false);
    Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);

}

【讨论】:

  • CultureInfo 类需要 System.Globalization。您发布的链接上的所有示例都使用 System.Globalization。
  • 对不起,我在手机上读过它,但从未尝试过。我在示例中发现了错误。我添加了正确的信息
  • 抱歉,我不想以编程方式更改当前的文化,也不想更改当前的 UI 文化。我只想从操作系统获取正确的语言/国家信息——如果是比利时法语,这些信息会不正确。您发布的代码没有从我发布的代码中添加任何新内容,而是更改文化要求。
  • 我明白你不想改变 CurrentCulture,我找到了另一个进入“CurrentCulture”的入口点,这里解释了msdn.microsoft.com/en-us/library/…。所以他们有相同的价值观?我发现这里@9​​87654323@ 也更有趣,其中有关于“CurrentCulture”的详细信息取决于线程和主线程。
  • 感谢您的链接。但是,他们仍然没有解决我的问题。这可能是一个极端情况,但 CurrentCulture(区域、货币配置)和 CurrentUICulture(操作系统 ui 语言)可能不匹配(我经常使用英语操作系统和其他语言环境中的货币)。而且,当我得到线程的 CurrentUICulture 而没有以编程方式更改它时,它以 FR-fr 而不是 FR-be 的形式出现(如果我在代码中更改它,它会附带值集)。我想知道这是否是某种操作系统限制,因为 FR-fr 和 FR-be 的法语语言包似乎相同。
猜你喜欢
  • 2014-01-10
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多