This article has been localized into Ukrainian by the community.
Культура застосунку/UICulture
Якщо ви трохи попрацювали з номерами або датами у своїй програмі WPF, напр. через одну зі статей, знайдених у цьому посібнику, ви могли помітити щось круте: цифри та дати автоматично відображаються у форматі, який відповідає формату, який використовується на вашому комп’ютері. Якщо ви живете в англомовній країні, це, мабуть, не здається великою справою, але якщо ви живете в одній з БАГАТЬОХ країн, де дати та/або цифри відображаються по-різному, це справді круто.
Якщо ви думаєте "мабуть немає значних відмінностей в форматі таких простих речей, як номери чи дати", я рекомендую вам подивитись на цю просту програму, де я тричі розмістив одне число та дату в залежності від того, як їх прийнято використовувати в США, Німеччині та Швеції
Як ви бачете, є чимало відмінностй у тому як відображаються дати та числа. На щастя .Net framework може дуже сильно допомогти - хоча, насправді, він і так робить це. За умовчуванням дати та числа форматуються згідно із налаштуваннями операційної системи під час виконання вашого рішення. Однак така поведінка - це не завжди те, що вам потрібно. Але не хвилюйтесь: ви легко може її змінити. Вона залежить від класу CultureInfo, про який можна детальніше почитати в цій статті WPF Tutorial. А тепер давайте обговоримо як застосувати ці техніки в вашому wpf рішенні.
Вибіркове форматування
Якщо вам потрібно відформатувати лише певну частину інформації, наприклад: вміст одного елемента керування Label, ви можете з легкістю зробити це на ходу, використовуючи комбінацію методу ToString() та класу CultureInfo. Наприклад: у зразку вище я використав різні формати на основі культури.
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);
Цього може вистачити в деяких випадках, де вам потрібне лише специфічне форматування в кількох місцях, але загалом, вам слід визначити: вашому застосунку слід застосовувати налаштування системи (за умовчуванням) чи доцільно перевантажити цю поведінку, використовуючи специфічне налаштування культури для всього застосунку
Поточна культура & поточна культура інтерфейсу/CurrentCulture & CurrentUICulture
Застосування іншої культури до вашого WPF застосунку досить просте. Вам потенційно доведеться зіткнутися з двома атрибутами властивості CurrentThread класів Thread, CurrentCulture та CurrentUICulture. Однак в чому різниця між ними?
Властивість CurrentCulture керує тим, як форматуються числа, дати тощо. Значення за умовчуванням залежить від операційної системи комп'ютера, на якому виконуюється застосунок. Вони можуть бути змінені незалежно від мови операційної системи. Наприклад для жителів НІмеччини дуже поширеним є використання Windows з англійською мовою інтерфейсу. При цьому вони всеодно надають перевагу німецькій нотації для чисел та дат. В таких випадків властивість CurrentCulture за умовчуванням буде німецькою.
Властивість CurrentUICulture визначає мову, яку повинен використовувати інтерфейс. Це властиво лише, якщо застосунок підтримує багатомовність, зокрема через застосування файлу з мовними ресурсами. Інакше кажучи, це дозволяє використовувати одну культуру для мови (наприклад англійської) та іншу (наприклад німецьку), коли стикаєшся з вводом/виводом чисел, дат тощо.
Зміна культури застосунку
Маючи це на увазі, вам слід визначити, що змінювати: CurrentCulture та/або CurrentUICulture. Це можна зробити будь-коли, однак накраще - під час запуску застосунку, інакше частина елементів виводу уже буде згенерована з культурою за умовчуванням. Нижче знаходиться зразок, в якому ми змінюємо культуру, зокрема UICulture, в події Application_Startup(), якв може використовуватися у файлі App.xaml.cs вашого WPF застосунку:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Оскільки ми використовуємо клас Thread, так само як і клас CultureInfo, не забудьте додати необхідний простір імен до вашого файлу, якщо вони ще не підключені
using System.Threading;
using System.Globalization;
Маючи це на місці, можна форматувати числа та дати, згідно із вподобаннями у німецькій (de-DE). Як уже згадано, ви можете опустити рядок, що визначає культуру для властивості UICulture (останній рядок), якщо ваша програма не підтримує багатомовність.
Найефективніше змінювати культуру протягом події Application_Startup, чи найпізніше в конструкторі вашого головного вікна, оскільки уже згенеровані значення не оновлюються автоматично при зміні властивості CurrentCulture. Це не означає, що ви не можете зробити це, як показано в наступному прикладі, який є також чудовою демонстрацією того, як властивість 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();
}
}
}
Ця частина базується на події CultureInfoSwitchButton_Click, у якій ми задаємо CurrentCulture в залежності від натиснутої кнопки і після цього оновлюємо вміст двох написів, що містять число та дату
Culture & Threads: Властивість DefaultThreadCurrentCulture
Якщо ваш додаток використовує більше аніж один потік, тоді ви повинні звернути увагу на властивість DefaultThreadCurrentCulture. Ви можете знайти її в класі CultureInfo (представлений в .NET framework версії 4.5) - ця властивість забезпечить використання одної і тої самої культури не тільки в поточному треді (потоці), але також у всіх майбутніх потоках. Цю властивість можна використати наступним чином, наприклад, в події Application_Startup:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Отже, вам доведеться встановлювати властивості CurrentCulture ТА DefaultThreadCurrentCulture?Насправді, ні - якщо ви ще не змінювали властивість CurrentCulture, налаштування властивості DefaultThreadCurrentCulture також буде застосовано до властивості CurrentCulture. Іншими словами, це має сенс використовувати DefaultThreadCurrentCulture замість CurrentCulture якщо ви плануєте використовувати кілька потоків у вашій програмі - це подбає про всі сценарії.
Підсумок
Робота з культурою вашої програми WPF дуже важлива, але, на щастя, WPF зробить багато для вас абсолютно нестандартно. Якщо вам потрібно змінити стандартну поведінку, це дуже просто, за допомогою властивостей CurrentCulture і CurrentUICulture, як показано в багатьох прикладах цієї статті.