none
Windowsアプリケーションの多国語対応について RRS feed

  • 質問

  • お世話になります。

    Visual Studio 2008のMFCアプリケーションで
    Windowsアプリケーションを作成しております。
    このアプリケーションは日本語と英語の2ヶ国語を
    対応する必要があります。

    アプリケーションが起動したときにメニューバーやボタン、
    コントロール、ダイアログボックス、メッセージボックス内の文字を
    日本語もしくは英語で表示させたいのですが
    どのような設定・作成すると実現することができますでしょうか?

    何分、自分は今までC++の経験がなくC++経験歴がまだ3日です。
    詳しくご教授頂けると大変助かります。
    何卒、ご教授のほどよろしくお願い致します。



    2009年2月6日 2:05

回答

  •  String Tableはリソースに含まれています。
    作成した、Appウィザードの種類によってはリソースがないかもしれませんが、
    VS2008でソリューションのリソースビューに「String Table」というアイテムがありませんでしょうか?
    #リソースビューは[表示] - [リソースビュー]から開いてください。
    リソースがない場合は、追加してください。

    リソースビューから、String Tableのアイテムを選択し、右クリックすると、[コピーの挿入]があるのでそれでコピーが作れます。
    コピーの言語を英語(米国)等にしておけば、実行環境が英語のときはそちらのString Tableが使用されます。

    で、日本語のString Tableに例えば、IDS_HELLO 「こんにちは」があったとして、英語のString TableのIDS_HELLO に「hello」
    と追加しておくと、

    CString strText;  
    strText.LoadString(IDS_HELLO); 


    とすれば、strTextには実行環境が日本語のときは「こんにちは」、英語のときは「Hello」が設定されます。
    なんでそうなるかは、小難しい話になるので省きます。

    youno の発言:

    下記の手順かと思うのですが、それぞれどのようなことをしているのでしょうか。。?
    (例えば、、、リソースを入れたDLLって具体的にどういうものでしょうか。。。。?一から作る必要がある??)

    1. リソースを入れたDLLを作り、LoadLibary()します。
    2. AFX_EXTENSION_MODULEのインスタンスを作っておきます。
    3. それに対して、AfxInitExtensionModule() を呼びます。
      AfxInitExtensionModule(resdll, hinst);
    4. CDynLinkLibrary クラスのインスタンスを作成します。

    DLLは、リソースを含めただけのものを共有MFC DLLとして作成する必要があります。
    その後の流れは、そのURL少し下にサンプルコードがあるのでその通りです。
    そのコードをDLLをロードする側(アプリケーション)に実装する必要があります。

    #それぞれのAPIの意味やクラスについてはMSDNを参考にしてみてください。

    こんなので解るかなぁ…、、、


    • 回答としてマーク youno 2009年2月6日 12:51
    2009年2月6日 8:59
  •  まず、リソースとは何かというあたりを教本等で押さえて下さい。

    次に、現状で、ソースコード中に文字列が含まれていないか見直して下さい。
    日本語であることを前提に組まれているロジックがないか見直して下さい。(例えば、yyyy/mm/ddと決め打ちしていたりとか)

    ローカライズは表示文言だけをなんとかすれば良いというわけではありません。
    大抵の場合、ちょっと設定すれば、簡単に切り替わるという程、一筋縄ではいかないものです。
    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    • 回答としてマーク youno 2009年2月6日 12:51
    2009年2月6日 11:06
    モデレータ

