6

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

Функция VCL ShortCutToText не интернационализирована. Функция API GetKeyNameText немного лучше, но все еще не идеальна: если вы переключаете региональные настройки немецкого XP на английский (США), он по-прежнему производит немецкие тексты. Кроме того, результаты находятся в CAPITALS, что является уродливым.

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

Обновление: Похоже, Microsoft ожидает, что разработчики сделают перевод самостоятельно - см. 2. в Associating a Menu Item with an Accelerator Key. Цитата:

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

Открыть \ tCtrl + O

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

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

+1

Я считаю, что это означает, что созданные владельцем меню будут неправильно отображены в системах Delphi с неанглийскими клавиатурами, поскольку код в Menus.pas использует 'ShortCutToText'. На мой взгляд, это довольно хромает. –

+0

@ Давид: Вот почему я спрашиваю: наши негерманские клиенты жалуются на Strg + Z и т. Д. В их меню. Они хотят хотя бы Ctrl + Z или, что еще лучше, - эквивалент на их родном языке. И это происходит даже с меню, не предназначенным для владельца (с D2007). –

+0

Более того, если они просто прекратят использовать меню рисования владельца (с Vista вам не нужно рисовать владельца, чтобы получить глифы), тогда система просто разобралась. –

ответ

1

Я отвечу на свой вопрос, чтобы у меня было что-то принять: похоже, Microsoft ожидает, что разработчики сами сделают перевод - см. 2. в Associating a Menu Item with an Accelerator Key.Цитата:

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

Открыть \ tCtrl + O

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

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

3

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

Вам необходимо перевести постоянную константу SmkcCtrl, которая находится в 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 в контекстном текст с любым другим текстом, без необходимости вносить изменения в любой другой код.

+0

Ах, неважно. Я пропустил разъяснение и обновление. – GolezTrol

+0

Спасибо за ссылку, тем не менее. :-) –

+0

После незначительной задержки :-) Я только начал использовать решение BigProcHook, потому что мы хотим перевести его во время выполнения (HookResourceString), и это не работает с реализацией VCL, потому что MenuKeyCaps - это «массив строки». Еще раз спасибо! –

Смежные вопросы