Delphi 10.4本地化问题
Delphi 10.4 localization issues
我正在尝试 Delphi 10.4。本地化 Windows 应用程序在过去非常有效,但现在当我动态加载 RC DLL 文件时,它只会更改 RCDATA,而不再是“String Table”。
我正在使用此代码(作为快速简历)
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
....
CurModule.ResInstance := NewInstance;
FileName
是我可以用“Resource Hacker”软件编辑的具有资源(RCDATA和“String Table”)的DLL文件,可以看到它包含“String table" 内部符合预期。
它适用于 RCDATA(所有形式都得到翻译)但不再包含在任何 .pas
文件的 Resourcestring
部分中的“String table”,以及所有字符串保留原始语言。
它在以前的 Delphi 版本(如 10.2)中工作正常,我不知道为什么它在这个版本中失败。
核心问题
问题是资源字符串现在被缓存了,加载新资源数据后您无权清除缓存:(
见https://quality.embarcadero.com/browse/RSP-30853
(如果您认为必须修复,请投下一票)
Work-around
我将资源字符串缓存机制“克隆”到一个单独的单元中,并将 re-routed LoadResStringFunc
克隆到我的克隆单元中。这里我允许访问resstringcache,这样可以在加载新资源后清除它。
还有一个解决办法。通过将 LoadResStringFunc 分配给 nil 来禁用新的缓存。一个好的地方是在程序的开头。
begin
>>> ADD THIS to disable the caching
LoadResStringFunc := nil;
>>>
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
我正在尝试 Delphi 10.4。本地化 Windows 应用程序在过去非常有效,但现在当我动态加载 RC DLL 文件时,它只会更改 RCDATA,而不再是“String Table”。
我正在使用此代码(作为快速简历)
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
....
CurModule.ResInstance := NewInstance;
FileName
是我可以用“Resource Hacker”软件编辑的具有资源(RCDATA和“String Table”)的DLL文件,可以看到它包含“String table" 内部符合预期。
它适用于 RCDATA(所有形式都得到翻译)但不再包含在任何 .pas
文件的 Resourcestring
部分中的“String table”,以及所有字符串保留原始语言。
它在以前的 Delphi 版本(如 10.2)中工作正常,我不知道为什么它在这个版本中失败。
核心问题 问题是资源字符串现在被缓存了,加载新资源数据后您无权清除缓存:(
见https://quality.embarcadero.com/browse/RSP-30853 (如果您认为必须修复,请投下一票)
Work-around
我将资源字符串缓存机制“克隆”到一个单独的单元中,并将 re-routed LoadResStringFunc
克隆到我的克隆单元中。这里我允许访问resstringcache,这样可以在加载新资源后清除它。
还有一个解决办法。通过将 LoadResStringFunc 分配给 nil 来禁用新的缓存。一个好的地方是在程序的开头。
begin
>>> ADD THIS to disable the caching
LoadResStringFunc := nil;
>>>
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.