CultureInfo 클래스

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

클래스는 CultureInfo 언어, 하위 언어, 국가/지역, 달력 및 특정 문화권과 관련된 규칙과 같은 문화권별 정보를 제공합니다. 또한 이 클래스는 문화권별 인스턴스, NumberFormatInfoCompareInfoTextInfo 개체에 DateTimeFormatInfo대한 액세스를 제공합니다. 이러한 개체에는 대/소문자, 날짜 및 숫자 서식 지정, 문자열 비교와 같은 문화권별 작업에 필요한 정보가 포함됩니다. 클래스는 CultureInfo 형식, 구문 분석 또는 문화권별 데이터(예: String, DateTimeDateTimeOffset및 숫자 형식)를 조작하는 클래스에서 직접 또는 간접적으로 사용됩니다.

문화권 이름 및 식별자

클래스는 CultureInfo RFC 4646을 기반으로 각 문화권에 대해 고유한 이름을 지정합니다. 이름은 언어와 연결된 ISO 639 2자 또는 3자 소문자 문화권 코드와 국가 또는 지역과 연결된 ISO 3166 2자 대문자 하위 문화권 코드의 조합입니다. 또한 Windows 10 이상에서 실행되는 앱의 경우 유효한 BCP-47 언어 태그에 해당하는 문화권 이름이 지원됩니다.

참고 항목

문화권 이름이 클래스 생성자 또는 메서드(예: 또는CultureInfo)에 CreateSpecificCulture 전달되는 경우 해당 대/소문자는 중요하지 않습니다.

RFC 4646을 기반으로 하는 문화권 이름의 형식은 languagecode2languagecode2-country/regioncode2두 글자 언어 코드이며 country/regioncode2 두 글자 하위 문화권 코드입니다. 예를 들어 일본어(일본) 및 en-US 영어(미국)가 있습니다ja-JP. 두 글자 언어 코드를 사용할 수 없는 경우 ISO 639-3에 정의된 세 글자 코드가 사용됩니다.

일부 문화권 이름은 ISO 15924 스크립트도 지정합니다. 예를 들어 Cyrl은 키릴 자모 스크립트를 지정하고 Latn은 라틴어 스크립트를 지정합니다. 스크립트를 포함하는 문화권 이름은 패턴을 languagecode2--scripttagcountry/regioncode2사용합니다. 이러한 유형의 문화권 이름의 uz-Cyrl-UZ 예로는 우즈베키스탄어(키릴 자모, 우즈베키스탄)가 있습니다. Windows Vista 이전의 Windows 운영 체제에서 스크립트를 포함하는 문화권 이름은 예를 들어 Uzbek(키릴 자모, 우즈베키스탄)의 패턴을 languagecode2--country/regioncode2scripttag사용합니다. uz-UZ-Cyrl

중립 문화권은 두 글자 소문자 언어 코드로만 지정됩니다. 예를 들어 프랑스어 fr 의 중립 문화권을 지정하고 de 독일어의 중립 문화권을 지정합니다.

참고 항목

이 규칙과 모순되는 두 개의 문화권 이름이 있습니다. 중국어(간체) 및 중국어(번체)라는 zh-Hanszh-Hant문화권은 중립 문화권입니다. 문화권 이름은 현재 표준을 나타내며 이전 이름과 zh-CHSzh-CHT이름을 사용할 이유가 없는 한 사용해야 합니다.

문화권 식별자는 표준 국제 숫자 약어이며 설치된 문화권 중 하나를 고유하게 식별하는 데 필요한 구성 요소가 있습니다. 애플리케이션은 미리 정의 된 문화권 식별자를 사용 하거나 사용자 지정 식별자를 정의할 수 있습니다.

미리 정의된 특정 문화권 이름 및 식별자는 이 클래스와 네임스페이스의 다른 클래스에서 System.Globalization 사용됩니다. Windows 시스템에 대한 자세한 문화권 정보는 Windows에서 지원하는 언어/지역 이름 목록에서 언어 태그 열을 참조하세요. 문화권 이름은 BCP 47에 정의된 표준을 따릅니다.

