リソースファイルとロケールについて

このQ&Aのポイント
  • OSのロケールに依存する文字列をロードする方法と、異なるロケールで実行した場合の動作についての質問です
  • 英語版の実行形式を異なるロケールで実行した場合、現在設定されているロケールに対応するテーブルから文字列がロードされません
  • 日本語版OSで実行した場合は現在のユーザー設定と同一のストリングテーブルから文字列がロードされますが、英語版ではなぜロードされないのか疑問です
回答を見る
  • ベストアンサー

リソースファイルとロケールについて

いつもお世話になっております。 OSのロケールに依存する文字列をロードするには、 複数ストリングテーブルを設定することになると思います。 しかし、英語版(Win2000/VB6.0)でコンパイルされた実行形式を、 コンパイル時とは異なるロケールに設定し、 (コントロールパネルの"地域のオプション": 英語版:Your Locale / 日本語版:現在のユーザー設定) 実行させた場合、現在設定されているロケールに対応するテーブルからロードされていません。 <ストリングテーブル> ・ 英語(U.S) <- 新規作成時にデフォルトで作成されているテーブル ・ ドイツ語(ドイツ) <- 追加 <コンパイル時環境> Win2000英語版 ・ 現在のユーザー設定 英語(U.S) ・ システムの言語設定 西ヨーロッパと米国(既定値) <実行時環境> ・ 現在のユーザー設定 ドイツ語(ドイツ) ・ システムの言語設定 西ヨーロッパと米国(既定値) <結果> 現在のユーザー設定にはかかわらず、常に英語(U.S)のテーブルからロードされる。 それならば、と思い、 その実行形式を日本語版OS(Win2000)で同様に動作させた場合には、 現在のユーザー設定と同一のストリングテーブルからロードされます。 なぜでしょうか。英語版の環境でどの設定が足りないのでしょうか。 それともAPIで何か特別な設定等を行わなければならないのでしょうか。 どうぞ宜しくお願いいたします。

  • crm
  • お礼率64% (25/39)

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

リンク間違い

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=458254

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

こっち側でも答えているので、見てね

参考URL:
http://oshiete1.goo.ne.jp/oshiete.php3?c=257
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

>>それともAPIで何か特別な設定等を行わなければならないのでしょうか >必要ないと思いますよ^^ 調べていくうちに・・・前言撤回!!大変失礼しました!! コントロールパネルの地域設定に反映させたテーブルから情報を読むのですね? 最初日本語OS環境で、日本語テーブルから読み取れないだけだと思っていたのですが、あなたの返答の仕方でスキルが高いのがよくわかり、こんなつまらないボケをかます人ではない事がはっきりとわかりました。 >VB自体がGetUserDefaultLCID()APIなどにより現在のロケール情報をもとに実行されているか否かなのでしょうか? たぶんそうだと思います。さらにデバッグモードではリソースのデフォルト言語設定値を無視してロードしているように思えます。 ご存知の通り、リソースファイルはバイナリファイルです。 リソースファイルのストリングテーブル構造として、、、 最初の32Byteにメインヘッダがあり、リソースファイル内部IDが16個に対し、32Byteの詳細ヘッダを持っています。 ヘッダ(32BYTE) 詳細ヘッダ(32BYTE) ストリングテーブル文字長と文字データ ストリングテーブル文字長と文字データ ・・・ 詳細ヘッダ(32BYTE) ストリングテーブル文字長と文字データ ストリングテーブル文字長と文字データ ・・・ っていうような感じです。 その詳細ヘッダ中の23/24Byteにロケール情報が入っています。 これらを確認するためには、バイナリエディタで見る方法がありますが、内容部分が文字長により可変するので、どの部分がヘッダ部かがわかりづらいので、VCで開きリソーススクリプト(別名で保存<<拡張子がrc>>)として保存し、テキストエディタで開くことにより、詳細なリソースファイルの設定が可能となります。 スクリプトファイルをテキストエディタで見てください。 んで、 http://www02.so-net.ne.jp/~okuda/tech/findlang.html(参考URLにリンクを張ってます) ここのURLにあるように、メイン言語、サブ言語に関係するようです。 普通にリソースファイルにストリングを追加すると、作成地域の言語がデフォルトになる事が推測されます。 そちらで抱えている現プロジェクトのリソーススクリプトは LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT という部分がありませんか? 私にはUS版OSが無いので同じ環境での実験できませんが、日本語版OSでリソースファイルを作成して、英語のストリングテーブルだけを作成すると、私の環境では以下のような部分まで作成されてしまいます。 ----------------------ここから----------------------- ///////////////////////////////////////////////////////////////////////////// // 日本語 resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT #pragma code_page(932) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // 日本語 resources ///////////////////////////////////////////////////////////////////////////// ----------------------ここまで----------------------- 英語版で作成しても、同様な部分ができていると思います。 この部分が悪さをしていると思うので、まるまる削除してしまいましょう。 そのあと、スクリプトをVCで開き、リソースファイルにして保存してください。 あとは起動時にSetThreadLocaleでIDを指定してあげたら、そのIDに対応した文字列テーブルを読み込むと思います。 (余談) 追っていくうちに、こんな情報発見 ※IPDKに関する情報 http://www.microsoft.com/japan/msdn/vbasic/Downloads/ipdk.asp (抜粋) International Package and Deployment Kit (以下、IPDK) は、どの言語版の Visual Basic を使用しても、ローカライズ版のアプリケーションを作成および 配布することを可能にするためのリソースとツールの集合です。IPDK には、対 象言語版の再配布可能ファイル一式、ディストリビューション ウィザード用の 対象言語版ファイル一式、および作成したアプリケーションを別の言語用に自動 的にパッケージ化し直したり、Visual Basic でコンパイルされた .exe、.dll、 および .ocx ファイルのロケール ID (LCID) を変更したりするためのツールが 含まれています。 ※IPDKツール http://homepage2.nifty.com/nihon-nouen/programming-freeware.htm#Programming

参考URL:
http://www02.so-net.ne.jp/~okuda/tech/findlang.html
crm
質問者

お礼

遅くなりまして申し訳ございません。 ありがとうございます。 取り急ぎお礼を申し上げます。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

私にとってはタイムリーな話題です。 現在、二ヶ国で開発をしております。 同じIDをふって、二ヶ国語(JPN/US)を同時に、それぞれのストリングテーブルに登録しております。 英語版OS環境が無いので、実際に調査したわけではありませんが、こちらで登録したストリングテーブルに対して、US側からの苦情が出ていませんので、問題なく使えているものだと思っております。 もう一度わかりやすく書いてもらえませんか? 1.現在のストリングテーブルのテーブル数(データ数ではないですよ) 2.それぞれのテーブルの言語種類(その中に日本語テーブルは存在するのかどうかが特に知りたい) 3.コンパイル環境 4.実行OS環境 それとVCが入っているかどうかも知りたいです。 言語設定が正しいかどうかを調査しやすくなります。 >それともAPIで何か特別な設定等を行わなければならないのでしょうか 必要ないと思いますよ^^

crm
質問者

お礼

ありがとうございます。 取り急ぎお礼を申し上げます。 午前中に補足欄へ詳細を記述いたします。

crm
質問者

補足

変身が遅くなりまして申し訳ございません。 早速ですが、ご質問の内容は下記のとおりです。 >1.現在のストリングテーブルのテーブル数 >(データ数ではないですよ) テーブル数は5です。 1. 英語 2. フランス語 3. ドイツ語 4. イタリア語 5. スペイン語 >2.それぞれのテーブルの言語種類 >(その中に日本語テーブルは存在するのかどうかが特に知りたい) 日本語は未登録です。 日本語(DBCS)が登録されているとどうなるのでしょうか? 1. U.S. 2. フランス 3. ドイツ 4. イタリア 5. トラディショナルソート >3.コンパイル環境 Win2000英語版 ServicePack?? VB6.0英語版 ServicePack5.0 >4.実行OS環境 Win2000英語版 ServicePack?? >それとVCが入っているかどうかも知りたいです。 >言語設定が正しいかどうかを調査しやすくなります。 コンパイル環境にはVC++6.0ServicePack5.0が インストールされています。どのように使うのでしょうか? 気になる点があります。(全て英語版) "現在ユーザー設定"を変更しVBのデバッグモード(ステップイン F8)で動作 させた場合には、期待している結果が得られます。(対応するテーブルから ロードされているの意)しかしコンパイルされた実行形式ですとNGとなりま す。 この違いは、VB自体がGetUserDefaultLCID()APIなどにより現在のロケー ル情報をもとに実行されているか否かなのでしょうか? (デバッグモードではロケールを反映?、実行形式では反映せず?) 上記の理由からSetThreadLocale()APIをコールしてみました。 結果はOKとなってしまいました。 結局のところ、複数のストリングテーブルを設定した場合は、アプリケー ション内でロケールを設定(OS全体に影響する"現在のユーザー設定"で はなくそのアプリケーションが使用するロケールの意)しなければならない のでしょうか? * 英語版で作成した2つのストリングテーブル(JPN/English(U.S))を持つ実 行形式を、日本語版Win2000で実行した場合には、上記のようなAPIをコールしなくても期待するテーブルからロードするようです。(その逆も同様です) おそらく、"システムの言語設定"が異なる場合はOKとなるようです。 どうぞ宜しくお願い致します。

