source: trunk/src/kernel32/lang.cpp

Last change on this file was 21916, checked in by dmik, 14 years ago

Merge branch gcc-kmk to trunk.

File size: 41.5 KB
Line 
1/* $Id: lang.cpp,v 1.44 2004-01-29 14:21:50 bird 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 * Copyright 2004 InnoTek Systemberatung GmbH
9 *
10 *
11 * Project Odin Software License can be found in LICENSE.TXT
12 *
13 */
14#include <os2win.h>
15#include <winnls.h>
16#include <stdlib.h>
17#include <stdio.h>
18#include <string.h>
19#include <odinwrap.h>
20#include <heapstring.h>
21#include <win/winreg.h>
22#include <winos2def.h>
23#include "unicode.h"
24#include "oslibmisc.h"
25#include <wprocess.h>
26#include <uniconv.h>
27
28#define DBG_LOCALLOG DBG_lang
29#include "dbglocal.h"
30
31ODINDEBUGCHANNEL(KERNEL32-LANG)
32
33static ULONG gulDefaultLanguageId = 0;
34
35//******************************************************************************
36//******************************************************************************
37void WIN32API SetDefaultLanguage(DWORD deflang)
38{
39 gulDefaultLanguageId = deflang;
40}
41//******************************************************************************
42//******************************************************************************
43static ULONG DeterminDefaultLanguageId(void)
44{
45 const char *pszLang = getenv("LANG");
46 if (pszLang && pszLang[0] && pszLang[1]) /* (Ignore one character values (like 'C').) */
47 {
48 /** Conversion table from LANG to LanguageId based upon vac365 locales,
49 * Sun JDK Internationalization Docs (1.2), good friends and google.
50 * LANG value format: <language id>_<region>.[stuff]
51 *
52 * If no region is specified in LANG, we'll search exact match, and if not
53 * found <val>_<val>. So for values where language id doesn't match region
54 * then add a 2nd line with only language id (if there is such a default).
55 */
56 const static struct
57 {
58 const char *pszLang; /* LANG value. (case insensitive) */
59 ULONG ulLangId; /* Win32 Language ID. */
60 } aLangToLangId[] =
61 {
62 /* most frequent */
63 { "EN_US", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) },
64 { "DE_DE", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN) },
65 /* now sorted */
66 { "AR_AE", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_UAE) },
67 { "AR_BH", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_BAHRAIN) },
68 { "AR_DZ", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_ALGERIA) },
69 { "AR", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_EGYPT) },
70 { "AR_EG", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_EGYPT) },
71 { "AR_IQ", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_IRAQ ) },
72 { "AR_JO", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_JORDAN ) },
73 { "AR_KW", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_KUWAIT ) },
74 { "AR_LB", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_LEBANON ) },
75 { "AR_LY", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_LIBYA ) },
76 { "AR_MA", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_MOROCCO ) },
77 { "AR_OM", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_OMAN ) },
78 { "AR_QA", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_QATAR ) },
79 { "AR_SA", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA) },
80 { "AR_SY", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SYRIA ) },
81 { "AR_TN", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_TUNISIA ) },
82 { "AR_YE", MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_YEMEN ) },
83 { "AR_SD", MAKELANGID(LANG_ARABIC, SUBLANG_DEFAULT) }, /* no win32 constant. */
84 { "BE", MAKELANGID(LANG_BELARUSIAN, SUBLANG_DEFAULT) },
85 { "BE_BY", MAKELANGID(LANG_BELARUSIAN, SUBLANG_DEFAULT) },
86 { "BG_BG", MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT) },
87 { "CA", MAKELANGID(LANG_CATALAN, SUBLANG_DEFAULT) },
88 { "CA_ES", MAKELANGID(LANG_CATALAN, SUBLANG_DEFAULT) },
89 { "CS", MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT) },
90 { "CS_CZ", MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT) },
91 { "DA", MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT) },
92 { "DA_DK", MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT) },
93 { "DE_AT", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN) },
94 { "DE_CH", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS) },
95 { "DE_LU", MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG) },
96 { "EL", MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT) },
97 { "EL_GR", MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT) },
98 { "EN_AU", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS) },
99 { "EN_CA", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_CAN) },
100 { "EN_GB", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK) },
101 { "EN_IE", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_EIRE) },
102 { "EN_NZ", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ) },
103 { "EN_ZA", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_SOUTH_AFRICA) },
104 { "EN_DK", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) }, /* odd ibm vac365 */
105 { "EN_JP", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) }, /* odd ibm vac365 */
106 { "ES_AR", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA ) },
107 { "ES_BO", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_BOLIVIA ) },
108 { "ES_CL", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_CHILE ) },
109 { "ES_CO", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_COLOMBIA ) },
110 { "ES_CR", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA ) },
111 { "ES_DO", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_DOMINICAN_REPUBLIC) },
112 { "ES_EC", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_ECUADOR ) },
113 { "ES_ES", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH ) }, /* SUBLANG_SPANISH_MODERN? */
114 { "ES_GT", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_GUATEMALA ) },
115 { "ES_HN", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_HONDURAS ) },
116 { "ES_MX", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN ) },
117 { "ES_NI", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_NICARAGUA ) },
118 { "ES_PA", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_PANAMA ) },
119 { "ES_PE", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_PERU ) },
120 { "ES_PR", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_PUERTO_RICO ) },
121 { "ES_PY", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_PARAGUAY ) },
122 { "ES_SV", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_EL_SALVADOR ) },
123 { "ES_UY", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_URUGUAY ) },
124 { "ES_VE", MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_VENEZUELA ) },
125 { "ET", MAKELANGID(LANG_ESTONIAN, SUBLANG_DEFAULT) },
126 { "ET_EE", MAKELANGID(LANG_ESTONIAN, SUBLANG_DEFAULT) },
127 { "FI_FI", MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT) },
128 { "FO", MAKELANGID(LANG_FAEROESE, SUBLANG_DEFAULT) },
129 { "FO_FO", MAKELANGID(LANG_FAEROESE, SUBLANG_DEFAULT) },
130 { "FR_BE", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_BELGIAN) },
131 { "FR_CA", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_CANADIAN) },
132 { "FR_CH", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_SWISS) },
133 { "FR_FR", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH) },
134 { "FR_LU", MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_LUXEMBOURG) },
135 { "HR_HR", MAKELANGID(LANG_CROATIAN, SUBLANG_DEFAULT) },
136 { "HU_HU", MAKELANGID(LANG_HUNGARIAN, SUBLANG_DEFAULT) },
137 { "IS_IS", MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT) },
138 { "IT_CH", MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN_SWISS) },
139 { "IT_IT", MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN) },
140 { "IW", MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT) },
141 { "IW_IL", MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT) },
142 { "JA_JP", MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT) },
143 { "KO", MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT) },
144 { "KO_KR", MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT) },
145 { "LT_LT", MAKELANGID(LANG_LITHUANIAN, SUBLANG_DEFAULT) },
146 { "LV_LV", MAKELANGID(LANG_LATVIAN, SUBLANG_DEFAULT) },
147 /*{ "MK_MK", MAKELANGID(LANG_MACEDONIAN, SUBLANG_DEFAULT) }, - no win32 eq */
148 { "NL_BE", MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN) },
149 { "NL_NL", MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH) },
150 { "NO_NO", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK) }, /* yeah sure! Sun is medling in norwegian politics here... */
151 { "NO_NO_B", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL) }, /* yeah sure! Sun is medling in norwegian politics here... */
152 { "NY", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK) },
153 { "NY_NO", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK) },
154 { "NB", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL) },
155 { "NB_NO", MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL) },
156 { "PL_PL", MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT) },
157 { "PT_BR", MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN) },
158 { "PT_PT", MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE) },
159 { "RO_RO", MAKELANGID(LANG_ROMANIAN, SUBLANG_DEFAULT) },
160 { "RU_RU", MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT) },
161 { "SH", MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) },
162 { "SH_YU", MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) },
163 { "SK_SK", MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT) },
164 { "SL_SL", MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT) },
165 { "SQ", MAKELANGID(LANG_ALBANIAN, SUBLANG_DEFAULT) },
166 { "SQ_AL", MAKELANGID(LANG_ALBANIAN, SUBLANG_DEFAULT) },
167 { "SR", MAKELANGID(LANG_SERBIAN, SUBLANG_DEFAULT) },
168 { "SR_YU", MAKELANGID(LANG_SERBIAN, SUBLANG_DEFAULT) },
169 { "SV", MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH) },
170 { "SV_FI", MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH_FINLAND) },
171 { "SV_SE", MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH) },
172 { "TH_TH", MAKELANGID(LANG_THAI, SUBLANG_DEFAULT) },
173 { "TR_TR", MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT) },
174 { "TR_DE", MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT) }, /* phun ;-) */
175 { "UK", MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT) },
176 { "UK_UA", MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT) },
177 { "ZH", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) },
178 { "ZH_CN", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) },
179 { "ZH_TW", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) },
180 { "ZH_HK", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG) },
181 /*{ "ZH_??", MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE) },*/
182 };
183
184 /*
185 * Strip off anything past the '.' and any '_EURO'.
186 */
187 char szLang[16];
188 strncpy(szLang, pszLang, sizeof(szLang));
189 szLang[sizeof(szLang) - 1] = '\0';
190 char *psz = strrchr(szLang, '.');
191 if (psz)
192 *psz = '\0';
193 strupr(szLang);
194 psz = strstr(szLang, "_EURO");
195 if (psz)
196 *psz = '\0';
197
198 /*
199 * Loop thru the table looking for 'exact' match.
200 */
201 int i;
202 for (i = 0; i < sizeof(aLangToLangId) / sizeof(aLangToLangId[0]); i++)
203 if (!strcmp(aLangToLangId[i].pszLang, szLang))
204 return aLangToLangId[i].ulLangId;
205
206 /*
207 * No exact match. We'll now try look for <langid> and then for <langid>_<langid>.
208 * ASSUMES: no user sets "LANG=e" or any other on character letter.
209 */
210 szLang[2] = '\0';
211 for (i = 0; i < sizeof(aLangToLangId) / sizeof(aLangToLangId[0]); i++)
212 if (!strcmp(aLangToLangId[i].pszLang, szLang))
213 return aLangToLangId[i].ulLangId;
214
215 szLang[2] = '_';
216 szLang[3] = szLang[0];
217 szLang[4] = szLang[1];
218 szLang[5] = '\0';
219 for (i = 0; i < sizeof(aLangToLangId) / sizeof(aLangToLangId[0]); i++)
220 if (!strcmp(aLangToLangId[i].pszLang, szLang))
221 return aLangToLangId[i].ulLangId;
222
223 /*
224 * No match, let's try find the language if nothing else.
225 */
226 for (i = 0; i < sizeof(aLangToLangId) / sizeof(aLangToLangId[0]); i++)
227 if (!strncmp(aLangToLangId[i].pszLang, szLang, 2))
228 return MAKELANGID(PRIMARYLANGID(aLangToLangId[i].ulLangId), SUBLANG_NEUTRAL);
229
230 /* we give up! */
231 dprintf(("DeterminDefaultLanguageId: WARNING: LANG value '%s' isn't known to us!!!\n", pszLang));
232 DebugInt3();
233 }
234
235
236 /*
237 * If LANG parsing failes, we'll go for the country info.
238 */
239 switch(OSLibQueryCountry())
240 {
241 case CTRY_AUSTRALIA: return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_AUS);
242 case CTRY_AUSTRIA: return MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN);
243 case CTRY_BELGIUM: return MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN); //TODO: french-belgian
244 case CTRY_BRAZIL: return MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN);
245 case CTRY_BULGARIA: return MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT);
246 case CTRY_CANADA: return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_CAN); //TODO: french-canadian
247 case CTRY_CHINA: return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
248 case CTRY_CROATIA: return MAKELANGID(LANG_CROATIAN, SUBLANG_CROATIAN);
249 case CTRY_CZECH_REPUBLIC: return MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT);
250 case CTRY_DENMARK: return MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);
251 case CTRY_FINLAND: return MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT);
252 case CTRY_FRANCE: return MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH);
253 case CTRY_GERMANY: return MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN);
254 case CTRY_GREECE: return MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT);
255 case CTRY_HONG_KONG: return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG);
256 case CTRY_ICELAND: return MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT);
257 case CTRY_IRELAND: return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_EIRE);
258 case CTRY_ITALY: return MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN);
259 case CTRY_JAPAN: return MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
260 case CTRY_KOREA: return MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
261 case CTRY_LATIN_AMERICA: return MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
262 case CTRY_LUXEMBOURG: return MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG);
263 case CTRY_MEXICO: return MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN);
264 case CTRY_NETHERLANDS: return MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH);
265 case CTRY_NEW_ZEALAND: return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_NZ);
266 case CTRY_NORWAY: return MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT);
267 case CTRY_POLAND: return MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT);
268 case CTRY_PORTUGAL: return MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT);
269 case CTRY_RUSSIA: return MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN);
270 case CTRY_SINGAPORE: return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE);
271 case CTRY_SLOVAK_REPUBLIC: return MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT);
272 case CTRY_SLOVENIA: return MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT);
273 case CTRY_SPAIN: return MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH);
274 case CTRY_SWEDEN: return MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT);
275 case CTRY_SWITZERLAND: return MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
276 case CTRY_TAIWAN: return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
277 case CTRY_TURKEY: return MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT);
278 case CTRY_UKRAINE: return MAKELANGID(LANG_UKRAINIAN, SUBLANG_RUSSIAN);
279 case CTRY_UNITED_KINGDOM: return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
280 default:
281 return MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK);
282 }
283 /* will never reach this point! */
284}
285
286ULONG GetLanguageId(void)
287{
288 /*
289 * If no default language is set we'll try determin that by evaluating the
290 * LANG env.var. and OS/2 country information.
291 */
292 if (gulDefaultLanguageId == 0)
293 {
294 gulDefaultLanguageId = DeterminDefaultLanguageId();
295 dprintf(("KERNEL32: GetLanguageId: Sets default language id to %#x\n", gulDefaultLanguageId));
296 }
297 return gulDefaultLanguageId;
298}
299//******************************************************************************
300//******************************************************************************
301LCID WIN32API GetUserDefaultLCID(void)
302{
303 dprintf2(("KERNEL32: GetUserDefaultLCID: returns %x", MAKELCID(GetLanguageId(), SORT_DEFAULT)));
304 return(MAKELCID(GetLanguageId(), SORT_DEFAULT));
305}
306//******************************************************************************
307//******************************************************************************
308LCID WIN32API GetSystemDefaultLCID(void)
309{
310 dprintf2(("KERNEL32: GetSystemDefaultLCID: returns %x", GetUserDefaultLCID()));
311 return GetUserDefaultLCID();
312}
313//******************************************************************************
314//******************************************************************************
315LANGID WIN32API GetUserDefaultLangID()
316{
317 dprintf2(("KERNEL32: GetUserDefaultLangID, returns %x", GetLanguageId()));
318 return(GetLanguageId());
319}
320//******************************************************************************
321//******************************************************************************
322LANGID WIN32API GetSystemDefaultLangID(void)
323{
324 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", GetUserDefaultLangID()));
325 return GetUserDefaultLangID();
326}
327
328//******************************************************************************
329//******************************************************************************
330 LANGID WIN32API GetUserDefaultUILanguage(void)
331{
332 dprintf2(("KERNEL32: GetSystemDefaultLangID returns %x", GetUserDefaultLangID()));
333 return GetUserDefaultLangID();
334}
335//******************************************************************************
336//******************************************************************************
337static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
338{
339 if (wbuf)
340 {
341 if (*pLen > lstrlenW(lpUniStr))
342 lstrcpyW(wbuf,lpUniStr);
343 else
344 {
345 SetLastError(ERROR_INSUFFICIENT_BUFFER);
346 *pLen=0;
347 return FALSE;
348 }
349 }
350
351 *pLen=lstrlenW(lpUniStr)+1; // + null terminator
352
353 return TRUE;
354}
355//replaced by Wine functions in ole2nls.c
356#if 0
357//******************************************************************************
358//******************************************************************************
359static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
360{
361 if (wbuf)
362 {
363// if (*pLen >= sizeof(WCHAR))
364 if (*pLen >= 2)
365 {
366 wbuf[0]=(WCHAR)'0'+wcUniChar;
367 wbuf[1]=0;
368 }
369 else
370 {
371 SetLastError(ERROR_INSUFFICIENT_BUFFER);
372 *pLen=0;
373 return FALSE;
374 }
375 }
376
377 *pLen=2;
378
379 return TRUE;
380}
381
382/*****************************************************************************
383 * Name : DWORD GetLocaleInfoW
384 * Purpose : The GetLocaleInfoW function returns specific locale information
385 * Parameters: LCID lcid locale identifier
386 * LCTYPE LCType type of information
387 * LPSTRW wbuf address of buffer for information
388 * int len size of buffer
389 * Variables :
390 * Result : size of target buffer
391 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
392 *
393 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
394 * LOCALE_IMEASURE - return '0' like English US
395 * LOCALE_INEGNUMBER - return '1' like English US
396 * LOCALE_ICURRDIGITS - return '2' like English US
397 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
398 * LOCALE_SGROUPING and
399 * LOCALE_SMONGROUPING are tested only with Polish & English languages
400 * LOCALE_SMONTHNAME13 and
401 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
402 * LOCALE_FONTSIGNATURE - return empty string like English US
403 *
404 * Status : FULLY TESTED
405 *
406 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
407 *****************************************************************************/
408int WIN32API GetLocaleInfoW(LCID lcid, LCTYPE LCType, LPWSTR wbuf,
409 int len)
410{
411 LocaleObject locale_object = NULL;
412 struct UniLconv *puni_lconv = NULL;
413 WCHAR *pInfoItem;
414 int rc;
415 COUNTRYCODE Country = {0};
416 COUNTRYINFO CtryInfo = {0};
417 ULONG ulInfoLen = 0;
418
419 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
420
421 if (len && (! wbuf) )
422 {
423 SetLastError(ERROR_INSUFFICIENT_BUFFER);
424 return 0;
425 }
426
427 if (wbuf) *wbuf==0;
428
429 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
430
431 if ( rc == ULS_SUCCESS )
432 {
433 UniQueryLocaleInfo(locale_object, &puni_lconv);
434
435 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
436
437 ulInfoLen = len; // Now we use this variable as returned length info
438
439 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
440
441 switch(LCType)
442 {
443 case LOCALE_SDECIMAL:
444 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
445 break;
446
447 case LOCALE_IMEASURE: // Fixme!
448 // only like English US
449 LocaleFromUniChar(0,wbuf,&ulInfoLen);
450 break;
451
452 case LOCALE_INEGNUMBER: // Fixme!
453 // only like English US
454 LocaleFromUniChar(1,wbuf,&ulInfoLen);
455 break;
456
457 case LOCALE_ICURRDIGITS:// Fixme!
458 // only like English US
459 LocaleFromUniChar(2,wbuf,&ulInfoLen);
460 break;
461
462 case LOCALE_STHOUSAND:
463 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
464 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
465 if (gulDefaultLanguageId == CTRY_CZECH_REPUBLIC)
466 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
467 break;
468
469 case LOCALE_SGROUPING: // tested only with Polish & English
470 if (wbuf)
471 {
472 if (puni_lconv->grouping)
473 {
474 if (len >= 3*sizeof(WCHAR))
475 {
476 wbuf[0]='0'+*puni_lconv->grouping;
477 wbuf[1]=(WCHAR)';';
478 wbuf[2]=(WCHAR)'0';
479 wbuf[3]=0;
480 ulInfoLen=4;
481 }
482 else
483 {
484 SetLastError(ERROR_INSUFFICIENT_BUFFER);
485 break;
486 }
487 }
488 else
489 {
490 wbuf[0]=20; // Windows return space!!
491 ulInfoLen=2;
492 }
493 }
494 else
495 ulInfoLen=2;
496 break;
497
498 case LOCALE_SMONGROUPING: // tested only with Polish & English
499 if (wbuf)
500 {
501 if (puni_lconv->mon_grouping)
502 {
503 if (len >= 3*sizeof(WCHAR))
504 {
505 wbuf[0]='0'+*puni_lconv->mon_grouping;
506 wbuf[1]=(WCHAR)';';
507 wbuf[2]=(WCHAR)'0';
508 wbuf[3]=0;
509 ulInfoLen=4;
510 }
511 else
512 {
513 SetLastError(ERROR_INSUFFICIENT_BUFFER);
514 break;
515 }
516 }
517 else
518 {
519 wbuf[0]=20; // Windows return space!!
520 ulInfoLen=2;
521 }
522 }
523 else
524 ulInfoLen=2;
525 break;
526
527
528 case LOCALE_SCURRENCY:
529 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
530 break;
531
532 case LOCALE_SMONDECIMALSEP:
533 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
534 break;
535
536 case LOCALE_SMONTHOUSANDSEP:
537 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
538 break;
539
540 case LOCALE_SPOSITIVESIGN:
541 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
542 break;
543
544 case LOCALE_SNEGATIVESIGN:
545 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
546 break;
547
548 case LOCALE_IPOSSIGNPOSN:
549 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
550 break;
551
552 case LOCALE_INEGSIGNPOSN:
553 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
554 break;
555
556 case LOCALE_IPOSSYMPRECEDES:
557 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
558 break;
559
560 case LOCALE_IPOSSEPBYSPACE:
561 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
562 break;
563
564 case LOCALE_INEGSYMPRECEDES:
565 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
566 break;
567
568 case LOCALE_INEGSEPBYSPACE:
569 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
570 break;
571
572 case LOCALE_S1159:
573 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
574 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
575 UniFreeMem(pInfoItem);
576 break;
577
578 case LOCALE_S2359:
579 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
580 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
581 UniFreeMem(pInfoItem);
582 break;
583
584 case LOCALE_IDEFAULTLANGUAGE:
585 strcpyW(wbuf, (LPWSTR)L"0409");
586 ulInfoLen = 5;
587 break;
588 case LOCALE_ILANGUAGE:
589 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
590 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
591 UniFreeMem(pInfoItem);
592 break;
593
594 case LOCALE_INEGCURR:
595 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
596 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
597 UniFreeMem(pInfoItem);
598 break;
599
600 case LOCALE_ICURRENCY:
601 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
602 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
603 UniFreeMem(pInfoItem);
604 break;
605
606
607
608 case LOCALE_SNATIVELANGNAME:
609 case LOCALE_SLANGUAGE:
610 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
611 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
612 UniFreeMem(pInfoItem);
613 break;
614
615 case LOCALE_SABBREVLANGNAME:
616 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
617 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
618 UniFreeMem(pInfoItem);
619 break;
620
621 case LOCALE_IDEFAULTCOUNTRY:
622 case LOCALE_ICOUNTRY:
623 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
624 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
625 UniFreeMem(pInfoItem);
626 break;
627
628 case LOCALE_SENGLANGUAGE:
629 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
630 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
631 UniFreeMem(pInfoItem);
632 break;
633
634 case LOCALE_SENGCOUNTRY:
635 case LOCALE_SCOUNTRY:
636 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
637 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
638 UniFreeMem(pInfoItem);
639 break;
640
641 case LOCALE_SABBREVCTRYNAME:
642 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
643 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
644 UniFreeMem(pInfoItem);
645 break;
646
647 case LOCALE_SNATIVECTRYNAME:
648 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
649 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
650 UniFreeMem(pInfoItem);
651 break;
652
653 case LOCALE_SNATIVEDIGITS:
654 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
655 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
656 UniFreeMem(pInfoItem);
657 break;
658
659
660 case LOCALE_IDEFAULTCODEPAGE:
661 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
662 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
663 UniFreeMem(pInfoItem);
664 break;
665
666 case LOCALE_IDEFAULTANSICODEPAGE:
667 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
668 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
669 UniFreeMem(pInfoItem);
670 break;
671
672 case LOCALE_IDEFAULTMACCODEPAGE:
673 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
674 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
675 UniFreeMem(pInfoItem);
676 break;
677
678 case LOCALE_SLIST:
679 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
680 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
681 UniFreeMem(pInfoItem);
682 break;
683
684 case LOCALE_SINTLSYMBOL:
685 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
686 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
687 UniFreeMem(pInfoItem);
688 break;
689
690 case LOCALE_IFIRSTDAYOFWEEK:
691 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
692 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
693 UniFreeMem(pInfoItem);
694 break;
695
696 case LOCALE_SDAYNAME7:
697 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
698 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
699 UniFreeMem(pInfoItem);
700 break;
701
702 case LOCALE_SDAYNAME1:
703 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
704 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
705 UniFreeMem(pInfoItem);
706 break;
707
708 case LOCALE_SDAYNAME2:
709 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
710 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
711 UniFreeMem(pInfoItem);
712 break;
713
714 case LOCALE_SDAYNAME3:
715 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
716 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
717 UniFreeMem(pInfoItem);
718 break;
719
720 case LOCALE_SDAYNAME4:
721 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
722 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
723 UniFreeMem(pInfoItem);
724 break;
725
726 case LOCALE_SDAYNAME5:
727 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
728 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
729 UniFreeMem(pInfoItem);
730 break;
731
732 case LOCALE_SDAYNAME6:
733 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
734 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
735 UniFreeMem(pInfoItem);
736 break;
737
738 case LOCALE_SABBREVDAYNAME7:
739 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
740 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
741 UniFreeMem(pInfoItem);
742 break;
743
744 case LOCALE_SABBREVDAYNAME1:
745 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
746 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
747 UniFreeMem(pInfoItem);
748 break;
749
750 case LOCALE_SABBREVDAYNAME2:
751 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
752 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
753 UniFreeMem(pInfoItem);
754 break;
755
756 case LOCALE_SABBREVDAYNAME3:
757 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
758 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
759 UniFreeMem(pInfoItem);
760 break;
761
762 case LOCALE_SABBREVDAYNAME4:
763 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
764 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
765 UniFreeMem(pInfoItem);
766 break;
767
768 case LOCALE_SABBREVDAYNAME5:
769 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
770 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
771 UniFreeMem(pInfoItem);
772 break;
773
774 case LOCALE_SABBREVDAYNAME6:
775 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
776 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
777 UniFreeMem(pInfoItem);
778 break;
779
780 case LOCALE_SMONTHNAME1:
781 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
782 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
783 UniFreeMem(pInfoItem);
784 break;
785
786 case LOCALE_SMONTHNAME2:
787 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
788 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
789 UniFreeMem(pInfoItem);
790 break;
791
792 case LOCALE_SMONTHNAME3:
793 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
794 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
795 UniFreeMem(pInfoItem);
796 break;
797
798 case LOCALE_SMONTHNAME4:
799 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
800 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
801 UniFreeMem(pInfoItem);
802 break;
803
804 case LOCALE_SMONTHNAME5:
805 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
806 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
807 UniFreeMem(pInfoItem);
808 break;
809
810 case LOCALE_SMONTHNAME6:
811 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
812 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
813 UniFreeMem(pInfoItem);
814 break;
815
816 case LOCALE_SMONTHNAME7:
817 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
818 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
819 UniFreeMem(pInfoItem);
820 break;
821
822 case LOCALE_SMONTHNAME8:
823 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
824 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
825 UniFreeMem(pInfoItem);
826 break;
827
828 case LOCALE_SMONTHNAME9:
829 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
830 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
831 UniFreeMem(pInfoItem);
832 break;
833
834 case LOCALE_SMONTHNAME10:
835 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
836 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
837 UniFreeMem(pInfoItem);
838 break;
839
840 case LOCALE_SMONTHNAME11:
841 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
842 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
843 UniFreeMem(pInfoItem);
844 break;
845
846 case LOCALE_SMONTHNAME12:
847 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
848 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
849 UniFreeMem(pInfoItem);
850 break;
851
852 case LOCALE_FONTSIGNATURE: // FixMe!!!
853 case LOCALE_SABBREVMONTHNAME13:
854 case LOCALE_SMONTHNAME13:
855 if(wbuf) {
856 *wbuf = 0;
857 }
858 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
859 break;
860
861 case LOCALE_SABBREVMONTHNAME1:
862 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
863 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
864 UniFreeMem(pInfoItem);
865 break;
866
867 case LOCALE_SABBREVMONTHNAME2:
868 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
869 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
870 UniFreeMem(pInfoItem);
871 break;
872
873 case LOCALE_SABBREVMONTHNAME3:
874 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
875 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
876 UniFreeMem(pInfoItem);
877 break;
878
879 case LOCALE_SABBREVMONTHNAME4:
880 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
881 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
882 UniFreeMem(pInfoItem);
883 break;
884
885 case LOCALE_SABBREVMONTHNAME5:
886 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
887 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
888 UniFreeMem(pInfoItem);
889 break;
890
891 case LOCALE_SABBREVMONTHNAME6:
892 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
893 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
894 UniFreeMem(pInfoItem);
895 break;
896
897 case LOCALE_SABBREVMONTHNAME7:
898 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
899 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
900 UniFreeMem(pInfoItem);
901 break;
902
903 case LOCALE_SABBREVMONTHNAME8:
904 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
905 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
906 UniFreeMem(pInfoItem);
907 break;
908
909 case LOCALE_SABBREVMONTHNAME9:
910 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
911 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
912 UniFreeMem(pInfoItem);
913 break;
914
915 case LOCALE_SABBREVMONTHNAME10:
916 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
917 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
918 UniFreeMem(pInfoItem);
919 break;
920
921 case LOCALE_SABBREVMONTHNAME11:
922 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
923 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
924 UniFreeMem(pInfoItem);
925 break;
926
927 case LOCALE_SABBREVMONTHNAME12:
928 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
929 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
930 UniFreeMem(pInfoItem);
931 break;
932
933 case LOCALE_SDATE:
934 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
935 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
936 UniFreeMem(pInfoItem);
937 break;
938
939 case LOCALE_STIME:
940 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
941 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
942 UniFreeMem(pInfoItem);
943 break;
944
945 case LOCALE_IDATE:
946 case LOCALE_ILDATE:
947 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
948 break;
949
950 case LOCALE_ITIME:
951 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
952 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
953 UniFreeMem(pInfoItem);
954 break;
955
956 case LOCALE_SSHORTDATE:
957 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
958 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
959 UniFreeMem(pInfoItem);
960 break;
961
962 case LOCALE_SLONGDATE:
963 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
964 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
965 UniFreeMem(pInfoItem);
966 break;
967
968
969 case LOCALE_STIMEFORMAT:
970 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
971 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
972 UniFreeMem(pInfoItem);
973 break;
974
975 case LOCALE_SISO639LANGNAME:
976 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
977 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
978 UniFreeMem(pInfoItem);
979 break;
980
981 case LOCALE_SISO3166CTRYNAME:
982 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
983 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
984 UniFreeMem(pInfoItem);
985 break;
986
987 default:
988 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
989 if (wbuf)
990 {
991 wbuf[0] = (WCHAR) '1';
992 wbuf[1] = 0;
993 }
994 ulInfoLen=2;
995 break;
996
997 }
998 UniFreeLocaleInfo(puni_lconv);
999 UniFreeLocaleObject(locale_object);
1000 }
1001 else
1002 return (0);
1003
1004 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
1005
1006 return (ulInfoLen);
1007}
1008/*****************************************************************************
1009 * Name : DWORD GetLocaleInfoA
1010 * Purpose : The GetLocaleInfoA function returns specific locale information
1011 * Parameters: LCID lcid locale identifier
1012 * LCTYPE LCType type of information
1013 * LPSTR buf address of buffer for information
1014 * int len size of buffer
1015 * Variables :
1016 * Result : size of target buffer
1017 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
1018 * look into GetLocaleInfoW
1019 *
1020 * Status : TESTED
1021 *
1022 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
1023 *****************************************************************************/
1024int WIN32API GetLocaleInfoA(LCID lcid, LCTYPE LCType, LPSTR buf, int len)
1025{
1026 LPWSTR lpWStr;
1027 int ret_len;
1028
1029 if (len && (! buf) )
1030 {
1031 SetLastError(ERROR_INSUFFICIENT_BUFFER);
1032 return 0;
1033 }
1034
1035 dprintf(("KERNEL32: GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
1036
1037 if (buf)
1038 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
1039 else
1040 lpWStr=NULL; // Query for buffer size
1041
1042 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
1043
1044 if (ret_len && buf)
1045 UnicodeToAscii(lpWStr,buf);
1046
1047 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
1048
1049 dprintf(("KERNEL32: GetLocaleInfoA returned %d -> %s",ret_len, (ret_len) ? buf : NULL));
1050
1051 return (ret_len);
1052}
1053#endif
1054//******************************************************************************
1055//******************************************************************************
1056LCID WIN32API GetThreadLocale()
1057{
1058 TEB *teb = GetThreadTEB();
1059
1060 if(teb == NULL) {
1061 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
1062 return FALSE;
1063 }
1064 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
1065 return(teb->o.odin.lcid);
1066}
1067//******************************************************************************
1068//******************************************************************************
1069BOOL WIN32API SetThreadLocale(LCID locale)
1070{
1071 TEB *teb = GetThreadTEB();
1072
1073 if(teb == NULL) {
1074 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
1075 return FALSE;
1076 }
1077 dprintf(("KERNEL32: SetThreadLocale %x", locale));
1078 teb->o.odin.lcid = locale;
1079 return(TRUE);
1080}
1081//******************************************************************************
1082//******************************************************************************
Note: See TracBrowser for help on using the repository browser.