Sdílet prostřednictvím


Třída CultureInfo

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Třída CultureInfo poskytuje informace specifické pro kulturu, jako je jazyk, podjazyk, země/oblast, kalendář a konvence spojené s konkrétní kulturou. Tato třída také poskytuje přístup k instancím specifických pro kulturní verzi DateTimeFormatInfo, NumberFormatInfo, CompareInfo a TextInfo objektů. Tyto objekty obsahují informace potřebné pro operace specifické pro jazykovou verzi, jako jsou velikost písmen, formátování datum a čísel, a porovnávání řetězců. Třída CultureInfo se používá buď přímo nebo nepřímo třídami, které formátují, analyzují nebo manipulují s daty specifickými pro jazykovou verzi, například String, DateTime, DateTimeOffset a číselnými typy.

Názvy a identifikátory kultur

Třída CultureInfo určuje jedinečný název pro každou kulturu na základě RFC 4646. Název je kombinací dvoupísmenného nebo třípísmenného kódu jazykové verze ISO 639 přidruženého k jazyku a dvoupísmenného kódu subkultury ISO 3166 přidruženého k zemi nebo oblasti. Kromě toho, pro aplikace běžící na Windows 10 nebo novějších, jsou podporovány názvy kultur, které odpovídají platným jazykovým značkám BCP-47.

Poznámka:

Pokud je název kulturní verze předán konstruktoru třídy nebo metodě, jako CreateSpecificCulture nebo CultureInfo, velikost písmen není důležitá.

Formát názvu jazykové verze založené na RFC 4646 je languagecode2-country/regioncode2, kde languagecode2 je dvoupísmenný kód jazyka a country/regioncode2 je dvoupísmenný kód subkultury. Mezi příklady patří ja-JP japonština (Japonsko) a en-US angličtina (USA). V případech, kdy není k dispozici dvoumísmenný kód jazyka, se použije třímísmenný kód definovaný v iso 639-3.

Některé názvy jazykových verzí také určují písmo ISO 15924. Například Cyrl určuje cyrilický skript a Latn určuje latinský skript. Název kultury, který obsahuje písmo, používá vzor languagecode2-scripttag-country/regioncode2. Příkladem tohoto typu názvu jazykové verze je uz-Cyrl-UZ uzbecký (Cyrilice, Uzbekistán). V operačních systémech Windows před systémem Windows Vista název jazykové verze, která obsahuje skript, používá vzor languagecode2-country/regioncode2-scripttag, například uz-UZ-Cyrl pro uzbečtinu (cyrilice, Uzbekistán).

Neutrální kultura je určena pouze dvojpísmenným malým kódem jazyka. fr Například určuje neutrální jazykovou verzi pro francouzštinu a de určuje neutrální jazykovou verzi pro němčinu.

Poznámka:

Existují dva názvy kultur, které jsou v rozporu s tímto pravidlem. Čínština (zjednodušená), pojmenovaná zh-Hans, a čínština (tradiční), pojmenovaná zh-Hant, jsou neutrální jazykové verze. Názvy kultur představují aktuální standard a měly by být použity, pokud nemáte důvod pro použití starších názvů zh-CHS a zh-CHT.

Identifikátor jazykové verze je standardní mezinárodní číselná zkratka a má komponenty nezbytné k jednoznačné identifikaci jedné z nainstalovaných jazykových verzí. Vaše aplikace může používat předdefinované identifikátory jazykové verze nebo definovat vlastní identifikátory.

Některé předdefinované názvy a identifikátory jazykové verze jsou používány touto a dalšími třídami v System.Globalization jmenném prostoru. Podrobné kulturní informace pro systémy Windows naleznete ve sloupci Jazyková značka v seznamu názvů jazyků a oblastí podporovaných systémem Windows. Názvy kulturních verzí se řídí standardem definovaným BCP 47.

Názvy a identifikátory kultur představují pouze podmnožinu kultur, které lze nalézt na daném počítači. Verze systému Windows nebo aktualizace Service Pack mohou měnit dostupné jazykové verze. Aplikace mohou přidávat vlastní jazykové verze pomocí CultureAndRegionInfoBuilder třídy. Uživatelé můžou přidat vlastní kulturní nastavení pomocí nástroje Microsoft Locale Builder. Microsoft Locale Builder je napsaný ve spravovaném kódu s použitím třídy CultureAndRegionInfoBuilder.

Několik odlišných názvů je úzce spojeno s kulturou, zejména názvy spojené s následujícími členy třídy:

Invariantní, neutrální a specifické kultury

Jazykové verze jsou obecně seskupeny do tří sad: invariantní jazykové verze, neutrální jazykové verze a specifické jazykové verze.

Invariantní kultura je necitlivá ke kulturním odlišnostem. Vaše aplikace určuje invariantní jazyk pomocí prázdného řetězce ("") nebo jeho identifikátoru. InvariantCulture definuje instanci invariantní kultury. Je přidružen k anglickému jazyku, ale ne k žádné zemi nebo oblasti. Používá se téměř v jakékoli metodě v Globalization oboru názvů, který vyžaduje kulturu.

Neutrální kultura je kultura, která je přidružená k jazyku, ale ne k zemi nebo oblasti. Konkrétní kultura je kultura spojená s jazykem a zemí/regionem. Například fr je neutrální název francouzské jazykové verze a fr-FR je název konkrétní francouzské jazykové verze (Francie). Všimněte si, že čínština (zjednodušená) a čínština (tradiční) jsou také považovány za neutrální jazykové verze.

Vytvoření instance CompareInfo třídy pro neutrální kulturu se nedoporučuje, protože data, která obsahuje, jsou libovolná. Pokud chcete zobrazit a seřadit data, zadejte jazyk i oblast. Vlastnost Name objektu CompareInfo vytvořeného pro neutrální jazykovou verzi navíc vrátí pouze zemi a nezahrnuje oblast.

Definované kultury mají hierarchii, ve které je nadřazenou určité kultury neutrální kultura a nadřazenou neutrální kultury je invariantní kultura. Vlastnost Parent obsahuje neutrální kulturu přidruženou ke konkrétní kultuře. Vlastní jazykové verze by měly definovat Parent vlastnost v souladu s tímto vzorem.

Pokud prostředky pro konkrétní jazykovou verzi nejsou v operačním systému k dispozici, použijí se prostředky pro přidruženou neutrální jazykovou verzi. Pokud prostředky pro neutrální kulturu nejsou k dispozici, použijí se prostředky vložené do hlavního sestavení. Další informace o náhradním procesu prostředků najdete v tématu Balení a nasazení prostředků.

Seznam národních prostředí v rozhraní API systému Windows se mírně liší od seznamu jazykových verzí podporovaných rozhraním .NET. Pokud se vyžaduje interoperabilita s Windows, například prostřednictvím mechanismu p/invoke, měla by aplikace používat konkrétní jazykovou verzi definovanou pro operační systém. Použití konkrétní jazykové verze zajišťuje konzistenci s ekvivalentním národním prostředím Windows, které je identifikováno identifikátorem národního prostředí, který je stejný jako LCID.

A DateTimeFormatInfo nebo a NumberFormatInfo lze vytvořit pouze pro invariantní jazykovou verzi nebo pro konkrétní jazykové verze, nikoli pro neutrální jazyky.

Pokud je DateTimeFormatInfo.CalendarTaiwanCalendar, ale Thread.CurrentCulture není nastaveno na zh-TW, pak DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName a DateTimeFormatInfo.GetAbbreviatedEraName vrátí prázdný řetězec ("").

Vlastní kulturní nastavení

Ve Windows můžete vytvořit vlastní národní prostředí. Další informace naleznete v tématu Vlastní lokality.

CultureInfo a kulturní data

.NET odvozuje kulturní data z některého z různých zdrojů v závislosti na implementaci, platformě a verzi:

  • Ve všech verzích .NET (Core) běžících na platformách Unix nebo Windows 10 a novějších verzích poskytují kulturní data knihovna International Components for Unicode (ICU). Konkrétní verze knihovny ICU závisí na jednotlivých operačních systémech.
  • Ve všech verzích .NET (Core) běžících ve Windows 9 a starších verzích jsou kulturní data poskytována operačním systémem Windows.
  • V rozhraní .NET Framework 4 a novějších verzích jsou kulturní data poskytována operačním systémem Windows.

