CultureInfo Třída

Definice

Poskytuje informace o konkrétní jazykové verzi (označované jako národní prostředí pro vývoj nespravovaného kódu). Informace zahrnují názvy pro jazykovou verzi, systém zápisu, použitý kalendář, pořadí řazení řetězců a formátování kalendářních dat a čísel.

public ref class CultureInfo : IFormatProvider
public ref class CultureInfo : ICloneable, IFormatProvider
public class CultureInfo : IFormatProvider
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
    interface IFormatProvider
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
Public Class CultureInfo
Implements IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
Dědičnost
CultureInfo
Atributy
Implementuje

Příklady

Následující příklad ukazuje, jak vytvořit objekt pro španělštinu CultureInfo (Španělsko) s mezinárodním řazením a další CultureInfo objekt s tradičním řazením.

using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
int main()
{
   
   // Creates and initializes the CultureInfo which uses the international sort.
   CultureInfo^ myCIintl = gcnew CultureInfo( "es-ES",false );
   
   // Creates and initializes the CultureInfo which uses the traditional sort.
   CultureInfo^ myCItrad = gcnew CultureInfo( 0x040A,false );
   
   // Displays the properties of each culture.
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL" );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl->CompareInfo, myCItrad->CompareInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl->DisplayName, myCItrad->DisplayName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl->EnglishName, myCItrad->EnglishName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl->IsNeutralCulture, myCItrad->IsNeutralCulture );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl->IsReadOnly, myCItrad->IsReadOnly );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "LCID", myCIintl->LCID, myCItrad->LCID );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Name", myCIintl->Name, myCItrad->Name );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl->NativeName, myCItrad->NativeName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Parent", myCIintl->Parent, myCItrad->Parent );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl->TextInfo, myCItrad->TextInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl->ThreeLetterISOLanguageName, myCItrad->ThreeLetterISOLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl->ThreeLetterWindowsLanguageName, myCItrad->ThreeLetterWindowsLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl->TwoLetterISOLanguageName, myCItrad->TwoLetterISOLanguageName );
   Console::WriteLine();
   
   // Compare two strings using myCIintl -> 
   Console::WriteLine( "Comparing \"llegar\" and \"lugar\"" );
   Console::WriteLine( "   With myCIintl -> CompareInfo -> Compare: {0}", myCIintl->CompareInfo->Compare( "llegar", "lugar" ) );
   Console::WriteLine( "   With myCItrad -> CompareInfo -> Compare: {0}", myCItrad->CompareInfo->Compare( "llegar", "lugar" ) );
}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)          
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False                    
IsReadOnly                     False                                          False                    
LCID                           3082                                           1034                     
Name                           es-ES                                          es-ES                    
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es                       
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
ThreeLetterISOLanguageName     spa                                            spa                      
ThreeLetterWindowsLanguageName ESN                                            ESP                      
TwoLetterISOLanguageName       es                                             es                       

Comparing "llegar" and "lugar"
   With myCIintl -> CompareInfo -> Compare: -1
   With myCItrad -> CompareInfo -> Compare: 1

*/
using System;
using System.Collections;
using System.Globalization;

public class SamplesCultureInfo
{

   public static void Main()
   {

      // Creates and initializes the CultureInfo which uses the international sort.
      CultureInfo myCIintl = new CultureInfo("es-ES", false);

      // Creates and initializes the CultureInfo which uses the traditional sort.
      CultureInfo myCItrad = new CultureInfo(0x040A, false);

      // Displays the properties of each culture.
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL");
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName);
      Console.WriteLine();

      // Compare two strings using myCIintl.
      Console.WriteLine("Comparing \"llegar\" and \"lugar\"");
      Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"));
      Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"));
   }
}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False
IsReadOnly                     False                                          False
LCID                           3082                                           1034
Name                           es-ES                                          es-ES
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl
ThreeLetterISOLanguageName     spa                                            spa
ThreeLetterWindowsLanguageName ESN                                            ESP
TwoLetterISOLanguageName       es                                             es

Comparing "llegar" and "lugar"
   With myCIintl.CompareInfo.Compare: -1
   With myCItrad.CompareInfo.Compare: 1

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

        ' Creates and initializes the CultureInfo which uses the international sort.
        Dim myCIintl As New CultureInfo("es-ES", False)

        ' Creates and initializes the CultureInfo which uses the traditional sort.
        Dim myCItrad As New CultureInfo(&H40A, False)

        ' Displays the properties of each culture.
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL")
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName)
        Console.WriteLine()

        ' Compare two strings using myCIintl.
        Console.WriteLine("Comparing ""llegar"" and ""lugar""")
        Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"))
        Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"))

    End Sub



