2013-07-04 36 views
7

Trên Win7 có giao diện người dùng được bản địa hóa, error_code::message() trả về một thông báo không phải tiếng Anh. Theo như tôi thấy (trong Boost 1,54, cho system_error_category), hàm trên nắm để gọi WinAPI sau:Cách tăng :: hệ thống :: error_code :: tin nhắn bằng tiếng Anh?

DWORD retval = ::FormatMessageA( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS, 
    NULL, 
    ev, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
    (LPSTR) &lpMsgBuf, 
    0, 
    NULL 
); 

Làm thế nào để có được trên FormatMessage để trả lại một thông điệp bằng tiếng Anh? Tôi đã cố gắng thiết lập miền địa phương, cả hai với chức năng std và với SetThreadLocale - nó không giúp được gì.

Cập nhật: Chỉ cần làm rõ: về cơ bản, câu hỏi của tôi là cách "ghi đè" lập trình user default language và tại sao đặt ngôn ngữ là không đủ.

Trả lời

1

Khi đoán, bạn cần chỉ định tiếng Anh cho dwLanguageId thay vì ngôn ngữ mặc định. Ví dụ .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

hoặc, nếu bạn muốn đặc biệt tiếng Anh-Mỹ:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

Lưu ý rằng điều này sẽ thất bại nếu thông điệp trong ngôn ngữ đặc biệt là không có mặt. Vì vậy, bạn có thể muốn xử lý ERROR_RESOURCE_LANG_NOT_FOUND và thử gọi lại bằng dwLanguageId=0.

Để biết thêm thông tin, see MSDN.

+1

Như tôi đã đề cập, đó không phải mã của tôi, mà là Boost.System gọi là 'FormatMessage'. –

+0

Vâng, hãy viết hàm của riêng bạn sau đó. Nó không khó. –

+0

Patching Boost là một lựa chọn, nhưng tôi muốn có một giải pháp sạch hơn. Trên thực tế, câu hỏi đặt ra là liệu có thể ghi đè (LANG_NEUTRAL, SUBLANG_DEFAULT), tức là "Ngôn ngữ mặc định của người dùng" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85)) .aspx). Không nên địa phương chủ đề hoặc địa phương toàn cầu ảnh hưởng đến nó? –

3

Đã tìm kiếm trên internet để tìm giải pháp và cuối cùng tìm thấy this. Về cơ bản, bạn nên gọi SetThreadUILanguage trong số main/WinMain của mình.

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