다음을 통해 공유


System.Globalization.CultureInfo.CurrentCulture 속성

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

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

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

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

스레드 문화 결정 방법

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

  • 속성 값이 null이 아닌 경우, 스레드가 실행 중인 애플리케이션 도메인의 DefaultThreadCurrentCulture 속성에 의해 지정된 문화를 검색합니다.

  • 스레드가 작업 기반 비동기 작업을 실행하는 스레드 풀 스레드인 경우 해당 문화권은 호출 스레드의 문화권에 따라 결정됩니다. 다음은 현재 문화권을 포르투갈어(브라질)로 변경하고 각각 스레드 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 {Thread.CurrentThread.CurrentCulture.Name}");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            // Change the current culture to Portuguese (Brazil).
            Console.WriteLine($"Current culture changed to {Thread.CurrentThread.CurrentCulture.Name}");
            Console.WriteLine($"Application thread is thread {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 {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {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
    

    자세한 내용은 Culture 및 작업 기반 비동기 작업참조하세요.

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

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

스레드 문화권이 결정되는 방법에 대한 자세한 내용은 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 {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 {Thread.CurrentThread.Name} in application domain {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 속성을 이용해 문화를 변경하려면 ControlThread 값이 설정된 SecurityPermission 권한이 필요합니다. 스레드 조작은 스레드와 연결된 보안 상태 때문에 위험합니다. 따라서 이 권한은 신뢰할 수 있는 코드에만 부여된 다음 필요에 따라 지정해야 합니다. 반 신뢰할 수 있는 코드에서는 스레드 문화권을 변경할 수 없습니다.

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

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: {CultureInfo.CurrentCulture.Name}");
      Console.WriteLine($"{value:C2}\n");

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
      Console.WriteLine($"{value:C2}");
   }
}
// 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 속성과 함께 사용하여 ASP.NET 애플리케이션의 CurrentCulture 속성을 사용자의 기본 문화권으로 설정할 수도 있습니다.

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 속성 및 CurrentUICulture 속성은 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 컬렉션의 첫 번째 값에 매핑됩니다.

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