'This code produces the following output.
'
'PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
'CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
'DisplayName                    Spanish (Spain)                                Spanish (Spain)          
'EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
'IsNeutralCulture               False                                          False                    
'IsReadOnly                     False                                          False                    
'LCID                           3082                                           1034                     
'Name                           es-ES                                          es-ES                    
'NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
'Parent                         es                                             es                       
'TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
'ThreeLetterISOLanguageName     spa                                            spa                      
'ThreeLetterWindowsLanguageName ESN                                            ESP                      
'TwoLetterISOLanguageName       es                                             es                       
'
'Comparing "llegar" and "lugar"
'   With myCIintl.CompareInfo.Compare: -1
'   With myCItrad.CompareInfo.Compare: 1

End Module

Poznámky

Třída CultureInfo poskytuje informace specifické pro jazykovou verzi, jako je jazyk, dílčí jazyk, země/oblast, kalendář a konvence spojené s konkrétní jazykovou verzí. Tato třída také poskytuje přístup k instancím objektů , NumberFormatInfo, CompareInfoa TextInfo specifických pro DateTimeFormatInfojazykovou verzi. Tyto objekty obsahují informace potřebné pro operace specifické pro jazykovou verzi, jako je například velikost písmen, formátování kalendářních dat a čísel a porovnávání řetězců. Třídu CultureInfo používají přímo nebo nepřímo třídy, které formátují, parsují nebo manipulují s daty specifickými pro jazykovou verzi, jako Stringjsou , DateTimeDateTimeOffset, a číselné typy.

V této části:

Názvy a identifikátory jazykových verzí
Invariantní, neutrální a specifické jazykové verze
Vlastní jazykové verze
Dynamická data jazykové verze
CultureInfo a kulturní data
Aktuální jazyková verze a aktuální jazyková verze uživatelského rozhraní
Získat všechny jazykové verze
Jazyková verze a vlákna
Jazykové verze a domény aplikací
Asynchronní operace založené na jazykové verzi a úlohách
Serializace objektu CultureInfo
přepsání Ovládací panely
Alternativní pořadí řazení
Kultura a aplikace pro Windows

Názvy a identifikátory jazykových verzí

Třída CultureInfo určuje jedinečný název pro každou jazykovou verzi na základě RFC 4646. Název je kombinací dvoumísmenného nebo třímísmenného kódu jazykové verze ISO 639 přidruženého k jazyku a dvoumísmenného podkulturního kódu ISO 3166 s velkými písmeny přidružených k zemi nebo oblasti. Kromě toho se u aplikací, které cílí na rozhraní .NET Framework 4 nebo novější a běží v Windows 10 nebo novější, podporují názvy jazykových verzí, které odpovídají platným značkám jazyka BCP-47.

Poznámka

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

Formát názvu jazykové verze založené na RFC 4646 je languagecode2-country/regioncode2, kde languagecode2 je dvoumísmenný kód jazyka a country/regioncode2 je dvoumí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žívá 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 cyrilici a latn určuje latinku. 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 uzbečtina (cyrilice, Uzbekistán). V operačních systémech Windows před Windows Vista používá název jazykové verze, který obsahuje skript, vzor languagecode2-scripttag-country/regioncode2, například uz-UZ-Cyrl pro uzbečtina (cyrilice, Uzbekistán).

Neutrální jazyková verze je určena pouze kódem jazyka se dvěma písmeny 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. Jazykové verze Čínština (zjednodušená) s názvem zh-Hansa Čínština (tradiční) s názvem zh-Hantjsou neutrální jazykové verze. Názvy jazykových verzí představují aktuální standard a měly by se používat, pokud nemáte důvod používat starší názvy zh-CHS a zh-CHT.

Identifikátor jazykové verze je standardní mezinárodní číselná zkratka a obsahuje komponenty potřebné k jednoznačné identifikaci jedné z nainstalovaných jazykových verzí. 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ší třídy 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 konkrétním počítači. Verze systému Windows nebo aktualizace Service Pack můžou měnit dostupné jazykové verze. Aplikace můžou 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ě seskupené do tří sad: invariantní jazykové verze, neutrální jazykové verze a specifické jazykové verze.

