none
C# 2005 Express で国際化対応のプログラムを作る方法

    質問

  •  

    はじめて投稿します。C# 2005 Express で国際化対応(まず特定は日本語、その他は英語)のWindowsアプリケーションを作ってみようとしています。リソースは文字だけで、Form上の静的な文字列については、Formのプロパティで.Localizable=Trueとして、Language=(既定)と(日本語-日本)を切り替えて、各コントロールのText等を入力すれば、Form配下のリソースファイルが自動的に作成され、 コードを書かずにマルチ言語対応できるので C# 2005 Expressの良さを実感しています。

     問題は、上記の静的な文字列以外のメッセージ文言等の動的な文字列です。これはWindowsアプリケーションProject内に暗黙に出来るPropertiesフォルダ配下のResources.resxを呼び出してリソース項目の名前と値を手動で定義して使っていますが、Formの場合と異なりマルチ言語化する手段が見当たりません。

    仕方がなく、Propertiesの配下に出来るResources.resxは(既定:英語)と考え、手動でResources.resxをコピーし、Resources.ja-JP.resxに名前を変更し、リソース項目毎の値も日本語に直しました。

    Projectのコンパイルは通って、Resources.resx(既定:内容は英語)、Resources.ja-JP.resx(日本語-日本)に対する.resourcesファイルや日本語用のサテライトアッセンブリも出来ています。

    プログラムを動作させてみるとFormの静的文字列は日本語でOKですが、動的文字列(メッセージ等)は英語のままで、追加したResources.ja-JP.resxを認識していないようです。

    どなたか、Resourcesのマルチ言語化、解決策ご存知でしょうか。

     

     

    2006年7月17日 15:58

回答

  • メッセージの国際化対応は以下のURLが参考になると思います。

    http://www.microsoft.com/japan/msdn/thisweek/step7/globalization_netframework/

    VBを使った国際化対応の例が紹介されていますが、考え方は一緒なのでC#でも同じような処理で対応できると思います。
    2006年7月18日 2:38
  • gmt9さん. 

    紹介していただいたWebページでは、VB.NET 2003/VBの例でしたが、C#2005であっても,Projectの直下に直接,Resources.resx/Resources.ja-JP.resx等のリソースファイルを手動で追加すれば多国語化できるということはわかりました.ありがとうございます.

    最初の投稿で問題にしたのは,<Visual Sudio 2005 C#において,新しいWindowsアプリケーションを作ったとき、そのテンプレートとしてPropertiesフォルダがあり、その配下にResourcesファイルが作られるが、これを既定とし、特定言語としてResources.ja-JPのようなファイルを追加しコンパイルしても、実際Resources.ja-JPのリソースが獲得できない。これは2005 C#の問題なのか?それとも私の作法の問題なのか?>ということを知りたかったのです。

    Projectの直下に直接,Resources.resx/Resources.ja-JP.resx等のリソースファイルを設けないとできないというのであれば、Windowsアプリケーションテンプレートとしてわざわざ2005 C#で用意したものは無駄ということになりちょっと合点が行かないのです。Properties 配下に暗黙にできるResourcesは破棄して、Project配下に毎回手動でresxを追加作成することになるわけですから。

    改めて2005 C#のIDE環境で、このあたりご経験ある方のご意見をお願いします。

     

    2006年7月18日 13:35
  • いや、できてますが…
    何かどっかおかしくないですかね?

     

    2006年7月18日 17:42
  • Taruさん。

    手動でリソースファイルを追加された時は思い通りの動きになったということですよね?であれば、Resources.ja-JPを使う場合でも仕組みは同じなので、同じように動くと思うのですが?

    なんかエラーになってしまうんでしょうか?

    ちょっと試してみましたが、リソースは問題なく取得できています。

    リソースの取得は以下のような感じで。。。

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager("WindowsApplication1.Properties.Resources", Assembly.GetExecutingAssembly());

    string msg = rm.GetString("HELLO_WORLD");
    MessageBox.Show(msg);

    私の環境はStandard Edなのですが、このあたりの処理はExpressでも同じだと思います。(違うのかな?)

     

     

    2006年7月19日 2:57
  •  

    もう一度手順を見直して下記手順で出来ること確認いたしました。

    回答いただいた皆様ありがとうございました。

    (1)<新しいプロジェクト>:<Windowアプリケーション>

    ・ここでC#2005 (Express)は Project配下にPropertiesフォルダ配下にResoures.resxが出来る

    (2) Projectを選択、右ボタンで<追加><新しい項目>の追加

    (3)[アセンブリリソースファイル]を選択し、ファイル名はResources.ja-JP.resx

    ・ここでProject配下にResources.ja-JP.resxが出来る

    (4)Project配下のResources.ja-JP.resxをPropertiesフォルダ配下に移動(Drag&Drop)

    (5)Resoures.resxで(名前)Hellow :(値)Hellow の設定

    (6)Resoures.ja-JP.resxで(名前)Hellow :(値)こんにちわ の設定

    (7)Form1.csのLoadイベントで下記コード  

    MessageBox.Show(Properties.Resources.Hellow);

    (8)アプリケーションを起動して”こんにちわ”が表示されました。

    以下は、私のまとめです。(間違いもあるかも)

    ●C#2005はC#2003と異なり、*.resxファイルを設けると、多国語リソースにアクセスするためのクラス*.Designers.csを作ってくれる。このためリソースをコードアクセスするとき”MessageBox.Show(Properties.Resources.Hellow);”のような事前コンパイル可能かつわかりやすいプログラムを書くことができる。ResourceManagerは*.Designers.csに隠蔽されており、もはやResourceManagerを意識したコードを書く必要がない。

    私のような初心者によってはうれしい限り。

     

     

     

     

    2006年7月20日 10:43

