Udostępnij przez


Globalizuj formaty daty/czasu/liczb

Zaprojektuj aplikację tak, aby gotowa do użycia globalnie przez odpowiednie formatowanie dat, godzin, numerów, numerów telefonów i walut. Następnie będzie można później dostosować aplikację do dodatkowych kultur, regionów i języków na rynku globalnym.

Wprowadzenie

Kiedy tworzysz swoją aplikację, jeśli myślisz szerzej niż w kontekście jednego języka i kultury, będziesz mieć mniej niespodziewanych problemów (jeśli w ogóle), gdy aplikacja rozwinie się na nowe rynki. Na przykład daty, godziny, numery, kalendarze, waluta, numery telefonów, jednostki miary i rozmiary papieru to wszystkie elementy, które mogą być wyświetlane inaczej w różnych kulturach lub językach.

Różne regiony i kultury używają różnych formatów daty i godziny. Obejmują one konwencje dotyczące kolejności dnia i miesiąca w dacie, rozdzielania godzin i minut w czasie, a nawet tego, jakich znaków interpunkcyjnych używa się jako separatorów. Ponadto daty mogą być wyświetlane w różnych formatach długich ("środa, 28 marca 2012") lub formaty krótkie ("3/28/12"), które różnią się w różnych kulturach. I, oczywiście, nazwy i skróty dni tygodnia i miesięcy roku różnią się między językami.

Możesz wyświetlić podgląd formatów używanych w różnych językach. Przejdź do Ustawienia>Czas i język>Region i język, a następnie kliknij Dodatkowe ustawienia daty, godziny i ustawień regionalnych>Zmień format daty, godziny lub liczby. Na karcie Formaty wybierz język z listy rozwijanej Format i wyświetl formaty w Przykłady.

W tym temacie są używane terminy "lista języków profilu użytkownika", "lista języków manifestu aplikacji" i "lista języków środowiska uruchomieniowego aplikacji". Aby uzyskać szczegółowe informacje na temat tego, co oznaczają te terminy i jak uzyskać dostęp do ich wartości, zobacz Omówienie języków profilu użytkownika i języków manifestu aplikacji.

Formatowanie dat i godzin dla listy języków środowiska uruchomieniowego aplikacji

Jeśli chcesz zezwolić użytkownikom na wybór daty lub wybrać godzinę, użyj standardowych kontrolek kalendarza, daty i godziny. Te automatycznie używają najlepszego formatu daty i godziny dla listy języków środowiska uruchomieniowego aplikacji.

Jeśli musisz wyświetlić daty lub godziny samodzielnie, możesz użyć klasy DateTimeFormatter . Domyślnie funkcja DateTimeFormatter automatycznie używa najlepszego formatu daty i godziny dla listy języków środowiska uruchomieniowego aplikacji. Dlatego poniższy kod formatuje daną datetime w najlepszy sposób dla tej listy. Załóżmy na przykład, że lista języków manifestu aplikacji zawiera język angielski (Stany Zjednoczone), który jest również domyślny i niemiecki (Niemcy). Jeśli bieżąca data to 6 listopada 2017 r., a lista języków profilów użytkownika najpierw zawiera język niemiecki (Niemcy), formatator daje wartość "06.11.2017". Jeśli lista języków profilu użytkownika zawiera najpierw angielski (Stany Zjednoczone) (lub jeśli nie zawiera ani języka angielskiego, jak i niemieckiego), formatator podaje wartość "11/6/2017" (ponieważ "en-US" jest używana jako domyślna).

    // 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;

Możesz przetestować powyższy kod na własnym komputerze w następujący sposób.

Formatowanie dat i godzin listy języków profilu użytkownika

Pamiętaj, że domyślnie funkcja DateTimeFormatter jest zgodna z listą języków środowiska uruchomieniowego aplikacji. W ten sposób, jeśli wyświetlisz ciągi, takie jak "Data jest <data>", język będzie zgodny z formatem daty.

Jeśli z jakiegokolwiek powodu chcesz sformatować daty i/lub godziny tylko zgodnie z listą języków profilu użytkownika, możesz to zrobić przy użyciu kodu takiego jak w poniższym przykładzie. Jeśli jednak to zrobisz, zrozumiesz, że użytkownik może wybrać język, dla którego aplikacja nie ma przetłumaczonych ciągów. Jeśli na przykład aplikacja nie jest zlokalizowana w języku niemieckim (Niemcy), ale użytkownik wybierze to jako preferowany język, może to spowodować wyświetlenie prawdopodobnie dziwnych ciągów, takich jak "Data to 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);

Odpowiednio formatuj liczby i waluty

