RichEditのサンプルプログラムに付属するreinit.pasを使用し、resourcestringで定義している翻訳文字列が動的に切り替わらない
対象となる製品
- Delphi 10.4.1 以降
問題
古いバージョンのDelphiには、以下のフォルダにRichEditのサンプルプログラムが提供されています。
C:\Users\Public\Documents\RAD Studio\<バージョン>\Samples\Delphi\VCL\RichEdit
※Delphiの最近のバージョンでは、上記のサンプルプログラムは提供されておりません。
このサンプルプログラムに付属するreinit.pasを使用し、英語やフランス語などの言語IDを指定すると、翻訳リソース DLL をアプリケーションの実行時に動的に切り替えることができます。詳しくは、こちらをご参照ください。
Delphi 10.4 以降のアプリケーションで、reinit.pasを使用すると、resourcestring宣言した文字列だけが、動的に切り替わらない問題が報告されております。
解決
Delphi 10.4.1では、翻訳リソースの仕様が変更されており、新しく追加されたResStringCleanupCacheメソッドを呼び出す必要があります。
https://docwiki.embarcadero.com/Libraries/Sydney/ja/System.SysUtils.ResStringCleanupCache
reinit.pasのLoadNewResourceModuleメソッド内のGetModuleFileName関数の前で、ResStringCleanupCacheメソッドを呼び出すと、resourcestring宣言した翻訳文字列が切り替わります。
以下は、reinit.pasの修正例です。
function LoadNewResourceModule(Locale: LCID): Longint;
var
FileName: array [0..260] of char;
NewName: string;
LocaleName: array[0..4] of Char;
NewInst: Longint;
begin
ResStringCleanupCache; // 10.4.1以降で使用可能
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
NewInst := 0;
Result := 0;
..
..