.NET デスクトップ アプリケーションのインターナショナリゼーション/ローカライゼーション

概要

このブログでは、2 つの .NET プラットフォーム (Windows Forms と WPF) のインターナショナリゼーションおよびローカリゼーションの例をご紹介します。手順はほとんど同じですがプラットフォームごとに構文が多少異 なります。また ASP.NET もほとんど同じ手順です。ただし、サードパーティ ライブラリが使用される HTML5 や JavaScript などでは方法が全く異なります。

プロジェクトの概要

Windows Forms と WPF でとてもシンプルな UI にラベルとドロップダウンを使用してプ ロジェクトを作成します。これらの要素を使用することにより、インターナショナリゼーションにおける以下の項目をカバーします。

  1. 外部ファイ ルの文字列
  2. UI レイアウトの変更
  3. 文字列等価チェック以外の方法

Windows Forms の例

  1. Visual Studio で新しい Windows Forms プロジェクトを作成します。
  2. ツールボックスの共通コントロール セクションで Label と ComboBox を追加します。lblQuestion と cmbColor と名前を付けます。
  3. ラベルの Text プロパティを "What is your favorite color?" に設定します。UI で水平ではなく垂直に配置します。これは翻訳後のテキストのためにスペースを確保するためです。英語でも既にスペースが ほとんどないため、より長い文字列となる他の言語では見切れが発生する可能性が高いためです。

  4. デザイナーで文字列を Items プロパティに直接追加する代わりに、 コードビハインドで ComboBox に数色追加します。Value プロパティが Text のみでなく各項目と関連付けされます。

    cmbColor.DisplayMember = "Text";
    cmbColor.ValueMember = "Value";
    
    
    var colors = new[] {
       new { Text = "Red", Value = "red" },
       new { Text = "Blue", Value = "blue" },
       new { Text = "Yellow", Value = "yellow" },
       new { Text = "Green", Value = "green" },
       new { Text = "Pink", Value = "pink" }
    };
    
    cmbColor.DataSource = colors;
    
    
  5. SelectedValueChanged イベントにコードを追加し、ユーザーが緑のドロップ ダウン項目を選択したかどうかをチェックします。ここでは "SelectedText" ではなく "SelectedValue" を使用することに注意してくだ さい。ロケールに基づいて変更されない値を含むためにコードで項目を設定しました。

    private void cmbColor_SelectedValueChanged(object sender, EventArgs e)
    {
      if ((string)cmbColor.SelectedValue == "green")
      {
          MessageBox.Show("Green is my favorite color too!");
      }
    }
    
  6. これでですべての設定が終わりました。UI 文字列リソースを外部に出しま す。最初のデザインの前または後に行います。Visual Studio はどちらでも問題ありません。

    1. Form の Localizable プロパティを true に設定し ます。これによりフォーム リソース ファイルが準備されます。
    2. ソリューション エクスプローラーで Form1.resx ファイルを開きます 。質問がここに追加されていることが確認できます。
    3. このファイルをコピーし、ターゲット ロケールのカルチャ コードに基づいて名前を変更します。ここでは日本語 (ja) を例として使用します。
    4. ターゲット ロケール ファイルでは、">>" で始まる項目は重複する必要がないため、すべて削除できます。またその他の項目や画像、ア イコン、ファイルなど、変更する必要のないアイテムも削除できます。次に質問を翻訳します。
  7. コードビハインドの文字列は、 Form1.resx ファイルがデザイナーで自動生成されるため正しく動作しませ ん。デザイナーにない項目を resx ファイルに追加した後にデザイナーを更新すると、.resx ファイルに追加した項目は削除されます。代わりにコードビハイ ンドの文字列のために別のリソース ファイルをプロジェクトに追加します。

    1. コードビハインドでメッセージのキーと値を追加します。色もこ こに追加します。
    2. コピーして名前を変更し、ファイルをプロジェクトに追加します。
    3. コード ビハインドからのエントリを翻訳します。
    4. コード ビハインドのハードコード文字列をこ のリソース ファイルへの参照で置き換えます。更新されたインテリセンスを表示するためにリビルドする必要があるかもしれません。
      private void cmbColor_SelectedValueChanged(object sender, EventArgs e)
      {
         if ((string)cmbColor.SelectedValue == "green")
        {
          MessageBox.Show(Strings.favoriteColorMatch);
         }
      }
      
      var colors = new[] {
        new { Text = Strings.colorRed, Value = "red" },
        new { Text = Strings.colorBlue, Value = "blue" },
        new { Text = Strings.colorYellow, Value = "yellow" },
        new { Text = Strings.colorGreen, Value = "green" },
        new { Text = Strings.colorPink, Value = "pink" }
      };
      
      
  8. プロジェクトをビルドして実行します。

