質問者が履歴で挙げた過去スレに答えていた者です。
前回の質問は、
開発環境: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)
を使用しているからだと、勝手に思っています。(違っていたらゴメソ)
お礼
TAGOSAKU7さん、お忙しいところの即レスにもかかわらずお返事遅くなり申し訳ありません。 文字化けに関してですが、前回教えていただいたロジックを実行したときに起こったことなのですが、「日本語」または「ENGLISH」をストリングテーブルから参照しダイアログで表示するとき、開発環境にてシステムロケール=英語(U.S.)だと「ENGLISH」と表示していたところ、exe実行時に「????」などのように表示されてしまうのです。フォントはダイアログmsgbox関数が持つデフォルトのものであると思われます。英語ストリングが選択されていれば「ENGLISH」と正しく表示されることが然りではないでしょうか?ちなみに他の一部のアプリケーションで同様に「?????」と表示されている個所がありました。ちなみにそのときスタートメニューは日本語で表示されてました(当たり前かも) また、実はあれからいろいろ調べていくうちに、実行時に得るロケールはexeを実行するOS自身の言語版に深く依存していることが分かりました。具体的なロジックレベルまで理解している訳ではありませんが、各国語版のOSはそれぞれネイティブの言語(UI Languageというらしいです)を内部的に持ち、その言語に基づいてストリングテーブルの選択を行うということのようです。ロジックでこれを書き換えることは不可能(または相当手間がかかる)らしいです。対応としてはMSDN上ではサテライトDLLを各言語毎に作成し、実行環境毎に個別に呼ぶ方法、他にIPDKというツールがあるようですが、現状ではまったく理解できてないのでここで詳しく述べることができません。こういったツールについてご存知でしたらヤブヘビということもありますね・・・