Przygotowania do 70-536 idą sobie idą. Miałem ostatni mały sparing z CultureInfo, zatem trzeba się podzielić wiedzą, którą wyniosłem z tej krótkiej walki.
CultureInfo zawiera wszystkie informacje, których będziemy potrzebować, żeby aplikacja była poprawnie językowa (oczywiście trzeba znać jeszcze język obcy). Zaczynając od tego po której stronie kartki zaczynamy pisać, poprzez znak oddzielający ułamek od części całkowitej, powoli sunąc przez nazwę kalendarza, który jest używany i wreszcie kończąc na znaku, którym oznacza się nieskończoność. To tylko część z informacji, które posiada ta klasa.
Z CultureInfo można skorzystać poprzez podanie go jako parametr IFormatProvider (ToString, string.Format, StringBuilder.AppendFormat) lub poprzez ustawienie go w aktualnym wątku jako aktualną kulturę metodą Thread.CurrentThread.CurrentUICulture = myNewCultureInfo;
Kawałek kodu, dzięki któremu można się bliżej poznać z kulturami z całego świata. Wszystko dzięki wbudowanemu wsparciu dla multi-kuli w windows.
- private void Form1_Load(object sender, EventArgs e)
- {
- foreach (var ci in CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures))
- {
- this._avaiableCultures.Items.Add(ci.Name + “, “+ci.EnglishName+”( “+ci.NativeName+” )”);
- }
- this._avaiableCultures.SelectedIndex = 0;
- }
- private void _avaiableCultures_SelectedIndexChanged(object sender, EventArgs e)
- {
- string culture = this._avaiableCultures.SelectedItem.ToString().Substring(0,
- this._avaiableCultures.
- SelectedItem.ToString().
- IndexOf(“,”));
- StringBuilder sb = new StringBuilder();
- CultureInfo ci = new CultureInfo(culture);
- sb.AppendLine(“CALENDAR:”);
- sb.AppendLine(ci.DateTimeFormat.NativeCalendarName);
- sb.AppendLine(“DAYS:”);
- foreach (var dayName in ci.DateTimeFormat.DayNames)
- {
- sb.AppendLine(dayName);
- }
- sb.AppendLine(“MONTHS:”);
- foreach (var monthName in ci.DateTimeFormat.MonthNames)
- {
- sb.AppendLine(monthName);
- }
- sb.AppendFormat(“NUMBERS:nFractions go after: {0}n”, ci.NumberFormat.CurrencyDecimalSeparator);
- sb.AppendFormat(“Currency symbol: {0}n”, ci.NumberFormat.CurrencySymbol);
- sb.AppendFormat(“Infinite symbol: {0}n”, ci.NumberFormat.PositiveInfinitySymbol);
- this._localizedInfo.Text = sb.ToString();
- //CultureInfo myNewCultureInfo = new CultureInfo(culture);
- //Thread.CurrentThread.CurrentUICulture = myNewCultureInfo;
- this._moneyValue.Text = string.Format(ci, “{0:C}”, 12345.67);
- this._currentTime.Text = DateTime.Now.ToString(ci);
- if( ci.TextInfo.IsRightToLeft )
- {
- this._currentTime.RightToLeft = RightToLeft.Yes;
- this._avaiableCultures.RightToLeft = RightToLeft.Yes;
- this._currentTime.RightToLeft = RightToLeft.Yes;
- this._localizedInfo.RightToLeft = RightToLeft.Yes;
- this._moneyValue.RightToLeft= RightToLeft.Yes;
- }
- else
- {
- this._currentTime.RightToLeft = RightToLeft.No;
- this._avaiableCultures.RightToLeft = RightToLeft.No;
- this._currentTime.RightToLeft = RightToLeft.No;
- this._localizedInfo.RightToLeft = RightToLeft.No;
- this._moneyValue.RightToLeft = RightToLeft.No;
- }
- }
Komentarz:
@01 – Na załadowanie formy, odczytuje wszystkie wspierane kultury. Następnie wrzucam informacje o nich do combobox.
@12 – Po wybrania innej kultury, sprawdzam jej skróconą nazwę.
@18 – Tworzę nową oraz wypisuje na jej podstawie nazwę kalendarza (@20), wszystki dni(@21), wszystkie miesiące(@26). Na koniec podstawowe jednostki płatnicze(@32). Przed wyjściem sprawdzam, czy w danej kulturze pisze się od lewej czy od prawej (@43) i aktualizuje kontrolki.
A tak wygląda aplikacja w działaniu: