Home > C# > 目的別資料 > 地域設定

その場で言語を変更する

WPFのための地域設定の手引き Localization Guidance for WPF

原文

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行で、言語の変更は、アプリケーションの再起動を必要とすることをユーザーに警告することです。 さらにもう一つの選択肢は、メイン・フォ-ムが読み込まれる前に、最初にアプリケーションが実行されるとき、ユーザーに選択するカルチャを尋ねることであるかもしれません。 そして、その次に、情報が設定ファイルへ書き込まれたあと、静かにアプリケーションを再起動します。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」