愈來愈多的程序支持多語言切換,或者能自動適應當前系統語言,讓本身開發的程序支持多語言不只可讓本身的程序被國人使用,也能讓外國程序愛好者使用。VC開發多語言程序有多種方法,或讀取配置文件,或使用不一樣資源DLL等等。這裏介紹以資源形式實現多語言版本。html
1.打開Visual Studio 2008,新建一個基於對話框工程,名稱爲LanguageTest,不使用Unicode庫 ,資源語言一共有十種(當前操做系統爲Windows 7簡體中文版),以下圖所示:
在此選擇「中文(簡體,中國)」,單擊「完成」按鈕。
2.在對話框設計界面上,放置一個按鈕(ID號IDC_SHOW_BUTTON)、一個靜態文本(ID號IDC_TEXT_STATIC,必須改其默認ID號)和一個編輯框(ID號IDC_TEXT_EDIT),資源視圖以下所示:
能夠看到資源視圖裏面都是簡體中文的資源文件,如今在「String Table」字符串表類型下,雙擊打開其子項「String Table」,默認只有一條字符串,是窗口菜單裏的「關於 LanguageTest(&A)...」,如圖所示:
如今點一下第二行(以黑色外框標誌),新建一條字符串(值會默認增加,注意不要與已有的衝突),「標題」是「ID」號所表明的字符串內容,咱們增長字符串以下圖所示:
3.在「解決方案管理器」下雙擊打開「LanguageTestDlg.cpp」文件,在其初始化函數OnInitDialog()增長以下紅色代碼:windows
編譯運行,結果以下圖所示:
4.製做英文版的「String Table」。右擊「資源視圖」下的「String Table」子項,選擇「插入副本」,在彈出的對話框選擇「英語(美國)」,以下圖所示:
「肯定」按下以後,就會多出一個字符串資源來,而且在後面名稱多了標記「[英語(美國)]」,雙擊打開其內容與簡體中文字符串資源同樣,以下圖所示:
將全部字符串修改「標題」內容爲英文,以下圖所示:
再編譯生成,此時應用程序就能適應簡體中文操做系統和英文美國操做系統了,會自動顯示爲默認操做系統語言。但是因爲此時沒有英文版系統能夠驗證,沒法肯定是否徹底正確,待之後驗證。
5.接下去,欲使用SetThreadLocale自由切換程序界面語言,在應用程序類初始化函數InitInstance()添加以下代碼:app
運行程序,出現問號亂碼狀況,當前Windows 7系統的顯示語言只有「中文(簡體)」,而「當前系統區域設置」爲「中文(簡體,中國)」,以下圖所示:框架
自由切換語言失敗,參考MSDN幫助文檔,對的介紹說明:http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx函數
另有一篇文章討論SetThreadLocale no longer changes GUI language in Vista測試
替換成以下代碼:操作系統
運行發現能夠顯示「英文」資源字符串,以下圖所示:
可使用GetUserDefaultUILanguage()判斷當前用戶界面語言,以下當用戶界面語言爲「簡體中文」時,設置爲「英文(美國)」:.net
在Windows XP簡體中文版下,非Unicode程序的語言爲「中文(中國)」,代碼頁轉換表有包含「US-ASCII」,在Windows 7下未找到「代碼頁轉換表」,使用SetThreadLocale和SetThreadUILanguage(注:靜態連接而後到XP下測試的 )都能將用戶界面語言設置成「英文(美國)」,以下圖所示:設計
改變「控制面板」裏面的「區域選項」語言爲「英語(美國)」,則顯示成問號,緣由在於SetThreadLocale設置的語言與「區域選項」裏面的語言同樣,如果同樣,則不操做,以下圖所示:
在此中英文版本資源下,在中英文系統語言環境下,就會自動切換不一樣語言資源,而後在另外系統語言環境下(如:日語),就設定程序語言爲英文(英文在大多數系統下都支持),代碼以下:(未能徹底測試)
if ((GetSystemDefaultLangID() != MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)) && (GetSystemDefaultLangID() != MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US))) { OSVERSIONINFO ovs; ovs.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (::GetVersionEx(&ovs)) { if (ovs.dwPlatformId == VER_PLATFORM_WIN32_NT && ovs.dwMajorVersion >= 6 && ovs.dwMinorVersion >= 0) { SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } else SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); } }
參考資料:
1.編寫 Win32 多語言用戶界面應用程序
http://msdn.microsoft.com/zh-cn/goglobal/bb688160
2.SetThreadUILanguage
http://msdn.microsoft.com/en-us/library/dd374053%28VS.85%29.aspx
3.SetThreadLocale
http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx
4.語言標識符常量和字符串
http://msdn.microsoft.com/en-us/library/dd318693%28VS.85%29.aspx
5.LoadString的如何肯定load哪一個語言的資源?http://topic.csdn.net/u/20080504/15/fb71cf4e-8420-4c1d-b89e-2784ba3dfca9.html