문화권 이름 및 식별자는 특정 컴퓨터에서 찾을 수 있는 문화권의 하위 집합만 나타냅니다. Windows 버전 또는 서비스 팩은 사용 가능한 문화권을 변경할 수 있습니다. 애플리케이션은 클래스를 사용하여 사용자 지정 문화권을 CultureAndRegionInfoBuilder 추가할 수 있습니다. 사용자는 Microsoft Locale Builder 도구를 사용하여 고유한 사용자 지정 문화권을 추가할 수 있습니다. Microsoft Locale Builder는 클래스를 사용하여 관리 코드로 CultureAndRegionInfoBuilder 작성됩니다.

여러 고유 이름은 문화권, 특히 다음 클래스 멤버와 연결된 이름과 밀접하게 연관되어 있습니다.

고정, 중립, 특정 문화권

문화권은 일반적으로 고정 문화권, 중립 문화권 및 특정 문화권의 세 집합으로 그룹화됩니다.

고정 문화권은 문화권을 구분하지 않습니다. 빈 문자열을 사용 하 여 이름 고정 문화권을 지정 하는 애플리케이션 ("") 또는 해당 id에서 합니다. InvariantCulture 는 고정 문화권의 인스턴스를 정의합니다. 영어와 연결되지만 국가/지역과는 연결되지 않습니다. 문화권이 필요한 네임스페이스의 Globalization 거의 모든 메서드에서 사용됩니다.

중립 문화권은 언어와 연결되지만 국가/지역과는 관련이 없는 문화권입니다. 특정 문화권은 언어 및 국가/지역과 연결된 문화권입니다. 예를 들어 fr 프랑스 문화 fr-FR 권의 중립 이름은 특정 프랑스어(프랑스) 문화권의 이름입니다. 중국어(간체) 및 중국어(번체)도 중립 문화권으로 간주됩니다.

포함된 데이터가 임의 CompareInfo 이므로 중립 문화권에 대한 클래스 인스턴스를 만드는 것은 권장되지 않습니다. 데이터를 표시하고 정렬하려면 언어와 지역을 모두 지정합니다. Name 또한 중립 문화권에 대해 만든 개체의 CompareInfo 속성은 국가만 반환하며 지역을 포함하지 않습니다.

정의된 문화권에는 특정 문화권의 부모가 중립 문화권이고 중립 문화권의 부모가 고정 문화권인 계층 구조가 있습니다. 속성에는 Parent 특정 문화권과 연결된 중립 문화권이 포함됩니다. 사용자 지정 문화권은 이 패턴에 Parent 따라 속성을 정의해야 합니다.

운영 체제에서 특정 문화권에 대한 리소스를 사용할 수 없는 경우 연결된 중립 문화권에 대한 리소스가 사용됩니다. 중립 문화권에 대한 리소스를 사용할 수 없는 경우 기본 어셈블리에 포함된 리소스가 사용됩니다. 리소스 대체 프로세스에 대한 자세한 내용은 리소스 패키징 및 배포를 참조 하세요.

Windows API의 로캘 목록은 .NET에서 지원하는 문화권 목록과 약간 다릅니다. 예를 들어 p/invoke 메커니즘을 통해 Windows와의 상호 운용성이 필요한 경우 애플리케이션은 운영 체제에 대해 정의된 특정 문화권을 사용해야 합니다. 특정 문화권을 사용하면 동일한 Windows 로캘과 일관성을 유지할 수 있습니다. 이 로캘은 동일한 LCID로캘 식별자로 식별됩니다.

A 또는 a DateTimeFormatInfoNumberFormatInfo 고정 문화권 또는 특정 문화권에 대해서만 만들 수 있으며 중립 문화권에는 만들 수 없습니다.

이지만 설정 TaiwanCalendarThread.CurrentCulture 되지 않은 zh-TW경우 DateTimeFormatInfo.Calendar , 다음DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraNameDateTimeFormatInfo.GetAbbreviatedEraName 빈 문자열("")을 반환합니다.

사용자 지정 문화권

Windows에서 사용자 지정 로캘을 만들 수 있습니다. 자세한 내용은 사용자 지정 로캘을 참조 하세요.

