source: trunk/src/kernel32/lang.cpp@ 10339

Last change on this file since 10339 was 10339, checked in by sandervl, 22 years ago

DF: Ukrainian support added

File size: 29.2 KB
Line 
1/* $Id: lang.cpp,v 1.43 2003-11-21 11:29:33 sandervl Exp $ */
2/*
3 * Win32 language API functions for OS/2
4 *
5 * Copyright 1998 Sander van Leeuwen
6 * Copyright 1998 Patrick Haller
7 * Copyright 1999 Przemyslaw Dobrowolski
8 *
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13#include <os2win.h>
14#include <winnls.h>
15#include <stdlib.h>
16#include <stdio.h>
17#include <string.h>
18#include <odinwrap.h>
19#include <heapstring.h>
20#include <win\winreg.h>
21#include <winos2def.h>
22#include "unicode.h"
23#include "oslibmisc.h"
24#include <wprocess.h>
25#include <uniconv.h>
26
27#define DBG_LOCALLOG DBG_lang
28#include "dbglocal.h"
29
30ODINDEBUGCHANNEL(KERNEL32-LANG)
31
32static ULONG defaultLanguage = 0;
33
34//******************************************************************************
35//******************************************************************************
36void WIN32API SetDefaultLanguage(DWORD deflang)
37{
38 defaultLanguage = deflang;
39}
40//******************************************************************************
41//******************************************************************************
42ULONG GetLanguageId()
43{
44 if(defaultLanguage == 0) {
45 switch(OSLibQueryCountry()) {
46 case CTRY_USA:
47 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
48 break;
49 case CTRY_CANADA://TODO: french-canadian
50 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
51 break;
52 case CTRY_LATIN_AMERICA:
53 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
54 break;
55 case CTRY_RUSSIA:
56 defaultLanguage = MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN);
57 break;
58 case CTRY_GREECE:
59 defaultLanguage = MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
60 break;
61 case CTRY_NETHERLANDS:
62 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
63 break;
64 case CTRY_BELGIUM://TODO: french-belgian
65 defaultLanguage = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN);
66 break;
67 case CTRY_FRANCE:
68 defaultLanguage = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
69 break;
70 case CTRY_SPAIN:
71 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
72 break;
73 case CTRY_ITALY:
74 defaultLanguage = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
75 break;
76 case CTRY_SWITZERLAND:
77 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
78 break;
79 case CTRY_AUSTRIA:
80 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
81 break;
82 case CTRY_UNITED_KINGDOM:
83 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
84 break;
85 case CTRY_IRELAND:
86 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_EIRE);
87 break;
88 case CTRY_DENMARK:
89 defaultLanguage = MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
90 break;
91 case CTRY_SWEDEN:
92 defaultLanguage = MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
93 break;
94 case CTRY_NORWAY:
95 defaultLanguage = MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
96 break;
97 case CTRY_GERMANY:
98 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
99 break;
100 case CTRY_MEXICO:
101 defaultLanguage = MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
102 break;
103 case CTRY_BRAZIL:
104 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
105 break;
106 case CTRY_AUSTRALIA:
107 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
108 break;
109 case CTRY_NEW_ZEALAND:
110 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
111 break;
112 case CTRY_JAPAN:
113 defaultLanguage = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
114 break;
115 case CTRY_KOREA:
116 defaultLanguage = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
117 break;
118 case CTRY_SINGAPORE:
119 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE);
120 break;
121 case CTRY_HONG_KONG:
122 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG);
123 break;
124 case CTRY_CHINA:
125 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
126 break;
127 case CTRY_TAIWAN:
128 defaultLanguage = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
129 break;
130 case CTRY_TURKEY:
131 defaultLanguage = MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
132 break;
133 case CTRY_PORTUGAL:
134 defaultLanguage = MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
135 break;
136 case CTRY_LUXEMBOURG:
137 defaultLanguage = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
138 break;
139 case CTRY_ICELAND:
140 defaultLanguage = MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
141 break;
142 case CTRY_FINLAND:
143 defaultLanguage = MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
144 break;
145 case CTRY_BULGARIA:
146 defaultLanguage = MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT);
147 break;
148 case CTRY_UKRAINE:
149 defaultLanguage = MAKELANGID(LANG_UKRAINIAN, SUBLANG_RUSSIAN);
150 break;
151 case CTRY_CROATIA:
152 defaultLanguage = MAKELANGID(LANG_CROATIAN, SUBLANG_CROATIAN);
153 break;
154 case CTRY_SLOVENIA:
155 defaultLanguage = MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT);
156 break;
157 case CTRY_CZECH_REPUBLIC:
158 defaultLanguage = MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
159 break;
160 case CTRY_SLOVAK_REPUBLIC:
161 defaultLanguage = MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
162 break;
163 case CTRY_POLAND:
164 defaultLanguage = MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT);
165 break;
166 default:
167 defaultLanguage = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
168 break;
169 }
170 }
171 return defaultLanguage;
172}
173//******************************************************************************
174//******************************************************************************
175LCID WIN32API GetUserDefaultLCID(void)
176{
177 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
178 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
179}
180//******************************************************************************
181//******************************************************************************
182LCID WIN32API GetSystemDefaultLCID(void)
183{
184 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", GetUserDefaultLCID()));
185 return GetUserDefaultLCID();
186}
187//******************************************************************************
188//******************************************************************************
189LANGID WIN32API GetUserDefaultLangID()
190{
191 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
192 return(GetLanguageId());
193}
194//******************************************************************************
195//******************************************************************************
196LANGID WIN32API GetSystemDefaultLangID(void)
197{
198 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", GetUserDefaultLangID()));
199 return GetUserDefaultLangID();
200}
201
202//******************************************************************************
203//******************************************************************************
204static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
205{
206 if (wbuf)
207 {
208 if (*pLen > lstrlenW(lpUniStr))
209 lstrcpyW(wbuf,lpUniStr);
210 else
211 {
212 SetLastError(ERROR_INSUFFICIENT_BUFFER);
213 *pLen=0;
214 return FALSE;
215 }
216 }
217
218 *pLen=lstrlenW(lpUniStr)+1; // + null terminator
219
220 return TRUE;
221}
222//replaced by Wine functions in ole2nls.c
223#if 0
224//******************************************************************************
225//******************************************************************************
226static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
227{
228 if (wbuf)
229 {
230// if (*pLen >= sizeof(WCHAR))
231 if (*pLen >= 2)
232 {
233 wbuf[0]=(WCHAR)'0'+wcUniChar;
234 wbuf[1]=0;
235 }
236 else
237 {
238 SetLastError(ERROR_INSUFFICIENT_BUFFER);
239 *pLen=0;
240 return FALSE;
241 }
242 }
243
244 *pLen=2;
245
246 return TRUE;
247}
248
249/*****************************************************************************
250 * Name : DWORD GetLocaleInfoW
251 * Purpose : The GetLocaleInfoW function returns specific locale information
252 * Parameters: LCID lcid locale identifier
253 * LCTYPE LCType type of information
254 * LPSTRW wbuf address of buffer for information
255 * int len size of buffer
256 * Variables :
257 * Result : size of target buffer
258 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
259 *
260 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
261 * LOCALE_IMEASURE - return '0' like English US
262 * LOCALE_INEGNUMBER - return '1' like English US
263 * LOCALE_ICURRDIGITS - return '2' like English US
264 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
265 * LOCALE_SGROUPING and
266 * LOCALE_SMONGROUPING are tested only with Polish & English languages
267 * LOCALE_SMONTHNAME13 and
268 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
269 * LOCALE_FONTSIGNATURE - return empty string like English US
270 *
271 * Status : FULLY TESTED
272 *
273 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
274 *****************************************************************************/
275int WIN32API GetLocaleInfoW(LCID lcid, LCTYPE LCType, LPWSTR wbuf,
276 int len)
277{
278 LocaleObject locale_object = NULL;
279 struct UniLconv *puni_lconv = NULL;
280 WCHAR *pInfoItem;
281 int rc;
282 COUNTRYCODE Country = {0};
283 COUNTRYINFO CtryInfo = {0};
284 ULONG ulInfoLen = 0;
285
286 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
287
288 if (len && (! wbuf) )
289 {
290 SetLastError(ERROR_INSUFFICIENT_BUFFER);
291 return 0;
292 }
293
294 if (wbuf) *wbuf==0;
295
296 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
297
298 if ( rc == ULS_SUCCESS )
299 {
300 UniQueryLocaleInfo(locale_object, &puni_lconv);
301
302 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
303
304 ulInfoLen = len; // Now we use this variable as returned length info
305
306 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
307
308 switch(LCType)
309 {
310 case LOCALE_SDECIMAL:
311 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
312 break;
313
314 case LOCALE_IMEASURE: // Fixme!
315 // only like English US
316 LocaleFromUniChar(0,wbuf,&ulInfoLen);
317 break;
318
319 case LOCALE_INEGNUMBER: // Fixme!
320 // only like English US
321 LocaleFromUniChar(1,wbuf,&ulInfoLen);
322 break;
323
324 case LOCALE_ICURRDIGITS:// Fixme!
325 // only like English US
326 LocaleFromUniChar(2,wbuf,&ulInfoLen);
327 break;
328
329 case LOCALE_STHOUSAND:
330 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
331 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
332 if(defaultLanguage == CTRY_CZECH_REPUBLIC) {
333 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
334 }
335 break;
336
337 case LOCALE_SGROUPING: // tested only with Polish & English
338 if (wbuf)
339 {
340 if (puni_lconv->grouping)
341 {
342 if (len >= 3*sizeof(WCHAR))
343 {
344 wbuf[0]='0'+*puni_lconv->grouping;
345 wbuf[1]=(WCHAR)';';
346 wbuf[2]=(WCHAR)'0';
347 wbuf[3]=0;
348 ulInfoLen=4;
349 }
350 else
351 {
352 SetLastError(ERROR_INSUFFICIENT_BUFFER);
353 break;
354 }
355 }
356 else
357 {
358 wbuf[0]=20; // Windows return space!!
359 ulInfoLen=2;
360 }
361 }
362 else
363 ulInfoLen=2;
364 break;
365
366 case LOCALE_SMONGROUPING: // tested only with Polish & English
367 if (wbuf)
368 {
369 if (puni_lconv->mon_grouping)
370 {
371 if (len >= 3*sizeof(WCHAR))
372 {
373 wbuf[0]='0'+*puni_lconv->mon_grouping;
374 wbuf[1]=(WCHAR)';';
375 wbuf[2]=(WCHAR)'0';
376 wbuf[3]=0;
377 ulInfoLen=4;
378 }
379 else
380 {
381 SetLastError(ERROR_INSUFFICIENT_BUFFER);
382 break;
383 }
384 }
385 else
386 {
387 wbuf[0]=20; // Windows return space!!
388 ulInfoLen=2;
389 }
390 }
391 else
392 ulInfoLen=2;
393 break;
394
395
396 case LOCALE_SCURRENCY:
397 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
398 break;
399
400 case LOCALE_SMONDECIMALSEP:
401 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
402 break;
403
404 case LOCALE_SMONTHOUSANDSEP:
405 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
406 break;
407
408 case LOCALE_SPOSITIVESIGN:
409 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
410 break;
411
412 case LOCALE_SNEGATIVESIGN:
413 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
414 break;
415
416 case LOCALE_IPOSSIGNPOSN:
417 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
418 break;
419
420 case LOCALE_INEGSIGNPOSN:
421 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
422 break;
423
424 case LOCALE_IPOSSYMPRECEDES:
425 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
426 break;
427
428 case LOCALE_IPOSSEPBYSPACE:
429 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
430 break;
431
432 case LOCALE_INEGSYMPRECEDES:
433 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
434 break;
435
436 case LOCALE_INEGSEPBYSPACE:
437 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
438 break;
439
440 case LOCALE_S1159:
441 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
442 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
443 UniFreeMem(pInfoItem);
444 break;
445
446 case LOCALE_S2359:
447 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
448 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
449 UniFreeMem(pInfoItem);
450 break;
451
452 case LOCALE_IDEFAULTLANGUAGE:
453 strcpyW(wbuf, (LPWSTR)L"0409");
454 ulInfoLen = 5;
455 break;
456 case LOCALE_ILANGUAGE:
457 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
458 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
459 UniFreeMem(pInfoItem);
460 break;
461
462 case LOCALE_INEGCURR:
463 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
464 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
465 UniFreeMem(pInfoItem);
466 break;
467
468 case LOCALE_ICURRENCY:
469 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
470 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
471 UniFreeMem(pInfoItem);
472 break;
473
474
475
476 case LOCALE_SNATIVELANGNAME:
477 case LOCALE_SLANGUAGE:
478 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
479 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
480 UniFreeMem(pInfoItem);
481 break;
482
483 case LOCALE_SABBREVLANGNAME:
484 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
485 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
486 UniFreeMem(pInfoItem);
487 break;
488
489 case LOCALE_IDEFAULTCOUNTRY:
490 case LOCALE_ICOUNTRY:
491 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
492 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
493 UniFreeMem(pInfoItem);
494 break;
495
496 case LOCALE_SENGLANGUAGE:
497 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
498 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
499 UniFreeMem(pInfoItem);
500 break;
501
502 case LOCALE_SENGCOUNTRY:
503 case LOCALE_SCOUNTRY:
504 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
505 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
506 UniFreeMem(pInfoItem);
507 break;
508
509 case LOCALE_SABBREVCTRYNAME:
510 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
511 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
512 UniFreeMem(pInfoItem);
513 break;
514
515 case LOCALE_SNATIVECTRYNAME:
516 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
517 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
518 UniFreeMem(pInfoItem);
519 break;
520
521 case LOCALE_SNATIVEDIGITS:
522 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
523 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
524 UniFreeMem(pInfoItem);
525 break;
526
527
528 case LOCALE_IDEFAULTCODEPAGE:
529 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
530 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
531 UniFreeMem(pInfoItem);
532 break;
533
534 case LOCALE_IDEFAULTANSICODEPAGE:
535 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
536 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
537 UniFreeMem(pInfoItem);
538 break;
539
540 case LOCALE_IDEFAULTMACCODEPAGE:
541 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
542 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
543 UniFreeMem(pInfoItem);
544 break;
545
546 case LOCALE_SLIST:
547 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
548 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
549 UniFreeMem(pInfoItem);
550 break;
551
552 case LOCALE_SINTLSYMBOL:
553 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
554 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
555 UniFreeMem(pInfoItem);
556 break;
557
558 case LOCALE_IFIRSTDAYOFWEEK:
559 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
560 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
561 UniFreeMem(pInfoItem);
562 break;
563
564 case LOCALE_SDAYNAME7:
565 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
566 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
567 UniFreeMem(pInfoItem);
568 break;
569
570 case LOCALE_SDAYNAME1:
571 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
572 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
573 UniFreeMem(pInfoItem);
574 break;
575
576 case LOCALE_SDAYNAME2:
577 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
578 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
579 UniFreeMem(pInfoItem);
580 break;
581
582 case LOCALE_SDAYNAME3:
583 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
584 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
585 UniFreeMem(pInfoItem);
586 break;
587
588 case LOCALE_SDAYNAME4:
589 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
590 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
591 UniFreeMem(pInfoItem);
592 break;
593
594 case LOCALE_SDAYNAME5:
595 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
596 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
597 UniFreeMem(pInfoItem);
598 break;
599
600 case LOCALE_SDAYNAME6:
601 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
602 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
603 UniFreeMem(pInfoItem);
604 break;
605
606 case LOCALE_SABBREVDAYNAME7:
607 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
608 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
609 UniFreeMem(pInfoItem);
610 break;
611
612 case LOCALE_SABBREVDAYNAME1:
613 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
614 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
615 UniFreeMem(pInfoItem);
616 break;
617
618 case LOCALE_SABBREVDAYNAME2:
619 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
620 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
621 UniFreeMem(pInfoItem);
622 break;
623
624 case LOCALE_SABBREVDAYNAME3:
625 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
626 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
627 UniFreeMem(pInfoItem);
628 break;
629
630 case LOCALE_SABBREVDAYNAME4:
631 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
632 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
633 UniFreeMem(pInfoItem);
634 break;
635
636 case LOCALE_SABBREVDAYNAME5:
637 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
638 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
639 UniFreeMem(pInfoItem);
640 break;
641
642 case LOCALE_SABBREVDAYNAME6:
643 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
644 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
645 UniFreeMem(pInfoItem);
646 break;
647
648 case LOCALE_SMONTHNAME1:
649 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
650 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
651 UniFreeMem(pInfoItem);
652 break;
653
654 case LOCALE_SMONTHNAME2:
655 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
656 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
657 UniFreeMem(pInfoItem);
658 break;
659
660 case LOCALE_SMONTHNAME3:
661 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
662 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
663 UniFreeMem(pInfoItem);
664 break;
665
666 case LOCALE_SMONTHNAME4:
667 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
668 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
669 UniFreeMem(pInfoItem);
670 break;
671
672 case LOCALE_SMONTHNAME5:
673 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
674 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
675 UniFreeMem(pInfoItem);
676 break;
677
678 case LOCALE_SMONTHNAME6:
679 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
680 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
681 UniFreeMem(pInfoItem);
682 break;
683
684 case LOCALE_SMONTHNAME7:
685 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
686 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
687 UniFreeMem(pInfoItem);
688 break;
689
690 case LOCALE_SMONTHNAME8:
691 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
692 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
693 UniFreeMem(pInfoItem);
694 break;
695
696 case LOCALE_SMONTHNAME9:
697 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
698 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
699 UniFreeMem(pInfoItem);
700 break;
701
702 case LOCALE_SMONTHNAME10:
703 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
704 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
705 UniFreeMem(pInfoItem);
706 break;
707
708 case LOCALE_SMONTHNAME11:
709 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
710 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
711 UniFreeMem(pInfoItem);
712 break;
713
714 case LOCALE_SMONTHNAME12:
715 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
716 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
717 UniFreeMem(pInfoItem);
718 break;
719
720 case LOCALE_FONTSIGNATURE: // FixMe!!!
721 case LOCALE_SABBREVMONTHNAME13:
722 case LOCALE_SMONTHNAME13:
723 if(wbuf) {
724 *wbuf = 0;
725 }
726 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
727 break;
728
729 case LOCALE_SABBREVMONTHNAME1:
730 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
731 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
732 UniFreeMem(pInfoItem);
733 break;
734
735 case LOCALE_SABBREVMONTHNAME2:
736 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
737 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
738 UniFreeMem(pInfoItem);
739 break;
740
741 case LOCALE_SABBREVMONTHNAME3:
742 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
743 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
744 UniFreeMem(pInfoItem);
745 break;
746
747 case LOCALE_SABBREVMONTHNAME4:
748 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
749 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
750 UniFreeMem(pInfoItem);
751 break;
752
753 case LOCALE_SABBREVMONTHNAME5:
754 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
755 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
756 UniFreeMem(pInfoItem);
757 break;
758
759 case LOCALE_SABBREVMONTHNAME6:
760 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
761 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
762 UniFreeMem(pInfoItem);
763 break;
764
765 case LOCALE_SABBREVMONTHNAME7:
766 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
767 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
768 UniFreeMem(pInfoItem);
769 break;
770
771 case LOCALE_SABBREVMONTHNAME8:
772 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
773 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
774 UniFreeMem(pInfoItem);
775 break;
776
777 case LOCALE_SABBREVMONTHNAME9:
778 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
779 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
780 UniFreeMem(pInfoItem);
781 break;
782
783 case LOCALE_SABBREVMONTHNAME10:
784 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
785 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
786 UniFreeMem(pInfoItem);
787 break;
788
789 case LOCALE_SABBREVMONTHNAME11:
790 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
791 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
792 UniFreeMem(pInfoItem);
793 break;
794
795 case LOCALE_SABBREVMONTHNAME12:
796 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
797 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
798 UniFreeMem(pInfoItem);
799 break;
800
801 case LOCALE_SDATE:
802 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
803 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
804 UniFreeMem(pInfoItem);
805 break;
806
807 case LOCALE_STIME:
808 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
809 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
810 UniFreeMem(pInfoItem);
811 break;
812
813 case LOCALE_IDATE:
814 case LOCALE_ILDATE:
815 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
816 break;
817
818 case LOCALE_ITIME:
819 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
820 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
821 UniFreeMem(pInfoItem);
822 break;
823
824 case LOCALE_SSHORTDATE:
825 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
826 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
827 UniFreeMem(pInfoItem);
828 break;
829
830 case LOCALE_SLONGDATE:
831 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
832 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
833 UniFreeMem(pInfoItem);
834 break;
835
836
837 case LOCALE_STIMEFORMAT:
838 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
839 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
840 UniFreeMem(pInfoItem);
841 break;
842
843 case LOCALE_SISO639LANGNAME:
844 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
845 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
846 UniFreeMem(pInfoItem);
847 break;
848
849 case LOCALE_SISO3166CTRYNAME:
850 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
851 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
852 UniFreeMem(pInfoItem);
853 break;
854
855 default:
856 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
857 if (wbuf)
858 {
859 wbuf[0] = (WCHAR) '1';
860 wbuf[1] = 0;
861 }
862 ulInfoLen=2;
863 break;
864
865 }
866 UniFreeLocaleInfo(puni_lconv);
867 UniFreeLocaleObject(locale_object);
868 }
869 else
870 return (0);
871
872 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
873
874 return (ulInfoLen);
875}
876/*****************************************************************************
877 * Name : DWORD GetLocaleInfoA
878 * Purpose : The GetLocaleInfoA function returns specific locale information
879 * Parameters: LCID lcid locale identifier
880 * LCTYPE LCType type of information
881 * LPSTR buf address of buffer for information
882 * int len size of buffer
883 * Variables :
884 * Result : size of target buffer
885 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
886 * look into GetLocaleInfoW
887 *
888 * Status : TESTED
889 *
890 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
891 *****************************************************************************/
892int WIN32API GetLocaleInfoA(LCID lcid, LCTYPE LCType, LPSTR buf, int len)
893{
894 LPWSTR lpWStr;
895 int ret_len;
896
897 if (len && (! buf) )
898 {
899 SetLastError(ERROR_INSUFFICIENT_BUFFER);
900 return 0;
901 }
902
903 dprintf(("KERNEL32: GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
904
905 if (buf)
906 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
907 else
908 lpWStr=NULL; // Query for buffer size
909
910 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
911
912 if (ret_len && buf)
913 UnicodeToAscii(lpWStr,buf);
914
915 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
916
917 dprintf(("KERNEL32: GetLocaleInfoA returned %d -> %s",ret_len, (ret_len) ? buf : NULL));
918
919 return (ret_len);
920}
921#endif
922//******************************************************************************
923//******************************************************************************
924LCID WIN32API GetThreadLocale()
925{
926 TEB *teb = GetThreadTEB();
927
928 if(teb == NULL) {
929 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
930 return FALSE;
931 }
932 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
933 return(teb->o.odin.lcid);
934}
935//******************************************************************************
936//******************************************************************************
937BOOL WIN32API SetThreadLocale(LCID locale)
938{
939 TEB *teb = GetThreadTEB();
940
941 if(teb == NULL) {
942 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
943 return FALSE;
944 }
945 dprintf(("KERNEL32: SetThreadLocale %x", locale));
946 teb->o.odin.lcid = locale;
947 return(TRUE);
948}
949//******************************************************************************
950//******************************************************************************
Note: See TracBrowser for help on using the repository browser.