トップ回答者
日本語で作られた既存ソフトの英語化

質問
-
開発環境:Visual Studio2010 pro / OS: Windows7 日本語版
開発言語:VC++(MFC)
既存アプリ:ダイアログタイプ(多数のダイアログがあり)
ターゲット:Windwos8.1 64bit 英語版
お世話になります。
タイトルの通りですが、日本語で作成したソフトの英語化を進めています。
英語版のOSにて、既存ソフトをインストールし起動すると、「attempted an unsupported operation」のエラーメッセージが発生。
そのまま、ソフトが終了します。
■これまでに調べてやったこと
・Visual Studioにてプロジェクトのプロパティ「リソース」の全般「カルチャ」を英語を選択 → 改善なし
・Setupの言語設定を英語へ → 改善なし
・String Tableの英語化 → 改善なし
・新規でMFCプロジェクトを英語で作成 → 調べた限り最有力
英語でMFCプロジェクトを作成して、リソースを英語版で作成すれば行けそうですが、この方法ですと既存ダイアログが使えなそうです。
(リソースにダイアログが無い)
既存のソフトを出来るだけいじらず、英語化する方法は無いのでしょうか。ご教授頂きたいです。
宜しくお願い致します。
回答
-
言語の設定はプロジェクトの設定と、.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の言語は戻す
で動きそうな気がします。
- 編集済み tmori3y2 2017年4月4日 14:15
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月5日 1:26
- 回答としてマーク パブリックENG 2017年4月11日 10:21
すべての返信
-
何が起きているかについては興味がありますが、文章で説明されても原因はよくわかりません。なんとなくダイアログ・表示の問題ではなく文字列もしくはロケールなどの扱いの問題に感じます。
問題となる環境でデバッグされてはどうですか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月3日 1:48
-
英語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
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月3日 1:48
-
>既存のソフトを出来るだけいじらず、英語化する方法は無いのでしょうか。
の部分についてのみ提案します。あまり簡単とは言えないのですが、多言語化の一つの手法を紹介します。
MFCでは関数::AfxSetResourceHandle(ハンドル)で
LoadString()等が参照する「リソースを取得するためのインスタンスハンドル」を設定できます。例えば、アプリケーション開始時に
(1)日本語環境の場合は何もしない
(2)以外の場合は::AfxSetResourceHandle( 英語リソースだけが入ったDLLのハンドル)する。という処理を行うことにより、リソースの取得先を言語環境の判定によって切り替えることができます。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月5日 1:26
-
言語の設定はプロジェクトの設定と、.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の言語は戻す
で動きそうな気がします。
- 編集済み tmori3y2 2017年4月4日 14:15
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月5日 1:26
- 回答としてマーク パブリックENG 2017年4月11日 10:21
-
実際には、本体を英語にして言語ごとのリソースDLLを作る方法が良く使用されます。
仲澤@失業者さんの方法の場合は、それぞれの言語ですべてのリソースを置き換える必要があります。
ダイアログリソースなどを定義忘れると、当然ですが落ちたりします。
他に、マージをする方法があり、元のリソースの一部を上書きすることもできます。
http://hp.vector.co.jp/authors/VA000092/win32/multi-lang-mfc.html
注: exe/dllでリソースが重複するのを回避するために、レギュラーDLLでは、重複しないように範囲を管理するか、
AFX_MANAGE_STATE(AfxGetStaticModuleHandle());
を使用しますが、マージしたときにそのままでは動かなかったかもしれません。(要確認)
拡張DLLでは、重複しないように範囲を管理するか、
AfxGetStaticModuleHandle/AfxSetStaticModuleHandle
でリソースアクセス毎に切り替えるのは同じです。
- 編集済み tmori3y2 2017年4月4日 22:42
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年4月5日 1:26
-
返信、ありがとうございます。
「Error: no data exchange control with ID」のASSERTを調べてみると、リソースのある筈の部品が無いという事。
リソースエディターにてダイアログを確認してみても無かったですが、英語版のダイアログに適当に追加した所、
問題無しになってきました。どうやら、ダイアログの作り方に問題がありそうです。一つ一つ、アサートに出てくる
IDを検索をかけて、潰していく道が近道のようです。
困っていたのが、英語版・日本語版のリソースIDは一緒ですが、デザイナーでの部品(実際はエディットボックス)は見当たりません。
しかし、部品を作ろうとすると、そのIDは既に使われています・・・的なメッセージが出てきます。※日本語側
英語版に表示しない形式で、同様のエディットボックスを作成、IDを割り当て番号を一緒にすると、
一つASSERTが消えました・・・。
もう少しやってみます。
-
> リソースエディターにてダイアログを確認してみても無かったですが、英語版のダイアログに適当に追加した所、
> 問題無しになってきました。どうやら、ダイアログの作り方に問題がありそうです。一つ一つ、アサートに出てくる
> 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