Invariantní jazyková verze je necitlivá. Aplikace určuje invariantní jazykovou verzi podle názvu pomocí prázdného řetězce ("") nebo podle 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í jazyková verze je jazyková verze, která je přidružená k jazyku, ale ne k zemi nebo oblasti. Konkrétní jazyková verze je jazyková verze, která je přidružená k jazyku a zemi nebo oblasti. Je například fr neutrální název pro francouzskou jazykovou verzi a fr-FR je název konkrétní jazykové verze francouzštiny (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. Kromě toho Name vlastnost objektu vytvořeného CompareInfo pro neutrální jazykovou verzi 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řazenou neutrální jazykovou verzí je invariantní 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ř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, která je definovaná pro operační systém. Použití konkrétní jazykové verze zajišťuje konzistenci s ekvivalentním národním prostředím Systému 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í jazykové verze.

Pokud DateTimeFormatInfo.Calendar je hodnota TaiwanCalendar , ale Thread.CurrentCulture není nastavená na zh-TW, pak DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraNamea DateTimeFormatInfo.GetAbbreviatedEraName vrátí prázdný řetězec ("").

Vlastní jazykové verze

Ve Windows můžete vytvářet vlastní národní prostředí. Další informace najdete v tématu Vlastní národní prostředí.

CultureInfo a kulturní data

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

  • V rozhraní .NET Framework 3.5 a starších verzích jsou kulturní data poskytována operačním systémem Windows i rozhraním .NET Framework.

  • V rozhraní .NET Framework 4 a novějších verzích jsou kulturní data poskytována operačním systémem Windows.

  • Ve všech verzích .NET Core spuštěných ve Windows jsou kulturní data poskytována operačním systémem Windows.

  • Ve všech verzích .NET Core běžících na unixových platformách jsou kulturní data poskytována knihovnou IcU (International Components for Unicode). Konkrétní verze knihovny ICU závisí na jednotlivých operačních systémech.

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

Některé CultureInfo objekty se liší v závislosti na podkladové platformě. Konkrétně zh-CN, nebo čínština (zjednodušená, Čína) a zh-TW, nebo čínština (tradiční, Tchaj-wan) jsou dostupné v systémech Windows, ale jsou to jazykové verze s aliasy 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". Jazykové verze s aliasy nejsou vráceny voláním GetCultures metody a můžou mít jiné hodnoty vlastností, včetně různých Parent jazykových verzí, než jejich protějšky systému Windows. U jazykových zh-CN verzí a zh-TW tyto rozdíly zahrnují následující:

  • V systémech Windows je nadřazenou jazykovou verzí jazykové verze "zh-CN" "zh-Hans" a nadřazená jazyková verze "zh-TW" je "zh-Hant". Nadřazená jazyková verze obou těchto jazykových verzí je "zh". V systémech Unix jsou nadřazené obě jazykové verze "zh". To znamená, že pokud neposkytnete prostředky specifické pro jazykovou verzi "zh-CN" nebo "zh-TW", ale poskytnete 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ákna 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 vrátí falsevolání metody . Toto chování se vztahuje také na volání Equals instance zh-TW CultureInfo a předání instance zh-Hant-Tw.

Data dynamické 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řijmou nové měny, změní pravopis slov nebo změní svůj upřednostňovaný kalendář a změní se definice jazykové verze, aby to bylo možné sledovat. Vlastní jazykové verze se můžou bez předchozího upozornění změnit a jakákoli konkrétní jazyková verze může být přepsána vlastní náhradní jazykovou verzí. Jak je popsáno níže, jednotliví uživatelé mohou také přepsat kulturní předvolby. Aplikace by měly vždy získávat data jazykové verze za běhu.

Upozornění

Při ukládání dat by aplikace měla používat invariantní jazykovou verzi, binární formát nebo určitý formát nezávislý na jazykové verzi. Data uložená podle aktuálních hodnot přidružených k určité jazykové verzi, kromě invariantní jazykové verze, můžou být nečitelná nebo se mohou změnit význam, 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ěn, pořadí řazení textu, konvence vytváření malých a malých písmen a způsoby porovnává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 určuje aktuální a aktuální jazyková verze uživatelského rozhraní pro jednotlivá vlákna, najdete v části Jazyková verze a vlákna . Informace o tom, jak se určuje aktuální a aktuální jazyková verze uživatelského rozhraní ve vláknech spouštěných v nové doméně aplikace a na vláknech, která překračují hranice domény aplikace, najdete v části Jazykové verze a domény aplikace . Informace o tom, jak se určuje aktuální a aktuální ve 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í jazykové verzi najdete v CultureInfo.CurrentCulture tématu o vlastnosti. Podrobnější informace o aktuální jazykové verzi uživatelského rozhraní najdete v CultureInfo.CurrentUICulture tématu o vlastnosti.

Načítání 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 se ukázalo, že jsou si rovny, a zobrazí název aktuální jazykové verze.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim culture1 As CultureInfo = CultureInfo.CurrentCulture
      Dim culture2 As CultureInfo = Thread.CurrentThread.CurrentCulture
      Console.WriteLine("The current culture is {0}", culture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        culture1.Equals(culture2))
   End Sub
End Module
' 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 se ukázalo, že jsou si rovny, a zobrazí název aktuální jazykové verze uživatelského rozhraní.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim uiCulture1 As CultureInfo = CultureInfo.CurrentUICulture
      Dim uiCulture2 As CultureInfo = Thread.CurrentThread.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1.Equals(uiCulture2))
   End Sub