CultureInfo 및 문화 데이터

.NET은 구현, 플랫폼 및 버전에 따라 다양한 원본 중 하나에서 해당 문화 데이터를 파생합니다.

  • Unix 플랫폼 또는 Windows 10 이상 버전에서 실행되는 모든 버전의 .NET(Core)에서는 ICU(International Components for Unicode) 라이브러리에서 문화권 데이터를 제공합니다. ICU 라이브러리의 특정 버전은 개별 운영 체제에 따라 달라집니다.
  • Windows 9 및 이전 버전에서 실행되는 모든 버전의 .NET(Core)에서는 Windows 운영 체제에서 문화권 데이터를 제공합니다.
  • .NET Framework 4 이상 버전에서는 Windows 운영 체제에서 문화권 데이터를 제공합니다.

따라서 특정 .NET 구현, 플랫폼 또는 버전에서 사용할 수 있는 문화권은 다른 .NET 구현, 플랫폼 또는 버전에서 사용할 수 없습니다.

일부 CultureInfo 개체는 기본 플랫폼에 따라 다릅니다. 특히 zh-CN중국어(간체, 중국) 및 zh-TW중국어(번체, 대만)는 Windows 시스템에서 사용할 수 있는 문화권이지만 Unix 시스템에서는 별칭이 지정된 문화권입니다. "zh-CN"은 "zh-Hans-CN" 문화권의 별칭이며 "zh-TW"는 "zh-Hant-TW" 문화권의 별칭입니다. 별칭이 지정된 문화권은 메서드 호출에 GetCultures 의해 반환되지 않으며 Windows와 다른 문화권을 포함하여 속성 값이 다를 Parent 수 있습니다. 문화권의 zh-CNzh-TW 경우 이러한 차이점에는 다음이 포함됩니다.

  • Windows 시스템에서 "zh-CN" 문화권의 부모 문화권은 "zh-Hans"이고 " zh-TW" 문화권의 부모 문화권은 "zh-Hant"입니다. 이러한 두 문화권의 부모 문화권은 "zh"입니다. Unix 시스템에서 두 문화권의 부모는 "zh"입니다. 즉, "zh-CN" 또는 "zh-TW" 문화권에 문화권별 리소스를 제공하지 않고 중립 "zh-Hans" 또는 "zh-Hant" 문화권에 대한 리소스를 제공하는 경우 애플리케이션은 Unix가 아닌 Windows에서 중립 문화권에 대한 리소스를 로드합니다. Unix 시스템에서는 스레드 CurrentUICulture 를 "zh-Hans" 또는 "zh-Hant"로 명시적으로 설정해야 합니다.

  • Windows 시스템에서는 "zh-CN" 문화권을 나타내는 인스턴스를 호출 CultureInfo.Equals 하고 "zh-Hans-CN" 인스턴스를 전달하면 반환됩니다 true. Unix 시스템에서 메서드 호출이 반환됩니다 false. 이 동작은 "zh-TW" CultureInfo 인스턴스를 호출 Equals 하고 "zh-Hant-Tw" 인스턴스를 전달하는 데에도 적용됩니다.

동적 문화권 데이터

고정 문화권을 제외하고 문화권 데이터는 동적입니다. 미리 정의된 문화권에서도 마찬가지입니다. 예를 들어 국가 또는 지역은 새 통화를 채택하거나, 단어의 철자를 변경하거나, 선호하는 일정을 변경하고, 문화 정의가 변경되어 이를 추적합니다. 사용자 지정 문화권은 예고 없이 변경될 수 있으며 특정 문화권은 사용자 지정 대체 문화권에 의해 재정의될 수 있습니다. 또한 아래에서 설명한 대로 개별 사용자가 문화권 기본 설정을 재정의할 수 있습니다. 애플리케이션 런타임 시 culture 데이터를 항상 가져오기 해야 합니다.

주의

데이터를 저장할 때 애플리케이션은 고정 문화권, 이진 형식으로 또는 특정 문화권에 독립적인 형식을 사용 해야 합니다. 고정 문화권 이외의 특정 문화권과 연결된 현재 값에 따라 저장된 데이터는 읽을 수 없게 되거나 문화권이 변경될 경우 의미가 변경될 수 있습니다.

