none
日本語で作られた既存ソフトの英語化

    質問

  • 開発環境:Visual Studio2010 pro / OS: Windows7 日本語版

    開発言語:VC++(MFC)

    既存アプリ:ダイアログタイプ(多数のダイアログがあり)

    ターゲット:Windwos8.1 64bit 英語版

    お世話になります。

    タイトルの通りですが、日本語で作成したソフトの英語化を進めています。

    英語版のOSにて、既存ソフトをインストールし起動すると、「attempted an unsupported operation」のエラーメッセージが発生。

    そのまま、ソフトが終了します。

    ■これまでに調べてやったこと

    ・Visual Studioにてプロジェクトのプロパティ「リソース」の全般「カルチャ」を英語を選択 → 改善なし

    ・Setupの言語設定を英語へ → 改善なし

    ・String Tableの英語化 → 改善なし

    ・新規でMFCプロジェクトを英語で作成 → 調べた限り最有力


    英語でMFCプロジェクトを作成して、リソースを英語版で作成すれば行けそうですが、この方法ですと既存ダイアログが使えなそうです。

    (リソースにダイアログが無い)

    既存のソフトを出来るだけいじらず、英語化する方法は無いのでしょうか。ご教授頂きたいです。

    宜しくお願い致します。

    2017年3月31日 13:18

回答

  • 言語の設定はプロジェクトの設定と、.rcファイルをダブルクリックしてResource Viewを開いたときに表示される、

    VS_VERSION_INFO

    をダブルクリックしてBlock Headerの言語を日本語から英語に変えたのですかね?

    それだと、元の言語のままで、VS_VERSION_INFOのBLOCKと"Translation"の部分の409が411に書き換わるだけで、Resource ViewのIDの横の言語表示は変わってないですよね?

    .rcファイルをテキストエディタで開いたら、

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

    のブロックがあると思いますが、追加したほうのリソース定義は空になっていませんか?

    多分、それでダイアログリソースをロードしようとしたときに定義がないのでエラーになっているのではないでしょうか?

    取りあえずは

    ・日本語のリソース定義を英語の方にコピー

    ・文字列を英語に書き換え

    ・日本語のリソースのVS_VERSION_INFOの言語は戻す

    で動きそうな気がします。




    2017年4月4日 13:35

