CultureInfo kelas

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Kelas ini CultureInfo menyediakan informasi khusus budaya, seperti bahasa, sublanguage, negara/wilayah, kalender, dan konvensi yang terkait dengan budaya tertentu. Kelas ini juga menyediakan akses ke instans khusus budaya dari DateTimeFormatInfoobjek , , NumberFormatInfoCompareInfo, dan TextInfo . Objek ini berisi informasi yang diperlukan untuk operasi khusus budaya, seperti casing, pemformatan tanggal dan angka, dan membandingkan string. Kelas CultureInfo ini digunakan baik secara langsung atau tidak langsung oleh kelas yang memformat, mengurai, atau memanipulasi data khusus budaya, seperti String, DateTime, DateTimeOffset, dan jenis numerik.

Nama dan pengidentifikasi budaya

Kelas CultureInfo menentukan nama unik untuk setiap budaya, berdasarkan RFC 4646. Namanya adalah kombinasi dari kode kultur huruf kecil dua huruf atau tiga huruf ISO 639 yang terkait dengan bahasa dan kode subkultur huruf besar dua huruf ISO 3166 yang terkait dengan negara atau wilayah. Selain itu, untuk aplikasi yang berjalan di bawah Windows 10 atau yang lebih baru, nama budaya yang sesuai dengan tag bahasa BCP-47 yang valid didukung.

Catatan

Ketika nama budaya diteruskan ke konstruktor kelas atau metode seperti CreateSpecificCulture atau CultureInfo, kasusnya tidak signifikan.

Format untuk nama budaya berdasarkan RFC 4646 adalah languagecode2-country/regioncode2, di mana languagecode2 adalah kode bahasa dua huruf dan country/regioncode2 merupakan kode subkultur dua huruf. Contohnya termasuk ja-JP untuk bahasa Jepang (Jepang) dan en-US untuk bahasa Inggris (Amerika Serikat). Dalam kasus di mana kode bahasa dua huruf tidak tersedia, kode tiga huruf seperti yang didefinisikan dalam ISO 639-3 digunakan.

Beberapa nama budaya juga menentukan skrip ISO 15924. Misalnya, Cyrl menentukan skrip Sirilik dan Latn menentukan skrip Latin. Nama budaya yang menyertakan skrip menggunakan pola languagecode2country/regioncode2-scripttag-. Contoh jenis nama budaya ini adalah uz-Cyrl-UZ untuk Uzbek (Sirilik, Uzbekistan). Pada sistem operasi Windows sebelum Windows Vista, nama budaya yang menyertakan skrip menggunakan pola languagecode2--country/regioncode2scripttag, misalnya, uz-UZ-Cyrl untuk Uzbek (Sirilik, Uzbekistan).

Budaya netral hanya ditentukan oleh kode bahasa huruf kecil dua huruf. Misalnya, fr menentukan budaya netral untuk bahasa Prancis, dan de menentukan budaya netral untuk bahasa Jerman.

Catatan

Ada dua nama budaya yang bertentangan dengan aturan ini. Budaya Tionghoa (Sederhana), bernama zh-Hans, dan Tionghoa (Tradisional), bernama zh-Hant, adalah budaya netral. Nama budaya mewakili standar saat ini dan harus digunakan kecuali Anda memiliki alasan untuk menggunakan nama zh-CHS yang lebih lama dan zh-CHT.

Pengidentifikasi budaya adalah singkatan numerik internasional standar dan memiliki komponen yang diperlukan untuk mengidentifikasi salah satu budaya yang dipasang secara unik. Aplikasi Anda dapat menggunakan pengidentifikasi budaya yang telah ditentukan sebelumnya atau menentukan pengidentifikasi kustom.

Nama dan pengidentifikasi budaya tertentu yang telah ditentukan sebelumnya digunakan oleh ini dan kelas lain di System.Globalization namespace layanan. Untuk informasi budaya terperinci untuk sistem Windows, lihat kolom Tag bahasa dalam daftar nama bahasa/wilayah yang didukung oleh Windows. Nama budaya mengikuti standar yang ditentukan oleh BCP 47.

Nama dan pengidentifikasi budaya hanya mewakili subset budaya yang dapat ditemukan di komputer tertentu. Versi Windows atau paket layanan dapat mengubah budaya yang tersedia. Aplikasi dapat menambahkan budaya kustom menggunakan CultureAndRegionInfoBuilder kelas . Pengguna dapat menambahkan budaya kustom mereka sendiri menggunakan alat Microsoft Locale Builder . Microsoft Locale Builder ditulis dalam kode terkelola menggunakan CultureAndRegionInfoBuilder kelas .

Beberapa nama berbeda terkait erat dengan budaya, terutama nama yang terkait dengan anggota kelas berikut:

Budaya invarian, netral, dan spesifik

Budaya umumnya dikelompokkan menjadi tiga set: budaya invarian, budaya netral, dan budaya tertentu.

Budaya yang invarian tidak peka terhadap budaya. Aplikasi Anda menentukan budaya invarian berdasarkan nama menggunakan string kosong ("") atau dengan pengidentifikasinya. InvariantCulture mendefinisikan instans budaya invarian. Ini dikaitkan dengan bahasa Inggris tetapi tidak dengan negara/wilayah mana pun. Ini digunakan dalam hampir semua metode di Globalization namespace layanan yang membutuhkan budaya.

Budaya netral adalah budaya yang terkait dengan bahasa tetapi tidak dengan negara/wilayah. Budaya tertentu adalah budaya yang terkait dengan bahasa dan negara/wilayah. Misalnya, fr adalah nama netral untuk budaya Prancis, dan fr-FR merupakan nama budaya Prancis (Prancis) tertentu. Perhatikan bahwa Bahasa Tionghoa (Sederhana) dan Tionghoa (Tradisional) juga dianggap sebagai budaya netral.

Membuat instans CompareInfo kelas untuk budaya netral tidak disarankan karena data yang dikandungnya sekejap. Untuk menampilkan dan mengurutkan data, tentukan bahasa dan wilayah. Selain itu, Name properti objek yang CompareInfo dibuat untuk budaya netral hanya mengembalikan negara dan tidak termasuk wilayah tersebut.

Budaya yang ditentukan memiliki hierarki di mana induk budaya tertentu adalah budaya netral dan induk budaya netral adalah budaya invarian. Properti Parent ini berisi budaya netral yang terkait dengan budaya tertentu. Budaya kustom harus mendefinisikan Parent properti sesuai dengan pola ini.

Jika sumber daya untuk budaya tertentu tidak tersedia dalam sistem operasi, sumber daya untuk budaya netral terkait digunakan. Jika sumber daya untuk budaya netral tidak tersedia, sumber daya yang disematkan di assembly utama digunakan. Untuk informasi selengkapnya tentang proses fallback sumber daya, lihat Mengemas dan Menyebarkan Sumber Daya.

Daftar lokal di Windows API sedikit berbeda dari daftar budaya yang didukung oleh .NET. Jika interoperabilitas dengan Windows diperlukan, misalnya, melalui mekanisme p/invoke, aplikasi harus menggunakan budaya tertentu yang ditentukan untuk sistem operasi. Penggunaan budaya tertentu memastikan konsistensi dengan lokal Windows yang setara, yang diidentifikasi dengan pengidentifikasi lokal yang sama LCIDdengan .

A DateTimeFormatInfo atau dapat NumberFormatInfo dibuat hanya untuk budaya invarian atau untuk budaya tertentu, bukan untuk budaya netral.

Jika DateTimeFormatInfo.Calendar adalah TaiwanCalendar tetapi Thread.CurrentCulture tidak diatur ke zh-TW, maka DateTimeFormatInfo.NativeCalendarName, , DateTimeFormatInfo.GetEraNamedan DateTimeFormatInfo.GetAbbreviatedEraName mengembalikan string kosong ("").

Budaya kustom

Di Windows, Anda dapat membuat lokal kustom. Untuk informasi selengkapnya, lihat Lokal kustom.

CultureInfo dan data budaya

.NET memperoleh data budayanya dari salah satu dari berbagai sumber, tergantung pada implementasi, platform, dan versi:

  • Di semua versi .NET (Core) yang berjalan pada platform Unix atau Windows 10 dan versi yang lebih baru, data budaya disediakan oleh International Components for Unicode (ICU) Library. Versi spesifik Pustaka ICU bergantung pada sistem operasi individual.
  • Di semua versi .NET (Core) yang berjalan pada Windows 9 dan versi yang lebih lama, data budaya disediakan oleh sistem operasi Windows.
  • Dalam .NET Framework 4 dan versi yang lebih baru, data budaya disediakan oleh sistem operasi Windows.

Karena itu, budaya yang tersedia pada implementasi , platform, atau versi .NET tertentu mungkin tidak tersedia pada implementasi , platform, atau versi .NET yang berbeda.

