我有在Windows 8地铁的应用程序与用户的区域设置一些问题(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();
}
这里是我的默认区域设置:
在运行时,应用程序显示在芬兰格式的日期:
然后,我改变了区域设置给我们:
而当应用程序被再次运行,文化和格式更改:
这是因为我希望一切工作,这也是我没有料到的WinRT应用完美配合。
因此,作为下一个步骤,我创建了一个的WinRT(XAML和C#)应用程序使用相同的代码,并恢复该区域设置回芬兰。 问题:
即使我已经通过区域设置该格式应该是“芬兰”定义的,WinRT的应用程序将显示美国格式化的日期时间。 然后我修改了应用程序的项目文件并提出FI-FI的默认语言 :
这一变化也修改了应用程序的文化:
奇怪。 我改变了默认语言恢复到默认值和格式化恢复至美国。 然后,我创建的文件夹“字符串- FI-FI”的项目中,并添加一个空的“Resources.resw”的项目 。 这个空文件似乎是不够的,因为我现在是越来越芬兰格式:
当我删除空资源文件时,打印格式返回到美国:
很奇怪。
这导致了一些问题,但最主要的一个,我认为是:是不是故意的WinRT中,应用程序不按照用户的区域设置,如WPF应用程式吗?
它已经有一段时间,但问题没有完全回答,所以让我分享我的研究很少。 Depechie大多是对的,但他只提供了一个链接,真的不知道。
是的,这意想不到的变化是故意的。 因为它包含旧的代码和微软希望我们使用Windows.Globalization的API,而不是我们不应该使用的CultureInfo了。
为了获得我们可以使用当前区域:
GeographicRegion userRegion = new GeographicRegion();
string regionCode = userRegion.CodeTwoLetter;
但正如我注意到它仅包含区域的信息,没有语言代码。 为了获得语言,我们可以使用:
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)
他们返回格式语言地区BCP47语言标签,如“EN-US”,如果语言都有方言或类似的“PL”,如果语言没有重大的方言只是语言。
我们还可以设置一个主要语言,这将覆盖所有的休息:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US";
(这是一个持久的设置和假设在用户请求中使用)
也有日期,时间和数字的新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
这确实在Windows.Globalization API的多很多,但我认为,这给我们的总体思路。 进一步阅读:
- 日期和时间的格式示例: http://code.msdn.microsoft.com/windowsapps/Date-and-time-formatting-2361f348/sourcecode?fileId=52070&pathId=561085805
- 数字格式&解析样品:
http://code.msdn.microsoft.com/windowsapps/Number-formatting-and-bb10ba3d/sourcecode?fileId=52249&pathId=1462911094 - 也有标题为一个不错的文章“如何使用模式来格式化日期和时间” MSDN上,但我可以只添加2链接
您还可以找到关于一些微软员工回答的Windows 8开发中心论坛的议题一些议题,但他们主要是送你的文档。
这是故意的。 微软从迫使应用程序是在操作系统的语言移开。 相反,每个应用程序使用(清单的语言,在可观察到的Windows.Globalization.ApplicationLanguages.ManifestLanguages)由应用程序声明的信息,并宣布由用户(用户的语言,可观察到在Windows.System.UserProfile.GlobalizationPreferences.Languages),以确定如何显示资源和全球化的日期和时间。 这套语言被称为应用程序语言(在Windows.Globalization.ApplicationLanguages.Languages观察到)。 您所看到的行为是因为你与用户语言和清单语言摆弄,你会得到不同的应用程序语言。
难道是我们现在需要查询其他类? 喜欢这里给出的例子: http://code.msdn.microsoft.com/windowsapps/Globalization-preferences-6654eb36/sourcecode?fileId=52104&pathId=236099476
这篇文章似乎仍然是即使它在两年前要求相关。 我只是碰到它,因为我一直在寻找的答案,同样的事情。 我也想显示在我的WP8.1的WinRT应用区域格式的日期。 这里发布的信息帮助,但它是一个有点难以拼凑一起。
这是我想出了,它似乎为我工作,我需要的答案:
using Windows.Globalization;
using Windows.Globalization.DateTimeFormatting;
private string FormatDate(int year, int month, int day)
{
GeographicRegion userRegion = new GeographicRegion();
string regionCode = userRegion.CodeTwoLetter;
var formatter = new DateTimeFormatter("year month day", new[] { regionCode });
DateTime dateToFormat = new DateTime(year, month, day);
var formattedDate = formatter.Format(dateToFormat);
return formattedDate;
}
文章来源: WinRT apps and Regional settings. The correct way to format dates and numbers based on the user's regional settings?