none
メッセージボックスのボタンのラベルを英語化したい RRS feed

  • 質問

  • いつも参考にさせていただいております。

    アプリケーションの他言語(英語)対応に関する質問です。

    コントロールパネルの[地域と言語のオプション]の使用言語を"英語"に変えたときに、
    自分たちで作成したダイアログ類については、表示する文字列を、英語用の文字列に切り替えるようにできたのですが、
    コモンダイアログ(ファイル選択etc.)やメッセージボックスのボタンのラベル類も併せて英語で表示されるようにする
    (例えば、メッセージボックスの[はい/いいえ]ボタンを[Yes/No]で表示する)方法がわかりません。

    使用しているOSは、WindowsXP Professional (日本語版)です。

    開発環境は、VisualStudio2008で、AfxMessageBoxやMessageBox、CFileDialog などのAPIやクラスを使用しています。

    MUI版のOSを使用すれば、OSのメニュー要素などの言語をログインユーザごとに切り替えて使うことができる云々の記述が、
    オンラインのドキュメントで見受けられるのですが、ローカライズ版のOSを使用して、ローカライズ言語(日本語)と
    英語のユーザインタフェースを切り替える方法は存在しないのでしょうか?

    [追加情報]
    メッセージボックスに関しては、Win32APIのMessageBoxExも試してみたのですが、
     ::MessageBoxEx( NULL, _T("test"), _T("Title"), MB_YESNO, MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US) );
     ::MessageBoxEx( NULL, _T("test"), _T("Title"), MB_YESNO, MAKELANGID( LANG_KOREAN, SUBLANG_KOREAN) );
    いずれの場合も[はい・いいえ]ボタンが表示されてしまいました。

    [質問内容]
    ・WinXPのローカライズ版OSで、システムで使用する言語を英語に変える方法

    あるいは、

    ・自プログラムの作成方法により、システムのリソースを使用しているUI要素の文字列を英語に置き換える方法

    について、なにかアドバイスをいただけませんでしょうか?

    よろしくお願いします。

     

    2010年6月7日 14:14

回答

  • 多分、そういった方法はないと思われます。
    そういうことができるのであれば、そもそも MUI はいらないので…。

    スレッドのロケールを英語にしても、「はい」「いいえ」なのであれば、アプリで何をやっても変わらないと思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年6月8日 14:07
    モデレータ
  • フックを使って強引にキャプションを変えてしまう…というのでよければ、こういうやり方があります。
    http://www.codeguru.com/cpp/w-p/win32/messagebox/article.php/c10873/

    2010年6月9日 9:28

