2011-05-17 21 views
4

我在玩Windows API,我試圖使用多語言資源來加載特定於語言的菜單和內容。但是,由於某些原因,如果有美國英語替代品,Windows絕對拒絕加載波斯尼亞語(拉丁語)資源。通過FindResourceEx工程加載資源。我在XP SP3上,波斯尼亞語(拉丁語)在我的區域設置中設置。Windows跳過特定於語言的資源

的main.c

#include <Windows.h> 
#include "resource.h" 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PTSTR pCmdLine, int nCmdShow) 
{ 
    TCHAR string[64]; 

    /* Message box properly outputs "This is German (DE)." here. */ 
    SetThreadLocale(MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT)); 
    LoadString(hInstance, TEST_STRING, string, sizeof(string)/sizeof(string[0])); 
    MessageBox(NULL, string, TEXT("Message"), MB_OK); 

    /* Message box outputs "This is English (US)." - WTF?! */ 
    SetThreadLocale(MAKELCID(MAKELANGID(LANG_BOSNIAN, SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN), SORT_DEFAULT)); 
    LoadString(hInstance, TEST_STRING, string, sizeof(string)/sizeof(string[0])); 
    MessageBox(NULL, string, TEXT("Message"), MB_OK); 

    return 0; 
} 

resources.rc

#include <windows.h> 
#include "resource.h" 

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
STRINGTABLE 
{ 
    TEST_STRING     "This is English (US)." 
} 

LANGUAGE LANG_GERMAN, SUBLANG_GERMAN 
STRINGTABLE 
{ 
    TEST_STRING     "This is German (DE)." 
} 

LANGUAGE LANG_BOSNIAN, SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 
STRINGTABLE 
{ 
    TEST_STRING     "This is Bosnian (Latin)." 
} 

LANGUAGE LANG_FRENCH, SUBLANG_FRENCH 
STRINGTABLE 
{ 
    TEST_STRING     "This is French (FR)." 
} 

RESOURCE.H

#define TEST_STRING        40000 
+0

你確定要使用普通C嗎? – dynamic 2011-05-17 22:18:18

+4

這足以說明我的問題。 – Electro 2011-05-17 22:20:13

回答

1

語言選擇機甲LoadString中的nism(並且通常所有資源檢索API)已從Vista開始破解(因爲系統級別添加了MUI機制)。

當前最好的做法是將每種語言存儲在單獨的資源中,並且使用DLL的hInstance訪問資源。你可以自己加載DLL,或使用新的MUI API來做到這一點(http://msdn.microsoft.com/library/dd319076%28VS.85%29.aspx

+0

呵呵。好吧,無論如何,我在XP上運行該代碼,所以我仍然感到困惑。 – Electro 2011-10-08 08:23:20

相關問題