2016-10-02 83 views
1

使用C++有一種簡單而可靠的方法來檢測美式英語或英式英語拼寫是否與用戶的語言環境更好地匹配?我有一個簡單的桌面C++程序,我想執行這個第一個最小的國際化步驟。我的用戶界面使用了很多顏色/顏色這個詞,我希望在沒有大量火箭科學或明確的用戶選項的情況下,在99%以上的情況下向用戶展示正確的拼寫。使用C++檢測美式英語或英式英語拼寫是否適用於C++

編輯:下面接受的答案是好的。爲了提供一些額外的信息和完整的可用解決方案,這裏可能是確定在C++應用程序中使用美國還是英國英語的最簡單可能的方法。這是實現適當國際化的一個小而有用的步驟。對於那些希望在美國以外對講英語的人以及希望他們的產品在美國有更多家庭的英語開發人員(我在後者陣營中),這對美國開發人員非常有用。

這不是一個完美的解決方案,但顯然標準化過程未能提供完美而簡單的解決方案。我認爲,至少使用這段代碼會使顏色與顏色錯誤,而不是簡單地任意選擇其中一種,而是假設您的產品被廣泛使用,這對於一小部分用戶來說是錯誤的。

#include <string> 
#include <clocale> 

setlocale(LC_MONETARY,""); 
struct lconv * lc; 
lc = localeconv(); 
std::string sym(lc->int_curr_symbol); 
bool us_english = (sym=="USD" || sym=="PHP"); 

我基本上假設美國英語是在美國和英國英語偏好的其他地方,雖然我破例爲一個國家,我知道不是這樣的情況(菲律賓)。

在我的Windows系統上,該程序立即反映默認語言的變化,由Windows設置或控制面板控制。這樣做可以避免解析任何可能因操作系統不同而不同的字符串,我期望它是可移植的。

我不打算使用我自己的解決方案,因爲在我的特殊情況下,我使用的是wxWidgets,並且恰巧wxWidgets爲這個問題提供了一個可移植的包裝器裁縫(我應該考慮過之前檢查過)。

#include "wx/intl.h" 
int lang = wxLocale::GetSystemLanguage(); 
bool us_english = (lang == wxLANGUAGE_ENGLISH_US); 
+0

無論如何,顯式用戶選項可能會有用。如果你是紐約的英國人,儘管有公司的標準語言環境,但你可能更喜歡顏色。 –

回答

2

返回的標準

爲限制字符串使用它NeomerArcana正確指出,標準的C++方法是:

不幸的是locale對象,標準不強制這個名字應該看起來怎麼樣,和MSVC實施只是返回您在構建對象時給出的名稱,即一個空字符串。

解決辦法

不過還好,有一個C變通產生與MSVC一個更好的結果:std::setlocale(LC_ALL, NULL);。該函數返回一個指向空字符C字符串的指針,該字符串包含環境默認語言環境的全名。

但是,該字符串的格式可能取決於操作系統和版本。所以你必須以靈活的方式解析它:它可以是一個合適的locale name(例如,"en-US"用於windows,而POSIX上的「en_US.UTF-8」)或Windows specific format(例如「English_United States.1252」一個language table)。

或者,如果您只定位到Windows,則可以考慮使用GetSystemDefaultLangID(void)來簡化您的生活。此函數返回一個二進制語言標識符,然後您可以檢查語言LANG_ENGLISH和區域變體SUBLANG_ENGLISH_UK

+1

這比我自己的答案要好得多。我覺得有點令人驚訝的是,沒有真正的跨平臺方式來獲取語言環境信息。 – NeomerArcana

+1

感謝您接受這個優秀的答案。我根據你的回答做了一些額外的實驗,我將把結果報告爲我的問題的編輯,因爲我可以更容易地在那裏放置一些代碼。 –

+1

@BillForster對於跨操作系統的語言環境,仍然沒有標準的表示方式確實令人傷心。感謝您在問題中發佈的更新:使用貨幣的想法是實用方法的絕佳範例! – Christophe

2

有一個在C++整個本地化/的本地化庫http://en.cppreference.com/w/cpp/locale

您應該能夠通過檢查

+0

不幸的是,在我的Windows測試程序(使用Visual Studio 2015)中,std :: locale(「」)。name()返回的字符串只是「」。我希望這不是Windows和標準C++都提供龐大,複雜和完全不兼容的設施的領域。 –

+0

我不確定,從來沒有使用它,但http://en.cppreference.com/w/cpp/locale/locale/name似乎讓我覺得它應該提供一些有用的東西。 – NeomerArcana

+1

@NeomerArcana在理論上應該是有用的。但理論上,理論和實踐之間沒有區別;-) – Christophe