System.Globalization.CultureInfo.CurrentCulture 속성

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

속성 및 관련 개체에서 CurrentCulture 반환되는 개체는 CultureInfo 날짜, 시간, 숫자 및 통화 값의 기본 형식, 텍스트 정렬 순서, 대/소문자 규칙 및 문자열 비교를 결정합니다.

현재 문화권은 실행 중인 스레드의 속성입니다. 이 속성을 새 문화권을 나타내는 개체로 CultureInfo 설정하면 속성 값 Thread.CurrentThread.CurrentCulture 도 변경됩니다. 그러나 항상 속성을 사용하여 CultureInfo.CurrentCulture 현재 문화권을 검색하고 설정하는 것이 좋습니다.

CultureInfo 이 속성이 반환하는 개체는 읽기 전용입니다. 즉, 예를 들어 변경하여 DateTimeFormat기존 개체를 변경할 수 없습니다. 날짜-시간 형식 또는 현재 문화권의 다른 측면을 변경하려면 새 CultureInfo 개체를 만들고 속성에 할당합니다.

스레드 문화권 결정 방법

스레드가 시작되면 처음에는 다음과 같이 해당 문화권이 결정됩니다.

  • 지정 된 문화권을 검색 하 여는 DefaultThreadCurrentCulture 는 스레드가 실행 중인, 속성 값이 경우 애플리케이션 도메인 속성 null합니다.

  • 스레드가 작업 기반 비동기 작업을 실행하는 스레드 풀 스레드인 경우 해당 문화권은 호출 스레드의 문화권에 따라 결정됩니다. 다음은 현재 문화권을 포르투갈어(브라질)로 변경하고 각각 스레드 ID, 작업 ID 및 현재 문화권을 표시하는 6개의 작업을 시작하는 예제입니다. 각 작업(및 스레드)은 호출 스레드의 문화권을 상속했습니다.

    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
    

    자세한 내용은 문화권 및 작업 기반 비동기 작업을 참조 하세요.

  • Windows에서 GetUserDefaultLocaleName 함수를 호출하거나 uloc_getDefault 현재 Unix와 유사한 시스템에서 범주LC_MESSAGES를 사용하여 POSIX setlocale 함수를 호출하는 ICU의 함수를 호출합니다.

다른 시스템 설치 된 문화권 이나 사용자의 기본 문화권에 특정 문화권을 설정 하 고 애플리케이션이 여러 스레드를 시작 하는 경우 해당 스레드의 현재 문화권 됩니다에서 반환 되는 문화권을 GetUserDefaultLocaleName 문화권을 할당 하지 않는 한이 함수는 DefaultThreadCurrentCulture 스레드가 실행 중인 애플리케이션 도메인의 속성입니다.

스레드 문화권이 결정되는 방법에 대한 자세한 내용은 참조 페이지의 "문화권 및 스레드" 섹션을 CultureInfo 참조하세요.

현재 문화권 가져오기

속성은 CultureInfo.CurrentCulture 스레드별 설정입니다. 즉, 각 스레드에는 고유한 문화권이 있을 수 있습니다. 다음 예제와 같이 속성 값을 검색하여 현재 스레드의 CultureInfo.CurrentCulture 문화권을 가져옵니다.

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]

CurrentCulture 속성을 명시적으로 설정

기존 스레드에서 사용하는 문화권을 변경하려면 속성을 새 문화권으로 설정합니다 CultureInfo.CurrentCulture . 이러한 방식으로 변경 하는 스레드의 문화권을 명시적으로 변경 하는 경우 스레드가 애플리케이션 도메인 경계를 넘나들 경우 유지 합니다. 다음은 현재 스레드 문화권을 네덜란드어(네덜란드)로 변경하는 예제입니다. 현재 스레드가 애플리케이션 도메인 경계를 교차 하는 경우 현재 문화권 계속 변경 된 보여 줍니다.

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

참고 항목

