source: trunk/Utilities/ListResourceLanguages/ListResourceLanguages.cpp @ 937

Last change on this file since 937 was 58, checked in by roman, 12 years ago
  • Property svn:keywords set to Id
File size: 6.8 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2012
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: ListResourceLanguages.cpp 58 2012-04-20 13:03:26Z roman $
6
7#include "stdafx.h"
8
9///////////////////////////////////////////////////////////
10// CModule
11
12class CModule
13{
14public:
15
16        ////////////////////////////////////////////////////////
17        // CLanguageData
18
19        class CLanguageData
20        {
21        public:
22                SIZE_T m_nCount;
23
24        public:
25        // CLanguageData
26                CLanguageData() throw() :
27                        m_nCount(0)
28                {
29                }
30        };
31
32private:
33        CAtlMap<WORD, CLanguageData> m_LanguageDataMap;
34
35        static CString GetLanguageName(LANGID nLanguage)
36        {
37                const UINT nPrimaryLanguage = PRIMARYLANGID(nLanguage);
38                // TODO: Use sublang
39                switch(nPrimaryLanguage)
40                {
41                case LANG_NEUTRAL:              return _T("Neutral");
42                case LANG_INVARIANT:    return _T("Invariant");
43                case LANG_AFRIKAANS:    return _T("Afrikaans");
44                case LANG_ALBANIAN:             return _T("Albanian");
45                case LANG_ARABIC:               return _T("Arabic");
46                case LANG_ARMENIAN:             return _T("Armenian");
47                case LANG_ASSAMESE:             return _T("Assamese");
48                case LANG_AZERI:                return _T("Azeri");
49                case LANG_BASQUE:               return _T("Basque");
50                case LANG_BELARUSIAN:   return _T("Belarusian");
51                case LANG_BENGALI:              return _T("Bengali");
52                case LANG_BULGARIAN:    return _T("Bulgarian");
53                case LANG_CATALAN:              return _T("Catalan");
54                case LANG_CHINESE:              return _T("Chinese");
55                case LANG_CROATIAN:             return _T("Croatian/Serbian");
56                case LANG_CZECH:                return _T("Czech");
57                case LANG_DANISH:               return _T("Danish");
58                case LANG_DIVEHI:               return _T("Divehi");
59                case LANG_DUTCH:                return _T("Dutch");
60                case LANG_ENGLISH:              return _T("English");
61                case LANG_ESTONIAN:             return _T("Estonian");
62                case LANG_FAEROESE:             return _T("Faeroese");
63                case LANG_FARSI:                return _T("Farsi");
64                case LANG_FINNISH:              return _T("Finnish");
65                case LANG_FRENCH:               return _T("French");
66                case LANG_GALICIAN:             return _T("Galician");
67                case LANG_GEORGIAN:             return _T("Georgian");
68                case LANG_GERMAN:               return _T("German");
69                case LANG_GREEK:                return _T("Greek");
70                case LANG_GUJARATI:             return _T("Gujarati");
71                case LANG_HEBREW:               return _T("Hebrew");
72                case LANG_HINDI:                return _T("Hindi");
73                case LANG_HUNGARIAN:    return _T("Hungarian");
74                case LANG_ICELANDIC:    return _T("Icelandic");
75                case LANG_INDONESIAN:   return _T("Indonesian");
76                case LANG_ITALIAN:              return _T("Italian");
77                case LANG_JAPANESE:             return _T("Japanese");
78                case LANG_KANNADA:              return _T("Kannada");
79                case LANG_KASHMIRI:             return _T("Kashmiri");
80                case LANG_KAZAK:                return _T("Kazak");
81                case LANG_KONKANI:              return _T("Konkani");
82                case LANG_KOREAN:               return _T("Korean");
83                case LANG_KYRGYZ:               return _T("Kyrgyz");
84                case LANG_LATVIAN:              return _T("Latvian");
85                case LANG_LITHUANIAN:   return _T("Lithuanian");
86                case LANG_MACEDONIAN:   return _T("Macedonian");
87                case LANG_MALAY:                return _T("Malay");
88                case LANG_MALAYALAM:    return _T("Malayalam");
89                case LANG_MANIPURI:             return _T("Manipuri");
90                case LANG_MARATHI:              return _T("Marathi");
91                case LANG_MONGOLIAN:    return _T("Mongolian");
92                case LANG_NEPALI:               return _T("Nepali");
93                case LANG_NORWEGIAN:    return _T("Norwegian");
94                case LANG_ORIYA:                return _T("Oriya");
95                case LANG_POLISH:               return _T("Polish");
96                case LANG_PORTUGUESE:   return _T("Portuguese");
97                case LANG_PUNJABI:              return _T("Punjabi");
98                case LANG_ROMANIAN:             return _T("Romanian");
99                case LANG_RUSSIAN:              return _T("Russian");
100                case LANG_SANSKRIT:             return _T("Sanskrit");
101        //      case LANG_SERBIAN:              return _T("Serbian"); == LANG_CROATIAN
102                case LANG_SINDHI:               return _T("Sindhi");
103                case LANG_SLOVAK:               return _T("Slovak");
104                case LANG_SLOVENIAN:    return _T("Slovenian");
105                case LANG_SPANISH:              return _T("Spanish");
106                case LANG_SWAHILI:              return _T("Swahili");
107                case LANG_SWEDISH:              return _T("Swedish");
108                case LANG_SYRIAC:               return _T("Syriac");
109                case LANG_TAMIL:                return _T("Tamil");
110                case LANG_TATAR:                return _T("Tatar");
111                case LANG_TELUGU:               return _T("Telugu");
112                case LANG_THAI:                 return _T("Thai");
113                case LANG_TURKISH:              return _T("Turkish");
114                case LANG_UKRAINIAN:    return _T("Ukrainian");
115                case LANG_URDU:                 return _T("Urdu");
116                case LANG_UZBEK:                return _T("Uzbek");
117                case LANG_VIETNAMESE:   return _T("Vietnamese");
118                }
119                return _T("???");
120        }
121        BOOL EnumResourceLanguageProc(HMODULE hModule, LPCTSTR pszType, LPCTSTR pszName, WORD nLanguage)
122        { 
123                hModule; pszType; pszName; 
124                m_LanguageDataMap[nLanguage].m_nCount++;
125                return TRUE; 
126        }
127        static BOOL WINAPI EnumResourceLanguageProc(HMODULE hModule, LPCTSTR pszType, LPCTSTR pszName, WORD nLanguage, LONG_PTR nParameter)
128        { 
129                return ((CModule*) nParameter)->EnumResourceLanguageProc(hModule, pszType, pszName, nLanguage);
130        }
131        BOOL EnumResourceNameProc(HMODULE hModule, LPCTSTR pszType, LPTSTR pszName)
132        { 
133                EnumResourceLanguages(hModule, pszType, pszName, EnumResourceLanguageProc, (LONG_PTR) this); 
134                return TRUE; 
135        } 
136        static BOOL WINAPI EnumResourceNameProc(HMODULE hModule, LPCTSTR pszType, LPTSTR pszName, LONG_PTR nParameter)
137        { 
138                return ((CModule*) nParameter)->EnumResourceNameProc(hModule, pszType, pszName);
139        }
140        BOOL EnumResourceTypeProc(HMODULE hModule, LPTSTR pszType)
141        { 
142                EnumResourceNames(hModule, pszType, EnumResourceNameProc, (LONG_PTR) this);
143                return TRUE;
144        }
145        static BOOL WINAPI EnumResourceTypeProc(HMODULE hModule, LPTSTR pszType, LONG_PTR nParameter)
146        { 
147                return ((CModule*) nParameter)->EnumResourceTypeProc(hModule, pszType);
148        }
149
150public:
151// CModule
152        SIZE_T ProcessFile(const CPath& sFilePath)
153        {
154                ATLASSERT(m_LanguageDataMap.IsEmpty());
155                const HMODULE hModule = LoadLibraryEx(sFilePath, NULL, LOAD_LIBRARY_AS_DATAFILE);
156                ATLENSURE_THROW(hModule >= (HMODULE) HINSTANCE_ERROR, AtlHresultFromLastError());
157                _ATLTRY
158                {
159                        EnumResourceTypes(hModule, (ENUMRESTYPEPROC) EnumResourceTypeProc, (LONG_PTR) this);
160                }
161                _ATLCATCHALL()
162                {
163                        FreeLibrary(hModule);
164                        _ATLRETHROW;
165                }
166                FreeLibrary(hModule);
167                #pragma region Output
168                for(POSITION Position = m_LanguageDataMap.GetStartPosition(); Position; m_LanguageDataMap.GetNext(Position))
169                {
170                        const WORD nLanguage = m_LanguageDataMap.GetKeyAt(Position);
171                        const CLanguageData& LanguageData = m_LanguageDataMap.GetValueAt(Position);
172                        _tprintf(_T("%d\t%s\t%d\n"), nLanguage, GetLanguageName(nLanguage), LanguageData.m_nCount);
173                }
174                #pragma endregion
175                return m_LanguageDataMap.GetCount();
176        }
177};
178
179////////////////////////////////////////////////////////////
180// Main
181
182int _tmain(int argc, _TCHAR* argv[])
183{
184        INT nResult;
185        CModule Module;
186        _ATLTRY
187        {
188                if(argc < 2)
189                {
190                        _tprintf(_T("Syntax: ListResourceLanguages <path>\n"));
191                        return 0;
192                }
193                CPath sPath = argv[1];
194                nResult = (INT) Module.ProcessFile(sPath);
195        }
196        _ATLCATCH(Exception)
197        {
198                _tprintf(_T("Fatal: Error 0x%08x\n"), (HRESULT) Exception);
199                return (HRESULT) Exception;
200        }
201        _ATLCATCHALL()
202        {
203                _tprintf(_T("Fatal: Fatal error\n"));
204                return E_FAIL; //E_UNNAMED;
205        }
206        return nResult;
207}
208
Note: See TracBrowser for help on using the repository browser.