This article has been localized into Japanese by the community.
アプリケーションカルチャーーとUIカルチャー
もしWPFアプリケーションで、例えばこのチュートリアルの記事に出てくるような数値や日時を扱ったことが有るなら、ちょっとすごい事に気付くでしょう。数値や日時はあなたのコンピュータで使われているフォーマットに自動的に変換され表示されます。あなたが英語圏に住んでいるなら大した事ではないでしょうが、日時や数値が違った形式で表示される多くの地域に住んでいる人には、本当にすごいことです。
もしあなたが「数値や日時などの単純なものをフォーマットするのにそんなに多くの違いが本当にあるのか?」と考えるなら、この単純なサンプルを見ることを提案します。このサンプルはいくつかの数値と日時をアメリカ、ドイツ、スウェーデンの形式でフォーマットしたものです。
数値と日時の表示形式に多くの微妙な違いが有ることがわかります。これに関して.NETフレームワークは多くの点であなたを助けてくれますー実際、それは既に行われています。デフォルトで数値と日時はアプリケーションの実行されるコンピュータのシステム設定に従ってフォーマットされます。ただ、いつも意図したとおりに変換されるとは限りません。しかし、心配するには及びません。簡単に変更できます。これらは全てCultureInfoクラスに関連していてC# Tutorial article on CultureInfoで更に詳しく知ることが出来ます。今のところはこれらのテクニックを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アプリケーションに他のカルチャを適用するのは極めて簡単です。アプリケーションでは潜在的にThreadクラスのCurrentThreadプロパティにある二つの属性を扱っています。CurrentCultureとCurrentUICultureです。この二つの違いは何でしょう?
CurrentCultureプロパティは数値や日時などをどのようにフォーマットするかをコントロールします。デフォルト値はアプリケーションを実行しているコンピュータのシステムで決まり、オペレーティングシステムで使われている言語とは独立して変更できます。例えば、ドイツに住んでいる人がインターフェース言語として英語を使ったWindowsをインストールすることは非常に一般的ですが、ドイツ形式の数値と日時の表記を好みます。このような状況ではCurrentCultureプロパティのデフォルトはドイツ語になります。
CurrentUICultureプロパティはインターフェースに使うべき言語を指定します。これはアプリケーションが言語リソースファイルを使うなどして、複数の言語に対応する場合だけ関係します。繰り返しますが、言語(例えば英語)に対して数値や日時などを入出力する時に別のカルチャ(例えばドイツ語)を使うことを可能にします。
アプリケーションカルチャの変更
以上を踏まえて、CurrentCultureとCurrentUICultureを変更するかどうかを決める必要があります。いつでも好きなときに決めてもいいですが、アプリケーションのスタート時に決めるのが最も適切です。さもないと、切り替わる前にデフォルトカルチャで何らかの出力が生成されれてしまうかもしれません。ここにWPFアプリケーションのApp.xaml.csファイルで使えるApplication_Startup()イベントでCultureとUICultureを切り替えるサンプルを示します。
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
CultureInfoと同様にThreadクラスを使うので、まだ加えていないのなら必要なnamespaceを書き加えるのを忘れないで下さい。
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();
}
}
}
興味深い部分は、クリックされたボタンで決まるCurrentCultureをセットしているCultureInfoSwitchButton_Clickイベントです。ここで数値と日時を表示しているラベルを更新しています。
カルチャ & スレッド: DefaultThreadCurrentCultureプロパティ
アプリケーションが二つ以上のスレッドを使っている場合はDefaultThreadCurrentCultureプロパティの使用を考えるべきです。これはCultureInfoクラス(.NET framework version 4.5で導入)にあり、これは現在のスレッドだけではなく他のスレッドも同じカルチャを使うようにします。Application_Startupイベントで次のように使うことが出来ます。
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
それなら、CurrentCultureとDefaultThreadCurrentCultureを両方設定しないといけないでしょうか?実質的には不要です。まだCurrentCultureを変更していないならDefaultThreadCurrentCultureプロパティはCurrentCultureプロパティにも適用されます。言い換えると、マルチスレッドアプリケーションを計画しているのならCurrentCultureの代わりにDefaultThreadCurrentCultureを使うのが適切です。これはすべての場合に対応します。
まとめ
WPFアプリケーションにおけるカルチャの処置は大変重要ですが、幸運なことにWPFはこれらの処理に多くの機能を提供します。もしデフォルトの動作を変えたいなら、この記事の中のたくさんの例で説明したようにCurrentCultureとCurrentUICultureプロパティを使って大変簡単に行えます。