Beberapa CultureInfo objek berbeda tergantung pada platform yang mendasar. Secara khusus, zh-CN, atau Cina (Sederhana, Cina) dan zh-TW, atau Cina (Tradisional, Taiwan), tersedia budaya pada sistem Windows, tetapi mereka adalah budaya alias pada sistem Unix. "zh-CN" adalah alias untuk budaya "zh-Hans-CN", dan "zh-TW" adalah alias untuk budaya "zh-Hant-TW". Budaya alias tidak dikembalikan oleh panggilan ke GetCultures metode dan mungkin memiliki nilai properti yang berbeda, termasuk budaya yang berbeda Parent , daripada rekan-rekan Windows mereka. Untuk budaya zh-CN dan zh-TW , perbedaan ini termasuk yang berikut:

  • Pada sistem Windows, budaya induk dari budaya "zh-CN" adalah "zh-Hans", dan budaya induk dari budaya "zh-TW" adalah "zh-Hant". Budaya induk dari kedua budaya ini adalah "zh". Pada sistem Unix, orang tua dari kedua budaya adalah "zh". Ini berarti bahwa, jika Anda tidak menyediakan sumber daya khusus budaya untuk budaya "zh-CN" atau "zh-TW" tetapi menyediakan sumber daya untuk budaya "zh-Hans" atau "zh-Hant" netral, aplikasi Anda akan memuat sumber daya untuk budaya netral di Windows tetapi tidak di Unix. Pada sistem Unix, Anda harus secara eksplisit mengatur utas CurrentUICulture ke "zh-Hans" atau "zh-Hant".

  • Pada sistem Windows, memanggil CultureInfo.Equals instans yang mewakili budaya "zh-CN" dan meneruskannya instans true"zh-Hans-CN" mengembalikan . Pada sistem Unix, panggilan metode mengembalikan false. Perilaku ini juga berlaku untuk memanggil Equals instans "zh-TW" CultureInfo dan meneruskannya instans "zh-Hant-Tw".

Data budaya dinamis

Kecuali untuk budaya yang invarian, data budaya bersifat dinamis. Ini berlaku bahkan untuk budaya yang telah ditentukan sebelumnya. Misalnya, negara atau wilayah mengadopsi mata uang baru, mengubah ejaan kata-kata, atau mengubah kalender pilihan mereka, dan definisi budaya berubah untuk melacak ini. Budaya kustom dapat berubah tanpa pemberitahuan, dan budaya tertentu mungkin ditimpa oleh budaya pengganti kustom. Juga, seperti yang dibahas di bawah ini, pengguna individu dapat mengambil alih preferensi budaya. Aplikasi harus selalu mendapatkan data budaya pada waktu proses.

Perhatian

Saat menyimpan data, aplikasi Anda harus menggunakan budaya invarian, format biner, atau format independen budaya tertentu. Data yang disimpan sesuai dengan nilai saat ini yang terkait dengan budaya tertentu, selain budaya invarian, mungkin menjadi tidak dapat dibaca atau mungkin berubah dalam arti jika budaya tersebut berubah.

Budaya saat ini dan budaya UI saat ini

Setiap utas dalam aplikasi .NET memiliki budaya saat ini dan budaya UI saat ini. Budaya saat ini menentukan konvensi pemformatan untuk nilai tanggal, waktu, angka, dan mata uang, urutan pengurutan teks, konvensi casing, dan cara di mana string dibandingkan. Budaya UI saat ini digunakan untuk mengambil sumber daya khusus budaya pada waktu proses.

Catatan

Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan berdasarkan per utas, lihat bagian Budaya dan utas . Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan pada utas yang dijalankan di domain aplikasi baru, dan pada utas yang melintasi batas domain aplikasi, lihat bagian Budaya dan domain aplikasi. Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan pada utas yang melakukan operasi asinkron berbasis tugas, lihat bagian Budaya dan operasi asinkron berbasis tugas.

Untuk informasi lebih rinci tentang budaya saat ini, lihat CultureInfo.CurrentCulture properti . Untuk informasi lebih rinci tentang budaya UI saat ini, lihat CultureInfo.CurrentUICulture topik properti.

Mengambil budaya UI saat ini dan saat ini

Anda bisa mendapatkan CultureInfo objek yang mewakili budaya saat ini dengan salah satu dari dua cara:

Contoh berikut mengambil kedua nilai properti, membandingkannya untuk menunjukkan bahwa nilai tersebut sama, dan menampilkan nama budaya saat ini.

using System;
using System.Globalization;
using System.Threading;

