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 jazykovou verzi, jako je jazyk, podlanguage, země/oblast, kalendář a konvence spojené s konkrétní jazykovou verzí. Tato třída také poskytuje přístup k instancím specifických pro jazykovou DateTimeFormatInfoverzi , NumberFormatInfoCompareInfo, a TextInfo objektů. Tyto objekty obsahují informace potřebné pro operace specifické pro jazykovou verzi, jako jsou písmena, formátování kalendářních dat 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í, parsují nebo manipulují s daty specifickými pro jazykovou verzi, například String, DateTime, DateTimeOffseta číselnými typy.

Názvy a identifikátory jazykové verze

Třída CultureInfo určuje jedinečný název pro každou jazykovou verzi na základě RFC 4646. Název je kombinace dvoumísmenného nebo třímísmenného kódu jazykové verze iso 639 přidruženého k jazyku a kódu subculture přidruženého k zemi nebo oblasti dvoumísmenným písmenem ISO 3166. Pro aplikace, které běží ve Windows 10 nebo novějších, se navíc podporují názvy jazykových verzí, které odpovídají platným jazykovým značkám BCP-47.

Poznámka:

Pokud je název jazykové verze předán konstruktoru třídy nebo metodě, jako CreateSpecificCultureCultureInfoje nebo , jeho případ není významný.

Formát názvu jazykové verze založené na DOKUMENTU RFC 4646 je languagecode2-country/regioncode2, kde languagecode2 je dvoumísmenný kód jazyka a country/regioncode2 je dvoumísmenný subculture kód. 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í skript ISO 15924. Například Cyrl určuje cyrilický skript a Latn určuje latinský skript. Název jazykové verze, který obsahuje skript, používá vzor languagecode2--scripttagcountry/regioncode2. Příkladem tohoto typu názvu jazykové verze je uz-Cyrl-UZ uzbek (cyrilice, Kypr). V operačních systémech Windows před systémem Windows Vista název jazykové verze, která obsahuje skript, používá vzor languagecode2-scripttag-country/regioncode2, uz-UZ-Cyrl například pro Uzbek (cyrilice, Python).

Neutrální jazyková verze je určena pouze dvoumísmenný kód jazyka malými písmeny. 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 jazykových verzí, 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 jazykových verzí 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 oboru názvů. Podrobné informace o jazykové verzi pro systémy Windows najdete ve sloupci Značka jazyka v seznamu názvů jazyků a oblastí podporovaných systémem Windows. Názvy jazykových verzí se řídí standardem definovaným BCP 47.

Názvy a identifikátory jazykové verze představují pouze podmnožinu jazykových verzí, které lze najít v určité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í jazykové verze pomocí nástroje Microsoft Locale Builder . Microsoft Locale Builder je napsaný ve spravovaném CultureAndRegionInfoBuilder kódu pomocí třídy.

Několik jedinečných názvů je úzce spojeno s jazykovou verzí, zejména názvy přidružené k následujícím členům třídy:

Invariantní, neutrální a specifické jazykové verze

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

Invariantní jazyková verze nerozlišuje jazykovou verzi. Vaše aplikace určuje invariantní jazykovou verzi pomocí prázdného řetězce ("") nebo jeho identifikátoru. InvariantCulture definuje instanci invariantní jazykové verze. 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 jazykovou verzi.

Neutrální kultura je kultura, která je přidružená k jazyku, ale ne k zemi nebo oblasti. Konkrétní jazyková verze je jazyková verze přidružená k jazyku a zemi/oblasti. 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í jazykovou verzi 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é jazykové verze mají hierarchii, ve které je nadřazená konkrétní jazyková verze neutrální jazykovou verzí a nadřazená neutrální jazyková verze je neutrální jazyková verze. Vlastnost Parent obsahuje neutrální jazykovou verzi přidruženou ke konkrétní jazykové verzi. 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í jazykovou verzi nejsou k dispozici, použijí se prostředky vložené do hlavního sestavení. Další informace o záložním procesu prostředku 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 volání 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 neutrální jazykovou verzi nebo pro konkrétní jazykové verze, nikoli pro neutrální jazykové verze.

Pokud DateTimeFormatInfo.Calendar je hodnotaTaiwanCalendar, ale Thread.CurrentCulture není nastavena na zh-TW, DateTimeFormatInfo.NativeCalendarNameDateTimeFormatInfo.GetEraNamepak , a DateTimeFormatInfo.GetAbbreviatedEraName vrátit prázdný řetězec ("").

