1 /* $NetBSD: localename.c,v 1.1.1.1 2016/01/10 21:36:18 christos Exp $ */ 2 3 /* Determine the current selected locale. 4 Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software Foundation, 18 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19 20 /* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */ 21 /* Win32 code written by Tor Lillqvist <tml@iki.fi>. */ 22 23 #ifdef HAVE_CONFIG_H 24 # include <config.h> 25 #endif 26 27 #include <stdlib.h> 28 #include <locale.h> 29 30 #if defined _WIN32 || defined __WIN32__ 31 # undef WIN32 /* avoid warning on mingw32 */ 32 # define WIN32 33 #endif 34 35 #ifdef WIN32 36 # define WIN32_LEAN_AND_MEAN 37 # include <windows.h> 38 /* Mingw headers don't have latest language and sublanguage codes. */ 39 # ifndef LANG_AFRIKAANS 40 # define LANG_AFRIKAANS 0x36 41 # endif 42 # ifndef LANG_ALBANIAN 43 # define LANG_ALBANIAN 0x1c 44 # endif 45 # ifndef LANG_ARABIC 46 # define LANG_ARABIC 0x01 47 # endif 48 # ifndef LANG_ARMENIAN 49 # define LANG_ARMENIAN 0x2b 50 # endif 51 # ifndef LANG_ASSAMESE 52 # define LANG_ASSAMESE 0x4d 53 # endif 54 # ifndef LANG_AZERI 55 # define LANG_AZERI 0x2c 56 # endif 57 # ifndef LANG_BASQUE 58 # define LANG_BASQUE 0x2d 59 # endif 60 # ifndef LANG_BELARUSIAN 61 # define LANG_BELARUSIAN 0x23 62 # endif 63 # ifndef LANG_BENGALI 64 # define LANG_BENGALI 0x45 65 # endif 66 # ifndef LANG_CATALAN 67 # define LANG_CATALAN 0x03 68 # endif 69 # ifndef LANG_ESTONIAN 70 # define LANG_ESTONIAN 0x25 71 # endif 72 # ifndef LANG_FAEROESE 73 # define LANG_FAEROESE 0x38 74 # endif 75 # ifndef LANG_FARSI 76 # define LANG_FARSI 0x29 77 # endif 78 # ifndef LANG_GEORGIAN 79 # define LANG_GEORGIAN 0x37 80 # endif 81 # ifndef LANG_GUJARATI 82 # define LANG_GUJARATI 0x47 83 # endif 84 # ifndef LANG_HEBREW 85 # define LANG_HEBREW 0x0d 86 # endif 87 # ifndef LANG_HINDI 88 # define LANG_HINDI 0x39 89 # endif 90 # ifndef LANG_INDONESIAN 91 # define LANG_INDONESIAN 0x21 92 # endif 93 # ifndef LANG_KANNADA 94 # define LANG_KANNADA 0x4b 95 # endif 96 # ifndef LANG_KASHMIRI 97 # define LANG_KASHMIRI 0x60 98 # endif 99 # ifndef LANG_KAZAK 100 # define LANG_KAZAK 0x3f 101 # endif 102 # ifndef LANG_KONKANI 103 # define LANG_KONKANI 0x57 104 # endif 105 # ifndef LANG_LATVIAN 106 # define LANG_LATVIAN 0x26 107 # endif 108 # ifndef LANG_LITHUANIAN 109 # define LANG_LITHUANIAN 0x27 110 # endif 111 # ifndef LANG_MACEDONIAN 112 # define LANG_MACEDONIAN 0x2f 113 # endif 114 # ifndef LANG_MALAY 115 # define LANG_MALAY 0x3e 116 # endif 117 # ifndef LANG_MALAYALAM 118 # define LANG_MALAYALAM 0x4c 119 # endif 120 # ifndef LANG_MANIPURI 121 # define LANG_MANIPURI 0x58 122 # endif 123 # ifndef LANG_MARATHI 124 # define LANG_MARATHI 0x4e 125 # endif 126 # ifndef LANG_NEPALI 127 # define LANG_NEPALI 0x61 128 # endif 129 # ifndef LANG_ORIYA 130 # define LANG_ORIYA 0x48 131 # endif 132 # ifndef LANG_PUNJABI 133 # define LANG_PUNJABI 0x46 134 # endif 135 # ifndef LANG_SANSKRIT 136 # define LANG_SANSKRIT 0x4f 137 # endif 138 # ifndef LANG_SERBIAN 139 # define LANG_SERBIAN 0x1a 140 # endif 141 # ifndef LANG_SINDHI 142 # define LANG_SINDHI 0x59 143 # endif 144 # ifndef LANG_SLOVAK 145 # define LANG_SLOVAK 0x1b 146 # endif 147 # ifndef LANG_SWAHILI 148 # define LANG_SWAHILI 0x41 149 # endif 150 # ifndef LANG_TAMIL 151 # define LANG_TAMIL 0x49 152 # endif 153 # ifndef LANG_TATAR 154 # define LANG_TATAR 0x44 155 # endif 156 # ifndef LANG_TELUGU 157 # define LANG_TELUGU 0x4a 158 # endif 159 # ifndef LANG_THAI 160 # define LANG_THAI 0x1e 161 # endif 162 # ifndef LANG_UKRAINIAN 163 # define LANG_UKRAINIAN 0x22 164 # endif 165 # ifndef LANG_URDU 166 # define LANG_URDU 0x20 167 # endif 168 # ifndef LANG_UZBEK 169 # define LANG_UZBEK 0x43 170 # endif 171 # ifndef LANG_VIETNAMESE 172 # define LANG_VIETNAMESE 0x2a 173 # endif 174 # ifndef SUBLANG_ARABIC_SAUDI_ARABIA 175 # define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 176 # endif 177 # ifndef SUBLANG_ARABIC_IRAQ 178 # define SUBLANG_ARABIC_IRAQ 0x02 179 # endif 180 # ifndef SUBLANG_ARABIC_EGYPT 181 # define SUBLANG_ARABIC_EGYPT 0x03 182 # endif 183 # ifndef SUBLANG_ARABIC_LIBYA 184 # define SUBLANG_ARABIC_LIBYA 0x04 185 # endif 186 # ifndef SUBLANG_ARABIC_ALGERIA 187 # define SUBLANG_ARABIC_ALGERIA 0x05 188 # endif 189 # ifndef SUBLANG_ARABIC_MOROCCO 190 # define SUBLANG_ARABIC_MOROCCO 0x06 191 # endif 192 # ifndef SUBLANG_ARABIC_TUNISIA 193 # define SUBLANG_ARABIC_TUNISIA 0x07 194 # endif 195 # ifndef SUBLANG_ARABIC_OMAN 196 # define SUBLANG_ARABIC_OMAN 0x08 197 # endif 198 # ifndef SUBLANG_ARABIC_YEMEN 199 # define SUBLANG_ARABIC_YEMEN 0x09 200 # endif 201 # ifndef SUBLANG_ARABIC_SYRIA 202 # define SUBLANG_ARABIC_SYRIA 0x0a 203 # endif 204 # ifndef SUBLANG_ARABIC_JORDAN 205 # define SUBLANG_ARABIC_JORDAN 0x0b 206 # endif 207 # ifndef SUBLANG_ARABIC_LEBANON 208 # define SUBLANG_ARABIC_LEBANON 0x0c 209 # endif 210 # ifndef SUBLANG_ARABIC_KUWAIT 211 # define SUBLANG_ARABIC_KUWAIT 0x0d 212 # endif 213 # ifndef SUBLANG_ARABIC_UAE 214 # define SUBLANG_ARABIC_UAE 0x0e 215 # endif 216 # ifndef SUBLANG_ARABIC_BAHRAIN 217 # define SUBLANG_ARABIC_BAHRAIN 0x0f 218 # endif 219 # ifndef SUBLANG_ARABIC_QATAR 220 # define SUBLANG_ARABIC_QATAR 0x10 221 # endif 222 # ifndef SUBLANG_AZERI_LATIN 223 # define SUBLANG_AZERI_LATIN 0x01 224 # endif 225 # ifndef SUBLANG_AZERI_CYRILLIC 226 # define SUBLANG_AZERI_CYRILLIC 0x02 227 # endif 228 # ifndef SUBLANG_CHINESE_MACAU 229 # define SUBLANG_CHINESE_MACAU 0x05 230 # endif 231 # ifndef SUBLANG_ENGLISH_SOUTH_AFRICA 232 # define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 233 # endif 234 # ifndef SUBLANG_ENGLISH_JAMAICA 235 # define SUBLANG_ENGLISH_JAMAICA 0x08 236 # endif 237 # ifndef SUBLANG_ENGLISH_CARIBBEAN 238 # define SUBLANG_ENGLISH_CARIBBEAN 0x09 239 # endif 240 # ifndef SUBLANG_ENGLISH_BELIZE 241 # define SUBLANG_ENGLISH_BELIZE 0x0a 242 # endif 243 # ifndef SUBLANG_ENGLISH_TRINIDAD 244 # define SUBLANG_ENGLISH_TRINIDAD 0x0b 245 # endif 246 # ifndef SUBLANG_ENGLISH_ZIMBABWE 247 # define SUBLANG_ENGLISH_ZIMBABWE 0x0c 248 # endif 249 # ifndef SUBLANG_ENGLISH_PHILIPPINES 250 # define SUBLANG_ENGLISH_PHILIPPINES 0x0d 251 # endif 252 # ifndef SUBLANG_FRENCH_LUXEMBOURG 253 # define SUBLANG_FRENCH_LUXEMBOURG 0x05 254 # endif 255 # ifndef SUBLANG_FRENCH_MONACO 256 # define SUBLANG_FRENCH_MONACO 0x06 257 # endif 258 # ifndef SUBLANG_GERMAN_LUXEMBOURG 259 # define SUBLANG_GERMAN_LUXEMBOURG 0x04 260 # endif 261 # ifndef SUBLANG_GERMAN_LIECHTENSTEIN 262 # define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 263 # endif 264 # ifndef SUBLANG_KASHMIRI_INDIA 265 # define SUBLANG_KASHMIRI_INDIA 0x02 266 # endif 267 # ifndef SUBLANG_MALAY_MALAYSIA 268 # define SUBLANG_MALAY_MALAYSIA 0x01 269 # endif 270 # ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM 271 # define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 272 # endif 273 # ifndef SUBLANG_NEPALI_INDIA 274 # define SUBLANG_NEPALI_INDIA 0x02 275 # endif 276 # ifndef SUBLANG_SERBIAN_LATIN 277 # define SUBLANG_SERBIAN_LATIN 0x02 278 # endif 279 # ifndef SUBLANG_SERBIAN_CYRILLIC 280 # define SUBLANG_SERBIAN_CYRILLIC 0x03 281 # endif 282 # ifndef SUBLANG_SPANISH_GUATEMALA 283 # define SUBLANG_SPANISH_GUATEMALA 0x04 284 # endif 285 # ifndef SUBLANG_SPANISH_COSTA_RICA 286 # define SUBLANG_SPANISH_COSTA_RICA 0x05 287 # endif 288 # ifndef SUBLANG_SPANISH_PANAMA 289 # define SUBLANG_SPANISH_PANAMA 0x06 290 # endif 291 # ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC 292 # define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 293 # endif 294 # ifndef SUBLANG_SPANISH_VENEZUELA 295 # define SUBLANG_SPANISH_VENEZUELA 0x08 296 # endif 297 # ifndef SUBLANG_SPANISH_COLOMBIA 298 # define SUBLANG_SPANISH_COLOMBIA 0x09 299 # endif 300 # ifndef SUBLANG_SPANISH_PERU 301 # define SUBLANG_SPANISH_PERU 0x0a 302 # endif 303 # ifndef SUBLANG_SPANISH_ARGENTINA 304 # define SUBLANG_SPANISH_ARGENTINA 0x0b 305 # endif 306 # ifndef SUBLANG_SPANISH_ECUADOR 307 # define SUBLANG_SPANISH_ECUADOR 0x0c 308 # endif 309 # ifndef SUBLANG_SPANISH_CHILE 310 # define SUBLANG_SPANISH_CHILE 0x0d 311 # endif 312 # ifndef SUBLANG_SPANISH_URUGUAY 313 # define SUBLANG_SPANISH_URUGUAY 0x0e 314 # endif 315 # ifndef SUBLANG_SPANISH_PARAGUAY 316 # define SUBLANG_SPANISH_PARAGUAY 0x0f 317 # endif 318 # ifndef SUBLANG_SPANISH_BOLIVIA 319 # define SUBLANG_SPANISH_BOLIVIA 0x10 320 # endif 321 # ifndef SUBLANG_SPANISH_EL_SALVADOR 322 # define SUBLANG_SPANISH_EL_SALVADOR 0x11 323 # endif 324 # ifndef SUBLANG_SPANISH_HONDURAS 325 # define SUBLANG_SPANISH_HONDURAS 0x12 326 # endif 327 # ifndef SUBLANG_SPANISH_NICARAGUA 328 # define SUBLANG_SPANISH_NICARAGUA 0x13 329 # endif 330 # ifndef SUBLANG_SPANISH_PUERTO_RICO 331 # define SUBLANG_SPANISH_PUERTO_RICO 0x14 332 # endif 333 # ifndef SUBLANG_SWEDISH_FINLAND 334 # define SUBLANG_SWEDISH_FINLAND 0x02 335 # endif 336 # ifndef SUBLANG_URDU_PAKISTAN 337 # define SUBLANG_URDU_PAKISTAN 0x01 338 # endif 339 # ifndef SUBLANG_URDU_INDIA 340 # define SUBLANG_URDU_INDIA 0x02 341 # endif 342 # ifndef SUBLANG_UZBEK_LATIN 343 # define SUBLANG_UZBEK_LATIN 0x01 344 # endif 345 # ifndef SUBLANG_UZBEK_CYRILLIC 346 # define SUBLANG_UZBEK_CYRILLIC 0x02 347 # endif 348 #endif 349 350 /* XPG3 defines the result of 'setlocale (category, NULL)' as: 351 "Directs 'setlocale()' to query 'category' and return the current 352 setting of 'local'." 353 However it does not specify the exact format. Neither do SUSV2 and 354 ISO C 99. So we can use this feature only on selected systems (e.g. 355 those using GNU C Library). */ 356 #if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) 357 # define HAVE_LOCALE_NULL 358 #endif 359 360 /* Determine the current locale's name, and canonicalize it into XPG syntax 361 language[_territory[.codeset]][@modifier] 362 The codeset part in the result is not reliable; the locale_charset() 363 should be used for codeset information instead. 364 The result must not be freed; it is statically allocated. */ 365 366 const char * 367 _nl_locale_name (category, categoryname) 368 int category; 369 const char *categoryname; 370 { 371 const char *retval; 372 373 #ifndef WIN32 374 375 /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. 376 On some systems this can be done by the 'setlocale' function itself. */ 377 # if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL 378 retval = setlocale (category, NULL); 379 # else 380 /* Setting of LC_ALL overwrites all other. */ 381 retval = getenv ("LC_ALL"); 382 if (retval == NULL || retval[0] == '\0') 383 { 384 /* Next comes the name of the desired category. */ 385 retval = getenv (categoryname); 386 if (retval == NULL || retval[0] == '\0') 387 { 388 /* Last possibility is the LANG environment variable. */ 389 retval = getenv ("LANG"); 390 if (retval == NULL || retval[0] == '\0') 391 /* We use C as the default domain. POSIX says this is 392 implementation defined. */ 393 retval = "C"; 394 } 395 } 396 # endif 397 398 return retval; 399 400 #else /* WIN32 */ 401 402 /* Return an XPG style locale name language[_territory][@modifier]. 403 Don't even bother determining the codeset; it's not useful in this 404 context, because message catalogs are not specific to a single 405 codeset. */ 406 407 LCID lcid; 408 LANGID langid; 409 int primary, sub; 410 411 /* Let the user override the system settings through environment 412 variables, as on POSIX systems. */ 413 retval = getenv ("LC_ALL"); 414 if (retval != NULL && retval[0] != '\0') 415 return retval; 416 retval = getenv (categoryname); 417 if (retval != NULL && retval[0] != '\0') 418 return retval; 419 retval = getenv ("LANG"); 420 if (retval != NULL && retval[0] != '\0') 421 return retval; 422 423 /* Use native Win32 API locale ID. */ 424 lcid = GetThreadLocale (); 425 426 /* Strip off the sorting rules, keep only the language part. */ 427 langid = LANGIDFROMLCID (lcid); 428 429 /* Split into language and territory part. */ 430 primary = PRIMARYLANGID (langid); 431 sub = SUBLANGID (langid); 432 switch (primary) 433 { 434 case LANG_AFRIKAANS: return "af_ZA"; 435 case LANG_ALBANIAN: return "sq_AL"; 436 case LANG_ARABIC: 437 switch (sub) 438 { 439 case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; 440 case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; 441 case SUBLANG_ARABIC_EGYPT: return "ar_EG"; 442 case SUBLANG_ARABIC_LIBYA: return "ar_LY"; 443 case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; 444 case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; 445 case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; 446 case SUBLANG_ARABIC_OMAN: return "ar_OM"; 447 case SUBLANG_ARABIC_YEMEN: return "ar_YE"; 448 case SUBLANG_ARABIC_SYRIA: return "ar_SY"; 449 case SUBLANG_ARABIC_JORDAN: return "ar_JO"; 450 case SUBLANG_ARABIC_LEBANON: return "ar_LB"; 451 case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; 452 case SUBLANG_ARABIC_UAE: return "ar_AE"; 453 case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; 454 case SUBLANG_ARABIC_QATAR: return "ar_QA"; 455 } 456 return "ar"; 457 case LANG_ARMENIAN: return "hy_AM"; 458 case LANG_ASSAMESE: return "as_IN"; 459 case LANG_AZERI: 460 switch (sub) 461 { 462 /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ 463 case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; 464 case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; 465 } 466 return "az"; 467 case LANG_BASQUE: 468 return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ 469 case LANG_BELARUSIAN: return "be_BY"; 470 case LANG_BENGALI: return "bn_IN"; 471 case LANG_BULGARIAN: return "bg_BG"; 472 case LANG_CATALAN: return "ca_ES"; 473 case LANG_CHINESE: 474 switch (sub) 475 { 476 case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; 477 case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; 478 case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; 479 case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; 480 case SUBLANG_CHINESE_MACAU: return "zh_MO"; 481 } 482 return "zh"; 483 case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN 484 * What used to be called Serbo-Croatian 485 * should really now be two separate 486 * languages because of political reasons. 487 * (Says tml, who knows nothing about Serbian 488 * or Croatian.) 489 * (I can feel those flames coming already.) 490 */ 491 switch (sub) 492 { 493 /* FIXME: How to distinguish Croatian and Latin Serbian locales? */ 494 case SUBLANG_SERBIAN_LATIN: return "sr_YU"; 495 case SUBLANG_SERBIAN_CYRILLIC: return "sr_YU@cyrillic"; 496 default: return "hr_HR"; 497 } 498 case LANG_CZECH: return "cs_CZ"; 499 case LANG_DANISH: return "da_DK"; 500 case LANG_DUTCH: 501 switch (sub) 502 { 503 case SUBLANG_DUTCH: return "nl_NL"; 504 case SUBLANG_DUTCH_BELGIAN: return "nl_BE"; 505 } 506 return "nl"; 507 case LANG_ENGLISH: 508 switch (sub) 509 { 510 /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought 511 * English was the language spoken in England. 512 * Oh well. 513 */ 514 case SUBLANG_ENGLISH_US: return "en_US"; 515 case SUBLANG_ENGLISH_UK: return "en_GB"; 516 case SUBLANG_ENGLISH_AUS: return "en_AU"; 517 case SUBLANG_ENGLISH_CAN: return "en_CA"; 518 case SUBLANG_ENGLISH_NZ: return "en_NZ"; 519 case SUBLANG_ENGLISH_EIRE: return "en_IE"; 520 case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; 521 case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; 522 case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ 523 case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; 524 case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; 525 case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; 526 case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; 527 } 528 return "en"; 529 case LANG_ESTONIAN: return "et_EE"; 530 case LANG_FAEROESE: return "fo_FO"; 531 case LANG_FARSI: return "fa_IR"; 532 case LANG_FINNISH: return "fi_FI"; 533 case LANG_FRENCH: 534 switch (sub) 535 { 536 case SUBLANG_FRENCH: return "fr_FR"; 537 case SUBLANG_FRENCH_BELGIAN: return "fr_BE"; 538 case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; 539 case SUBLANG_FRENCH_SWISS: return "fr_CH"; 540 case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; 541 case SUBLANG_FRENCH_MONACO: return "fr_MC"; 542 } 543 return "fr"; 544 case LANG_GEORGIAN: return "ka_GE"; 545 case LANG_GERMAN: 546 switch (sub) 547 { 548 case SUBLANG_GERMAN: return "de_DE"; 549 case SUBLANG_GERMAN_SWISS: return "de_CH"; 550 case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; 551 case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; 552 case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; 553 } 554 return "de"; 555 case LANG_GREEK: return "el_GR"; 556 case LANG_GUJARATI: return "gu_IN"; 557 case LANG_HEBREW: return "he_IL"; 558 case LANG_HINDI: return "hi_IN"; 559 case LANG_HUNGARIAN: return "hu_HU"; 560 case LANG_ICELANDIC: return "is_IS"; 561 case LANG_INDONESIAN: return "id_ID"; 562 case LANG_ITALIAN: 563 switch (sub) 564 { 565 case SUBLANG_ITALIAN: return "it_IT"; 566 case SUBLANG_ITALIAN_SWISS: return "it_CH"; 567 } 568 return "it"; 569 case LANG_JAPANESE: return "ja_JP"; 570 case LANG_KANNADA: return "kn_IN"; 571 case LANG_KASHMIRI: 572 switch (sub) 573 { 574 case SUBLANG_DEFAULT: return "ks_PK"; 575 case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; 576 } 577 return "ks"; 578 case LANG_KAZAK: return "kk_KZ"; 579 case LANG_KONKANI: 580 /* FIXME: Adjust this when such locales appear on Unix. */ 581 return "kok_IN"; 582 case LANG_KOREAN: return "ko_KR"; 583 case LANG_LATVIAN: return "lv_LV"; 584 case LANG_LITHUANIAN: return "lt_LT"; 585 case LANG_MACEDONIAN: return "mk_MK"; 586 case LANG_MALAY: 587 switch (sub) 588 { 589 case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; 590 case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; 591 } 592 return "ms"; 593 case LANG_MALAYALAM: return "ml_IN"; 594 case LANG_MANIPURI: 595 /* FIXME: Adjust this when such locales appear on Unix. */ 596 return "mni_IN"; 597 case LANG_MARATHI: return "mr_IN"; 598 case LANG_NEPALI: 599 switch (sub) 600 { 601 case SUBLANG_DEFAULT: return "ne_NP"; 602 case SUBLANG_NEPALI_INDIA: return "ne_IN"; 603 } 604 return "ne"; 605 case LANG_NORWEGIAN: 606 switch (sub) 607 { 608 case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; 609 case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; 610 } 611 return "no"; 612 case LANG_ORIYA: return "or_IN"; 613 case LANG_POLISH: return "pl_PL"; 614 case LANG_PORTUGUESE: 615 switch (sub) 616 { 617 case SUBLANG_PORTUGUESE: return "pt_PT"; 618 /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. 619 Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ 620 case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; 621 } 622 return "pt"; 623 case LANG_PUNJABI: return "pa_IN"; 624 case LANG_ROMANIAN: return "ro_RO"; 625 case LANG_RUSSIAN: 626 return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA". */ 627 case LANG_SANSKRIT: return "sa_IN"; 628 case LANG_SINDHI: return "sd"; 629 case LANG_SLOVAK: return "sk_SK"; 630 case LANG_SLOVENIAN: return "sl_SI"; 631 case LANG_SORBIAN: 632 /* FIXME: Adjust this when such locales appear on Unix. */ 633 return "wen_DE"; 634 case LANG_SPANISH: 635 switch (sub) 636 { 637 case SUBLANG_SPANISH: return "es_ES"; 638 case SUBLANG_SPANISH_MEXICAN: return "es_MX"; 639 case SUBLANG_SPANISH_MODERN: 640 return "es_ES@modern"; /* not seen on Unix */ 641 case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; 642 case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; 643 case SUBLANG_SPANISH_PANAMA: return "es_PA"; 644 case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; 645 case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; 646 case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; 647 case SUBLANG_SPANISH_PERU: return "es_PE"; 648 case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; 649 case SUBLANG_SPANISH_ECUADOR: return "es_EC"; 650 case SUBLANG_SPANISH_CHILE: return "es_CL"; 651 case SUBLANG_SPANISH_URUGUAY: return "es_UY"; 652 case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; 653 case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; 654 case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; 655 case SUBLANG_SPANISH_HONDURAS: return "es_HN"; 656 case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; 657 case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; 658 } 659 return "es"; 660 case LANG_SWAHILI: return "sw"; 661 case LANG_SWEDISH: 662 switch (sub) 663 { 664 case SUBLANG_DEFAULT: return "sv_SE"; 665 case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; 666 } 667 return "sv"; 668 case LANG_TAMIL: 669 return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ 670 case LANG_TATAR: return "tt"; 671 case LANG_TELUGU: return "te_IN"; 672 case LANG_THAI: return "th_TH"; 673 case LANG_TURKISH: return "tr_TR"; 674 case LANG_UKRAINIAN: return "uk_UA"; 675 case LANG_URDU: 676 switch (sub) 677 { 678 case SUBLANG_URDU_PAKISTAN: return "ur_PK"; 679 case SUBLANG_URDU_INDIA: return "ur_IN"; 680 } 681 return "ur"; 682 case LANG_UZBEK: 683 switch (sub) 684 { 685 /* FIXME: Adjust this when Uzbek locales appear on Unix. */ 686 case SUBLANG_UZBEK_LATIN: return "uz_UZ@latin"; 687 case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; 688 } 689 return "uz"; 690 case LANG_VIETNAMESE: return "vi_VN"; 691 default: return "C"; 692 } 693 694 #endif 695 } 696