window國際化文案

     愈來愈多的程序支持多語言切換,或者能自動適應當前系統語言,讓本身開發的程序支持多語言不只可讓本身的程序被國人使用,也能讓外國程序愛好者使用。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

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 Vista測試

http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/d3a44b1c-900c-4c64-bdf8-fe94e46722e2spa

 

替換成以下代碼:操作系統

SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); 

運行發現能夠顯示「英文」資源字符串,以下圖所示:

可使用GetUserDefaultUILanguage()判斷當前用戶界面語言,以下當用戶界面語言爲「簡體中文」時,設置爲「英文(美國)」:.net

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下測試的 )都能將用戶界面語言設置成「英文(美國)」,以下圖所示:設計

改變「控制面板」裏面的「區域選項」語言爲「英語(美國)」,則顯示成問號,緣由在於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

相關文章
相關標籤/搜索