我在C#/ XAML上开发Windows Phone 8.1应用程序,我需要根据用户的区域格式首选项格式化时间值列表。例如,对于此图片的设置,我必须使用葡萄牙语(巴西)的格式格式化时间值。
问题是,日期/时间API根据应用程序的语言/区域格式化时间和日期。因为我的应用程序有一个" en-US"资源文件和系统语言设置为英语,API选择" en-US"作为我应用程序的语言,根据这种文化格式化所有内容。
有没有办法覆盖此行为并使用系统设置中用户定义的区域格式?
我能找到的最接近的是Windows.System.UserProfile.GlobalizationPreferences.Clocks
,它是用户首选的时钟列表。但它只返回一个字符串,其值为" 24HourClock",没有格式模式或任何东西。
答案 0 :(得分:0)
试试这个:
CultureInfo ci = new CultureInfo("pt-BR");
DateTime dt = DateTime.Now;
String strDate = dt.ToString("D", ci);
String strTime = dt.ToString("t", ci);
String strCurr = ci.NumberFormat.CurrencySymbol;
要获取当前文化的CultureInfo,请尝试:
CultureInfo ci = CultureInfo.CurrentUICulture;
要获取当前区域的CultureInfo,请尝试:
CultureInfo ci = new CultureInfo(Globalization.RegionInfo.CurrentRegion.Name);
答案 1 :(得分:0)
区域格式在Windows Phone Silverlight堆栈中的行为正确(恕我直言),但在WinRT堆栈中行为不正常(仍然是恕我直言)。自Windows 8.0以来一直行为不端,这里有关于这个问题的冗长讨论:WinRT apps and Regional settings. The correct way to format dates and numbers based on the user's regional settings?
此外,我在这里发表了一篇关于此问题的博客文章:http://mikaelkoskinen.net/winrt-xaml-misbehave-still-in-windows-81/
博客文章还包含一个似乎正常的解决方法:您可以将 Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride 设置为用户的区域格式,以使工作更好。
所以,希望App.xaml.cs的构造函数中的以下代码证明是有用的:
public App()
{
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = Windows.System.UserProfile.GlobalizationPreferences.HomeGeographicRegion;
this.InitializeComponent();
this.Suspending += this.OnSuspending;
}
已使用替代版本
进行了更新另一种方法是使用GlobalizationPreferences.Languages-array。例如:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = Windows.System.UserProfile.GlobalizationPreferences.Languages[1];
请确保检查阵列中确实存在多种语言。
这是设置PrimaryLanguageOverride之后在应用中的显示方式:
this.DateText.Text = DateTime.Now.ToString("D");
更新了屏幕截图
在Windows Phone 8.1中,如果您通过“设置”更改“区域”格式,则会选择所选的“区域”格式作为第二种语言。至少这是8.1仿真器的工作原理。因此,当我从头开始创建模拟器并更改区域设置时:
然后,如果我重新启动手机,则所选区域已添加为第二语言:
现在Windows.System.UserProfile.GlobalizationPreferences.Languages包含我选择的Region格式。