2009-03-02 25 views
6

Tôi đang bản địa hóa ứng dụng MFC thành tiếng Nhật và có các tài nguyên hoạt động đúng.Tôi làm cách nào để dịch các hộp thư MFC

Vấn đề hiện tại của tôi là khi tôi sử dụng AfxMessageBox hoặc MessageBox, tiêu đề hộp thoại và thông báo nút xuất hiện bằng tiếng Anh và tôi không tìm thấy nơi nào để thay đổi điều đó.

Tôi chưa tìm thấy bất kỳ điều gì hữu ích khi tìm kiếm MSDN hoặc Google.

Vì vậy,

Tính năng này có hoạt động không? Windows có đưa ra các nút "OK" hoặc "Có/Không" bằng tiếng Nhật, tiếng Ả Rập và tiếng Nga không?

Nếu không, tôi phải chỉ định điều gì để thay đổi những điều này?

Chỉnh sửa: Tôi đã đi với MessageBoxEx, viết một lớp trình bao bọc để làm cho nó thuận tiện để sử dụng làm AfxMessageBox. Có vẻ như MB_OK xuất hiện dưới dạng "OK" bằng cả tiếng Anh và tiếng Nhật, nhưng các tùy chọn nút khác như MB_YESNO được dịch sang thứ mà tôi cho là đúng tiếng Nhật. Đây là một ứng dụng khá nhỏ để dịch, và chúng ta có thể muốn sử dụng một cái gì đó tự động cho những cái lớn hơn.

Trả lời

5

Sử dụng MessageBoxEx và chỉ định trường WORD wLanguageId.

wLanguageId [in] Chỉ định ngôn ngữ cho văn bản được hiển thị trong hộp tin nhắn nút. Chỉ định giá trị bằng(0) cho biết để hiển thị nút văn bản bằng ngôn ngữ hệ thống mặc định. Nếu tham số này là MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL), thì ngôn ngữ hiện tại được kết hợp với chuỗi gọi là được sử dụng.

Để chỉ định ngôn ngữ khác với ngôn ngữ hiện tại, hãy sử dụng macro MAKELANGID để tạo thông số này. Để biết thêm thông tin, hãy xem MAKELANGID.

Thông tin thêm về MAKELANGID có thể tìm thấy tại đây.


Nếu điều này không hoạt động tốt cho bạn, cách khác là tạo hộp thoại của riêng bạn.

+0

** MessageBoxEx ** hiện bỏ qua lang arg. Vì vậy, không tốt hơn rằng ** MessageBox ** và bạn vẫn có vấn đề nội địa hóa ... Từ MSDN: * Các nút bằng ngôn ngữ của giao diện người dùng hệ thống. Hiện tại MessageBoxEx và MessageBox hoạt động theo cùng một cách. * – gavenkoa

2

Tiêu đề là chuỗi bạn chỉ định, vì vậy bạn có thể dịch nó. Trong AfxMessageBox(), tiêu đề là tên ứng dụng (AfxGetAppName() IIRC).

Về các nút, văn bản là một phần của hệ điều hành và không thể dịch được.

MessageBoxEx (được Brian nhắc đến) chưa bao giờ làm việc tốt về hỗ trợ ngôn ngữ. This MS KB article từ hơn một thập kỷ trước cho biết id ngôn ngữ sẽ được hỗ trợ chính xác bởi Windows 2000. Nhưng rõ ràng là không bao giờ thực hiện nó thông qua.

Vì vậy, bạn đang khá nhiều may mắn. Giải pháp duy nhất của bạn là sử dụng triển khai của bên thứ ba chẳng hạn như xuất sắc XMessageBox và cung cấp bản dịch thông qua bảng chuỗi của bạn.

Lưu ý rằng chú giải thuật ngữ của appTranslator chứa các từ như Có, không, hủy, ... bằng 25 ngôn ngữ và sẽ dịch chúng tự động.

+0

FWIW, MessageBoxEx đã thực hiện thủ thuật độc đáo trong trường hợp của tôi. –

+0

Xin chào David, tôi đã thử MessageBoxEx nhưng nó không làm việc cho tôi. Tôi có cần thêm "gói ngôn ngữ" để làm cho nó hoạt động không? –

1

Tạo của riêng bạn l10n macro/hàm và sử dụng mã này:

 
static LRESULT __stdcall ChangeCaptions(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HCBT_ACTIVATE) { 
     SetWindowText(GetDlgItem((HWND) wParam, IDOK), L10N(GUI_OK_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDCANCEL), L10N(GUI_CANCEL_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDYES), L10N(GUI_YES_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDNO), L10N(GUI_NO_MSG)); 
    } 
    return 0; 
} 

int addon_gui_messagebox(HWND parentHWnd, HINSTANCE hInstance, void *text, void *caption, int type) 
{ 
    int ret; 
    hook = SetWindowsHookEx(WH_CBT, ChangeCaptions, hInstance, GetCurrentThreadId()); 
    ret = MessageBox(parentHWnd, text, caption, type); 
    UnhookWindowsHookEx(hook); 
    return ret; 
} 

Như tôi đã viết trước đây hiện MessageBoxEx phớt lờ lang arg.

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