次の方法で共有


日付/時刻/数値形式をグローバル化する

日付、時刻、数字、電話番号、通貨を適切に書式設定して、アプリをグローバルに対応できるように設計します。 その後、アプリをグローバル 市場の追加のカルチャ、地域、言語に合わせて調整できるようになります。

はじめに

アプリを作成するときに、1 つの言語とカルチャよりも広く考えると、アプリが新しい市場に成長したときに予期しない問題が少なくなります (存在する場合)。 たとえば、日付、時刻、数字、カレンダー、通貨、電話番号、測定単位、用紙サイズはすべて、異なるカルチャまたは言語で異なる方法で表示できる項目です。

地域やカルチャが異なると、日付と時刻の形式が異なります。 これには、日付の日と月の順序、時刻の時間と分の分離、区切り記号として使用される句読点の規則が含まれます。 さらに、日付は、さまざまな長い形式 ("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;

上記のコードは、次のように自分の PC でテストできます。

  • "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);

数値と通貨を適切に書式設定する

カルチャによって数値の書式が異なります。 書式の違いには、表示する 10 進数の数、小数点区切り記号として使用する文字、使用する通貨記号などがあります。 NumberFormatting 名前空間のクラスを使用して、10 進数、パーセント番号、またはパーミル番号、および通貨を表示します。 ほとんどの場合、これらのフォーマッタ クラスでユーザー プロファイルに最適な形式を使用する必要があります。 ただし、フォーマッタを使用して、任意の地域または書式の通貨を表示できます。

この例では、ユーザー プロファイルごとと特定の通貨システムの両方に通貨を表示する方法を示します。

    // 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 では、指定されたカルチャ、地域、カレンダーの種類に適したカレンダー表現を提供する Calendar クラスが提供されます。

電話番号を適切に書式設定する

電話番号の形式は地域によって異なります。 電話番号の桁数、桁のグループ化、および特定の部分の意味は、国や地域によって異なります。 Windows 10 バージョン 1607 以降では、PhoneNumberFormatting 名前空間のクラスを使用して、現在のリージョンの電話番号を適切に書式設定できます。

PhoneNumberInfo は、数字の文字列を解析し、現在のリージョンの有効な電話番号であるかどうかを判断できます。等しいかどうかを 2 つの数値で比較します。国コードや地理的地域コードなど、電話番号のさまざまな機能部分を抽出します。

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 クラスを使用して、ユーザーの現在の地域、優先言語、優先通貨などの値を取得します。 ただし、アプリの文字列/画像がユーザーの優先言語用にローカライズされていない場合、その優先言語用に書式設定された日付と時刻およびその他のデータは、表示する文字列と一致しません。

重要な API

サンプル