Глобализация форматов даты, времени и чисел

Создайте приложение для глобальной готовности, отформатируя даты, время, числа, номера, номера телефонов и валюты. Затем вы сможете адаптировать приложение для дополнительных культур, регионов и языков на глобальном рынке.

Введение

При создании приложения, если вы думаете более широко, чем один язык и язык и региональные параметры, вы будете иметь меньше (если есть) непредвиденных проблем при росте приложения на новых рынках. Например, даты, время, числа, календари, валюта, номера телефонов, единицы измерения и размеры бумаги — это все элементы, которые могут отображаться по-разному в разных языках и региональных параметрах или языках.

Разные регионы и региональные параметры используют разные форматы даты и времени. К ним относятся соглашения о порядке дня и месяца в дате, для разделения часов и минут во времени, а также для того, какие знаки препинания используются в качестве разделителя. Кроме того, даты могут отображаться в различных длинных форматах ("среда, 28 марта 2012 г.") или коротких форматах ("3/28/12"), которые зависят от языка и региональных параметров. И, конечно, имена и аббревиаты для дней недели и месяцев года отличаются между языками.

Вы можете просмотреть форматы, используемые для разных языков. Перейдите к разделу ">Время параметров" и>"Язык" и щелкните "Дополнительное время", "Время" и "Региональные параметры>" Изменить дату, время или числовые форматы. На вкладке "Форматы" выберите язык в раскрывающемся списке "Формат" и просмотрите форматы в примерах.

В этом разделе используются термины "список языков профиля пользователя", "список языков манифеста приложения" и "список языков среды выполнения приложения". Дополнительные сведения о том, какие термины означают и как получить доступ к их значениям, см. в разделе "Общие сведения о языках профилей пользователей" и языках манифеста приложения.

Форматирование дат и времени для списка языков среды выполнения приложения

Если необходимо разрешить пользователям выбирать дату или выбрать время, используйте стандартный календарь, дату и время. Они автоматически используют лучший формат даты и времени для списка языков среды выполнения приложения.

Если вам нужно отобразить даты или время самостоятельно, можно использовать класс DateTimeFormatter. По умолчанию DateTimeFormatter автоматически использует лучший формат даты и времени для списка языков среды выполнения приложения. Таким образом, приведенный ниже код форматирует заданный dateTime лучшим способом для этого списка. Например, предположим, что список языков манифеста приложения включает английский (США), который также является вашим значением по умолчанию и немецким (Германия). Если текущая дата — 6 ноября 2017 г., а список языков профиля пользователя содержит немецкий (Германия), то средство форматирования дает "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;

Вы можете протестировать приведенный выше код на своем компьютере, как показано ниже.

Форматирование дат и времени для списка языков профиля пользователя

Помните, что по умолчанию 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 предоставляет класс Calendar, который предоставляет соответствующее представление календаря для заданного языка и региональных параметров, региона и типа календаря.

Форматирование номеров телефонов соответствующим образом

Номера телефонов форматируются по-разному в разных регионах. Количество цифр, группирование цифр и значение определенных частей номера телефона зависит от стран. Начиная с Windows 10 версии 1607, классы можно использовать в пространстве имен PhoneNumberFormatting для форматирования номеров телефонов соответствующим образом для текущего региона.

PhoneNumberInfo анализирует строку цифр и позволяет: определить, являются ли цифры допустимым номером телефона в текущем регионе; сравнить два числа для равенства; и извлечь различные функциональные части номера телефона, такие как код страны или географический код области.

PhoneNumberFormatter форматирует строку цифр или PhoneNumberInfo для отображения, даже если строка цифр представляет частичный номер телефона. Вы можете использовать это частичное форматирование чисел, чтобы отформатировать число в качестве пользователя, входящего в число.

В приведенном ниже примере показано, как использовать PhoneNumberFormatter для форматирования номера телефона при вводе. Каждый раз, когда текст изменяется в TextBox с именем phoneNumberInputTextBox, содержимое текстового поля форматируется с помощью текущей области по умолчанию и отображается в TextBlock с именем phoneNumberOutputTextBlock. Для демонстрационных целей строка также форматируется с помощью региона для Новой Зеландии и отображается в TextBlock с именем phoneNumberOutputTextBlockNZ.

    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);
        }
    }

Вы можете протестировать приведенный выше код на своем компьютере, изменив страну или регион в разделе ">Время и>язык" и "Страна языка" или ">Регион". Выберите страну или регион (возможно, Новую Зеландию, чтобы подтвердить соответствие форматов) и снова запустите код. Для тестовых данных можно выполнить веб-поиск телефонного номера бизнеса в Новой Зеландии.

Языковые и культурные предпочтения пользователя

В сценариях, где вы хотите предоставить различные функциональные возможности, основанные исключительно на языке пользователя, регионе или культурных предпочтениях, Windows предоставляет возможность доступа к этим предпочтениям через Windows.System.UserProfile.GlobalizationPreferences. При необходимости используйте класс GlobalizationPreferences , чтобы получить значение текущего географического региона пользователя, предпочитаемых языков, предпочитаемых валют и т. д. Но помните, что если строки и изображения приложения не локализованы для предпочтительного языка пользователя, то даты и время и другие данные, отформатированные для этого предпочтительного языка, не будут соответствовать отображаемым строкам.

Важные API

Примеры