通过适当设置日期、时间、数字、电话号码和货币的格式,使应用程序具备国际化能力。 之后,您将能够使您的应用适应全球市场中的更多文化、地区和语言。
介绍
创建应用时,如果你的考量超越单一语言和文化,那么在你的应用扩展到新市场时,你会遇到更少甚至没有意外问题。 例如,日期、时间、数字、日历、货币、电话号码、度量单位和纸张大小都是可以在不同区域性或语言中以不同方式显示的项目。
不同的区域和文化使用不同的日期和时间格式。 这些包括日期中日和月顺序的约定、时间中的小时和分钟的分隔,甚至用于分隔符号的标点符号。 此外,日期可能以各种长格式(“2012 年 3 月 28 日星期三”)或短格式(“3/28/12”)显示,这些格式因不同文化而异。 当然,一周和一年中的月份的名称和缩写因语言而异。
可以预览用于不同语言的格式。 转到 “设置>时间”和“语言>区域”和“语言”,然后单击“ 其他日期”、“时间”和“区域设置>”更改日期、时间或数字格式。 在 格式 选项卡上,从 格式 下拉列表中选择一种语言,并在 示例中预览格式。
本主题使用术语“用户配置文件语言列表”、“应用清单语言列表”和“应用运行时语言列表”。 有关这些术语的含义以及如何访问其值的详细信息,请参阅 了解用户配置文件语言和应用清单语言。
为应用运行时语言列表格式化日期和时间
如果需要允许用户选择日期或选择时间,请使用标准 日历、日期和时间控件。 这些语言会自动为应用运行时语言列表使用最佳日期和时间格式。
如果需要自己显示日期或时间,则可以使用 DateTimeFormatter 类。 默认情况下,DateTimeFormatter 会自动使用应用运行时语言列表的最佳日期和时间格式。 因此,下面的代码以该列表的最佳方式格式化给定的 DateTime。 例如,假设你的应用清单语言列表包括英语(美国),这也是你的默认语言和德语(德国)。 如果当前日期为 2017 年 11 月 6 日,并且用户配置文件语言列表首先包含德语(德国),则格式化程序会提供“06.11.2017”。 如果用户配置文件语言列表首先包含英语(美国),或者它不包含英语和德语,则格式化程序会提供“11/6/2017”(因为“en-US”匹配项或用作默认值)。
// Use the DateTimeFormatter class to display dates and times using basic formatters.
var shortDateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shortdate");
var shortTimeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shorttime");
var dateTimeToFormat = DateTime.Now;
var shortDate = shortDateFormatter.Format(dateTimeToFormat);
var shortTime = shortTimeFormatter.Format(dateTimeToFormat);
var results = "Short Date: " + shortDate + "\n" +
"Short Time: " + shortTime;
可以在自己的电脑上测试上述代码,如下所示。
- 确保项目中的资源文件符合“en-US”和“de-DE”的要求(请参阅 ,了解如何为语言、缩放、高对比度和其他限定符定制资源)。
- 更改用户配置文件语言列表在设置>时间和语言>区域和语言>语言中。 添加德语(德国),将其设为默认值,然后再次运行代码。
为用户配置文件语言列表格式化日期和时间
请记住,默认情况下,DateTimeFormatter 与应用运行时语言列表匹配。 这样,如果显示“日期 <日期>”等字符串,则语言将与日期格式匹配。
如果出于何种原因,你只想根据用户配置文件语言列表设置日期和时间的格式,则可以使用类似于以下示例的代码执行此操作。 但是,如果你这样做,那么用户就可以选择应用没有翻译字符串的语言。 例如,如果你的应用未本地化为德语(德国),但用户选择该语言作为首选语言,则可能会导致显示可以说是奇怪的字符串,例如“日期为 06.11.2017”。
// Use the DateTimeFormatter class to display dates and times using basic formatters.
var userLanguages = Windows.System.UserProfile.GlobalizationPreferences.Languages;
var shortDateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shortdate", userLanguages);
var results = "Short Date: " + shortDateFormatter.Format(DateTime.Now);
适当格式化数字和货币
不同文化对数字的格式化方式不同。 格式差异可能包括要显示的十进制数字数、用作小数分隔符的字符数以及要使用的货币符号。 使用 NumberFormatting 命名空间中的类来显示小数、百分比、千分位数和货币。 大多数情况下,你希望这些格式化程序类使用用户配置文件的最佳格式。 但是,可以使用格式化程序显示任何区域或格式的货币。
此示例演示如何按用户配置文件和特定的给定货币系统显示货币。
// This scenario uses the CurrencyFormatter class to format a number as a currency.
var userCurrency = Windows.System.UserProfile.GlobalizationPreferences.Currencies[0];
var valueToBeFormatted = 12345.67;
var userCurrencyFormatter = new Windows.Globalization.NumberFormatting.CurrencyFormatter(userCurrency);
var userCurrencyValue = userCurrencyFormatter.Format(valueToBeFormatted);
// Create a formatter initialized to a specific currency,
// in this case US Dollar (specified as an ISO 4217 code)
// but with the default number formatting for the current user.
var currencyFormatUSD = new Windows.Globalization.NumberFormatting.CurrencyFormatter("USD");
var currencyValueUSD = currencyFormatUSD.Format(valueToBeFormatted);
// Create a formatter initialized to a specific currency.
// In this case it's the Euro with the default number formatting for France.
var currencyFormatEuroFR = new Windows.Globalization.NumberFormatting.CurrencyFormatter("EUR", new[] { "fr-FR" }, "FR");
var currencyValueEuroFR = currencyFormatEuroFR.Format(valueToBeFormatted);
// Results for display.
var results = "Fixed number (" + valueToBeFormatted + ")\n" +
"With user's default currency: " + userCurrencyValue + "\n" +
"Formatted US Dollar: " + currencyValueUSD + "\n" +
"Formatted Euro (fr-FR defaults): " + currencyValueEuroFR;
可以通过在设置>时间与语言>区域与语言>国家或地区中更改国家或地区,在自己的电脑上测试上述代码。 选择国家或地区(可能为冰岛),然后再次运行代码。
使用文化上适当的日历
日历因区域和语言而异。 公历不是每个区域的默认日历。 某些区域中的用户可以选择备用日历,例如日本纪元日历或阿拉伯农历。 日历上的日期和时间也会根据不同的时区和夏令时进行调整。
若要确保使用首选日历格式,可以使用标准 日历、日期和时间控件。 对于更复杂的情境,可能需要直接对日历日期进行操作,Windows.Globalization 提供了一个 日历 类,可为给定的文化、区域和日历类型提供适用的日历表示形式。
适当格式化电话号码
电话号码在各个区域采用不同的格式。 数字数、数字分组方式以及电话号码的某些部分的重要性因国家/地区而异。 从 Windows 10 版本 1607 开始,可以使用 PhoneNumberFormatting 命名空间中的类为当前区域适当设置电话号码的格式。
PhoneNumberInfo 分析一组数字,并允许你:确定数字是否为当前区域中的有效电话号码;比较两个数字是否相等;并提取电话号码的不同功能部分,例如国家/地区代码或地理区号。
PhoneNumberFormatter 将数字字符串或 PhoneNumberInfo 格式化为用于显示,即便该数字字符串代表一个部分电话号码。 您可以在用户输入数字时,使用此部分数字格式来格式化数字。
下面的示例演示如何使用 PhoneNumberFormatter 在输入电话号码时进行格式化。 每次 TextBox 名为 phoneNumberInputTextBox 的文本发生变化时,文本框内容将根据当前默认区域进行格式化,并显示在名为 phoneNumberOutputTextBlock 的 TextBlock 中。 出于演示目的,该字符串还使用新西兰的区域设置格式,并在名为 phoneNumberOutputTextBlockNZ 的 TextBlock 中显示。
using Windows.Globalization.PhoneNumberFormatting;
PhoneNumberFormatter currentFormatter, NZFormatter;
public MainPage()
{
this.InitializeComponent();
// Use the default formatter for the current region
this.currentFormatter = new PhoneNumberFormatter();
// Create an explicit formatter for New Zealand.
PhoneNumberFormatter.TryCreate("NZ", out this.NZFormatter);
}
private void phoneNumberInputTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
// Format for the default region.
this.phoneNumberOutputTextBlock.Text = currentFormatter.FormatPartialString(this.phoneNumberInputTextBox.Text);
// If the NZFormatter was created successfully, format the partial string for the NZ TextBlock.
if(this.NZFormatter != null)
{
this.phoneNumberOutputTextBlockNZ.Text = this.NZFormatter.FormatPartialString(this.phoneNumberInputTextBox.Text);
}
}
可以通过在设置>时间与语言>区域与语言>国家或地区中更改国家或地区,在自己的电脑上测试上述代码。 选择国家或地区(也许新西兰确认格式匹配),然后再次运行代码。 对于测试数据,可以对新西兰企业电话号码进行 Web 搜索。
用户的语言和文化首选项
对于希望仅基于用户语言、区域或文化首选项提供不同功能的方案,Windows 提供了一种通过 Windows.System.UserProfile.GlobalizationPreferences访问这些首选项的方法。 如果需要,请使用 GlobalizationPreferences 类获取用户当前地理区域、首选语言、首选货币等的值。 但请记住,如果你的应用的字符串/图像未针对用户的首选语言进行本地化,则为该首选语言格式化的日期和时间和其他数据与显示的字符串不匹配。