Thread.CurrentThread.CurrentUICulture 没有正确返回国家

Posted

技术标签:

【中文标题】Thread.CurrentThread.CurrentUICulture 没有正确返回国家【英文标题】:Thread.CurrentThread.CurrentUICulture doesn't return country correctly 【发布时间】: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#。但是,如果有人找到这个(或有用的信息)的答案,我仍然很好奇,我愿意检查它是否适合那个项目...... 【参考方案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 的法语语言包似乎相同。

以上是关于Thread.CurrentThread.CurrentUICulture 没有正确返回国家的主要内容,如果未能解决你的问题,请参考以下文章