Properti System.Globalization.CultureInfo.CurrentCulture

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

Objek CultureInfo yang dikembalikan oleh CurrentCulture properti dan objek terkait menentukan format default untuk nilai tanggal, waktu, angka, dan mata uang, urutan pengurutan teks, konvensi casing, dan perbandingan string.

Budaya saat ini adalah properti dari utas yang dieksekusi. Saat Anda mengatur properti ini ke CultureInfo objek yang mewakili budaya baru, nilai Thread.CurrentThread.CurrentCulture properti juga berubah. Namun, kami sarankan CultureInfo.CurrentCulture Anda selalu menggunakan properti untuk mengambil dan mengatur budaya saat ini.

Objek CultureInfo yang dikembalikan properti ini bersifat baca-saja. Itu berarti Anda tidak dapat membisukan objek yang ada, misalnya, dengan mengubah DateTimeFormat. Untuk mengubah format tanggal-waktu atau beberapa aspek lain dari budaya saat ini, buat objek baru CultureInfo dan tetapkan ke properti .

Bagaimana budaya utas ditentukan

Ketika utas dimulai, budayanya awalnya ditentukan sebagai berikut:

  • Dengan mengambil budaya yang ditentukan oleh DefaultThreadCurrentCulture properti di domain aplikasi tempat utas dijalankan, jika nilai properti bukan null.

  • Jika utas adalah utas kumpulan utas yang menjalankan operasi asinkron berbasis tugas, budayanya ditentukan oleh budaya utas panggilan. Contoh berikut mengubah budaya saat ini menjadi Bahasa Portugis (Brasil) dan meluncurkan enam tugas, yang masing-masing menampilkan ID utasnya, ID tugasnya, dan budayanya saat ini. Setiap tugas (dan utas) telah mewarisi budaya utas panggilan.

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.Versioning;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class Example14
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();
            Console.WriteLine("The current culture is {0}",
                              Thread.CurrentThread.CurrentCulture.Name);
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            // Change the current culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                              Thread.CurrentThread.CurrentCulture.Name);
            Console.WriteLine("Application thread is thread {0}",
                              Thread.CurrentThread.ManagedThreadId);
            // Launch six tasks and display their current culture.
            for (int ctr = 0; ctr <= 5; ctr++)
                tasks.Add(Task.Run(() =>
                {
                    Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                      Task.CurrentId,
                                      Thread.CurrentThread.ManagedThreadId,
                                      Thread.CurrentThread.CurrentCulture.Name);
                }));
    
            await Task.WhenAll(tasks.ToArray());
        }
    }
    // The example displays output like the following:
    //     The current culture is en-US
    //     Current culture changed to pt-BR
    //     Application thread is thread 9
    //     Culture of task 2 on thread 11 is pt-BR
    //     Culture of task 1 on thread 10 is pt-BR
    //     Culture of task 3 on thread 11 is pt-BR
    //     Culture of task 5 on thread 11 is pt-BR
    //     Culture of task 6 on thread 11 is pt-BR
    //     Culture of task 4 on thread 10 is pt-BR
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example1
        Public Sub S1()
            Dim tasks As New List(Of Task)
            Console.WriteLine("The current culture is {0}",
                            Thread.CurrentThread.CurrentCulture.Name)
            Thread.CurrentThread.CurrentCulture = New CultureInfo("pt-BR")
            ' Change the current culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                            Thread.CurrentThread.CurrentCulture.Name)
            Console.WriteLine("Application thread is thread {0}",
                            Thread.CurrentThread.ManagedThreadId)
            ' Launch six tasks and display their current culture.
            For ctr As Integer = 0 To 5
                tasks.Add(Task.Run(Sub()
                                       Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                                     Task.CurrentId,
                                                     Thread.CurrentThread.ManagedThreadId,
                                                     Thread.CurrentThread.CurrentCulture.Name)
                                   End Sub))
            Next
            Task.WaitAll(tasks.ToArray())
        End Sub
    End Module
    ' The example displays output like the following:
    '     The current culture is en-US
    '     Current culture changed to pt-BR
    '     Application thread is thread 9
    '     Culture of task 2 on thread 11 is pt-BR
    '     Culture of task 1 on thread 10 is pt-BR
    '     Culture of task 3 on thread 11 is pt-BR
    '     Culture of task 5 on thread 11 is pt-BR
    '     Culture of task 6 on thread 11 is pt-BR
    '     Culture of task 4 on thread 10 is pt-BR
    

    Untuk informasi selengkapnya, lihat Budaya dan operasi asinkron berbasis tugas.

  • Dengan memanggil GetUserDefaultLocaleName fungsi pada Windows atau uloc_getDefault fungsi dari ICU, yang saat ini memanggil fungsi POSIX setlocale dengan kategori LC_MESSAGES, pada sistem seperti Unix.