public class CurrentCultureEx
{
    public static void Main()
    {
        CultureInfo culture1 = CultureInfo.CurrentCulture;
        CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
        Console.WriteLine("The current culture is {0}", culture1.Name);
        Console.WriteLine("The two CultureInfo objects are equal: {0}",
                          culture1 == culture2);
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True

Anda bisa mendapatkan CultureInfo objek yang mewakili budaya UI saat ini dengan salah satu dari dua cara:

Contoh berikut mengambil kedua nilai properti, membandingkannya untuk menunjukkan bahwa nilai tersebut sama, dan menampilkan nama budaya UI saat ini.

using System;
using System.Globalization;
using System.Threading;

public class CurrentUIEx
{
    public static void Main()
    {
        CultureInfo uiCulture1 = CultureInfo.CurrentUICulture;
        CultureInfo uiCulture2 = Thread.CurrentThread.CurrentUICulture;
        Console.WriteLine("The current UI culture is {0}", uiCulture1.Name);
        Console.WriteLine("The two CultureInfo objects are equal: {0}",
                          uiCulture1 == uiCulture2);
    }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True

Mengatur budaya UI saat ini dan saat ini

Untuk mengubah budaya dan budaya UI utas, lakukan hal berikut:

  1. Buat instans CultureInfo objek yang mewakili budaya tersebut dengan memanggil CultureInfo konstruktor kelas dan meneruskannya nama budaya. Konstruktor CultureInfo(String) membuat instans CultureInfo objek yang mencerminkan penimpaan pengguna jika budaya baru sama dengan budaya Windows saat ini. CultureInfo(String, Boolean) Konstruktor memungkinkan Anda menentukan apakah objek yang baru dibuat mencerminkan CultureInfo penimpaan pengguna jika budaya baru sama dengan budaya Windows saat ini.

  2. CultureInfo Tetapkan objek ke CultureInfo.CurrentCulture properti atau CultureInfo.CurrentUICulture pada .NET Core dan .NET Framework 4.6 dan versi yang lebih baru.

Contoh berikut mengambil budaya saat ini. Jika itu adalah apa pun selain budaya Prancis (Prancis), itu mengubah budaya saat ini menjadi Prancis (Prancis). Jika tidak, itu mengubah budaya saat ini menjadi Prancis (Luksemburg).

using System;
using System.Globalization;

public class ChangeEx1
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentCulture;
        Console.WriteLine("The current culture is {0}", current.Name);
        CultureInfo newCulture;
        if (current.Name.Equals("fr-FR"))
            newCulture = new CultureInfo("fr-LU");
        else
            newCulture = new CultureInfo("fr-FR");

        CultureInfo.CurrentCulture = newCulture;
        Console.WriteLine("The current culture is now {0}",
                          CultureInfo.CurrentCulture.Name);
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR

Contoh berikut mengambil budaya saat ini. Jika itu adalah sesuatu yang lain budaya Slovenia (Slovenia), itu mengubah budaya saat ini menjadi Slovenia (Slovenia). Jika tidak, itu mengubah budaya saat ini menjadi Kroasia (Kroasia).

using System;
using System.Globalization;

public class ChangeUICultureEx
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentUICulture;
        Console.WriteLine("The current UI culture is {0}", current.Name);
        CultureInfo newUICulture;
        if (current.Name.Equals("sl-SI"))
            newUICulture = new CultureInfo("hr-HR");
        else
            newUICulture = new CultureInfo("sl-SI");

        CultureInfo.CurrentUICulture = newUICulture;
        Console.WriteLine("The current UI culture is now {0}",
                          CultureInfo.CurrentUICulture.Name);
    }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The current UI culture is now sl-SI

Dapatkan semua budaya

Anda dapat mengambil array kategori budaya tertentu atau dari semua budaya yang tersedia di komputer lokal dengan memanggil GetCultures metode . Misalnya, Anda dapat mengambil budaya kustom, budaya tertentu, atau budaya netral baik sendiri atau dalam kombinasi.

Contoh berikut memanggil GetCultures metode dua kali, pertama dengan System.Globalization.CultureTypes anggota enumerasi untuk mengambil semua budaya kustom, dan kemudian dengan System.Globalization.CultureTypes anggota enumerasi untuk mengambil semua budaya pengganti.

using System;
using System.Globalization;

public class GetCulturesEx
{
    public static void Main()
    {
        // Get all custom cultures.
        CultureInfo[] custom = CultureInfo.GetCultures(CultureTypes.UserCustomCulture);
        if (custom.Length == 0)
        {
            Console.WriteLine("There are no user-defined custom cultures.");
        }
        else
        {
            Console.WriteLine("Custom cultures:");
            foreach (var culture in custom)
                Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);
        }
        Console.WriteLine();

        // Get all replacement cultures.
        CultureInfo[] replacements = CultureInfo.GetCultures(CultureTypes.ReplacementCultures);
        if (replacements.Length == 0)
        {
            Console.WriteLine("There are no replacement cultures.");
        }
        else
        {
            Console.WriteLine("Replacement cultures:");
            foreach (var culture in replacements)
                Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);
        }
        Console.WriteLine();
    }
}
// The example displays output like the following:
//     Custom cultures:
//        x-en-US-sample -- English (United States)
//        fj-FJ -- Boumaa Fijian (Viti)
//
//     There are no replacement cultures.