すべての返信

  •  とりあえず、多言語対応としては、このサイトどおりにやれば実現できるかと。

    http://hp.vector.co.jp/authors/VA000092/win32/multi-lang-mfc.html


    自分は、日本語と英語の2つでいいなら、こんなやり方をします。

    1. 日本語のStringテーブルをコピーして、言語が英語のものを作る。
    2. メニューやボタンのキャプションはそこから取得するようにする。
      (コピーなのでリソースIDは共通のもので大丈夫。)

    これで日本語環境なら日本語リソース、英語環境なら英語リソースで表示されるようになります。

    その時々でやり方は変えますが、この方法が一番楽かなと自分は思ってます。
    2009年2月6日 5:48
  • hyuga9 の発言:

     とりあえず、多言語対応としては、このサイトどおりにやれば実現できるかと。

    http://hp.vector.co.jp/authors/VA000092/win32/multi-lang-mfc.html


    自分は、日本語と英語の2つでいいなら、こんなやり方をします。

    1. 日本語のStringテーブルをコピーして、言語が英語のものを作る。
    2. メニューやボタンのキャプションはそこから取得するようにする。
      (コピーなのでリソースIDは共通のもので大丈夫。)

    これで日本語環境なら日本語リソース、英語環境なら英語リソースで表示されるようになります。

    その時々でやり方は変えますが、この方法が一番楽かなと自分は思ってます。

    返信ありがとうございます。
    助かります。

    上記のやり方1.で、”Stringテーブル”とありますが、これはString型の配列を作り
    日本語に対応した、英語の文字列を格納しておくということでしょうか?
    また、OSの言語設定によって日本語か英語かを表示することになると思うのですが、
    OS(XP or Vista)でどの言語が設定されているかの情報をMFCを使用して取得することはできますでしょうか?

    また、教えて頂きましたURLを参照しましたが恥ずかしながら理解することができませんでした。。。。
    下記の手順かと思うのですが、それぞれどのようなことをしているのでしょうか。。?
    (例えば、、、リソースを入れたDLLって具体的にどういうものでしょうか。。。。?一から作る必要がある??)

    1. リソースを入れたDLLを作り、LoadLibary()します。
    2. AFX_EXTENSION_MODULEのインスタンスを作っておきます。
    3. それに対して、AfxInitExtensionModule() を呼びます。
      AfxInitExtensionModule(resdll, hinst);
    4. CDynLinkLibrary クラスのインスタンスを作成します。
    質問攻めで本当に申し訳ないです。
    ご教授いただけると光栄です。。。
    どうぞよろしくお願いいたします。







    2009年2月6日 7:45
  •  String Tableはリソースに含まれています。
    作成した、Appウィザードの種類によってはリソースがないかもしれませんが、
    VS2008でソリューションのリソースビューに「String Table」というアイテムがありませんでしょうか?
    #リソースビューは[表示] - [リソースビュー]から開いてください。
    リソースがない場合は、追加してください。

    リソースビューから、String Tableのアイテムを選択し、右クリックすると、[コピーの挿入]があるのでそれでコピーが作れます。
    コピーの言語を英語(米国)等にしておけば、実行環境が英語のときはそちらのString Tableが使用されます。

    で、日本語のString Tableに例えば、IDS_HELLO 「こんにちは」があったとして、英語のString TableのIDS_HELLO に「hello」
    と追加しておくと、

    CString strText;  
    strText.LoadString(IDS_HELLO); 


    とすれば、strTextには実行環境が日本語のときは「こんにちは」、英語のときは「Hello」が設定されます。
    なんでそうなるかは、小難しい話になるので省きます。

    youno の発言:

    下記の手順かと思うのですが、それぞれどのようなことをしているのでしょうか。。?
    (例えば、、、リソースを入れたDLLって具体的にどういうものでしょうか。。。。?一から作る必要がある??)

    1. リソースを入れたDLLを作り、LoadLibary()します。
    2. AFX_EXTENSION_MODULEのインスタンスを作っておきます。
    3. それに対して、AfxInitExtensionModule() を呼びます。
      AfxInitExtensionModule(resdll, hinst);
    4. CDynLinkLibrary クラスのインスタンスを作成します。

    DLLは、リソースを含めただけのものを共有MFC DLLとして作成する必要があります。
    その後の流れは、そのURL少し下にサンプルコードがあるのでその通りです。
    そのコードをDLLをロードする側(アプリケーション)に実装する必要があります。

    #それぞれのAPIの意味やクラスについてはMSDNを参考にしてみてください。

    こんなので解るかなぁ…、、、


    • 回答としてマーク youno 2009年2月6日 12:51
    2009年2月6日 8:59
  •  まず、リソースとは何かというあたりを教本等で押さえて下さい。

    次に、現状で、ソースコード中に文字列が含まれていないか見直して下さい。
    日本語であることを前提に組まれているロジックがないか見直して下さい。(例えば、yyyy/mm/ddと決め打ちしていたりとか)

    ローカライズは表示文言だけをなんとかすれば良いというわけではありません。
    大抵の場合、ちょっと設定すれば、簡単に切り替わるという程、一筋縄ではいかないものです。
    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    • 回答としてマーク youno 2009年2月6日 12:51
    2009年2月6日 11:06
    モデレータ
  • 返信ありがとうございます。
    みなさんの回答を参考にさせて頂きます。

    ありがとうございました。



     

    2009年2月6日 13:28