TOC

This article has been localized into Czech by the community.

Práce s kulturou a regiony:

Třída CultureInfo

V posledních několika článcích jsme hovořili o tom, jak užitečná je třída CultureInfo, když potřebujete plnou kontrolu nad tím, jak se čísla a data zobrazují ve vaší aplikaci. Také jsme hovořili o tom, jak můžete ověřit a upravit, kterou kulturu by vaše aplikace měla používat jako záložní. S tím vším na místě je čas prozkoumat samotnou třídu CultureInfo podrobněji, abychom viděli, jak ji můžeme plně využít.

Rychlé připomenutí, než začneme: Třída CultureInfo je součástí jmenného prostoru System.Globalization, takže nezapomeňte jej importovat, když budete zkoušet příklady:

using System.Globalization;

Neutrální a specifické kultury

V předchozích příkladech této kapitoly jsme používali pouze specifické kultury, což je kultura, která specifikuje jak jazyk, tak zemi/region. Příkladem toho je kultura en-US, která jasně uvádí, že požadovaným jazykem je angličtina a regionem jsou Spojené státy. Alternativou k tomu je kultura en-GB, což je stejný jazyk (angličtina), ale s regionem Velké Británie místo USA.

Budou chvíle, kdy budou tyto rozdíly pro vás důležité, v takovém případě byste měli používat tyto regionálně specifické verze třídy CultureInfo. Na druhé straně také nastanou situace, kdy je angličtina pouze jazykem a nechcete tento jazyk vázat na konkrétní zemi nebo region. Pro to .NET framework definuje tzv. neutrální kultury, které specifikují pouze jazyk. Ve skutečnosti, jak en-US, tak en-GB dědí z takové neutrální kultury (což dává dokonalý smysl, protože sdílejí stejný jazyk!) a můžete k ní přistupovat pomocí vlastnosti Parent. Nechť následující příklad ilustruje:

CultureInfo enGb = new CultureInfo("en-GB");
CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine(enGb.DisplayName);
Console.WriteLine(enUs.DisplayName);
Console.WriteLine(enGb.Parent.DisplayName);
Console.WriteLine(enUs.Parent.DisplayName);

Ne příliš užitečný příklad, ale měl by vám dát lepší představu o vnitřní struktuře třídy CultureInfo. Výstup by měl vypadat takto:

English (United Kingdom)
English (United States)
English
English

Získání správné třídy CultureInfo

Z našich předchozích příkladů jste viděli, že můžeme získat požadovaný CultureInfo třídu tak, že předáme identifikátor jazyka-země/regionu konstruktoru třídy. Ale protože můžete hledat neutrální kulturu, jak bylo popsáno výše, můžete také pouze předat identifikátor jazyka:

CultureInfo en = new CultureInfo("en");

.NET framework poté vrátí neutrální anglickou instanci CultureInfo pro vás. Pro úplný seznam možných identifikátorů jazyka a/nebo jazyka-země/regionu doporučuji zkontrolovat dokumentaci MSDN.

Dalším způsobem, jak identifikovat konkrétní kulturu, je takzvané LCID (LoCale ID). Najdete ho jako vlastnost na stávajících instancích CultureInfo, ale pokud znáte ID, můžete jej také použít k vytvoření objektu CultureInfo. Například LCID pro en-US je 1033:

CultureInfo enUs = new CultureInfo(1033);

Nicméně ve většině situacích je mnohem jednodušší použít identifikátor jazyka-země/regionu, jak bylo dříve ukázáno.

Získání seznamu dostupných kultur

Můžeme nyní získat konkrétní kulturu a použít ji pro různé účely, ale možná potřebujete seznam dostupných kultur, například aby uživatel mohl vybrat jazyk a/nebo zemi/region. Naštěstí nám .NET framework toto usnadňuje také - zde je příklad:

CultureInfo[] specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo ci in specificCultures)
    Console.WriteLine(ci.DisplayName);
Console.WriteLine("Total: " + specificCultures.Length);