Budaya dan utas

Ketika utas aplikasi baru dimulai, budayanya saat ini dan budaya UI saat ini didefinisikan oleh budaya sistem saat ini, dan bukan oleh budaya utas saat ini. Contoh berikut mengilustrasikan perbedaannya. Ini menetapkan budaya saat ini dan budaya UI saat ini dari utas aplikasi ke budaya Prancis (Prancis) (fr-FR). Jika budaya saat ini sudah fr-FR, contohnya menetapkannya ke budaya Inggris (Amerika Serikat) (en-US). Ini menampilkan tiga angka acak sebagai nilai mata uang dan kemudian membuat utas baru, yang, pada gilirannya, menampilkan tiga angka acak lagi sebagai nilai mata uang. Tetapi seperti yang ditunjukkan oleh output dari contoh, nilai mata uang yang ditampilkan oleh utas baru tidak mencerminkan konvensi pemformatan budaya Prancis (Prancis), tidak seperti output dari utas aplikasi utama.

using System;
using System.Globalization;
using System.Threading;

public class DefaultThreadEx
{
    static Random rnd = new Random();

    public static void Main()
    {
        if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR")
        {
            // If current culture is not fr-FR, set culture to fr-FR.
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        }
        else
        {
            // Set culture to en-US.
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
        }
        ThreadProc();

        Thread worker = new Thread(ThreadProc);
        worker.Name = "WorkerThread";
        worker.Start();
    }

    private static void DisplayThreadInfo()
    {
        Console.WriteLine("\nCurrent Thread Name: '{0}'",
                          Thread.CurrentThread.Name);
        Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
                          Thread.CurrentThread.CurrentCulture.Name,
                          Thread.CurrentThread.CurrentUICulture.Name);
    }

    private static void DisplayValues()
    {
        // Create new thread and display three random numbers.
        Console.WriteLine("Some currency values:");
        for (int ctr = 0; ctr <= 3; ctr++)
            Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);
    }

    private static void ThreadProc()
    {
        DisplayThreadInfo();
        DisplayValues();
    }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          8,11 €
//          1,48 €
//          8,99 €
//          9,04 €
//
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: en-US/en-US
//       Some currency values:
//          $6.72
//          $6.35
//          $2.90
//          $7.72

Anda dapat mengatur budaya dan budaya UI dari semua utas dalam domain aplikasi dengan menetapkan CultureInfo objek yang mewakili budaya tersebut DefaultThreadCurrentCulture ke properti dan DefaultThreadCurrentUICulture . Contoh berikut menggunakan properti ini untuk memastikan bahwa semua utas di domain aplikasi default memiliki budaya yang sama.

using System;
using System.Globalization;
using System.Threading;

public class SetThreadsEx
{
    static Random rnd = new Random();

    public static void Main()
    {
        if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR")
        {
            // If current culture is not fr-FR, set culture to fr-FR.
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        }
        else
        {
            // Set culture to en-US.
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
        }
        ThreadProc();

        Thread worker = new Thread(SetThreadsEx.ThreadProc);
        worker.Name = "WorkerThread";
        worker.Start();
    }

    private static void DisplayThreadInfo()
    {
        Console.WriteLine("\nCurrent Thread Name: '{0}'",
                          Thread.CurrentThread.Name);
        Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
                          Thread.CurrentThread.CurrentCulture.Name,
                          Thread.CurrentThread.CurrentUICulture.Name);
    }

    private static void DisplayValues()
    {
        // Create new thread and display three random numbers.
        Console.WriteLine("Some currency values:");
        for (int ctr = 0; ctr <= 3; ctr++)
            Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);
    }

    private static void ThreadProc()
    {
        DisplayThreadInfo();
        DisplayValues();
    }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €

Peringatan

DefaultThreadCurrentCulture Meskipun properti dan DefaultThreadCurrentUICulture adalah anggota statis, mereka menentukan budaya default dan budaya UI default hanya untuk domain aplikasi yang saat ini pada saat nilai properti ini ditetapkan. Untuk informasi selengkapnya, lihat bagian berikutnya, Budaya dan domain aplikasi.

