• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/timemachine/gettext-0.17/gettext-tools/gnulib-lib/
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