1/* Determine name of the currently selected locale. 2 Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify it 5 under the terms of the GNU General Public License as published 6 by the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU General Public 15 License along with this program; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 17 USA. */ 18 19/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */ 20/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */ 21/* MacOS X code written by Bruno Haible <bruno@clisp.org>. */ 22 23#include <config.h> 24 25/* Specification. */ 26#ifdef IN_LIBINTL 27# include "gettextP.h" 28#else 29# include "localename.h" 30#endif 31 32#include <stdlib.h> 33#include <locale.h> 34 35#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE 36# include <string.h> 37# include <CoreFoundation/CFString.h> 38# if HAVE_CFLOCALECOPYCURRENT 39# include <CoreFoundation/CFLocale.h> 40# elif HAVE_CFPREFERENCESCOPYAPPVALUE 41# include <CoreFoundation/CFPreferences.h> 42# endif 43#endif 44 45#if defined _WIN32 || defined __WIN32__ 46# define WIN32_NATIVE 47#endif 48 49#ifdef WIN32_NATIVE 50# define WIN32_LEAN_AND_MEAN 51# include <windows.h> 52/* List of language codes, sorted by value: 53 0x01 LANG_ARABIC 54 0x02 LANG_BULGARIAN 55 0x03 LANG_CATALAN 56 0x04 LANG_CHINESE 57 0x05 LANG_CZECH 58 0x06 LANG_DANISH 59 0x07 LANG_GERMAN 60 0x08 LANG_GREEK 61 0x09 LANG_ENGLISH 62 0x0a LANG_SPANISH 63 0x0b LANG_FINNISH 64 0x0c LANG_FRENCH 65 0x0d LANG_HEBREW 66 0x0e LANG_HUNGARIAN 67 0x0f LANG_ICELANDIC 68 0x10 LANG_ITALIAN 69 0x11 LANG_JAPANESE 70 0x12 LANG_KOREAN 71 0x13 LANG_DUTCH 72 0x14 LANG_NORWEGIAN 73 0x15 LANG_POLISH 74 0x16 LANG_PORTUGUESE 75 0x17 LANG_RHAETO_ROMANCE 76 0x18 LANG_ROMANIAN 77 0x19 LANG_RUSSIAN 78 0x1a LANG_CROATIAN == LANG_SERBIAN 79 0x1b LANG_SLOVAK 80 0x1c LANG_ALBANIAN 81 0x1d LANG_SWEDISH 82 0x1e LANG_THAI 83 0x1f LANG_TURKISH 84 0x20 LANG_URDU 85 0x21 LANG_INDONESIAN 86 0x22 LANG_UKRAINIAN 87 0x23 LANG_BELARUSIAN 88 0x24 LANG_SLOVENIAN 89 0x25 LANG_ESTONIAN 90 0x26 LANG_LATVIAN 91 0x27 LANG_LITHUANIAN 92 0x28 LANG_TAJIK 93 0x29 LANG_FARSI 94 0x2a LANG_VIETNAMESE 95 0x2b LANG_ARMENIAN 96 0x2c LANG_AZERI 97 0x2d LANG_BASQUE 98 0x2e LANG_SORBIAN 99 0x2f LANG_MACEDONIAN 100 0x30 LANG_SUTU 101 0x31 LANG_TSONGA 102 0x32 LANG_TSWANA 103 0x33 LANG_VENDA 104 0x34 LANG_XHOSA 105 0x35 LANG_ZULU 106 0x36 LANG_AFRIKAANS 107 0x37 LANG_GEORGIAN 108 0x38 LANG_FAEROESE 109 0x39 LANG_HINDI 110 0x3a LANG_MALTESE 111 0x3b LANG_SAAMI 112 0x3c LANG_GAELIC 113 0x3d LANG_YIDDISH 114 0x3e LANG_MALAY 115 0x3f LANG_KAZAK 116 0x40 LANG_KYRGYZ 117 0x41 LANG_SWAHILI 118 0x42 LANG_TURKMEN 119 0x43 LANG_UZBEK 120 0x44 LANG_TATAR 121 0x45 LANG_BENGALI 122 0x46 LANG_PUNJABI 123 0x47 LANG_GUJARATI 124 0x48 LANG_ORIYA 125 0x49 LANG_TAMIL 126 0x4a LANG_TELUGU 127 0x4b LANG_KANNADA 128 0x4c LANG_MALAYALAM 129 0x4d LANG_ASSAMESE 130 0x4e LANG_MARATHI 131 0x4f LANG_SANSKRIT 132 0x50 LANG_MONGOLIAN 133 0x51 LANG_TIBETAN 134 0x52 LANG_WELSH 135 0x53 LANG_CAMBODIAN 136 0x54 LANG_LAO 137 0x55 LANG_BURMESE 138 0x56 LANG_GALICIAN 139 0x57 LANG_KONKANI 140 0x58 LANG_MANIPURI 141 0x59 LANG_SINDHI 142 0x5a LANG_SYRIAC 143 0x5b LANG_SINHALESE 144 0x5c LANG_CHEROKEE 145 0x5d LANG_INUKTITUT 146 0x5e LANG_AMHARIC 147 0x5f LANG_TAMAZIGHT 148 0x60 LANG_KASHMIRI 149 0x61 LANG_NEPALI 150 0x62 LANG_FRISIAN 151 0x63 LANG_PASHTO 152 0x64 LANG_TAGALOG 153 0x65 LANG_DIVEHI 154 0x66 LANG_EDO 155 0x67 LANG_FULFULDE 156 0x68 LANG_HAUSA 157 0x69 LANG_IBIBIO 158 0x6a LANG_YORUBA 159 0x70 LANG_IGBO 160 0x71 LANG_KANURI 161 0x72 LANG_OROMO 162 0x73 LANG_TIGRINYA 163 0x74 LANG_GUARANI 164 0x75 LANG_HAWAIIAN 165 0x76 LANG_LATIN 166 0x77 LANG_SOMALI 167 0x78 LANG_YI 168 0x79 LANG_PAPIAMENTU 169*/ 170/* Mingw headers don't have latest language and sublanguage codes. */ 171# ifndef LANG_AFRIKAANS 172# define LANG_AFRIKAANS 0x36 173# endif 174# ifndef LANG_ALBANIAN 175# define LANG_ALBANIAN 0x1c 176# endif 177# ifndef LANG_AMHARIC 178# define LANG_AMHARIC 0x5e 179# endif 180# ifndef LANG_ARABIC 181# define LANG_ARABIC 0x01 182# endif 183# ifndef LANG_ARMENIAN 184# define LANG_ARMENIAN 0x2b 185# endif 186# ifndef LANG_ASSAMESE 187# define LANG_ASSAMESE 0x4d 188# endif 189# ifndef LANG_AZERI 190# define LANG_AZERI 0x2c 191# endif 192# ifndef LANG_BASQUE 193# define LANG_BASQUE 0x2d 194# endif 195# ifndef LANG_BELARUSIAN 196# define LANG_BELARUSIAN 0x23 197# endif 198# ifndef LANG_BENGALI 199# define LANG_BENGALI 0x45 200# endif 201# ifndef LANG_BURMESE 202# define LANG_BURMESE 0x55 203# endif 204# ifndef LANG_CAMBODIAN 205# define LANG_CAMBODIAN 0x53 206# endif 207# ifndef LANG_CATALAN 208# define LANG_CATALAN 0x03 209# endif 210# ifndef LANG_CHEROKEE 211# define LANG_CHEROKEE 0x5c 212# endif 213# ifndef LANG_DIVEHI 214# define LANG_DIVEHI 0x65 215# endif 216# ifndef LANG_EDO 217# define LANG_EDO 0x66 218# endif 219# ifndef LANG_ESTONIAN 220# define LANG_ESTONIAN 0x25 221# endif 222# ifndef LANG_FAEROESE 223# define LANG_FAEROESE 0x38 224# endif 225# ifndef LANG_FARSI 226# define LANG_FARSI 0x29 227# endif 228# ifndef LANG_FRISIAN 229# define LANG_FRISIAN 0x62 230# endif 231# ifndef LANG_FULFULDE 232# define LANG_FULFULDE 0x67 233# endif 234# ifndef LANG_GAELIC 235# define LANG_GAELIC 0x3c 236# endif 237# ifndef LANG_GALICIAN 238# define LANG_GALICIAN 0x56 239# endif 240# ifndef LANG_GEORGIAN 241# define LANG_GEORGIAN 0x37 242# endif 243# ifndef LANG_GUARANI 244# define LANG_GUARANI 0x74 245# endif 246# ifndef LANG_GUJARATI 247# define LANG_GUJARATI 0x47 248# endif 249# ifndef LANG_HAUSA 250# define LANG_HAUSA 0x68 251# endif 252# ifndef LANG_HAWAIIAN 253# define LANG_HAWAIIAN 0x75 254# endif 255# ifndef LANG_HEBREW 256# define LANG_HEBREW 0x0d 257# endif 258# ifndef LANG_HINDI 259# define LANG_HINDI 0x39 260# endif 261# ifndef LANG_IBIBIO 262# define LANG_IBIBIO 0x69 263# endif 264# ifndef LANG_IGBO 265# define LANG_IGBO 0x70 266# endif 267# ifndef LANG_INDONESIAN 268# define LANG_INDONESIAN 0x21 269# endif 270# ifndef LANG_INUKTITUT 271# define LANG_INUKTITUT 0x5d 272# endif 273# ifndef LANG_KANNADA 274# define LANG_KANNADA 0x4b 275# endif 276# ifndef LANG_KANURI 277# define LANG_KANURI 0x71 278# endif 279# ifndef LANG_KASHMIRI 280# define LANG_KASHMIRI 0x60 281# endif 282# ifndef LANG_KAZAK 283# define LANG_KAZAK 0x3f 284# endif 285# ifndef LANG_KONKANI 286# define LANG_KONKANI 0x57 287# endif 288# ifndef LANG_KYRGYZ 289# define LANG_KYRGYZ 0x40 290# endif 291# ifndef LANG_LAO 292# define LANG_LAO 0x54 293# endif 294# ifndef LANG_LATIN 295# define LANG_LATIN 0x76 296# endif 297# ifndef LANG_LATVIAN 298# define LANG_LATVIAN 0x26 299# endif 300# ifndef LANG_LITHUANIAN 301# define LANG_LITHUANIAN 0x27 302# endif 303# ifndef LANG_MACEDONIAN 304# define LANG_MACEDONIAN 0x2f 305# endif 306# ifndef LANG_MALAY 307# define LANG_MALAY 0x3e 308# endif 309# ifndef LANG_MALAYALAM 310# define LANG_MALAYALAM 0x4c 311# endif 312# ifndef LANG_MALTESE 313# define LANG_MALTESE 0x3a 314# endif 315# ifndef LANG_MANIPURI 316# define LANG_MANIPURI 0x58 317# endif 318# ifndef LANG_MARATHI 319# define LANG_MARATHI 0x4e 320# endif 321# ifndef LANG_MONGOLIAN 322# define LANG_MONGOLIAN 0x50 323# endif 324# ifndef LANG_NEPALI 325# define LANG_NEPALI 0x61 326# endif 327# ifndef LANG_ORIYA 328# define LANG_ORIYA 0x48 329# endif 330# ifndef LANG_OROMO 331# define LANG_OROMO 0x72 332# endif 333# ifndef LANG_PAPIAMENTU 334# define LANG_PAPIAMENTU 0x79 335# endif 336# ifndef LANG_PASHTO 337# define LANG_PASHTO 0x63 338# endif 339# ifndef LANG_PUNJABI 340# define LANG_PUNJABI 0x46 341# endif 342# ifndef LANG_RHAETO_ROMANCE 343# define LANG_RHAETO_ROMANCE 0x17 344# endif 345# ifndef LANG_SAAMI 346# define LANG_SAAMI 0x3b 347# endif 348# ifndef LANG_SANSKRIT 349# define LANG_SANSKRIT 0x4f 350# endif 351# ifndef LANG_SERBIAN 352# define LANG_SERBIAN 0x1a 353# endif 354# ifndef LANG_SINDHI 355# define LANG_SINDHI 0x59 356# endif 357# ifndef LANG_SINHALESE 358# define LANG_SINHALESE 0x5b 359# endif 360# ifndef LANG_SLOVAK 361# define LANG_SLOVAK 0x1b 362# endif 363# ifndef LANG_SOMALI 364# define LANG_SOMALI 0x77 365# endif 366# ifndef LANG_SORBIAN 367# define LANG_SORBIAN 0x2e 368# endif 369# ifndef LANG_SUTU 370# define LANG_SUTU 0x30 371# endif 372# ifndef LANG_SWAHILI 373# define LANG_SWAHILI 0x41 374# endif 375# ifndef LANG_SYRIAC 376# define LANG_SYRIAC 0x5a 377# endif 378# ifndef LANG_TAGALOG 379# define LANG_TAGALOG 0x64 380# endif 381# ifndef LANG_TAJIK 382# define LANG_TAJIK 0x28 383# endif 384# ifndef LANG_TAMAZIGHT 385# define LANG_TAMAZIGHT 0x5f 386# endif 387# ifndef LANG_TAMIL 388# define LANG_TAMIL 0x49 389# endif 390# ifndef LANG_TATAR 391# define LANG_TATAR 0x44 392# endif 393# ifndef LANG_TELUGU 394# define LANG_TELUGU 0x4a 395# endif 396# ifndef LANG_THAI 397# define LANG_THAI 0x1e 398# endif 399# ifndef LANG_TIBETAN 400# define LANG_TIBETAN 0x51 401# endif 402# ifndef LANG_TIGRINYA 403# define LANG_TIGRINYA 0x73 404# endif 405# ifndef LANG_TSONGA 406# define LANG_TSONGA 0x31 407# endif 408# ifndef LANG_TSWANA 409# define LANG_TSWANA 0x32 410# endif 411# ifndef LANG_TURKMEN 412# define LANG_TURKMEN 0x42 413# endif 414# ifndef LANG_UKRAINIAN 415# define LANG_UKRAINIAN 0x22 416# endif 417# ifndef LANG_URDU 418# define LANG_URDU 0x20 419# endif 420# ifndef LANG_UZBEK 421# define LANG_UZBEK 0x43 422# endif 423# ifndef LANG_VENDA 424# define LANG_VENDA 0x33 425# endif 426# ifndef LANG_VIETNAMESE 427# define LANG_VIETNAMESE 0x2a 428# endif 429# ifndef LANG_WELSH 430# define LANG_WELSH 0x52 431# endif 432# ifndef LANG_XHOSA 433# define LANG_XHOSA 0x34 434# endif 435# ifndef LANG_YI 436# define LANG_YI 0x78 437# endif 438# ifndef LANG_YIDDISH 439# define LANG_YIDDISH 0x3d 440# endif 441# ifndef LANG_YORUBA 442# define LANG_YORUBA 0x6a 443# endif 444# ifndef LANG_ZULU 445# define LANG_ZULU 0x35 446# endif 447# ifndef SUBLANG_ARABIC_SAUDI_ARABIA 448# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 449# endif 450# ifndef SUBLANG_ARABIC_IRAQ 451# define SUBLANG_ARABIC_IRAQ 0x02 452# endif 453# ifndef SUBLANG_ARABIC_EGYPT 454# define SUBLANG_ARABIC_EGYPT 0x03 455# endif 456# ifndef SUBLANG_ARABIC_LIBYA 457# define SUBLANG_ARABIC_LIBYA 0x04 458# endif 459# ifndef SUBLANG_ARABIC_ALGERIA 460# define SUBLANG_ARABIC_ALGERIA 0x05 461# endif 462# ifndef SUBLANG_ARABIC_MOROCCO 463# define SUBLANG_ARABIC_MOROCCO 0x06 464# endif 465# ifndef SUBLANG_ARABIC_TUNISIA 466# define SUBLANG_ARABIC_TUNISIA 0x07 467# endif 468# ifndef SUBLANG_ARABIC_OMAN 469# define SUBLANG_ARABIC_OMAN 0x08 470# endif 471# ifndef SUBLANG_ARABIC_YEMEN 472# define SUBLANG_ARABIC_YEMEN 0x09 473# endif 474# ifndef SUBLANG_ARABIC_SYRIA 475# define SUBLANG_ARABIC_SYRIA 0x0a 476# endif 477# ifndef SUBLANG_ARABIC_JORDAN 478# define SUBLANG_ARABIC_JORDAN 0x0b 479# endif 480# ifndef SUBLANG_ARABIC_LEBANON 481# define SUBLANG_ARABIC_LEBANON 0x0c 482# endif 483# ifndef SUBLANG_ARABIC_KUWAIT 484# define SUBLANG_ARABIC_KUWAIT 0x0d 485# endif 486# ifndef SUBLANG_ARABIC_UAE 487# define SUBLANG_ARABIC_UAE 0x0e 488# endif 489# ifndef SUBLANG_ARABIC_BAHRAIN 490# define SUBLANG_ARABIC_BAHRAIN 0x0f 491# endif 492# ifndef SUBLANG_ARABIC_QATAR 493# define SUBLANG_ARABIC_QATAR 0x10 494# endif 495# ifndef SUBLANG_AZERI_LATIN 496# define SUBLANG_AZERI_LATIN 0x01 497# endif 498# ifndef SUBLANG_AZERI_CYRILLIC 499# define SUBLANG_AZERI_CYRILLIC 0x02 500# endif 501# ifndef SUBLANG_BENGALI_INDIA 502# define SUBLANG_BENGALI_INDIA 0x01 503# endif 504# ifndef SUBLANG_BENGALI_BANGLADESH 505# define SUBLANG_BENGALI_BANGLADESH 0x02 506# endif 507# ifndef SUBLANG_CHINESE_MACAU 508# define SUBLANG_CHINESE_MACAU 0x05 509# endif 510# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA 511# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 512# endif 513# ifndef SUBLANG_ENGLISH_JAMAICA 514# define SUBLANG_ENGLISH_JAMAICA 0x08 515# endif 516# ifndef SUBLANG_ENGLISH_CARIBBEAN 517# define SUBLANG_ENGLISH_CARIBBEAN 0x09 518# endif 519# ifndef SUBLANG_ENGLISH_BELIZE 520# define SUBLANG_ENGLISH_BELIZE 0x0a 521# endif 522# ifndef SUBLANG_ENGLISH_TRINIDAD 523# define SUBLANG_ENGLISH_TRINIDAD 0x0b 524# endif 525# ifndef SUBLANG_ENGLISH_ZIMBABWE 526# define SUBLANG_ENGLISH_ZIMBABWE 0x0c 527# endif 528# ifndef SUBLANG_ENGLISH_PHILIPPINES 529# define SUBLANG_ENGLISH_PHILIPPINES 0x0d 530# endif 531# ifndef SUBLANG_ENGLISH_INDONESIA 532# define SUBLANG_ENGLISH_INDONESIA 0x0e 533# endif 534# ifndef SUBLANG_ENGLISH_HONGKONG 535# define SUBLANG_ENGLISH_HONGKONG 0x0f 536# endif 537# ifndef SUBLANG_ENGLISH_INDIA 538# define SUBLANG_ENGLISH_INDIA 0x10 539# endif 540# ifndef SUBLANG_ENGLISH_MALAYSIA 541# define SUBLANG_ENGLISH_MALAYSIA 0x11 542# endif 543# ifndef SUBLANG_ENGLISH_SINGAPORE 544# define SUBLANG_ENGLISH_SINGAPORE 0x12 545# endif 546# ifndef SUBLANG_FRENCH_LUXEMBOURG 547# define SUBLANG_FRENCH_LUXEMBOURG 0x05 548# endif 549# ifndef SUBLANG_FRENCH_MONACO 550# define SUBLANG_FRENCH_MONACO 0x06 551# endif 552# ifndef SUBLANG_FRENCH_WESTINDIES 553# define SUBLANG_FRENCH_WESTINDIES 0x07 554# endif 555# ifndef SUBLANG_FRENCH_REUNION 556# define SUBLANG_FRENCH_REUNION 0x08 557# endif 558# ifndef SUBLANG_FRENCH_CONGO 559# define SUBLANG_FRENCH_CONGO 0x09 560# endif 561# ifndef SUBLANG_FRENCH_SENEGAL 562# define SUBLANG_FRENCH_SENEGAL 0x0a 563# endif 564# ifndef SUBLANG_FRENCH_CAMEROON 565# define SUBLANG_FRENCH_CAMEROON 0x0b 566# endif 567# ifndef SUBLANG_FRENCH_COTEDIVOIRE 568# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c 569# endif 570# ifndef SUBLANG_FRENCH_MALI 571# define SUBLANG_FRENCH_MALI 0x0d 572# endif 573# ifndef SUBLANG_FRENCH_MOROCCO 574# define SUBLANG_FRENCH_MOROCCO 0x0e 575# endif 576# ifndef SUBLANG_FRENCH_HAITI 577# define SUBLANG_FRENCH_HAITI 0x0f 578# endif 579# ifndef SUBLANG_GERMAN_LUXEMBOURG 580# define SUBLANG_GERMAN_LUXEMBOURG 0x04 581# endif 582# ifndef SUBLANG_GERMAN_LIECHTENSTEIN 583# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 584# endif 585# ifndef SUBLANG_KASHMIRI_INDIA 586# define SUBLANG_KASHMIRI_INDIA 0x02 587# endif 588# ifndef SUBLANG_MALAY_MALAYSIA 589# define SUBLANG_MALAY_MALAYSIA 0x01 590# endif 591# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM 592# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 593# endif 594# ifndef SUBLANG_NEPALI_INDIA 595# define SUBLANG_NEPALI_INDIA 0x02 596# endif 597# ifndef SUBLANG_PUNJABI_INDIA 598# define SUBLANG_PUNJABI_INDIA 0x01 599# endif 600# ifndef SUBLANG_PUNJABI_PAKISTAN 601# define SUBLANG_PUNJABI_PAKISTAN 0x02 602# endif 603# ifndef SUBLANG_ROMANIAN_ROMANIA 604# define SUBLANG_ROMANIAN_ROMANIA 0x01 605# endif 606# ifndef SUBLANG_ROMANIAN_MOLDOVA 607# define SUBLANG_ROMANIAN_MOLDOVA 0x02 608# endif 609# ifndef SUBLANG_SERBIAN_LATIN 610# define SUBLANG_SERBIAN_LATIN 0x02 611# endif 612# ifndef SUBLANG_SERBIAN_CYRILLIC 613# define SUBLANG_SERBIAN_CYRILLIC 0x03 614# endif 615# ifndef SUBLANG_SINDHI_PAKISTAN 616# define SUBLANG_SINDHI_PAKISTAN 0x01 617# endif 618# ifndef SUBLANG_SINDHI_AFGHANISTAN 619# define SUBLANG_SINDHI_AFGHANISTAN 0x02 620# endif 621# ifndef SUBLANG_SPANISH_GUATEMALA 622# define SUBLANG_SPANISH_GUATEMALA 0x04 623# endif 624# ifndef SUBLANG_SPANISH_COSTA_RICA 625# define SUBLANG_SPANISH_COSTA_RICA 0x05 626# endif 627# ifndef SUBLANG_SPANISH_PANAMA 628# define SUBLANG_SPANISH_PANAMA 0x06 629# endif 630# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC 631# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 632# endif 633# ifndef SUBLANG_SPANISH_VENEZUELA 634# define SUBLANG_SPANISH_VENEZUELA 0x08 635# endif 636# ifndef SUBLANG_SPANISH_COLOMBIA 637# define SUBLANG_SPANISH_COLOMBIA 0x09 638# endif 639# ifndef SUBLANG_SPANISH_PERU 640# define SUBLANG_SPANISH_PERU 0x0a 641# endif 642# ifndef SUBLANG_SPANISH_ARGENTINA 643# define SUBLANG_SPANISH_ARGENTINA 0x0b 644# endif 645# ifndef SUBLANG_SPANISH_ECUADOR 646# define SUBLANG_SPANISH_ECUADOR 0x0c 647# endif 648# ifndef SUBLANG_SPANISH_CHILE 649# define SUBLANG_SPANISH_CHILE 0x0d 650# endif 651# ifndef SUBLANG_SPANISH_URUGUAY 652# define SUBLANG_SPANISH_URUGUAY 0x0e 653# endif 654# ifndef SUBLANG_SPANISH_PARAGUAY 655# define SUBLANG_SPANISH_PARAGUAY 0x0f 656# endif 657# ifndef SUBLANG_SPANISH_BOLIVIA 658# define SUBLANG_SPANISH_BOLIVIA 0x10 659# endif 660# ifndef SUBLANG_SPANISH_EL_SALVADOR 661# define SUBLANG_SPANISH_EL_SALVADOR 0x11 662# endif 663# ifndef SUBLANG_SPANISH_HONDURAS 664# define SUBLANG_SPANISH_HONDURAS 0x12 665# endif 666# ifndef SUBLANG_SPANISH_NICARAGUA 667# define SUBLANG_SPANISH_NICARAGUA 0x13 668# endif 669# ifndef SUBLANG_SPANISH_PUERTO_RICO 670# define SUBLANG_SPANISH_PUERTO_RICO 0x14 671# endif 672# ifndef SUBLANG_SWEDISH_FINLAND 673# define SUBLANG_SWEDISH_FINLAND 0x02 674# endif 675# ifndef SUBLANG_TAMAZIGHT_ARABIC 676# define SUBLANG_TAMAZIGHT_ARABIC 0x01 677# endif 678# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN 679# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 680# endif 681# ifndef SUBLANG_TIGRINYA_ETHIOPIA 682# define SUBLANG_TIGRINYA_ETHIOPIA 0x01 683# endif 684# ifndef SUBLANG_TIGRINYA_ERITREA 685# define SUBLANG_TIGRINYA_ERITREA 0x02 686# endif 687# ifndef SUBLANG_URDU_PAKISTAN 688# define SUBLANG_URDU_PAKISTAN 0x01 689# endif 690# ifndef SUBLANG_URDU_INDIA 691# define SUBLANG_URDU_INDIA 0x02 692# endif 693# ifndef SUBLANG_UZBEK_LATIN 694# define SUBLANG_UZBEK_LATIN 0x01 695# endif 696# ifndef SUBLANG_UZBEK_CYRILLIC 697# define SUBLANG_UZBEK_CYRILLIC 0x02 698# endif 699#endif 700 701# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE 702/* MacOS X 10.2 or newer */ 703 704/* Canonicalize a MacOS X locale name to a Unix locale name. 705 NAME is a sufficiently large buffer. 706 On input, it contains the MacOS X locale name. 707 On output, it contains the Unix locale name. */ 708# if !defined IN_LIBINTL 709static 710# endif 711void 712gl_locale_name_canonicalize (char *name) 713{ 714 /* This conversion is based on a posting by 715 Deborah GoldSmith <goldsmit@apple.com> on 2005-03-08, 716 http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */ 717 718 /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and 719 ISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this. 720 Therefore we do it ourselves, using a table based on the results of the 721 MacOS X 10.3.8 function 722 CFLocaleCreateCanonicalLocaleIdentifierFromString(). */ 723 typedef struct { const char legacy[21+1]; const char unixy[5+1]; } 724 legacy_entry; 725 static const legacy_entry legacy_table[] = { 726 { "Afrikaans", "af" }, 727 { "Albanian", "sq" }, 728 { "Amharic", "am" }, 729 { "Arabic", "ar" }, 730 { "Armenian", "hy" }, 731 { "Assamese", "as" }, 732 { "Aymara", "ay" }, 733 { "Azerbaijani", "az" }, 734 { "Basque", "eu" }, 735 { "Belarusian", "be" }, 736 { "Belorussian", "be" }, 737 { "Bengali", "bn" }, 738 { "Brazilian Portugese", "pt_BR" }, 739 { "Brazilian Portuguese", "pt_BR" }, 740 { "Breton", "br" }, 741 { "Bulgarian", "bg" }, 742 { "Burmese", "my" }, 743 { "Byelorussian", "be" }, 744 { "Catalan", "ca" }, 745 { "Chewa", "ny" }, 746 { "Chichewa", "ny" }, 747 { "Chinese", "zh" }, 748 { "Chinese, Simplified", "zh_CN" }, 749 { "Chinese, Traditional", "zh_TW" }, 750 { "Chinese, Tradtional", "zh_TW" }, 751 { "Croatian", "hr" }, 752 { "Czech", "cs" }, 753 { "Danish", "da" }, 754 { "Dutch", "nl" }, 755 { "Dzongkha", "dz" }, 756 { "English", "en" }, 757 { "Esperanto", "eo" }, 758 { "Estonian", "et" }, 759 { "Faroese", "fo" }, 760 { "Farsi", "fa" }, 761 { "Finnish", "fi" }, 762 { "Flemish", "nl_BE" }, 763 { "French", "fr" }, 764 { "Galician", "gl" }, 765 { "Gallegan", "gl" }, 766 { "Georgian", "ka" }, 767 { "German", "de" }, 768 { "Greek", "el" }, 769 { "Greenlandic", "kl" }, 770 { "Guarani", "gn" }, 771 { "Gujarati", "gu" }, 772 { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */ 773 { "Hebrew", "he" }, 774 { "Hindi", "hi" }, 775 { "Hungarian", "hu" }, 776 { "Icelandic", "is" }, 777 { "Indonesian", "id" }, 778 { "Inuktitut", "iu" }, 779 { "Irish", "ga" }, 780 { "Italian", "it" }, 781 { "Japanese", "ja" }, 782 { "Javanese", "jv" }, 783 { "Kalaallisut", "kl" }, 784 { "Kannada", "kn" }, 785 { "Kashmiri", "ks" }, 786 { "Kazakh", "kk" }, 787 { "Khmer", "km" }, 788 { "Kinyarwanda", "rw" }, 789 { "Kirghiz", "ky" }, 790 { "Korean", "ko" }, 791 { "Kurdish", "ku" }, 792 { "Latin", "la" }, 793 { "Latvian", "lv" }, 794 { "Lithuanian", "lt" }, 795 { "Macedonian", "mk" }, 796 { "Malagasy", "mg" }, 797 { "Malay", "ms" }, 798 { "Malayalam", "ml" }, 799 { "Maltese", "mt" }, 800 { "Manx", "gv" }, 801 { "Marathi", "mr" }, 802 { "Moldavian", "mo" }, 803 { "Mongolian", "mn" }, 804 { "Nepali", "ne" }, 805 { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */ 806 { "Nyanja", "ny" }, 807 { "Nynorsk", "nn" }, 808 { "Oriya", "or" }, 809 { "Oromo", "om" }, 810 { "Panjabi", "pa" }, 811 { "Pashto", "ps" }, 812 { "Persian", "fa" }, 813 { "Polish", "pl" }, 814 { "Portuguese", "pt" }, 815 { "Portuguese, Brazilian", "pt_BR" }, 816 { "Punjabi", "pa" }, 817 { "Pushto", "ps" }, 818 { "Quechua", "qu" }, 819 { "Romanian", "ro" }, 820 { "Ruanda", "rw" }, 821 { "Rundi", "rn" }, 822 { "Russian", "ru" }, 823 { "Sami", "se_NO" }, /* Not just "se". */ 824 { "Sanskrit", "sa" }, 825 { "Scottish", "gd" }, 826 { "Serbian", "sr" }, 827 { "Simplified Chinese", "zh_CN" }, 828 { "Sindhi", "sd" }, 829 { "Sinhalese", "si" }, 830 { "Slovak", "sk" }, 831 { "Slovenian", "sl" }, 832 { "Somali", "so" }, 833 { "Spanish", "es" }, 834 { "Sundanese", "su" }, 835 { "Swahili", "sw" }, 836 { "Swedish", "sv" }, 837 { "Tagalog", "tl" }, 838 { "Tajik", "tg" }, 839 { "Tajiki", "tg" }, 840 { "Tamil", "ta" }, 841 { "Tatar", "tt" }, 842 { "Telugu", "te" }, 843 { "Thai", "th" }, 844 { "Tibetan", "bo" }, 845 { "Tigrinya", "ti" }, 846 { "Tongan", "to" }, 847 { "Traditional Chinese", "zh_TW" }, 848 { "Turkish", "tr" }, 849 { "Turkmen", "tk" }, 850 { "Uighur", "ug" }, 851 { "Ukrainian", "uk" }, 852 { "Urdu", "ur" }, 853 { "Uzbek", "uz" }, 854 { "Vietnamese", "vi" }, 855 { "Welsh", "cy" }, 856 { "Yiddish", "yi" } 857 }; 858 859 /* Convert new-style locale names with language tags (ISO 639 and ISO 15924) 860 to Unix (ISO 639 and ISO 3166) names. */ 861 typedef struct { const char langtag[7+1]; const char unixy[12+1]; } 862 langtag_entry; 863 static const langtag_entry langtag_table[] = { 864 /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn". 865 The default script for az on Unix is Latin. */ 866 { "az-Latn", "az" }, 867 /* MacOS X has "ga-dots". Does not yet exist on Unix. */ 868 { "ga-dots", "ga" }, 869 /* MacOS X has "kk-Cyrl". Does not yet exist on Unix. */ 870 /* MacOS X has "mn-Cyrl", "mn-Mong". 871 The default script for mn on Unix is Cyrillic. */ 872 { "mn-Cyrl", "mn" }, 873 /* MacOS X has "ms-Arab", "ms-Latn". 874 The default script for ms on Unix is Latin. */ 875 { "ms-Latn", "ms" }, 876 /* MacOS X has "tg-Cyrl". 877 The default script for tg on Unix is Cyrillic. */ 878 { "tg-Cyrl", "tg" }, 879 /* MacOS X has "tk-Cyrl". Does not yet exist on Unix. */ 880 /* MacOS X has "tt-Cyrl". 881 The default script for tt on Unix is Cyrillic. */ 882 { "tt-Cyrl", "tt" }, 883 /* MacOS X has "zh-Hans", "zh-Hant". 884 Country codes are used to distinguish these on Unix. */ 885 { "zh-Hans", "zh_CN" }, 886 { "zh-Hant", "zh_TW" } 887 }; 888 889 /* Convert script names (ISO 15924) to Unix conventions. 890 See http://www.unicode.org/iso15924/iso15924-codes.html */ 891 typedef struct { const char script[4+1]; const char unixy[9+1]; } 892 script_entry; 893 static const script_entry script_table[] = { 894 { "Arab", "arabic" }, 895 { "Cyrl", "cyrillic" }, 896 { "Mong", "mongolian" } 897 }; 898 899 /* Step 1: Convert using legacy_table. */ 900 if (name[0] >= 'A' && name[0] <= 'Z') 901 { 902 unsigned int i1, i2; 903 i1 = 0; 904 i2 = sizeof (legacy_table) / sizeof (legacy_entry); 905 while (i2 - i1 > 1) 906 { 907 /* At this point we know that if name occurs in legacy_table, 908 its index must be >= i1 and < i2. */ 909 unsigned int i = (i1 + i2) >> 1; 910 const legacy_entry *p = &legacy_table[i]; 911 if (strcmp (name, p->legacy) < 0) 912 i2 = i; 913 else 914 i1 = i; 915 } 916 if (strcmp (name, legacy_table[i1].legacy) == 0) 917 { 918 strcpy (name, legacy_table[i1].unixy); 919 return; 920 } 921 } 922 923 /* Step 2: Convert using langtag_table and script_table. */ 924 if (strlen (name) == 7 && name[2] == '-') 925 { 926 unsigned int i1, i2; 927 i1 = 0; 928 i2 = sizeof (langtag_table) / sizeof (langtag_entry); 929 while (i2 - i1 > 1) 930 { 931 /* At this point we know that if name occurs in langtag_table, 932 its index must be >= i1 and < i2. */ 933 unsigned int i = (i1 + i2) >> 1; 934 const langtag_entry *p = &langtag_table[i]; 935 if (strcmp (name, p->langtag) < 0) 936 i2 = i; 937 else 938 i1 = i; 939 } 940 if (strcmp (name, langtag_table[i1].langtag) == 0) 941 { 942 strcpy (name, langtag_table[i1].unixy); 943 return; 944 } 945 946 i1 = 0; 947 i2 = sizeof (script_table) / sizeof (script_entry); 948 while (i2 - i1 > 1) 949 { 950 /* At this point we know that if (name + 3) occurs in script_table, 951 its index must be >= i1 and < i2. */ 952 unsigned int i = (i1 + i2) >> 1; 953 const script_entry *p = &script_table[i]; 954 if (strcmp (name + 3, p->script) < 0) 955 i2 = i; 956 else 957 i1 = i; 958 } 959 if (strcmp (name + 3, script_table[i1].script) == 0) 960 { 961 name[2] = '@'; 962 strcpy (name + 3, script_table[i1].unixy); 963 return; 964 } 965 } 966 967 /* Step 3: Convert new-style dash to Unix underscore. */ 968 { 969 char *p; 970 for (p = name; *p != '\0'; p++) 971 if (*p == '-') 972 *p = '_'; 973 } 974} 975 976#endif 977 978/* XPG3 defines the result of 'setlocale (category, NULL)' as: 979 "Directs 'setlocale()' to query 'category' and return the current 980 setting of 'local'." 981 However it does not specify the exact format. Neither do SUSV2 and 982 ISO C 99. So we can use this feature only on selected systems (e.g. 983 those using GNU C Library). */ 984#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2) 985# define HAVE_LOCALE_NULL 986#endif 987 988/* Determine the current locale's name, and canonicalize it into XPG syntax 989 language[_territory][.codeset][@modifier] 990 The codeset part in the result is not reliable; the locale_charset() 991 should be used for codeset information instead. 992 The result must not be freed; it is statically allocated. */ 993 994const char * 995gl_locale_name_posix (int category, const char *categoryname) 996{ 997 /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. 998 On some systems this can be done by the 'setlocale' function itself. */ 999#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL 1000 return setlocale (category, NULL); 1001#else 1002 const char *retval; 1003 1004 /* Setting of LC_ALL overrides all other. */ 1005 retval = getenv ("LC_ALL"); 1006 if (retval != NULL && retval[0] != '\0') 1007 return retval; 1008 /* Next comes the name of the desired category. */ 1009 retval = getenv (categoryname); 1010 if (retval != NULL && retval[0] != '\0') 1011 return retval; 1012 /* Last possibility is the LANG environment variable. */ 1013 retval = getenv ("LANG"); 1014 if (retval != NULL && retval[0] != '\0') 1015 return retval; 1016 1017 return NULL; 1018#endif 1019} 1020 1021const char * 1022gl_locale_name_default (void) 1023{ 1024 /* POSIX:2001 says: 1025 "All implementations shall define a locale as the default locale, to be 1026 invoked when no environment variables are set, or set to the empty 1027 string. This default locale can be the POSIX locale or any other 1028 implementation-defined locale. Some implementations may provide 1029 facilities for local installation administrators to set the default 1030 locale, customizing it for each location. POSIX:2001 does not require 1031 such a facility. */ 1032 1033#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32_NATIVE)) 1034 1035 /* The system does not have a way of setting the locale, other than the 1036 POSIX specified environment variables. We use C as default locale. */ 1037 return "C"; 1038 1039#else 1040 1041 /* Return an XPG style locale name language[_territory][@modifier]. 1042 Don't even bother determining the codeset; it's not useful in this 1043 context, because message catalogs are not specific to a single 1044 codeset. */ 1045 1046# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE 1047 /* MacOS X 10.2 or newer */ 1048 { 1049 /* Cache the locale name, since CoreFoundation calls are expensive. */ 1050 static const char *cached_localename; 1051 1052 if (cached_localename == NULL) 1053 { 1054 char namebuf[256]; 1055# if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */ 1056 CFLocaleRef locale = CFLocaleCopyCurrent (); 1057 CFStringRef name = CFLocaleGetIdentifier (locale); 1058 1059 if (CFStringGetCString (name, namebuf, sizeof(namebuf), 1060 kCFStringEncodingASCII)) 1061 { 1062 gl_locale_name_canonicalize (namebuf); 1063 cached_localename = strdup (namebuf); 1064 } 1065 CFRelease (locale); 1066# elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */ 1067 CFTypeRef value = 1068 CFPreferencesCopyAppValue (CFSTR ("AppleLocale"), 1069 kCFPreferencesCurrentApplication); 1070 if (value != NULL 1071 && CFGetTypeID (value) == CFStringGetTypeID () 1072 && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf), 1073 kCFStringEncodingASCII)) 1074 { 1075 gl_locale_name_canonicalize (namebuf); 1076 cached_localename = strdup (namebuf); 1077 } 1078# endif 1079 if (cached_localename == NULL) 1080 cached_localename = "C"; 1081 } 1082 return cached_localename; 1083 } 1084 1085# endif 1086 1087# if defined(WIN32_NATIVE) /* WIN32, not Cygwin */ 1088 { 1089 LCID lcid; 1090 LANGID langid; 1091 int primary, sub; 1092 1093 /* Use native Win32 API locale ID. */ 1094 lcid = GetThreadLocale (); 1095 1096 /* Strip off the sorting rules, keep only the language part. */ 1097 langid = LANGIDFROMLCID (lcid); 1098 1099 /* Split into language and territory part. */ 1100 primary = PRIMARYLANGID (langid); 1101 sub = SUBLANGID (langid); 1102 1103 /* Dispatch on language. 1104 See also http://www.unicode.org/unicode/onlinedat/languages.html . 1105 For details about languages, see http://www.ethnologue.com/ . */ 1106 switch (primary) 1107 { 1108 case LANG_AFRIKAANS: return "af_ZA"; 1109 case LANG_ALBANIAN: return "sq_AL"; 1110 case LANG_AMHARIC: return "am_ET"; 1111 case LANG_ARABIC: 1112 switch (sub) 1113 { 1114 case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; 1115 case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; 1116 case SUBLANG_ARABIC_EGYPT: return "ar_EG"; 1117 case SUBLANG_ARABIC_LIBYA: return "ar_LY"; 1118 case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; 1119 case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; 1120 case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; 1121 case SUBLANG_ARABIC_OMAN: return "ar_OM"; 1122 case SUBLANG_ARABIC_YEMEN: return "ar_YE"; 1123 case SUBLANG_ARABIC_SYRIA: return "ar_SY"; 1124 case SUBLANG_ARABIC_JORDAN: return "ar_JO"; 1125 case SUBLANG_ARABIC_LEBANON: return "ar_LB"; 1126 case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; 1127 case SUBLANG_ARABIC_UAE: return "ar_AE"; 1128 case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; 1129 case SUBLANG_ARABIC_QATAR: return "ar_QA"; 1130 } 1131 return "ar"; 1132 case LANG_ARMENIAN: return "hy_AM"; 1133 case LANG_ASSAMESE: return "as_IN"; 1134 case LANG_AZERI: 1135 switch (sub) 1136 { 1137 /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ 1138 case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; 1139 case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; 1140 } 1141 return "az"; 1142 case LANG_BASQUE: 1143 switch (sub) 1144 { 1145 case SUBLANG_DEFAULT: return "eu_ES"; 1146 } 1147 return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ 1148 case LANG_BELARUSIAN: return "be_BY"; 1149 case LANG_BENGALI: 1150 switch (sub) 1151 { 1152 case SUBLANG_BENGALI_INDIA: return "bn_IN"; 1153 case SUBLANG_BENGALI_BANGLADESH: return "bn_BD"; 1154 } 1155 return "bn"; 1156 case LANG_BULGARIAN: return "bg_BG"; 1157 case LANG_BURMESE: return "my_MM"; 1158 case LANG_CAMBODIAN: return "km_KH"; 1159 case LANG_CATALAN: return "ca_ES"; 1160 case LANG_CHEROKEE: return "chr_US"; 1161 case LANG_CHINESE: 1162 switch (sub) 1163 { 1164 case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; 1165 case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; 1166 case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; 1167 case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; 1168 case SUBLANG_CHINESE_MACAU: return "zh_MO"; 1169 } 1170 return "zh"; 1171 case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN 1172 * What used to be called Serbo-Croatian 1173 * should really now be two separate 1174 * languages because of political reasons. 1175 * (Says tml, who knows nothing about Serbian 1176 * or Croatian.) 1177 * (I can feel those flames coming already.) 1178 */ 1179 switch (sub) 1180 { 1181 case SUBLANG_DEFAULT: return "hr_HR"; 1182 case SUBLANG_SERBIAN_LATIN: return "sr_CS"; 1183 case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic"; 1184 } 1185 return "hr"; 1186 case LANG_CZECH: return "cs_CZ"; 1187 case LANG_DANISH: return "da_DK"; 1188 case LANG_DIVEHI: return "dv_MV"; 1189 case LANG_DUTCH: 1190 switch (sub) 1191 { 1192 case SUBLANG_DUTCH: return "nl_NL"; 1193 case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; 1194 } 1195 return "nl"; 1196 case LANG_EDO: return "bin_NG"; 1197 case LANG_ENGLISH: 1198 switch (sub) 1199 { 1200 /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought 1201 * English was the language spoken in England. 1202 * Oh well. 1203 */ 1204 case SUBLANG_ENGLISH_US: return "en_US"; 1205 case SUBLANG_ENGLISH_UK: return "en_GB"; 1206 case SUBLANG_ENGLISH_AUS: return "en_AU"; 1207 case SUBLANG_ENGLISH_CAN: return "en_CA"; 1208 case SUBLANG_ENGLISH_NZ: return "en_NZ"; 1209 case SUBLANG_ENGLISH_EIRE: return "en_IE"; 1210 case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; 1211 case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; 1212 case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ 1213 case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; 1214 case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; 1215 case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; 1216 case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; 1217 case SUBLANG_ENGLISH_INDONESIA: return "en_ID"; 1218 case SUBLANG_ENGLISH_HONGKONG: return "en_HK"; 1219 case SUBLANG_ENGLISH_INDIA: return "en_IN"; 1220 case SUBLANG_ENGLISH_MALAYSIA: return "en_MY"; 1221 case SUBLANG_ENGLISH_SINGAPORE: return "en_SG"; 1222 } 1223 return "en"; 1224 case LANG_ESTONIAN: return "et_EE"; 1225 case LANG_FAEROESE: return "fo_FO"; 1226 case LANG_FARSI: return "fa_IR"; 1227 case LANG_FINNISH: return "fi_FI"; 1228 case LANG_FRENCH: 1229 switch (sub) 1230 { 1231 case SUBLANG_FRENCH: return "fr_FR"; 1232 case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; 1233 case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; 1234 case SUBLANG_FRENCH_SWISS: return "fr_CH"; 1235 case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; 1236 case SUBLANG_FRENCH_MONACO: return "fr_MC"; 1237 case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */ 1238 case SUBLANG_FRENCH_REUNION: return "fr_RE"; 1239 case SUBLANG_FRENCH_CONGO: return "fr_CG"; 1240 case SUBLANG_FRENCH_SENEGAL: return "fr_SN"; 1241 case SUBLANG_FRENCH_CAMEROON: return "fr_CM"; 1242 case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI"; 1243 case SUBLANG_FRENCH_MALI: return "fr_ML"; 1244 case SUBLANG_FRENCH_MOROCCO: return "fr_MA"; 1245 case SUBLANG_FRENCH_HAITI: return "fr_HT"; 1246 } 1247 return "fr"; 1248 case LANG_FRISIAN: return "fy_NL"; 1249 case LANG_FULFULDE: 1250 /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */ 1251 return "ff_NG"; 1252 case LANG_GAELIC: 1253 switch (sub) 1254 { 1255 case 0x01: /* SCOTTISH */ return "gd_GB"; 1256 case 0x02: /* IRISH */ return "ga_IE"; 1257 } 1258 return "C"; 1259 case LANG_GALICIAN: return "gl_ES"; 1260 case LANG_GEORGIAN: return "ka_GE"; 1261 case LANG_GERMAN: 1262 switch (sub) 1263 { 1264 case SUBLANG_GERMAN: return "de_DE"; 1265 case SUBLANG_GERMAN_SWISS: return "de_CH"; 1266 case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; 1267 case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; 1268 case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; 1269 } 1270 return "de"; 1271 case LANG_GREEK: return "el_GR"; 1272 case LANG_GUARANI: return "gn_PY"; 1273 case LANG_GUJARATI: return "gu_IN"; 1274 case LANG_HAUSA: return "ha_NG"; 1275 case LANG_HAWAIIAN: 1276 /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) 1277 or Hawaii Creole English ("cpe_US", 600000 speakers)? */ 1278 return "cpe_US"; 1279 case LANG_HEBREW: return "he_IL"; 1280 case LANG_HINDI: return "hi_IN"; 1281 case LANG_HUNGARIAN: return "hu_HU"; 1282 case LANG_IBIBIO: return "nic_NG"; 1283 case LANG_ICELANDIC: return "is_IS"; 1284 case LANG_IGBO: return "ig_NG"; 1285 case LANG_INDONESIAN: return "id_ID"; 1286 case LANG_INUKTITUT: return "iu_CA"; 1287 case LANG_ITALIAN: 1288 switch (sub) 1289 { 1290 case SUBLANG_ITALIAN: return "it_IT"; 1291 case SUBLANG_ITALIAN_SWISS: return "it_CH"; 1292 } 1293 return "it"; 1294 case LANG_JAPANESE: return "ja_JP"; 1295 case LANG_KANNADA: return "kn_IN"; 1296 case LANG_KANURI: return "kr_NG"; 1297 case LANG_KASHMIRI: 1298 switch (sub) 1299 { 1300 case SUBLANG_DEFAULT: return "ks_PK"; 1301 case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; 1302 } 1303 return "ks"; 1304 case LANG_KAZAK: return "kk_KZ"; 1305 case LANG_KONKANI: 1306 /* FIXME: Adjust this when such locales appear on Unix. */ 1307 return "kok_IN"; 1308 case LANG_KOREAN: return "ko_KR"; 1309 case LANG_KYRGYZ: return "ky_KG"; 1310 case LANG_LAO: return "lo_LA"; 1311 case LANG_LATIN: return "la_VA"; 1312 case LANG_LATVIAN: return "lv_LV"; 1313 case LANG_LITHUANIAN: return "lt_LT"; 1314 case LANG_MACEDONIAN: return "mk_MK"; 1315 case LANG_MALAY: 1316 switch (sub) 1317 { 1318 case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; 1319 case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; 1320 } 1321 return "ms"; 1322 case LANG_MALAYALAM: return "ml_IN"; 1323 case LANG_MALTESE: return "mt_MT"; 1324 case LANG_MANIPURI: 1325 /* FIXME: Adjust this when such locales appear on Unix. */ 1326 return "mni_IN"; 1327 case LANG_MARATHI: return "mr_IN"; 1328 case LANG_MONGOLIAN: 1329 switch (sub) 1330 { 1331 case SUBLANG_DEFAULT: return "mn_MN"; 1332 } 1333 return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ 1334 case LANG_NEPALI: 1335 switch (sub) 1336 { 1337 case SUBLANG_DEFAULT: return "ne_NP"; 1338 case SUBLANG_NEPALI_INDIA: return "ne_IN"; 1339 } 1340 return "ne"; 1341 case LANG_NORWEGIAN: 1342 switch (sub) 1343 { 1344 case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO"; 1345 case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; 1346 } 1347 return "no"; 1348 case LANG_ORIYA: return "or_IN"; 1349 case LANG_OROMO: return "om_ET"; 1350 case LANG_PAPIAMENTU: return "pap_AN"; 1351 case LANG_PASHTO: 1352 return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ 1353 case LANG_POLISH: return "pl_PL"; 1354 case LANG_PORTUGUESE: 1355 switch (sub) 1356 { 1357 case SUBLANG_PORTUGUESE: return "pt_PT"; 1358 /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. 1359 Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ 1360 case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; 1361 } 1362 return "pt"; 1363 case LANG_PUNJABI: 1364 switch (sub) 1365 { 1366 case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */ 1367 case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */ 1368 } 1369 return "pa"; 1370 case LANG_RHAETO_ROMANCE: return "rm_CH"; 1371 case LANG_ROMANIAN: 1372 switch (sub) 1373 { 1374 case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO"; 1375 case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD"; 1376 } 1377 return "ro"; 1378 case LANG_RUSSIAN: 1379 switch (sub) 1380 { 1381 case SUBLANG_DEFAULT: return "ru_RU"; 1382 } 1383 return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */ 1384 case LANG_SAAMI: /* actually Northern Sami */ return "se_NO"; 1385 case LANG_SANSKRIT: return "sa_IN"; 1386 case LANG_SINDHI: 1387 switch (sub) 1388 { 1389 case SUBLANG_SINDHI_PAKISTAN: return "sd_PK"; 1390 case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF"; 1391 } 1392 return "sd"; 1393 case LANG_SINHALESE: return "si_LK"; 1394 case LANG_SLOVAK: return "sk_SK"; 1395 case LANG_SLOVENIAN: return "sl_SI"; 1396 case LANG_SOMALI: return "so_SO"; 1397 case LANG_SORBIAN: 1398 /* FIXME: Adjust this when such locales appear on Unix. */ 1399 return "wen_DE"; 1400 case LANG_SPANISH: 1401 switch (sub) 1402 { 1403 case SUBLANG_SPANISH: return "es_ES"; 1404 case SUBLANG_SPANISH_MEXICAN: return "es_MX"; 1405 case SUBLANG_SPANISH_MODERN: 1406 return "es_ES@modern"; /* not seen on Unix */ 1407 case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; 1408 case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; 1409 case SUBLANG_SPANISH_PANAMA: return "es_PA"; 1410 case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; 1411 case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; 1412 case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; 1413 case SUBLANG_SPANISH_PERU: return "es_PE"; 1414 case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; 1415 case SUBLANG_SPANISH_ECUADOR: return "es_EC"; 1416 case SUBLANG_SPANISH_CHILE: return "es_CL"; 1417 case SUBLANG_SPANISH_URUGUAY: return "es_UY"; 1418 case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; 1419 case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; 1420 case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; 1421 case SUBLANG_SPANISH_HONDURAS: return "es_HN"; 1422 case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; 1423 case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; 1424 } 1425 return "es"; 1426 case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */ 1427 case LANG_SWAHILI: return "sw_KE"; 1428 case LANG_SWEDISH: 1429 switch (sub) 1430 { 1431 case SUBLANG_DEFAULT: return "sv_SE"; 1432 case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; 1433 } 1434 return "sv"; 1435 case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ 1436 case LANG_TAGALOG: return "tl_PH"; 1437 case LANG_TAJIK: return "tg_TJ"; 1438 case LANG_TAMAZIGHT: 1439 switch (sub) 1440 { 1441 /* FIXME: Adjust this when Tamazight locales appear on Unix. */ 1442 case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic"; 1443 case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin"; 1444 } 1445 return "ber_MA"; 1446 case LANG_TAMIL: 1447 switch (sub) 1448 { 1449 case SUBLANG_DEFAULT: return "ta_IN"; 1450 } 1451 return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ 1452 case LANG_TATAR: return "tt_RU"; 1453 case LANG_TELUGU: return "te_IN"; 1454 case LANG_THAI: return "th_TH"; 1455 case LANG_TIBETAN: return "bo_CN"; 1456 case LANG_TIGRINYA: 1457 switch (sub) 1458 { 1459 case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET"; 1460 case SUBLANG_TIGRINYA_ERITREA: return "ti_ER"; 1461 } 1462 return "ti"; 1463 case LANG_TSONGA: return "ts_ZA"; 1464 case LANG_TSWANA: return "tn_BW"; 1465 case LANG_TURKISH: return "tr_TR"; 1466 case LANG_TURKMEN: return "tk_TM"; 1467 case LANG_UKRAINIAN: return "uk_UA"; 1468 case LANG_URDU: 1469 switch (sub) 1470 { 1471 case SUBLANG_URDU_PAKISTAN: return "ur_PK"; 1472 case SUBLANG_URDU_INDIA: return "ur_IN"; 1473 } 1474 return "ur"; 1475 case LANG_UZBEK: 1476 switch (sub) 1477 { 1478 case SUBLANG_UZBEK_LATIN: return "uz_UZ"; 1479 case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; 1480 } 1481 return "uz"; 1482 case LANG_VENDA: return "ve_ZA"; 1483 case LANG_VIETNAMESE: return "vi_VN"; 1484 case LANG_WELSH: return "cy_GB"; 1485 case LANG_XHOSA: return "xh_ZA"; 1486 case LANG_YI: return "sit_CN"; 1487 case LANG_YIDDISH: return "yi_IL"; 1488 case LANG_YORUBA: return "yo_NG"; 1489 case LANG_ZULU: return "zu_ZA"; 1490 default: return "C"; 1491 } 1492 } 1493# endif 1494#endif 1495} 1496 1497const char * 1498gl_locale_name (int category, const char *categoryname) 1499{ 1500 const char *retval; 1501 1502 retval = gl_locale_name_posix (category, categoryname); 1503 if (retval != NULL) 1504 return retval; 1505 1506 return gl_locale_name_default (); 1507} 1508