End Module
' 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, který představuje danou CultureInfo jazykovou verzi zavoláním konstruktoru CultureInfo 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. Přiřaďte CultureInfo objekt k CultureInfo.CurrentCulture vlastnosti nebo CultureInfo.CurrentUICulture v .NET Core a .NET Framework 4.6 a novějších verzích. (V rozhraní .NET Framework 4.5.2 a starších verzích můžete objekt přiřadit CultureInfo k Thread.CurrentCulture vlastnosti nebo Thread.CurrentUICulture .)

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í současnou kulturu na francouzštinu (Lucembursko).

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentCulture
      Console.WriteLine("The current culture is {0}", current.Name)
      Dim newCulture As CultureInfo
      If current.Name.Equals("fr-FR") Then
         newCulture = New CultureInfo("fr-LU")
      Else   
         newCulture = new CultureInfo("fr-FR")
      End If
      
      CultureInfo.CurrentCulture = newCulture
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name)   
   End Sub
End Module
' 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 něco jiného než slovinskou (Slovinsko), změní současnou kulturu na slovinskou (Slovinsko). Jinak změní současnou kulturu na chorvatštinu (Chorvatsko).

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", current.Name)
      Dim newUICulture As CultureInfo
      If current.Name.Equals("sl-SI") Then
         newUICulture = New CultureInfo("hr-HR")
      Else   
         newUICulture = new CultureInfo("sl-SI")
      End If
      
      CultureInfo.CurrentUICulture = newUICulture
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The current UI culture is now sl-SI

Získat všechny jazykové verze

Voláním 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 GetCultures . 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 pak 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 Example
{
   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.
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Get all custom cultures.
      Dim custom() As CultureInfo = CultureInfo.GetCultures(CultureTypes.UserCustomCulture)
      If custom.Length = 0 Then 
         Console.WriteLine("There are no user-defined custom cultures.")
      Else
         Console.WriteLine("Custom cultures:")
         For Each culture In custom 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)
         Next       
      End If
      Console.WriteLine()
      
      ' Get all replacement cultures.
      Dim replacements() As CultureInfo = CultureInfo.GetCultures(CultureTypes.ReplacementCultures)
      If replacements.Length = 0 Then 
         Console.WriteLine("There are no replacement cultures.")
      Else 
         Console.WriteLine("Replacement cultures:")
         For Each culture in replacements 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)    
         Next
      End If
      Console.WriteLine()
   End Sub
End Module
' 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

Při spuštění nového vlákna aplikace jsou její aktuální jazyková verze a aktuální jazyková verze uživatelského rozhraní definovány aktuální systémovou jazykovou verzí, nikoli 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í aplikačního vlákna na jazykovou verzi francouzštiny (Francie). Pokud je aktuální jazyková verze již fr-FR, příklad ji nastaví na anglickou jazykovou verzi (USA) (en-US). Zobrazí tři náhodná čísla jako hodnoty měny a pak vytvoří nové vlákno, které zase zobrazí další tři náhodná čísla jako hodnoty měny. Jak ale ukazuje výstup z příkladu, hodnoty měn 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 Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      ThreadProc()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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

Ve verzích rozhraní .NET Framework před rozhraním .NET Framework 4.5 je nejběžnějším způsobem, jak zajistit, aby hlavní vlákno aplikace sdílí stejnou jazykovou verzi se všemi ostatními pracovními vlákny, předat delegátovi buď název jazykové verze pro celou aplikaci, nebo CultureInfo objekt, který představuje jazykovou verzi System.Threading.ParameterizedThreadStart pro celou aplikaci. Následující příklad používá tento přístup k zajištění, že hodnoty měny zobrazené ve dvou vláknech odrážejí konvence formátování stejné jazykové verze.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   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");
      }
      DisplayThreadInfo();
      DisplayValues();

       Thread worker = new Thread(Example.ThreadProc);
       worker.Name = "WorkerThread";
       worker.Start(Thread.CurrentThread.CurrentCulture);
   }

   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(Object obj)
   {
      Thread.CurrentThread.CurrentCulture = (CultureInfo) obj;
      Thread.CurrentThread.CurrentUICulture = (CultureInfo) obj;
      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 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      DisplayThreadInfo()
      DisplayValues()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start(Thread.CurrentThread.CurrentCulture)
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc(obj As Object)
      Thread.CurrentThread.CurrentCulture = CType(obj, CultureInfo)
      Thread.CurrentThread.CurrentUICulture = CType(obj, CultureInfo)
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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 €

Podobným způsobem můžete nastavit jazykovou verzi a jazykovou verzi uživatelského rozhraní vláken fondu vláken voláním ThreadPool.QueueUserWorkItem(WaitCallback, Object) metody .

Počínaje rozhraním .NET Framework 4.5 můžete nastavit jazykovou verzi a jazykovou verzi uživatelského rozhraní všech vláken v doméně aplikace přímo přiřazením objektu, který představuje tuto jazykovou CultureInfo verzi, vlastnostem DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture . 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 Example
{
   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(Example.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 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      ThreadProc()

       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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í

DefaultThreadCurrentCulture I když jsou vlastnosti a 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 Věnované jazykové verzi a doménám aplikací.

Když přiřadíte hodnoty vlastnostem DefaultThreadCurrentCulture a DefaultThreadCurrentUICulture , změní se také jazyková verze a jazyková verze uživatelského rozhraní vláken v doméně aplikace, pokud nemají explicitně přiřazenou jazykovou verzi. Tato vlákna však odrážejí nové nastavení jazykové verze pouze v době, kdy se spouští v aktuální doméně aplikace. Pokud se tato vlákna spouštějí v jiné doméně aplikace, jejich jazyková verze se stane 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 DefaultThreadCurrentCulture to, že vlastnosti a DefaultThreadCurrentUICulture ji změní.

Jazykové verze a aplikační domény

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 AppDomainSetup (Francie) a potom pomocí třídy a delegáta AppDomainInitializer nastaví výchozí jazykovou verzi a jazykovou verzi 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 odvozené z výchozí jazykové verze a jazykové verze uživatelského rozhraní domény aplikace, ve které se vlákno spouští. Všimněte si také, že DefaultThreadCurrentCulture vlastnosti a DefaultThreadCurrentUICulture vrací výchozí CultureInfo hodnoty domény aplikace, která je aktuální při volání metody.

using System;
using System.Globalization;
using System.Reflection;
using System.Threading;

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
Imports System.Globalization
Imports System.Reflection
Imports System.Threading

Module Example
   Public Sub Main()
      ' Set the default culture and display the current date in the current application domain.
      Dim info1 As New Info()
      SetAppDomainCultures("fr-FR")
      
      ' Create a second application domain.
      Dim setup As New AppDomainSetup()
      setup.AppDomainInitializer = AddressOf SetAppDomainCultures
      setup.AppDomainInitializerArguments = { "ru-RU" }
      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2", Nothing, setup)
      ' Create an Info object in the new application domain.
      Dim info2 As Info = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName, 
                                                               "Info"), Info) 

      ' Execute methods in the two application domains.
      info2.DisplayDate()
      info2.DisplayCultures()
      
      info1.DisplayDate()
      info1.DisplayCultures()            
   End Sub
   
   Public Sub SetAppDomainCultures(names() As String)
      SetAppDomainCultures(names(0))
   End Sub
   
   Public Sub SetAppDomainCultures(name As String)
       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 e As CultureNotFoundException
         Return
      Catch e As ArgumentException
         Return
      End Try      
   End Sub
End Module

Public Class Info : Inherits MarshalByRefObject
   Public Sub DisplayDate()
      Console.WriteLine("Today is {0:D}", Date.Now)
   End Sub
   
   Public Sub 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)
   End Sub
End Class
' 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 "Aplikační domény a vlákna" v tématu Domény aplikací .

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

Asynchronní programovací vzor založený na úlohách používá Task objekty a Task<TResult> 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.

U aplikací, které cílí na rozhraní .NET Framework 4.6 nebo novější verzi, je jazyková verze součástí kontextu asynchronní operace. Jinými slovy, počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6, asynchronní operace ve výchozím nastavení dědí hodnoty CurrentCulture a CurrentUICulture vlastností 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ákna a stane se aktuální jazykovou verzí vlákna fondu vláken, které provádí asynchronní operaci.