Ketika Anda menetapkan nilai ke DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture , budaya dan budaya UI utas di domain aplikasi juga berubah jika mereka belum secara eksplisit diberi budaya. Namun, utas ini hanya mencerminkan pengaturan budaya baru saat dijalankan di domain aplikasi saat ini. Jika utas ini dijalankan di domain aplikasi lain, budaya mereka menjadi budaya default yang ditentukan untuk domain aplikasi tersebut. Akibatnya, kami sarankan Anda selalu mengatur budaya utas aplikasi utama, dan tidak mengandalkan DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture untuk mengubahnya.

Domain budaya dan aplikasi

DefaultThreadCurrentCulture dan DefaultThreadCurrentUICulture adalah properti statis yang secara eksplisit mendefinisikan budaya default hanya untuk domain aplikasi yang saat ini ketika nilai properti diatur atau diambil. Contoh berikut menetapkan budaya default dan budaya UI default di domain aplikasi default ke Prancis (Prancis), dan kemudian menggunakan AppDomainSetup kelas dan AppDomainInitializer delegasi untuk mengatur budaya default dan budaya UI dalam domain aplikasi baru ke Rusia (Rusia). Satu utas kemudian menjalankan dua metode di setiap domain aplikasi. Perhatikan bahwa budaya utas dan budaya UI tidak ditetapkan secara eksplisit; mereka berasal dari budaya default dan budaya UI domain aplikasi tempat utas dijalankan. Perhatikan juga bahwa DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture mengembalikan nilai default CultureInfo domain aplikasi yang saat ini saat panggilan metode dilakukan.

using System;
using System.Globalization;

public class Example
{
    public static void Main()
    {
        // Set the default culture and display the current date in the current application domain.
        Info info1 = new Info();
        SetAppDomainCultures("fr-FR");

        // Create a second application domain.
        AppDomainSetup setup = new AppDomainSetup();
        setup.AppDomainInitializer = SetAppDomainCultures;
        setup.AppDomainInitializerArguments = new string[] { "ru-RU" };
        AppDomain domain = AppDomain.CreateDomain("Domain2", null, setup);
        // Create an Info object in the new application domain.
        Info info2 = (Info)domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                           "Info");

        // Execute methods in the two application domains.
        info2.DisplayDate();
        info2.DisplayCultures();

        info1.DisplayDate();
        info1.DisplayCultures();
    }

    public static void SetAppDomainCultures(string[] names)
    {
        SetAppDomainCultures(names[0]);
    }

    public static void SetAppDomainCultures(string name)
    {
        try
        {
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name);
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name);
        }
        // If an exception occurs, we'll just fall back to the system default.
        catch (CultureNotFoundException)
        {
            return;
        }
        catch (ArgumentException)
        {
            return;
        }
    }
}

public class Info : MarshalByRefObject
{
    public void DisplayDate()
    {
        Console.WriteLine("Today is {0:D}", DateTime.Now);
    }

    public void DisplayCultures()
    {
        Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id);
        Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture);
        Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture);
    }
}
// The example displays the following output:
//       Today is 14 октября 2011 г.
//       Application domain is 2
//       Default Culture: ru-RU
//       Default UI Culture: ru-RU
//       Today is vendredi 14 octobre 2011
//       Application domain is 1
//       Default Culture: fr-FR
//       Default UI Culture: fr-FR

Untuk informasi selengkapnya tentang budaya dan domain aplikasi, lihat bagian "Domain aplikasi dan Utas" di topik Domain Aplikasi.

Budaya dan operasi asinkron berbasis tugas

Pola pemrograman asinkron berbasis tugas menggunakan Task objek dan Task<TResult> untuk menjalankan delegasi secara asinkron pada utas kumpulan utas. Utas spesifik tempat tugas tertentu berjalan tidak diketahui sebelumnya, tetapi hanya ditentukan pada runtime.

Untuk aplikasi yang menargetkan .NET Framework 4.6 atau versi yang lebih baru, budaya adalah bagian dari konteks operasi asinkron. Dengan kata lain, operasi asinkron secara default mewarisi nilai CurrentCulture dan CurrentUICulture properti utas tempat mereka diluncurkan. Jika budaya saat ini atau budaya UI saat ini berbeda dari budaya sistem, budaya saat ini melewati batas utas dan menjadi budaya utas kumpulan utas saat ini yang menjalankan operasi asinkron.