すべての返信

  • 文字セットの問題でエラーが起こっているとすると、VC++(MFC) のプロジェクトを Unicode 文字セットに変更することで改善するもしれません。

    プロジェクトを Visual Studio で開き、プロジェクトのプロパティで「構成プロパティ」→「全般」→「文字セット」は何になっていますでしょうか?

    2017年3月31日 14:34
  • ありがとうございます。

    Unicode文字セットを使用・・・の設定になっていました。

    やはり・・・ダイアログを作り直して行くしかないのでしょうか・・・。

    情報ありましたら、引き続き、宜しくお願い致します。

    2017年4月1日 2:35
  • 何が起きているかについては興味がありますが、文章で説明されても原因はよくわかりません。なんとなくダイアログ・表示の問題ではなく文字列もしくはロケールなどの扱いの問題に感じます。

    問題となる環境でデバッグされてはどうですか?

    2017年4月1日 3:10
  • 英語OSだとエラーってあんまり聞かないので、VS2010 の MFCソースコードを検索してみたところ、リソースの中に、

    AFX_IDS_NOT_SUPPORTED_EXCEPTION,"Attempted an unsupported operation."

    とありますので、どこかで CNotSupportedException が発生しています。

    MFC例外なので、起動してからどこかで発生するエラーなので、デバッグ可能です。佐祐理さんも書いていますがまずはエラーの出る環境でデバッグして例外発生個所を突き止める必要があると思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年4月1日 4:30
  • >既存のソフトを出来るだけいじらず、英語化する方法は無いのでしょうか。

    の部分についてのみ提案します。あまり簡単とは言えないのですが、多言語化の一つの手法を紹介します。

    MFCでは関数::AfxSetResourceHandle(ハンドル)で
    LoadString()等が参照する「リソースを取得するためのインスタンスハンドル」を設定できます。

    例えば、アプリケーション開始時に
    (1)日本語環境の場合は何もしない
    (2)以外の場合は::AfxSetResourceHandle( 英語リソースだけが入ったDLLのハンドル)する。

    という処理を行うことにより、リソースの取得先を言語環境の判定によって切り替えることができます。

    2017年4月3日 5:24
  • 言語の設定はプロジェクトの設定と、.rcファイルをダブルクリックしてResource Viewを開いたときに表示される、

    VS_VERSION_INFO

    をダブルクリックしてBlock Headerの言語を日本語から英語に変えたのですかね?

    それだと、元の言語のままで、VS_VERSION_INFOのBLOCKと"Translation"の部分の409が411に書き換わるだけで、Resource ViewのIDの横の言語表示は変わってないですよね?

    .rcファイルをテキストエディタで開いたら、

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

    のブロックがあると思いますが、追加したほうのリソース定義は空になっていませんか?

    多分、それでダイアログリソースをロードしようとしたときに定義がないのでエラーになっているのではないでしょうか?

    取りあえずは

    ・日本語のリソース定義を英語の方にコピー

    ・文字列を英語に書き換え

    ・日本語のリソースのVS_VERSION_INFOの言語は戻す

    で動きそうな気がします。




    2017年4月4日 13:35
  • 実際には、本体を英語にして言語ごとのリソースDLLを作る方法が良く使用されます。

    仲澤@失業者さんの方法の場合は、それぞれの言語ですべてのリソースを置き換える必要があります。

    ダイアログリソースなどを定義忘れると、当然ですが落ちたりします。

    他に、マージをする方法があり、元のリソースの一部を上書きすることもできます。

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

    注: exe/dllでリソースが重複するのを回避するために、レギュラーDLLでは、重複しないように範囲を管理するか、

    AFX_MANAGE_STATE(AfxGetStaticModuleHandle());

    を使用しますが、マージしたときにそのままでは動かなかったかもしれません。(要確認)

    拡張DLLでは、重複しないように範囲を管理するか、

    AfxGetStaticModuleHandle/AfxSetStaticModuleHandle

    でリソースアクセス毎に切り替えるのは同じです。

    2017年4月4日 14:13
  • 返信、ありがとうございます。

    「Error: no data exchange control with ID」のASSERTを調べてみると、リソースのある筈の部品が無いという事。

    リソースエディターにてダイアログを確認してみても無かったですが、英語版のダイアログに適当に追加した所、

    問題無しになってきました。どうやら、ダイアログの作り方に問題がありそうです。一つ一つ、アサートに出てくる

    IDを検索をかけて、潰していく道が近道のようです。

    困っていたのが、英語版・日本語版のリソースIDは一緒ですが、デザイナーでの部品(実際はエディットボックス)は見当たりません。

    しかし、部品を作ろうとすると、そのIDは既に使われています・・・的なメッセージが出てきます。※日本語側

    英語版に表示しない形式で、同様のエディットボックスを作成、IDを割り当て番号を一緒にすると、

    一つASSERTが消えました・・・。

    もう少しやってみます。

    2017年4月5日 1:58
  • 返信ありがとうございます。

    仰る通り、一つ一つ例外発生箇所を特定していくのが、最短の近道のようです。

    2017年4月5日 2:00
  • ありがとうございます。

    調べてみます。

    2017年4月5日 2:01
  • > リソースエディターにてダイアログを確認してみても無かったですが、英語版のダイアログに適当に追加した所、

    > 問題無しになってきました。どうやら、ダイアログの作り方に問題がありそうです。一つ一つ、アサートに出てくる

    > IDを検索をかけて、潰していく道が近道のようです。

    > 困っていたのが、英語版・日本語版のリソースIDは一緒ですが、デザイナーでの部品(実際はエディットボックス)は見当たりません。

    いや、#ifで囲まれた空の英語リソースのブロックが出来ているので、リソースエディタで新しいリソースを追加するのではなく、.rcファイルをテキストエディタで開いて、日本語リソースからリソースをすべてコピー&ペーストして日本語を翻訳してください。

    「すべて」という意味は、画像、ダイアログ、文字列、バージョン情報など、定義されているもの、すべてという意味です。足りないと、プログラムがリソースにアクセスしたところで最悪落ちます。

    言語を切り替えたらリソースが言語ごとに複製されることを通常期待しますが、実際には複製されないので、1つの言語のリソースファイルとリソースヘッダーファイルをコピーしてリソースDLLを作成して、言語を切り替えるマクロや文字列などを差し替える方が混乱せずに済みます。(Diffも取りやすいという利点もあります) 

    https://msdn.microsoft.com/ja-jp/library/24b2tcy0.aspx

    https://msdn.microsoft.com/ja-jp/library/8fkteez0.aspx




    • 編集済み tmori3y2 2017年4月5日 13:21
    2017年4月5日 10:57
  • よくよく確認していくと、その通り定義がないIDがあり、それがエラーとなっていました。

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

    2017年4月11日 10:25