TOC

This article has been localized into Dutch by the community.

Werken met Cultuur & Regio's:

De CultureInfo class

In de vorige reeks artikelen hebben we gesproken over hoe nuttig de CultureInfo class is als je de volledige controle moet hebben over hoe getallen en datums in jouw applicatie worden weergegeven. We hebben ook gesproken over hoe je kunt verifiëren en wijzigen welke cultuur jouw applicatie moet gebruiken als 'terugval' cultuur. Dit allemaal gezegd hebbende, is het nu tijd om dieper in te gaan op de CultureInfo class om te zien hoe we er het volle profijt van kunnen hebben.

Nog even snel iets in herinnering brengen voordat we beginnen: De CultureInfo class is een onderdeel van de System.Globalization benamingsruimte (namespace), dus wees er zeker van om dat te importeren (using) wanneer je de voorbeelden gaat proberen:

using System.Globalization;

Neutrale en specifieke culturen

In de voorgaande voorbeelden in dit hoofdstuk hebben we alleen maar specifieke culturen gebruikt, waarmee we bedoelen, een cultuur die zowel een taal als een land specificeert. Een voorbeeld hiervan is de en-US cultuur, die duidelijk aangeeft dat de gewenste taal Engels moet zijn en het land de VS. Een alternatief hierop is de en-GB cultuur, die eveneens dezelfde taal heeft, maar met als land Groot Brittannië.

Soms zijn deze verschillen belangrijk voor jou, in welk geval je deze regio-specifieke versies van de CultureInfo class moet gebruiken. Anderzijds zijn er situaties waarbij Engels slechts een taal is en je deze taal niet wilt verbinden aan een specifiek land. Om hieraan tegemoet te komen, definieert het .NET framework zogenaamde neutrale culturen, die alleen maar een taal specificeren. In feite 'erven'(inherit) zowel en-US en en-GB van zo'n neutrale cultuur (wat logisch is omdat ze dezelfde taal hebben!) en je kunt die inschakelen via de Parent property. Laat ik het illustreren met een voorbeeld:

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);

Niet een ontzettend nuttig voorbeeld, maar het geeft wel een beter idee van de interne structuur van de CultureInfo class. De output wordt aldus:

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

De juiste CultureInfo krijgen

Uit onze vorige voorbeelden kon je zien dat we de gewenste CultureInfo class kunnen ophalen door de taal-land identifier toe te voegen aan de constructor van de class. Maar als je naar een neutrale cultuur op zoek bent, is het voldoende om slechts een taal identifier toe te voegen:

CultureInfo en = new CultureInfo("en");

Het .NET framework zal dan een Engels, regio-neutraal CultureInfo exemplaar retourneren. Voor een complete lijst van mogelijke taal en/of taal-land.regio identifiers wijs ik je op de MSDN documentatie.

Een ander manier om een specifieke cultuur te identificeren is met de zogenaamde LCID (LoCaleID). Die is te vinden als een property van bestaande CultureInfo exemplaren, Maar als je de ID kent, kun je die ook gebruiken om een CultureInfo object te maken. Bv. de LCID voor Nederland is 1043:

CultureInfo enUs = new CultureInfo(1033);

In de meeste situaties echter is het veel gemakkelijker om de eerder gedemonstreerde taal-land/regio specifier te gebruiken.

Een lijst van beschikbare Culturen krijgen

We kunnen nu een specifieke cultuur krijgen en die voor allerlei doeleinden gebruiken, maar misschien heb je een lijst van de beschikbare culturen nodig, omdat je bv. de gebruiker zelf een taal en/of land/regio wilt laten kiezen. Ook hier voorziet het .NET framework in om het ons gemakkelijk te maken. Een voorbeeld:

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

Aan de eerste regel met code kun je zien dat ik de GetCultures static method gebruik bij de CultureInfo class om een lijst van culturen te krijgen. Daarvoor is nodig de CultureTypes parameter, die specificeert naar welke culturen je op zoek bent. In dit geval heb ik gevraagd naar de specifieke culturen die, zoals eerder besproken, de culturen zijn die zowel aan een taal en een land/regio verbonden zijn. Dat is echt een behoorlijk lange lijst. Op mijn computer hier krijg ik een lijst van totaal 563 beschikbare culturen!

Maar misschien ben je meer geïnteresseerd in de neutrale culturen? Dat zou absoluut logisch zijn wanneer je een lijst zou maken van beschikbare talen, maar je tegelijk geen belangstelling zou hebben aan welk land of regio ze gebonden zouden zijn. Hiervoor hoef je alleen maar de CultureTypes parameter te veranderen:

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

Door dit te doen, zie je ook dat er lang niet zoveel neutrale culturen zijn in vergelijking met specifieke culturen. Op mijn computer/.Net framework is het resultaat een totaal van 280 neutrale culturen.

Belangrijke properties & methods van CultureInfo

Wanneer je eenmaal een exemplaar hebt van de CultureInfo class, krijg je onmiddellijk toegang tot een hele reeks bruikbare properties en methods. Deze 'members' kunnen je helpen bij het doen van nuttige dingen met betrekking tot cultuur. Laten we eens naar een paar van die dingen kijken!