Jak můžete vidět z prvního řádku kódu, používám statickou metodu GetCultures třídy CultureInfo k získání seznamu kultur. Vyžaduje parametr CultureTypes, který specifikuje, který druh kultur hledáte. V tomto případě jsem požádal o specifické kultury, které, jak jsme dříve hovořili, jsou kultury vázané jak na jazyk, tak na zemi/region. Mimochodem, je to docela dlouhý seznam - na tomto počítači dostanu celkem 563 dostupných kultur!

Ale možná vás více zajímají neutrální kultury? To by například dávalo perfektní smysl, pokud byste vytvářeli seznam dostupných jazyků, aniž by vás zajímalo, ke které zemi nebo regionu jsou přiřazeny. Udělat to je tak jednoduché, jako změnit parametr CultureTypes:

CultureInfo[] neutralCultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
foreach (CultureInfo ci in neutralCultures)
    Console.WriteLine(ci.DisplayName);
Console.WriteLine("Total: " + neutralCultures.Length);

Tímto způsobem také zjistíte, že neutrálních kultur není tolik jako kultur specifických - na mém počítači/verzi .NET framework je výsledek celkem 280 neutrálních kultur.

Důležité vlastnosti a metody třídy CultureInfo

Jakmile získáte instanci třídy CultureInfo, okamžitě máte přístup k velmi široké škále užitečných vlastností a metod. Tyto členy vám mohou pomoci vyřešit mnoho užitečných věcí týkajících se kultury - pojďme se na některé z nich podívat!

DateTimeFormat

S vlastností DateTimeFormat získáte přístup k informacím o tom, jak by měly být datum a čas formátovány, stejně jako spoustu užitečných informací o kalendáři pro danou kulturu. Pěkným příkladem toho jsou vlastnosti FirstDayOfWeek a CalendarWeekRule - mohou vám říci, který den začíná týden (obvykle neděle nebo pondělí) a jak je rozhodnut první kalendářní týden roku (např. jen první den nebo první celý týden):

CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine("First day of the: " + enUs.DateTimeFormat.FirstDayOfWeek.ToString());
Console.WriteLine("First calendar week starts with: " + enUs.DateTimeFormat.CalendarWeekRule.ToString());

Zkuste změnit instanci CultureInfo na vaši vlastní kulturu nebo na jinou kulturu, kterou znáte, abyste viděli, jak se tyto vlastnosti liší!

Další zajímavou věcí je, že můžete získat informace o názvech měsíců a dnech pro konkrétní kulturu pomocí vlastností jako MonthNames a metod jako GetMonthName(). Zde je rychlý příklad:

CultureInfo enUs = new CultureInfo("en-US");

foreach (string monthName in enUs.DateTimeFormat.MonthNames)
    Console.WriteLine(monthName);
Console.WriteLine("Current month: " + enUs.DateTimeFormat.GetMonthName(DateTime.Now.Month));

A přesně totéž lze dosáhnout pro dny pomocí vlastnosti DayNames a metody GetDayName():

CultureInfo enUs = new CultureInfo("en-US");

foreach (string dayName in enUs.DateTimeFormat.DayNames)
    Console.WriteLine(dayName);
Console.WriteLine("Today is: " + enUs.DateTimeFormat.GetDayName(DateTime.Now.DayOfWeek));

Existuje mnoho dalších užitečných vlastností a metod na vlastnosti DateTimeFormat, například DateSeparator, YearMonthPattern a tak dále. Podívejte se sami - velmi dobře se může stát, že tam najdete řešení vašeho problému souvisejícího s datem/časem: Dokumentace k DateTimeFormatInfo.

NumberFormat

Stejně jako DateTimeFormat obsahuje informace o datech, můžete získat informace o tom, jak konkrétní kultura zachází s čísly z vlastnosti NumberFormat. Tyto informace se používají pokaždé, když požadujete vizuální reprezentaci čísla, například při jeho převodu na řetězec a zápisu na konzolu, ale k informacím si můžete také přístupovat sami, použitím vlastností a metod na vlastnosti NumberFormat - zde je příklad:

CultureInfo enUs = new CultureInfo("en-US");  
Console.WriteLine(enUs.DisplayName + ":");  
Console.WriteLine("NumberGroupSeparator: " + enUs.NumberFormat.NumberGroupSeparator);  
Console.WriteLine("NumberDecimalSeparator: " + enUs.NumberFormat.NumberDecimalSeparator);  

