LangManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:10k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // LangManager.cpp: implementation of the CLanguageManger class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "LangManager.h"
  22. #pragma comment(lib, "version.lib")
  23. //////////////////////////////////////////////////////////////////////
  24. // Construction/Destruction
  25. //////////////////////////////////////////////////////////////////////
  26. CLanguageManger::CLanguageManger()
  27. : m_wLangID(0)
  28. , m_hModule(0)
  29. {
  30. m_wLangID = (WORD)AfxGetApp()->GetProfileInt(_T("Settings"),
  31. _T("Current Language"), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
  32. InitLanguageDlls();
  33. }
  34. CLanguageManger::~CLanguageManger()
  35. {
  36. if (m_hModule)
  37. ::FreeLibrary(m_hModule);
  38. AfxGetApp()->WriteProfileInt(_T("Settings"),
  39. _T("Current Language"), m_wLangID);
  40. }
  41. struct LANGDEF
  42. {
  43. UINT nID;
  44. WORD wLangID;
  45. };
  46. const LANGDEF languages[] =
  47. {
  48. { XTP_IDC_LANG_ARABIC,         MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA) },
  49. { XTP_IDC_LANG_BULGARIAN,      MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT) },
  50. { XTP_IDC_LANG_CHINESE_PRC,    MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) },
  51. { XTP_IDC_LANG_CHINESE_TAIWAN, MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) },
  52. { XTP_IDC_LANG_CROATIAN,       MAKELANGID(LANG_CROATIAN, SUBLANG_DEFAULT) },
  53. { XTP_IDC_LANG_CZECH,          MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT) },
  54. { XTP_IDC_LANG_DANISH,         MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT) },
  55. { XTP_IDC_LANG_DUTCH,          MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH) },
  56. { XTP_IDC_LANG_ENGLISH,        MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) },
  57. { XTP_IDC_LANG_ESTONIAN,       MAKELANGID(LANG_ESTONIAN, SUBLANG_DEFAULT) },
  58. { XTP_IDC_LANG_FINNISH,        MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT) },
  59. { XTP_IDC_LANG_FRENCH,         MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH) },
  60. { XTP_IDC_LANG_GERMAN,         MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN) },
  61. { XTP_IDC_LANG_GREEK,          MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT) },
  62. { XTP_IDC_LANG_HEBREW,         MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT) },
  63. { XTP_IDC_LANG_HUNGARIAN,      MAKELANGID(LANG_HUNGARIAN, SUBLANG_DEFAULT) },
  64. { XTP_IDC_LANG_ITALIAN,        MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN) },
  65. { XTP_IDC_LANG_JAPANESE,       MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT) },
  66. { XTP_IDC_LANG_KOREAN,         MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT) },
  67. { XTP_IDC_LANG_LATVIAN,        MAKELANGID(LANG_LATVIAN, SUBLANG_DEFAULT) },
  68. { XTP_IDC_LANG_LITHUANIAN,     MAKELANGID(LANG_LITHUANIAN, SUBLANG_LITHUANIAN) },
  69. { XTP_IDC_LANG_NORWEGIAN,      MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL) },
  70. { XTP_IDC_LANG_POLISH,         MAKELANGID(LANG_POLISH,  SUBLANG_DEFAULT) },
  71. { XTP_IDC_LANG_PORTUGUESE_BR,  MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN) },
  72. { XTP_IDC_LANG_PORTUGUESE,     MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE) },
  73. { XTP_IDC_LANG_ROMANIAN,       MAKELANGID(LANG_ROMANIAN, SUBLANG_DEFAULT) },
  74. { XTP_IDC_LANG_RUSSIAN,        MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT) },
  75. { XTP_IDC_LANG_SLOVAK,         MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT) },
  76. { XTP_IDC_LANG_SLOVENIAN,      MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT) },
  77. { XTP_IDC_LANG_SPANISH,        MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN) },
  78. { XTP_IDC_LANG_SWEDISH,        MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT) },
  79. { XTP_IDC_LANG_THAI,           MAKELANGID(LANG_THAI, SUBLANG_DEFAULT) },
  80. { XTP_IDC_LANG_TURKISH,        MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT) },
  81. { XTP_IDC_LANG_UKRAINIAN,      MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT) },
  82. };
  83. BOOL CLanguageManger::GetDllInfo(const WORD& wLangId, LANGUAGE_DLL& langDll)
  84. {
  85. return m_mapLangDll.Lookup(wLangId, langDll);
  86. }
  87. BOOL CLanguageManger::EnumResTypeProc(HMODULE hModule, LPTSTR lpszType, LONG_PTR lParam)
  88. {
  89. WORD* pwLangID = (WORD*)lParam;
  90. ASSERT(pwLangID);
  91. if (!pwLangID)
  92. return FALSE;
  93. ::EnumResourceNames(hModule, lpszType, &CLanguageManger::EnumResNameProc, lParam);
  94. if(*pwLangID == LANG_NEUTRAL)
  95. return TRUE; // continue if neutral
  96. return FALSE; // continue if default
  97. }
  98. BOOL CLanguageManger::EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName,
  99.   LONG_PTR lParam)
  100. {
  101. WORD* pwLangID = (WORD*)lParam;
  102. ASSERT(pwLangID);
  103. if (!pwLangID)
  104. return FALSE;
  105. ::EnumResourceLanguages(hModule, lpszType, lpszName,
  106. &CLanguageManger::EnumResLangProc, lParam);
  107. if(*pwLangID == LANG_NEUTRAL)
  108. return TRUE; // continue if neutral
  109. return FALSE;
  110. }
  111. BOOL CLanguageManger::EnumResLangProc(HMODULE hModule, LPCTSTR lpszType,
  112.  LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam)
  113. {
  114. UNREFERENCED_PARAMETER(hModule); UNREFERENCED_PARAMETER(lpszType); UNREFERENCED_PARAMETER(lpszName);
  115. WORD* pwLangID = (WORD*)lParam;
  116. ASSERT(pwLangID);
  117. if (!pwLangID)
  118. return FALSE; // stop emuneration
  119. if(wIDLanguage == LANG_NEUTRAL)
  120. return TRUE; // continue if neutral
  121. *pwLangID = wIDLanguage;
  122. return FALSE;
  123. }
  124. WORD CLanguageManger::GetLangID(HMODULE hResDll) const
  125. {
  126. typedef WORD (CALLBACK* PGETLANGID)();
  127. if (hResDll != NULL)
  128. {
  129. PGETLANGID pfnGetLangID = (PGETLANGID)::GetProcAddress(
  130. hResDll, "GetLangID");
  131. if (pfnGetLangID)
  132. return (*pfnGetLangID)();
  133. WORD wLanguage = 0;
  134. DWORD Zero;
  135. UINT cbTranslate;
  136. TCHAR pszPath[MAX_PATH];
  137. struct LANGANDCODEPAGE 
  138. {
  139. WORD wLanguage;
  140. WORD wCodePage;
  141. } *lpTranslate;
  142. GetModuleFileName(hResDll, pszPath, MAX_PATH);
  143. DWORD dwDataLen = ::GetFileVersionInfoSize(pszPath, &Zero);
  144. if (dwDataLen == 0)
  145. {
  146. EnumResourceTypes(hResDll, &CLanguageManger::EnumResTypeProc, (LONG_PTR)&wLanguage);
  147. return wLanguage;
  148. }
  149. LPVOID pData = new BYTE[dwDataLen];
  150. if (::GetFileVersionInfo((TCHAR*)pszPath, NULL, dwDataLen, pData))
  151. {
  152. ::VerQueryValue(pData, _T("\VarFileInfo\Translation"), (LPVOID*)&lpTranslate, &cbTranslate);
  153. if (cbTranslate >= 4)
  154. {
  155. wLanguage = lpTranslate->wLanguage;
  156. }
  157. }
  158. delete [] pData;
  159. return wLanguage;
  160. }
  161. return 0;
  162. }
  163. WORD CLanguageManger::GetLangID(UINT uCmdID) const
  164. {
  165. for (int i = 0; i < _countof(languages); ++i)
  166. {
  167. if (uCmdID == languages[i].nID)
  168. {
  169. return languages[i].wLangID;
  170. }
  171. }
  172. return 0;
  173. }
  174. UINT CLanguageManger::GetCmdID(const WORD& wLangId) const
  175. {
  176. for (int i = 0; i < _countof(languages); ++i)
  177. {
  178. if (wLangId == languages[i].wLangID)
  179. {
  180. return languages[i].nID;
  181. }
  182. }
  183. return 0;
  184. }
  185. CString CLanguageManger::GetDescription(const WORD& wLangId) const
  186. {
  187. for (int i = 0; i < _countof(languages); ++i)
  188. {
  189. if (wLangId == languages[i].wLangID)
  190. {
  191. CString strBuffer;
  192. XTPResourceManager()->LoadString(&strBuffer, languages[i].nID);
  193. return strBuffer;
  194. }
  195. }
  196. return _T("");
  197. }
  198. BOOL CLanguageManger::InitLanguageDlls()
  199. {
  200. TCHAR szBuff[_MAX_PATH];
  201. ::GetModuleFileName(NULL, szBuff, _countof(szBuff));
  202. TCHAR *p = _tcsrchr(szBuff, _T('\'));
  203. if (p != NULL) {
  204. *p = _T('');
  205. }
  206. CString strDllPath;
  207. if (!DIRECTORYEXISTS_S(CString(szBuff) + _T("\Translations")) && 
  208. DIRECTORYEXISTS_S(CString(szBuff) + _T("\..\..\Utils\Translations")))
  209. {
  210. strDllPath.Format(_T("%s\..\..\Utils\Translations\*.dll"), szBuff);
  211. }
  212. else
  213. {
  214. strDllPath.Format(_T("%s\Translations\*.dll"), szBuff);
  215. }
  216. return InitLanguageDlls(strDllPath);
  217. }
  218. BOOL CLanguageManger::InitLanguageDlls(CString strDllPath)
  219. {
  220. m_mapLangDll.RemoveAll();
  221. CFileFind ff;
  222. BOOL bContinue = ff.FindFile(strDllPath);
  223. while (bContinue)
  224. {
  225. bContinue = ff.FindNextFile();
  226. if (ff.IsDots())
  227. continue;
  228. if (ff.IsDirectory())
  229. continue;
  230. CString strDllPath(ff.GetFilePath());
  231. HMODULE hModule = ::LoadLibrary(strDllPath);
  232. if (hModule)
  233. {
  234. WORD wLangID = GetLangID(hModule);
  235. if (wLangID != 0)
  236. {
  237. LANGUAGE_DLL langDll;
  238. langDll.uCmdID = GetCmdID(wLangID);
  239. langDll.strDllPath = strDllPath;
  240. m_mapLangDll[wLangID] = langDll;
  241. }
  242. ::FreeLibrary(hModule);
  243. }
  244. }
  245. ff.Close();
  246. return TRUE;
  247. }
  248. BOOL CLanguageManger::IsRTL() const
  249. {
  250. return (
  251. (m_wLangID == MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA)) ||
  252. (m_wLangID == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT)));
  253. }
  254. WORD CLanguageManger::GetLangID() const
  255. {
  256. return m_wLangID;
  257. }
  258. BOOL CLanguageManger::LoadLanguageDll(LPCTSTR lpszDllPath)
  259. {
  260. if (m_hModule)
  261. {
  262. ::FreeLibrary(m_hModule);
  263. m_hModule = 0;
  264. }
  265. m_hModule = ::LoadLibrary(lpszDllPath);
  266. m_wLangID = GetLangID(m_hModule);
  267. XTPResourceManager()->SetResourceHandle(m_hModule);
  268. return (m_hModule != NULL);
  269. }
  270. BOOL CLanguageManger::LoadLanguageDll(const WORD& wLangId)
  271. {
  272. LANGUAGE_DLL langDll;
  273. if (m_mapLangDll.Lookup(wLangId, langDll))
  274. {
  275. return LoadLanguageDll(langDll.strDllPath);
  276. }
  277. return FALSE;
  278. }
  279. CMapLangDll& CLanguageManger::GetLangMap()
  280. {
  281. return m_mapLangDll;
  282. }
  283. void CLanguageManger::LayoutWindow(CWnd* pWnd, BOOL bRTLLayout)
  284. {
  285. pWnd->ModifyStyleEx(bRTLLayout? 0: WS_EX_LAYOUTRTL, !bRTLLayout? 0: WS_EX_LAYOUTRTL);
  286. // walk through HWNDs to avoid creating temporary CWnd objects
  287. // unless we need to call this function recursively
  288. for (CWnd* pChild = pWnd->GetWindow(GW_CHILD); pChild != NULL;
  289. pChild = pChild->GetWindow(GW_HWNDNEXT))
  290. {
  291. // send to child windows after parent
  292. LayoutWindow(pChild, bRTLLayout);
  293. }
  294. }
  295. void CLanguageManger::SetRTLLayout(CWnd* pWnd, BOOL bRTLLayout)
  296. {
  297. if ((BYTE)::GetVersion() < 4)
  298. return;
  299. LayoutWindow(pWnd, bRTLLayout);
  300. // then update the state of all floating windows owned by the parent
  301. HWND hWnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
  302. while (hWnd != NULL)
  303. {
  304. if (pWnd->m_hWnd == ::GetParent(hWnd))
  305. LayoutWindow(CWnd::FromHandle(hWnd), bRTLLayout);
  306. hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
  307. }
  308. }