Delphi:如何本地化菜单快捷方式的描述?
有没有办法获得像Ctrl Z这样的快捷方式的本地化描述,以便如果应用程序在英语系统上运行并且在德语系统上运行“Strg Z”,我会得到“Ctrl Z”?
VCL函数ShortCutToText未国际化. API函数GetKeyNameText有点好但仍然不完美:如果将德语XP的区域设置切换为英语(美国),它仍会生成德语文本.除了结果是资本,这是丑陋的. 澄清:我知道如何用自定义版本替换ShortCutToText或Smkc *资源字符串.但要使用它我需要翻译的字符串.我想从OS(或类似的)获得这些. 更新:看起来微软希望开发人员自己进行翻译 – 请参阅Associating a Menu Item with an Accelerator Key中的2. Quote:
请注意,快捷方式将手动附加到标题. 解决方法
ShortCutToText使用MenuKeyCaps数组.这不能直接修改(因为它是在菜单单元的实现中),但是数组中充满了可以使用各种翻译工具翻译的资源字符串.
你需要翻译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,而无需更改任何其他代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |