Home | History | Annotate | Line # | Download | only in intl
      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 (at) gnu.org>, 1995.  */
     21 /* Win32 code written by Tor Lillqvist <tml (at) 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