RichEditのサンプルプログラムに付属するreinit.pasを使用し、resourcestringで定義している翻訳文字列が動的に切り替わらない

提供: Support
移動先: 案内検索

対象となる製品

  • 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;
..
..


関連情報