すべての返信

  • メッセージの国際化対応は以下のURLが参考になると思います。

    http://www.microsoft.com/japan/msdn/thisweek/step7/globalization_netframework/

    VBを使った国際化対応の例が紹介されていますが、考え方は一緒なのでC#でも同じような処理で対応できると思います。
    2006年7月18日 2:38
  • gmt9さん. 

    紹介していただいたWebページでは、VB.NET 2003/VBの例でしたが、C#2005であっても,Projectの直下に直接,Resources.resx/Resources.ja-JP.resx等のリソースファイルを手動で追加すれば多国語化できるということはわかりました.ありがとうございます.

    最初の投稿で問題にしたのは,<Visual Sudio 2005 C#において,新しいWindowsアプリケーションを作ったとき、そのテンプレートとしてPropertiesフォルダがあり、その配下にResourcesファイルが作られるが、これを既定とし、特定言語としてResources.ja-JPのようなファイルを追加しコンパイルしても、実際Resources.ja-JPのリソースが獲得できない。これは2005 C#の問題なのか?それとも私の作法の問題なのか?>ということを知りたかったのです。

    Projectの直下に直接,Resources.resx/Resources.ja-JP.resx等のリソースファイルを設けないとできないというのであれば、Windowsアプリケーションテンプレートとしてわざわざ2005 C#で用意したものは無駄ということになりちょっと合点が行かないのです。Properties 配下に暗黙にできるResourcesは破棄して、Project配下に毎回手動でresxを追加作成することになるわけですから。

    改めて2005 C#のIDE環境で、このあたりご経験ある方のご意見をお願いします。

     

    2006年7月18日 13:35
  • いや、できてますが…
    何かどっかおかしくないですかね?

     

    2006年7月18日 17:42
  • Taruさん。

    手動でリソースファイルを追加された時は思い通りの動きになったということですよね?であれば、Resources.ja-JPを使う場合でも仕組みは同じなので、同じように動くと思うのですが?

    なんかエラーになってしまうんでしょうか?

    ちょっと試してみましたが、リソースは問題なく取得できています。

    リソースの取得は以下のような感じで。。。

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager("WindowsApplication1.Properties.Resources", Assembly.GetExecutingAssembly());

    string msg = rm.GetString("HELLO_WORLD");
    MessageBox.Show(msg);

    私の環境はStandard Edなのですが、このあたりの処理はExpressでも同じだと思います。(違うのかな?)

     

     

    2006年7月19日 2:57
  •  

    もう一度手順を見直して下記手順で出来ること確認いたしました。

    回答いただいた皆様ありがとうございました。

    (1)<新しいプロジェクト>:<Windowアプリケーション>

    ・ここでC#2005 (Express)は Project配下にPropertiesフォルダ配下にResoures.resxが出来る

    (2) Projectを選択、右ボタンで<追加><新しい項目>の追加

    (3)[アセンブリリソースファイル]を選択し、ファイル名はResources.ja-JP.resx

    ・ここでProject配下にResources.ja-JP.resxが出来る

    (4)Project配下のResources.ja-JP.resxをPropertiesフォルダ配下に移動(Drag&Drop)

    (5)Resoures.resxで(名前)Hellow :(値)Hellow の設定

    (6)Resoures.ja-JP.resxで(名前)Hellow :(値)こんにちわ の設定

    (7)Form1.csのLoadイベントで下記コード  

    MessageBox.Show(Properties.Resources.Hellow);

    (8)アプリケーションを起動して”こんにちわ”が表示されました。

    以下は、私のまとめです。(間違いもあるかも)

    ●C#2005はC#2003と異なり、*.resxファイルを設けると、多国語リソースにアクセスするためのクラス*.Designers.csを作ってくれる。このためリソースをコードアクセスするとき”MessageBox.Show(Properties.Resources.Hellow);”のような事前コンパイル可能かつわかりやすいプログラムを書くことができる。ResourceManagerは*.Designers.csに隠蔽されており、もはやResourceManagerを意識したコードを書く必要がない。

    私のような初心者によってはうれしい限り。

     

     

     

     

    2006年7月20日 10:43