none
VC++ 2010 express での多言語対応について RRS feed

  • 質問

  • Visual C++ 2010 express にて、たとえば、画面表示させる文字列をスペイン語で表示させる方法はありますでしょうか?

    具体的に言うと、コンボボックスで、日本語、英語、スペイン語を選択できるようにして、それらを切り替えると表示内容が

    それぞれの言語に切り換えたいのです。

    C#の方にはString Tableらしきリソース設定ができそうなのですが、これを vc++ で実現したいのです。

    express版では無理でしょうか? それとも、そもそもC#でないと無理でしょうか?

    アドバイスいただければ幸いです。

    以上、よろしくお願いいたします。

    • 移動 星 睦美 2014年8月21日 6:38 Visual C++ から
    2014年8月21日 6:33

回答

  • アプリケーションのプロジェクトは「Win32 プロジェクト」をベースに開発されているのでしょうか?

    それとも「Windows フォーム アプリケーション」(Windows Forms, .NET Framework)でしょうか?

    前者のWin32であればExpressエディションの場合リソースエディターがないため、リソーススクリプト(.rc)を直接書くことになるので、多言語対応はかなりしんどいことになると思われます。サードパーティ製の外部エディターを使うという方法もありますが、そもそも仕様自体に欠陥や限界のあるリソーススクリプトを今更使用するというのはおすすめしません。

    また、たとえリソースエディターやMFCが使えるProfessionalエディションであっても、動的にメニューやモードレスウィンドウのUI文言を一括変更するのはかなり面倒です。モーダルダイアログやコンテキストメニューであれば再表示したときに言語設定を反映するというのは比較的簡単ですが……アプリケーションの再起動後に言語設定の変更を反映する、という設計にしているアプリのほうが多いです(TortoiseSVNフロントエンドなど)。

    後者のWindows FormsであればVisual C++でもVisual C#とほぼ同等の機能を持っているので、同様の方法論でローカライズできますが、こちらも動的な変更を行なうのは難しいです。また、Visual C++ 2010ではC++/CLI言語のインテリセンスが効きませんし、Visual C++ 2012以降はC++/CLI用の「Windows フォーム アプリケーション」プロジェクト テンプレートが除去されてしまっています。

    一方、WPFであれば動的なUIのローカライズもバインディングを使って簡単にできます。「wpf ローカライズ 実行時」などでWeb検索すれば詳しい情報やサンプルはすぐに見つかります。

    ローカライズに限らず、Windows上でデスクトップGUIアプリケーションを開発するならば、過去のWin32/MFC資産のメンテナンスが必要などの理由でもない限り、Visual C#(もしくはVB.NET)でWPFを使ったほうが良いです。確かにC#/VB.NETの学習コストはかかりますが、長い目でみればC++でガリガリ苦労して書くよりも、UIの記述に適した真の高級言語を使って効率的に開発したほうが楽です。今も昔もC++はGUIを記述するような高級言語ではなく、ハードウェアの限界性能を引き出すためのローレベル言語だと考えたほうがよいと思います。なお、C#言語自体はマイクロソフトのプラットフォームだけに限らず、最近ではMonoやUnityの例に見られるように、他の環境でも独自実装により活用されています。

    2014年8月21日 12:38
  • Form1.hのツリーの下にForm1.resXというファイルがありませんか? それをダブルクリックしてみてください。
    なお繰り返しますが、VC++向けのWindows Formsのサポートは2012以降打ち切られているので、もう使うのはやめておいたほうがいいです。将来性のない技術に投資するのはお勧めしません。VC 2010ではC++/CLIのインテリセンスが効かず、開発効率も悪いですし、そもそもC++/CLI自体GUIを記述するための言語ではなく、他の.NET言語とネイティブC++をつなぐためのみに使うべきグルー言語であり、ネイティブC++と.NETを十分に知っている上級者向けの言語です。
    2014年8月22日 4:30

