TOC

This article is currently in the process of being translated into Hungarian (~99% done).

Egy WPF alkalmazás:

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.


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!