Vlastní jazykové verze

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

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 jazyková verze dostupná pro konkrétní implementaci, platformu nebo verzi .NET v jiné implementaci, platformě nebo verzi .NET.

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

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

  • V systémech Windows volání CultureInfo.Equals instance, která představuje jazykovou verzi "zh-CN" a předání instance "zh-Hans-CN" vrátí true. V systémech Unix volání metody vrátí false. Toto chování platí také pro volání Equals instance zh-TW CultureInfo a jeho předání instance "zh-Hant-Tw".

Dynamická data jazykové verze

S výjimkou invariantní jazykové verze jsou data jazykové verze dynamická. To platí i pro předdefinované jazykové verze. Země nebo oblasti například přijímají nové měny, mění jejich pravopis slov nebo mění preferovaný kalendář a definice jazykové verze, aby to bylo možné sledovat. Vlastní jazykové verze se můžou změnit bez předchozího upozornění a každá konkrétní jazyková verze může být přepsána vlastní jazykovou verzí pro nahrazení. 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 data jazykové verze za běhu.

Upozornění

Při ukládání dat by vaše aplikace měla používat neutrální jazykovou verzi, binární formát nebo určitý formát nezávislý na jazykové verzi. 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í jazyková verze a aktuální jazyková verze uživatelského rozhraní

Každé vlákno v aplikaci .NET má aktuální jazykovou verzi a aktuální jazykovou verzi uživatelského rozhraní. Aktuální jazyková verze 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ůsoby porovnání řetězců. Aktuální jazyková verze uživatelského rozhraní se používá k načtení prostředků specifických pro jazykovou verzi 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 aktuální a aktuální jazyková verze uživatelského rozhraní určená pro vlákna spuštěná v nové doméně aplikace a ve vláknech, která překračují hranice domény aplikace, najdete v části Jazykové verze a domény aplikací. Informace o tom, jak je aktuální a aktuální jazyková verze uživatelského rozhraní určená pro vlákna provádějící 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í jazykové verzi naleznete v CultureInfo.CurrentCulture vlastnosti. Podrobnější informace o aktuální jazykové verzi uživatelského rozhraní naleznete v CultureInfo.CurrentUICulture tématu vlastností.

Načtení aktuálních a aktuálních jazykových verzí uživatelského rozhraní

Objekt, který představuje aktuální jazykovou verzi, můžete získat CultureInfo 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.

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

