TOC

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

A WPF application:

Application Culture / UICulture

Dacă ați lucrat puțin cu numere sau date în aplicația dvs. WPF, de ex. din cauza unuia dintre articolele găsite în acest tutorial, este posibil să fi observat ceva interesant: Numerele și datele sunt afișate automat într-un format care se potrivește cu formatul utilizat pe computer. Dacă locuiți într-o țară vorbitoare de limbă engleză, acest lucru probabil că nu pare a fi mare lucru, dar dacă locuiți într-una dintre țările MULTE în care datele și / sau numerele sunt afișate diferit, acest lucru este foarte bun.

Și dacă te gândești "cu siguranță nu pot exista diferențe atât de multe când se formulează chestii simple precum numere și date?", vă sugerez să aruncați o privire la acest exemplu de aplicație , unde am formatat același număr și aceeași dată în conformitate cu modul în care o preferă în SUA, Germania și Suedia:

Așa cum puteți vedea, există multe diferențe subtile în modul în care sunt afișate numerele și datele. Vestea bună este că .NET framework vă poate ajuta foarte mult - de fapt, aceasta se întâmplă deja: în mod prestabilit, datele și numerele sunt formatate în conformitate cu setările de sistem ale computerului în care se execută aplicația. Vestea proastă este că acest comportament ar putea să nu fie întotdeauna ceea ce vrei. Dar nu vă faceți griji - puteți schimba cu ușurință acest lucru. Totul se referă la utilizarea clasei CultureInfo, pe care o puteți citi mult mai mult în C# Tutorial article on CultureInfo. Pentru moment, să discutăm despre modul de aplicare a acestor tehnici în aplicația WPF.

Formatare ad-hoc

Dacă trebuie doar să aplicați formatarea pentru o anumită informație, de ex. conținutul unui singur control de etichetă, puteți să faceți acest lucru cu ușurință, folosind o combinație a metodei ToString() și a clasei CultureInfo. De exemplu, în exemplul de mai sus, am aplicat un format diferit, bazat pe cultură, astfel:

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

Acest lucru ar putea fi suficient pentru unele cazuri, unde aveți nevoie doar de formatare specială în câteva locuri, dar, în general, ar trebui să decideți dacă aplicația dvs. ar trebui să utilizeze setările de sistem (implicit) sau dacă ar trebui să înlocuiți acest comportament cu o anumită setare a culturii pentru întreaga aplicație.

CurrentCulture & CurrentUICulture

Aplicarea unei alte culturi la aplicația WPF este destul de ușoară. Probabil că veți avea de-a face cu două atribute găsite pe proprietatea CurrentThread a clasei Thread : CurrentCulture și CurrentUICulture . Dar care este diferența?

The CurrentCulture property is the one that controls how numbers and dates etc. are formatted. The default value comes from the operating system of the computer executing the application and can be changed independently of the language used by their operating system. It is, for instance, very common for a person living in Germany to install Windows with English as their interface language, while still preferring German-notation for numbers and dates. For a situation like this, the CurrentCulture property would default to German.

Proprietatea CurrentUICulture specifică limba pe care ar trebui să o utilizeze interfața. Acest lucru este relevant numai dacă aplicația dvs. acceptă mai multe limbi, de ex. prin utilizarea de fișiere de resurse lingvistice. Încă o dată, acest lucru vă permite să utilizați o cultură pentru limba (de exemplu, engleza), în timp ce utilizați o altă (de exemplu limba germană) atunci când vă ocupați cu introducerea / afișarea de numere, date etc.

Schimbarea Culturii aplicației

Având în vedere acest lucru, acum trebuie să decideți dacă să schimbați CurrentCulture și / sau CurrentUICulture. Se poate face ori de câte ori doriți, dar este foarte util să faceți acest lucru atunci când începeți aplicația dvs. În caz contrar, o anumită ieșire ar putea fi deja generată cu cultura implicită, înainte de comutare. Iată un exemplu în care schimbăm cultura, precum și UICcultura, în evenimentul Application_Startup (), care poate fi folosit în fișierul App.xaml.cs al aplicației WPF:

private void Application_Startup(object sender, StartupEventArgs e)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}

Deoarece folosim clasa Thread și CultureInfo, nu uitați să adăugați spațiile de nume necesare în fișierul dvs., dacă acestea nu sunt deja prezente:

using System.Threading;
using System.Globalization;

Cu aceasta, numerele și datele vor fi acum formatate în funcție de modul în care o preferă în limba germană ( de-DE ). După cum s-a menționat, puteți renunța la linia care definește cultura pentru cultura UICulture (ultima linie) dacă aplicația dvs. nu acceptă mai multe limbi.

Schimbarea culturii în timpul evenimentului Application_Startup sau, cel mai târziu, în constructorul ferestrei principale, este cel mai logic lucru de făcut, deoarece valorile deja generate nu se actualizează automat când schimbați CurrentCulture proprietate. Asta nu înseamnă că nu puteți să o faceți, așa cum este ilustrat în următorul exemplu, care servește și ca demonstrație fină a modului în care producția este afectată de proprietatea CurrentCulture :

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

Partea interesantă se găsește în evenimentul CultureInfoSwitchButton_Click, unde am setat CurrentCulture în funcție de butoanele pe care s-au făcut clic, apoi actualizăm cele două etichete care conțin un număr și o dată:

Culture & Threads: The DefaultThreadCurrentCulture property

Dacă aplicația dvs. utilizează mai multe fire de execuție (thread-uri), trebuie să luați în considerare utilizarea proprietății DefaultThreadCurrentCulture . Acesta poate fi găsit în clasa CultureInfo (introdusă în .NET framework 4.5) și se va asigura că nu numai firul curent, dar și firele viitoare vor folosi aceeași cultură. O puteți utiliza astfel, de ex. în evenimentul Application_Startup :

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

Deci, va trebui să setați proprietățile CurrentCulture și DefaultThreadCurrentCulture ? De fapt, nu - dacă nu ați modificat deja proprietatea CurrentCulture, setarea proprietății DefaultThreadCurrentCulture va fi aplicată și proprietății CurrentCulture. Cu alte cuvinte, este logic să utilizați DefaultThreadCurrentCulture în loc de CurrentCulture dacă intenționați să utilizați mai multe fire în aplicația dvs. - va rezolva toate scenariile.

Sumar

Este foarte important să te ocupi de cultura aplicației tale WPF, dar, din fericire pentru tine, WPF va face o mulțime de lucruri pentru tine complet în mod implicit. Dacă trebuie să schimbați comportamentul implicit, este destul de ușor, utilizând proprietățile CurrentCulture și CurrentUICulture , așa cum se arată în numeroasele exemple din acest articol.

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!