Z tohoto důvodu nemusí být kulturní nastavení dostupné na konkrétní implementaci, platformě nebo verzi .NET dostupné na jiné implementaci, platformě nebo verzi .NET.

Některé CultureInfo objekty se liší v závislosti na základní platformě. Konkrétně, zh-CN, tedy čínština (zjednodušená, Čína), a zh-TW, tedy čínština (tradiční, Tchaj-wan), jsou dostupné jazykové verze v systémech Windows, ale na systémech Unix jsou to aliasované jazykové verze. "zh-CN" je alias pro jazykovou verzi "zh-Hans-CN" a "zh-TW" je alias pro jazykovou verzi "zh-Hant-TW". Aliasované kultury nejsou vráceny voláním GetCultures metody a mohou mít různé hodnoty vlastností, včetně různých Parent kultur, než jejich protějšky systému Windows. Pro rozdíly v kulturách zh-CN a zh-TW mezi patří:

  • V systémech Windows je nadřazená kultura kultury "zh-CN" "zh-Hans" a nadřazená kultura kultury "zh-TW" je "zh-Hant". Nadřazená kultura obou těchto kultur je "zh". V systémech Unix jsou předkové obou kultur "zh". To znamená, že pokud neposkytujete prostředky specifické pro kultury "zh-CN" nebo "zh-TW", ale poskytujete prostředky pro neutrální kulturu "zh-Hans" nebo "zh-Hant", vaše aplikace načte prostředky pro neutrální kulturu ve systému Windows, ale nikoli v systému Unix. V systémech Unix musíte explicitně nastavit vlákno CurrentUICulture na "zh-Hans" nebo "zh-Hant".

  • V systémech Windows volání funkce CultureInfo.Equals na instanci, která představuje kulturní nastavení "zh-CN", a její předání instanci "zh-Hans-CN" vrátí true. V systémech Unix volání metody vrátí false. Toto chování platí také pro volání instance 'zh-TW' a předání jí instance 'zh-Hant-Tw'.

Dynamická data kultury

S výjimkou invariantní kultury jsou kulturní data dynamická. To platí i pro předdefinované jazykové kultury. Země nebo regiony například přijímají nové měny, mění pravopis svých slov, přizpůsobují preferovaný kalendář a mění definice kulturních vzorců, aby to mohly sledovat. Vlastní kulturní verze se můžou změnit bez upozornění předem, a každá konkrétní kulturní verze může být přepsána vlastní nahrazující kulturou. Jak je popsáno níže, jednotliví uživatelé můžou také přepsat kulturní preference. Aplikace by vždy měly získávat kulturní data za běhu.

Upozornění

Při ukládání dat by vaše aplikace měla používat invariantní jazykovou verzi, binární formát nebo konkrétní formát nezávislý na kultuře. Data uložená podle aktuálních hodnot spojených s konkrétní jazykovou verzí, která není neutrální jazykovou verzí, se mohou stát nečitelnými nebo se můžou změnit ve významu, pokud se tato jazyková verze změní.

Aktuální kultura a aktuální kultura uživatelského rozhraní

Každé vlákno v aplikaci .NET má aktuální kulturu a aktuální uživatelskou kulturu. Aktuální kultura určuje konvence formátování pro kalendářní data, časy, čísla a hodnoty měny, pořadí řazení textu, konvence velikosti písmen a způsob porovnávání řetězců. Aktuální kultura uživatelského rozhraní se používá k načtení prostředků specifických pro kulturu za běhu.

Poznámka:

Informace o tom, jak se aktuální a aktuální jazyková verze uživatelského rozhraní určuje na základě jednotlivých vláken, najdete v části Jazyková verze a vlákna . Informace o tom, jak je určena současná a stávající kultura uživatelského rozhraní pro vlákna spuštěná v nové aplikační doméně a pro vlákna, která překračují hranice aplikačních domén, najdete v části Kultura a aplikační domény. Informace o tom, jak je určována aktuální jazyková verze a kultura uživatelského rozhraní na vláknech provádějících asynchronní operace založené na úlohách, najdete v části Jazykové verze a asynchronní operace založené na úlohách.

