Home | History | Annotate | Download | only in m4
      1 # locale-fr.m4 serial 17
      2 dnl Copyright (C) 2003, 2005-2012 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 ])
    251