6

Có cách nào để có được một mô tả cục bộ của một phím tắt như Ctrl + Z vì vậy mà tôi nhận được "Ctrl + Z" nếu ứng dụng chạy trên một hệ thống tiếng Anh và "Strg + Z "trên hệ thống của Đức?Delphi: Cách bản địa hóa mô tả cho lối tắt menu?

Chức năng VCL ShortCutToText không được quốc tế hóa. Chức năng API GetKeyNameText tốt hơn một chút nhưng vẫn không hoàn hảo: Nếu một thiết bị chuyển mạch các thiết lập vùng của một XP của Đức sang tiếng Anh (Mỹ), nó vẫn tạo ra các văn bản tiếng Đức. Bên cạnh đó kết quả là trong VỐN mà là xấu xí.

Làm rõ: Tôi biết cách tôi có thể thay thế chuỗi tài nguyên ShortCutToText hoặc Smkc * bằng các phiên bản tùy chỉnh. Nhưng để sử dụng tôi cần các chuỗi dịch. Và tôi muốn nhận những thứ này từ hệ điều hành (hoặc tương tự).

Cập nhật: Có vẻ như Microsoft hy vọng các nhà phát triển tự thực hiện bản dịch - xem 2. trong Associating a Menu Item with an Accelerator Key. Trích:

Ví dụ, để gán tổ hợp phím CTRL + O để mở lệnh trên menu File, bạn chỉnh sửa chú thích vào mục menu để nó trông như thế này:

Open \ tCtrl + O

Mục menu trong trình chỉnh sửa Menu được cập nhật để phản ánh chú thích mới khi bạn nhập.

Lưu ý rằng phím tắt được thêm thủ công vào phụ đề.

+1

Tôi tin rằng điều này có nghĩa là các trình đơn được vẽ chủ sở hữu sẽ được vẽ không chính xác trong các hệ thống Delphi với bàn phím không phải tiếng Anh vì mã trong Menus.pas sử dụng 'ShortCutToText'. Đó là khá lame trong quan điểm của tôi. –

+0

@David: Đó là lý do tôi hỏi - khách hàng không phải người Đức của chúng tôi phàn nàn về Strg + Z, v.v. trong các menu của họ. Họ muốn ít nhất Ctrl + Z hoặc - thậm chí tốt hơn tất nhiên - tương đương với ngôn ngữ của họ. Và điều này xảy ra ngay cả với các menu không phải chủ sở hữu (với D2007). –

+0

Còn gì nữa, nếu họ chỉ dừng sử dụng các menu vẽ của chủ sở hữu (vì Vista bạn không cần chủ sở hữu vẽ để lấy nét vẽ) thì hệ thống sẽ sắp xếp nó ra. –

Trả lời

1

Tôi sẽ trả lời câu hỏi của riêng mình để tôi có một cái gì đó để chấp nhận: Có vẻ như Microsoft hy vọng các nhà phát triển tự làm bản dịch - xem 2. trong Associating a Menu Item with an Accelerator Key.Trích:

Ví dụ, để gán tổ hợp phím CTRL + O để mở lệnh trên menu File, bạn chỉnh sửa chú thích vào mục menu để nó trông như thế này:

Open \ tCtrl + O

Mục menu trong trình chỉnh sửa Menu được cập nhật để phản ánh chú thích mới khi bạn nhập.

Lưu ý rằng phím tắt được thêm thủ công vào phụ đề.

3

ShortCutToText sử dụng mảng MenuKeyCaps. Điều này không thể được sửa đổi trực tiếp (vì nó nằm trong việc triển khai thực đơn đơn vị), nhưng mảng được lấp đầy với tổ tiên lại có thể được dịch bằng nhiều công cụ dịch thuật khác nhau.

Bạn cần dịch hằng số tạo lại SmkcCtrl, nằm trong consts.pas (tùy thuộc vào phiên bản Delphi của bạn).

[sửa]

Hoặc bạn có thể tải BigProcHook.pas, mà tôi tạo ra quá chức năng móc và thay thế chúng bằng cách riêng của bạn. Sau đó bạn có thể viết ghi đè gọi hàm ShortCutToText thông thường và thay thế văn bản 'Ctrl' bằng 'Strg' (hoặc ngược lại) mà không cần trình đơn biết ngay. Nhưng tôi sẽ sử dụng nó như một phương sách cuối cùng, bởi vì tôi nghĩ tốt hơn là chỉ dịch tài nguyên. Nếu bạn muốn sử dụng móc, tải xuống và bao gồm các đơn vị, và thêm mã sau trong bất kỳ đơn vị (một đơn vị riêng biệt, mới nếu bạn thích).

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. 

Nó sẽ thay thế Ctrl trong văn bản phím tắt bằng bất kỳ văn bản nào bạn thích mà không phải thay đổi bất kỳ mã nào khác.

+0

Ah, nevermind. Tôi đã bỏ qua phần làm rõ và cập nhật. – GolezTrol

+0

Cảm ơn bạn đã liên kết. :-) –

+0

Sau một sự chậm trễ không đáng kể :-) Tôi chỉ mới bắt đầu sử dụng giải pháp BigProcHook vì chúng tôi muốn dịch tại thời gian chạy (HookResourceString), và điều đó không làm việc với việc triển khai VCL vì MenuKeyCaps là một mảng 'của chuỗi'. Cảm ơn một lần nữa! –

Các vấn đề liên quan