CultureInfo deDe = new CultureInfo("de-DE");  
Console.WriteLine(deDe.DisplayName + ":");  
Console.WriteLine("NumberGroupSeparator: " + deDe.NumberFormat.NumberGroupSeparator);  
Console.WriteLine("NumberDecimalSeparator: " + deDe.NumberFormat.NumberDecimalSeparator);

Používáme vlastnosti NumberGroupSeparator a NumberDecimalSeparator pro získání informací o tom, jak se číslo zobrazuje (např. 1,000.00 nebo 1.000,00) pro anglickou a německou kulturu. Pokud se podíváte, najdete odpovídající vlastnosti i pro měny (CurrencyGroupSeparator a CurrencyDecimalSeparator) stejně jako pro procenta (PercentGroupSeparator a PercentDecimalSeparator).

Pokud jde o měnu, vlastnost NumberFormat vám také může říct, jaký symbol daná kultura používá pro zobrazení měnové částky - jednoduše použijte vlastnost CurrencySymbol.

CultureInfo enUs = new CultureInfo("en-US");
Console.WriteLine(enUs.DisplayName + " - currency symbol: " + enUs.NumberFormat.CurrencySymbol);
CultureInfo deDe = new CultureInfo("de-DE");
Console.WriteLine(deDe.DisplayName + " - currency symbol: " + deDe.NumberFormat.CurrencySymbol);
CultureInfo ruRu = new CultureInfo("ru-RU");
Console.WriteLine(ruRu.DisplayName + " - currency symbol: " + ruRu.NumberFormat.CurrencySymbol);

Všechny tyto vlastnosti je dobré znát, ale ve většině situací se s nimi nebudete muset vypořádat, protože C# bude tuto informaci tiše používat k formátování čísel, procent a měn za vás, pokud specifikujete správný formátovací řetězec, když číslo převádíte na řetězec.

Jména a identifikátory

Nakonec se podívejme na vlastnosti, které reprezentují instanci CultureInfo. Některé z nich jsme již použili, například Name (Název) a DisplayName (Zobrazovaný název), ale jak vlastně fungují? Nejprve je zde seznam dostupných vlastností používaných pro identifikaci CultureInfo:

  • Name (Název) identifikuje CultureInfo ve formátu kód-jazyka-kód-země/regionu, například "en-US" pro angličtinu v USA, "en-GB" pro angličtinu ve Velké Británii a tak dále. Pokud není specifikována země/region, vrátí se pouze první část, například "en" pro angličtinu.
  • TwoLetterISOLanguageName (DvoupísmennýISOJazykovýNázev) udělá v podstatě to samé jako Name, ale vrátí pouze kód jazyka, bez ohledu na to, zda byla specifikována země/region, či nikoliv. Například "en" bude vráceno jak pro "en-US", tak pro "en-GB". Vrácená písmena jsou specifikována ve standardu ISO 639-1.
  • ThreeLetterISOLanguageName (TřípísmennýISOJazykovýNázev) funguje velmi podobně jako TwoLetterISOLanguageName, ale vrací tři písmena místo dvou, jak je specifikováno ve standardu ISO 639-2.
  • EnglishName (AnglickýNázev) vrátí název jazyka (v angličtině). Pokud byla specifikována země/region, bude to přidáno k výsledku, umístěné v závorkách.
  • NativeName (Název v jazyce) vrátí název jazyka (v jazyce specifikovaném instancí CultureInfo). Pokud byla specifikována země/region, bude to přidáno k výsledku, umístěné v závorkách.

Shrnutí

Jak můžete vidět z délky tohoto článku, zabývání se kulturami obecně není jednoduchý úkol. Naštěstí pro nás, to .NET framework s třídou CultureInfo výrazně usnadňuje. Tato třída je tichým pomocníkem po celé vaší aplikaci při formátování čísel a dat, ale je dobré vědět, jak funguje, abyste mohli podle potřeby upravit její chování. Doufejme, že vám tento článek předal většinu toho, co potřebujete vědět o třídě CultureInfo.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!