3f4f954e50219aa560e8ce871a75f01e6c86ef7c
[debian/tar] / m4 / locale-fr.m4
1 # locale-fr.m4 serial 13
2 dnl Copyright (C) 2003, 2005-2011 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl From Bruno Haible.
8
9 dnl Determine the name of a french locale with traditional encoding.
10 AC_DEFUN([gt_LOCALE_FR],
11 [
12   AC_REQUIRE([AC_CANONICAL_HOST])
13   AC_REQUIRE([AM_LANGINFO_CODESET])
14   AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [
15     AC_LANG_CONFTEST([AC_LANG_SOURCE([
16 changequote(,)dnl
17 #include <locale.h>
18 #include <time.h>
19 #if HAVE_LANGINFO_CODESET
20 # include <langinfo.h>
21 #endif
22 #include <stdlib.h>
23 #include <string.h>
24 struct tm t;
25 char buf[16];
26 int main () {
27   /* Check whether the given locale name is recognized by the system.  */
28 #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
29   /* On native Win32, setlocale(category, "") looks at the system settings,
30      not at the environment variables.  Also, when an encoding suffix such
31      as ".65001" or ".54936" is speficied, it succeeds but sets the LC_CTYPE
32      category of the locale to "C".  */
33   if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
34       || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
35     return 1;
36 #else
37   if (setlocale (LC_ALL, "") == NULL) return 1;
38 #endif
39   /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
40      On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
41      is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
42      On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
43      succeeds but then nl_langinfo(CODESET) is "646". In this situation,
44      some unit tests fail.
45      On MirBSD 10, when an unsupported locale is specified, setlocale()
46      succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
47 #if HAVE_LANGINFO_CODESET
48   {
49     const char *cs = nl_langinfo (CODESET);
50     if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
51         || strcmp (cs, "UTF-8") == 0)
52       return 1;
53   }
54 #endif
55 #ifdef __CYGWIN__
56   /* On Cygwin, avoid locale names without encoding suffix, because the
57      locale_charset() function relies on the encoding suffix.  Note that
58      LC_ALL is set on the command line.  */
59   if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
60 #endif
61   /* Check whether in the abbreviation of the second month, the second
62      character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
63      one byte long. This excludes the UTF-8 encoding.  */
64   t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
65   if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
66   /* Check whether the decimal separator is a comma.
67      On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
68      are nl_langinfo(RADIXCHAR) are both ".".  */
69   if (localeconv () ->decimal_point[0] != ',') return 1;
70   return 0;
71 }
72 changequote([,])dnl
73       ])])
74     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
75       case "$host_os" in
76         # Handle native Windows specially, because there setlocale() interprets
77         # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
78         # "fr" or "fra" as "French" or "French_France.1252",
79         # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
80         # "ja" as "Japanese" or "Japanese_Japan.932",
81         # and similar.
82         mingw*)
83           # Test for the native Win32 locale name.
84           if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
85             gt_cv_locale_fr=French_France.1252
86           else
87             # None found.
88             gt_cv_locale_fr=none
89           fi
90           ;;
91         *)
92           # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
93           # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
94           # configure script would override the LC_ALL setting. Likewise for
95           # LC_CTYPE, which is also set at the beginning of the configure script.
96           # Test for the usual locale name.
97           if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
98             gt_cv_locale_fr=fr_FR
99           else
100             # Test for the locale name with explicit encoding suffix.
101             if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
102               gt_cv_locale_fr=fr_FR.ISO-8859-1
103             else
104               # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
105               if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
106                 gt_cv_locale_fr=fr_FR.ISO8859-1
107               else
108                 # Test for the HP-UX locale name.
109                 if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
110                   gt_cv_locale_fr=fr_FR.iso88591
111                 else
112                   # Test for the Solaris 7 locale name.
113                   if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
114                     gt_cv_locale_fr=fr
115                   else
116                     # None found.
117                     gt_cv_locale_fr=none
118                   fi
119                 fi
120               fi
121             fi
122           fi
123           ;;
124       esac
125     fi
126     rm -fr conftest*
127   ])
128   LOCALE_FR=$gt_cv_locale_fr
129   AC_SUBST([LOCALE_FR])
130 ])
131
132 dnl Determine the name of a french locale with UTF-8 encoding.
133 AC_DEFUN([gt_LOCALE_FR_UTF8],
134 [
135   AC_REQUIRE([AM_LANGINFO_CODESET])
136   AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [
137     AC_LANG_CONFTEST([AC_LANG_SOURCE([
138 changequote(,)dnl
139 #include <locale.h>
140 #include <time.h>
141 #if HAVE_LANGINFO_CODESET
142 # include <langinfo.h>
143 #endif
144 #include <stdlib.h>
145 #include <string.h>
146 struct tm t;
147 char buf[16];
148 int main () {
149   /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
150      imitates locale dependent behaviour by looking at the environment
151      variables, and all locales use the UTF-8 encoding.  */
152 #if !(defined __BEOS__ || defined __HAIKU__)
153   /* Check whether the given locale name is recognized by the system.  */
154 # if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
155   /* On native Win32, setlocale(category, "") looks at the system settings,
156      not at the environment variables.  Also, when an encoding suffix such
157      as ".65001" or ".54936" is speficied, it succeeds but sets the LC_CTYPE
158      category of the locale to "C".  */
159   if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
160       || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
161     return 1;
162 # else
163   if (setlocale (LC_ALL, "") == NULL) return 1;
164 # endif
165   /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
166      On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
167      is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
168      On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
169      succeeds but then nl_langinfo(CODESET) is "646". In this situation,
170      some unit tests fail.  */
171 # if HAVE_LANGINFO_CODESET
172   {
173     const char *cs = nl_langinfo (CODESET);
174     if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
175       return 1;
176   }
177 # endif
178 # ifdef __CYGWIN__
179   /* On Cygwin, avoid locale names without encoding suffix, because the
180      locale_charset() function relies on the encoding suffix.  Note that
181      LC_ALL is set on the command line.  */
182   if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
183 # endif
184   /* Check whether in the abbreviation of the second month, the second
185      character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
186      two bytes long, with UTF-8 encoding.  */
187   t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
188   if (strftime (buf, sizeof (buf), "%b", &t) < 4
189       || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
190     return 1;
191 #endif
192   /* Check whether the decimal separator is a comma.
193      On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
194      are nl_langinfo(RADIXCHAR) are both ".".  */
195   if (localeconv () ->decimal_point[0] != ',') return 1;
196   return 0;
197 }
198 changequote([,])dnl
199       ])])
200     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
201       case "$host_os" in
202         # Handle native Windows specially, because there setlocale() interprets
203         # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
204         # "fr" or "fra" as "French" or "French_France.1252",
205         # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
206         # "ja" as "Japanese" or "Japanese_Japan.932",
207         # and similar.
208         mingw*)
209           # Test for the hypothetical native Win32 locale name.
210           if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
211             gt_cv_locale_fr_utf8=French_France.65001
212           else
213             # None found.
214             gt_cv_locale_fr_utf8=none
215           fi
216           ;;
217         *)
218           # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
219           # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
220           # configure script would override the LC_ALL setting. Likewise for
221           # LC_CTYPE, which is also set at the beginning of the configure script.
222           # Test for the usual locale name.
223           if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
224             gt_cv_locale_fr_utf8=fr_FR
225           else
226             # Test for the locale name with explicit encoding suffix.
227             if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
228               gt_cv_locale_fr_utf8=fr_FR.UTF-8
229             else
230               # Test for the Solaris 7 locale name.
231               if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
232                 gt_cv_locale_fr_utf8=fr.UTF-8
233               else
234                 # None found.
235                 gt_cv_locale_fr_utf8=none
236               fi
237             fi
238           fi
239           ;;
240       esac
241     fi
242     rm -fr conftest*
243   ])
244   LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
245   AC_SUBST([LOCALE_FR_UTF8])
246 ])