MultiLanguage.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:8k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2. *  Openmysee
  3. *
  4. *  This program is free software; you can redistribute it and/or modify
  5. *  it under the terms of the GNU General Public License as published by
  6. *  the Free Software Foundation; either version 2 of the License, or
  7. *  (at your option) any later version.
  8. *
  9. *  This program is distributed in the hope that it will be useful,
  10. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. *  GNU General Public License for more details.
  13. *
  14. *  You should have received a copy of the GNU General Public License
  15. *  along with this program; if not, write to the Free Software
  16. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. *
  18. */
  19. // MultiLanguage.cpp : Defines the entry point for the DLL application.
  20. //
  21. #include <assert.h>
  22. #include "MultiLanguage.h"
  23. StringMapLoader g_loader;
  24. HMODULE g_module;
  25. BOOL APIENTRY DllMain( HANDLE hModule, 
  26.                        DWORD  ul_reason_for_call, 
  27.                        LPVOID /*lpReserved*/
  28.  )
  29. {
  30. switch (ul_reason_for_call)
  31. {
  32. case DLL_PROCESS_ATTACH:
  33. g_module = (HMODULE)hModule;
  34. case DLL_THREAD_ATTACH:
  35. case DLL_THREAD_DETACH:
  36. case DLL_PROCESS_DETACH:
  37. break;
  38. }
  39.     return TRUE;
  40. }
  41. StringMapLoader::StringMapLoader(void)
  42. {
  43. m_mapLangId2Str[DEFAULT_LANG_ID] = "en_US";
  44. m_mapLangId2Str[TAIWAN_LANG_ID] = "zh_TW";
  45. m_mapLangId2Str[HONGKONG_LANG_ID] = "zh_TW";
  46. m_mapLangId2Str[MAINLAND_LANG_ID] = "zh_CN";
  47. m_idCurLang = 0xffff;
  48. // load preferred language
  49. LANGID id = DetectLanguage();
  50. if(!SwitchLanguage(id)) {
  51. // load default language
  52. if(!SwitchLanguage(DEFAULT_LANG_ID)) {
  53. return;
  54. }
  55. }
  56. m_idCurLang = id;
  57. }
  58. StringMapLoader::~StringMapLoader(void)
  59. {
  60. }
  61. bool StringMapLoader::SwitchLanguage(
  62.  const LANGID langID // in, 语言ID
  63.  )
  64. {
  65. // get file name of target language 
  66. char buf[1024];
  67. if(::GetModuleFileNameA(g_module, buf, 1024) == 0)
  68. return false;
  69. char* temp = strrchr(buf, '\');
  70. if(temp == NULL)
  71. return false;
  72. temp[1] = '';
  73. string filename = buf;
  74. filename.append(g_loader.m_mapLangId2Str[langID]);
  75. filename.append(".ini");
  76. // load preferred language
  77. if(!g_loader.LoadLanguageFile(filename))
  78. return false;
  79. g_loader.m_idCurLang = langID;
  80. return true;
  81. }
  82. bool StringMapLoader::GetCurLanguage(
  83.  LANGID& langID // out, 当前语言的ID
  84.  )
  85. {
  86. langID = g_loader.m_idCurLang;
  87. return (g_loader.m_idCurLang != 0xffff);
  88. }
  89. UINT StringMapLoader::GetStrByStr(
  90. const LPCTSTR keyStr, // in, 索引字符串
  91. LPTSTR buf, // out, 存储字符串的缓冲区
  92. const UINT bufSize // in, 缓冲区的大小
  93. )
  94. {
  95. if(!buf || !keyStr)
  96. return 0;
  97. buf[0] = 0;
  98. tstring key = keyStr;
  99. tstring valStr = g_loader.m_mapKeyStr2ValStr[key];
  100. if(valStr.empty() || bufSize <= valStr.size())
  101. return 0;
  102. _tcscpy(buf, valStr.data());
  103. return static_cast<UINT>(valStr.size());
  104. }
  105. bool StringMapLoader::LoadLanguageFile(const string &filename)
  106. {
  107. if(filename.size() <= 0)
  108. return false;
  109. // open language file
  110. tifstream ifs;
  111. ifs.open(filename.c_str());
  112. if(!ifs || !ifs.is_open())
  113. {
  114. ifs.close();
  115. return false;
  116. }
  117. // read language strings
  118. tstring line;
  119. tstring name;
  120. tstring value;
  121. size_t posEqual;
  122. while(getline(ifs, line, TEXT('n')))
  123. {
  124. if(!line.length())
  125. continue;
  126. if(line[0] == TEXT('#'))
  127. continue; // 注释行
  128. if(line[0] == TEXT(';'))
  129. continue; // 注释行
  130. posEqual=line.find(TEXT('='));
  131. if(posEqual == -1)
  132. continue;
  133. name = line.substr(0,posEqual);
  134. value = line.substr(posEqual+1);
  135. size_t index = value.find(TEXT('r'));
  136. if(index != -1)
  137. value = value.substr(0, index);
  138. index = value.find(TEXT('n'));
  139. if(index != -1)
  140. value = value.substr(0, index);
  141. // add to map
  142. m_mapKeyStr2ValStr[name] = value;
  143. }
  144. ifs.close();
  145. return true;
  146. }
  147. // The following functions contain code to
  148. // detect the language in which the initial
  149. // user interface should be displayed
  150. BOOL CALLBACK EnumLangProc(HANDLE /*hModule*/, LPCTSTR /*lpszType*/, LPCTSTR /*lpszName*/,
  151.    WORD wIDLanguage, LONG_PTR lParam)
  152. {
  153.     PLANGINFO LangInfo;
  154.     LangInfo = (PLANGINFO) lParam;
  155.     LangInfo->Count++;
  156.     LangInfo->LangID  = wIDLanguage;
  157.     return TRUE;        // continue enumeration
  158. }
  159. // Detects the language of ntdll.dll with some specific processing for 
  160. // the Hongkong SAR version
  161. LANGID StringMapLoader::GetNTDLLNativeLangID()
  162. {
  163.     LANGINFO LangInfo;
  164. LPCTSTR Type = (LPCTSTR) ((LPVOID)((WORD)16));
  165.     LPCTSTR Name = (LPCTSTR) 1;
  166.     ZeroMemory(&LangInfo,sizeof(LangInfo));
  167.     
  168.     // Get the HModule for ntdll.
  169.     HMODULE hMod = GetModuleHandle(TEXT("ntdll.dll"));
  170.     if (hMod==NULL)
  171.         return 0;
  172.     BOOL result = EnumResourceLanguages(hMod, Type, Name, (ENUMRESLANGPROC)EnumLangProc, (LONG_PTR) &LangInfo);
  173.     
  174.     if (!result || (LangInfo.Count > 2) || (LangInfo.Count < 1) )
  175.         return 0;
  176.     
  177.     return LangInfo.LangID;
  178. }
  179. // Checks if NT4 system is Hongkong SAR version
  180. BOOL StringMapLoader::IsHongKongVersion()
  181. {
  182.     HMODULE hMod;
  183.     BOOL bRet=FALSE;
  184. typedef BOOL (WINAPI *IMMRELEASECONTEXT)(HWND,HIMC);
  185.     IMMRELEASECONTEXT pImmReleaseContext;
  186.     hMod = LoadLibrary(TEXT("imm32.dll"));
  187.     if (hMod)
  188. {
  189.         pImmReleaseContext = (IMMRELEASECONTEXT)GetProcAddress(hMod,"ImmReleaseContext");
  190.         if (pImmReleaseContext)
  191.             bRet = pImmReleaseContext(NULL,NULL);
  192.         FreeLibrary(hMod);
  193.     }
  194.     return bRet;
  195. }
  196. // This function detects a correct initial UI language for all
  197. // platforms (Win9x, ME, NT4, Windows 2000, Windows XP)
  198. LANGID StringMapLoader::DetectLanguage()
  199. {
  200. OSVERSIONINFO VersionInfo;
  201. LANGID uiLangID = 0;
  202. HKEY hKey;
  203. DWORD Type, BuffLen = MAX_KEY_BUFFER;
  204. TCHAR LangKeyValue[MAX_KEY_BUFFER];
  205. VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  206. if( !GetVersionEx(&VersionInfo) )
  207. return 0;
  208. switch( VersionInfo.dwPlatformId )
  209. {
  210. // On Windows NT, Windows 2000 or higher
  211. case VER_PLATFORM_WIN32_NT:
  212. if( VersionInfo.dwMajorVersion >= 5)   // Windows 2000 or higher
  213. {
  214. typedef LANGID (WINAPI *Proc_GetUserDefaultUILanguage)();
  215. HMODULE hmodule = LoadLibrary(_T("Kernel32"));
  216. Proc_GetUserDefaultUILanguage procGetUserDefaultUILanguage = 
  217. (Proc_GetUserDefaultUILanguage) GetProcAddress(hmodule, "GetUserDefaultUILanguage");
  218. assert(procGetUserDefaultUILanguage);
  219. if(procGetUserDefaultUILanguage)
  220. uiLangID = procGetUserDefaultUILanguage();
  221. else
  222. uiLangID = 0;
  223. }
  224. else
  225. {   // for NT4 check the language of ntdll.dll
  226. uiLangID = GetNTDLLNativeLangID();   
  227. if (uiLangID == DEFAULT_LANG_ID)
  228. { // special processing for Honkong SAR version of NT4
  229. if (IsHongKongVersion())
  230. uiLangID = HONGKONG_LANG_ID;
  231. }
  232. }
  233. break;
  234. // On Windows 95, Windows 98 or Windows ME
  235. case VER_PLATFORM_WIN32_WINDOWS:
  236. // Open the registry key for the UI language
  237. if( RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Default\Control Panel\Desktop\ResourceLocale"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS )
  238. {
  239. // Get the type of the default key
  240. if( RegQueryValueEx(hKey, NULL, NULL, &Type, NULL, NULL) == ERROR_SUCCESS && Type == REG_SZ )
  241. {
  242. // Read the key value
  243. if( RegQueryValueEx(hKey, NULL, NULL, &Type, (LPBYTE)LangKeyValue, &BuffLen) == ERROR_SUCCESS )
  244. uiLangID = static_cast<LANGID>(_ttoi(LangKeyValue));
  245. }
  246. RegCloseKey(hKey);
  247. }
  248. break;
  249. }
  250.     if (uiLangID == 0)
  251.         uiLangID = GetUserDefaultLangID();
  252.     // Return the found language ID.
  253.     return uiLangID;
  254. }