有没有办法获得像 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
菜单编辑器中的菜单项会更新以反映新标题 当你输入它时。
请注意,快捷方式会手动附加到标题。
答案 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
菜单编辑器中的菜单项会更新以反映新标题 当你输入它时。
请注意,快捷方式会手动附加到标题。