5 #include "LangUtils.h"
\r
6 #include "Common/StringConvert.h"
\r
7 #include "Common/StringToInt.h"
\r
8 #include "Windows/Synchronization.h"
\r
9 #include "Windows/Window.h"
\r
10 #include "Windows/FileFind.h"
\r
11 #include "RegistryUtils.h"
\r
12 #include "ProgramLocation.h"
\r
14 using namespace NWindows;
\r
16 static CLang g_Lang;
\r
25 ReadRegLang(g_LangID);
\r
27 if (!g_LangID.IsEmpty() && g_LangID != L"-")
\r
29 UString langPath = g_LangID;
\r
30 if (langPath.Find(WCHAR_PATH_SEPARATOR) < 0)
\r
32 if (langPath.Find(L'.') < 0)
\r
33 langPath += L".txt";
\r
35 if (GetProgramFolderPath(folderPath))
\r
36 langPath = folderPath + UString(L"Lang" WSTRING_PATH_SEPARATOR) + langPath;
\r
38 g_Lang.Open(langPath);
\r
42 static bool g_Loaded = false;
\r
43 static NSynchronization::CCriticalSection g_CriticalSection;
\r
45 void LoadLangOneTime()
\r
47 NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
\r
54 void LangSetDlgItemsText(HWND dialogWindow, CIDLangPair *idLangPairs, int numItems)
\r
56 for (int i = 0; i < numItems; i++)
\r
58 const CIDLangPair &idLangPair = idLangPairs[i];
\r
60 if (g_Lang.GetMessage(idLangPair.LangID, message))
\r
62 NWindows::CWindow window(GetDlgItem(dialogWindow, idLangPair.ControlID));
\r
63 window.SetText(message);
\r
68 void LangSetWindowText(HWND window, UInt32 langID)
\r
71 if (g_Lang.GetMessage(langID, message))
\r
72 MySetWindowText(window, message);
\r
75 UString LangString(UInt32 langID)
\r
78 if (g_Lang.GetMessage(langID, message))
\r
83 UString LangString(UINT resourceID, UInt32 langID)
\r
86 if (g_Lang.GetMessage(langID, message))
\r
88 return NWindows::MyLoadStringW(resourceID);
\r
91 void LoadLangs(CObjectVector<CLangEx> &langs)
\r
95 if (!::GetProgramFolderPath(folderPath))
\r
97 folderPath += L"Lang" WSTRING_PATH_SEPARATOR;
\r
98 NWindows::NFile::NFind::CEnumeratorW enumerator(folderPath + L"*.txt");
\r
99 NWindows::NFile::NFind::CFileInfoW fileInfo;
\r
100 while (enumerator.Next(fileInfo))
\r
102 if (fileInfo.IsDir())
\r
105 UString filePath = folderPath + fileInfo.Name;
\r
106 const int kExtSize = 4;
\r
107 const UString ext = fileInfo.Name.Right(kExtSize);
\r
108 if (ext.CompareNoCase(L".txt") != 0)
\r
110 lang.ShortName = fileInfo.Name.Left(fileInfo.Name.Length() - kExtSize);
\r
111 if (lang.Lang.Open(filePath))
\r
116 bool SplidID(const UString &id, WORD &primID, WORD &subID)
\r
120 const wchar_t *start = id;
\r
121 const wchar_t *end;
\r
122 UInt64 value = ConvertStringToUInt64(start, &end);
\r
125 primID = (WORD)value;
\r
131 value = ConvertStringToUInt64(start, &end);
\r
134 subID = (WORD)value;
\r
135 return (*end == 0);
\r
138 typedef LANGID (WINAPI *GetUserDefaultUILanguageP)();
\r
140 void FindMatchLang(UString &shortName)
\r
144 LANGID SystemDefaultLangID = GetSystemDefaultLangID(); // Lang for non-Unicode in XP64
\r
145 LANGID UserDefaultLangID = GetUserDefaultLangID(); // Standarts and formats in XP64
\r
147 if (SystemDefaultLangID != UserDefaultLangID)
\r
149 LANGID langID = UserDefaultLangID;
\r
151 LANGID SystemDefaultUILanguage; // english in XP64
\r
152 LANGID UserDefaultUILanguage; // english in XP64
\r
154 GetUserDefaultUILanguageP fn = (GetUserDefaultUILanguageP)GetProcAddress(
\r
155 GetModuleHandle("kernel32"), "GetUserDefaultUILanguage");
\r
157 UserDefaultUILanguage = fn();
\r
158 fn = (GetUserDefaultUILanguageP)GetProcAddress(
\r
159 GetModuleHandle("kernel32"), "GetSystemDefaultUILanguage");
\r
161 SystemDefaultUILanguage = fn();
\r
164 WORD primLang = (WORD)(PRIMARYLANGID(langID));
\r
165 WORD subLang = (WORD)(SUBLANGID(langID));
\r
166 CObjectVector<CLangEx> langs;
\r
168 for (int i = 0; i < langs.Size(); i++)
\r
170 const CLangEx &lang = langs[i];
\r
172 if (lang.Lang.GetMessage(0x00000002, id))
\r
176 if (SplidID(id, primID, subID))
\r
177 if (primID == primLang)
\r
180 shortName = lang.ShortName;
\r
181 if (subLang == subID)
\r
183 shortName = lang.ShortName;
\r
191 void ReloadLangSmart()
\r
197 ReadRegLang(g_LangID);
\r
198 if (g_LangID.IsEmpty())
\r
201 FindMatchLang(shortName);
\r
202 if (shortName.IsEmpty())
\r
204 SaveRegLang(shortName);
\r