xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/LangPage.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LangPage.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Lang.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ResourceString.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "HelpUtils.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "LangPage.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "LangPageRes.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "RegistryUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_NumLangLines_EN = 443;
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
22*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker   IDT_LANG_LANG
25*f6dc9357SAndroid Build Coastguard Worker };
26*f6dc9357SAndroid Build Coastguard Worker #endif
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #define kLangTopic "fm/options.htm#language"
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker struct CLangListRecord
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker   int Order;
34*f6dc9357SAndroid Build Coastguard Worker   unsigned LangInfoIndex;
35*f6dc9357SAndroid Build Coastguard Worker   bool IsSelected;
36*f6dc9357SAndroid Build Coastguard Worker   UString Mark;
37*f6dc9357SAndroid Build Coastguard Worker   UString Name;
38*f6dc9357SAndroid Build Coastguard Worker 
CLangListRecordCLangListRecord39*f6dc9357SAndroid Build Coastguard Worker   CLangListRecord(): Order (10), IsSelected(false) {}
CompareCLangListRecord40*f6dc9357SAndroid Build Coastguard Worker   int Compare(const CLangListRecord &a) const
41*f6dc9357SAndroid Build Coastguard Worker   {
42*f6dc9357SAndroid Build Coastguard Worker     if (Order < a.Order) return -1;
43*f6dc9357SAndroid Build Coastguard Worker     if (Order > a.Order) return 1;
44*f6dc9357SAndroid Build Coastguard Worker     return MyStringCompareNoCase(Name, a.Name);
45*f6dc9357SAndroid Build Coastguard Worker   }
46*f6dc9357SAndroid Build Coastguard Worker };
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker 
NativeLangString(UString & dest,const wchar_t * s)49*f6dc9357SAndroid Build Coastguard Worker static void NativeLangString(UString &dest, const wchar_t *s)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   dest += " (";
52*f6dc9357SAndroid Build Coastguard Worker   dest += s;
53*f6dc9357SAndroid Build Coastguard Worker   dest.Add_Char(')');
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker bool LangOpen(CLang &lang, CFSTR fileName);
57*f6dc9357SAndroid Build Coastguard Worker 
OnInit()58*f6dc9357SAndroid Build Coastguard Worker bool CLangPage::OnInit()
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
61*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
62*f6dc9357SAndroid Build Coastguard Worker #endif
63*f6dc9357SAndroid Build Coastguard Worker   _langCombo.Attach(GetItem(IDC_LANG_LANG));
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker   unsigned listRecords_SelectedIndex = 0;
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CLangListRecord> listRecords;
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     CLangListRecord listRecord;
71*f6dc9357SAndroid Build Coastguard Worker     listRecord.Order = 0;
72*f6dc9357SAndroid Build Coastguard Worker     listRecord.Mark = "---";
73*f6dc9357SAndroid Build Coastguard Worker     listRecord.Name = MyLoadString(IDS_LANG_ENGLISH);
74*f6dc9357SAndroid Build Coastguard Worker     NativeLangString(listRecord.Name, MyLoadString(IDS_LANG_NATIVE));
75*f6dc9357SAndroid Build Coastguard Worker     listRecord.LangInfoIndex = _langs.Size();
76*f6dc9357SAndroid Build Coastguard Worker     listRecords.Add(listRecord);
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   AStringVector names;
80*f6dc9357SAndroid Build Coastguard Worker   unsigned subLangIndex = 0;
81*f6dc9357SAndroid Build Coastguard Worker   Lang_GetShortNames_for_DefaultLang(names, subLangIndex);
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker   const FString dirPrefix = GetLangDirPrefix();
84*f6dc9357SAndroid Build Coastguard Worker   NFile::NFind::CEnumerator enumerator;
85*f6dc9357SAndroid Build Coastguard Worker   enumerator.SetDirPrefix(dirPrefix);
86*f6dc9357SAndroid Build Coastguard Worker   NFile::NFind::CFileInfo fi;
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker   CLang lang_en;
89*f6dc9357SAndroid Build Coastguard Worker   {
90*f6dc9357SAndroid Build Coastguard Worker     CLangInfo &langInfo = _langs.AddNew();
91*f6dc9357SAndroid Build Coastguard Worker     langInfo.Name = "-";
92*f6dc9357SAndroid Build Coastguard Worker     if (LangOpen(lang_en, dirPrefix + FTEXT("en.ttt")))
93*f6dc9357SAndroid Build Coastguard Worker     {
94*f6dc9357SAndroid Build Coastguard Worker       langInfo.NumLines = lang_en._ids.Size();
95*f6dc9357SAndroid Build Coastguard Worker       // langInfo.Comments = lang_en.Comments;
96*f6dc9357SAndroid Build Coastguard Worker     }
97*f6dc9357SAndroid Build Coastguard Worker     else
98*f6dc9357SAndroid Build Coastguard Worker       langInfo.NumLines = k_NumLangLines_EN;
99*f6dc9357SAndroid Build Coastguard Worker     NumLangLines_EN = langInfo.NumLines;
100*f6dc9357SAndroid Build Coastguard Worker   }
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker   CLang lang;
103*f6dc9357SAndroid Build Coastguard Worker   UString error;
104*f6dc9357SAndroid Build Coastguard Worker   UString n;
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker   while (enumerator.Next(fi))
107*f6dc9357SAndroid Build Coastguard Worker   {
108*f6dc9357SAndroid Build Coastguard Worker     if (fi.IsDir())
109*f6dc9357SAndroid Build Coastguard Worker       continue;
110*f6dc9357SAndroid Build Coastguard Worker     const unsigned kExtSize = 4;
111*f6dc9357SAndroid Build Coastguard Worker     if (fi.Name.Len() < kExtSize)
112*f6dc9357SAndroid Build Coastguard Worker       continue;
113*f6dc9357SAndroid Build Coastguard Worker     const unsigned pos = fi.Name.Len() - kExtSize;
114*f6dc9357SAndroid Build Coastguard Worker     if (!StringsAreEqualNoCase_Ascii(fi.Name.Ptr(pos), ".txt"))
115*f6dc9357SAndroid Build Coastguard Worker     {
116*f6dc9357SAndroid Build Coastguard Worker       // if (!StringsAreEqualNoCase_Ascii(fi.Name.Ptr(pos), ".ttt"))
117*f6dc9357SAndroid Build Coastguard Worker       continue;
118*f6dc9357SAndroid Build Coastguard Worker     }
119*f6dc9357SAndroid Build Coastguard Worker 
120*f6dc9357SAndroid Build Coastguard Worker     if (!LangOpen(lang, dirPrefix + fi.Name))
121*f6dc9357SAndroid Build Coastguard Worker     {
122*f6dc9357SAndroid Build Coastguard Worker       error.Add_Space_if_NotEmpty();
123*f6dc9357SAndroid Build Coastguard Worker       error += fs2us(fi.Name);
124*f6dc9357SAndroid Build Coastguard Worker       continue;
125*f6dc9357SAndroid Build Coastguard Worker     }
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker     const UString shortName = fs2us(fi.Name.Left(pos));
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker     CLangListRecord listRecord;
130*f6dc9357SAndroid Build Coastguard Worker     if (!names.IsEmpty())
131*f6dc9357SAndroid Build Coastguard Worker     {
132*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = 0; i < names.Size(); i++)
133*f6dc9357SAndroid Build Coastguard Worker         if (shortName.IsEqualTo_Ascii_NoCase(names[i]))
134*f6dc9357SAndroid Build Coastguard Worker         {
135*f6dc9357SAndroid Build Coastguard Worker           if (subLangIndex == i || names.Size() == 1)
136*f6dc9357SAndroid Build Coastguard Worker           {
137*f6dc9357SAndroid Build Coastguard Worker             listRecord.Mark = "***";
138*f6dc9357SAndroid Build Coastguard Worker             // listRecord.Order = 1;
139*f6dc9357SAndroid Build Coastguard Worker           }
140*f6dc9357SAndroid Build Coastguard Worker           else
141*f6dc9357SAndroid Build Coastguard Worker           {
142*f6dc9357SAndroid Build Coastguard Worker             listRecord.Mark = "+++";
143*f6dc9357SAndroid Build Coastguard Worker             // listRecord.Order = 2;
144*f6dc9357SAndroid Build Coastguard Worker           }
145*f6dc9357SAndroid Build Coastguard Worker           break;
146*f6dc9357SAndroid Build Coastguard Worker         }
147*f6dc9357SAndroid Build Coastguard Worker       if (listRecord.Mark.IsEmpty())
148*f6dc9357SAndroid Build Coastguard Worker       {
149*f6dc9357SAndroid Build Coastguard Worker         const int minusPos = shortName.Find(L'-');
150*f6dc9357SAndroid Build Coastguard Worker         if (minusPos >= 0)
151*f6dc9357SAndroid Build Coastguard Worker         {
152*f6dc9357SAndroid Build Coastguard Worker           const UString shortName2 = shortName.Left(minusPos);
153*f6dc9357SAndroid Build Coastguard Worker           if (shortName2.IsEqualTo_Ascii_NoCase(names[0]))
154*f6dc9357SAndroid Build Coastguard Worker           {
155*f6dc9357SAndroid Build Coastguard Worker             listRecord.Mark = "+++";
156*f6dc9357SAndroid Build Coastguard Worker             // listRecord.Order = 3;
157*f6dc9357SAndroid Build Coastguard Worker           }
158*f6dc9357SAndroid Build Coastguard Worker         }
159*f6dc9357SAndroid Build Coastguard Worker       }
160*f6dc9357SAndroid Build Coastguard Worker     }
161*f6dc9357SAndroid Build Coastguard Worker     UString s = shortName;
162*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *eng = lang.Get(IDS_LANG_ENGLISH);
163*f6dc9357SAndroid Build Coastguard Worker     if (eng)
164*f6dc9357SAndroid Build Coastguard Worker       s = eng;
165*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *native = lang.Get(IDS_LANG_NATIVE);
166*f6dc9357SAndroid Build Coastguard Worker     if (native)
167*f6dc9357SAndroid Build Coastguard Worker       NativeLangString(s, native);
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker     listRecord.Name = s;
170*f6dc9357SAndroid Build Coastguard Worker     listRecord.LangInfoIndex = _langs.Size();
171*f6dc9357SAndroid Build Coastguard Worker     listRecords.Add(listRecord);
172*f6dc9357SAndroid Build Coastguard Worker     if (g_LangID.IsEqualTo_NoCase(shortName))
173*f6dc9357SAndroid Build Coastguard Worker       listRecords_SelectedIndex = listRecords.Size() - 1;
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker     CLangInfo &langInfo = _langs.AddNew();
176*f6dc9357SAndroid Build Coastguard Worker     langInfo.Comments = lang.Comments;
177*f6dc9357SAndroid Build Coastguard Worker     langInfo.Name = shortName;
178*f6dc9357SAndroid Build Coastguard Worker     unsigned numLines = lang._ids.Size();
179*f6dc9357SAndroid Build Coastguard Worker     if (!lang_en.IsEmpty())
180*f6dc9357SAndroid Build Coastguard Worker     {
181*f6dc9357SAndroid Build Coastguard Worker       numLines = 0;
182*f6dc9357SAndroid Build Coastguard Worker       unsigned i1 = 0;
183*f6dc9357SAndroid Build Coastguard Worker       unsigned i2 = 0;
184*f6dc9357SAndroid Build Coastguard Worker       for (;;)
185*f6dc9357SAndroid Build Coastguard Worker       {
186*f6dc9357SAndroid Build Coastguard Worker         UInt32 id1 = (UInt32)0 - 1;
187*f6dc9357SAndroid Build Coastguard Worker         UInt32 id2 = (UInt32)0 - 1;
188*f6dc9357SAndroid Build Coastguard Worker         bool id1_defined = false;
189*f6dc9357SAndroid Build Coastguard Worker         bool id2_defined = false;
190*f6dc9357SAndroid Build Coastguard Worker         if (i1 < lang_en._ids.Size())
191*f6dc9357SAndroid Build Coastguard Worker         {
192*f6dc9357SAndroid Build Coastguard Worker           id1 = lang_en._ids[i1];
193*f6dc9357SAndroid Build Coastguard Worker           id1_defined = true;
194*f6dc9357SAndroid Build Coastguard Worker         }
195*f6dc9357SAndroid Build Coastguard Worker         if (i2 < lang._ids.Size())
196*f6dc9357SAndroid Build Coastguard Worker         {
197*f6dc9357SAndroid Build Coastguard Worker           id2 = lang._ids[i2];
198*f6dc9357SAndroid Build Coastguard Worker           id2_defined = true;
199*f6dc9357SAndroid Build Coastguard Worker         }
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker         bool id1_is_smaller = true;
202*f6dc9357SAndroid Build Coastguard Worker         if (id1_defined)
203*f6dc9357SAndroid Build Coastguard Worker         {
204*f6dc9357SAndroid Build Coastguard Worker           if (id2_defined)
205*f6dc9357SAndroid Build Coastguard Worker           {
206*f6dc9357SAndroid Build Coastguard Worker             if (id1 == id2)
207*f6dc9357SAndroid Build Coastguard Worker             {
208*f6dc9357SAndroid Build Coastguard Worker               i1++;
209*f6dc9357SAndroid Build Coastguard Worker               i2++;
210*f6dc9357SAndroid Build Coastguard Worker               numLines++;
211*f6dc9357SAndroid Build Coastguard Worker               continue;
212*f6dc9357SAndroid Build Coastguard Worker             }
213*f6dc9357SAndroid Build Coastguard Worker             if (id1 > id2)
214*f6dc9357SAndroid Build Coastguard Worker               id1_is_smaller = false;
215*f6dc9357SAndroid Build Coastguard Worker           }
216*f6dc9357SAndroid Build Coastguard Worker         }
217*f6dc9357SAndroid Build Coastguard Worker         else if (!id2_defined)
218*f6dc9357SAndroid Build Coastguard Worker           break;
219*f6dc9357SAndroid Build Coastguard Worker         else
220*f6dc9357SAndroid Build Coastguard Worker           id1_is_smaller = false;
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker         n.Empty();
223*f6dc9357SAndroid Build Coastguard Worker         if (id1_is_smaller)
224*f6dc9357SAndroid Build Coastguard Worker         {
225*f6dc9357SAndroid Build Coastguard Worker           n.Add_UInt32(id1);
226*f6dc9357SAndroid Build Coastguard Worker           n += " : ";
227*f6dc9357SAndroid Build Coastguard Worker           n += lang_en.Get_by_index(i1);
228*f6dc9357SAndroid Build Coastguard Worker           langInfo.MissingLines.Add(n);
229*f6dc9357SAndroid Build Coastguard Worker           i1++;
230*f6dc9357SAndroid Build Coastguard Worker         }
231*f6dc9357SAndroid Build Coastguard Worker         else
232*f6dc9357SAndroid Build Coastguard Worker         {
233*f6dc9357SAndroid Build Coastguard Worker           n.Add_UInt32(id2);
234*f6dc9357SAndroid Build Coastguard Worker           n += " : ";
235*f6dc9357SAndroid Build Coastguard Worker           n += lang.Get_by_index(i2);
236*f6dc9357SAndroid Build Coastguard Worker           langInfo.ExtraLines.Add(n);
237*f6dc9357SAndroid Build Coastguard Worker           i2++;
238*f6dc9357SAndroid Build Coastguard Worker         }
239*f6dc9357SAndroid Build Coastguard Worker       }
240*f6dc9357SAndroid Build Coastguard Worker     }
241*f6dc9357SAndroid Build Coastguard Worker     langInfo.NumLines = numLines + langInfo.ExtraLines.Size();
242*f6dc9357SAndroid Build Coastguard Worker   }
243*f6dc9357SAndroid Build Coastguard Worker 
244*f6dc9357SAndroid Build Coastguard Worker   listRecords[listRecords_SelectedIndex].IsSelected = true;
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   listRecords.Sort();
247*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, listRecords)
248*f6dc9357SAndroid Build Coastguard Worker   {
249*f6dc9357SAndroid Build Coastguard Worker     const CLangListRecord &rec= listRecords[i];
250*f6dc9357SAndroid Build Coastguard Worker     UString temp = rec.Name;
251*f6dc9357SAndroid Build Coastguard Worker     if (!rec.Mark.IsEmpty())
252*f6dc9357SAndroid Build Coastguard Worker     {
253*f6dc9357SAndroid Build Coastguard Worker       temp += "  ";
254*f6dc9357SAndroid Build Coastguard Worker       temp += rec.Mark;
255*f6dc9357SAndroid Build Coastguard Worker     }
256*f6dc9357SAndroid Build Coastguard Worker     const int index = (int)_langCombo.AddString(temp);
257*f6dc9357SAndroid Build Coastguard Worker     _langCombo.SetItemData(index, (LPARAM)rec.LangInfoIndex);
258*f6dc9357SAndroid Build Coastguard Worker     if (rec.IsSelected)
259*f6dc9357SAndroid Build Coastguard Worker       _langCombo.SetCurSel(index);
260*f6dc9357SAndroid Build Coastguard Worker   }
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker   ShowLangInfo();
263*f6dc9357SAndroid Build Coastguard Worker 
264*f6dc9357SAndroid Build Coastguard Worker   if (!error.IsEmpty())
265*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(NULL, error, L"Error in Lang file", MB_ICONERROR);
266*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnInit();
267*f6dc9357SAndroid Build Coastguard Worker }
268*f6dc9357SAndroid Build Coastguard Worker 
OnApply()269*f6dc9357SAndroid Build Coastguard Worker LONG CLangPage::OnApply()
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker   if (_needSave)
272*f6dc9357SAndroid Build Coastguard Worker   {
273*f6dc9357SAndroid Build Coastguard Worker     const int pathIndex = (int)_langCombo.GetItemData_of_CurSel();
274*f6dc9357SAndroid Build Coastguard Worker     if ((unsigned)pathIndex < _langs.Size())
275*f6dc9357SAndroid Build Coastguard Worker       SaveRegLang(_langs[pathIndex].Name);
276*f6dc9357SAndroid Build Coastguard Worker   }
277*f6dc9357SAndroid Build Coastguard Worker   _needSave = false;
278*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
279*f6dc9357SAndroid Build Coastguard Worker   ReloadLang();
280*f6dc9357SAndroid Build Coastguard Worker   #endif
281*f6dc9357SAndroid Build Coastguard Worker   LangWasChanged = true;
282*f6dc9357SAndroid Build Coastguard Worker   return PSNRET_NOERROR;
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker 
OnNotifyHelp()285*f6dc9357SAndroid Build Coastguard Worker void CLangPage::OnNotifyHelp()
286*f6dc9357SAndroid Build Coastguard Worker {
287*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kLangTopic);
288*f6dc9357SAndroid Build Coastguard Worker }
289*f6dc9357SAndroid Build Coastguard Worker 
OnCommand(unsigned code,unsigned itemID,LPARAM param)290*f6dc9357SAndroid Build Coastguard Worker bool CLangPage::OnCommand(unsigned code, unsigned itemID, LPARAM param)
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker   if (code == CBN_SELCHANGE && itemID == IDC_LANG_LANG)
293*f6dc9357SAndroid Build Coastguard Worker   {
294*f6dc9357SAndroid Build Coastguard Worker     _needSave = true;
295*f6dc9357SAndroid Build Coastguard Worker     Changed();
296*f6dc9357SAndroid Build Coastguard Worker     ShowLangInfo();
297*f6dc9357SAndroid Build Coastguard Worker     return true;
298*f6dc9357SAndroid Build Coastguard Worker   }
299*f6dc9357SAndroid Build Coastguard Worker   return CPropertyPage::OnCommand(code, itemID, param);
300*f6dc9357SAndroid Build Coastguard Worker }
301*f6dc9357SAndroid Build Coastguard Worker 
AddVectorToString(UString & s,const UStringVector & v)302*f6dc9357SAndroid Build Coastguard Worker static void AddVectorToString(UString &s, const UStringVector &v)
303*f6dc9357SAndroid Build Coastguard Worker {
304*f6dc9357SAndroid Build Coastguard Worker   UString a;
305*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, v)
306*f6dc9357SAndroid Build Coastguard Worker   {
307*f6dc9357SAndroid Build Coastguard Worker     if (i >= 50)
308*f6dc9357SAndroid Build Coastguard Worker       break;
309*f6dc9357SAndroid Build Coastguard Worker     a = v[i];
310*f6dc9357SAndroid Build Coastguard Worker     if (a.Len() > 1500)
311*f6dc9357SAndroid Build Coastguard Worker       continue;
312*f6dc9357SAndroid Build Coastguard Worker     if (a[0] == ';')
313*f6dc9357SAndroid Build Coastguard Worker     {
314*f6dc9357SAndroid Build Coastguard Worker       a.DeleteFrontal(1);
315*f6dc9357SAndroid Build Coastguard Worker       a.Trim();
316*f6dc9357SAndroid Build Coastguard Worker     }
317*f6dc9357SAndroid Build Coastguard Worker     s += a;
318*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
319*f6dc9357SAndroid Build Coastguard Worker   }
320*f6dc9357SAndroid Build Coastguard Worker }
321*f6dc9357SAndroid Build Coastguard Worker 
AddVectorToString2(UString & s,const char * name,const UStringVector & v)322*f6dc9357SAndroid Build Coastguard Worker static void AddVectorToString2(UString &s, const char *name, const UStringVector &v)
323*f6dc9357SAndroid Build Coastguard Worker {
324*f6dc9357SAndroid Build Coastguard Worker   if (v.IsEmpty())
325*f6dc9357SAndroid Build Coastguard Worker     return;
326*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
327*f6dc9357SAndroid Build Coastguard Worker   s += "------ ";
328*f6dc9357SAndroid Build Coastguard Worker   s += name;
329*f6dc9357SAndroid Build Coastguard Worker   s += ": ";
330*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32(v.Size());
331*f6dc9357SAndroid Build Coastguard Worker   s += " :";
332*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
333*f6dc9357SAndroid Build Coastguard Worker   AddVectorToString(s, v);
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker 
ShowLangInfo()336*f6dc9357SAndroid Build Coastguard Worker void CLangPage::ShowLangInfo()
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker   UString s;
339*f6dc9357SAndroid Build Coastguard Worker   const int pathIndex = (int)_langCombo.GetItemData_of_CurSel();
340*f6dc9357SAndroid Build Coastguard Worker   if ((unsigned)pathIndex < _langs.Size())
341*f6dc9357SAndroid Build Coastguard Worker   {
342*f6dc9357SAndroid Build Coastguard Worker     const CLangInfo &langInfo = _langs[pathIndex];
343*f6dc9357SAndroid Build Coastguard Worker     const unsigned numLines = langInfo.NumLines;
344*f6dc9357SAndroid Build Coastguard Worker     s += langInfo.Name;
345*f6dc9357SAndroid Build Coastguard Worker     s += " : ";
346*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(numLines);
347*f6dc9357SAndroid Build Coastguard Worker     if (NumLangLines_EN != 0)
348*f6dc9357SAndroid Build Coastguard Worker     {
349*f6dc9357SAndroid Build Coastguard Worker       s += " / ";
350*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(NumLangLines_EN);
351*f6dc9357SAndroid Build Coastguard Worker       s += " = ";
352*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(numLines * 100 / NumLangLines_EN);
353*f6dc9357SAndroid Build Coastguard Worker       s += "%";
354*f6dc9357SAndroid Build Coastguard Worker     }
355*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
356*f6dc9357SAndroid Build Coastguard Worker     AddVectorToString(s, langInfo.Comments);
357*f6dc9357SAndroid Build Coastguard Worker     AddVectorToString2(s, "Missing lines", langInfo.MissingLines);
358*f6dc9357SAndroid Build Coastguard Worker     AddVectorToString2(s, "Extra lines", langInfo.ExtraLines);
359*f6dc9357SAndroid Build Coastguard Worker   }
360*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDT_LANG_INFO, s);
361*f6dc9357SAndroid Build Coastguard Worker }
362