原文
WPF Localization Guidance 「Rick StrahlとMichele Leroux Bustamante(2009年6月)」の和訳です。地域設定の実装の参考にしてください。
関連ファイル
その場で言語を変更する Switching Languages on the Fly
あなたのアプリケーションが、複数の言語で実行することを必要とする場合、どちらにしても、あなたは、言語の切り替えができるようにする必要があります。 そして、この処理は、きわめて単純か、かなり複雑な処理であることができます。理想的には、 あなたが、起動時に、ユーザーのカルチャ選択によって、アプリケーションが受け取る現在のカルチャ内で、 すべての書式とスタートアップメッセージを確実に行うために、あなたのアプリケーションの言語を設定することを求めます。
コード内で、言語を切り替えることは、十分に簡単です。あなたは、次に示すAppオブジェクトに静的メソッドを配置するように、 簡単に、一般的なルーチンで、新しいCultureとUICultureを割り当てることができます。:
public static void SetCulture(string culture)
{
if (!string.IsNullOrEmpty(culture))
{
CultureInfo ci = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
}
このメソッドを、あなたのアプリケーションのどこかから呼び出すことは、カルチャと新しい具体的な言語のためのUIリソースに提供される結果を変更することになります。
これは、おそらく、あなたが、設定ファイルから起動カルチャを読むことができる所で、あなたのアプリケーションで始める、十分な意味があります。:
public App()
{
SetCulture(ConfigurationManager.AppSettings["Culture"]);
InitializeComponent();
}
しかし、物事は、わかりやすいわけではありません。あなたが、アプリケーションが実行された後で、] カルチャを変更するとき、新しいカルチャとUICultureは、 すぐに、書式設定に適用されます。そして、リソースは、この場所から前方へ読み込まれます。 それで、どんな新しいドキュメントも、すぐに新しいカルチャで見えます。問題は、フォームがすでに読み込まれていることです。 中心となるUIが、含まれています。自動的にカルチャーショックを反映しません。
1つの方法は、すべてのアプリケーションのウィンドウを閉じ、メイン・ウィンドウを再読み込みします。 Figure 25は、すべてのフォームを閉じて、メイン・フォームを再開する機能がある、ジェネリックSetCultureメソッドを示します。
FIGURE 25:
ジェネリック・メソッドは、CultureとUICultureを設定し、すべてのアクティブ・ウィンドウを閉じるための、オプションを提供し、メイン・フォームを再起動します。
public static void SetCulture(string culture, bool closeAllWindowsReloadMain)
{
if (culture == null)
return;
bool cultureChanged = culture !=
Thread.CurrentThread.CurrentUICulture.IetfLanguageTag;
if (!cultureChanged)
return;
if (!string.IsNullOrEmpty(culture))
{
CultureInfo ci = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
if (closeAllWindowsReloadMain)
{
Type mainWinType = App.Current.Windows[0].GetType();
Window mainForm =
Assembly.GetExecutingAssembly() .CreateInstance(mainWinType.FullName) as Window;
mainForm.Show();
// close all other windows
// すべての他のウィンドウを閉じます
foreach (Window win in App.Current.Windows)
{
if (mainForm == win)
ontinue;
win.Close();
}
}
}
この作業は、一つのフォ-ムや比較的小さなアプリケーションのためには、かなり良好です。 しかし、より高性能なアプリケーションのためには、おそらく、あまりにもなまくらです。動的なデータを持っている可能性があります。 アプリケーションがシャットダウンする前に、保存する必要があります。 別の選択肢は、コード1行で、言語の変更は、アプリケーションの再起動を必要とすることをユーザーに警告することです。 さらにもう一つの選択肢は、メイン・フォ-ムが読み込まれる前に、最初にアプリケーションが実行されるとき、ユーザーに選択するカルチャを尋ねることであるかもしれません。 そして、その次に、情報が設定ファイルへ書き込まれたあと、静かにアプリケーションを再起動します。