Mik*_*nen 21 c# xaml currentculture windows-runtime windows-store-apps
关于用户的区域设置,我在Windows 8 Metro应用程序(XAML和C#)中遇到了一些问题.似乎应用程序不会尊重用户的区域设置,因此即使您的Windows 8设置为以芬兰语格式显示日期和时间,应用程序仍将使用美国格式显示它们.但这是一个很大的问题,必须有一些我不知道的东西?
为了测试这一点,我首先创建了一个WPF应用程序.应用程序只打印出CurrentCulture和格式化的DateTime.Now:
private void Culture_Loaded_1(object sender, RoutedEventArgs e)
{
this.Culture.Text = System.Globalization.CultureInfo.CurrentCulture.DisplayName;
}
private void Date_Loaded_1(object sender, RoutedEventArgs e)
{
this.Date.Text = DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这是我的默认区域设置:

运行时,应用程序以芬兰语格式显示日期:

然后我将区域设置更改为美国:

当应用程序再次运行时,文化和格式发生了变化:

这就像我期望一切正常工作,这也是我期望WinRT应用程序的工作方式.
因此,下一步,我使用相同的代码创建了一个WinRT(XAML和C#)应用程序,并将区域设置恢复为芬兰语.问题:

即使我通过区域设置定义格式应为"芬兰语",WinRT应用程序也会以美国格式显示日期时间.然后我修改了应用程序的项目文件,并使fi-FI成为默认语言:

此更改还修改了应用程序的文化:

奇怪.我将默认语言更改回其默认值,格式化已恢复为美国.然后我在项目中创建了文件夹"Strings-fi-FI",并在项目中添加了一个空的"Resources.resw".这个空文件似乎已经足够了,因为我现在正在使用芬兰格式:

只要删除空资源文件,格式就会恢复为美国:

很奇怪.
这导致了一些问题,但我认为主要的问题是:WinRT应用程序是否故意不遵循用户的区域设置(如WPF应用程序)?
Tom*_*Tom 15
已经有一段时间了,但问题没有得到完全回答,所以让我分享一下我的小研究.Depechie大多是对的,但他只提供了一个链接,并不是很确定.
是的,这种意想不到的变化是有意的.我们不应再使用CultureInfo,因为它包含遗留代码,Microsoft希望我们使用Windows.Globalization API.
要获得当前区域,我们可以使用:
GeographicRegion userRegion = new GeographicRegion();
string regionCode = userRegion.CodeTwoLetter;
Run Code Online (Sandbox Code Playgroud)
但是我注意到它只包含区域信息,因此没有语言代码.要获得语言,我们可以使用:
string langRegionCode = Windows.Globalization.Language.CurrentInputMethodLanguageTag; // depends on keyboard settings
List<string> langs = Windows.System.UserProfile.GlobalizationPreferences.Languages; // all user languages, like in languages control panel
List<string> applicationlangs = Windows.Globalization.ApplicationLanguages.Languages; // application languages (user languages resolved against languages declared as supported by application)
Run Code Online (Sandbox Code Playgroud)
如果语言有方言,它们会以格式语言-REGION返回BCP47语言标签,如果语言没有主要方言,则返回"pl"之类的语言.
我们还可以设置一种主要语言,它将覆盖所有其他语言:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US";
Run Code Online (Sandbox Code Playgroud)
(这是一个持久化设置,应该在用户请求时使用)
还有新的日期,时间和数字API:
Windows.Globalization.DateTimeFormatting.DateTimeFormatter dtf = new DateTimeFormatter("longdate", new[] { "en-US" }, "US", CalendarIdentifiers.Gregorian, ClockIdentifiers.TwentyFourHour);
string longDate = dtf.Format(DateTime.Now);
Windows.Globalization.NumberFormatting.DecimalFormatter deciamlFormatter = new DecimalFormatter(new string[] { "PL" }, "PL");
double d1 = (double)deciamlFormatter.ParseDouble("2,5"); // ParseDouble returns double?, not double
Run Code Online (Sandbox Code Playgroud)
Windows.Globalization API中确实有很多,但我认为这给了我们一般的想法.进一步阅读:
您还可以在Windows 8开发人员中心论坛上找到一些有关该问题的主题以及一些Microsoft员工的答案,但他们主要将您发送到文档.
| 归档时间: |
|
| 查看次数: |
9318 次 |
| 最近记录: |