[C#] Windows Formアプリの多言語対応

C#で作成したアプリを、複数の言語で表示したい場合の作成方法。
また忘れそうなので備忘録として。。


 

言語ごとの文字列情報

日本語、英語、中国語、韓国語・・・など言語ごとの情報はソリューションエクスプローラーの
プロジェクト>Properties>Resources.resx に保存する。

デフォルト言語(通常は英語)は、”Resources.resx”に保存しておき、
他の言語は別ファイルとして同様のファイルを保存する。
例えば、日本語の場合は、”Resources.ja-JP.resx”など。

で、これらリソースの中に各言語の変数と文言を定義しておく。

例)
今回の例では、2つの文言(変数)を定義。

Resources.resx(英語)の定義:

 

Resources.ja-JP.resx(日本語)の定義:

 

プログラムソース

上記Resourcesで定義したSelectLanguageと、Messageをプログラムから呼び出す。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;
using WindowsFormsApp1.Properties;
using System.Globalization;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
            comboBox1.Items.Add("English");
            comboBox1.Items.Add("Japanese");
            comboBox1.SelectedIndex = 0;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (comboBox1.Text)
            {
                case "Japanese":
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP");
                    break;
                case "English":
                default:
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo("");
                    break;
            }
            label1.Text = Resources.SelectLanguage;
            label2.Text = Resources.Message;
        }
    }
}

デザイン

Formのデザインは、以下の通り。
ラベル2つと、コンボボックスを配置しておく。

 

実行

 
 

<追記>

おまけで、OSの言語を調べる方法。
最初からOS言語をある程度調べて、デフォルトで選択したい場合など。

MessageBox.Show(
    CultureInfo.CurrentCulture.TwoLetterISOLanguageName + "\n" +
    CultureInfo.CurrentCulture.IetfLanguageTag + "\n" +
    CultureInfo.CurrentCulture.NativeName
    );

実行例:

日本語 英語

 
 

更に発展して、OSの表示言語を基に、自動的に表示切り替えしたい場合

// Windowsの表示言語をもとにアプリの表示言語も切り替え
switch (CultureInfo.CurrentCulture.IetfLanguageTag)
{
    case "ja-JP":
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP");
        break;
    default:
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("");
        break;
}

 
 

デフォルトの言語表示は上記処理として、更にユーザーが自分で選べるように設定画面で切り替えられると尚更良い。

 
 

Tagged

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


*