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