DateTimeFormat

Met de DateTimeFormat property krijg je toegang tot informatie over hoe datums en tijd geformat moeten worden, evenals een boel nuttige informatie over de kalender van een gegeven cultuur. Een aardig voorbeeld hiervan zijn de FirstDayOfWeek and CalendarWeekRule properties. Die kunnen je zeggen op welke dag de week begint (meestal zondag of maandag) en hoe de eerste kalenderweek van het jaar wordt weergegeven (bv. alleen maar de eerste dag van de eerste volle week):

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());

Probeer het CultureInfo exemplaar te veranderen naar je eigen cultuur of naar een andere culktuur die je kent. Dan zie je hoe deze properties variëren!

Een ander mooi ding is dat je informatie kan krijgen over de namen van de maanden en de dagen van die specifieke cultuur door gebruik te maken van properties als MonthNames and methods like GetMonthName(). Hier is een vlug voorbeeld:

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));

En precies hetzelfde kan gedaan worden voor dagen, door gebruik van de DayNames property en de GetDayName() method:

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));

Er zijn veel meer nuttige properties en methods bij de DateTimeFormat property, bv. DateSeparator, YearMonthPattern enzovoorts. Kijk zelf maar eens; misschien is hier wel een oplossing verborgen voor jouw datum/tijd probleem: DateTimeFormatInfo documentation.

Formatten van getallen

Precies zoals DateTimeFormat informatie heeft over datums, zo kun je ook informatie krijgen over hoe een specifieke cultuur omgaat met getallen via de NumberFormat property. Deze informatie wordt elke keer gebruikt als je naar een visuele representatie vraagt van een getal, bv. als je dat converteert naar een string en het naar de console schrijft. Maar je kunt ook zelf toegang krijgen tot de informatie door gebruik te maken van de properties en methods van de NumberFormat property. Hier is een voorbeeld:

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);

We gebruiken de NumberGroupSeparator en de NumberDecimalSeparator properties om informatie te krijgen over hoe een getal wordt getoond (bv. 1,000.00 of 1.000,00) voor de Engelse en Nederlandse culturen. Als je even kijkt, vind je ook overeenkomstige properties voor valuta (CurrencyGroupSeparator en CurrencyDecimalSeparator) en voor percentages (PercentGroupSeparator and PercentDecimalSeparator).

Over valuta gesproken, de NumberFormat property kan ook aangeven welk symbool een bepaalde cultuur gebruikt om een monetaire hoeveelheid weer te geven. Gebruik daarvoor simpelweg de CurrencySymbol property:

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);

Het is leuk om al deze properties te kennen, , maar in de meeste gevallen hoef je er niets aan te doen omdat C# in stilte de informatie om getallen, percentages en valuta te formatten voor jou gebruikt, zolang als jij maar de juiste format string specificeert wanneer je het getal naar een string converteert.

Namen & identifiers

Laten we tot slot kijken naar de properties die het CultureInfo exemplaar representeert. We hebben er al een paar van gebruikt, bv. Name en DisplayName, maar hoe werken die nu eigenlijk? Om te beginnen, hier is een lijst van beschikbare properties die gebruikt worden om een CultureInfo exemplaar te identificeren:

  • Name identificeert een CultureInfo in de taalcode-landcode-format, bv. "en-US" voor Engels in de VS, en "nl-NL" in nederland enzovoorts. Als er geen land/regio wordt gespecificeerd, wordt alleen het eerste deel geretourneerd, bv. "en" voor Engels of "nl" voor Nederlands.
  • TwoLetterISOLanguageName doet vrijwel hetzelfde als Name, maar retourneert alleen de taalcode, ongeacht of een land/regio is gespecificeerd of niet. Bijvoorbeeld, "en" wordt zowel voor "en-US" en "en-GB" geretourneerd. (Net zo wordt "nl" geretourneerd voor zowel "nl-NL"en "nl-BE") . De geretourneerde letters worden gespecificeerd in de ISO 639-1 standard.
  • ThreeLetterISOLanguageName werkt vrijwel hetzelfde als TwoLetterISOLanguageName, maar retourneert drie letters in plaats van twee, zoals gespecificeerd in de ISO 639-2 standard.
  • EnglishName retourneert de naam van de taal (in het Engels). Als een land/regio is gespecificeerd wordt dit tussen haakjes () toegevoegd aan het resultaat.
  • NativeName retourneert de naam van de taal (in de taal die is gespecificeerd in het CultureInfo exemplaar). Als een land/regio is gespecificeerd wordt dit tussen haakjes () toegevoegd aan het resultaat.

Samenvatting

Zoals je aan de lengte van dit artikel kunt zien, is het omgaan met cultuur geen geringe kwestie. Gelukkig voor ons maakt het .NET framework het veel gemakkelijker met de CultureInfo class. Deze wordt stilzwijgend in jouw applicatie gebruikt bij het formatten van datums en getallen. Het is echter goed om te weten hoe het werkt zodat je zo nodig het gedrag kunt veranderen. Ik hoop dat dit artikel je het meeste geleerd heeft van wat er te weten valt over de CultureInfo class.

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!