【问题标题】:Delphi 10.4 localization issuesDelphi 10.4 本地化问题
【发布时间】:2021-02-20 18:41:01
【问题描述】:

我正在尝试 Delphi 10.4。本地化 Windows 应用程序在过去就像一个魅力,但现在当我动态加载 RC DLL 文件时,它只更改 RCDATA,而不再更改“字符串表”。

我正在使用此代码(作为快速恢复)

NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE); 
....
CurModule.ResInstance := NewInstance;

FileName 是一个 DLL 文件,其中包含我可以使用“Resource Hacker”软件编辑的资源(RCDATA 和“String Table”),并且可以看到它包含“String table”里面的预期。

它适用于 RCDATA(所有表单都已翻译),但不再适用于任何 .pas 文件的 Resourcestring 部分中包含的“字符串表”,并且所有字符串都保留为原始语言。

它在以前的 Delphi 版本(如 10.2)中运行良好,但我不知道为什么在这个版本中它会失败。

【问题讨论】:

    标签: delphi localization delphi-10.4-sydney


    【解决方案1】:

    还有另一种解决方案。通过将 LoadResStringFunc 分配给 nil 来禁用新的缓存。一个很好的地方是在程序的开头。

    begin
    >>> ADD THIS to disable the caching
      LoadResStringFunc := nil;
    >>>
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    

    【讨论】:

    • 遗憾的是,它使资源字符串的处理速度变慢了很多。但我同意它有效。
    • 与新实现相比速度较慢,但​​与 10.4.1 之前的 Delphi 版本相比同样快
    【解决方案2】:

    核心问题 问题是资源字符串现在被缓存了,并且在加载新资源数据后您无权清除缓存:(

    https://quality.embarcadero.com/browse/RSP-30853 (如果您认为必须修复,请投下一票)

    解决方法 我将资源字符串缓存机制“克隆”到一个单独的单元中,并将LoadResStringFunc 重新路由到我的克隆单元。这里我允许访问 resstringcache,因此可以在加载新资源后清除它。

    【讨论】:

    • 资源字符串的缓存方式” - 遗憾的是,10.4 文档中的任何地方或 10.4 中解决的 QP 票证列表中都没有提到这一点。对于本地化应用的用户来说,这似乎是一个相当大的变化。
    • 我认为首先不在单独的单元中创建资源字符串缓存机制是个坏主意。如果他们这样做了,Emb 会自己发现这个问题。我想。
    • 这样的更改应该在主要版本更改中完成,而不是次要版本。现在没有很好的方法来调整你的代码以兼容 10.4 和 10.4.1,因为编译器版本是相同的。
    • @Jaska 确实如此。不在RTLVersion 中,也不在Compilerversion 中。叹息。
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2010-12-16
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2011-02-18
    • 2011-07-11
    相关资源
    最近更新 更多