Contoh berikut memberikan ilustrasi sederhana. Contoh mendefinisikan Func<TResult> delegasi, formatDelegate, yang mengembalikan beberapa angka yang diformat sebagai nilai mata uang. Contoh mengubah budaya sistem saat ini menjadi Prancis (Prancis) atau, jika Prancis (Prancis) sudah menjadi budaya saat ini, Inggris (Amerika Serikat). Kemudian:

  • Memanggil delegasi secara langsung sehingga berjalan secara sinkron pada utas aplikasi utama.
  • Membuat tugas yang menjalankan delegasi secara asinkron pada utas kumpulan utas.
  • Membuat tugas yang menjalankan delegasi secara sinkron pada utas aplikasi utama dengan memanggil Task.RunSynchronously metode .

Seperti yang ditunjukkan oleh output dari contoh, ketika budaya saat ini diubah menjadi Bahasa Prancis (Prancis), budaya utas saat ini dari mana tugas dipanggil secara asinkron menjadi budaya saat ini untuk operasi asinkron itu.

using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;

public class AsyncCultureEx1
{
    public static void Main()
    {
        decimal[] values = { 163025412.32m, 18905365.59m };
        string formatString = "C2";

        string FormatDelegate()
        {
            string output = $"Formatting using the {CultureInfo.CurrentCulture.Name} " +
            "culture on thread {Thread.CurrentThread.ManagedThreadId}.\n";
            foreach (decimal value in values)
                output += $"{value.ToString(formatString)}   ";

            output += Environment.NewLine;
            return output;
        }

        Console.WriteLine($"The example is running on thread {Thread.CurrentThread.ManagedThreadId}");
        // Make the current culture different from the system culture.
        Console.WriteLine($"The current culture is {CultureInfo.CurrentCulture.Name}");
        if (CultureInfo.CurrentCulture.Name == "fr-FR")
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        else
            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

        Console.WriteLine($"Changed the current culture to {CultureInfo.CurrentCulture.Name}.\n");

        // Execute the delegate synchronously.
        Console.WriteLine("Executing the delegate synchronously:");
        Console.WriteLine(FormatDelegate());

        // Call an async delegate to format the values using one format string.
        Console.WriteLine("Executing a task asynchronously:");
        var t1 = Task.Run(FormatDelegate);
        Console.WriteLine(t1.Result);

        Console.WriteLine("Executing a task synchronously:");
        var t2 = new Task<string>(FormatDelegate);
        t2.RunSynchronously();
        Console.WriteLine(t2.Result);
    }
}
// The example displays the following output:
//         The example is running on thread 1
//         The current culture is en-US
//         Changed the current culture to fr-FR.
//
//         Executing the delegate synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task asynchronously:
//         Formatting using the fr-FR culture on thread 3.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €

DefaultThreadCurrentCulture dan DefaultThreadCurrentUICulture merupakan properti domain per aplikasi; yaitu, mereka membangun budaya default untuk semua utas yang tidak secara eksplisit menetapkan budaya di domain aplikasi tertentu. Namun, untuk aplikasi yang menargetkan .NET Framework 4.6 atau yang lebih baru, budaya utas panggilan tetap menjadi bagian dari konteks tugas asinkron meskipun tugas melewati batas domain aplikasi.

Serialisasi objek CultureInfo

CultureInfo Ketika objek diserialisasikan, semua yang benar-benar disimpan adalah Name dan UseUserOverride. Ini berhasil dideserialisasi hanya di lingkungan di mana yang Name memiliki arti yang sama. Tiga contoh berikut menunjukkan mengapa ini tidak selalu terjadi:

  • CultureTypes Jika nilai properti adalah CultureTypes.InstalledWin32Cultures, dan jika budaya tersebut pertama kali diperkenalkan dalam versi tertentu dari sistem operasi Windows, tidak mungkin untuk mendeserialisasinya pada versi Windows yang lebih lama. Misalnya, jika budaya diperkenalkan di Windows 10, itu tidak dapat dideserialisasi pada Windows 8.

  • CultureTypes Jika nilainya adalah CultureTypes.UserCustomCulture, dan komputer tempatnya dideserialisasi tidak menginstal budaya kustom pengguna ini, tidak mungkin untuk mendeserialisasinya.

  • CultureTypes Jika nilainya adalah CultureTypes.ReplacementCultures, dan komputer tempat deserialisasi tidak memiliki budaya pengganti ini, ia mendeserialisasi ke nama yang sama, tetapi tidak semua karakteristik yang sama. Misalnya, jika en-US adalah budaya pengganti di komputer A, tetapi tidak di komputer B, dan jika objek yang CultureInfo mengacu pada budaya ini diserialisasikan di komputer A dan dideserialisasi pada komputer B, maka tidak ada karakteristik kustom budaya yang ditransmisikan. Budaya berhasil dideserialisasi, tetapi dengan arti yang berbeda.

