Rev 47490 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/* Determine name of the currently selected locale.Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU Library General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,USA. *//* Written by Ulrich Drepper <drepper@gnu.org>, 1995. *//* Win32 code written by Tor Lillqvist <tml@iki.fi>. *//* MacOS X code written by Bruno Haible <bruno@clisp.org>. */#ifdef HAVE_CONFIG_H# include <config.h>#endif/* Specification. */#ifdef IN_LIBINTL# include "gettextP.h"#else# include "localename.h"#endif#include <stdlib.h>#include <locale.h>#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE# include <string.h># include <CoreFoundation/CFString.h># if HAVE_CFLOCALECOPYCURRENT# include <CoreFoundation/CFLocale.h># elif HAVE_CFPREFERENCESCOPYAPPVALUE# include <CoreFoundation/CFPreferences.h># endif#endif#if defined _WIN32 || defined __WIN32__# define WIN32_NATIVE#endif#ifdef WIN32_NATIVE# define WIN32_LEAN_AND_MEAN# include <windows.h>/* List of language codes, sorted by value:0x01 LANG_ARABIC0x02 LANG_BULGARIAN0x03 LANG_CATALAN0x04 LANG_CHINESE0x05 LANG_CZECH0x06 LANG_DANISH0x07 LANG_GERMAN0x08 LANG_GREEK0x09 LANG_ENGLISH0x0a LANG_SPANISH0x0b LANG_FINNISH0x0c LANG_FRENCH0x0d LANG_HEBREW0x0e LANG_HUNGARIAN0x0f LANG_ICELANDIC0x10 LANG_ITALIAN0x11 LANG_JAPANESE0x12 LANG_KOREAN0x13 LANG_DUTCH0x14 LANG_NORWEGIAN0x15 LANG_POLISH0x16 LANG_PORTUGUESE0x17 LANG_RHAETO_ROMANCE0x18 LANG_ROMANIAN0x19 LANG_RUSSIAN0x1a LANG_CROATIAN == LANG_SERBIAN0x1b LANG_SLOVAK0x1c LANG_ALBANIAN0x1d LANG_SWEDISH0x1e LANG_THAI0x1f LANG_TURKISH0x20 LANG_URDU0x21 LANG_INDONESIAN0x22 LANG_UKRAINIAN0x23 LANG_BELARUSIAN0x24 LANG_SLOVENIAN0x25 LANG_ESTONIAN0x26 LANG_LATVIAN0x27 LANG_LITHUANIAN0x28 LANG_TAJIK0x29 LANG_FARSI0x2a LANG_VIETNAMESE0x2b LANG_ARMENIAN0x2c LANG_AZERI0x2d LANG_BASQUE0x2e LANG_SORBIAN0x2f LANG_MACEDONIAN0x30 LANG_SUTU0x31 LANG_TSONGA0x32 LANG_TSWANA0x33 LANG_VENDA0x34 LANG_XHOSA0x35 LANG_ZULU0x36 LANG_AFRIKAANS0x37 LANG_GEORGIAN0x38 LANG_FAEROESE0x39 LANG_HINDI0x3a LANG_MALTESE0x3b LANG_SAAMI0x3c LANG_GAELIC0x3d LANG_YIDDISH0x3e LANG_MALAY0x3f LANG_KAZAK0x40 LANG_KYRGYZ0x41 LANG_SWAHILI0x42 LANG_TURKMEN0x43 LANG_UZBEK0x44 LANG_TATAR0x45 LANG_BENGALI0x46 LANG_PUNJABI0x47 LANG_GUJARATI0x48 LANG_ORIYA0x49 LANG_TAMIL0x4a LANG_TELUGU0x4b LANG_KANNADA0x4c LANG_MALAYALAM0x4d LANG_ASSAMESE0x4e LANG_MARATHI0x4f LANG_SANSKRIT0x50 LANG_MONGOLIAN0x51 LANG_TIBETAN0x52 LANG_WELSH0x53 LANG_CAMBODIAN0x54 LANG_LAO0x55 LANG_BURMESE0x56 LANG_GALICIAN0x57 LANG_KONKANI0x58 LANG_MANIPURI0x59 LANG_SINDHI0x5a LANG_SYRIAC0x5b LANG_SINHALESE0x5c LANG_CHEROKEE0x5d LANG_INUKTITUT0x5e LANG_AMHARIC0x5f LANG_TAMAZIGHT0x60 LANG_KASHMIRI0x61 LANG_NEPALI0x62 LANG_FRISIAN0x63 LANG_PASHTO0x64 LANG_TAGALOG0x65 LANG_DIVEHI0x66 LANG_EDO0x67 LANG_FULFULDE0x68 LANG_HAUSA0x69 LANG_IBIBIO0x6a LANG_YORUBA0x70 LANG_IGBO0x71 LANG_KANURI0x72 LANG_OROMO0x73 LANG_TIGRINYA0x74 LANG_GUARANI0x75 LANG_HAWAIIAN0x76 LANG_LATIN0x77 LANG_SOMALI0x78 LANG_YI0x79 LANG_PAPIAMENTU*//* Mingw headers don't have latest language and sublanguage codes. */# ifndef LANG_AFRIKAANS# define LANG_AFRIKAANS 0x36# endif# ifndef LANG_ALBANIAN# define LANG_ALBANIAN 0x1c# endif# ifndef LANG_AMHARIC# define LANG_AMHARIC 0x5e# endif# ifndef LANG_ARABIC# define LANG_ARABIC 0x01# endif# ifndef LANG_ARMENIAN# define LANG_ARMENIAN 0x2b# endif# ifndef LANG_ASSAMESE# define LANG_ASSAMESE 0x4d# endif# ifndef LANG_AZERI# define LANG_AZERI 0x2c# endif# ifndef LANG_BASQUE# define LANG_BASQUE 0x2d# endif# ifndef LANG_BELARUSIAN# define LANG_BELARUSIAN 0x23# endif# ifndef LANG_BENGALI# define LANG_BENGALI 0x45# endif# ifndef LANG_BURMESE# define LANG_BURMESE 0x55# endif# ifndef LANG_CAMBODIAN# define LANG_CAMBODIAN 0x53# endif# ifndef LANG_CATALAN# define LANG_CATALAN 0x03# endif# ifndef LANG_CHEROKEE# define LANG_CHEROKEE 0x5c# endif# ifndef LANG_DIVEHI# define LANG_DIVEHI 0x65# endif# ifndef LANG_EDO# define LANG_EDO 0x66# endif# ifndef LANG_ESTONIAN# define LANG_ESTONIAN 0x25# endif# ifndef LANG_FAEROESE# define LANG_FAEROESE 0x38# endif# ifndef LANG_FARSI# define LANG_FARSI 0x29# endif# ifndef LANG_FRISIAN# define LANG_FRISIAN 0x62# endif# ifndef LANG_FULFULDE# define LANG_FULFULDE 0x67# endif# ifndef LANG_GAELIC# define LANG_GAELIC 0x3c# endif# ifndef LANG_GALICIAN# define LANG_GALICIAN 0x56# endif# ifndef LANG_GEORGIAN# define LANG_GEORGIAN 0x37# endif# ifndef LANG_GUARANI# define LANG_GUARANI 0x74# endif# ifndef LANG_GUJARATI# define LANG_GUJARATI 0x47# endif# ifndef LANG_HAUSA# define LANG_HAUSA 0x68# endif# ifndef LANG_HAWAIIAN# define LANG_HAWAIIAN 0x75# endif# ifndef LANG_HEBREW# define LANG_HEBREW 0x0d# endif# ifndef LANG_HINDI# define LANG_HINDI 0x39# endif# ifndef LANG_IBIBIO# define LANG_IBIBIO 0x69# endif# ifndef LANG_IGBO# define LANG_IGBO 0x70# endif# ifndef LANG_INDONESIAN# define LANG_INDONESIAN 0x21# endif# ifndef LANG_INUKTITUT# define LANG_INUKTITUT 0x5d# endif# ifndef LANG_KANNADA# define LANG_KANNADA 0x4b# endif# ifndef LANG_KANURI# define LANG_KANURI 0x71# endif# ifndef LANG_KASHMIRI# define LANG_KASHMIRI 0x60# endif# ifndef LANG_KAZAK# define LANG_KAZAK 0x3f# endif# ifndef LANG_KONKANI# define LANG_KONKANI 0x57# endif# ifndef LANG_KYRGYZ# define LANG_KYRGYZ 0x40# endif# ifndef LANG_LAO# define LANG_LAO 0x54# endif# ifndef LANG_LATIN# define LANG_LATIN 0x76# endif# ifndef LANG_LATVIAN# define LANG_LATVIAN 0x26# endif# ifndef LANG_LITHUANIAN# define LANG_LITHUANIAN 0x27# endif# ifndef LANG_MACEDONIAN# define LANG_MACEDONIAN 0x2f# endif# ifndef LANG_MALAY# define LANG_MALAY 0x3e# endif# ifndef LANG_MALAYALAM# define LANG_MALAYALAM 0x4c# endif# ifndef LANG_MALTESE# define LANG_MALTESE 0x3a# endif# ifndef LANG_MANIPURI# define LANG_MANIPURI 0x58# endif# ifndef LANG_MARATHI# define LANG_MARATHI 0x4e# endif# ifndef LANG_MONGOLIAN# define LANG_MONGOLIAN 0x50# endif# ifndef LANG_NEPALI# define LANG_NEPALI 0x61# endif# ifndef LANG_ORIYA# define LANG_ORIYA 0x48# endif# ifndef LANG_OROMO# define LANG_OROMO 0x72# endif# ifndef LANG_PAPIAMENTU# define LANG_PAPIAMENTU 0x79# endif# ifndef LANG_PASHTO# define LANG_PASHTO 0x63# endif# ifndef LANG_PUNJABI# define LANG_PUNJABI 0x46# endif# ifndef LANG_RHAETO_ROMANCE# define LANG_RHAETO_ROMANCE 0x17# endif# ifndef LANG_SAAMI# define LANG_SAAMI 0x3b# endif# ifndef LANG_SANSKRIT# define LANG_SANSKRIT 0x4f# endif# ifndef LANG_SERBIAN# define LANG_SERBIAN 0x1a# endif# ifndef LANG_SINDHI# define LANG_SINDHI 0x59# endif# ifndef LANG_SINHALESE# define LANG_SINHALESE 0x5b# endif# ifndef LANG_SLOVAK# define LANG_SLOVAK 0x1b# endif# ifndef LANG_SOMALI# define LANG_SOMALI 0x77# endif# ifndef LANG_SORBIAN# define LANG_SORBIAN 0x2e# endif# ifndef LANG_SUTU# define LANG_SUTU 0x30# endif# ifndef LANG_SWAHILI# define LANG_SWAHILI 0x41# endif# ifndef LANG_SYRIAC# define LANG_SYRIAC 0x5a# endif# ifndef LANG_TAGALOG# define LANG_TAGALOG 0x64# endif# ifndef LANG_TAJIK# define LANG_TAJIK 0x28# endif# ifndef LANG_TAMAZIGHT# define LANG_TAMAZIGHT 0x5f# endif# ifndef LANG_TAMIL# define LANG_TAMIL 0x49# endif# ifndef LANG_TATAR# define LANG_TATAR 0x44# endif# ifndef LANG_TELUGU# define LANG_TELUGU 0x4a# endif# ifndef LANG_THAI# define LANG_THAI 0x1e# endif# ifndef LANG_TIBETAN# define LANG_TIBETAN 0x51# endif# ifndef LANG_TIGRINYA# define LANG_TIGRINYA 0x73# endif# ifndef LANG_TSONGA# define LANG_TSONGA 0x31# endif# ifndef LANG_TSWANA# define LANG_TSWANA 0x32# endif# ifndef LANG_TURKMEN# define LANG_TURKMEN 0x42# endif# ifndef LANG_UKRAINIAN# define LANG_UKRAINIAN 0x22# endif# ifndef LANG_URDU# define LANG_URDU 0x20# endif# ifndef LANG_UZBEK# define LANG_UZBEK 0x43# endif# ifndef LANG_VENDA# define LANG_VENDA 0x33# endif# ifndef LANG_VIETNAMESE# define LANG_VIETNAMESE 0x2a# endif# ifndef LANG_WELSH# define LANG_WELSH 0x52# endif# ifndef LANG_XHOSA# define LANG_XHOSA 0x34# endif# ifndef LANG_YI# define LANG_YI 0x78# endif# ifndef LANG_YIDDISH# define LANG_YIDDISH 0x3d# endif# ifndef LANG_YORUBA# define LANG_YORUBA 0x6a# endif# ifndef LANG_ZULU# define LANG_ZULU 0x35# endif# ifndef SUBLANG_ARABIC_SAUDI_ARABIA# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01# endif# ifndef SUBLANG_ARABIC_IRAQ# define SUBLANG_ARABIC_IRAQ 0x02# endif# ifndef SUBLANG_ARABIC_EGYPT# define SUBLANG_ARABIC_EGYPT 0x03# endif# ifndef SUBLANG_ARABIC_LIBYA# define SUBLANG_ARABIC_LIBYA 0x04# endif# ifndef SUBLANG_ARABIC_ALGERIA# define SUBLANG_ARABIC_ALGERIA 0x05# endif# ifndef SUBLANG_ARABIC_MOROCCO# define SUBLANG_ARABIC_MOROCCO 0x06# endif# ifndef SUBLANG_ARABIC_TUNISIA# define SUBLANG_ARABIC_TUNISIA 0x07# endif# ifndef SUBLANG_ARABIC_OMAN# define SUBLANG_ARABIC_OMAN 0x08# endif# ifndef SUBLANG_ARABIC_YEMEN# define SUBLANG_ARABIC_YEMEN 0x09# endif# ifndef SUBLANG_ARABIC_SYRIA# define SUBLANG_ARABIC_SYRIA 0x0a# endif# ifndef SUBLANG_ARABIC_JORDAN# define SUBLANG_ARABIC_JORDAN 0x0b# endif# ifndef SUBLANG_ARABIC_LEBANON# define SUBLANG_ARABIC_LEBANON 0x0c# endif# ifndef SUBLANG_ARABIC_KUWAIT# define SUBLANG_ARABIC_KUWAIT 0x0d# endif# ifndef SUBLANG_ARABIC_UAE# define SUBLANG_ARABIC_UAE 0x0e# endif# ifndef SUBLANG_ARABIC_BAHRAIN# define SUBLANG_ARABIC_BAHRAIN 0x0f# endif# ifndef SUBLANG_ARABIC_QATAR# define SUBLANG_ARABIC_QATAR 0x10# endif# ifndef SUBLANG_AZERI_LATIN# define SUBLANG_AZERI_LATIN 0x01# endif# ifndef SUBLANG_AZERI_CYRILLIC# define SUBLANG_AZERI_CYRILLIC 0x02# endif# ifndef SUBLANG_BENGALI_INDIA# define SUBLANG_BENGALI_INDIA 0x01# endif# ifndef SUBLANG_BENGALI_BANGLADESH# define SUBLANG_BENGALI_BANGLADESH 0x02# endif# ifndef SUBLANG_CHINESE_MACAU# define SUBLANG_CHINESE_MACAU 0x05# endif# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07# endif# ifndef SUBLANG_ENGLISH_JAMAICA# define SUBLANG_ENGLISH_JAMAICA 0x08# endif# ifndef SUBLANG_ENGLISH_CARIBBEAN# define SUBLANG_ENGLISH_CARIBBEAN 0x09# endif# ifndef SUBLANG_ENGLISH_BELIZE# define SUBLANG_ENGLISH_BELIZE 0x0a# endif# ifndef SUBLANG_ENGLISH_TRINIDAD# define SUBLANG_ENGLISH_TRINIDAD 0x0b# endif# ifndef SUBLANG_ENGLISH_ZIMBABWE# define SUBLANG_ENGLISH_ZIMBABWE 0x0c# endif# ifndef SUBLANG_ENGLISH_PHILIPPINES# define SUBLANG_ENGLISH_PHILIPPINES 0x0d# endif# ifndef SUBLANG_ENGLISH_INDONESIA# define SUBLANG_ENGLISH_INDONESIA 0x0e# endif# ifndef SUBLANG_ENGLISH_HONGKONG# define SUBLANG_ENGLISH_HONGKONG 0x0f# endif# ifndef SUBLANG_ENGLISH_INDIA# define SUBLANG_ENGLISH_INDIA 0x10# endif# ifndef SUBLANG_ENGLISH_MALAYSIA# define SUBLANG_ENGLISH_MALAYSIA 0x11# endif# ifndef SUBLANG_ENGLISH_SINGAPORE# define SUBLANG_ENGLISH_SINGAPORE 0x12# endif# ifndef SUBLANG_FRENCH_LUXEMBOURG# define SUBLANG_FRENCH_LUXEMBOURG 0x05# endif# ifndef SUBLANG_FRENCH_MONACO# define SUBLANG_FRENCH_MONACO 0x06# endif# ifndef SUBLANG_FRENCH_WESTINDIES# define SUBLANG_FRENCH_WESTINDIES 0x07# endif# ifndef SUBLANG_FRENCH_REUNION# define SUBLANG_FRENCH_REUNION 0x08# endif# ifndef SUBLANG_FRENCH_CONGO# define SUBLANG_FRENCH_CONGO 0x09# endif# ifndef SUBLANG_FRENCH_SENEGAL# define SUBLANG_FRENCH_SENEGAL 0x0a# endif# ifndef SUBLANG_FRENCH_CAMEROON# define SUBLANG_FRENCH_CAMEROON 0x0b# endif# ifndef SUBLANG_FRENCH_COTEDIVOIRE# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c# endif# ifndef SUBLANG_FRENCH_MALI# define SUBLANG_FRENCH_MALI 0x0d# endif# ifndef SUBLANG_FRENCH_MOROCCO# define SUBLANG_FRENCH_MOROCCO 0x0e# endif# ifndef SUBLANG_FRENCH_HAITI# define SUBLANG_FRENCH_HAITI 0x0f# endif# ifndef SUBLANG_GERMAN_LUXEMBOURG# define SUBLANG_GERMAN_LUXEMBOURG 0x04# endif# ifndef SUBLANG_GERMAN_LIECHTENSTEIN# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05# endif# ifndef SUBLANG_KASHMIRI_INDIA# define SUBLANG_KASHMIRI_INDIA 0x02# endif# ifndef SUBLANG_MALAY_MALAYSIA# define SUBLANG_MALAY_MALAYSIA 0x01# endif# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02# endif# ifndef SUBLANG_NEPALI_INDIA# define SUBLANG_NEPALI_INDIA 0x02# endif# ifndef SUBLANG_PUNJABI_INDIA# define SUBLANG_PUNJABI_INDIA 0x01# endif# ifndef SUBLANG_PUNJABI_PAKISTAN# define SUBLANG_PUNJABI_PAKISTAN 0x02# endif# ifndef SUBLANG_ROMANIAN_ROMANIA# define SUBLANG_ROMANIAN_ROMANIA 0x01# endif# ifndef SUBLANG_ROMANIAN_MOLDOVA# define SUBLANG_ROMANIAN_MOLDOVA 0x02# endif# ifndef SUBLANG_SERBIAN_LATIN# define SUBLANG_SERBIAN_LATIN 0x02# endif# ifndef SUBLANG_SERBIAN_CYRILLIC# define SUBLANG_SERBIAN_CYRILLIC 0x03# endif# ifndef SUBLANG_SINDHI_PAKISTAN# define SUBLANG_SINDHI_PAKISTAN 0x01# endif# ifndef SUBLANG_SINDHI_AFGHANISTAN# define SUBLANG_SINDHI_AFGHANISTAN 0x02# endif# ifndef SUBLANG_SPANISH_GUATEMALA# define SUBLANG_SPANISH_GUATEMALA 0x04# endif# ifndef SUBLANG_SPANISH_COSTA_RICA# define SUBLANG_SPANISH_COSTA_RICA 0x05# endif# ifndef SUBLANG_SPANISH_PANAMA# define SUBLANG_SPANISH_PANAMA 0x06# endif# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07# endif# ifndef SUBLANG_SPANISH_VENEZUELA# define SUBLANG_SPANISH_VENEZUELA 0x08# endif# ifndef SUBLANG_SPANISH_COLOMBIA# define SUBLANG_SPANISH_COLOMBIA 0x09# endif# ifndef SUBLANG_SPANISH_PERU# define SUBLANG_SPANISH_PERU 0x0a# endif# ifndef SUBLANG_SPANISH_ARGENTINA# define SUBLANG_SPANISH_ARGENTINA 0x0b# endif# ifndef SUBLANG_SPANISH_ECUADOR# define SUBLANG_SPANISH_ECUADOR 0x0c# endif# ifndef SUBLANG_SPANISH_CHILE# define SUBLANG_SPANISH_CHILE 0x0d# endif# ifndef SUBLANG_SPANISH_URUGUAY# define SUBLANG_SPANISH_URUGUAY 0x0e# endif# ifndef SUBLANG_SPANISH_PARAGUAY# define SUBLANG_SPANISH_PARAGUAY 0x0f# endif# ifndef SUBLANG_SPANISH_BOLIVIA# define SUBLANG_SPANISH_BOLIVIA 0x10# endif# ifndef SUBLANG_SPANISH_EL_SALVADOR# define SUBLANG_SPANISH_EL_SALVADOR 0x11# endif# ifndef SUBLANG_SPANISH_HONDURAS# define SUBLANG_SPANISH_HONDURAS 0x12# endif# ifndef SUBLANG_SPANISH_NICARAGUA# define SUBLANG_SPANISH_NICARAGUA 0x13# endif# ifndef SUBLANG_SPANISH_PUERTO_RICO# define SUBLANG_SPANISH_PUERTO_RICO 0x14# endif# ifndef SUBLANG_SWEDISH_FINLAND# define SUBLANG_SWEDISH_FINLAND 0x02# endif# ifndef SUBLANG_TAMAZIGHT_ARABIC# define SUBLANG_TAMAZIGHT_ARABIC 0x01# endif# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02# endif# ifndef SUBLANG_TIGRINYA_ETHIOPIA# define SUBLANG_TIGRINYA_ETHIOPIA 0x01# endif# ifndef SUBLANG_TIGRINYA_ERITREA# define SUBLANG_TIGRINYA_ERITREA 0x02# endif# ifndef SUBLANG_URDU_PAKISTAN# define SUBLANG_URDU_PAKISTAN 0x01# endif# ifndef SUBLANG_URDU_INDIA# define SUBLANG_URDU_INDIA 0x02# endif# ifndef SUBLANG_UZBEK_LATIN# define SUBLANG_UZBEK_LATIN 0x01# endif# ifndef SUBLANG_UZBEK_CYRILLIC# define SUBLANG_UZBEK_CYRILLIC 0x02# endif#endif# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE/* MacOS X 10.2 or newer *//* Canonicalize a MacOS X locale name to a Unix locale name.NAME is a sufficiently large buffer.On input, it contains the MacOS X locale name.On output, it contains the Unix locale name. */# if !defined IN_LIBINTLstatic# endifvoidgl_locale_name_canonicalize (char *name){/* This conversion is based on a posting byDeborah GoldSmith <goldsmit@apple.com> on 2005-03-08,http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html *//* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 andISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this.Therefore we do it ourselves, using a table based on the results of theMacOS X 10.3.8 functionCFLocaleCreateCanonicalLocaleIdentifierFromString(). */typedef struct { const char legacy[21+1]; const char unixy[5+1]; }legacy_entry;static const legacy_entry legacy_table[] = {{ "Afrikaans", "af" },{ "Albanian", "sq" },{ "Amharic", "am" },{ "Arabic", "ar" },{ "Armenian", "hy" },{ "Assamese", "as" },{ "Aymara", "ay" },{ "Azerbaijani", "az" },{ "Basque", "eu" },{ "Belarusian", "be" },{ "Belorussian", "be" },{ "Bengali", "bn" },{ "Brazilian Portugese", "pt_BR" },{ "Brazilian Portuguese", "pt_BR" },{ "Breton", "br" },{ "Bulgarian", "bg" },{ "Burmese", "my" },{ "Byelorussian", "be" },{ "Catalan", "ca" },{ "Chewa", "ny" },{ "Chichewa", "ny" },{ "Chinese", "zh" },{ "Chinese, Simplified", "zh_CN" },{ "Chinese, Traditional", "zh_TW" },{ "Chinese, Tradtional", "zh_TW" },{ "Croatian", "hr" },{ "Czech", "cs" },{ "Danish", "da" },{ "Dutch", "nl" },{ "Dzongkha", "dz" },{ "English", "en" },{ "Esperanto", "eo" },{ "Estonian", "et" },{ "Faroese", "fo" },{ "Farsi", "fa" },{ "Finnish", "fi" },{ "Flemish", "nl_BE" },{ "French", "fr" },{ "Galician", "gl" },{ "Gallegan", "gl" },{ "Georgian", "ka" },{ "German", "de" },{ "Greek", "el" },{ "Greenlandic", "kl" },{ "Guarani", "gn" },{ "Gujarati", "gu" },{ "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */{ "Hebrew", "he" },{ "Hindi", "hi" },{ "Hungarian", "hu" },{ "Icelandic", "is" },{ "Indonesian", "id" },{ "Inuktitut", "iu" },{ "Irish", "ga" },{ "Italian", "it" },{ "Japanese", "ja" },{ "Javanese", "jv" },{ "Kalaallisut", "kl" },{ "Kannada", "kn" },{ "Kashmiri", "ks" },{ "Kazakh", "kk" },{ "Khmer", "km" },{ "Kinyarwanda", "rw" },{ "Kirghiz", "ky" },{ "Korean", "ko" },{ "Kurdish", "ku" },{ "Latin", "la" },{ "Latvian", "lv" },{ "Lithuanian", "lt" },{ "Macedonian", "mk" },{ "Malagasy", "mg" },{ "Malay", "ms" },{ "Malayalam", "ml" },{ "Maltese", "mt" },{ "Manx", "gv" },{ "Marathi", "mr" },{ "Moldavian", "mo" },{ "Mongolian", "mn" },{ "Nepali", "ne" },{ "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */{ "Nyanja", "ny" },{ "Nynorsk", "nn" },{ "Oriya", "or" },{ "Oromo", "om" },{ "Panjabi", "pa" },{ "Pashto", "ps" },{ "Persian", "fa" },{ "Polish", "pl" },{ "Portuguese", "pt" },{ "Portuguese, Brazilian", "pt_BR" },{ "Punjabi", "pa" },{ "Pushto", "ps" },{ "Quechua", "qu" },{ "Romanian", "ro" },{ "Ruanda", "rw" },{ "Rundi", "rn" },{ "Russian", "ru" },{ "Sami", "se_NO" }, /* Not just "se". */{ "Sanskrit", "sa" },{ "Scottish", "gd" },{ "Serbian", "sr" },{ "Simplified Chinese", "zh_CN" },{ "Sindhi", "sd" },{ "Sinhalese", "si" },{ "Slovak", "sk" },{ "Slovenian", "sl" },{ "Somali", "so" },{ "Spanish", "es" },{ "Sundanese", "su" },{ "Swahili", "sw" },{ "Swedish", "sv" },{ "Tagalog", "tl" },{ "Tajik", "tg" },{ "Tajiki", "tg" },{ "Tamil", "ta" },{ "Tatar", "tt" },{ "Telugu", "te" },{ "Thai", "th" },{ "Tibetan", "bo" },{ "Tigrinya", "ti" },{ "Tongan", "to" },{ "Traditional Chinese", "zh_TW" },{ "Turkish", "tr" },{ "Turkmen", "tk" },{ "Uighur", "ug" },{ "Ukrainian", "uk" },{ "Urdu", "ur" },{ "Uzbek", "uz" },{ "Vietnamese", "vi" },{ "Welsh", "cy" },{ "Yiddish", "yi" }};/* Convert new-style locale names with language tags (ISO 639 and ISO 15924)to Unix (ISO 639 and ISO 3166) names. */typedef struct { const char langtag[7+1]; const char unixy[12+1]; }langtag_entry;static const langtag_entry langtag_table[] = {/* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".The default script for az on Unix is Latin. */{ "az-Latn", "az" },/* MacOS X has "ga-dots". Does not yet exist on Unix. */{ "ga-dots", "ga" },/* MacOS X has "kk-Cyrl". Does not yet exist on Unix. *//* MacOS X has "mn-Cyrl", "mn-Mong".The default script for mn on Unix is Cyrillic. */{ "mn-Cyrl", "mn" },/* MacOS X has "ms-Arab", "ms-Latn".The default script for ms on Unix is Latin. */{ "ms-Latn", "ms" },/* MacOS X has "tg-Cyrl".The default script for tg on Unix is Cyrillic. */{ "tg-Cyrl", "tg" },/* MacOS X has "tk-Cyrl". Does not yet exist on Unix. *//* MacOS X has "tt-Cyrl".The default script for tt on Unix is Cyrillic. */{ "tt-Cyrl", "tt" },/* MacOS X has "zh-Hans", "zh-Hant".Country codes are used to distinguish these on Unix. */{ "zh-Hans", "zh_CN" },{ "zh-Hant", "zh_TW" }};/* Convert script names (ISO 15924) to Unix conventions.See http://www.unicode.org/iso15924/iso15924-codes.html */typedef struct { const char script[4+1]; const char unixy[9+1]; }script_entry;static const script_entry script_table[] = {{ "Arab", "arabic" },{ "Cyrl", "cyrillic" },{ "Mong", "mongolian" }};/* Step 1: Convert using legacy_table. */if (name[0] >= 'A' && name[0] <= 'Z'){unsigned int i1, i2;i1 = 0;i2 = sizeof (legacy_table) / sizeof (legacy_entry);while (i2 - i1 > 1){/* At this point we know that if name occurs in legacy_table,its index must be >= i1 and < i2. */unsigned int i = (i1 + i2) >> 1;const legacy_entry *p = &legacy_table[i];if (strcmp (name, p->legacy) < 0)i2 = i;elsei1 = i;}if (strcmp (name, legacy_table[i1].legacy) == 0){strcpy (name, legacy_table[i1].unixy);return;}}/* Step 2: Convert using langtag_table and script_table. */if (strlen (name) == 7 && name[2] == '-'){unsigned int i1, i2;i1 = 0;i2 = sizeof (langtag_table) / sizeof (langtag_entry);while (i2 - i1 > 1){/* At this point we know that if name occurs in langtag_table,its index must be >= i1 and < i2. */unsigned int i = (i1 + i2) >> 1;const langtag_entry *p = &langtag_table[i];if (strcmp (name, p->langtag) < 0)i2 = i;elsei1 = i;}if (strcmp (name, langtag_table[i1].langtag) == 0){strcpy (name, langtag_table[i1].unixy);return;}i1 = 0;i2 = sizeof (script_table) / sizeof (script_entry);while (i2 - i1 > 1){/* At this point we know that if (name + 3) occurs in script_table,its index must be >= i1 and < i2. */unsigned int i = (i1 + i2) >> 1;const script_entry *p = &script_table[i];if (strcmp (name + 3, p->script) < 0)i2 = i;elsei1 = i;}if (strcmp (name + 3, script_table[i1].script) == 0){name[2] = '@';strcpy (name + 3, script_table[i1].unixy);return;}}/* Step 3: Convert new-style dash to Unix underscore. */{char *p;for (p = name; *p != '\0'; p++)if (*p == '-')*p = '_';}}#endif/* XPG3 defines the result of 'setlocale (category, NULL)' as:"Directs 'setlocale()' to query 'category' and return the currentsetting of 'local'."However it does not specify the exact format. Neither do SUSV2 andISO C 99. So we can use this feature only on selected systems (e.g.those using GNU C Library). */#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2)# define HAVE_LOCALE_NULL#endif/* Determine the current locale's name, and canonicalize it into XPG syntaxlanguage[_territory][.codeset][@modifier]The codeset part in the result is not reliable; the locale_charset()should be used for codeset information instead.The result must not be freed; it is statically allocated. */const char *gl_locale_name_posix (int category, const char *categoryname){/* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.On some systems this can be done by the 'setlocale' function itself. */#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULLreturn setlocale (category, NULL);#elseconst char *retval;/* Setting of LC_ALL overrides all other. */retval = getenv ("LC_ALL");if (retval != NULL && retval[0] != '\0')return retval;/* Next comes the name of the desired category. */retval = getenv (categoryname);if (retval != NULL && retval[0] != '\0')return retval;/* Last possibility is the LANG environment variable. */retval = getenv ("LANG");if (retval != NULL && retval[0] != '\0')return retval;return NULL;#endif}const char *gl_locale_name_default (void){/* POSIX:2001 says:"All implementations shall define a locale as the default locale, to beinvoked when no environment variables are set, or set to the emptystring. This default locale can be the POSIX locale or any otherimplementation-defined locale. Some implementations may providefacilities for local installation administrators to set the defaultlocale, customizing it for each location. POSIX:2001 does not requiresuch a facility. */#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32_NATIVE))/* The system does not have a way of setting the locale, other than thePOSIX specified environment variables. We use C as default locale. */return "C";#else/* Return an XPG style locale name language[_territory][@modifier].Don't even bother determining the codeset; it's not useful in thiscontext, because message catalogs are not specific to a singlecodeset. */# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE/* MacOS X 10.2 or newer */{/* Cache the locale name, since CoreFoundation calls are expensive. */static const char *cached_localename;if (cached_localename == NULL){char namebuf[256];# if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */CFLocaleRef locale = CFLocaleCopyCurrent ();CFStringRef name = CFLocaleGetIdentifier (locale);if (CFStringGetCString (name, namebuf, sizeof(namebuf),kCFStringEncodingASCII)){gl_locale_name_canonicalize (namebuf);cached_localename = strdup (namebuf);}CFRelease (locale);# elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */CFTypeRef value =CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),kCFPreferencesCurrentApplication);if (value != NULL&& CFGetTypeID (value) == CFStringGetTypeID ()&& CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf),kCFStringEncodingASCII)){gl_locale_name_canonicalize (namebuf);cached_localename = strdup (namebuf);}# endifif (cached_localename == NULL)cached_localename = "C";}return cached_localename;}# endif# if defined(WIN32_NATIVE) /* WIN32, not Cygwin */{LCID lcid;LANGID langid;int primary, sub;/* Use native Win32 API locale ID. */lcid = GetThreadLocale ();/* Strip off the sorting rules, keep only the language part. */langid = LANGIDFROMLCID (lcid);/* Split into language and territory part. */primary = PRIMARYLANGID (langid);sub = SUBLANGID (langid);/* Dispatch on language.See also http://www.unicode.org/unicode/onlinedat/languages.html .For details about languages, see http://www.ethnologue.com/ . */switch (primary){case LANG_AFRIKAANS: return "af_ZA";case LANG_ALBANIAN: return "sq_AL";case LANG_AMHARIC: return "am_ET";case LANG_ARABIC:switch (sub){case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";case SUBLANG_ARABIC_IRAQ: return "ar_IQ";case SUBLANG_ARABIC_EGYPT: return "ar_EG";case SUBLANG_ARABIC_LIBYA: return "ar_LY";case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";case SUBLANG_ARABIC_MOROCCO: return "ar_MA";case SUBLANG_ARABIC_TUNISIA: return "ar_TN";case SUBLANG_ARABIC_OMAN: return "ar_OM";case SUBLANG_ARABIC_YEMEN: return "ar_YE";case SUBLANG_ARABIC_SYRIA: return "ar_SY";case SUBLANG_ARABIC_JORDAN: return "ar_JO";case SUBLANG_ARABIC_LEBANON: return "ar_LB";case SUBLANG_ARABIC_KUWAIT: return "ar_KW";case SUBLANG_ARABIC_UAE: return "ar_AE";case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";case SUBLANG_ARABIC_QATAR: return "ar_QA";}return "ar";case LANG_ARMENIAN: return "hy_AM";case LANG_ASSAMESE: return "as_IN";case LANG_AZERI:switch (sub){/* FIXME: Adjust this when Azerbaijani locales appear on Unix. */case SUBLANG_AZERI_LATIN: return "az_AZ@latin";case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";}return "az";case LANG_BASQUE:switch (sub){case SUBLANG_DEFAULT: return "eu_ES";}return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */case LANG_BELARUSIAN: return "be_BY";case LANG_BENGALI:switch (sub){case SUBLANG_BENGALI_INDIA: return "bn_IN";case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";}return "bn";case LANG_BULGARIAN: return "bg_BG";case LANG_BURMESE: return "my_MM";case LANG_CAMBODIAN: return "km_KH";case LANG_CATALAN: return "ca_ES";case LANG_CHEROKEE: return "chr_US";case LANG_CHINESE:switch (sub){case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";case SUBLANG_CHINESE_HONGKONG: return "zh_HK";case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";case SUBLANG_CHINESE_MACAU: return "zh_MO";}return "zh";case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN* What used to be called Serbo-Croatian* should really now be two separate* languages because of political reasons.* (Says tml, who knows nothing about Serbian* or Croatian.)* (I can feel those flames coming already.)*/switch (sub){case SUBLANG_DEFAULT: return "hr_HR";case SUBLANG_SERBIAN_LATIN: return "sr_CS";case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";}return "hr";case LANG_CZECH: return "cs_CZ";case LANG_DANISH: return "da_DK";case LANG_DIVEHI: return "dv_MV";case LANG_DUTCH:switch (sub){case SUBLANG_DUTCH: return "nl_NL";case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";}return "nl";case LANG_EDO: return "bin_NG";case LANG_ENGLISH:switch (sub){/* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought* English was the language spoken in England.* Oh well.*/case SUBLANG_ENGLISH_US: return "en_US";case SUBLANG_ENGLISH_UK: return "en_GB";case SUBLANG_ENGLISH_AUS: return "en_AU";case SUBLANG_ENGLISH_CAN: return "en_CA";case SUBLANG_ENGLISH_NZ: return "en_NZ";case SUBLANG_ENGLISH_EIRE: return "en_IE";case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";case SUBLANG_ENGLISH_JAMAICA: return "en_JM";case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */case SUBLANG_ENGLISH_BELIZE: return "en_BZ";case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";case SUBLANG_ENGLISH_INDONESIA: return "en_ID";case SUBLANG_ENGLISH_HONGKONG: return "en_HK";case SUBLANG_ENGLISH_INDIA: return "en_IN";case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";}return "en";case LANG_ESTONIAN: return "et_EE";case LANG_FAEROESE: return "fo_FO";case LANG_FARSI: return "fa_IR";case LANG_FINNISH: return "fi_FI";case LANG_FRENCH:switch (sub){case SUBLANG_FRENCH: return "fr_FR";case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";case SUBLANG_FRENCH_CANADIAN: return "fr_CA";case SUBLANG_FRENCH_SWISS: return "fr_CH";case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";case SUBLANG_FRENCH_MONACO: return "fr_MC";case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */case SUBLANG_FRENCH_REUNION: return "fr_RE";case SUBLANG_FRENCH_CONGO: return "fr_CG";case SUBLANG_FRENCH_SENEGAL: return "fr_SN";case SUBLANG_FRENCH_CAMEROON: return "fr_CM";case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";case SUBLANG_FRENCH_MALI: return "fr_ML";case SUBLANG_FRENCH_MOROCCO: return "fr_MA";case SUBLANG_FRENCH_HAITI: return "fr_HT";}return "fr";case LANG_FRISIAN: return "fy_NL";case LANG_FULFULDE:/* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */return "ff_NG";case LANG_GAELIC:switch (sub){case 0x01: /* SCOTTISH */ return "gd_GB";case 0x02: /* IRISH */ return "ga_IE";}return "C";case LANG_GALICIAN: return "gl_ES";case LANG_GEORGIAN: return "ka_GE";case LANG_GERMAN:switch (sub){case SUBLANG_GERMAN: return "de_DE";case SUBLANG_GERMAN_SWISS: return "de_CH";case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";}return "de";case LANG_GREEK: return "el_GR";case LANG_GUARANI: return "gn_PY";case LANG_GUJARATI: return "gu_IN";case LANG_HAUSA: return "ha_NG";case LANG_HAWAIIAN:/* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)or Hawaii Creole English ("cpe_US", 600000 speakers)? */return "cpe_US";case LANG_HEBREW: return "he_IL";case LANG_HINDI: return "hi_IN";case LANG_HUNGARIAN: return "hu_HU";case LANG_IBIBIO: return "nic_NG";case LANG_ICELANDIC: return "is_IS";case LANG_IGBO: return "ig_NG";case LANG_INDONESIAN: return "id_ID";case LANG_INUKTITUT: return "iu_CA";case LANG_ITALIAN:switch (sub){case SUBLANG_ITALIAN: return "it_IT";case SUBLANG_ITALIAN_SWISS: return "it_CH";}return "it";case LANG_JAPANESE: return "ja_JP";case LANG_KANNADA: return "kn_IN";case LANG_KANURI: return "kr_NG";case LANG_KASHMIRI:switch (sub){case SUBLANG_DEFAULT: return "ks_PK";case SUBLANG_KASHMIRI_INDIA: return "ks_IN";}return "ks";case LANG_KAZAK: return "kk_KZ";case LANG_KONKANI:/* FIXME: Adjust this when such locales appear on Unix. */return "kok_IN";case LANG_KOREAN: return "ko_KR";case LANG_KYRGYZ: return "ky_KG";case LANG_LAO: return "lo_LA";case LANG_LATIN: return "la_VA";case LANG_LATVIAN: return "lv_LV";case LANG_LITHUANIAN: return "lt_LT";case LANG_MACEDONIAN: return "mk_MK";case LANG_MALAY:switch (sub){case SUBLANG_MALAY_MALAYSIA: return "ms_MY";case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";}return "ms";case LANG_MALAYALAM: return "ml_IN";case LANG_MALTESE: return "mt_MT";case LANG_MANIPURI:/* FIXME: Adjust this when such locales appear on Unix. */return "mni_IN";case LANG_MARATHI: return "mr_IN";case LANG_MONGOLIAN:switch (sub){case SUBLANG_DEFAULT: return "mn_MN";}return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */case LANG_NEPALI:switch (sub){case SUBLANG_DEFAULT: return "ne_NP";case SUBLANG_NEPALI_INDIA: return "ne_IN";}return "ne";case LANG_NORWEGIAN:switch (sub){case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";}return "no";case LANG_ORIYA: return "or_IN";case LANG_OROMO: return "om_ET";case LANG_PAPIAMENTU: return "pap_AN";case LANG_PASHTO:return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */case LANG_POLISH: return "pl_PL";case LANG_PORTUGUESE:switch (sub){case SUBLANG_PORTUGUESE: return "pt_PT";/* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";}return "pt";case LANG_PUNJABI:switch (sub){case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */}return "pa";case LANG_RHAETO_ROMANCE: return "rm_CH";case LANG_ROMANIAN:switch (sub){case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";}return "ro";case LANG_RUSSIAN:switch (sub){case SUBLANG_DEFAULT: return "ru_RU";}return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";case LANG_SANSKRIT: return "sa_IN";case LANG_SINDHI:switch (sub){case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";// case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";}return "sd";case LANG_SINHALESE: return "si_LK";case LANG_SLOVAK: return "sk_SK";case LANG_SLOVENIAN: return "sl_SI";case LANG_SOMALI: return "so_SO";case LANG_SORBIAN:/* FIXME: Adjust this when such locales appear on Unix. */return "wen_DE";case LANG_SPANISH:switch (sub){case SUBLANG_SPANISH: return "es_ES";case SUBLANG_SPANISH_MEXICAN: return "es_MX";case SUBLANG_SPANISH_MODERN:return "es_ES@modern"; /* not seen on Unix */case SUBLANG_SPANISH_GUATEMALA: return "es_GT";case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";case SUBLANG_SPANISH_PANAMA: return "es_PA";case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";case SUBLANG_SPANISH_VENEZUELA: return "es_VE";case SUBLANG_SPANISH_COLOMBIA: return "es_CO";case SUBLANG_SPANISH_PERU: return "es_PE";case SUBLANG_SPANISH_ARGENTINA: return "es_AR";case SUBLANG_SPANISH_ECUADOR: return "es_EC";case SUBLANG_SPANISH_CHILE: return "es_CL";case SUBLANG_SPANISH_URUGUAY: return "es_UY";case SUBLANG_SPANISH_PARAGUAY: return "es_PY";case SUBLANG_SPANISH_BOLIVIA: return "es_BO";case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";case SUBLANG_SPANISH_HONDURAS: return "es_HN";case SUBLANG_SPANISH_NICARAGUA: return "es_NI";case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";}return "es";case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */case LANG_SWAHILI: return "sw_KE";case LANG_SWEDISH:switch (sub){case SUBLANG_DEFAULT: return "sv_SE";case SUBLANG_SWEDISH_FINLAND: return "sv_FI";}return "sv";case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */case LANG_TAGALOG: return "tl_PH";case LANG_TAJIK: return "tg_TJ";case LANG_TAMAZIGHT:switch (sub){/* FIXME: Adjust this when Tamazight locales appear on Unix. */case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin";}return "ber_MA";case LANG_TAMIL:switch (sub){case SUBLANG_DEFAULT: return "ta_IN";}return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */case LANG_TATAR: return "tt_RU";case LANG_TELUGU: return "te_IN";case LANG_THAI: return "th_TH";case LANG_TIBETAN: return "bo_CN";case LANG_TIGRINYA:switch (sub){case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";}return "ti";case LANG_TSONGA: return "ts_ZA";case LANG_TSWANA: return "tn_BW";case LANG_TURKISH: return "tr_TR";case LANG_TURKMEN: return "tk_TM";case LANG_UKRAINIAN: return "uk_UA";case LANG_URDU:switch (sub){case SUBLANG_URDU_PAKISTAN: return "ur_PK";case SUBLANG_URDU_INDIA: return "ur_IN";}return "ur";case LANG_UZBEK:switch (sub){case SUBLANG_UZBEK_LATIN: return "uz_UZ";case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";}return "uz";case LANG_VENDA: return "ve_ZA";case LANG_VIETNAMESE: return "vi_VN";case LANG_WELSH: return "cy_GB";case LANG_XHOSA: return "xh_ZA";case LANG_YI: return "sit_CN";case LANG_YIDDISH: return "yi_IL";case LANG_YORUBA: return "yo_NG";case LANG_ZULU: return "zu_ZA";default: return "C";}}# endif#endif}const char *gl_locale_name (int category, const char *categoryname){const char *retval;retval = gl_locale_name_posix (category, categoryname);if (retval != NULL)return retval;return gl_locale_name_default ();}