Delphi:如何本地化菜单快捷方式的描述?

时间:2011-01-05 13:39:42

标签: delphi localization internationalization keyboard-shortcuts shortcut

有没有办法获得像 Ctrl + Z 这样的快捷方式的本地化描述,以便我得到“ Ctrl + Z “如果应用程序在英语系统上运行,并且” Strg + Z “在德国系统上运行?

VCL函数ShortCutToText未国际化。 API函数GetKeyNameText有点好但仍然不完美:如果将德语XP的区域设置切换为英语(美国),它仍会生成德语文本。除了结果在资本中这是丑陋的。

澄清:我知道如何用自定义版本替换ShortCutToText或Smkc *资源字符串。但要使用它我需要翻译的字符串。我想从OS(或类似的)获得这些。

更新:看起来微软希望开发人员自己进行翻译 - 请参阅Associating a Menu Item with an Accelerator Key中的2.引用:

  

例如,要将CTRL + O指定给“文件”菜单上的“打开”命令,   你修改菜单项的标题,使它看起来像这样:

     

打开\ TCTRL + O

     

菜单编辑器中的菜单项会更新以反映新标题   当你输入它时。

请注意,快捷方式会手动附加到标题。

2 个答案:

答案 0 :(得分:3)

ShortCutToText使用MenuKeyCaps数组。这不能直接修改(因为它是在Menus单元的实现中),但是数组中充满了 resourcestrings ,可以使用各种翻译工具进行翻译。

你需要翻译smkcCtrl resourcestring常量,它在consts.pas中(取决于你的Delphi版本)。

[编辑]

或者您可以下载BigProcHook.pas,我创建了太多钩子函数并将其替换为您自己的函数。然后,您可以编写一个覆盖调用常规ShortCutToText函数的覆盖,并将文本'Ctrl'替换为'Strg'(反之亦然),而菜单甚至不知道它。 但我会把它作为最后的手段,因为我觉得翻译资源更好。如果您想使用钩子,请下载并包含该单元,并在任何单元中添加以下代码(如果您愿意,可以单独添加新单元)。

uses
  BigProcHook, Menus;

var
  FHook: TBigProcHook;

// The replacement function
function MyShortCutToText(ShortCut: TShortCut): string;
begin
  FHook.Hooked := False;
  try
    Result := ShortCutToText(ShortCut);
    Result := StringReplace(Result, 'Ctrl', 'Whatever', []);
  finally
    FHook.Hooked := True;
  end;
end;

initialization
  FHook := TBigProcHook.Create(@ShortCutToText, @MyShortCutToText);
finalization
  FHook.Hooked := False;
  FHook.Free;
end.

它将用您喜欢的任何文本替换快捷方式文本中的Ctrl,而无需更改任何其他代码。

答案 1 :(得分:1)

我会回答我自己的问题,以便我有所接受:看起来微软希望开发人员自己进行翻译 - 请参阅Associating a Menu Item with an Accelerator Key中的2.引用:

  

例如,要将CTRL + O指定给“文件”菜单上的“打开”命令,   你修改菜单项的标题,使它看起来像这样:

     

打开\ TCTRL + O

     

菜单编辑器中的菜单项会更新以反映新标题   当你输入它时。

请注意,快捷方式会手动附加到标题。