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

Last change on this file since 21302 was 21302, checked in by ydario, 16 years ago

Kernel32 updates.

File size: 41.2 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//******************************************************************************
330static BOOL LocaleFromUniStr(LPWSTR lpUniStr, LPWSTR wbuf, ULONG *pLen)
331{
332 if (wbuf)
333 {
334 if (*pLen > lstrlenW(lpUniStr))
335 lstrcpyW(wbuf,lpUniStr);
336 else
337 {
338 SetLastError(ERROR_INSUFFICIENT_BUFFER);
339 *pLen=0;
340 return FALSE;
341 }
342 }
343
344 *pLen=lstrlenW(lpUniStr)+1; // + null terminator
345
346 return TRUE;
347}
348//replaced by Wine functions in ole2nls.c
349#if 0
350//******************************************************************************
351//******************************************************************************
352static BOOL LocaleFromUniChar(WCHAR wcUniChar, LPWSTR wbuf, ULONG *pLen)
353{
354 if (wbuf)
355 {
356// if (*pLen >= sizeof(WCHAR))
357 if (*pLen >= 2)
358 {
359 wbuf[0]=(WCHAR)'0'+wcUniChar;
360 wbuf[1]=0;
361 }
362 else
363 {
364 SetLastError(ERROR_INSUFFICIENT_BUFFER);
365 *pLen=0;
366 return FALSE;
367 }
368 }
369
370 *pLen=2;
371
372 return TRUE;
373}
374
375/*****************************************************************************
376 * Name : DWORD GetLocaleInfoW
377 * Purpose : The GetLocaleInfoW function returns specific locale information
378 * Parameters: LCID lcid locale identifier
379 * LCTYPE LCType type of information
380 * LPSTRW wbuf address of buffer for information
381 * int len size of buffer
382 * Variables :
383 * Result : size of target buffer
384 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
385 *
386 * LOCALE_STHOUSAND - with some languages returns OS/2 separator not Windows!
387 * LOCALE_IMEASURE - return '0' like English US
388 * LOCALE_INEGNUMBER - return '1' like English US
389 * LOCALE_ICURRDIGITS - return '2' like English US
390 * LOCALE_IDATE are identical as LOCALE_ILDATE (must be fixed?)
391 * LOCALE_SGROUPING and
392 * LOCALE_SMONGROUPING are tested only with Polish & English languages
393 * LOCALE_SMONTHNAME13 and
394 * LOCALE_SABBERVMONTHNAME13 - returns empty string like English US
395 * LOCALE_FONTSIGNATURE - return empty string like English US
396 *
397 * Status : FULLY TESTED
398 *
399 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/22 17:07]
400 *****************************************************************************/
401int WIN32API GetLocaleInfoW(LCID lcid, LCTYPE LCType, LPWSTR wbuf,
402 int len)
403{
404 LocaleObject locale_object = NULL;
405 struct UniLconv *puni_lconv = NULL;
406 WCHAR *pInfoItem;
407 int rc;
408 COUNTRYCODE Country = {0};
409 COUNTRYINFO CtryInfo = {0};
410 ULONG ulInfoLen = 0;
411
412 dprintf(("KERNEL32: OS2GetLocaleInfoW lcID=%d,lcType=%x,wbuf=%X,len=%d\n",lcid,LCType,wbuf,len));
413
414 if (len && (! wbuf) )
415 {
416 SetLastError(ERROR_INSUFFICIENT_BUFFER);
417 return 0;
418 }
419
420 if (wbuf) *wbuf==0;
421
422 rc=UniCreateLocaleObject(UNI_UCS_STRING_POINTER,(UniChar *)L"", &locale_object);
423
424 if ( rc == ULS_SUCCESS )
425 {
426 UniQueryLocaleInfo(locale_object, &puni_lconv);
427
428 DosQueryCtryInfo(sizeof(COUNTRYINFO), &Country, &CtryInfo, &ulInfoLen);
429
430 ulInfoLen = len; // Now we use this variable as returned length info
431
432 LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
433
434 switch(LCType)
435 {
436 case LOCALE_SDECIMAL:
437 LocaleFromUniStr(puni_lconv->decimal_point,wbuf,&ulInfoLen);
438 break;
439
440 case LOCALE_IMEASURE: // Fixme!
441 // only like English US
442 LocaleFromUniChar(0,wbuf,&ulInfoLen);
443 break;
444
445 case LOCALE_INEGNUMBER: // Fixme!
446 // only like English US
447 LocaleFromUniChar(1,wbuf,&ulInfoLen);
448 break;
449
450 case LOCALE_ICURRDIGITS:// Fixme!
451 // only like English US
452 LocaleFromUniChar(2,wbuf,&ulInfoLen);
453 break;
454
455 case LOCALE_STHOUSAND:
456 LocaleFromUniStr(puni_lconv->thousands_sep,wbuf,&ulInfoLen);
457 //MN: hack for Czech language; weird value returned here (0xA0 instead of 0x20)
458 if (gulDefaultLanguageId == CTRY_CZECH_REPUBLIC)
459 ((BYTE*)wbuf)[0] = ((BYTE*)wbuf)[0] & 0x7F;
460 break;
461
462 case LOCALE_SGROUPING: // tested only with Polish & English
463 if (wbuf)
464 {
465 if (puni_lconv->grouping)
466 {
467 if (len >= 3*sizeof(WCHAR))
468 {
469 wbuf[0]='0'+*puni_lconv->grouping;
470 wbuf[1]=(WCHAR)';';
471 wbuf[2]=(WCHAR)'0';
472 wbuf[3]=0;
473 ulInfoLen=4;
474 }
475 else
476 {
477 SetLastError(ERROR_INSUFFICIENT_BUFFER);
478 break;
479 }
480 }
481 else
482 {
483 wbuf[0]=20; // Windows return space!!
484 ulInfoLen=2;
485 }
486 }
487 else
488 ulInfoLen=2;
489 break;
490
491 case LOCALE_SMONGROUPING: // tested only with Polish & English
492 if (wbuf)
493 {
494 if (puni_lconv->mon_grouping)
495 {
496 if (len >= 3*sizeof(WCHAR))
497 {
498 wbuf[0]='0'+*puni_lconv->mon_grouping;
499 wbuf[1]=(WCHAR)';';
500 wbuf[2]=(WCHAR)'0';
501 wbuf[3]=0;
502 ulInfoLen=4;
503 }
504 else
505 {
506 SetLastError(ERROR_INSUFFICIENT_BUFFER);
507 break;
508 }
509 }
510 else
511 {
512 wbuf[0]=20; // Windows return space!!
513 ulInfoLen=2;
514 }
515 }
516 else
517 ulInfoLen=2;
518 break;
519
520
521 case LOCALE_SCURRENCY:
522 LocaleFromUniStr(puni_lconv->currency_symbol,wbuf,&ulInfoLen);
523 break;
524
525 case LOCALE_SMONDECIMALSEP:
526 LocaleFromUniStr(puni_lconv->mon_decimal_point,wbuf,&ulInfoLen);
527 break;
528
529 case LOCALE_SMONTHOUSANDSEP:
530 LocaleFromUniStr(puni_lconv->mon_thousands_sep,wbuf,&ulInfoLen);
531 break;
532
533 case LOCALE_SPOSITIVESIGN:
534 LocaleFromUniStr(puni_lconv->positive_sign,wbuf,&ulInfoLen);
535 break;
536
537 case LOCALE_SNEGATIVESIGN:
538 LocaleFromUniStr(puni_lconv->negative_sign,wbuf,&ulInfoLen);
539 break;
540
541 case LOCALE_IPOSSIGNPOSN:
542 LocaleFromUniChar(puni_lconv->p_sign_posn,wbuf,&ulInfoLen);
543 break;
544
545 case LOCALE_INEGSIGNPOSN:
546 LocaleFromUniChar(puni_lconv->n_sign_posn,wbuf,&ulInfoLen);
547 break;
548
549 case LOCALE_IPOSSYMPRECEDES:
550 LocaleFromUniChar(puni_lconv->p_cs_precedes,wbuf,&ulInfoLen);
551 break;
552
553 case LOCALE_IPOSSEPBYSPACE:
554 LocaleFromUniChar(puni_lconv->p_sep_by_space,wbuf,&ulInfoLen);
555 break;
556
557 case LOCALE_INEGSYMPRECEDES:
558 LocaleFromUniChar(puni_lconv->n_cs_precedes,wbuf,&ulInfoLen);
559 break;
560
561 case LOCALE_INEGSEPBYSPACE:
562 LocaleFromUniChar(puni_lconv->n_sep_by_space,wbuf,&ulInfoLen);
563 break;
564
565 case LOCALE_S1159:
566 UniQueryLocaleItem(locale_object, AM_STR,&pInfoItem);
567 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
568 UniFreeMem(pInfoItem);
569 break;
570
571 case LOCALE_S2359:
572 UniQueryLocaleItem(locale_object, PM_STR,&pInfoItem);
573 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
574 UniFreeMem(pInfoItem);
575 break;
576
577 case LOCALE_IDEFAULTLANGUAGE:
578 strcpyW(wbuf, (LPWSTR)L"0409");
579 ulInfoLen = 5;
580 break;
581 case LOCALE_ILANGUAGE:
582 UniQueryLocaleItem(locale_object, XWINLOCALE,&pInfoItem);
583 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
584 UniFreeMem(pInfoItem);
585 break;
586
587 case LOCALE_INEGCURR:
588 UniQueryLocaleItem(locale_object, INEGCURR,&pInfoItem);
589 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
590 UniFreeMem(pInfoItem);
591 break;
592
593 case LOCALE_ICURRENCY:
594 UniQueryLocaleItem(locale_object, ICURRENCY,&pInfoItem);
595 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
596 UniFreeMem(pInfoItem);
597 break;
598
599
600
601 case LOCALE_SNATIVELANGNAME:
602 case LOCALE_SLANGUAGE:
603 UniQueryLocaleItem(locale_object, SLANGUAGE,&pInfoItem);
604 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
605 UniFreeMem(pInfoItem);
606 break;
607
608 case LOCALE_SABBREVLANGNAME:
609 UniQueryLocaleItem(locale_object, SABBREVLANGNAME,&pInfoItem);
610 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
611 UniFreeMem(pInfoItem);
612 break;
613
614 case LOCALE_IDEFAULTCOUNTRY:
615 case LOCALE_ICOUNTRY:
616 UniQueryLocaleItem(locale_object, ICOUNTRY,&pInfoItem);
617 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
618 UniFreeMem(pInfoItem);
619 break;
620
621 case LOCALE_SENGLANGUAGE:
622 UniQueryLocaleItem(locale_object, SENGLANGUAGE,&pInfoItem);
623 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
624 UniFreeMem(pInfoItem);
625 break;
626
627 case LOCALE_SENGCOUNTRY:
628 case LOCALE_SCOUNTRY:
629 UniQueryLocaleItem(locale_object, SENGCOUNTRYNAME,&pInfoItem);
630 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
631 UniFreeMem(pInfoItem);
632 break;
633
634 case LOCALE_SABBREVCTRYNAME:
635 UniQueryLocaleItem(locale_object, SABBREVCTRYNAME,&pInfoItem);
636 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
637 UniFreeMem(pInfoItem);
638 break;
639
640 case LOCALE_SNATIVECTRYNAME:
641 UniQueryLocaleItem(locale_object, SCOUNTRY,&pInfoItem);
642 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
643 UniFreeMem(pInfoItem);
644 break;
645
646 case LOCALE_SNATIVEDIGITS:
647 UniQueryLocaleItem(locale_object, SNATIVEDIGITS,&pInfoItem);
648 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
649 UniFreeMem(pInfoItem);
650 break;
651
652
653 case LOCALE_IDEFAULTCODEPAGE:
654 UniQueryLocaleItem(locale_object, ICODEPAGE,&pInfoItem);
655 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
656 UniFreeMem(pInfoItem);
657 break;
658
659 case LOCALE_IDEFAULTANSICODEPAGE:
660 UniQueryLocaleItem(locale_object, IANSICODEPAGE,&pInfoItem);
661 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
662 UniFreeMem(pInfoItem);
663 break;
664
665 case LOCALE_IDEFAULTMACCODEPAGE:
666 UniQueryLocaleItem(locale_object, IMACCODEPAGE,&pInfoItem);
667 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
668 UniFreeMem(pInfoItem);
669 break;
670
671 case LOCALE_SLIST:
672 UniQueryLocaleItem(locale_object, LISTSEP,&pInfoItem);
673 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
674 UniFreeMem(pInfoItem);
675 break;
676
677 case LOCALE_SINTLSYMBOL:
678 UniQueryLocaleItem(locale_object, SINTLSYMBOL,&pInfoItem);
679 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
680 UniFreeMem(pInfoItem);
681 break;
682
683 case LOCALE_IFIRSTDAYOFWEEK:
684 UniQueryLocaleItem(locale_object, IFIRSTDAYOFWEEK, &pInfoItem);
685 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
686 UniFreeMem(pInfoItem);
687 break;
688
689 case LOCALE_SDAYNAME7:
690 UniQueryLocaleItem(locale_object, DAY_1,&pInfoItem);
691 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
692 UniFreeMem(pInfoItem);
693 break;
694
695 case LOCALE_SDAYNAME1:
696 UniQueryLocaleItem(locale_object, DAY_2,&pInfoItem);
697 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
698 UniFreeMem(pInfoItem);
699 break;
700
701 case LOCALE_SDAYNAME2:
702 UniQueryLocaleItem(locale_object, DAY_3,&pInfoItem);
703 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
704 UniFreeMem(pInfoItem);
705 break;
706
707 case LOCALE_SDAYNAME3:
708 UniQueryLocaleItem(locale_object, DAY_4,&pInfoItem);
709 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
710 UniFreeMem(pInfoItem);
711 break;
712
713 case LOCALE_SDAYNAME4:
714 UniQueryLocaleItem(locale_object, DAY_5,&pInfoItem);
715 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
716 UniFreeMem(pInfoItem);
717 break;
718
719 case LOCALE_SDAYNAME5:
720 UniQueryLocaleItem(locale_object, DAY_6,&pInfoItem);
721 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
722 UniFreeMem(pInfoItem);
723 break;
724
725 case LOCALE_SDAYNAME6:
726 UniQueryLocaleItem(locale_object, DAY_7,&pInfoItem);
727 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
728 UniFreeMem(pInfoItem);
729 break;
730
731 case LOCALE_SABBREVDAYNAME7:
732 UniQueryLocaleItem(locale_object, ABDAY_1,&pInfoItem);
733 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
734 UniFreeMem(pInfoItem);
735 break;
736
737 case LOCALE_SABBREVDAYNAME1:
738 UniQueryLocaleItem(locale_object, ABDAY_2,&pInfoItem);
739 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
740 UniFreeMem(pInfoItem);
741 break;
742
743 case LOCALE_SABBREVDAYNAME2:
744 UniQueryLocaleItem(locale_object, ABDAY_3,&pInfoItem);
745 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
746 UniFreeMem(pInfoItem);
747 break;
748
749 case LOCALE_SABBREVDAYNAME3:
750 UniQueryLocaleItem(locale_object, ABDAY_4,&pInfoItem);
751 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
752 UniFreeMem(pInfoItem);
753 break;
754
755 case LOCALE_SABBREVDAYNAME4:
756 UniQueryLocaleItem(locale_object, ABDAY_5,&pInfoItem);
757 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
758 UniFreeMem(pInfoItem);
759 break;
760
761 case LOCALE_SABBREVDAYNAME5:
762 UniQueryLocaleItem(locale_object, ABDAY_6,&pInfoItem);
763 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
764 UniFreeMem(pInfoItem);
765 break;
766
767 case LOCALE_SABBREVDAYNAME6:
768 UniQueryLocaleItem(locale_object, ABDAY_7,&pInfoItem);
769 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
770 UniFreeMem(pInfoItem);
771 break;
772
773 case LOCALE_SMONTHNAME1:
774 UniQueryLocaleItem(locale_object, MON_1,&pInfoItem);
775 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
776 UniFreeMem(pInfoItem);
777 break;
778
779 case LOCALE_SMONTHNAME2:
780 UniQueryLocaleItem(locale_object, MON_2,&pInfoItem);
781 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
782 UniFreeMem(pInfoItem);
783 break;
784
785 case LOCALE_SMONTHNAME3:
786 UniQueryLocaleItem(locale_object, MON_3,&pInfoItem);
787 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
788 UniFreeMem(pInfoItem);
789 break;
790
791 case LOCALE_SMONTHNAME4:
792 UniQueryLocaleItem(locale_object, MON_4,&pInfoItem);
793 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
794 UniFreeMem(pInfoItem);
795 break;
796
797 case LOCALE_SMONTHNAME5:
798 UniQueryLocaleItem(locale_object, MON_5,&pInfoItem);
799 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
800 UniFreeMem(pInfoItem);
801 break;
802
803 case LOCALE_SMONTHNAME6:
804 UniQueryLocaleItem(locale_object, MON_6,&pInfoItem);
805 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
806 UniFreeMem(pInfoItem);
807 break;
808
809 case LOCALE_SMONTHNAME7:
810 UniQueryLocaleItem(locale_object, MON_7,&pInfoItem);
811 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
812 UniFreeMem(pInfoItem);
813 break;
814
815 case LOCALE_SMONTHNAME8:
816 UniQueryLocaleItem(locale_object, MON_8,&pInfoItem);
817 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
818 UniFreeMem(pInfoItem);
819 break;
820
821 case LOCALE_SMONTHNAME9:
822 UniQueryLocaleItem(locale_object, MON_9,&pInfoItem);
823 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
824 UniFreeMem(pInfoItem);
825 break;
826
827 case LOCALE_SMONTHNAME10:
828 UniQueryLocaleItem(locale_object, MON_10,&pInfoItem);
829 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
830 UniFreeMem(pInfoItem);
831 break;
832
833 case LOCALE_SMONTHNAME11:
834 UniQueryLocaleItem(locale_object, MON_11,&pInfoItem);
835 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
836 UniFreeMem(pInfoItem);
837 break;
838
839 case LOCALE_SMONTHNAME12:
840 UniQueryLocaleItem(locale_object, MON_12,&pInfoItem);
841 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
842 UniFreeMem(pInfoItem);
843 break;
844
845 case LOCALE_FONTSIGNATURE: // FixMe!!!
846 case LOCALE_SABBREVMONTHNAME13:
847 case LOCALE_SMONTHNAME13:
848 if(wbuf) {
849 *wbuf = 0;
850 }
851 LocaleFromUniStr((LPWSTR)L"\0",wbuf,&ulInfoLen);
852 break;
853
854 case LOCALE_SABBREVMONTHNAME1:
855 UniQueryLocaleItem(locale_object, ABMON_1,&pInfoItem);
856 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
857 UniFreeMem(pInfoItem);
858 break;
859
860 case LOCALE_SABBREVMONTHNAME2:
861 UniQueryLocaleItem(locale_object, ABMON_2,&pInfoItem);
862 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
863 UniFreeMem(pInfoItem);
864 break;
865
866 case LOCALE_SABBREVMONTHNAME3:
867 UniQueryLocaleItem(locale_object, ABMON_3,&pInfoItem);
868 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
869 UniFreeMem(pInfoItem);
870 break;
871
872 case LOCALE_SABBREVMONTHNAME4:
873 UniQueryLocaleItem(locale_object, ABMON_4,&pInfoItem);
874 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
875 UniFreeMem(pInfoItem);
876 break;
877
878 case LOCALE_SABBREVMONTHNAME5:
879 UniQueryLocaleItem(locale_object, ABMON_5,&pInfoItem);
880 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
881 UniFreeMem(pInfoItem);
882 break;
883
884 case LOCALE_SABBREVMONTHNAME6:
885 UniQueryLocaleItem(locale_object, ABMON_6,&pInfoItem);
886 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
887 UniFreeMem(pInfoItem);
888 break;
889
890 case LOCALE_SABBREVMONTHNAME7:
891 UniQueryLocaleItem(locale_object, ABMON_7,&pInfoItem);
892 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
893 UniFreeMem(pInfoItem);
894 break;
895
896 case LOCALE_SABBREVMONTHNAME8:
897 UniQueryLocaleItem(locale_object, ABMON_8,&pInfoItem);
898 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
899 UniFreeMem(pInfoItem);
900 break;
901
902 case LOCALE_SABBREVMONTHNAME9:
903 UniQueryLocaleItem(locale_object, ABMON_9,&pInfoItem);
904 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
905 UniFreeMem(pInfoItem);
906 break;
907
908 case LOCALE_SABBREVMONTHNAME10:
909 UniQueryLocaleItem(locale_object, ABMON_10,&pInfoItem);
910 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
911 UniFreeMem(pInfoItem);
912 break;
913
914 case LOCALE_SABBREVMONTHNAME11:
915 UniQueryLocaleItem(locale_object, ABMON_11,&pInfoItem);
916 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
917 UniFreeMem(pInfoItem);
918 break;
919
920 case LOCALE_SABBREVMONTHNAME12:
921 UniQueryLocaleItem(locale_object, ABMON_12,&pInfoItem);
922 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
923 UniFreeMem(pInfoItem);
924 break;
925
926 case LOCALE_SDATE:
927 UniQueryLocaleItem(locale_object, DATESEP,&pInfoItem);
928 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
929 UniFreeMem(pInfoItem);
930 break;
931
932 case LOCALE_STIME:
933 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
934 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
935 UniFreeMem(pInfoItem);
936 break;
937
938 case LOCALE_IDATE:
939 case LOCALE_ILDATE:
940 LocaleFromUniChar(CtryInfo.fsDateFmt,wbuf,&ulInfoLen);
941 break;
942
943 case LOCALE_ITIME:
944 UniQueryLocaleItem(locale_object, TIMESEP,&pInfoItem);
945 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
946 UniFreeMem(pInfoItem);
947 break;
948
949 case LOCALE_SSHORTDATE:
950 UniQueryLocaleItem(locale_object, WSHORTDATE,&pInfoItem);
951 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
952 UniFreeMem(pInfoItem);
953 break;
954
955 case LOCALE_SLONGDATE:
956 UniQueryLocaleItem(locale_object, WLONGDATE,&pInfoItem);
957 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
958 UniFreeMem(pInfoItem);
959 break;
960
961
962 case LOCALE_STIMEFORMAT:
963 UniQueryLocaleItem(locale_object, WTIMEFORMAT,&pInfoItem);
964 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
965 UniFreeMem(pInfoItem);
966 break;
967
968 case LOCALE_SISO639LANGNAME:
969 UniQueryLocaleItem(locale_object, SISO639LANGNAME,&pInfoItem);
970 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
971 UniFreeMem(pInfoItem);
972 break;
973
974 case LOCALE_SISO3166CTRYNAME:
975 UniQueryLocaleItem(locale_object, SISO3166CTRYNAME,&pInfoItem);
976 LocaleFromUniStr(pInfoItem,wbuf,&ulInfoLen);
977 UniFreeMem(pInfoItem);
978 break;
979
980 default:
981 dprintf(("KERNEL32: OS2GetLocaleInfoW: LCType %X not yet supported\n", LCType));
982 if (wbuf)
983 {
984 wbuf[0] = (WCHAR) '1';
985 wbuf[1] = 0;
986 }
987 ulInfoLen=2;
988 break;
989
990 }
991 UniFreeLocaleInfo(puni_lconv);
992 UniFreeLocaleObject(locale_object);
993 }
994 else
995 return (0);
996
997 dprintf(("KERNEL32: OS2GetLocaleInfoW returned %d\n",ulInfoLen));
998
999 return (ulInfoLen);
1000}
1001/*****************************************************************************
1002 * Name : DWORD GetLocaleInfoA
1003 * Purpose : The GetLocaleInfoA function returns specific locale information
1004 * Parameters: LCID lcid locale identifier
1005 * LCTYPE LCType type of information
1006 * LPSTR buf address of buffer for information
1007 * int len size of buffer
1008 * Variables :
1009 * Result : size of target buffer
1010 * Remark : In this version LOCALE_SYSTEM_DEFAULT == LOCALE_USER_DEFAULT
1011 * look into GetLocaleInfoW
1012 *
1013 * Status : TESTED
1014 *
1015 * Author : Przemyslaw Dobrowolski [Tue, 1999/07/21 12:18]
1016 *****************************************************************************/
1017int WIN32API GetLocaleInfoA(LCID lcid, LCTYPE LCType, LPSTR buf, int len)
1018{
1019 LPWSTR lpWStr;
1020 int ret_len;
1021
1022 if (len && (! buf) )
1023 {
1024 SetLastError(ERROR_INSUFFICIENT_BUFFER);
1025 return 0;
1026 }
1027
1028 dprintf(("KERNEL32: GetLocaleInfoA lcID=%d,lcType=%x,buf=%X,len=%d\n",lcid,LCType,buf,len));
1029
1030 if (buf)
1031 lpWStr=(LPWSTR)malloc(len*(sizeof(WCHAR)));
1032 else
1033 lpWStr=NULL; // Query for buffer size
1034
1035 ret_len = CALL_ODINFUNC(GetLocaleInfoW)(lcid, LCType, lpWStr, len);
1036
1037 if (ret_len && buf)
1038 UnicodeToAscii(lpWStr,buf);
1039
1040 if (lpWStr) free(lpWStr); // free prevooisly allocated memory
1041
1042 dprintf(("KERNEL32: GetLocaleInfoA returned %d -> %s",ret_len, (ret_len) ? buf : NULL));
1043
1044 return (ret_len);
1045}
1046#endif
1047//******************************************************************************
1048//******************************************************************************
1049LCID WIN32API GetThreadLocale()
1050{
1051 TEB *teb = GetThreadTEB();
1052
1053 if(teb == NULL) {
1054 dprintf(("KERNEL32: ERROR: GetThreadLocale teb == NULL!"));
1055 return FALSE;
1056 }
1057 dprintf(("KERNEL32: GetThreadLocale returned %x", teb->o.odin.lcid));
1058 return(teb->o.odin.lcid);
1059}
1060//******************************************************************************
1061//******************************************************************************
1062BOOL WIN32API SetThreadLocale(LCID locale)
1063{
1064 TEB *teb = GetThreadTEB();
1065
1066 if(teb == NULL) {
1067 dprintf(("KERNEL32: ERROR SetThreadLocale teb == NULL!"));
1068 return FALSE;
1069 }
1070 dprintf(("KERNEL32: SetThreadLocale %x", locale));
1071 teb->o.odin.lcid = locale;
1072 return(TRUE);
1073}
1074//******************************************************************************
1075//******************************************************************************
Note: See TracBrowser for help on using the repository browser.