Visual Studioで多言語アプリケーションを作成する

多言語化手順

多言語言語化するなら既定値は英語で作成しておく

今回、日本語と英語対応の2か国語対応のアプリケーションを作成するとします。サンプルアプリケーションはこんな感じです。

 

プロパティのLanguageの「既定値」となっています。この場合、既定値の状態が日本語となっているので、PCの言語が日本語と英語以外の場合、既定値の日本語が表示されることになります。

例えば、PCがドイツ語環境の場合、日本語が表示されることになります。しかも日本語フォントなので文字化けの可能性もあります。もちろん日本語、英語、ドイツ語対応も可能ですが、すべての言語に対応することは実質不可能です。

そのPCがアプリケーションのどの言語にも対応していない場合は、やはり世界共通言語である英語で表示されることが望ましいでしょう。

ということで、フォームの日本語テキストを英語にします。

Languageが既定値の初期表示のフォーム画面のテキストは「りんご」→「Apple」など英語にします。

※今回既定値を英語とし日本語を追加しますが、既に日本語表示のアプリケーション作成後、後から多言語対応にする場合は、既定値を英語にして・・・といのは大変なので、既定値を日本語とし、英語を追加します。この後の説明は逆でとらえてください。

 

コントロールのテキストを多言語化する

プロパティのLanguageをプルダウンより「日本語」に変更します。「日本語(日本)」もありますが、日本語(日本)は場所も関係してくるので、「日本語」を選択しておいて間違いないです。

Languageを「日本語」に変更すると、その下のLocalizableが「True」に変わります。もし「False」のままなら「True」に変更します。

 

フォームの英語テキストを「Apple」→「りんご」など日本語テキストに変更します。変更すると、Form1.ja.resxというファイルが作成されます。既定値のForm1.resxとの差分情報がこのファイルに保存されます。

 

Form1.ja.resxの中身はこんな風になっています。

 

コントロール以外のコードの中のテキストを多言語化する

コントロールならこれまでの処理でよいのですが、例えばメッセージをコード中に記載しているとします。

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("本当に閉じますか?");
}

これらのようにコントロールではないテキストは別手順で多言語化していきます。

ソリューションを右クリックし、「追加」→「新しい項目」を選択します。

 

アセンブリリソースファイルを選択し、名前に「Resource.ja.resx」をつけて追加ボタンをクリックします。

 

Resource.ja.resxファイルがソリューション直下に追加されます。

 

Resource.ja.resxをソリューション直下からPropertiesフォルダへ移動します。

Propertiesに元々あるResource.resxが英語(既定値)で、Resource.ja.resxが差分情報の日本語ファイルとなります。

 

英語(既定値)ファイルのResources.resxを開きます。名前に変数名を入れ、値に実際に表示させたい英語テキストを入力します。

名前:msg_clolse
値:Are you sure you want to close?

 

日本語用ファイルのResources.ja.resxを開きます。名前にResources.resxと同じ変数名を入れ、値に実際に表示させたい日本語テキストを入力します。

名前:msg_clolse
値:本当に閉じますか?

 

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(Properties.Resources.msg_close);
}

コード中にダイレクトに記載していた箇所をProperties.Resources.変数名に変更します。

 

言語を動的に切り替える

言語切り替え用として「ja」と「en」の選択肢があるコンボボックスをつけてみます。

選択肢変更で言語変更のイベントを呼び出し、ChangeLanguageメソッドで選択した言語でフォームを再表示します。

//言語インデックス変更イベント
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string langName=comboBox1.Text;
    if (langName != null && langName != "")
    {
        //言語を変更
        ChangeLanguage(comboBox1.Text);
    }
}

//言語を変更
private void ChangeLanguage(string langName)
{
    System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo(langName);
    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

    Form1 myform = new Form1();
    myform.Show();
    this.Hide();
}

「ja」日本語

「en」英語

※言語切り替えのサンプルとして言語切り替え前のフォームをHideしているだけなので、Form_ClosingイベントでApplication.Exitを記載しておくとHideしてるフォームも全て終了します。

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
    Application.Exit();
}

 

コメント

タイトルとURLをコピーしました