Následující příklad poskytuje jednoduchý obrázek. Používá TargetFrameworkAttribute atribut k cílení na rozhraní .NET Framework 4.6. Příklad definuje delegáta Func<TResult> , formatDelegatekterý vrací některá čísla formátovaná jako hodnoty měny. Příklad změní aktuální systémovou jazykovou verzi na francouzštinu (Francie), nebo pokud je francouzština (Francie) již aktuální jazykovou verzí, angličtina (USA). Potom:

  • Vyvolá přímo delegáta, aby běžel synchronně na hlavním vlákně aplikace.

  • Vytvoří úlohu, která provádí delegáta asynchronně ve vlákně fondu vláken.

  • Vytvoří úlohu, která spustí delegáta 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 úkoly vyvolány asynchronně, se stane aktuální jazykovou verzí pro danou asynchronní operaci.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{

   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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 Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task asynchronously:
'          Formatting Imports the fr-FR culture on thread 3.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €

U aplikací, které cílí na verze rozhraní .NET Framework starší než .NET Framework 4.6, nebo pro aplikace, které necílí na konkrétní verzi rozhraní .NET Framework, není jazyková verze volajícího vlákna součástí kontextu úlohy. Místo toho, pokud není explicitně definován, je jazyková verze nových vláken ve výchozím nastavení systémová jazyková verze. Následující příklad, který je shodný s předchozím příkladem s tím rozdílem TargetFrameworkAttribute , že chybí atribut, to ilustruje. Vzhledem k tomu, že systémová jazyková verze systému, na kterém se příklad spustil, byla angličtina (USA), jazyková verze úlohy, která se provádí asynchronně ve vlákně fondu vláken, je en-US spíše než fr-FR.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // 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 en-US 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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 en-US 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 €

U aplikací, které cílí na verze rozhraní .NET Framework z rozhraní .NET Framework 4.5 nebo novější, ale starší než .NET Framework 4.6, můžete pomocí DefaultThreadCurrentCulture vlastností a DefaultThreadCurrentUICulture zajistit, aby se jazyková verze volajícího vlákna používala v asynchronních úlohách, které se spouští ve vláknech fondu vláken. Následující příklad je shodný s předchozím příkladem s tím rozdílem DefaultThreadCurrentCulture , že používá vlastnost k zajištění, aby vlákna fondu vláken měla stejnou jazykovou verzi jako hlavní vlákno aplikace.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;

       // 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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. U aplikací, 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í úlohy i v případě, že úloha překročí hranice domény aplikace.

Následující příklad ukazuje, že jazyková verze volajícího vlákna zůstává aktuální jazykovou verzí asynchronní operace založené na úlohách i v případě, že metoda, kterou úloha provádí, překročí hranice domény aplikace. Definuje třídu DataRetriever, s jednou metodou , GetFormattedNumberkterá vrací náhodné číslo s plovoucí desetinnou čárkou s dvojitou přesností od 1 do 1 000 formátované jako hodnota měny. Spustí se první úloha, která jednoduše vytvoří DataRetriever instanci a zavolá její GetFormattedNumber metodu. Druhá úloha hlásí aktuální doménu aplikace, vytvoří novou doménu aplikace, vytvoří DataRetriever instanci v nové doméně aplikace a zavolá její GetFormattedNumber metodu. Jak ukazuje výstup z příkladu, aktuální jazyková verze zůstala stejná ve volajícím vlákně, v první úloze i ve druhé úloze při provádění v hlavní i druhé doméně aplikace.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{
   public static void Main()
   {
       string formatString = "C2";
       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:");
       var t1 = Task.Run(() => { DataRetriever d = new DataRetriever();
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t1.Result);
       Console.WriteLine();

       Console.WriteLine("Executing a task synchronously in two appdomains:");
       var t2 = Task.Run(() => { Console.WriteLine("Thread {0} is running in app domain '{1}'",
                                                   Thread.CurrentThread.ManagedThreadId,
                                                   AppDomain.CurrentDomain.FriendlyName);
                                 AppDomain domain = AppDomain.CreateDomain("Domain2");
                                 DataRetriever d = (DataRetriever) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                   "DataRetriever");
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t2.Result);
   }
}

public class DataRetriever : MarshalByRefObject
{
   public string GetFormattedNumber(String format)
   {
      Thread thread = Thread.CurrentThread;
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture);
      Console.WriteLine("Thread {0} is running in app domain '{1}'",
                        thread.ManagedThreadId,
                        AppDomain.CurrentDomain.FriendlyName);
      Random rnd = new Random();
      Double value = rnd.NextDouble() * 1000;
      return value.ToString(format);
   }
}
// The example displays output like the following:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//
//     Executing a task asynchronously in a single appdomain:
//     Current culture is fr-FR
//     Thread 3 is running in app domain 'AsyncCulture4.exe'
//     93,48 €
//
//     Executing a task synchronously in two appdomains:
//     Thread 4 is running in app domain 'AsyncCulture4.exe'
//     Current culture is fr-FR
//     Thread 4 is running in app domain 'Domain2'
//     288,66 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim formatString As String = "C2"
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If

       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:") 
       Dim t1 = Task.Run(Function()
                            Dim d As New DataRetriever()
                            Return d.GetFormattedNumber(formatString)
                         End Function)
       Console.WriteLine(t1.Result)
       Console.WriteLine() 
       
       Console.WriteLine("Executing a task synchronously in two appdomains:")
       Dim t2 = Task.Run(Function()
                            Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                              Thread.CurrentThread.ManagedThreadId, 
                                              AppDomain.CurrentDomain.FriendlyName)
                            Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
                            Dim d As DataRetriever = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
                                                                                          "DataRetriever"), DataRetriever)
                            Return d.GetFormattedNumber(formatString) 
                         End Function) 
       Console.WriteLine(t2.Result)
   End Sub
End Module

Public Class DataRetriever : Inherits MarshalByRefObject
   Public Function GetFormattedNumber(format As String) As String
      Dim thread As Thread = Thread.CurrentThread
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture)
      Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                        thread.ManagedThreadId, 
                        AppDomain.CurrentDomain.FriendlyName)
      Dim rnd As New Random()
      Dim value As Double = rnd.NextDouble() * 1000
      Return value.ToString(format)
   End Function
