Home | History | Annotate | Download | only in intl
      1 /* Message catalogs for internationalization.
      2    Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
      3 
      4    This program is free software; you can redistribute it and/or modify
      5    it under the terms of the GNU General Public License as published by
      6    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
     12    GNU General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program; if not, write to the Free Software Foundation,
     16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     17 
     18 /* Because on some systems (e.g. Solaris) we sometimes have to include
     19    the systems libintl.h as well as this file we have more complex
     20    include protection above.  But the systems header might perhaps also
     21    define _LIBINTL_H and therefore we have to protect the definition here.  */
     22 
     23 #if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
     24 #ifndef _LIBINTL_H
     25 # define _LIBINTL_H	1
     26 #endif
     27 #define _LIBGETTEXT_H	1
     28 
     29 /* We define an additional symbol to signal that we use the GNU
     30    implementation of gettext.  */
     31 #define __USE_GNU_GETTEXT 1
     32 
     33 #include <sys/types.h>
     34 
     35 #if HAVE_LOCALE_H
     36 # include <locale.h>
     37 #endif
     38 
     39 
     40 #ifdef __cplusplus
     41 extern "C" {
     42 #endif
     43 
     44 /* @@ end of prolog @@ */
     45 
     46 #ifndef PARAMS
     47 # if __STDC__ || defined __cplusplus
     48 #  define PARAMS(args) args
     49 # else
     50 #  define PARAMS(args) ()
     51 # endif
     52 #endif
     53 
     54 #ifndef NULL
     55 # if !defined __cplusplus || defined __GNUC__
     56 #  define NULL ((void *) 0)
     57 # else
     58 #  define NULL (0)
     59 # endif
     60 #endif
     61 
     62 #if !HAVE_LC_MESSAGES
     63 /* This value determines the behaviour of the gettext() and dgettext()
     64    function.  But some system does not have this defined.  Define it
     65    to a default value.  */
     66 # define LC_MESSAGES (-1)
     67 #endif
     68 
     69 
     70 /* Declarations for gettext-using-catgets interface.  Derived from
     71    Jim Meyering's libintl.h.  */
     72 struct _msg_ent
     73 {
     74   const char *_msg;
     75   int _msg_number;
     76 };
     77 
     78 
     79 #if HAVE_CATGETS
     80 /* These two variables are defined in the automatically by po-to-tbl.sed
     81    generated file `cat-id-tbl.c'.  */
     82 extern const struct _msg_ent _msg_tbl[];
     83 extern int _msg_tbl_length;
     84 #endif
     85 
     86 
     87 /* For automatical extraction of messages sometimes no real
     88    translation is needed.  Instead the string itself is the result.  */
     89 #define gettext_noop(Str) (Str)
     90 
     91 /* Look up MSGID in the current default message catalog for the current
     92    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
     93    text).  */
     94 extern char *gettext PARAMS ((const char *__msgid));
     95 extern char *gettext__ PARAMS ((const char *__msgid));
     96 
     97 /* Look up MSGID in the DOMAINNAME message catalog for the current
     98    LC_MESSAGES locale.  */
     99 extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
    100 extern char *dgettext__ PARAMS ((const char *__domainname,
    101 				 const char *__msgid));
    102 
    103 /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
    104    locale.  */
    105 extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
    106 				int __category));
    107 extern char *dcgettext__ PARAMS ((const char *__domainname,
    108 				  const char *__msgid, int __category));
    109 
    110 
    111 /* Set the current default message catalog to DOMAINNAME.
    112    If DOMAINNAME is null, return the current default.
    113    If DOMAINNAME is "", reset to the default of "messages".  */
    114 extern char *textdomain PARAMS ((const char *__domainname));
    115 extern char *textdomain__ PARAMS ((const char *__domainname));
    116 
    117 /* Specify that the DOMAINNAME message catalog will be found
    118    in DIRNAME rather than in the system locale data base.  */
    119 extern char *bindtextdomain PARAMS ((const char *__domainname,
    120 				  const char *__dirname));
    121 extern char *bindtextdomain__ PARAMS ((const char *__domainname,
    122 				    const char *__dirname));
    123 
    124 #if ENABLE_NLS
    125 
    126 /* Solaris 2.3 has the gettext function but dcgettext is missing.
    127    So we omit this optimization for Solaris 2.3.  BTW, Solaris 2.4
    128    has dcgettext.  */
    129 # if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
    130 
    131 #  define gettext(Msgid)						      \
    132      dgettext (NULL, Msgid)
    133 
    134 #  define dgettext(Domainname, Msgid)					      \
    135      dcgettext (Domainname, Msgid, LC_MESSAGES)
    136 
    137 #  if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
    138 /* This global variable is defined in loadmsgcat.c.  We need a sign,
    139    whether a new catalog was loaded, which can be associated with all
    140    translations.  */
    141 extern int _nl_msg_cat_cntr;
    142 
    143 #   define dcgettext(Domainname, Msgid, Category)			      \
    144   (__extension__							      \
    145    ({									      \
    146      char *__result;							      \
    147      if (__builtin_constant_p (Msgid))					      \
    148        {								      \
    149 	 static char *__translation__;					      \
    150 	 static int __catalog_counter__;				      \
    151 	 if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr)    \
    152 	   {								      \
    153 	     __translation__ =						      \
    154 	       dcgettext__ (Domainname, Msgid, Category);		      \
    155 	     __catalog_counter__ = _nl_msg_cat_cntr;			      \
    156 	   }								      \
    157 	 __result = __translation__;					      \
    158        }								      \
    159      else								      \
    160        __result = dcgettext__ (Domainname, Msgid, Category);		      \
    161      __result;								      \
    162     }))
    163 #  endif
    164 # endif
    165 
    166 #else
    167 
    168 # define gettext(Msgid) (Msgid)
    169 # define dgettext(Domainname, Msgid) (Msgid)
    170 # define dcgettext(Domainname, Msgid, Category) (Msgid)
    171 # define textdomain(Domainname) ((char *) Domainname)
    172 # define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
    173 
    174 #endif
    175 
    176 /* @@ begin of epilog @@ */
    177 
    178 #ifdef __cplusplus
    179 }
    180 #endif
    181 
    182 #endif
    183