f0f4cb3b4c9b40aced6325532259ac3da2bfa668
[reactos.git] / reactos / dll / cpl / intl / generalp.c
1 /*
2 * ReactOS
3 * Copyright (C) 2004, 2005 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 /*
20 * PROJECT: ReactOS International Control Panel
21 * FILE: dll/cpl/intl/generalp.c
22 * PURPOSE: General property page
23 * PROGRAMMER: Eric Kohl
24 * Klemens Friedl
25 * Aleksey Bragin
26 */
27
28 #include "intl.h"
29
30 #include <debug.h>
31
32 #define SAMPLE_NUMBER _T("123456789")
33 #define NO_FLAG 0
34
35 typedef struct
36 {
37 LCTYPE lcType;
38 PWSTR pKeyName;
39 } LOCALE_KEY_DATA, *PLOCALE_KEY_DATA;
40
41 HWND hList;
42 HWND hLocaleList, hGeoList;
43 BOOL bSpain = FALSE;
44
45 LOCALE_KEY_DATA LocaleKeyData[] =
46 {
47 {LOCALE_ICALENDARTYPE, L"iCalendarType"},
48 {LOCALE_ICOUNTRY, L"iCountry"},
49 {LOCALE_ICURRDIGITS, L"iCurrDigits"},
50 {LOCALE_ICURRENCY, L"iCurrency"},
51 {LOCALE_IDATE, L"iDate"},
52 {LOCALE_IDIGITS, L"iDigits"},
53 {LOCALE_IFIRSTDAYOFWEEK, L"iFirstDayOfWeek"},
54 {LOCALE_IFIRSTWEEKOFYEAR, L"iFirstWeekOfYear"},
55 {LOCALE_ILZERO, L"iLZero"},
56 {LOCALE_IMEASURE, L"iMeasure"},
57 {LOCALE_INEGCURR, L"iNegCurr"},
58 {LOCALE_INEGNUMBER, L"iNegNumber"},
59 {LOCALE_ITIME, L"iTime"},
60 {LOCALE_ITIMEMARKPOSN, L"iTimePrefix"},
61 {LOCALE_ITLZERO, L"iTLZero"},
62 {LOCALE_IDIGITSUBSTITUTION, L"NumShape"},
63 {LOCALE_S1159, L"s1159"},
64 {LOCALE_S2359, L"s2359"},
65 {LOCALE_SCOUNTRY, L"sCountry"},
66 {LOCALE_SCURRENCY, L"sCurrency"},
67 {LOCALE_SDATE, L"sDate"},
68 {LOCALE_SDECIMAL, L"sDecimal"},
69 {LOCALE_SGROUPING, L"sGrouping"},
70 {LOCALE_SABBREVLANGNAME, L"sLanguage"},
71 {LOCALE_SLIST, L"sList"},
72 {LOCALE_SLONGDATE, L"sLongDate"},
73 {LOCALE_SMONDECIMALSEP, L"sMonDecimalSep"},
74 {LOCALE_SMONGROUPING, L"sMonGrouping"},
75 {LOCALE_SMONTHOUSANDSEP, L"sMonThousandSep"},
76 {LOCALE_SNATIVEDIGITS, L"sNativeDigits"},
77 {LOCALE_SNEGATIVESIGN, L"sNegativeSign"},
78 {LOCALE_SPOSITIVESIGN, L"sPositiveSign"},
79 {LOCALE_SSHORTDATE, L"sShortDate"},
80 {LOCALE_STHOUSAND, L"sThousand"},
81 {LOCALE_STIME, L"sTime"},
82 {LOCALE_STIMEFORMAT, L"sTimeFormat"}
83 };
84
85
86 static BOOL CALLBACK
87 LocalesEnumProc(LPTSTR lpLocale)
88 {
89 LCID lcid;
90 TCHAR lang[255];
91 INT index;
92 BOOL bNoShow = FALSE;
93
94 lcid = _tcstoul(lpLocale, NULL, 16);
95
96 /* Display only languages with installed support */
97 if (!IsValidLocale(lcid, LCID_INSTALLED))
98 return TRUE;
99
100 if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
101 lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
102 {
103 if (bSpain == FALSE)
104 {
105 LoadString(hApplet, IDS_SPAIN, lang, 255);
106 bSpain = TRUE;
107 }
108 else
109 {
110 bNoShow = TRUE;
111 }
112 }
113 else
114 {
115 GetLocaleInfo(lcid, LOCALE_SLANGUAGE, lang, sizeof(lang)/sizeof(TCHAR));
116 }
117
118 if (bNoShow == FALSE)
119 {
120 index = SendMessage(hList,
121 CB_ADDSTRING,
122 0,
123 (LPARAM)lang);
124
125 SendMessage(hList,
126 CB_SETITEMDATA,
127 index,
128 (LPARAM)lcid);
129 }
130
131 return TRUE;
132 }
133
134
135 PWSTR
136 GetLocaleString(
137 PWSTR *pLocaleArray,
138 LCTYPE lcType)
139 {
140 DWORD dwDataCount, i;
141
142 dwDataCount = sizeof(LocaleKeyData) / sizeof(LOCALE_KEY_DATA);
143 for (i = 0; i < dwDataCount; i++)
144 {
145 if (LocaleKeyData[i].lcType == lcType)
146 return pLocaleArray[i];
147 }
148
149 return NULL;
150 }
151
152
153 /* Update all locale samples */
154 static
155 VOID
156 UpdateLocaleSample(
157 HWND hwndDlg,
158 PGLOBALDATA pGlobalData)
159 {
160 WCHAR OutBuffer[MAX_SAMPLES_STR_SIZE];
161
162 /* Get number format sample */
163 GetNumberFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL,
164 OutBuffer, MAX_SAMPLES_STR_SIZE);
165 SendDlgItemMessageW(hwndDlg, IDC_NUMSAMPLE_EDIT,
166 WM_SETTEXT, 0, (LPARAM)OutBuffer);
167 ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
168
169 /* Get monetary format sample */
170 GetCurrencyFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL,
171 OutBuffer, MAX_SAMPLES_STR_SIZE);
172 SendDlgItemMessageW(hwndDlg, IDC_MONEYSAMPLE_EDIT,
173 WM_SETTEXT, 0, (LPARAM)OutBuffer);
174 ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
175
176 /* Get time format sample */
177 GetTimeFormatW(pGlobalData->lcid, NO_FLAG, NULL, NULL,
178 OutBuffer, MAX_SAMPLES_STR_SIZE);
179 SendDlgItemMessageW(hwndDlg, IDC_TIMESAMPLE_EDIT,
180 WM_SETTEXT, 0, (LPARAM)OutBuffer);
181 ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
182
183 /* Get short date format sample */
184 GetDateFormatW(pGlobalData->lcid, DATE_SHORTDATE, NULL, NULL,
185 OutBuffer, MAX_SAMPLES_STR_SIZE);
186 SendDlgItemMessageW(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT,
187 WM_SETTEXT, 0, (LPARAM)OutBuffer);
188
189 /* Get long date sample */
190 GetDateFormatW(pGlobalData->lcid, DATE_LONGDATE, NULL, NULL,
191 OutBuffer, MAX_SAMPLES_STR_SIZE);
192 SendDlgItemMessageW(hwndDlg, IDC_FULLTIMESAMPLE_EDIT,
193 WM_SETTEXT, 0, (LPARAM)OutBuffer);
194 }
195
196 static VOID
197 CreateLanguagesList(HWND hwnd)
198 {
199 TCHAR langSel[255];
200
201 hList = hwnd;
202 bSpain = FALSE;
203 EnumSystemLocales(LocalesEnumProc, LCID_SUPPORTED);
204
205 /* Select current locale */
206 /* or should it be System and not user? */
207 GetLocaleInfo(GetUserDefaultLCID(), LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(TCHAR));
208
209 SendMessage(hList,
210 CB_SELECTSTRING,
211 -1,
212 (LPARAM)langSel);
213 }
214
215
216 BOOL
217 LoadCurrentLocale(
218 PGLOBALDATA pGlobalData)
219 {
220 WCHAR szValue[9];
221 PWSTR ptr;
222 HKEY hLocaleKey;
223 DWORD ret;
224 DWORD dwSize;
225 DWORD i;
226
227 ret = RegOpenKeyExW(HKEY_CURRENT_USER,
228 L"Control Panel\\International",
229 0,
230 KEY_READ,
231 &hLocaleKey);
232 if (ret != ERROR_SUCCESS)
233 {
234 PrintErrorMsgBox(IDS_ERROR_INT_KEY_REG);
235 return FALSE;
236 }
237
238 pGlobalData->dwLocaleCount = sizeof(LocaleKeyData) / sizeof(LOCALE_KEY_DATA);
239
240 pGlobalData->pLocaleArray = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
241 pGlobalData->dwLocaleCount * sizeof(PWSTR));
242 if (pGlobalData->pLocaleArray == NULL)
243 {
244 RegCloseKey(hLocaleKey);
245 return FALSE;
246 }
247
248 dwSize = 9 * sizeof(WCHAR);
249 RegQueryValueExW(hLocaleKey,
250 L"Locale",
251 NULL,
252 NULL,
253 (PBYTE)szValue,
254 &dwSize);
255 pGlobalData->lcid = (LCID)wcstoul(szValue, &ptr, 16);
256
257 for (i = 0; i < pGlobalData->dwLocaleCount; i++)
258 {
259 RegQueryValueExW(hLocaleKey,
260 LocaleKeyData[i].pKeyName,
261 NULL,
262 NULL,
263 NULL,
264 &dwSize);
265 if (dwSize > 0)
266 {
267 pGlobalData->pLocaleArray[i] = HeapAlloc(GetProcessHeap(), 0, dwSize);
268 if (pGlobalData->pLocaleArray[i])
269 {
270 RegQueryValueExW(hLocaleKey,
271 LocaleKeyData[i].pKeyName,
272 NULL,
273 NULL,
274 (LPVOID)pGlobalData->pLocaleArray[i],
275 &dwSize);
276 }
277 }
278 }
279
280 RegCloseKey(hLocaleKey);
281
282 return TRUE;
283 }
284
285
286 VOID
287 FreeCurrentLocale(
288 PGLOBALDATA pGlobalData)
289 {
290 DWORD i;
291
292 if (pGlobalData == NULL || pGlobalData->pLocaleArray == NULL)
293 return;
294
295 for (i = 0; i < pGlobalData->dwLocaleCount; i++)
296 {
297 if (pGlobalData->pLocaleArray[i])
298 HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray[i]);
299 }
300 HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray);
301 }
302
303
304 VOID
305 SetNewLocale(
306 PGLOBALDATA pGlobalData,
307 LCID lcid)
308 {
309 DWORD i, dwSize;
310
311 pGlobalData->lcid = lcid;
312
313 for (i = 0; i < pGlobalData->dwLocaleCount; i++)
314 {
315 if (pGlobalData->pLocaleArray[i])
316 {
317 HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray[i]);
318 pGlobalData->pLocaleArray[i] = NULL;
319 }
320
321 dwSize = GetLocaleInfo(lcid,
322 LocaleKeyData[i].lcType | LOCALE_NOUSEROVERRIDE,
323 NULL,
324 0);
325 if (dwSize > 0)
326 {
327 pGlobalData->pLocaleArray[i] = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR));
328 if (pGlobalData->pLocaleArray[i])
329 {
330 GetLocaleInfo(lcid,
331 LocaleKeyData[i].lcType | LOCALE_NOUSEROVERRIDE,
332 pGlobalData->pLocaleArray[i],
333 dwSize);
334 }
335 }
336 }
337 }
338
339
340 /* Sets new locale */
341 VOID
342 SaveCurrentLocale(
343 PGLOBALDATA pGlobalData)
344 {
345 // HKCU\\Control Panel\\International\\Locale = 0409 (type=0)
346 // HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" (type=0)
347 // HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","InstallLanguage",0x00000000,"0409" (type=0)
348
349 // Set locale
350 HKEY localeKey;
351 DWORD ret;
352 WCHAR value[9];
353 DWORD valuesize;
354 DWORD i;
355
356 #if 0
357 ret = GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, OEMPage, sizeof(OEMPage)/sizeof(TCHAR));
358 if (ret == 0)
359 {
360 PrintErrorMsgBox(IDS_ERROR_OEM_CODE_PAGE);
361 return;
362 }
363
364 ret = GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, ACPPage, sizeof(ACPPage)/sizeof(TCHAR));
365 if (ret == 0)
366 {
367 PrintErrorMsgBox(IDS_ERROR_ANSI_CODE_PAGE);
368 return;
369 }
370 #endif
371
372 ret = RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\International",
373 0, KEY_READ | KEY_WRITE, &localeKey);
374 if (ret != ERROR_SUCCESS)
375 {
376 PrintErrorMsgBox(IDS_ERROR_INT_KEY_REG);
377 return;
378 }
379
380 wsprintf(value, L"%08x", (DWORD)pGlobalData->lcid);
381 valuesize = (wcslen(value) + 1) * sizeof(WCHAR);
382
383 ret = RegSetValueExW(localeKey, L"Locale", 0, REG_SZ, (PBYTE)value, valuesize);
384 if (ret != ERROR_SUCCESS)
385 {
386 RegCloseKey(localeKey);
387 PrintErrorMsgBox(IDS_ERROR_INT_KEY_REG);
388 return;
389 }
390
391 for (i = 0; i < pGlobalData->dwLocaleCount; i++)
392 {
393 RegSetValueExW(localeKey,
394 LocaleKeyData[i].pKeyName,
395 0,
396 REG_SZ,
397 (PBYTE)pGlobalData->pLocaleArray[i],
398 (wcslen(pGlobalData->pLocaleArray[i]) + 1) * sizeof(WCHAR));
399 }
400
401 /* Flush and close the locale key */
402 RegFlushKey(localeKey);
403 RegCloseKey(localeKey);
404
405 /* Set the new locale for the current process */
406 NtSetDefaultLocale(TRUE, pGlobalData->lcid);
407
408 #if 0
409 ret = RegOpenKey(HKEY_USERS, _T(".DEFAULT\\Control Panel\\International"), &localeKey);
410 if (ret != ERROR_SUCCESS)
411 {
412 PrintErrorMsgBox(IDS_ERROR_DEF_INT_KEY_REG);
413 return;
414 }
415
416 wsprintf(value, _T("%08X"), (DWORD)lcid);
417 valuesize = (_tcslen(value) + 1) * sizeof(TCHAR);
418
419 RegSetValueEx(localeKey, _T("Locale"), 0, REG_SZ, (BYTE *)value, valuesize);
420 RegCloseKey(localeKey);
421
422 // Set language
423 ret = RegOpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\NLS\\Language"), &langKey);
424 if (ret != ERROR_SUCCESS)
425 {
426 PrintErrorMsgBox(IDS_ERROR_NLS_KEY_REG);
427 return;
428 }
429
430 RegSetValueEx(langKey, _T("Default"), 0, REG_SZ, (BYTE *)value, valuesize );
431 RegSetValueEx(langKey, _T("InstallLanguage"), 0, REG_SZ, (BYTE *)value, valuesize );
432
433 RegCloseKey(langKey);
434
435
436 /* Set language */
437 ret = RegOpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage"), &langKey);
438 if (ret != ERROR_SUCCESS)
439 {
440 PrintErrorMsgBox(IDS_ERROR_NLS_CODE_REG);
441 return;
442 }
443
444 RegSetValueExW(langKey, _T("OEMCP"), 0, REG_SZ, (BYTE *)OEMPage, (_tcslen(OEMPage) +1 ) * sizeof(TCHAR));
445 RegSetValueExW(langKey, _T("ACP"), 0, REG_SZ, (BYTE *)ACPPage, (_tcslen(ACPPage) +1 ) * sizeof(TCHAR));
446
447 RegCloseKey(langKey);
448 #endif
449 }
450
451 /* Location enumerate procedure */
452 BOOL
453 CALLBACK
454 LocationsEnumProc(GEOID gId)
455 {
456 TCHAR loc[MAX_STR_SIZE];
457 INT index;
458
459 if (GetGeoInfo(gId, GEO_FRIENDLYNAME, loc, MAX_STR_SIZE, LANG_SYSTEM_DEFAULT) == 0)
460 return TRUE;
461
462 index = (INT)SendMessage(hGeoList,
463 CB_ADDSTRING,
464 0,
465 (LPARAM)loc);
466
467 SendMessage(hGeoList,
468 CB_SETITEMDATA,
469 index,
470 (LPARAM)gId);
471
472 return TRUE;
473 }
474
475 /* Enumerate all system locations identifiers */
476 static
477 GEOID
478 CreateLocationsList(HWND hWnd)
479 {
480 GEOID userGeoID;
481 TCHAR loc[MAX_STR_SIZE];
482
483 hGeoList = hWnd;
484
485 EnumSystemGeoID(GEOCLASS_NATION, 0, LocationsEnumProc);
486
487 /* Select current location */
488 userGeoID = GetUserGeoID(GEOCLASS_NATION);
489 GetGeoInfo(userGeoID,
490 GEO_FRIENDLYNAME,
491 loc,
492 MAX_STR_SIZE,
493 LANG_SYSTEM_DEFAULT);
494
495 SendMessage(hGeoList,
496 CB_SELECTSTRING,
497 (WPARAM) -1,
498 (LPARAM)loc);
499
500 return userGeoID;
501 }
502
503 DWORD
504 VerifyUnattendLCID(HWND hwndDlg)
505 {
506 LRESULT lCount, lIndex, lResult;
507
508 lCount = SendMessage(hList, CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
509 if (lCount == CB_ERR)
510 {
511 return 0;
512 }
513
514 for (lIndex = 0; lIndex < lCount; lIndex++)
515 {
516 lResult = SendMessage(hList, CB_GETITEMDATA, (WPARAM)lIndex, (LPARAM)0);
517 if (lResult == CB_ERR)
518 {
519 continue;
520 }
521
522 if (lResult == (LRESULT)UnattendLCID)
523 {
524 SendMessage(hList, CB_SETCURSEL, (WPARAM)lIndex, (LPARAM)0);
525 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
526 return 1;
527 }
528 }
529
530 return 0;
531 }
532
533
534 /* Property page dialog callback */
535 INT_PTR CALLBACK
536 GeneralPageProc(HWND hwndDlg,
537 UINT uMsg,
538 WPARAM wParam,
539 LPARAM lParam)
540 {
541 PGLOBALDATA pGlobalData;
542
543 pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
544
545 switch (uMsg)
546 {
547 case WM_INITDIALOG:
548 pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBALDATA));
549 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
550
551 if (pGlobalData)
552 {
553 LoadCurrentLocale(pGlobalData);
554
555 CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST));
556 UpdateLocaleSample(hwndDlg, pGlobalData);
557 pGlobalData->geoid = CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO));
558 if (IsUnattendedSetupEnabled)
559 {
560 if (VerifyUnattendLCID(hwndDlg))
561 {
562 SetNewLocale(pGlobalData, UnattendLCID);
563 SaveCurrentLocale(pGlobalData);
564 PostQuitMessage(0);
565 }
566 else
567 {
568 DPRINT1("VerifyUnattendLCID failed\n");
569 }
570 return TRUE;
571 }
572 }
573 break;
574
575 case WM_COMMAND:
576 switch (LOWORD(wParam))
577 {
578 case IDC_LANGUAGELIST:
579 if (HIWORD(wParam) == CBN_SELCHANGE)
580 {
581 LCID NewLcid;
582 INT iCurSel;
583
584 iCurSel = SendMessage(hList,
585 CB_GETCURSEL,
586 0,
587 0);
588 if (iCurSel == CB_ERR)
589 break;
590
591 NewLcid = SendMessage(hList,
592 CB_GETITEMDATA,
593 iCurSel,
594 0);
595 if (NewLcid == (LCID)CB_ERR)
596 break;
597
598 SetNewLocale(pGlobalData, NewLcid);
599 UpdateLocaleSample(hwndDlg, pGlobalData);
600 pGlobalData->fUserLocaleChanged = TRUE;
601
602 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
603 }
604 break;
605
606 case IDC_LOCATION_COMBO:
607 if (HIWORD(wParam) == CBN_SELCHANGE)
608 {
609 GEOID NewGeoID;
610 INT iCurSel;
611
612 iCurSel = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
613 CB_GETCURSEL,
614 0,
615 0);
616 if (iCurSel == CB_ERR)
617 break;
618
619 NewGeoID = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
620 CB_GETITEMDATA,
621 iCurSel,
622 0);
623 if (NewGeoID == (GEOID)CB_ERR)
624 break;
625
626 pGlobalData->geoid = NewGeoID;
627 pGlobalData->fGeoIdChanged = TRUE;
628
629 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
630 }
631 break;
632
633 case IDC_SETUP_BUTTON:
634 SetupApplet(GetParent(hwndDlg), pGlobalData);
635 break;
636 }
637 break;
638
639 case WM_NOTIFY:
640 {
641 LPNMHDR lpnm = (LPNMHDR)lParam;
642
643 if (lpnm->code == (UINT)PSN_APPLY)
644 {
645 /* Apply changes */
646 PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg);
647
648 /* Set new locale */
649 if (pGlobalData->fUserLocaleChanged == TRUE)
650 {
651 SaveCurrentLocale(pGlobalData);
652 pGlobalData->fUserLocaleChanged = FALSE;
653 }
654
655 /* Set new GEO ID */
656 if (pGlobalData->fGeoIdChanged == TRUE)
657 {
658 SetUserGeoID(pGlobalData->geoid);
659 pGlobalData->fGeoIdChanged = FALSE;
660 }
661
662 AddNewKbLayoutsByLcid(pGlobalData->lcid);
663 SetNonUnicodeLang(hwndDlg, pGlobalData->lcid);
664 }
665 }
666 break;
667
668 case WM_DESTROY:
669 if (pGlobalData)
670 {
671 FreeCurrentLocale(pGlobalData);
672 HeapFree(GetProcessHeap(), 0, pGlobalData);
673 }
674 break;
675 }
676
677 return FALSE;
678 }
679
680 /* EOF */