현재 문화권 및 현재 UI 문화권

.NET 애플리케이션의 모든 스레드에는 현재 문화권과 현재 UI 문화권이 있습니다. 현재 문화권은 날짜, 시간, 숫자 및 통화 값에 대한 서식 지정 규칙, 텍스트의 정렬 순서, 대/소문자 규칙 및 문자열을 비교하는 방법을 결정합니다. 현재 UI 문화권은 런타임에 문화권별 리소스를 검색하는 데 사용됩니다.

참고 항목

현재 및 현재 UI 문화권이 스레드별로 결정되는 방법에 대한 자세한 내용은 문화권 및 스레드 섹션을 참조하세요 . 스레드에서 현재 및 현재 UI 문화권을 결정 하는 방법을 알아보려면 참조는 새 애플리케이션 도메인에 애플리케이션 도메인 경계를 교차 하는 스레드를 실행 합니다 문화권 및 애플리케이션 도메인 섹션입니다. 작업 기반 비동기 작업을 수행하는 스레드에서 현재 및 현재 UI 문화권이 결정되는 방법에 대한 자세한 내용은 Culture 및 작업 기반 비동기 작업 섹션을 참조 하세요 .

현재 문화권에 대한 자세한 내용은 속성을 참조하세요 CultureInfo.CurrentCulture . 현재 UI 문화권에 대한 자세한 내용은 속성 항목을 참조 CultureInfo.CurrentUICulture 하세요.

현재 및 현재 UI 문화권 검색

다음 두 가지 방법 중 하나를 사용하여 현재 문화권을 나타내는 개체를 가져올 CultureInfo 수 있습니다.

다음 예제에서는 두 속성 값을 모두 검색하고 비교하여 동일한지 표시하고 현재 문화권의 이름을 표시합니다.

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

다음 두 가지 방법 중 하나를 사용하여 현재 UI 문화권을 나타내는 개체를 가져올 CultureInfo 수 있습니다.

다음 예제에서는 두 속성 값을 모두 검색하고 비교하여 동일한 것을 표시하고 현재 UI 문화권의 이름을 표시합니다.

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

현재 및 현재 UI 문화권 설정

스레드의 문화권 및 UI 문화권을 변경하려면 다음을 수행합니다.

  1. 클래스 생성자를 호출 CultureInfo 하고 문화권의 이름을 전달하여 해당 문화권을 나타내는 개체를 인스턴스화 CultureInfo 합니다. CultureInfo(String) 생성자는 새 문화권이 현재 Windows 문화권과 동일한 경우 사용자 재정의를 반영하는 개체를 인스턴스화 CultureInfo 합니다. CultureInfo(String, Boolean) 생성자를 사용하면 새 문화권이 현재 Windows 문화권과 동일한 경우 새로 인스턴스화된 CultureInfo 개체가 사용자 재정의를 반영하는지 여부를 지정할 수 있습니다.

  2. CultureInfo.NET Core 및 .NET Framework 4.6 이상 버전의 또는 CultureInfo.CurrentUICulture 속성에 개체 CultureInfo.CurrentCulture 를 할당합니다.

다음 예제에서는 현재 문화권을 검색합니다. 프랑스(프랑스) 문화권이 아닌 다른 문화권인 경우 현재 문화권을 프랑스어(프랑스)로 변경합니다. 그렇지 않으면 현재 문화권을 프랑스어(룩셈부르크)로 변경합니다.

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

다음 예제에서는 현재 문화권을 검색합니다. 그것은 다른 슬로베니아어 (슬로베니아) 문화인 경우, 그것은 슬로베니아어 (슬로베니아)로 현재의 문화를 변경합니다. 그렇지 않으면 현재 문화권을 크로아티아어(크로아티아)로 변경합니다.

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

모든 문화권 가져오기

메서드를 호출하여 특정 범주의 문화권 또는 로컬 컴퓨터에서 사용할 수 있는 모든 문화권의 배열을 검색할 GetCultures 수 있습니다. 예를 들어 사용자 지정 문화권, 특정 문화권 또는 중립 문화권을 단독으로 또는 함께 검색할 수 있습니다.

