どうも!リョクちゃです。
アプリケーションを様々な言語で扱いたいときってありませんか?
そんなとき、どうすればいいのか今回Windowsフォームアプリケーションを
作成するとともに紹介していきます・
ちなみに前回の記事はこちら
目次
準備編
VisualStudio2019を使って、Windowsフォームアプリケーションを作成していきます。
最初の手順については、下記記事をご参照ください。
フォームの作成
以下のようなフォームを作成します。
①~⑧のコントロールについては以下の表のとおりです。
No | コントロール | 名前 |
---|---|---|
1 | Label | Label1 |
2 | RadioButton | rbnMsg1 |
3 | RadioButton | rbnMsg2 |
4 | Button | btnEng |
5 | Button | btnJapan |
6 | Button | btnChina |
7 | Label | Label2 |
8 | TextBox | tbxResult |
各コントロールのフォントは、メイリオの18ptを設定しています。
実行環境
筆者の実行環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.1
になります。
※ Windows7 8 8.1でも動作はできますが、画面デザインの表示が変わるかもしれません。
アプリケーションの目的
変換する文字列どちらかを選択し、いずれかの言語ボタンを押すことで、
押した言語に変換する文字列が変換されることを目的とします。
動作
動作としては、
- 変換する文字列からいずれかのラジオボタンを選択します。
- 選択したら、変換したい言語のボタンを押します。
- 押したボタンの言語に変換された文字列がtbxResultに表示されます。
これらができることとします。
プログラム編
シンプルに多言語化してみる
まずはシンプルに多言語化してみます。
今回作成するアプリケーションの変換する文字列にある
ラジオボタンを選択し、各言語ボタンをそれぞれクリックすることで
各言語に変換した情報が表示されるようにします。
例えば、”おはよう”とラジオボタンが選択され、英語ボタンが押されたら
結果は、”Hello”となります。
※Good morningにすればよかったです……
これをコードで書くと、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
''' <summary> ''' 英語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnEng_Click(sender As Object, e As EventArgs) Handles btnEng.Click ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = "Hello" Else Me.tbxResult.Text = "Thank you" End If End Sub |
英語ボタンが押されたときに、ラジオボタンの選択肢によって条件を分岐させ、
結果を表示するテキストボックスに変換する文字列で選択された情報を
英語に変えるようにしています。
情報に対して自動翻訳をするのではなく、
事前に変換後の情報をコードに書いておく方法です。
※自動翻訳とかやってみたいな。
アプリケーション上で扱う言葉が少なければこの方法でも問題はないと思いますが、
コードの修正が大変ですね。
選択肢が、”おはよう”ではなく、”こんばんわ”になったらどうでしょう。
おはように対して、こんばんわと修正しなければなりませんから、
コード上の全てのおはように対して修正が必要ですね。
これは非常に面倒くさいのと全てを修正できず、
見落としが発生するといった事も考えられます。
作成するアプリケーションをシンプルに多言語化する場合のコードがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Public Class frmResources ''' <summary> ''' 英語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnEng_Click(sender As Object, e As EventArgs) Handles btnEng.Click ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = "Hello" Else Me.tbxResult.Text = "Thank you" End If End Sub ''' <summary> ''' 日本語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnJapan_Click(sender As Object, e As EventArgs) Handles btnJapan.Click ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = "おはよう" Else Me.tbxResult.Text = "ありがとう" End If End Sub ''' <summary> ''' 中国語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnChaina_Click(sender As Object, e As EventArgs) Handles btnChaina.Click ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = "你早" Else Me.tbxResult.Text = "谢谢" End If End Sub End Class |
今回のアプリケーションに関しては、扱う情報が2つと少なかったので、
上記のような書き方でも特に問題はありません。
※多言語化に関するさわり程度で、こうすれば言語変換できるんだと思ってもらえれば。
リソースファイルを使って多言語かしてみる
次に、リソースファイルを使って多言語化をしていきます。
リソースファイルとは
リソースファイルは、アプリケーションで使用する文字列データを定義するXMLファイルです。以下のような文字列データを定義するのに使用できます。
リソースファイルを使用すると文字列を外付けのファイルに定義できるため、プログラムを再コンパイルすることなく文字列を変更することができます。また、リソースファイルはロケールごとに作成できるため、多言語化の実現が容易になります。
出典:4.6リソースファイル
https://software.fujitsu.com/jp/manual/manualfiles/M050000/J2X11190/01/guide04/guide038.html
アプリケーションで使う文字列をあらかじめ
書き込んでおくファイルのことリソースファイルって言います。
Windowsフォームアプリケーションでは、文字列以外にも、
音源や画像もリソースとして取り扱うことができます。
リソースファイルの作成
それでは早速リソースファイルの作成をしていきます。
リソースファイルを作成するには、2パターンあって、
1つは、リソースファイルをプロジェクト内に
フォルダを作成してリソースファイルを保存する方法
一方は、プロジェクトのプロパティでリソースファイルを作成する方法
フォルダを作成してリソースファイルを保存する方法
・ソリューションエクスプローラーのプロジェクト上で右クリックを押し、
新しいフォルダ(フォルダ名:Resources)を作成します。
・作成したフォルダにリソースファイルを追加
Resourcesフォルダにリソースファイルが作成されます。
.resxというファイル拡張子がリソースファイルになります。
プロパティでリソースファイルを作成する方法
VisualStudio上のプロジェクトタブのプロパティをクリックします。
プロパティ画面の右側から、リソースを選択します。
選択すると下図のような画面に切り替わります。
リソースファイルに言語情報を書き出していく
下図のように記述します。
図では、MSG_1といった名前で値にはおはようを持たせています。
リソースファイルから、MSG_1を呼び出してあげることで、値である”おはよう”が使えます。
これを呼び出すには、
各国ごとのリソースファイルを用意する
これだけでは多言語化はできません。
多言語化をするには、国ごとに定められた
言語コード、国コードの組み合わせのリソースファイルを作成する必要があります。
日本であれば、
言語コードは、ja
国コードは、jpになります。
国ごとのリソースファイルを作成する場合は、
とすることで国ごとのリソースファイルが作成できます。
例えば、日本であれば、
TestResources.ja-JP.resx
とすることで作成できます。
今回用意するのは、英語と中国語なのでそれぞれ
英語
言語コード:en
国コード:us
リソースファイル名:TestResources.en-US.resx
リソースファイルの中身
MSG_1 Hello
MSG_2 Thank you
中国語
言語コード:zh
国コード:cn
リソースファイル名:TestResources.zh-CN.resx
リソースファイルの中身
MSG_1 你早
MSG_2 谢谢
とします。
読込むリソースファイルをボタンに応じて切り替える
言語ごとにボタンが押されたら、選択されたラジオボタンの文字列が、
その言語に切り替わるよう、作成したリソースファイルを使ってコードを書きます。
国ごとのリソースファイルを読み出すには、
流れとしては、
- 言語リソースの変更
- 使用する言語の設定
といった流れで行います。
言語リソースの変更
1 |
Dim 変数名 As System.Globalization.CulutureInfo = System.Globalization.CultureInfo.GetCultureInfo("言語コード-国コード") |
例えば、英語なら
1 |
Dim _culture As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US") |
使用する言語の設定
1 |
System.Threading.Thread.CurrentThread.CurrentUICulture = _culture |
この二つのコードを書くだけで、国ごとのリソースファイルを読み出すことができます。
後は、選択されたラジオボタンで条件分岐をさせ、以下のように書きます。
1 2 3 4 5 6 |
' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = My.Resources.TestResources.MSG_1 Else Me.tbxResult.Text = My.Resources.TestResources.MSG_2 End If |
これは各言語ボタンが押されたとき共通の処理になります。
シンプルな場合と比較して、コードが統一されています。
全てのコードはこちらになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Public Class frmResources ''' <summary> ''' 英語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnEng_Click(sender As Object, e As EventArgs) Handles btnEng.Click ' 言語リソース変更 Dim _culture As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US") ' 使用する言語の設定 System.Threading.Thread.CurrentThread.CurrentUICulture = _culture ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = My.Resources.TestResources.MSG_1 Else Me.tbxResult.Text = My.Resources.TestResources.MSG_2 End If End Sub ''' <summary> ''' 日本語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnJapan_Click(sender As Object, e As EventArgs) Handles btnJapan.Click ' 言語リソース変更 Dim _culture As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("ja-JP") ' 使用する言語の設定 System.Threading.Thread.CurrentThread.CurrentUICulture = _culture ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = My.Resources.TestResources.MSG_1 Else Me.tbxResult.Text = My.Resources.TestResources.MSG_2 End If End Sub ''' <summary> ''' 中国語ボタン押下後の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnChaina_Click(sender As Object, e As EventArgs) Handles btnChaina.Click ' 言語リソース変更 Dim _culture As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("zh-CN") ' 使用する言語の設定 System.Threading.Thread.CurrentThread.CurrentUICulture = _culture ' ラジオボタンのチェック If Me.rbnMsg1.Checked = True Then Me.tbxResult.Text = My.Resources.TestResources.MSG_1 Else Me.tbxResult.Text = My.Resources.TestResources.MSG_2 End If End Sub End Class |
実行編
実際に実行をしていきます。
プログラム起動時
“おはよう”選択後、日本語ボタンを押したとき
“おはよう”選択後、英語ボタンを押したとき
“おはよう”選択後、中国語ボタンを押したとき
まとめ
リソースファイルの作り方から使い方について紹介しました。
リソースファイルを使うことで、アプリケーションの多言語化をすることができました。
リソースファイルは多言語化する上では便利なので、
多言語化してみたい方は作成してみてはいかがでしょうか。
ソースファイルの表示したい情報などは、ソースファイルのコードを修正せず、
リソースファイルを修正することで表示したい情報が変えられるので、
煩雑にはなりません。
簡単に触れましたが、読者の方の参考になれば嬉しいです。
最後までお読みいただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。