This article is currently in the process of being translated into Hungarian (~99% done).
Application Culture / UICulture
Ha már dolgoztál egy kicsit számokkal és dátumokkal egy WPF alkalmazásban ( például egy cikkben itt ebben a tutorialban ), talán észrevettél valami nagyszerű dolgot: A számok és dátumok automatikusan abban a formátumban jelennek meg amit a lokális számítógéped is használ. Amennyiben egy olyan helyen tartózkodsz ahol az főleg Angolt használnak ez nem tűnik nagy dolognak, de ha nem ( mint a világ nagyobb részén ) ahol a dátumokat és / vagy számokat másképp szokás megjeleníteni, akkor nagyon is remek.
Ha pedig azt gondolod, hogy "biztos nem lehet nagy különbség olyan egyszerű dolgok formázásában, mint a számok és dátumok?" akkor javaslom tegyél egy pillantást erre a minta alkalmazásra, amellyel az Amerikai, Német és Svéd szabályoknak megfelelően formázva jelennek meg a számok és a dátumok:
Amint látható, több finom különbség is van abban, hogy jelennek meg a számok és a dátumok. Ami viszont jó hír, hogy a .NET keretrendszer a segítségünkre lesz - sőt alapvetően már volt is: alapértelmezetten már most is úgy formázta amely megfelel a lokális számítógép beállításainak ahol az alkalmazást futtatjuk. A rossz hír az, hogy ez a működés nem feltétlen minden esetben felel meg. De semmi probléma - könnyedén tudunk ezen változtatni. Az egész a CultureInfo osztály használatán múlik, amiről továbbiakat itt olvashatunk: C# Tutorial article on CultureInfo. Most csak arról pár szóban, hogyan használjuk ezt a technikát a WPF alkalmazásunkban.
'Ad-hoc' formázás
Ha csak adott információ formázására van szükségünk, mit például egy 'Label' vezérlő tartalma, akkor ezt 'on-the-fly' ( futás időben ) is megoldhatjuk. A Kulcs a ToString() metódus és a CultureInfo osztály. Példaképp nézzük meg a fenti minta-program megvalósításának fő részét:
double largeNumber = 123456789.42;
CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");
lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);
Ez elegendő lehet bizonyos speciális esetekben, de általában jobb ha a rendszer beállításokat vesszük alapul ( alapértelmezett ) vagy felülírjuk ezt a viselkedést egy általunk megadottal ami az egész alkalmazást érinti.
CurrentCulture és CurrentUICulture
Egy másik kulturális környezet beállítása WPF-ben igen egyszerű. Potenciálisan két attribútumra lesz szükségünk amit a Thread osztály CurrentThread tulajdonsága ad meg: CurrentCulture és CurrentUICulture. De mi is a különbség köztük?
A CurrentCulture tulajdonság határozza meg, miképp formázódjanak a számok és a dátumok . Az alapértelmezett érték az alkalmazást futtató operációs rendszertől származik és az alkalmazott lokalizációtól / nyelvtől függetlenül megváltoztatható. Például ez jellemző olyan személyek esetén akik Németországban élnek, és Angol nyelvű Windows-t használnak, de szeretnék megtartani a Német formázási szabályokat. Ebben az esetben a 'CurrentCulture' tulajdonság értékét Németre érdemes állítani.
A CurrentUICulture tulajdonság határozza meg a nyelvet amit a felület fog használni. De ez csak akkor releváns ha az alkalmazás több nyelvet is támogat, például nyelvi erőforrás ( resource ) fájlok segítségével. Ismételve: ez lehetővé teszi egy nyelvi beállítás használatát ( például Angol ) miközben a számok és dátumok más kulturális beállításokat használnak ( például Német ).
Alkalmazás kulturális beállításának megváltoztatása
Mindezek szem előtt tartásával, el kell döntenünk, hogy mikor változtatjuk meg a 'CurrentCulture' és / vagy 'CurrentUICulture'-t. Ezt bármikor megtehetjük, de a legbiztonságosabb az alkalmazás indulásakor, különben kockáztatjuk, hogy egyes szövegek megjelenítése még az előtt történik, hogy átváltottunk volna. Itt pedig egy példa, amiben megváltoztatjuk a kulturális beállításokat az 'Application_Startup()' esemény metódusában ami az App.xaml.cs fájlban található.
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Mivel használjuk a 'Thread' osztályt, továbbá a 'CultureInfo'-t ezért ne feledkezzünk el hozzáadni a szükséges névtereket az forráshoz, ha még nem tettük volna:
using System.Threading;
using System.Globalization;
Amennyiben ez rendben, a számok és dátumok a Német (de-DE) formázási szabályoknak megfelelően jelennek meg. Ahogy említettük, el lehet hagyni az utolsó sort ahol az 'UICulture'-t beállítjuk, ha az alkalmazás nem támogat több nyelvet.
Érdemes a kulturális beállítások módosítását az Application_Startup esemény kezelőjében vagy legkésőbb a fő ablak konstruktorában megtenni, mert a legenerált értékek nem lesznek automatikusan frissítve ha megváltoztatjuk a CurrentCulture tulajdonságot. Ez nem jelenti azt, hogy nem tehetjük meg, éppen ezért a következő példa jól demonstrálja, hogyan változik a szöveges kimenet amit érint a CurrentCulture változása.
<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
<StackPanel Margin="20">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label>Number:</Label>
<Label Name="lblNumber" Grid.Column="1" />
<Label Grid.Row="1">Date:</Label>
<Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
<Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
<Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
<Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ApplicationCultureSwitchSample : Window
{
public ApplicationCultureSwitchSample()
{
InitializeComponent();
}
private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());
lblNumber.Content = (123456789.42d).ToString("N2");
lblDate.Content = DateTime.Now.ToString();
}
}
}
A lényeges rész a 'CultureInfoSwitchButton_Click' esemény kezelőben található, ahol beállítjuk a 'CurrentCulture'-t az alapján, hogy melyik gombot nyomtuk meg és frissítjük a két szöveget ahol a szám és a dátum található:
'Culture' és 'Threads': A 'DefaultThreadCurrentCulture' tulajdonság
Amennyiben az alkalmazásod több szálat használ, szükséged lesz a DefaultThreadCurrentCulture tulajdonságra. Ez a 'CultureInfo' osztályban található ( amit a .NET keretrendszer 4.5-ös verziójában vezettek be ) és biztosítja, hogy ne csak a jelenlegi, de a jövőbeni szálak is ugyanazt a kulturális beállítást használják. Ezt is használhatjuk, például az Application_Startup esemény kezelőjében.
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Felmerül a kérdés, hogy most akkor a CurrentCulture és a DefaultThreadCurrentCulture tulajdonságokat is be kell egyenként állítani? Nos, nem - ugyanis ha nem állítottuk be a 'CurrentCulture' tulajdonságot, akkor a 'DefaultThreadCurrentCulture' beállítja nekünk azt it. Más szavakkal: elég használnunk a 'DefaultThreadCurrentCulture'-t amennyiben több szálat tervezünk indítani, az minden esetben megfelelően fog működni.
Összegzés
A kulturális beállítások kezelése a WPF alkalmazásban igen fontos, de szerencsére jelentősen megkönnyíti a WPF az életünket. Amennyiben az alapértelmezett viselkedésen szeretnénk módosítani az is roppant egyszerű, csak használjuk a CurrentCulture és CurrentUICulture tulajdonságokat, amit számos példában bemutattunk.