Perhatikan bahwa jika Anda menetapkan budaya tertentu yang berbeda dari budaya yang diinstal sistem atau budaya pilihan pengguna, dan aplikasi Anda memulai beberapa utas, budaya utas tersebut saat ini akan menjadi budaya yang dikembalikan oleh GetUserDefaultLocaleName fungsi, kecuali Anda menetapkan budaya ke DefaultThreadCurrentCulture properti di domain aplikasi tempat utas dijalankan.

Untuk informasi selengkapnya tentang bagaimana budaya utas ditentukan, lihat bagian "Budaya dan utas" di CultureInfo halaman referensi.

Dapatkan budaya saat ini

Properti CultureInfo.CurrentCulture ini adalah pengaturan per utas; artinya, setiap utas dapat memiliki budayanya sendiri. Anda mendapatkan budaya utas saat ini dengan mengambil nilai CultureInfo.CurrentCulture properti, seperti yang diilustrasikan contoh berikut.

using System;
using System.Globalization;

public class Example5
{
   public static void Main()
   {
      CultureInfo culture = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name);
   }
}
// The example displays output like the following:
//       The current culture is English (United States) [en-US]
Imports System.Globalization

Module Example3
    Public Sub S1()
        Dim culture As CultureInfo = CultureInfo.CurrentCulture
        Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name)
    End Sub
End Module
' The example displays output like the following:
'     The current culture is English (United States) [en-US]

Mengatur properti CurrentCulture secara eksplisit

Untuk mengubah budaya yang digunakan oleh utas yang ada, Anda mengatur CultureInfo.CurrentCulture properti ke budaya baru. Jika Anda secara eksplisit mengubah budaya utas dengan cara ini, perubahan tersebut tetap ada jika utas melewati batas domain aplikasi. Contoh berikut mengubah budaya utas saat ini menjadi Belanda (Belanda). Ini juga menunjukkan bahwa, ketika utas saat ini melewati batas domain aplikasi, budayanya saat ini tetap berubah.

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

public class Info11 : MarshalByRefObject
{
    public void ShowCurrentCulture()
    {
        Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                          Thread.CurrentThread.Name,
                          AppDomain.CurrentDomain.FriendlyName,
                          CultureInfo.CurrentCulture.Name);
    }
}

public class Example11
{
    public static void Main()
    {
        Info11 inf = new Info11();
        // Set the current culture to Dutch (Netherlands).
        Thread.CurrentThread.Name = "MainThread";
        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
        inf.ShowCurrentCulture();

        // Create a new application domain.
        AppDomain ad = AppDomain.CreateDomain("Domain2");
        Info11 inf2 = (Info11)ad.CreateInstanceAndUnwrap(typeof(Info11).Assembly.FullName, "Info11");
        inf2.ShowCurrentCulture();
    }
}
// The example displays the following output:
//       Culture of MainThread in application domain ChangeCulture1.exe: nl-NL
//       Culture of MainThread in application domain Domain2: nl-NL
Imports System.Globalization
Imports System.Threading

Public Class Info : Inherits MarshalByRefObject
   Public Sub ShowCurrentCulture()
      Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                        Thread.CurrentThread.Name,
                        AppDomain.CurrentDomain.FriendlyName,
                        CultureInfo.CurrentCulture.Name)
   End Sub
End Class

Module Example2
    Public Sub S1()
        Dim inf As New Info()
        ' Set the current culture to Dutch (Netherlands).
        Thread.CurrentThread.Name = "MainThread"
        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL")
        inf.ShowCurrentCulture()

        ' Create a new application domain.
        Dim ad As AppDomain = AppDomain.CreateDomain("Domain2")
        Dim inf2 As Info = CType(ad.CreateInstanceAndUnwrap(GetType(Info).Assembly.FullName, "Info"),
                          Info)
        inf2.ShowCurrentCulture()
    End Sub
End Module
' This example displays the following output:
'       Culture of MainThread in application domain Example.exe: nl-NL
'       Culture of MainThread in application domain Domain2: nl-NL

Catatan

Mengubah budaya dengan menggunakan CultureInfo.CurrentCulture properti memerlukan SecurityPermission izin dengan nilai yang ControlThread ditetapkan. Memanipulasi utas berbahaya karena status keamanan yang terkait dengan utas. Oleh karena itu, izin ini harus diberikan hanya untuk kode yang dapat dipercaya, dan kemudian hanya seperlunya. Anda tidak dapat mengubah budaya utas dalam kode semi-tepercaya.

Dimulai dengan .NET Framework 4, Anda dapat secara eksplisit mengubah budaya utas saat ini menjadi budaya tertentu (seperti Prancis (Kanada)) atau budaya netral (seperti Prancis). Ketika objek CultureInfo mewakili budaya netral, nilai-nilai CultureInfo properti seperti Calendar, , CompareInfoDateTimeFormat, NumberFormat, dan TextInfo mencerminkan budaya tertentu yang terkait dengan budaya netral. Misalnya, budaya dominan untuk budaya netral Inggris adalah Bahasa Inggris (Amerika Serikat); budaya dominan untuk budaya Jerman adalah Jerman (Jerman). Contoh berikut menggambarkan perbedaan pemformatan ketika budaya saat ini diatur ke budaya tertentu, Prancis (Kanada), dan budaya netral, Prancis.

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

public class Example12
{
   public static void Main()
   {
      double value = 1634.92;
      CultureInfo.CurrentCulture = new CultureInfo("fr-CA");
      Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}\n", value);

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}", value);
   }
}
// The example displays the following output:
//       Current Culture: fr-CA
//       1 634,92 $
//
//       Current Culture: fr
//       1 634,92 €
Imports System.Globalization
Imports System.Threading

Module Example4
    Public Sub S1()
        Dim value As Double = 1634.92
        CultureInfo.CurrentCulture = New CultureInfo("fr-CA")
        Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name)
        Console.WriteLine("{0:C2}", value)
        Console.WriteLine()

        Thread.CurrentThread.CurrentCulture = New CultureInfo("fr")
        Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name)
        Console.WriteLine("{0:C2}", value)
    End Sub
End Module
' The example displays the following output:
'       Current Culture: fr-CA
'       1 634,92 $
'       
'       Current Culture: fr
'       1 634,92 €

Anda juga dapat menggunakan CultureInfo.CurrentCulture properti bersama dengan HttpRequest.UserLanguages properti untuk mengatur CurrentCulture properti aplikasi ASP.NET ke budaya pilihan pengguna, seperti yang diilustrasikan contoh berikut.

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(Request13.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))

Kultur saat ini dan penimpaan pengguna

Windows memungkinkan pengguna untuk mengambil alih nilai CultureInfo properti standar objek dan objek terkait dengan menggunakan Opsi Regional dan Bahasa di Panel Kontrol. Objek CultureInfo yang CurrentCulture dikembalikan oleh properti mencerminkan penimpaan pengguna ini dalam kasus berikut:

  • Jika budaya utas saat ini diatur secara implisit oleh fungsi Windows GetUserDefaultLocaleName .

  • Jika budaya utas saat ini yang ditentukan oleh DefaultThreadCurrentCulture properti sesuai dengan budaya sistem Windows saat ini.

  • Jika budaya utas saat ini diatur secara eksplisit ke budaya yang dikembalikan oleh CreateSpecificCulture metode , dan budaya tersebut sesuai dengan budaya sistem Windows saat ini.

  • Jika budaya utas saat ini diatur secara eksplisit ke budaya yang dibuat oleh CultureInfo(String) konstruktor, dan budaya tersebut sesuai dengan budaya sistem Windows saat ini.

Dalam beberapa kasus, terutama untuk aplikasi server, mengatur budaya saat ini ke CultureInfo objek yang mencerminkan penimpaan pengguna mungkin tidak diinginkan. Sebagai gantinya, Anda dapat mengatur budaya saat ini ke CultureInfo objek yang tidak mencerminkan penimpaan pengguna dengan cara berikut:

Budaya saat ini dan aplikasi UWP

Di aplikasi Platform Windows Universal (UWP), CurrentCulture properti adalah baca-tulis, sama seperti di aplikasi .NET Framework dan .NET Core; Anda dapat menggunakannya untuk mendapatkan dan mengatur budaya saat ini. Namun, aplikasi UWP tidak membedakan antara budaya saat ini dan budaya UI saat ini. Properti CurrentCulture dan CurrentUICulture memetakan ke nilai pertama dalam koleksi Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

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