6

¿Hay una manera de obtener una descripción localizada de un acceso directo como Ctrl + Z de modo que consiga "Ctrl + Z" si la aplicación se ejecuta en un sistema de Inglés y "Ctrl + Z "en un sistema alemán?Delphi: cómo localizar la descripción de un acceso directo de menú?

La función VCL ShortCutToText no está internacionalizada. La función API GetKeyNameText es un poco mejor, pero aún no es perfecta: si uno cambia la configuración regional de un XP alemán a inglés (EE. UU.), Todavía produce textos en alemán. Además, los resultados están en CAPITALES, lo cual es feo.

Aclaración: Sé cómo puedo reemplazar ShortCutToText o las cadenas de recursos Smkc * con versiones personalizadas. Pero para usar eso necesito las cadenas traducidas. Y me gustaría obtener estos del sistema operativo (o similar).

Actualización: Parece que Microsoft espera que los desarrolladores hagan la traducción por su cuenta - ver 2. en Associating a Menu Item with an Accelerator Key. Cita:

Por ejemplo, para asignar CTRL + O para el comando Abrir en el menú Archivo, modifica el título del elemento de menú para que se vea así:

Open \ tCtrl + O

El elemento de menú en el editor de menú se actualiza para reflejar el nuevo título mientras lo escribe.

Tenga en cuenta que el acceso directo se agrega manualmente a la leyenda.

+1

Creo que esto significa que los menús dibujados por el propietario se dibujarán incorrectamente en los sistemas Delphi con teclados que no sean en inglés, ya que el código en Menus.pas usa 'ShortCutToText'. Eso es bastante cojo en mi opinión. –

+0

@David: Esa es la razón por la que pregunto: nuestros clientes no alemanes se quejan de Strg + Z, etc. en sus menús. Quieren al menos Ctrl + Z o, incluso mejor, por supuesto, el equivalente en su propio idioma. Y esto sucede incluso con menús no gestionados por el propietario (con D2007). –

+0

Además, si dejaran de usar los menús de dibujo de los propietarios (dado que Vista no necesita dibujar al propietario para obtener los glifos dibujados), entonces el sistema simplemente lo resolvería. –

Respuesta

1

Responderé a mi propia pregunta para que tenga algo que aceptar: parece que Microsoft espera que los desarrolladores hagan la traducción por su cuenta - vea 2. en Associating a Menu Item with an Accelerator Key.Cita:

Por ejemplo, para asignar CTRL + O para el comando Abrir en el menú Archivo, modifica el título del elemento de menú para que se vea así:

Open \ tCtrl + O

El elemento de menú en el editor de menú se actualiza para reflejar el nuevo título mientras lo escribe.

Tenga en cuenta que el acceso directo se agrega manualmente a la leyenda.

3

ShortCutToText utiliza la matriz MenuKeyCaps. Esto no se puede modificar directamente (porque está en la implementación de la unidad Menús), pero la matriz está llena de cadenas de recursos que se pueden traducir utilizando varias herramientas de traducción.

Necesita traducir la constante de cadena de recursos SmkcCtrl, que está en consts.pas (dependiendo de su versión de Delphi).

[editar]

O puede descargar BigProcHook.pas, que he creado también funciones de gancho y reemplazarlas por su cuenta. A continuación, puede escribir una anulación que llame a la función ShortCutToText regular y reemplaza el texto 'Ctrl' por 'Strg' (o viceversa) sin que el menú lo sepa. Pero usaría esto como último recurso solamente, porque creo que es mejor simplemente traducir el recurso. Si desea usar el gancho, descargue e incluya la unidad y agregue el siguiente código en cualquier unidad (una unidad nueva y separada si lo desea).

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. 

Sustituirá Ctrl en el texto de acceso directo con el texto que desee, sin tener que cambiar cualquier otro código.

+0

Ah, no importa. Me perdí la aclaración y la actualización. – GolezTrol

+0

Gracias por el enlace, sin embargo. :-) –

+0

Después de un retraso insignificante :-) Empecé a usar la solución BigProcHook porque queremos traducir en tiempo de ejecución (HookResourceString), y eso no funciona con la implementación de VCL porque MenuKeyCaps es un 'array of string'. ¡Gracias de nuevo! –

Cuestiones relacionadas