VC2008以資源形式實現多語言版本(非Unicode) .轉

http://blog.csdn.net/jiht594/article/details/7043520對比,本文使用了SetThreadLocale。
 
 愈來愈多的程序支持多語言切換,或者能自動適應當前系統語言,讓本身開發的程序支持多語言不只可讓本身的程序被國人使用,也能讓外國程序愛好者使用。VC開發多語言程序有多種方法,或讀取配置文件,或使用不一樣資源DLL等等。這裏介紹以資源形式實現多語言版本。


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

BOOL CLanguageTestDlg::OnInitDialog() 

    CDialog::OnInitDialog(); 
 
    // 將「關於...」菜單項添加到系統菜單中。 
 
    // IDM_ABOUTBOX 必須在系統命令範圍內。 
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
    ASSERT(IDM_ABOUTBOX < 0xF000); 
 
    CMenu* pSysMenu = GetSystemMenu(FALSE); 
    if (pSysMenu != NULL) 
    { 
        BOOL bNameValid; 
        CString strAboutMenu; 
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX ); 
        ASSERT(bNameValid); 
        if (!strAboutMenu.IsEmpty()) 
        { 
            pSysMenu->AppendMenu(MF_SEPARATOR); 
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
        } 
    } 
 
    // 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動 
    //  執行此操做 
    SetIcon(m_hIcon, TRUE);            // 設置大圖標 
    SetIcon(m_hIcon, FALSE);        // 設置小圖標 
 
    // TODO: 在此添加額外的初始化代碼 
    CString strTemp; 
    strTemp.LoadString(IDS_SHOWBUTTON);    //LoadString讀取一個ID號定義的字符串資源 
    SetDlgItemText(IDC_SHOW_BUTTON,strTemp); 
 
    strTemp.LoadString(IDS_TEXTSTATIC); 
    SetDlgItemText(IDC_TEXT_STATIC,strTemp); 
 
    strTemp.LoadString(IDS_TEXTEDIT); 
    SetDlgItemText(IDC_TEXT_EDIT,strTemp); 
    return TRUE;  // 除非將焦點設置到控件,不然返回 TRUE 

 

編譯運行,結果以下圖所示:
 
4.製做英文版的「String Table」。右擊「資源視圖」下的「String Table」子項,選擇「插入副本」,在彈出的對話框選擇「英語(美國)」,以下圖所示:
 
「肯定」按下以後,就會多出一個字符串資源來,而且在後面名稱多了標記「[英語(美國)]」,雙擊打開其內容與簡體中文字符串資源同樣,以下圖所示:
 
將全部字符串修改「標題」內容爲英文,以下圖所示:
 
再編譯生成,此時應用程序就能適應簡體中文操做系統和英文美國操做系統了,會自動顯示爲默認操做系統語言。但是因爲此時沒有英文版系統能夠驗證,沒法肯定是否徹底正確,待之後驗證。
5.接下去,欲使用SetThreadLocale自由切換程序界面語言,在應用程序類初始化函數InitInstance()添加以下代碼:app

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)); 

運行程序,出現問號亂碼狀況,當前Windows 7系統的顯示語言只有「中文(簡體)」,而「當前系統區域設置」爲「中文(簡體,中國)」,以下圖所示:框架

自由切換語言失敗,參考MSDN幫助文檔,對的介紹說明:http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx函數

Windows Vista and later: Do not use SetThreadLocale to select a user interface language. The resource loader selects the resource that is defined in the .rc file with a LANGUAGE statement, or the application can use FindResourceEx. Additionally, the application can use SetThreadUILanguage. 
 
Windows 2000, Windows XP: Do not use SetThreadLocale to select a user interface language. To select the resource that is defined in the .rc file with a LANGUAGE statement, the application must use the FindResourceEx function.

另有一篇文章討論SetThreadLocale no longer changes GUI language in Vistahttp://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/d3a44b1c-900c-4c64-bdf8-fe94e46722e2測試

 

替換成以下代碼:spa

SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); 

運行發現能夠顯示「英文」資源字符串,以下圖所示:
 
可使用GetUserDefaultUILanguage()判斷當前用戶界面語言,以下當用戶界面語言爲「簡體中文」時,設置爲「英文(美國)」:操作系統

if  (GetUserDefaultUILanguage() == MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED)) 

    SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); 

 

 


 

在Windows XP簡體中文版下,非Unicode程序的語言爲「中文(中國)」,代碼頁轉換表有包含「US-ASCII」,在Windows 7下未找到「代碼頁轉換表」,使用SetThreadLocale和SetThreadUILanguage(注:靜態連接而後到XP下測試的 )都能將用戶界面語言設置成「英文(美國)」,以下圖所示:.net

改變「控制面板」裏面的「區域選項」語言爲「英語(美國)」,則顯示成問號,緣由在於SetThreadLocale設置的語言與「區域選項」裏面的語言同樣,如果同樣,則不操做,以下圖所示:設計

 

在此中英文版本資源下,在中英文系統語言環境下,就會自動切換不一樣語言資源,而後在另外系統語言環境下(如:日語),就設定程序語言爲英文(英文在大多數系統下都支持),代碼以下:(未能徹底測試)code

01
02
03
04
05
06
07
08
09
10
11
12
13
14
  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)); //SetThreadLocale(GetUserDefaultLCID )    }         }  //SetThreadLocale(GetUserDefaultLCID )//第一頁表明數字貨幣時間,第二頁是系統UI和軟件界面,第三頁高級是非unicode程序界面語言。//下面是這三個頁面設置時,不一樣的函數的影響: //                        區域選項       語言         高級//GetUserDefaultLangID       改變            不變        不變      //GetSystemDefaultLangID      不變            不變       改變//GetUserDefaultUILanguage     改變            改變       不變
相關文章
相關標籤/搜索