Objekt, který představuje aktuální jazykovou verzi uživatelského rozhraní, můžete získat CultureInfo 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 {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

Nastavení aktuálních a aktuálních jazykových verzí uživatelského rozhraní

Pokud chcete změnit jazykovou verzi a jazykovou verzi uživatelského rozhraní vlákna, postupujte takto:

  1. Vytvořte instanci objektu CultureInfo , který představuje danou jazykovou verzi voláním CultureInfo konstruktoru třídy a předáním názvu jazykové verze. Konstruktor CultureInfo(String) vytvoří instanci objektu CultureInfo , který odráží přepsání uživatele, 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ý CultureInfo objekt odpovídá přepsání uživatele, pokud je nová jazyková verze stejná jako aktuální jazyková verze Systému Windows.

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

Následující příklad načte aktuální jazykovou verzi. Pokud je to něco jiného než francouzská (Francie), změní se současná kultura na francouzštinu (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 {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

Následující příklad načte aktuální jazykovou verzi. Pokud se jedná o jinou slovinskou kulturu (Slovinsko), změní se současná kultura na slovinštinu (Slovinsko). V opačném případě změní aktuální jazykovou verzi na chorvatštinu (Chorvatsko).

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

Získání všech kultur

Voláním GetCultures metody můžete načíst pole konkrétních kategorií jazykových verzí nebo všech jazykových verzí 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("   {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.

Jazykové verze 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í jazykovou verzi a aktuální jazykovou verzi uživatelského rozhraní vlákna aplikace na jazykovou verzi francouzštiny (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: '{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

Jazykovou verzi a jazykovou verzi uživatelského rozhraní všech vláken v doméně aplikace můžete nastavit přiřazením objektuCultureInfo, který představuje tuto jazykovou verzi, a DefaultThreadCurrentUICulture vlastnostemDefaultThreadCurrentCulture. Následující příklad používá tyto vlastnosti k zajištění, že všechna vlákna ve výchozí doméně aplikace sdílejí stejnou jazykovou verzi.

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 €

Upozorňující

I když jsou DefaultThreadCurrentCulture vlastnosti DefaultThreadCurrentUICulture statické členy, definují výchozí jazykovou verzi a výchozí jazykovou verzi uživatelského rozhraní pouze pro doménu aplikace, která je aktuální v době, kdy jsou tyto hodnoty vlastností nastaveny. Další informace najdete v další části Jazykové verze a domény aplikací.

Při přiřazování hodnot k vlastnostem DefaultThreadCurrentCulture se jazyková verze a DefaultThreadCurrentUICulture jazyková verze uživatelského rozhraní vláken v doméně aplikace také změní, pokud nebyly explicitně přiřazeny jazykové verzi. Tato vlákna však odrážejí nová nastavení jazykové verze pouze při 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 jazykovou verzi hlavního vlákna aplikace a nespoléhali na to, že DefaultThreadCurrentCulture byste ji mohli změnit, a DefaultThreadCurrentUICulture vlastnosti.

Jazykové verze a domény aplikací

DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture jsou statické vlastnosti, které explicitně definují výchozí jazykovou verzi pouze pro doménu aplikace, která je aktuální při nastavení nebo načtení 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 DefaultThreadCurrentCulture vlastnosti DefaultThreadCurrentUICulture vrací výchozí CultureInfo hodnoty domény aplikace, která je aktuální při 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 {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

Další informace o jazykových verzích a doménách aplikací najdete v části Domény aplikací a vlákna v tématu Domény aplikace.

Asynchronní operace založené na jazykové verzi a úlohách

Asynchronní programovací vzor založený na úlohách používá Task a Task<TResult> 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 novější verzi, je jazyková verze 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í jazykovou verzi systému na francouzštinu (Francie), nebo pokud je francouzština (Francie) již aktuální jazyková verze, angličtina (USA). To pak:

  • Vyvolá delegáta přímo tak, aby běžel synchronně na hlavním vlákně aplikace.
  • Vytvoří úlohu, která delegáta spouští asynchronně ve vlákně 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 jazyková verze volajícího vlákna zůstává součástí kontextu asynchronního úkolu i v případě, že úloha překročí hranice domény aplikace.

Serializace objektu CultureInfo

CultureInfo Při serializaci objektu je vše, co je skutečně uloženo je Name a UseUserOverride. Ú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 CultureTypes.InstalledWin32Cultureshodnota vlastnosti 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 jazyková verze, nelze ji deserializovat ve Windows 8.

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

  • CultureTypes Pokud je CultureTypes.ReplacementCultureshodnota a počítač, na kterém je deserializován, nemá tuto náhradní jazykovou verzi, deserializuje na stejný název, ale ne všechny stejné vlastnosti. 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í panely

Uživatel se může rozhodnout přepsat některé hodnoty spojené s aktuální jazykovou verzí Systému Windows prostřednictvím oblasti a jazykové možnosti části Ovládací panely. Uživatel se například může rozhodnout zobrazit datum v jiném formátu nebo použít jinou měnu než výchozí pro jazykovou verzi. Obecně platí, že vaše aplikace by měly dodržovat tato přepsání uživatelů.

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ě uživatelských DateTimeFormatInfo nastavení pro vlastnosti instance vrácené DateTimeFormat vlastností a vlastnosti NumberFormatInfo instance vrácené NumberFormat vlastností vlastnosti. Pokud jsou uživatelská nastavení nekompatibilní s jazykovou verzí přidruženou CultureInfonapříklad k vybranému kalendáři, OptionalCalendarsvýsledky metod a hodnoty vlastností nejsou definovány.

Alternativní pořadí řazení

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

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

  • Jazyková zh-CN verze (zjednodušená čínština, ČLR) podporuje dvě pořadí řazení: výslovnost (výchozí) a počet tahů. Když vytvoříte instanci objektu CultureInfozh-CN s názvem jazykové verze, 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 jazykové verze Kultura Výchozí název a identifikátor řazení Alternativní název a identifikátor řazení
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 Telefon Book Sort 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í jazyková verze a aplikace pro UPW

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 UPW ale rozpoznávají jedinou jazykovou verzi. Vlastnosti CurrentCulture a CurrentUICulture vlastnosti se mapuje na první hodnotu v kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

V aplikacích .NET je aktuální jazyková verze nastavení pro jednotlivá vlákna a CurrentCultureCurrentUICulture vlastnosti odrážejí jazykovou verzi a jazykovou verzi uživatelského rozhraní aktuálního vlákna. V aplikacích pro UPW se aktuální jazyková verze mapuje na kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , což je globální nastavení. CurrentCulture Nastavení nebo CurrentUICulture vlastnosti změní jazykovou verzi celé aplikace. Jazykovou verzi nelze nastavit pro jednotlivé vlákna.