WPF バインディングは、CultureInfo.CurrentCulture ではなく CultureInfo.CurrentUICulture を使用します。これは、コントロール パネルの [地域と言語] ダイアログで指定された設定を尊重しないことを意味します。
したがって、WPF アプリケーションでローカリゼーションを適切に実装するには、CurrentCulture をすべてのバインディングの ConverterCulture に何らかの方法で割り当てる必要があります。
これは、App.xaml で宣言された StaticResource を使用して行うのが最適ですが、問題があります。CultureInfo クラスにはパブリック コンストラクターがありません。その結果、このようなマークアップ
<Application x:Class="ScriptedRoutePlayback.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
StartupUri="MainWindow.xaml">
<Application.Resources>
<glob:CultureInfo x:Key="CurrentCulture" />
</Application.Resources>
</Application>
CultureInfo にパブリック コンストラクターがないという事実に関する警告を生成します。それにもかかわらず、マークアップは適切に型指定された静的リソースをデザイナーが使用する名前空間に登録するのに十分です。これにより、{StaticResource CurrentCulture} へのマークアップ参照がアプリの残りの部分で文句を言うのを防ぎます。
実行時にこのマークアップで CultureInfo のインスタンスを作成できなくても、付随するスタートアップ コードによって CultureInfo.CurrentCulture から割り当てられるため、問題にはなりません。
using System.Globalization;
using System.Windows;
namespace ScriptedRoutePlayback
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Resources["CurrentCulture"] = CultureInfo.CurrentCulture;
}
}
}
最後に、質問:
クラスの静的プロパティから取得されたシングルトンなどの既存のオブジェクトを参照する StaticResource をマークアップするための推奨される方法は何ですか?