Różne kultury formatuje liczby inaczej. Różnice w formatach mogą obejmować liczbę cyfr dziesiętnych do wyświetlenia, liczbę znaków do użycia jako separatory dziesiętne oraz symbol waluty do użycia. Klasy w przestrzeni nazw NumberFormatting służą do wyświetlania liczb dziesiętnych, procentowych lub permille oraz walut. W większości przypadków te klasy formatujące powinny używać najlepszego formatu dla profilu użytkownika. Można jednak użyć formaterów, aby wyświetlić walutę dla dowolnego regionu lub formatu.

W tym przykładzie pokazano, jak wyświetlać waluty zarówno dla profilu użytkownika, jak i dla określonego systemu walutowego.

    // 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;

Możesz przetestować powyższy kod na własnym komputerze, zmieniając kraj lub region w Ustawieniach>Czas i język>Region i język>Kraj lub region. Wybierz kraj lub region (być może Islandia) i ponownie uruchom kod.

Używanie kalendarza odpowiedniego kulturowo

Kalendarz różni się między regionami i językami. Kalendarz gregoriański nie jest domyślny dla każdego regionu. Użytkownicy w niektórych regionach mogą wybierać alternatywne kalendarze, takie jak kalendarz ery japońskiej lub arabskie kalendarze księżycowe. Daty i godziny w kalendarzu są również wrażliwe na różne strefy czasowe i czas letni.

Aby upewnić się, że jest używany preferowany format kalendarza, możesz użyć standardowych kontrolek kalendarza, daty i godziny. W przypadku bardziej złożonych scenariuszy, w których praca bezpośrednio z operacjami w datach kalendarza może być wymagana, Windows.Globalization udostępnia klasę Kalendarz , która zapewnia odpowiednią reprezentację kalendarza dla danej kultury, regionu i typu kalendarza.

Odpowiednie formatowanie numerów telefonów

Numery telefonów są formatowane inaczej w różnych regionach. Liczba cyfr, sposób grupowania cyfr i znaczenie niektórych części numeru telefonu różnią się w zależności od krajów/regionów. Począwszy od systemu Windows 10 w wersji 1607, można użyć klas w przestrzeni nazw PhoneNumberFormatting , aby odpowiednio sformatować numery telefonów dla bieżącego regionu.

PhoneNumberInfo analizuje ciąg cyfr i umożliwia: określenie, czy cyfry są prawidłowym numerem telefonu w bieżącym regionie; porównaj dwie liczby pod kątem równości; oraz wyodrębnić różne funkcjonalne części numeru telefonu, takie jak kod kraju lub kod obszaru geograficznego.

PhoneNumberFormatter formatuje ciąg cyfr lub PhoneNumberInfo do wyświetlenia, nawet gdy ciąg cyfr oznacza częściowy numer telefonu. Za pomocą tego formatowania liczb częściowych można sformatować liczbę, gdy użytkownik wprowadza liczbę.

W poniższym przykładzie pokazano, jak za pomocą funkcji PhoneNumberFormatter sformatować numer telefonu podczas jego wprowadzania. Za każdym razem, gdy tekst zmienia się w TextBox nazwanym phoneNumberInputTextBox, zawartość pola tekstowego jest formatowana przy użyciu bieżącego regionu domyślnego i wyświetlana w TextBlock nazwanym phoneNumberOutputTextBlock. W celach demonstracyjnych ciąg jest również formatowany przy użyciu regionu dla Nowej Zelandii i wyświetlany w elemecie TextBlock o nazwie 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);
        }
    }

Możesz przetestować powyższy kod na własnym komputerze, zmieniając kraj lub region w Ustawieniach>Czas i język>Region i język>Kraj lub region. Wybierz kraj lub region (być może Nowa Zelandia, aby potwierdzić, że formaty są zgodne) i uruchom kod ponownie. W przypadku danych testowych możesz wyszukać w Internecie numer telefonu firmy w Nowej Zelandii.

Preferencje językowe i kulturowe użytkownika

W przypadku scenariuszy, w których chcesz zapewnić różne funkcje oparte wyłącznie na języku, regionie lub preferencjach kulturowych użytkownika, system Windows zapewnia dostęp do tych preferencji za pośrednictwem windows.System.UserProfile.GlobalizationPreferences. W razie potrzeby użyj klasy GlobalizationPreferences , aby uzyskać wartość bieżącego regionu geograficznego użytkownika, preferowanych języków, preferowanych walut itd. Należy jednak pamiętać, że jeśli ciągi/obrazy aplikacji nie są zlokalizowane dla preferowanego języka użytkownika, daty i godziny i inne dane sformatowane dla tego preferowanego języka nie będą zgodne z wyświetlanymi ciągami.

Ważne interfejsy API

Przykłady