속성을 사용하여 문화권을 CultureInfo.CurrentCulture 변경하려면 값 집합이 있는 SecurityPermission 권한이 ControlThread 필요합니다. 스레드 조작은 스레드와 연결된 보안 상태 때문에 위험합니다. 따라서 이 권한은 신뢰할 수 있는 코드에만 부여된 다음 필요에 따라 지정해야 합니다. 반 신뢰할 수 있는 코드에서는 스레드 문화권을 변경할 수 없습니다.

.NET Framework 4부터 현재 스레드 문화권을 특정 문화권(예: 프랑스어(캐나다) 또는 중립 문화권(예: 프랑스어)으로 명시적으로 변경할 수 있습니다. 개체가 CultureInfo 중립 문화권을 나타내는 경우 , , CompareInfoDateTimeFormatNumberFormat등의 Calendar속성 값 CultureInfo 은 중립 문화권과 TextInfo 연결된 특정 문화권을 반영합니다. 예를 들어 영어 중립 문화권의 지배적 문화권은 영어(미국)이며, 독일 문화권의 지배적인 문화권은 독일(독일)입니다. 다음 예제에서는 현재 문화권이 특정 문화권, 프랑스어(캐나다) 및 중립 문화권(프랑스어)으로 설정된 경우 서식의 차이를 보여 줍니다.

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 €

사용할 수도 있습니다는 CultureInfo.CurrentCulture 와 함께 속성을 HttpRequest.UserLanguages 속성을 설정를 CurrentCulture 다음 예제와 같이 사용자에 게 ASP.NET 애플리케이션의 속성의 기본 문화권.

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

현재 문화권 및 사용자 재정의

Windows를 사용하면 사용자가 제어판 국가 및 언어 옵션을 사용하여 개체 및 관련 개체의 표준 속성 값을 재정의 CultureInfo 할 수 있습니다. 속성에서 반환된 CurrentCulture 개체는 CultureInfo 다음과 같은 경우에 이러한 사용자 재정의를 반영합니다.

  • 현재 스레드 문화권이 Windows GetUserDefaultLocaleName 함수에 의해 암시적으로 설정된 경우

  • 속성에 의해 정의된 현재 스레드 문화권이 DefaultThreadCurrentCulture 현재 Windows 시스템 문화권에 해당하는 경우

  • 현재 스레드 문화권이 메서드에서 반환 CreateSpecificCulture 된 문화권으로 명시적으로 설정되고 해당 문화권이 현재 Windows 시스템 문화권에 해당하는 경우

  • 현재 스레드 문화권이 생성자에 의해 인스턴스화된 문화권으로 CultureInfo(String) 명시적으로 설정되고 해당 문화권이 현재 Windows 시스템 문화권에 해당하는 경우

일부 경우에 특히 서버 애플리케이션에 대 한 현재 문화권의 설정는 CultureInfo 사용자 재정의 반영 하는 개체를 적절 하지 않을 합니다. 대신 다음과 같은 방법으로 사용자 재정의를 CultureInfo 반영하지 않는 개체로 현재 문화권을 설정할 수 있습니다.

현재 문화권 및 UWP 앱

UWP(유니버설 Windows 플랫폼) 앱 CurrentCulture 에서 속성은 .NET Framework 및 .NET Core 앱과 마찬가지로 읽기/쓰기가 가능합니다. 이 속성을 사용하여 현재 문화권을 가져와서 설정할 수 있습니다. 그러나 UWP 앱은 현재 문화권과 현재 UI 문화권을 구분하지 않습니다. 및 속성은 CurrentCulture Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 컬렉션의 첫 번째 값에 매핑됩니다.CurrentUICulture

.NET Framework 및 .NET Core 앱에서 현재 문화권은 스레드별 설정이며 CurrentCulture 속성은 현재 스레드의 문화권만 반영합니다. UWP 앱에서 현재 문화권은 전역 설정인 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 속성에 매핑됩니다. 속성을 설정하면 CurrentCulture 전체 앱의 문화권이 변경됩니다. 문화권은 스레드별로 설정할 수 없습니다.