Podrobnější informace o aktuální kultuře naleznete ve vlastnosti CultureInfo.CurrentCulture. Podrobnější informace o aktuální jazykové verzi uživatelského rozhraní naleznete v tématu vlastnosti CultureInfo.CurrentUICulture.

Načtení aktuální kultury a kultury uživatelského rozhraní

Objekt, který představuje aktuální kulturu, můžete získat CultureInfo jedním ze dvou způsobů:

Následující příklad získá obě hodnoty vlastností, porovná je tak, aby ukázal, že jsou stejné, a zobrazí název aktuální jazykové kultury.

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 {culture1.Name}");
        Console.WriteLine($"The two CultureInfo objects are equal: {culture1 == culture2}");
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True

CultureInfo Objekt, který představuje aktuální kulturu uživatelského rozhraní, můžete získat jedním ze dvou způsobů:

Následující příklad načte obě hodnoty vlastností, porovná je, aby ukázal, že jsou stejné, a zobrazí název aktuální jazykové verze uživatelského rozhraní.

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 {uiCulture1.Name}");
        Console.WriteLine($"The two CultureInfo objects are equal: {uiCulture1 == uiCulture2}");
    }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True

Nastavte aktuální kulturu a kulturu uživatelského rozhraní

Chcete-li změnit kulturu a jazykovou verzi uživatelského rozhraní vlákna, postupujte následovně:

  1. Vytvořte instanci objektu CultureInfo, který představuje danou kulturu, tím, že zavoláte konstruktor třídy CultureInfo a předáte mu název této kultury. Konstruktor CultureInfo(String) vytvoří instanci objektu CultureInfo, který odráží uživatelská nastavení, pokud je nová jazyková verze stejná jako aktuální jazyková verze systému Windows. Konstruktor CultureInfo(String, Boolean) umožňuje určit, zda nově vytvořený objekt CultureInfo zohledňuje uživatelská přepsání, pokud se nová jazyková verze shoduje s aktuální jazykovou verzí systému Windows.

  2. Přiřaďte objekt k vlastnosti CultureInfo nebo CultureInfo.CurrentCulture na .NET Core a .NET Framework 4.6 a novějších verzích.

Následující příklad načte aktuální nastavení kultury. Pokud je to něco jiného než francouzská kultura (Francie), změní současnou kulturu na francouzskou kulturu (Francie). V opačném případě změní aktuální kulturu na francouzštinu (Lucembursko).

using System;
using System.Globalization;

public class ChangeEx1
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentCulture;
        Console.WriteLine($"The current culture is {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 {CultureInfo.CurrentCulture.Name}");
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR

Následující příklad načte aktuální nastavení kultury. Pokud se jedná o něco jiného než slovinskou kulturu (Slovinsko), změní se současná kultura na slovinskou (Slovinsko). V opačném případě změní aktuální kulturu na chorvatskou (Chorvatsko).

using System;
using System.Globalization;