다음 예제에서는 메서드를 GetCultures 두 번 호출하고, 먼저 System.Globalization.CultureTypes 열거형 멤버를 사용하여 모든 사용자 지정 문화권을 검색한 다음 System.Globalization.CultureTypes , 열거형 멤버를 사용하여 모든 대체 문화권을 검색합니다.

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.

문화권 및 스레드

새 애플리케이션 스레드가 시작 될 때 현재 문화권 및 현재 UI 문화권의 현재 스레드 문화권과 아니라에 현재 시스템 문화권에 의해 정의 됩니다. 다음 예제에서 차이점을 보여 줍니다. 프랑스어 (프랑스) 문화권 (FR) 애플리케이션 스레드의 현재 UI 문화권 및 현재 문화권으로 설정합니다. 현재 문화권이 이미 fr-FR인 경우 예제에서는 영어(미국) 문화권(en-US)으로 설정합니다. 세 개의 난수를 통화 값으로 표시한 다음 새 스레드를 만들어 세 개의 난수를 통화 값으로 표시합니다. 하지만 새 스레드에 의해 표시 되는 통화 값은 예제에서에서 출력으로 기본 애플리케이션 스레드에서만에서 출력 달리 프랑스어 (프랑스) 문화권의 서식 규칙을 반영 하지 않습니다.

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

애플리케이션에 있는 모든 스레드의 문화권 및 UI 문화권을 설정할 수 있습니다기본 해당 문화 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 권을 나타내는 개체를 할당 하 CultureInfo 고 속성입니다. 다음 예제에서는 동일한 문화권을 공유 하는 기본 애플리케이션 도메인의 모든 스레드를 확인 하려면 이러한 속성을 사용 합니다.

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 €

Warning

하지만 합니다 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 속성은 정적 멤버를 기본 문화권 및 이러한 속성 값이 설정 된 당시에는 애플리케이션 도메인에 대해서만 기본 UI 문화권을 정의 합니다. 자세한 내용은 다음 섹션을 참조 하세요 문화권 및 애플리케이션 도메인합니다.

값을 할당 하는 경우는 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 속성, 문화권 및 UI 문화권 애플리케이션 도메인에 있는 스레드의 경우 변경할 수도 있습니다 명시적으로 할당 하지 않은 문화권입니다. 그러나 이러한 스레드는 현재 애플리케이션 도메인에서 실행 하는 동안에 새 culture 설정을 반영 합니다. 이러한 스레드를 다른 애플리케이션 도메인에서 실행 하는 경우 해당 문화권에 해당 애플리케이션 도메인에 대해 정의 된 기본 문화권이 됩니다. 결과적으로, 것이 좋습니다에 의존 하지 않고 항상 주 애플리케이션 스레드의 문화권을 설정 하는 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 속성을 변경 합니다.

문화권 및 애플리케이션 도메인

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 하는 속성 값을 설정 하거나 검색할 때 현재 애플리케이션 도메인에 대해서만 기본 문화권을 명시적으로 정의 하는 정적 속성입니다. 다음 예제에서는 기본 애플리케이션 도메인에서 기본 문화권 및 기본 UI 문화권을 프랑스어 (프랑스)로 설정 하 고 사용 하 여는 AppDomainSetup 클래스 및 AppDomainInitializer 대리자가 새 애플리케이션 도메인을의 기본 문화권 및 UI 문화권 설정 러시아어 (러시아)입니다. 그런 다음 단일 스레드는 각 애플리케이션 도메인에서 두 메서드를 실행합니다. Note는 스레드의 문화권과 UI 문화권은 명시적으로 설정 하지; 기본 문화권 및 UI 문화권은 스레드가 실행 중인 애플리케이션 도메인에서 파생 됩니다. 또한 합니다 DefaultThreadCurrentCulture 하 고 DefaultThreadCurrentUICulture 속성 기본값을 반환 CultureInfo 메서드를 호출 하는 경우 현재 애플리케이션 도메인의 값입니다.

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