End Class
' The example displays output like the following:
'     The example is running on thread 1
'     The current culture is en-US
'     Changed the current culture to fr-FR.
'     
'     Executing a task asynchronously in a single appdomain:
'     Current culture is fr-FR
'     Thread 3 is running in app domain 'AsyncCulture4.exe'
'     93,48 €
'     
'     Executing a task synchronously in two appdomains:
'     Thread 4 is running in app domain 'AsyncCulture4.exe'
'     Current culture is fr-FR
'     Thread 4 is running in app domain 'Domain2'
'     288,66 €

Serializace objektu CultureInfo

CultureInfo Když je objekt serializován, vše, co je ve skutečnosti uložena, je Name a UseUserOverride. Úspěšně se deserializuje pouze v prostředí, Name kde to má 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 ve starší verzi systému Windows. Pokud se například v Windows 10 zavedla jazyková verze, nelze ji deserializovat na Windows 8.

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

  • CultureTypes Pokud je CultureTypes.ReplacementCultureshodnota , a počítač, na kterém je deserializována, 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 objekt odkazující na tuto jazykovou verzi je serializován v počítači A a deserializován v počítači B, pak se nepřenesou žádné z vlastních vlastností jazykové verze. Kultura úspěšně deserializuje, ale s jiným významem.

Ovládací panely přepsání

