Delphi: Как локализовать описание для ярлыка меню? - PullRequest
6 голосов
/ 05 января 2011

Есть ли способ получить локализованное описание ярлыка, например Ctrl + Z , чтобы я получил " Ctrl + Z"если приложение работает в английской системе и" Strg + Z"в немецкой системе?

Функция VCL ShortCutToText не интернационализирована.Функция API GetKeyNameText немного лучше, но все же не идеальна: если вы переключаете региональные настройки немецкой XP на английский (США), она все равно производит тексты на немецком языке.Кроме того, результаты написаны ЗАГЛАВНЫМИ БУКВАМИ.

Уточнение: Я знаю, как можно заменить строки ресурсов ShortCutToText или Smkc * настроенными версиями.Но чтобы использовать это, мне нужны переведенные строки.И я хотел бы получить их из ОС (или аналогичной).

Обновление: Похоже, Microsoft ожидает, что разработчики сделают перевод самостоятельно - см. 2. в Связывание пункта меню с ключом ускорения .Цитата:

Например, чтобы назначить CTRL + O для команды «Открыть» в меню «Файл», измените заголовок пункта меню так, чтобы он выглядел следующим образом:

Open \ tCtrl+ O

Пункт меню в редакторе меню обновляется, чтобы отразить новую подпись по мере ее ввода.

Обратите внимание, что ярлык добавляется к заголовку вручную.

Ответы [ 2 ]

3 голосов
/ 15 января 2011

ShortCutToText использует массив MenuKeyCaps.Это не может быть изменено напрямую (потому что это в реализации модуля Menus), но массив заполнен resourcestrings , которые могут быть переведены с помощью различных инструментов перевода.

Вам необходимо перевестиконстанта строки ресурса SmkcCtrl, которая находится в consts.pas (в зависимости от вашей версии Delphi).

[edit]

Или вы можете загрузить 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 голос
/ 11 февраля 2011

Я отвечу на свой вопрос, чтобы у меня было что принять: похоже, Microsoft ожидает, что разработчики выполнят перевод самостоятельно - см. 2. в Связывание пункта меню с ключом ускорителя, Цитата:

Например, чтобы назначить сочетание клавиш CTRL + O для команды «Открыть» в меню «Файл», Вы изменяете заголовок пункта меню так, чтобы он выглядел так:

Открыть \ tCtrl + O

Пункт меню в редакторе меню обновлен, чтобы отразить новый заголовок как вы набираете его.

Обратите внимание, что ярлык добавляется к заголовку вручную.

...