문화권 및 애플리케이션 do기본에 대한 자세한 내용은 Application Do기본s 항목의 "애플리케이션 do기본 및 스레드" 섹션을 참조하세요.

문화권 및 작업 기반 비동기 작업

작업 기반 비동기 프로그래밍 패턴은 스레드 풀 스레드에서 대리자를 비동기적으로 실행하는 데 사용하고 개체를 사용합니다 Task<TResult>Task. 특정 작업이 실행되는 특정 스레드는 사전에 알려지지 않았지만 런타임에만 결정됩니다.

.NET Framework 4.6 이상 버전을 대상으로 하는 앱의 경우 문화권은 비동기 작업 컨텍스트의 일부입니다. 즉, 기본적으로 비동기 작업은 시작된 스레드의 CurrentCulture 값과 CurrentUICulture 속성을 상속합니다. 현재 문화권 또는 현재 UI 문화권이 시스템 문화권과 다른 경우 현재 문화권은 스레드 경계를 넘어 비동기 작업을 실행하는 스레드 풀 스레드의 현재 문화권이 됩니다.

다음 예제에서는 간단한 설명을 제공합니다. 이 예제에서는 통화 값으로 Func<TResult> 형식이 지정된 일부 숫자를 반환하는 대리 formatDelegate자를 정의합니다. 이 예제에서는 현재 시스템 문화권을 프랑스어(프랑스) 또는 프랑스어(프랑스)가 이미 현재 문화권인 경우 영어(미국)로 변경합니다. 그런 다음, 다음을 수행합니다.

  • 기본 앱 스레드에서 동기적으로 실행되도록 대리자를 직접 호출합니다.
  • 스레드 풀 스레드에서 대리자를 비동기적으로 실행하는 작업을 만듭니다.
  • 메서드를 호출 Task.RunSynchronously 하여 기본 앱 스레드에서 대리자를 동기적으로 실행하는 작업을 만듭니다.

예제의 출력과 같이 현재 문화권이 프랑스어(프랑스)로 변경되면 작업이 비동기적으로 호출되는 스레드의 현재 문화권이 해당 비동기 작업의 현재 문화권이 됩니다.

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 €

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 앱 별 도메인 속성은 모든 스레드는 특정 애플리케이션 도메인에서 문화권을 명시적으로 할당에 대 한 기본 문화권 설정 즉, 합니다. 그러나 .NET Framework 4.6 이상을 대상으로 하는 앱의 경우 호출 스레드의 문화권은 작업이 앱을 넘어도 비동기 작업 컨텍스트의 일부를 다시 기본기본 경계를 넘습니다.

CultureInfo 개체 serialization

개체가 CultureInfo 직렬화되면 실제로 저장되는 모든 항목은 Name 직렬화됩니다 UseUserOverride. 동일한 의미를 가지는 환경에서 Name 만 역직렬화됩니다. 다음 세 가지 예제에서는 항상 그렇지 않은 이유를 보여 줍니다.

  • CultureTypes 속성 값이고 CultureTypes.InstalledWin32Cultures해당 문화권이 Windows 운영 체제의 특정 버전에서 처음 도입된 경우 이전 버전의 Windows에서 역직렬화할 수 없습니다. 예를 들어 Windows 10에서 문화권이 도입된 경우 Windows 8에서는 역직렬화할 수 없습니다.

  • 값이 CultureTypesCultureTypes.UserCustomCulture직렬화된 컴퓨터에 이 사용자 지정 문화권이 설치되어 있지 않으면 역직렬화할 수 없습니다.

  • 값이 CultureTypesCultureTypes.ReplacementCultures역직렬화된 컴퓨터에 이 대체 문화권이 없으면 동일한 이름으로 역직렬화되지만 모든 특성은 역직렬화되지 않습니다. 예를 들어 컴퓨터 A의 대체 문화권이 컴퓨터 B가 아닌 대체 문화권이고 이 문화권을 참조하는 개체가 컴퓨터 A에서 직렬화되고 컴퓨터 B에서 역직렬화되는 경우 en-USCultureInfo 문화권의 사용자 지정 특성이 전송되지 않습니다. 문화권은 성공적으로 역직렬화되지만 의미는 다릅니다.