すべての返信

  • bonito1111 さん、投稿ありがとうございます。
    フォーラム オペレーターの星 睦美です。

    質問への回答が集まりやすいように、Visual C++ Express Edition のカテゴリに質問を移動させていただきました。役立つ回答がありましたら、投稿者からの[回答としてマーク] をお願いします。

    ・MSDN フォーラム > Visual Studio Express Editions  >  Visual C++ Express Edition


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年8月21日 6:39
  • 原理的には単純なのですが、文章の量が多くなると大変になります。
    また、文章を改変する場合は、対象とした全地域の言語について変更する必要があります。

    (1)国ごとに翻訳されたリソースを保持したDLLを作成します。コードを含む場合もありえます。
    (2)つまり、「英語用リソースのDLL」「日本語用リソースのDLL」等を作ります。
    (3)上記の文字列リソースに付加されたIDは単一です。つまり
      英語用の「IDS_SETTINGS "settings"」、対応する
      日本語は「IDS_SETTINGS "設定"」となるわけですね。
      これらのIDだけを定義したヘッダーを作成します。

    アプリケーションでは、

    (4)言語が選択されたら、LoadLibrary()で、対象用言語のDLLをロードし、
      そのインスタンスハンドルを保持します。
    (5)文字列を表示する場合は、上記インスタンスハンドルを使用して、
      LoadString()し、対象文字列を取得するわけです。

    注意する点としては、

    (6)通貨や日付時刻のフォーマットが国ごとに異なります。
    (7)当たり前ですが、sprintf()などで、文字列をフォーマットする場合には、
      対象の国の言語の文法上の語の並びに合わせなければなりません。
    (8)文字列を保持するためのバッファサイズも、国ごとに異なる前提で
      作成しなければなりません。
    (9)文字列を含む他のリソースも翻訳しなければなりません。
      ダイアログリソースなども国ごとに用意したほうが安全です。
    (10)アイコンや絵のリソースも、国によっては通用しない場合もあります。
    (11)場合によっては、リソースで対応できない場合もあり、コードで分岐する
      場合もありえます。これらの処理関数も対象DLLにコードします。

    てな感じです。

    2014年8月21日 7:28
  • アプリケーションのプロジェクトは「Win32 プロジェクト」をベースに開発されているのでしょうか?

    それとも「Windows フォーム アプリケーション」(Windows Forms, .NET Framework)でしょうか?

    前者のWin32であればExpressエディションの場合リソースエディターがないため、リソーススクリプト(.rc)を直接書くことになるので、多言語対応はかなりしんどいことになると思われます。サードパーティ製の外部エディターを使うという方法もありますが、そもそも仕様自体に欠陥や限界のあるリソーススクリプトを今更使用するというのはおすすめしません。

    また、たとえリソースエディターやMFCが使えるProfessionalエディションであっても、動的にメニューやモードレスウィンドウのUI文言を一括変更するのはかなり面倒です。モーダルダイアログやコンテキストメニューであれば再表示したときに言語設定を反映するというのは比較的簡単ですが……アプリケーションの再起動後に言語設定の変更を反映する、という設計にしているアプリのほうが多いです(TortoiseSVNフロントエンドなど)。

    後者のWindows FormsであればVisual C++でもVisual C#とほぼ同等の機能を持っているので、同様の方法論でローカライズできますが、こちらも動的な変更を行なうのは難しいです。また、Visual C++ 2010ではC++/CLI言語のインテリセンスが効きませんし、Visual C++ 2012以降はC++/CLI用の「Windows フォーム アプリケーション」プロジェクト テンプレートが除去されてしまっています。

    一方、WPFであれば動的なUIのローカライズもバインディングを使って簡単にできます。「wpf ローカライズ 実行時」などでWeb検索すれば詳しい情報やサンプルはすぐに見つかります。

    ローカライズに限らず、Windows上でデスクトップGUIアプリケーションを開発するならば、過去のWin32/MFC資産のメンテナンスが必要などの理由でもない限り、Visual C#(もしくはVB.NET)でWPFを使ったほうが良いです。確かにC#/VB.NETの学習コストはかかりますが、長い目でみればC++でガリガリ苦労して書くよりも、UIの記述に適した真の高級言語を使って効率的に開発したほうが楽です。今も昔もC++はGUIを記述するような高級言語ではなく、ハードウェアの限界性能を引き出すためのローレベル言語だと考えたほうがよいと思います。なお、C#言語自体はマイクロソフトのプラットフォームだけに限らず、最近ではMonoやUnityの例に見られるように、他の環境でも独自実装により活用されています。

    2014年8月21日 12:38
  • 仲澤@失業者さま

    アドバイスありがとうございます。

    内容は大筋は理解できるのですが、DLLの作成方法に分からない点があります。

    VC++ 2010 express で、Win32アプリケーションテンプレートでDLLを作成するのだと

    思うのですが、このとき、

      ・LoadString()は、DLLのエクスポート関数として自前で作成するということでしょうか?

      ・サンプルでDLLのプロジェクトを作ってみたのですが、リソースとしてVC6時代のような

       String Tableを作成する手段が分かりませんでした。リソースとして文言データを持たせないと

       スペイン語などのウムラウト付文字などは取り扱えないと認識しています。

    といった分からない点があります。

    恐れ入りますが、DLLの作成方法について、詳しくご教授いただけませんでしょうか?

    見当違いな質問であればご指摘いただければ幸いです。

    以上、よろしくお願いいたします。

    2014年8月22日 3:53
  • sygn NC さま

    アドバイスありがとうございます。

    また、最初の質問時に不備がありました点お詫びいたします。

    現在は後者のWindows Formアプリケーションを作っています。

    小生VC++の経験しかないため、VC++でフォームアプリケーションが作成できる2010 express 版を

    利用しております。

    やはりVC++では難しいのですね。確かにC#とかはプロパティのリソースでString Tableらしきものが存在し、

    IDと文言を登録できるようですが、VC++にはそのような機能は見つけられませんでした。

    以上、よろしくお願いいたします。

    2014年8月22日 4:00
  • Form1.hのツリーの下にForm1.resXというファイルがありませんか? それをダブルクリックしてみてください。
    なお繰り返しますが、VC++向けのWindows Formsのサポートは2012以降打ち切られているので、もう使うのはやめておいたほうがいいです。将来性のない技術に投資するのはお勧めしません。VC 2010ではC++/CLIのインテリセンスが効かず、開発効率も悪いですし、そもそもC++/CLI自体GUIを記述するための言語ではなく、他の.NET言語とネイティブC++をつなぐためのみに使うべきグルー言語であり、ネイティブC++と.NETを十分に知っている上級者向けの言語です。
    2014年8月22日 4:30
  • syghさま

    度重なるアドバイスありがとうございます。

    resXファイルに文字列リソースを作成し、ResourceManagerのGetStringメソッドで文字列取得できる

    ことを確認しました。ありがとうございます。

    おっしゃる通り、Visual Studioのサポート状況から鑑みても、私もVC++はもう使わないほうが良いのだろうな

    という認識ではおります。今後は、Visual C#等のスタディも必要と考えております。

    いろいろとご教授いただき感謝いたします。ありがとうございました。

    • 回答としてマーク bonito1111 2014年8月28日 8:07
    • 回答としてマークされていない bonito1111 2014年8月28日 8:09
    2014年8月22日 6:49
  • 「VC++はもう使わないほうがいい」という表現は他の閲覧者に多大な誤解を与えます。正確には「VC++でWindows Formsはもう使わないほうがいい」です。
    C++およびそのマイクロソフト製派生言語(C++/CLI、C++/CX)自体はまだまだマイクロソフトプラットフォームにおいて第一級の開発言語です。ドライバーなどはC/C++でないと書けませんし、DirectXアプリケーションは今も昔もC++を使うのが最適です。
    2014年8月22日 7:05
  • syghさま

    ご注意いただきましてありがとうございます。

    誤解を与えかねない記載をしてしまいまして申し訳ございません。

    「VC++でWindows Formはもう使わないほうがよい」

    という表現に変更させていただきます。

    以上、よろしくお願いいたします。

    2014年8月22日 7:38
  • CLRですか。自分の発言はネイティブC++言語での開発用なので、無視してください。
    とは言うものの、ご質問にはお答えしておきます。

    Win32APIの
    int LoadString(
      HINSTANCE hInstance,  // リソースモジュールのハンドル
      UINT uID,             // リソース識別子
      LPTSTR lpBuffer,      // リソースが格納されるバッファ
      int nBufferMax        // バッファのサイズ
    );
    を使用します。hInstanceに各国語用DLLをLoadLibrary()したときの
    戻り値(DLLのインスタンスハンドル=モジュールハンドルともいわれます)を与えるわけですね。

    次に、リソース(*.rc)にはSTRINGTABLE{}は使用できます。
    この仕様はVC6.0時代はもちろん、Windows3.xの時代から変化ありません。
    扱ったことはないので、日本語環境でスペイン語リソースの編集が可能であるかは知りません。あしからず。

    DLLの作成方法は枯れた技術であり、検索すれば簡単に多数の情報が見つかります。
    また、内容は大部でもありますので、ご自分で探してみてください。
    ただし、比較的高い技術力と知識が必要となります。

    2014年8月25日 1:11
  • 仲澤さま

    返信が遅くなり申し訳ありません。

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

    理解できました。

    以上、よろしくお願いいたします。

    2014年8月28日 8:09