什么可能导致CurrentCulture和CurrentUICulture默认为除了明显的系统文化之外的值?

时间:2012-02-10 14:42:16

标签: .net localization cultureinfo

我有一个使用.NET 3.5框架的基于WinForms的应用程序。该应用程序具有某些资源的本地化版本。

当我在运行Windows XP副本的计算机上运行该应用程序时,该计算机最初安装时使用en-US作为默认区域,但随后将默认区域设置为en-CA,则CurrentCulture和CurrentUICulture都默认为的en-US

为什么会发生这种情况?我需要更改什么才能使应用程序开始使用当前的OS文化作为其默认值?

2 个答案:

答案 0 :(得分:3)

用户从未在Windows设置中提及她最喜欢的语言:她在控制面板中设置了她的文化,例如英语(加拿大)又名en-CA。这个选择反映在Thread.Culture属性中。 Windows使用它来确定如何显示和格式化日期(包括日期和月份的格式和名称),货币等...

另一种设置是安装Windows(GUI)的语言(在您的情况下很可能是英语(美国))。这由Thread.CurrentUICulture反映出来。当然,这个选项的选择较少,因为它反映了GUI的语言(菜单,按钮,帮助......)。例如没有en-CA CurrentUICulture这样的东西。

注意:在Vista +和XP-MUI中,您可以随后安装其他GUI语言并设置用于每个用户帐户的语言。这反映在CurrentUICulture中。

一个常见的误解是认为应该使用文化来确定用户最喜欢的语言。最好依靠CurrentUICulture。在我的例子中,Windows是英文的,我的用户偏好(文化)是fr-BE(法国 - 比利时)。永远不要想到用法语显示你的用户界面:我用英语安装Windows是为了一个目的:我宁愿使用英语的原生用户界面,而不是用法语翻译的用户界面。我选择背后的原因是有争议的,但这是无关紧要的。只有我的决定是相关的。

那就是说,我读到2012年2月5日,而不是5月2日。这就是为什么fr-BE是我的语言环境/文化。

FWIW,非Unicode程序的语言说非Unicode程序应该使用哪个默认代码页(Win32 NLS用语中的CP_ACP)。这不会影响您的应用,因为.NET应用程序是Unicode。

默认输入语言确定默认键盘布局。这不是文化背景。

影响Culture属性的设置是:

XP Regional Settings

答案 1 :(得分:0)

我必须在很长一段时间后恢复该线程...如果我在win10上创建.net 3.5控制台应用程序,并读取CultureInfo.CurrentCulture,它将/ readuse非Unicode程序区域性(控制面板/时钟和区域) /区域/管理标签-非Unicode程序的语言/英语-津巴布韦)。如果我将该控制台应用程序的.net框架更改为.net4,则该应用程序将读取Windows CurrentCulture,该窗口为英语-加拿大(“控制面板/时钟和区域/地区/格式”标签-“格式/英语-加拿大”)。

为什么会这样?为什么.net 3.5应用程序未使用Windows主要文化(英语-加拿大)?

控制台应用程序的代码很简单:

[Binding]
public class LoginSteps
{
    private readonly IWebDriver driver;
    private readonly LoginPage loginPage;

    public LoginSteps(IWebDriver driver)
    {
        // Assign 'driver' to private field or use it to initialize a page object
        this.driver = driver;

        // Initialize Selenium page object
        this.loginPage = new LoginPage(driver);
    }

    [When(@"I go to the login page")]
    public void WhenIGoToTheLoginPage()
    {
        // Use 'driver' in step definition
        driver.FindElement(By.LinkText("Sign In")).Click();
    }

    [When(@"I log in")]
    public void WhenILogIn()
    {
        // Use Selenium page object in step definition
        loginPage.LogIn("testUser", "testPassword");
    }
}

来自MS网站:

  

.NET从多种来源之一获取其文化数据,   取决于实现方式,平台和版本:

     

在.NET Framework 3.5和更早版本中,提供了文化数据   通过Windows操作系统和.NET

     

在.NET Framework 4和更高版本中,文化数据由   Windows操作系统。