すべての返信

  • 試してないですが、サテライトDLL やAfxSetResourceHandle で、起動時に任意のリソースに切り替えるとかでどうでしょう。

    2010年6月8日 6:46
  • 多分、そういった方法はないと思われます。
    そういうことができるのであれば、そもそも MUI はいらないので…。

    スレッドのロケールを英語にしても、「はい」「いいえ」なのであれば、アプリで何をやっても変わらないと思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年6月8日 14:07
    モデレータ
  • フックを使って強引にキャプションを変えてしまう…というのでよければ、こういうやり方があります。
    http://www.codeguru.com/cpp/w-p/win32/messagebox/article.php/c10873/

    2010年6月9日 9:28
  • びーしむさん返信ありがとうございます。

    教えていただいた AfxSetResourceHandle で検索すると、MFCのリソースを目的のDLL(サテライトDLLというのでしょうか)から読み込ませられる方法はわかりました。

    有効範囲をMFCに限定できれば、なかなか強力な手段だとおもいました。

    ただ、文字列のIDと実際の文字列の対応を目視で作り上げるにはそれなりの手間がかかりそうですが、MFCで表示されるコモンダイアログ類のリソースは、どこかから手に入れる方法はあるのでしょうか?

    2010年6月9日 10:20
  • ozzychang さん、返信ありがとうございます。

    これなら、AfxSetResourceHandle を使う方法より適用範囲が拡がりそうな気がします。

    CBTという概念は初めて知りました。この場合も、翻訳は必要ということで、今回は使わないかもしれませんが、参考になります。

    2010年6月9日 10:46
  • 多分、そういった方法はないと思われます。
    そういうことができるのであれば、そもそも MUI はいらないので…。

    スレッドのロケールを英語にしても、「はい」「いいえ」なのであれば、アプリで何をやっても変わらないと思います。

    Azuleanさん、返信ありがとうございます。

    SetThreadLocale でもまったく効果がありませんでした。

    今回の件のような要求は、ごく普通にありそうで、製品(OS)の作り手側にたって想像してみると、

    MUIでないとできないようなことでもない気がしてきたのですが、素人考えでしょうか?

    地域の言語の設定には、時刻や通貨単位など、各国語の情報を利用できるにもかかわらず、メッセージボックスのボタンは、ローカル言語のままなんて、なんか嫌がらせのような気がします。間違えて読めない言語設定に変更してしまったときなどに、操作できなくなるのがまずいからという理由もあるのかと思いましたが、OSが表示するメッセージボックスでも、メッセージが英文で、ボタンが日本語のまま表示されるものが普通にあるので、そういうわけでもないようですね。

    変更されないことがなんだか腹立たしく思えてきました。

    2010年6月9日 11:33
  • MUIでないとできないようなことでもない気がしてきたのですが、素人考えでしょうか?

    英語であれば「Yes」とか「No」とか、他言語であればそれぞれの文言は必要ですよね。
    MUI にはそういった文言リソースがあるということで、日本語版 Windows XP には入っていないだけでしょう。
    そういった機能が欲しいのであれば、XP の英語版 + MUI の構成か、Vista 以降の Ultimate 以上の構成を望むしかありません。

    今回の件のような要求は、ごく普通にありそうで、製品(OS)の作り手側にたって想像してみると、

    「普通にある」のでしょうか?

    今求められていることはアプリの都合で、OS の言語を変えたいことですよね。
    Windows を組み込み、あるアプリに特化したシステムを計画されているのであれば、Embedded Systems など融通が利くプロダクトを利用すれば良いでしょう。

    通常のクライアント OS で、日本語版 Windows で英語版などの他言語のアプリを動作させ、さらにシステムの言語も変えなければならないといったシナリオが考えづらいです。

    地域の言語の設定には、時刻や通貨単位など、各国語の情報を利用できるにもかかわらず、メッセージボックスのボタンは、ローカル言語のままなんて、なんか嫌がらせのような気がします。

    実際、他言語の形式に変更をする人は多くないように思えます。
    使う人が少ないなら、やらなくても良いという判断はありだと思います。

    OSが表示するメッセージボックスでも、メッセージが英文で、ボタンが日本語のまま表示されるものが普通にあるので、そういうわけでもないようですね。

    そのメッセージはローカライズ対象外なのでしょう。
    その現象を以て、設計・判断理由を推し量る材料にはなりません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年6月9日 14:20
    モデレータ
  • 質問の内容を、この方法では解決できそうにありませんが、参考までに。。。

    ここにいろいろ入ってます。

    Microsoft Visual Studio 9.0\VC\atlmfc\include

    たとえば、

    日本語は、 ....VC\atlmfc\include\l.JPN\afxres.rc

    英語は、    ....VC\atlmfc\include\afxctl.rc

    といった具合です。

     

    また、リソースファイルを「コードの表示」で開いて、その中でincludeしている.rc ファイルをさらに開き、

    「含んでいるフォルダを開く」で、目的のフォルダを開けますヨ。

    #include "l.JPN\afxres.rc"          // 標準コンポーネント

    #include "l.JPN\afxprint.rc"        // 印刷/印刷プレビュー リソース

     

    2010年6月10日 2:12
  • >通常のクライアント OS で、日本語版 Windows で英語版などの他言語のアプリを動作させ、さらにシステムの>言語も変えなければならないといったシナリオが考えづらいです

    はい、今回の要求はメインの使われ方ではなく、かなりニッチなものです。普段は日本語で使用しており、英語圏の人と画面を共有する際にだけ一時的に英語に切り替えて使いたいというものなので、システムの言語を変えられる必要もありません。

    Azuleanさんが言われるように、”OSの言語”は変えられませんよ、といいきってしまえば、確かにそうですが、アプリケーションが通知しているメッセージボックス上のボタンや、ファイル選択ダイアログ内の文字列をアプリケーションから簡単にコントロールできないのは残念です。

    いずれにせよ、MUIを使わないと、実現性は乏しいことが理解できました。

    ありがとうございます。

     

    2010年6月10日 12:28
  • 追加の情報ありがとうございます。

    今後の参考にさせていただきます。

    教えていただいた情報の主旨からはずれますが、「含んでいるフォルダを開く」の機能の存在を初めて知りました、ありがとうございます。(^-^;;)

    2010年6月10日 12:32
  • 通常のクライアントOSはMUIに対応する前のOSか、あるいは価格を抑えるためにあまり使われない機能を削ってあると考えればよいのではないでしょうか。

    メッセージボックスに限って言えば、自分のプロジェクトで共通のメッセージボックス関数を作成して、そちらを使用するようにすれば解決します。私のプロジェクトでも、(別の目的ですが)そのようにしています。

    CFileDialogは、クラスをラッピングしてリソースを書き換えればいいのではないでしょうか。

    試したことがないので憶測ですが、MUI対応OSで動作させたときはどうなるんだとか、CFileDialogが出してくるメッセージボックスはどうするんだとか面倒なことがあると思うので、お勧めはしませんが)

     

    2010年6月11日 20:36