InitializeComponent の前のコンストラクタ で以下のコードを使用して他のロケールをテストできます。

System.Threading.Thread.CurrentThread.CurrentUICulture = new 

System.Globalization.CultureInfo("ja");

WPF の例

  1. Visual Studio で新しい WPF プロジ ェクトを作成します。
  2. ツールボックスの共通 WPF コントロール セクションから、ラベルと ComboBox を XAML ファイルの <Grid> セクションに追加します。lblQuestion と cmbColor と名前を付けます。ラベル の Content プロパティを "What is your favorite color?" に設定します。スタック パネルで垂直に調整できます。ローカライズされたテキスト 用にスペースが取れるからです。

    <Grid>
     <StackPanel VerticalAlignment="Center">
       <Label Content="What is your favorite color?" HorizontalAlignment="Center" 
    Name="lblQuestion" />
       <ComboBox HorizontalAlignment="Center" Name="cmbColor" Width="120" />
     </StackPanel>
    </Grid>
    
    
  3. デザイナーで ComboBox に項目を追加します。テキスト表示のための Content、およびキーのよ うに使用する値のための Tag を設定します。XAML は以下のようになります。

     <ComboBox HorizontalAlignment="Center" Name="cmbColor" Width="120" 
    DropDownClosed="cmbColor_DropDownClosed"> <ComboBoxItem Content="Red" Tag="red" /> <ComboBoxItem Content="Blue" Tag="blue" /> <ComboBoxItem Content="Yellow" Tag="yellow" /> <ComboBoxItem Content="Green" Tag="green" /> <ComboBoxItem Content="Pink" Tag="pink" /> </ComboBox>
  4. DropDownClosed イベン トにコードを追加し、ユーザーが緑のドロップダウン項目を選択したかどうかをチェックします。インターナショナリゼーションでの問題を避けるために、 Content プロパティではなく Tag プロパティをチェックすることに注意してください。

     private void cmbColor_DropDownClosed(object sender, EventArgs e)
     {
         ComboBoxItem cbi = (ComboBoxItem)cmbColor.SelectedItem;
         if (cbi.Tag.ToString() == "green")
         {
             MessageBox.Show(Properties.Resources.favoriteColorMatch);
         }
     }
    
  5. これでですべての設定が終わりました。UI 文字 列リソースを外部に出します。

    1. プロジェクトに含まれる Resources.resx ファイルを開きます。
    2. 質問、コードビハインドのメッセージ、そして色のキーと値を追加します。
    3. コピーして名前を変更し、ファイルをプロジェク トに追加します。
    4. コード ビハインドからのエントリを翻訳します。
    5. XAML ファイルとコードビハインドのハードコード文字列をリソースファイルへの参照で置きえます。名前空間宣言を XAML ファ イルに追加します。
      xmlns:resx="clr-namespace:WPFI18N.Properties"
      
      リソース ファイルのアクセス修飾子を Public に設定してください。
      次に XAML で .resx ファイルへバインドします。
      <Label Content="{x:Static resx:Resources.question}" HorizontalAlignment="Center" 
      Name="lblQuestion" /> <ComboBox HorizontalAlignment="Center" Name="cmbColor" Width="120"
      DropDownClosed="cmbColor_DropDownClosed"> <ComboBoxItem Content="{x:Static resx:Resources.colorRed}" Tag="red" /> <ComboBoxItem Content="{x:Static resx:Resources.colorBlue}" Tag="blue" /> <ComboBoxItem Content="{x:Static resx:Resources.colorYellow}" Tag="yellow" /> <ComboBoxItem Content="{x:Static resx:Resources.colorGreen}" Tag="green" /> <ComboBoxItem Content="{x:Static resx:Resources.colorPink}" Tag="pink" /> </ComboBox>
      コード ビハインド:
      MessageBox.Show(Properties.Resources.favoriteColorMatch);
      
  6. プロジェクトをビルドして実行します。

InitializeComponent の前のコンストラクタで以下のコードを使用して他のロケールをテストできます。

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ja");

まとめ

上記 2 つの例では、デスクトップ アプリケーション デザインのテキスト、レイアウト、そして比較について紹介しました。

テストでは、CurrentCulture も変更し、日付や数値の形式などを確認してください。今回のサンプル例には影響しませんが、より複雑なアプリケーシ ョンでは重要なテスト項目です。

また他の言語の場合もメッセージは緑が選択されたときのみ表示されます。そのため、選択された項目のテキストの比 較はしていません。

できるだけ早いタイミングでインターナショナリゼーションをプランニングすることにより、UI のレイアウト変更や比較ロジック を変更するための時間を最小限に抑えることができます。

Posted: 20 Jan 2017, 14:10

Comments

Anonymous comments are disabled