核心 API 速查表
| API | 返回值 | 典型用途 |
GetSystemDefaultLangID() | LANGID (如 0x0804) | 系統安裝語言(不可變) |
GetUserDefaultLangID() | LANGID (如 0x0804) | 當前用戶偏好語言 |
GetSystemDefaultLCID() | LCID (如 0x0804) | 含排序規則的完整區域標識 |
GetUserDefaultLCID() | LCID | 用戶完整區域設置 |
GetACP() | UINT (如 936) | 系統默認 ANSI 代碼頁 |
GetLocaleInfo() | 字符串 | 獲取原生語言名稱等詳細信息 |
實戰代碼:從 LANGID 到多語言 DLL 自動載入
// 1. 獲取主語言 ID (忽略子語言)
WORD wLangID = PRIMARYLANGID(::GetSystemDefaultLangID());
// wLangID 示例:0x04 (中文)、0x09 (英文)、0x11 (日文)
// 2. 根據主語言選擇資源 DLL
HINSTANCE hLangDLL = NULL;
switch (wLangID)
{
case LANG_CHINESE: // 0x04
hLangDLL = AfxLoadLibrary(_T("Chinese.dll"));
break;
case LANG_JAPANESE: // 0x11
hLangDLL = AfxLoadLibrary(_T("Japanese.dll"));
break;
case LANG_KOREAN: // 0x12
hLangDLL = AfxLoadLibrary(_T("Korean.dll"));
break;
default:
hLangDLL = AfxLoadLibrary(_T("English.dll")); // 回退英語
break;
}
if (!hLangDLL)
{
AfxMessageBox(_T("無法載入語言資源 DLL,使用內建資源"));
}
else
{
// 3. 切換全局資源句柄,後續 LoadString/LoadIcon 等自動從語言 DLL 讀取
AfxSetResourceHandle(hLangDLL);
// 注意:程序退出前需 FreeLibrary(hLangDLL),避免句柄洩漏
}
語言標識常量速查
// WinNT.h 核心定義
#define LANG_NEUTRAL 0x00
#define LANG_INVARIANT 0x7F
#define LANG_CHINESE 0x04 // 中文
#define LANG_ENGLISH 0x09 // 英文
#define LANG_JAPANESE 0x11 // 日文
#define LANG_KOREAN 0x12 // 韓文
#define LANG_FRENCH 0x0C // 法文
#define LANG_GERMAN 0x07 // 德文
#define LANG_SPANISH 0x0A // 西班牙文
#define LANG_RUSSIAN 0x19 // 俄文
// ... 完整列表見 MSDN "Language Identifier Constants"
子語言區分(如 繁體/簡體 中文)
LANGID langid = GetUserDefaultLangID(); // 含子語言
// 0x0804 = 簡體中文 (CHS)
// 0x0404 = 繁體中文 (CHT) - 台灣
// 0x0C04 = 繁體中文 (CHT) - 香港
// 精確判斷
if (langid == 0x0804) { /* 簡體 */ }
else if (langid == 0x0404 || langid == 0x0C04) { /* 繁體 */ }
獲取可讀語言名稱
TCHAR szName[256] = {0};
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SNATIVELANGNAME, szName, 256);
// 返回如:L"中文 (简体)"、L"English (United States)"
格式化為標準語言代碼 (如 "0804")
CString strLangCode;
strLangCode.Format(_T("%04X"), GetUserDefaultLangID());
// 結果:"0804"、"0409" 等,常用於資源文件命名
最佳實踐建議
- 優先使用用戶默認語言 (
GetUserDefaultLangID) 而非系統語言,尊重用戶偏好
- 資源 DLL 命名規範:
Lang_0804.dll、Lang_0409.dll,配合 Format(_T("Lang_%04X.dll"), langid) 動態載入
- 回退機制:找不到特定語言 DLL → 嘗試主語言 (如
0x04) → 最後回退英語
- 併發安全:
AfxSetResourceHandle 影響全進程,多線程環境下需鎖保護或使用線程局部存儲