質問: ロケールに対応するストリングテーブルの参照について こんにちは。初歩的な質問かもしれませんが、お分かりの方は是非ご教授願います。以前にもロケールとストリングテーブルについてのqaがno.445463でされていますが、こちらで出された回答と現象が違うかもしれませんので、書いてみました。 <現象> 開発環境上(visualbasic6.0enterprise)でストリングテーブルを日本語と英語(u.s.)の2つ設定し、同環境上でロケールを日本語⇔英語切替を行いながらデバッグ実行をしました。その際はロケールに対応したストリングが呼び出され、該当した言語で表現されました。 しかし、実際作成したexeにて同様の実行を行ったところ、必ず日本語のストリングが呼び出されてしまい。英語ロケール時に英語テーブルが呼ばれません。 コンパイル・実行ともにwindows2000professional(日本語版・ロケールも日本語)です。 no.445463の方の例を忠実に手直ししようと思いましたが、多言語テーブルの場合とちょっと違う気がします。この現象を解決するにはどうすればよろしいのでしょうか?あと、自分の解釈ではロケールとは"地域のオプション"の"全般"タブにあるコンボのことだと思うのですが、他にも設定が必要なんでしょうか? ご回答、よろしくお願いします。
回答: 質問者が履歴で挙げた過去スレに答えていた者です。 前回の質問は、 開発環境:us版os 実行環境:多国(日本語は含まない) という状況でした。 悲しい事にそんな環境が手元にあるわけもなく、 「日本語版での環境で、日本語テーブルを含まない、複数のストリングテーブル」 を対象にした方法を述べたつもりです。 今回の場合は、前回の質問とちょっと違います。 「日本語版での環境で、日本語テーブルを含む、複数のストリングテーブル」 です。 そうであれば、特にリソースをスクリプト化する必要もありません。 手元にサンプルがあったのでサンプルを載せておきます。 ※注意事項----------非常に大事----------- デバッグ環境だと、対応しないので、exeの状態で試してみてください。 ※注意事項----------非常に大事----------- ちなみに 日本語ロケールid:1041 英語usロケールid:1033 です project1.vbp(プロジェクト) ├module1.bas(モジュール) └test.res(リソース) *****module1.basの内容***** option explicit public declare function getuserdefaultlcid lib "kernel32" () as long public declare function setthreadlocale lib "kernel32" (byval locale as long) as long public const api_false = &h0& sub main() dim lngnowlcid as long '//現在のロケールid dim lngnewlcid as long '//入力後のロケールid dim strret as string '//インプットボックス戻り '地域のオプションでセットされているロケールを取得する lngnowlcid = getuserdefaultlcid do strret = inputbox("現在のロケールは[" & lngnowlcid & "]です", _ "ロケールidを指定してください。", lngnowlcid) '数値のみ対応 if not isnumeric(strret) then exit sub end if lngnewlcid = clng(strret) '取得したロケールを、現在のスレッドにセット if api_false = setthreadlocale(lngnewlcid) then 'ロケール設定エラー msgbox "ロケール設定に失敗", vbcritical or vbokonly else 'リソースを読んで表示 msgbox loadresstring(101), vbinformation or vbokonly end if loop end sub *****test.resの内容***** 構成:日本語テーブル/英語(u.s.)テーブルの計2つのテーブル id:101 内容:日本語テーブル側の文字列="日本語"/英語(u.s.)テーブル側の文字列="english" それと、、、 >同環境上でロケールを日本語⇔英語切替を行いながらデバッグ実行をしました。 >その際はロケールに対応したストリングが呼び出され、該当した言語で表現されました。 とありますが、おそらくvbは デバッグでは、getuserdefaultlcid 関数(コンパネで設定されたロケールid) exeでは、getsystemdefaultlcid 関数(osが持っているロケールid) を使用しているからだと、勝手に思っています。(違っていたらゴメソ)