Uživatel se může rozhodnout přepsat některé hodnoty přidružené k aktuální jazykové verzi Systému Windows prostřednictvím části místní a jazykové možnosti 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ž je výchozí jazyková verze. 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ě nastavení uživatele pro vlastnosti DateTimeFormatInfo instance vrácené DateTimeFormat vlastností a vlastnosti NumberFormatInfo instance vrácené NumberFormat vlastností. Pokud jsou uživatelská nastavení nekompatibilní s jazykovou verzí přidruženou CultureInfok , například pokud vybraný kalendář není jedním z OptionalCalendars, vý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ština (Š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 CultureInfo s es-ES 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í: podle výslovnosti (výchozí) a podle počtu tahů. Když vytvoříte instanci objektu CultureInfo s zh-CN 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 výchozího a alternativního 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 Ču-jin: 0x00030404
zh-CN Čínština (ČLR) Výslovnost: 0x00000804 Počet tahů: 0x00020804
zh-HK Čínština (Hongkong – zvláštní správní 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 – zvláštní správní oblast) Výslovnost: 0x00001404 Počet tahů: 0x00021404
ja-JP japonština (Japonsko) Výchozí: 0x00000411 Unicode: 0x00010411
ko-KR korejština (Jižní 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í jazyková verze a aplikace pro UPW

V aplikacích CurrentCulture Univerzální platforma Windows (UPW) jsou vlastnosti a CurrentUICulture pro čtení i zápis stejně jako v aplikacích .NET Framework a .NET Core. Aplikace pro UPW však rozpoznávají jednu jazykovou verzi. Vlastnosti CurrentCulture a CurrentUICulture se mapuje na první hodnotu v kolekci Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

V aplikacích .NET Framework a .NET Core je aktuální jazyková verze nastavená na vlákno a CurrentCulture vlastnosti a CurrentUICulture odrážejí jazykovou verzi a jazykovou verzi uživatelského rozhraní pouze 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í vlastnosti nebo CurrentUICulture změní jazykovou verzi celé aplikace. Jazykovou verzi nelze nastavit pro jednotlivá vlákna.

Konstruktory

CultureInfo(Int32)

Inicializuje novou instanci CultureInfo třídy na základě jazykové verze určené identifikátorem jazykové verze.

CultureInfo(Int32, Boolean)

Inicializuje novou instanci CultureInfo třídy na základě jazykové verze určené identifikátorem jazykové verze a na hodnotu, která určuje, zda se má použít nastavení jazykové verze vybrané uživatelem ze systému Windows.

CultureInfo(String)

Inicializuje novou instanci CultureInfo třídy na základě jazykové verze určené názvem.

CultureInfo(String, Boolean)

Inicializuje novou instanci CultureInfo třídy na základě jazykové verze určené názvem a na hodnotu, která určuje, zda se má použít nastavení jazykové verze vybrané uživatelem ze systému Windows.

Vlastnosti

Calendar

Získá výchozí kalendář používaný jazykovou verzí.

CompareInfo

Získá , CompareInfo který definuje, jak porovnat řetězce pro jazykovou verzi.

CultureTypes

Získá jazykové typy, které se týkají aktuálního CultureInfo objektu.

CurrentCulture

Získá nebo nastaví CultureInfo objekt, který představuje jazykovou verzi používá aktuální vlákno a asynchronní operace založené na úlohách.

CurrentUICulture

Získá nebo nastaví CultureInfo objekt, který představuje aktuální jazykovou verzi uživatelského rozhraní používá Resource Manager k vyhledání prostředků specifických pro jazykovou verzi za běhu.

DateTimeFormat

Získá nebo nastaví , DateTimeFormatInfo který definuje kulturně vhodný formát zobrazení kalendářních dat a časů.

DefaultThreadCurrentCulture

Získá nebo nastaví výchozí jazykovou verzi pro vlákna v aktuální doméně aplikace.

DefaultThreadCurrentUICulture

Získá nebo nastaví výchozí jazykovou verzi uživatelského rozhraní pro vlákna v aktuální doméně aplikace.

DisplayName

Získá úplný lokalizovaný název jazykové verze.

EnglishName

Získá název jazykové verze ve formátu languagefull [country/regionfull] v angličtině.

IetfLanguageTag

Zastaralé Získá standardní identifikaci RFC 4646 pro jazyk.

InstalledUICulture

Získá, CultureInfo který představuje jazykovou verzi nainstalovanou s operačním systémem.

InvariantCulture

Získá objekt nezávislý na CultureInfo jazykové verzi (invariantní).

IsNeutralCulture

Získá hodnotu označující, zda aktuální CultureInfo představuje neutrální jazykovou verzi.

IsReadOnly

Získá hodnotu označující, zda je aktuální CultureInfo jen pro čtení.

KeyboardLayoutId

Získá identifikátor národního prostředí aktivního vstupu.

LCID

Získá identifikátor jazykové verze pro aktuální CultureInfo.

Name

Získá název jazykové verze ve formátu kód jazyka2-země/oblastcode2.

NativeName

Získá název jazykové verze, skládající se z jazyka, země/oblasti a volitelného skriptu, který je jazyková verze nastavena na zobrazení.

NumberFormat

Získá nebo nastaví, NumberFormatInfo který definuje kulturně vhodný formát zobrazení čísel, měny a procenta.

OptionalCalendars

Získá seznam kalendářů, které mohou být použity jazykovou verzí.

Parent

Získá , CultureInfo který představuje nadřazenou jazykovou verzi aktuálního CultureInfo.

TextInfo

Získá, TextInfo který definuje systém zápisu přidružený k jazykové verzi.

ThreeLetterISOLanguageName

Získá třímísmenný kód ISO 639-2 pro jazyk aktuálního CultureInfo.

ThreeLetterWindowsLanguageName

Získá třímístný kód pro jazyk, jak je definováno v rozhraní API systému Windows.

TwoLetterISOLanguageName

Získá ISO 639-1 dvoumísmenný nebo ISO 639-3 třímísmenný kód pro jazyk aktuální CultureInfo.

UseUserOverride

Získá hodnotu označující, zda aktuální CultureInfo objekt používá nastavení jazykové verze vybrané uživatelem.

Metody

ClearCachedData()

Aktualizuje informace související s jazykovou verzí v mezipaměti.

Clone()

Vytvoří kopii aktuálního CultureInfosouboru .

CreateSpecificCulture(String)

Vytvoří, CultureInfo který představuje konkrétní jazykovou verzi, která je přidružena k zadanému názvu.

Equals(Object)

Určuje, zda zadaný objekt je stejná jazyková verze jako aktuální CultureInfo.

GetConsoleFallbackUICulture()

Získá alternativní jazykovou verzi uživatelského rozhraní vhodnou pro konzolové aplikace, pokud výchozí jazyková verze grafického uživatelského rozhraní není vhodná.

GetCultureInfo(Int32)

Načte instanci jazykové verze uloženou v mezipaměti jen pro čtení pomocí identifikátoru zadané jazykové verze.

GetCultureInfo(String)

Načte instanci jazykové verze uloženou v mezipaměti jen pro čtení pomocí zadaného názvu jazykové verze.

GetCultureInfo(String, Boolean)

Načte instanci jazykové verze uloženou v mezipaměti, jen pro čtení.

GetCultureInfo(String, String)

Načte instanci jazykové verze uloženou v mezipaměti, jen pro čtení. Parametry určují jazykovou verzi, která se inicializuje pomocí TextInfo objektů a CompareInfo určených jinou jazykovou verzí.

GetCultureInfoByIetfLanguageTag(String)

Zastaralé Načte objekt jen CultureInfo pro čtení s lingvistickými charakteristikami, které jsou identifikovány zadanou značkou jazyka RFC 4646.

GetCultures(CultureTypes)

Získá seznam podporovaných jazykových verzí filtrovaných podle zadaného CultureTypes parametru.

GetFormat(Type)

Získá objekt, který definuje, jak formátovat zadaný typ.

GetHashCode()

Slouží jako hashovací funkce pro aktuální CultureInfo, která je vhodná pro hashování algoritmů a datových struktur, jako je například zatřiďovací tabulka.

GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ReadOnly(CultureInfo)

Vrátí obálku jen pro čtení kolem zadaného CultureInfo objektu.

ToString()

Vrátí řetězec obsahující název aktuálního CultureInfo ve formátu kód jazyka2-země/regioncode2.

Platí pro

Viz také