penimpaan Panel Kontrol

Pengguna mungkin memilih untuk mengambil alih beberapa nilai yang terkait dengan budaya Windows saat ini melalui bagian opsi regional dan bahasa dari Panel Kontrol. Misalnya, pengguna dapat memilih untuk menampilkan tanggal dalam format yang berbeda atau menggunakan mata uang selain default untuk budaya. Secara umum, aplikasi Anda harus mematuhi penimpaan pengguna ini.

Jika UseUserOverride adalah true dan budaya yang ditentukan cocok dengan budaya Windows saat ini, penggunaan penimpaan tersebut CultureInfo , termasuk pengaturan pengguna untuk properti DateTimeFormatInfo instans yang dikembalikan oleh DateTimeFormat properti, dan properti NumberFormatInfo instans yang dikembalikan oleh NumberFormat properti . Jika pengaturan pengguna tidak kompatibel dengan budaya yang terkait dengan CultureInfo, misalnya, jika kalender yang dipilih bukan salah satu dari OptionalCalendars, hasil metode dan nilai properti tidak terdefinisi.

Urutan pengurutan alternatif

Beberapa budaya mendukung lebih dari satu urutan sortir. Misalnya:

  • Budaya Spanyol (Spanyol) memiliki dua urutan sortir: urutan sortir internasional default, dan urutan sortir tradisional. Ketika Anda membuat CultureInfo instans objek dengan es-ES nama budaya, urutan sortir internasional digunakan. Saat Anda membuat CultureInfo instans objek dengan es-ES-tradnl nama budaya, urutan sortir tradisional digunakan.

  • Budaya zh-CN (Tionghoa (Sederhana, RRC)) mendukung dua urutan sortir: dengan pengucapan (default) dan menurut jumlah stroke. Saat Anda membuat CultureInfo instans objek dengan zh-CN nama budaya, urutan pengurutan default digunakan. Saat Anda membuat CultureInfo instans objek dengan pengidentifikasi lokal 0x00020804, string diurutkan menurut jumlah goresan.

Tabel berikut mencantumkan budaya yang mendukung urutan pengurutan alternatif dan pengidentifikasi untuk urutan pengurutan default dan alternatif.

Nama kultur Kultur Nama dan pengidentifikasi pengurutan default Nama dan pengidentifikasi pengurutan alternatif
es-ES Spanyol (Spanyol) Internasional: 0x00000C0A Tradisional: 0x0000040A
zh-TW China (Taiwan) Jumlah Stroke: 0x00000404 Bopomofo: 0x00030404
zh-CN Tionghoa (RRC) Pengucapan: 0x00000804 Jumlah Stroke: 0x00020804
zh-HK China (SAR Hong Kong) Jumlah Stroke: 0x00000c04 Jumlah Stroke: 0x00020c04
zh-SG Bahasa Tionghoa (Singapura) Pengucapan: 0x00001004 Jumlah Stroke: 0x00021004
zh-MO Bahasa Mandarin (Macau SAR) Pengucapan: 0x00001404 Jumlah Stroke: 0x00021404
ja-JP Jepang (Jepang) Default: 0x00000411 Unicode: 0x00010411
ko-KR Korea (Korea) Default: 0x00000412 Korea Xwansung - Unicode: 0x00010412
de-DE Jerman (Jerman) Kamus: 0x00000407 DIN Pengurutan Buku Telepon: 0x00010407
hu-HU Bahasa Hungaria (Hungaria) Default: 0x0000040e Pengurutan Teknis: 0x0001040e
ka-GE Georgia (Georgia) Tradisional: 0x00000437 Pengurutan Modern: 0x00010437

Budaya saat ini dan aplikasi UWP

Di aplikasi Platform Windows Universal (UWP), CurrentCulture properti dan CurrentUICulture bersifat baca-tulis, sama seperti yang ada di aplikasi .NET Framework dan .NET Core. Namun, aplikasi UWP mengenali satu budaya. Properti CurrentCulture dan CurrentUICulture memetakan ke nilai pertama dalam koleksi Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

Di aplikasi .NET, budaya saat ini adalah pengaturan per utas, dan CurrentCulture properti dan CurrentUICulture mencerminkan budaya dan budaya UI dari utas saat ini saja. Di aplikasi UWP, budaya saat ini memetakan ke koleksi Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , yang merupakan pengaturan global. CurrentCulture Mengatur properti atau CurrentUICulture mengubah budaya seluruh aplikasi; budaya tidak dapat diatur berdasarkan per utas.