加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:51:44 所属栏目:大数据 来源:网络整理
导读:有没有办法获得像Ctrl Z这样的快捷方式的本地化描述,以便如果应用程序在英语系统上运行并且在德语系统上运行“Strg Z”,我会得到“Ctrl Z”? VCL函数ShortCutToText未国际化. API函数GetKeyNameText有点好但仍然不完美:如果将德语XP的区域设置切换为英语(
有没有办法获得像Ctrl Z这样的快捷方式的本地化描述,以便如果应用程序在英语系统上运行并且在德语系统上运行“Strg Z”,我会得到“Ctrl Z”?

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

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

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

For example,to assign CTRL+O to the Open command on the File menu,
you modify the menu item’s caption so that it looks like this:

OpentCtrl+O

The menu item in the Menu editor is updated to reflect the new caption
as you type it.

请注意,快捷方式将手动附加到标题.

解决方法

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,而无需更改任何其他代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读