2009-02-20 75 views
15

我對本地化編程相當陌生,我試圖找出如何爲新啓動的非託管C++應用程序(從應用程序內)設置適當的初始語言環境。據我所知,新的應用程序從C語言環境開始,而不是適當的區域語言環境(英語,德語等)。所以我需要做的是打電話setlocale(LC_ALL, "???"),但我不知道如何獲得第二個參數的正確值。它會像「英語」或「德語:德國」 - 基本上是用戶通過區域和語言選項控制面板設置的任何區域設置。只是要清楚,我是而不是尋找如何格式化區域設置字符串,我正在尋找運行該應用程序的計算機正確的區域設置字符串。如何在Windows上爲C++程序設置正確的初始語言環境?

我猜測,有一些Win32 API會給我這個,或者可能是一個包含正確值的註冊表項。有人知道我應該做什麼嗎?

回答

25

setlocale()是C,而不是C++。我隱約記得在VC6上看到了兩者之間的干擾,但那是一個錯誤。通常,setlocale()僅影響C函數的行爲。

在C++中,本地化由std :: locale類控制。默認情況下,區域敏感操作使用全局區域設置,默認情況下它是構建一個區域設置對象,可以使用std :: locale :: global(const std :: locale &)來設置。

使用空字符串(std :: locale(「」))構造一個語言環境對象會創建一個對應於程序環境的語言環境。

在程序啓動時,全局區域設置是「C」或「Classic」區域設置。要設置全局區域設置到程序的環境區域(我猜是你問),你這樣寫:

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

例如,我的區域設置當前設置爲法語(加拿大)。運行此:

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; 
} 

打印:

C 
French_Canada.1252 
C 
+0

大,這正是我需要的。看起來您也可以將給定C++語言環境的name()傳遞給setlocale(),以便設置C語言環境。 – Charlie 2009-02-21 01:53:58