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