関連するQ&A

  • ロケールに対応するストリングテーブルの参照について

    こんにちは。初歩的な質問かもしれませんが、お分かりの方は是非ご教授願います。以前にもロケールとストリングテーブルについてのQAがNo.445463でされていますが、こちらで出された回答と現象が違うかもしれませんので、書いてみました。 <現象> 開発環境上(VisualBasic6.0Enterprise)でストリングテーブルを日本語と英語(U.S.)の2つ設定し、同環境上でロケールを日本語⇔英語切替を行いながらデバッグ実行をしました。その際はロケールに対応したストリングが呼び出され、該当した言語で表現されました。 しかし、実際作成したexeにて同様の実行を行ったところ、必ず日本語のストリングが呼び出されてしまい。英語ロケール時に英語テーブルが呼ばれません。 <OS環境> コンパイル・実行ともにWindows2000professional(日本語版・ロケールも日本語)です。 No.445463の方の例を忠実に手直ししようと思いましたが、多言語テーブルの場合とちょっと違う気がします。この現象を解決するにはどうすればよろしいのでしょうか?あと、自分の解釈ではロケールとは"地域のオプション"の"全般"タブにあるコンボのことだと思うのですが、他にも設定が必要なんでしょうか? ご回答、よろしくお願いします。

  • システムロケールの設定について教えて下さい。

    システムロケールの設定について教えて下さい。 英語版のWindows Vistaを使っています。 今までずっとシステムロケールは Japan (Japanese)で使用していたのですが、 とある米国製のソフトウエアをインストールしたところ、 そのソフトウエア上の文字は空白になってしまい、全く読めませんでした。 そこでシステムロケールを English (United States)に変更すると、 そのソフトウエア上でも問題なく英語が表示されるようになりました。 しかしこのロケールのままだと、 使用している日本語版のFirefoxのツールバーが文字化けしてしまい都合が悪いです。 画面上で、英語も日本語も正確に表示できるような設定はありますでしょうか。 よろしくお願いします。

  • 入力ロケールの設定方法

    以前 Windows 2000 の英語版に日本語IMEをのっけて使用していました。その時はAlt+Shiftか何かで英語⇔日本語と入力ロケールの切り替えをしていました。 今は98SEの日本語版を使っています。同じようにロケールの切り替えができるようにしたいのですが、当時どうやってそう設定したか覚えてません。また98SEの場合は具合が違ってくるのかな?とかも思います。 どなたか教えて頂けないでしょうか。

  • Excel2013のロケール設定について

    PCはVAIO Fit 15 SVF15A17CJ、OSはWin8を使用しています。 いつ頃からか把握していないのですが、 Excel2013にてセルの書式設定を変更して曜日を表示しようとすると 中国語の曜日名で表示されるようになってしましました。 タイムゾーンの設定等も確認したのですが、東京のままでした。 そもそも、設定を変更するというようなこともなかったので 思い当たる原因がなく困惑しています。 ユーザー定義でロケールIDを設定すれば日本語での表示ができる というのはわかるのですが、 不便なのでできればもとに戻したいです。 確認すべき設定や対策方法などご存知の方がいらっしゃいましたら、 ぜひご教示ください。

  • Excel 2002 [ロケール]既定値の変更

    Windows XP で使用していた Office XP をアンインストールして、Windows 7 にすでにインストールしています。 Excel 2002 [書式]→[セル]→[表示形式]の[分類]として“日付”あるいは“時刻”を選択したとき[ロケール]が“英語(U.S.)”になっています。(添付図左) ここを既定値で“日本語”となるように(添付図右)するにはどうしたらよろしいでしょうか? ちなみに、Excel を終了したままて、Excel10.xlb を削除した後に Excel を起動しても当該現象は変わりません。 http://okwave.jp/qa/q6675744.html

  • 起動時に"既定のシステムプログラムをログオンをしました"という趣旨のエラーがでます

    お世話になります。 現在、Win2000Pro SP4を利用していますが、一番最初の"個人設定をロードしております"の上に"ユーザープロファイルを読み込めませんでした。既定のシステムプログラムをログオンをしました"という趣旨のエラーがでます。 どのように対処したらよいのでしょうか? 宜しくお願いいたします。

  • システムロケールを変えると文字化け発生。

    はじめまして。私は現在、中国に住んでいます。 日本で購入したWindows7(日本語版)のPCで中国のサイト(ショッピングや銀行)を利用すると、 文字化けをしてしまいます。 そこで、コントロールパネル⇒言語からシステムロケールを中国語に変更したところ、 サイトの閲覧はできるようになったのですが、日本のGameなどをDLし解凍をすると ファイル名と中身が文字化けしてしまう現象が発生しました。 これを防ぐための方法をご存知の方がいらっしゃったら教えてください。 よろしくお願いします。

  • stringクラスついて

    http://www.kumei.ne.jp/c_lang/cpp/cpp_62.htm この講座にある以下のコード(一部改変)を 実行しようとVisualStudio2005/WinXP環境で cppコンソールアプリケーションとして コンパイルしたところ、エラーが出てコンパイルできませんでした。 色々試行錯誤してみましたが、どうしても上手くいきません。 BorlandC/C++5.5コンパイラでは普通にコンパイルできましたが・・。 ひょっとしてMSのWin32に対応したstringクラスが他に用意されているのでしょうか? #include <iostream> #include <string> using namespace std; int main() { string s, t, u; s = "苗字"; t = "名前"; u = s + t; cout << u << endl; return 0; }

  • 英語VISTAに入れた日本語officeXPを英語表示したい

    海外在住。 東芝製 英語版VISTAを購入。これにはMS-OFFICEの60日体験版が入っていたため、体験版を削除後、私が日本から持ってきた(今は使用していない)パッケージ XP用のOffice Proffesinalを、ロケールを変更してインストールした。 日本語officeとして問題無く動いているがPC使用者は英語のため、メニュー表示を英語にしたい。 オフィスツール・言語設定を実行しようとすると、途中で”Fatal error”が出て前に進めない。 何か方法はありませんか? 

  • CentOS5.3のロケールのデフォルト en(英語)を、ja(日本語

    CentOS5.3のロケールのデフォルト en(英語)を、ja(日本語)に変更したい。 /etc/sysconfig/i18n の値は、LANG=ja_JP.UTF-8 になっています。 しかしながら、一部の日本表記が、英語表記に自動変換されます。 日曜日 → sunday 日付 yyyy/mm/dd → mm/dd/yyyy という具合に 何処の設定が、好ましくないのでしょうか? ご教授宜しくお願いします。

専門家に質問してみよう