제어판 재정의

사용자는 제어판 지역 및 언어 옵션 부분을 통해 Windows의 현재 문화권과 연결된 일부 값을 재정의하도록 선택할 수 있습니다. 예를 들어 사용자는 다른 형식으로 날짜를 표시하거나 문화권의 기본값이 아닌 통화를 사용하도록 선택할 수 있습니다. 일반적으로 애플리케이션 사용자 재정의 적용 해야 합니다.

true 지정된 문화권이 Windows CultureInfo 의 현재 문화권과 일치하는 경우 UseUserOverride 속성에서 반환된 인스턴스의 속성에 대한 사용자 설정 및 속성에서 반환된 DateTimeFormat 인스턴스의 DateTimeFormatInfo 속성을 포함하여 이러한 재정의 NumberFormatInfoNumberFormat 사용합니다. 사용자 설정이 연결된 문화권과 CultureInfo호환되지 않는 경우(예: 선택한 달력이 하나 OptionalCalendars도 아닌 경우) 메서드의 결과와 속성 값이 정의되지 않습니다.

대체 정렬 순서

일부 문화권은 둘 이상의 정렬 순서를 지원합니다. 예시:

  • 스페인어(스페인) 문화권에는 기본 국제 정렬 순서와 전통적인 정렬 순서의 두 가지 정렬 순서가 있습니다. 문화권 이름을 사용하여 개체 es-ESCultureInfo 인스턴스화하면 국가별 정렬 순서가 사용됩니다. 문화권 이름을 사용하여 개체를 CultureInfoes-ES-tradnl 인스턴스화하면 기존 정렬 순서가 사용됩니다.

  • (중국어(간체, PRC) 문화권은 zh-CN 발음(기본값) 및 스트로크 수의 두 가지 정렬 순서를 지원합니다. 문화권 이름을 사용하여 개체 zh-CNCultureInfo 인스턴스화하면 기본 정렬 순서가 사용됩니다. 0x00020804 로컬 식별자를 사용하여 개체를 인스턴스화 CultureInfo 하면 문자열이 스트로크 수별로 정렬됩니다.

다음 표에서는 대체 정렬 순서를 지원하는 문화권과 기본 및 대체 정렬 순서의 식별자를 나열합니다.

문화권 이름 문화권 기본 정렬 이름 및 식별자 대체 정렬 이름 및 식별자
es-ES 스페인어(스페인) 국제: 0x00000C0A 전통: 0x0000040A
zh-TW 중국어(대만) 스트로크 수: 0x00000404 보포모포: 0x00030404
zh-CN 중국어(중국) 발음: 0x00000804 스트로크 수: 0x00020804
zh-HK 중국어(홍콩 특별행정구) 스트로크 수: 0x00000c04 스트로크 수: 0x00020c04
zh-SG 중국어(싱가포르) 발음: 0x00001004 스트로크 수: 0x00021004
zh-MO 중국어(마카오 특별 행정구) 발음: 0x00001404 스트로크 수: 0x00021404
ja-JP 일본어(일본) 기본값: 0x00000411 유니코드: 0x00010411
ko-KR 한국어(대한민국) 기본값: 0x00000412 한국어 Xwansung - 유니코드: 0x00010412
de-DE 독일어(독일) 사전: 0x00000407 전화 책 정렬 DIN: 0x00010407
hu-HU 헝가리어(헝가리) 기본값: 0x0000040e 기술 정렬: 0x0001040e
ka-GE 조지아어(조지아) 전통: 0x00000437 최신 정렬: 0x00010437

현재 문화권 및 UWP 앱

UWP(유니버설 Windows 플랫폼) 앱 CurrentCulture 에서 속성은 .NET Framework 및 CurrentUICulture .NET Core 앱과 마찬가지로 읽기/쓰기가 가능합니다. 그러나 UWP 앱은 단일 문화권을 인식합니다. 및 속성은 CurrentCulture Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 컬렉션의 첫 번째 값에 매핑됩니다.CurrentUICulture

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