public class ChangeUICultureEx
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentUICulture;
        Console.WriteLine($"The current UI culture is {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 {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

Získejte všechny kultury

Voláním metody GetCultures můžete načíst pole konkrétních kategorií kultur nebo všech kultur dostupných v místním počítači. Můžete například načíst vlastní jazykové verze, konkrétní jazykové verze nebo neutrální jazykové verze buď samostatně, nebo v kombinaci.

Následující příklad volá metodu GetCultures dvakrát, nejprve se členem výčtu System.Globalization.CultureTypes pro načtení všech vlastních jazykových verzí a potom s členem výčtu System.Globalization.CultureTypes pro načtení všech náhradních jazykových verzí.

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($"   {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($"   {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.

Kultura a vlákna

Když je spuštěno nové vlákno aplikace, jeho aktuální jazyková verze a aktuální jazyková verze uživatelského rozhraní jsou definovány aktuální systémovou jazykovou verzí, a ne aktuální jazykovou verzí vlákna. Následující příklad znázorňuje rozdíl. Nastaví aktuální kulturu a aktuální jazykovou verzi uživatelského rozhraní vlákna aplikace na francouzskou (Francie) (fr-FR). Pokud je aktuální jazyková verze již fr-FR, příklad ji nastaví na jazykovou verzi angličtiny (USA) (en-US). Zobrazí tři náhodná čísla jako hodnoty měny a pak vytvoří nové vlákno, které pak zobrazí tři další náhodná čísla jako hodnoty měny. Jak ale ukazuje výstup z příkladu, hodnoty měny zobrazené v novém vlákně neodráží konvence formátování jazykové verze francouzštiny (Francie), na rozdíl od výstupu z hlavního vlákna aplikace.

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: '{Thread.CurrentThread.Name}'");
        Console.WriteLine($"Current Thread Culture/UI Culture: {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($"   {rnd.NextDouble() * 10:C2}");
    }

    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

Jazykovou verzi a uživatelskou jazykovou verzi všech vláken v aplikační doméně můžete nastavit přiřazením objektu CultureInfo, který představuje tuto kulturu, k vlastnostem DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture. Následující příklad používá tyto vlastnosti, aby všechna vlákna ve výchozí doméně aplikace sdílela stejnou kulturu.

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: '{Thread.CurrentThread.Name}'");
        Console.WriteLine($"Current Thread Culture/UI Culture: {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($"   {rnd.NextDouble() * 10:C2}");
    }

    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 €

Upozornění

I když jsou vlastnosti DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture statické členy, definují výchozí kulturu a výchozí jazykovou verzi uživatelského rozhraní pouze pro ten aplikační doménu, která je aktuální v době, kdy jsou tyto hodnoty vlastností nastaveny. Další informace najdete v následující části Kultura a aplikační domény.

Při přiřazování hodnot k vlastnostem DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture, se kultura a jazyková kultura uživatelského rozhraní vláken v doméně aplikace také změní, pokud jim nebyla explicitně přiřazena specifická kultura. Tato vlákna však odrážejí nová nastavení jazykové verze pouze během jejich spuštění v aktuální doméně aplikace. Pokud se tato vlákna spustí v jiné doméně aplikace, stane se jejich jazyková verze výchozí jazykovou verzí definovanou pro danou doménu aplikace. Proto doporučujeme, abyste vždy nastavili kulturní nastavení hlavního aplikačního vlákna a nespoléhali na vlastnosti DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture k jeho změně.

Kultura a domény aplikací

DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture jsou statické vlastnosti, které explicitně definují výchozí kulturu pouze pro aktuální doménu aplikace při nastavení nebo získání hodnoty vlastnosti. Následující příklad nastaví výchozí jazykovou verzi a výchozí jazykovou verzi uživatelského rozhraní ve výchozí doméně aplikace na francouzštinu (Francie) a pak použije AppDomainSetup třídu a AppDomainInitializer delegáta k nastavení výchozí jazykové verze a jazykové verze uživatelského rozhraní v nové doméně aplikace na ruštinu (Rusko). Jedno vlákno pak spustí dvě metody v každé doméně aplikace. Všimněte si, že jazyková verze vlákna a jazyková verze uživatelského rozhraní nejsou explicitně nastaveny; jsou odvozeny z výchozí jazykové verze a jazykové verze uživatelského rozhraní domény aplikace, ve které je vlákno spuštěno. Všimněte si také, že vlastnosti DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture vrací výchozí CultureInfo hodnoty domény aplikace aktuální v okamžiku volání metody.

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 {DateTime.Now:D}");
    }

    public void DisplayCultures()
    {
        Console.WriteLine($"Application domain is {AppDomain.CurrentDomain.Id}");
        Console.WriteLine($"Default Culture: {CultureInfo.DefaultThreadCurrentCulture}");
        Console.WriteLine($"Default UI Culture: {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

Další informace o kulturách a doménách aplikací najdete v části Aplikační domény a vlákna v tématu Aplikační domény.

Asynchronní operace založené na kultuře a úkolech

Asynchronní programovací model založený na úlohách používá a Task objekty k asynchronnímu spouštění delegátů ve vláknech fondu vláken. Konkrétní vlákno, na kterém se konkrétní úloha spouští, není předem známo, ale je určeno pouze za běhu.

Pro aplikace, které cílí na rozhraní .NET Framework 4.6 nebo jeho novější verzi, je kultura součástí kontextu asynchronní operace. Jinými slovy, asynchronní operace ve výchozím nastavení dědí hodnoty CurrentCulture a CurrentUICulture vlastnosti vlákna, ze kterého jsou spuštěny. Pokud se aktuální jazyková verze nebo aktuální jazyková verze uživatelského rozhraní liší od systémové jazykové verze, aktuální jazyková verze překročí hranice vláken a stane se aktuální jazykovou verzí vlákna fondu vláken, která spouští asynchronní operaci.

Následující příklad obsahuje jednoduchý obrázek. Příklad definuje delegáta Func<TResult> , formatDelegatekterý vrátí některá čísla formátovaná jako hodnoty měny. Příklad změní aktuální kulturní nastavení systému na francouzštinu (Francie) nebo, pokud je francouzština (Francie) již aktuální nastavení, na angličtinu (USA). To pak:

  • Vyvolá delegáta přímo tak, aby běžel synchronně na hlavním vlákně aplikace.
  • Vytvoří úlohu, která spouští delegáta asynchronně na vlákně ve fondu vláken.
  • Vytvoří úlohu, která provádí delegát synchronně v hlavním vlákně aplikace voláním Task.RunSynchronously metody.

Jak ukazuje výstup z příkladu, když se aktuální jazyková verze změní na francouzštinu (Francie), aktuální jazyková verze vlákna, ze kterého jsou úlohy vyvolány asynchronně, se stane aktuální jazykovou verzí pro tuto asynchronní operaci.

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 a DefaultThreadCurrentUICulture jsou vlastnosti domény pro jednotlivé aplikace. To znamená, že vytvoří výchozí jazykovou verzi pro všechna vlákna, která nejsou explicitně přiřazená jazykové verzi v konkrétní doméně aplikace. Pro aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, však kulturní nastavení volajícího vlákna zůstává součástí kontextu asynchronní úlohy i v případě, že tato úloha překročí doménu aplikace.

Serializace objektu CultureInfo

Při serializaci objektu se skutečně uloží pouze CultureInfo a Name. Úspěšně se deserializuje pouze v prostředí, kde má Name stejný význam. Následující tři příklady ukazují, proč tomu tak není vždy:

  • CultureTypes Pokud je hodnota vlastnosti CultureTypes.InstalledWin32Cultures a pokud byla tato jazyková verze poprvé zavedena v konkrétní verzi operačního systému Windows, není možné ji deserializovat v dřívější verzi systému Windows. Pokud byla například ve Windows 10 zavedena podpora jazykového prostředí, nelze ji deserializovat ve Windows 8.

  • CultureTypes Pokud je hodnota CultureTypes.UserCustomCulture, a počítač, na kterém je deserializována, nemá tuto uživatelskou vlastní kulturu nainstalovanou, není možné ji deserializovat.

  • Pokud je hodnota CultureTypesCultureTypes.ReplacementCultures a počítač, na kterém je deserializována, tuto náhradní jazykovou verzi nemá, deserializuje se na stejný název, ale ne se všemi stejnými vlastnostmi. Pokud je například en-US náhradní jazyková verze v počítači A, ale ne v počítači B, a pokud CultureInfo je objekt odkazující na tuto jazykovou verzi serializován v počítači A a deserializován v počítači B, pak se nepřenáší žádná z vlastních charakteristik jazykové verze. Kultura deserializuje úspěšně, ale s jiným významem.

přepsání Ovládacích panelů

Uživatel se může rozhodnout změnit některé hodnoty spojené s aktuální jazykovou verzí Windows prostřednictvím části Možnosti oblasti a jazyka v Ovládacích panelech. Uživatel se může rozhodnout zobrazit datum v jiném formátu nebo použít jinou měnu než výchozí pro danou kulturu. Obecně platí, že vaše aplikace by měly dodržovat uživatelská nastavení.

Pokud UseUserOverride je true a zadaná jazyková verze odpovídá aktuální jazykové verzi systému Windows, CultureInfo použije tato přepsání, včetně nastavení DateTimeFormatInfo uživatelem pro vlastnosti instance vrácené vlastností DateTimeFormat, a pro vlastnosti instance vrácené vlastností NumberFormatInfo. Pokud jsou uživatelská nastavení nekompatibilní s jazykovou verzí přidruženou k CultureInfo, například pokud vybraný kalendář není jedním ze OptionalCalendars, výsledky metod a hodnoty vlastností nejsou definovány.

Alternativní pořadí řazení

Některé kultury podporují více než jedno pořadí řazení. Příklad:

  • Španělská kultura (Španělsko) má dvě řazení: výchozí mezinárodní řazení a tradiční řazení. Když vytvoříte instanci objektu CultureInfo s názvem jazykové verze es-ES, použije se mezinárodní pořadí řazení. Když vytvoříte instanci objektu CultureInfo s názvem kultury es-ES-tradnl, použije se tradiční pořadí řazení.

  • Kulturní nastavení zh-CN (zjednodušená čínština, ČLR) podporuje dvě pořadí řazení: podle výslovnosti (výchozí) a podle počtu tahů. Když vytvoříte instanci objektu CultureInfo s názvem jazykové verze zh-CN, použije se výchozí pořadí řazení. Když vytvoříte instanci objektu CultureInfo s místním identifikátorem 0x00020804, řetězce se seřadí podle počtu tahů.

Následující tabulka uvádí jazykové verze, které podporují alternativní pořadí řazení a identifikátory pro výchozí a alternativní pořadí řazení.

Název kultury Kultura Výchozí název a identifikátor řazení Alternativní řadicí název a identifikátor
es-ES Španělština (Španělsko) Mezinárodní: 0x00000C0A Tradiční: 0x0000040A
zh-TW Čínština (Tchaj-wan) Počet tahů: 0x00000404 Bopomofo: 0x00030404
zh-CN Čínština (ČLR) Výslovnost: 0x00000804 Počet tahů: 0x00020804
zh-HK Čínština (Hongkong – zvláštní administrativní oblast) Počet tahů: 0x00000c04 Počet tahů: 0x00020c04
zh-SG Čínština (Singapur) Výslovnost: 0x00001004 Počet tahů: 0x00021004
zh-MO Čínština (Macao SAR) Výslovnost: 0x00001404 Počet tahů: 0x00021404
ja-JP Japonština (Japonsko) Výchozí: 0x00000411 Unicode: 0x00010411
ko-KR Korejština (Korea) Výchozí: 0x00000412 Korejština Xwansung – Unicode: 0x00010412
de-DE Němčina (Německo) Slovník: 0x00000407 Řazení telefonního seznamu DIN: 0x00010407
hu-HU Maďarština (Maďarsko) Výchozí: 0x0000040e Technické řazení: 0x0001040e
ka-GE Gruzínština (Gruzie) Tradiční: 0x00000437 Moderní řazení: 0x00010437

Aktuální kultura a aplikace pro UWP

V aplikacích pro Univerzální platforma Windows (UPW) jsou vlastnosti CurrentCultureCurrentUICulture pro čtení i zápis stejně jako v aplikacích .NET Framework a .NET Core. Aplikace pro UWP ale rozpoznávají jedinou kulturu. Vlastnosti CurrentCulture a CurrentUICulture se mapují na první prvek v kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.

V aplikacích .NET je aktuální kultura nastavením pro jednotlivá vlákna a vlastnosti CurrentCulture a CurrentUICulture odrážejí kulturu a kulturu uživatelského rozhraní pouze aktuálního vlákna. V aplikacích pro UWP se aktuální kultura mapuje na kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages, což je globální nastavení. Nastavení vlastnosti CurrentCulture nebo CurrentUICulture změní kulturu celé aplikace; kulturu nelze nastavit na úrovni jednotlivých vláken.