全球化您的日期/時間/數字格式
透過適當格式化日期、時間、數位、電話號碼和貨幣,將您的應用程式設計為全域就緒。 您稍後將能夠針對全球市場中的其他文化特性、區域和語言,調整您的應用程式。
簡介
當您建立應用程式時,如果您認為比單一語言和文化特性更廣泛,當您的應用程式成長到新的市場時,您將會有較少的非預期問題。 例如,日期、時間、數位、行事曆、貨幣、電話號碼、度量單位和紙張大小都是可以不同文化特性或語言顯示的所有專案。
不同的區域和文化特性使用不同的日期和時間格式。 其中包括日期中日和月順序的約定、時間中小時和分鐘的分隔約定,甚至使用標點符號作為分隔符號的約定。 此外,日期可能以各種長格式顯示 (「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;
您可以透過在設定>&時間>語言區域&語言>國家或地區中變更國家或地區,在自己的PC上測試上述程式碼。 選擇國家或地區 (也許冰島),然後再次執行程序代碼。
使用文化上適當的行事曆
行事歷會因區域和語言而異。 公曆並不是每個地區的預設日曆。 某些地區的使用者可能會選擇其他日曆,例如日本紀元日曆或阿拉伯農曆。 日曆上的日期和時間也對不同時區和夏令時敏感。
若要確保使用慣用的行事曆格式,您可以使用標準行事曆、日期和時間控制項。 對於更複雜的場景,可能需要直接對日曆日期進行操作,Windows.Globalization 提供了一個 Calendar 類,該類別為給定的區域性、區域和日曆類型提供適當的日曆表示形式。
適當設定電話號碼格式
不同地區的電話號碼格式有所不同。 電話號碼的位數、數字的分組方式以及電話號碼某些部分的重要性因國家而異。 從 Windows 10 版本 1607 開始,您可以使用 PhoneNumberFormatting 命名空間中的類別,適當地格式化目前區域的電話號碼。
PhoneNumberInfo 解析一串數字,並允許您: 判斷該數字是否為目前地區的有效電話號碼;比較兩個數字是否相等;並提取電話號碼的不同功能部分,例如國家代碼或地理區域代碼。
PhoneNumberFormatter 會格式化數位字串或 PhoneNumberInfo 來顯示,即使數位字串代表部分電話號碼。 您可以使用這個部分數位格式,將數位格式化為使用者輸入數位。
下列範例示範如何使用 PhoneNumberFormatter,在輸入電話號碼時格式化電話號碼。 每次名為 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);
}
}
您可以透過在設定>&時間>語言區域&語言>國家或地區中變更國家或地區,在自己的PC上測試上述程式碼。 選擇一個國家或地區 (也許是紐西蘭,以確認格式匹配),然後再次執行程式碼。 針對測試資料,您可以對紐西蘭的商務電話號碼進行網路搜尋。
用戶的語言和文化喜好設定
針對您想要僅根據用戶語言、區域或文化喜好設定提供不同功能的案例,Windows 可讓您透過 Windows.System.UserProfile.GlobalizationPreferences 存取這些喜好設定。 如有需要,請使用 GlobalizationPreferences 類別來取得使用者目前地理區域、慣用語言、慣用貨幣等的值。 但請記住,如果您的應用程式的字串/影像未針對使用者的慣用語言當地語系化,則針對該慣用語言格式化的日期和時間和其他資料不符合您顯示的字串。