UWP在不更改货币的情况下更改语言

时间:2017-04-12 11:30:38

标签: c# uwp win-universal-app multilingual

我需要更改语言,但保留货币和日期/时间格式。怎么做?

我已尝试过以下内容(货币和日期/时间格式必须在en-US中):

ApplicationLanguages.PrimaryLanguageOverride = "zh";
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();

var fixedCulture = new CultureInfo("en-US");
CultureInfo.CurrentCulture = fixedCulture;
CultureInfo.CurrentUICulture = fixedCulture;
CultureInfo.DefaultThreadCurrentCulture = fixedCulture;
CultureInfo.DefaultThreadCurrentUICulture = fixedCulture;

语言确实变为中文(即资源字符串引用" zh"文件夹)以及货币符号和日期/时间格式。

我的问题是,如何在不更改货币和日期/时间格式的情况下更改语言?

谢谢!

1 个答案:

答案 0 :(得分:0)

默认情况下,货币和日期/时间根据当前应用程序语言的约定进行格式化。因此,如果您更改 PrimaryLanguageOverride 设置,则货币和日期/时间的格式也会更改。

要覆盖默认设置,我们可以使用DateTimeFormatterCurrencyFormatter

例如,对于日期/时间格式,我们可以使用以下格式化程序:

var dateTimeFormatter = new DateTimeFormatter("shortdate longtime", new[] { "en-US" });
var dateTimeString = dateTimeFormatter.Format(DateTime.Now);

对于货币格式,我们可以使用格式化程序,如:

var currencyFormatter = new CurrencyFormatter(CurrencyIdentifiers.USD, new[] { "en-US" }, "US");
var currencyString = currencyFormatter.Format(123.456);

有关详细信息,请参阅Date and time formatting sample,尤其是方案4和Number formatting and parsing sample,尤其是方案3。

  

问题是我需要遵守实际的系统语言设置。

要检索系统语言设置,我们可以使用Globalization​Preferences.Languag‌​es属性。此属性按优先顺序获取用户首选的语言集。此列表中的第一种语言是系统语言。

//Obtain the user's system language setting.
var sysLanguage = Windows.System.UserProfile.Globalization​Preferences.Languages[0];

Globalization​Preferences Class还有一个Currencies属性,可用于CurrencyFormatter,如下所示:

var currencyFormatter = new CurrencyFormatter(Windows.System.UserProfile.Globalization​Preferences.Currencies[0]);
var currencyString = currencyFormatter.Format(123.456);
  

我投入了印度尼西亚" (语言代码:id)并且它不起作用:(

我不熟悉印尼语。我尝试添加" Bahasa Indonesian"在语言中将其设置为默认值 enter image description here
但是,这并没有改变 Windows显示语言。系统仍以英文显示。默认情况下,货币根据Windows显示语言设置。查看设置>时间与时间语言>地区&语言>额外的日期,时间和&区域设置>地区:更改日期,时间或数字格式 enter image description here

所以这可能就是为什么我的解决方案对印尼人不起作用的原因。对于其他一些语言,例如中文,日文和法文,如果我们将它们设置为默认语言,Windows显示语言也会改变。因此它们可以工作。
enter image description here

无论如何,在我的解决方案中,它总是获得用户的系统设置。通常,我们应该尊重用户的设置(我想如果用户使用印尼语并且不想使用英语格式,他/她将改为印尼语格式)。如果您确实希望根据默认语言使用货币格式,您仍然可以利用CultureInfo之类的:

12345.6789.ToString("C3", new CultureInfo(Windows.System.UserProfile.Globalization​Preferences.Languages[0]))