2009-02-20 7 views
15

Tôi khá mới đối với lập trình được bản địa hóa và tôi đang cố gắng tìm ra cách đặt ngôn ngữ ban đầu thích hợp cho ứng dụng C++ không được quản lý mới được khởi chạy (từ bên trong ứng dụng).làm cách nào để đặt ngôn ngữ ban đầu thích hợp cho chương trình C++ trên Windows?

Theo như tôi có thể nói, các ứng dụng mới bắt đầu bằng ngôn ngữ C, chứ không phải là ngôn ngữ địa phương thích hợp (tiếng Anh, tiếng Đức, v.v.). Vì vậy, những gì tôi cần làm là gọi setlocale(LC_ALL, "???"), nhưng tôi không chắc chắn làm thế nào để có được giá trị chính xác cho đối số thứ hai. Nó sẽ là một cái gì đó như "tiếng Anh" hoặc "tiếng Đức: Đức" - về cơ bản bất kỳ miền địa phương đã được thiết lập bởi người dùng thông qua bảng điều khiển tùy chọn ngôn ngữ và khu vực. Chỉ cần rõ ràng, tôi là không phải đang tìm cách định dạng chuỗi ngôn ngữ, tôi đang tìm chuỗi địa phương chính xác cho máy tính nơi ứng dụng đang chạy.

Tôi đoán rằng có một số API Win32 sẽ cung cấp cho tôi điều này hoặc có thể là khóa đăng ký có chứa giá trị thích hợp. Có ai biết tôi nên làm gì không?

Trả lời

25

setlocale() là C, không phải C++. Tôi mơ hồ nhớ đã thấy sự giao thoa giữa hai người trên VC6, nhưng đó là một lỗi. Thông thường, setlocale() chỉ ảnh hưởng đến hành vi của các hàm C.

Trong C++, bản địa hóa được kiểm soát bởi lớp std :: locale. Theo mặc định, các hoạt động nhạy cảm miền địa phương sử dụng miền địa phương toàn cầu, được lấy theo mặc định xây dựng một đối tượng miền địa phương, và có thể được thiết lập với std :: locale :: global (const std :: locale &).

Xây dựng một đối tượng miền địa phương bằng một chuỗi rỗng (std :: locale ("")) tạo một miền địa phương tương ứng với môi trường của chương trình.

Khi khởi động chương trình, ngôn ngữ chung là miền địa phương "C" hoặc "Cổ điển". Để thiết lập miền địa phương toàn cầu để locale môi trường của chương trình (mà tôi đoán là những gì bạn đang yêu cầu), bạn nên viết:

std::locale::global(std::locale("")); 

Ví dụ, thiết lập khu vực của tôi hiện đang là tiếng Pháp (Canada). Chạy này:

int main(void) 
{ 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("")); 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("C")); 
    std::cout << std::locale().name() << std::endl; 
    return 0; 
} 

in:

C 
French_Canada.1252 
C 
+0

Tuyệt vời, đây chính xác là những gì tôi cần. Có vẻ như bạn cũng có thể chuyển tên() của một ngôn ngữ C++ đã cho tới setlocale(), để thiết lập miền địa phương C. – Charlie