unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: Jan Nieuwenhuizen <janneke@gnu.org>
Cc: Bruno Haible <bruno@clisp.org>
Subject: Re: i18n, gettext support
Date: Wed, 08 Sep 2004 10:58:36 +0200	[thread overview]
Message-ID: <87llflgmrn.fsf@peder.flower> (raw)
In-Reply-To: <87sm9tftng.fsf@zip.com.au> (Kevin Ryde's message of "Wed, 08 Sep 2004 11:15:15 +1000")

[-- Attachment #1: Type: text/plain, Size: 203 bytes --]

Kevin Ryde writes:

>> +scm_validate_category (SCM category, const char *subr, int pos)
>
> Could call that scm_to_lc_category
[..]
> scm_setlocale could use it too.

Done.  New version attached.

Jan.


[-- Attachment #2: guile-1.7.1-bh-jcn-3.diff --]
[-- Type: text/plain, Size: 21382 bytes --]

? ABOUT-NLS
? do-diff
? doconf
? libguile/gettext.h
? libguile/i18n.c
? libguile/i18n.h
Index: ChangeLog
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/ChangeLog,v
retrieving revision 1.445
diff -p -u -r1.445 ChangeLog
--- ChangeLog	3 Sep 2004 19:45:34 -0000	1.445
+++ ChangeLog	8 Sep 2004 08:55:37 -0000
@@ -1,3 +1,7 @@
+2004-09-02  Bruno Haible  <bruno@clisp.org>
+
+	* configure.in: Add AM_GNU_GETTEXT invocation.
+
 2004-09-03  Stefan Jahn  <stefan@lkcc.org>
 
 	* configure.in (isinf): Let configure find the isinf() function
Index: configure.in
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/configure.in,v
retrieving revision 1.252
diff -p -u -r1.252 configure.in
--- configure.in	3 Sep 2004 19:45:35 -0000	1.252
+++ configure.in	8 Sep 2004 08:55:37 -0000
@@ -637,6 +637,9 @@ AC_TRY_LINK([#include <gmp.h>],
             [mpz_import (0, 0, 0, 0, 0, 0, 0);] , ,
   [AC_MSG_ERROR([At least GNU MP 4.1 is required, see http://swox.com/gmp])])
 
+dnl i18n tests
+AM_GNU_GETTEXT([external], [need-ngettext])
+
 ### Some systems don't declare some functions.  On such systems, we
 ### need to at least provide our own K&R-style declarations.
 
Index: libguile/ChangeLog
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/ChangeLog,v
retrieving revision 1.2140
diff -p -u -r1.2140 ChangeLog
--- libguile/ChangeLog	7 Sep 2004 00:34:38 -0000	1.2140
+++ libguile/ChangeLog	8 Sep 2004 08:55:40 -0000
@@ -1,3 +1,33 @@
+2004-09-08  Jan Nieuwenhuizen  <janneke@gnu.org>
+
+	* posix.c (scm_init_posix): Add LC_PAPER, LC_NAME, LC_ADDRESS,
+	LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION.
+
+	* i18n.c (scm_to_lc_category): New name and export.  Support all
+	LC categories.
+
+	* posix.c (s_scm_setlocale): Use it.
+
+2004-09-07  Jan Nieuwenhuizen  <janneke@gnu.org>
+
+	* i18n.h, i18n.c (scm_textdomain, scm_bindtextdomain,
+	scm_bind_textdomain_codeset): Make wrappers similar to C function
+	they wrap.
+
+2004-09-04  Jan Nieuwenhuizen  <janneke@gnu.org>
+            Bruno Haible  <bruno@clisp.org>
+
+	* i18n.h: New file.
+	* i18n.c: New file.
+	* gettext.h: New file, taken from GNU gettext.
+	* init.c: Include libguile/i18n.h.
+	(scm_init_guile_1): Add call to scm_init_i18n().
+	* Makefile.am (libguile_la_SOURCES): Add i18n.c.
+	(DOT_X_FILES): Add i18n.x.
+	(DOT_DOC_FILES): Add i18n.doc.
+	(libguile_la_LDFLAGS): Add @LTLIBINTL@.
+	(modinclude_HEADERS): Add i18n.h.
+
 2004-09-07  Kevin Ryde  <user42@zip.com.au>
 
 	* numbers.c (scm_integer_expt): Reject exponent +/-inf.
Index: libguile/Makefile.am
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/Makefile.am,v
retrieving revision 1.191
diff -p -u -r1.191 Makefile.am
--- libguile/Makefile.am	24 Aug 2004 22:11:35 -0000	1.191
+++ libguile/Makefile.am	8 Sep 2004 08:55:41 -0000
@@ -97,7 +97,7 @@ libguile_la_SOURCES = alist.c arbiters.c
     gc.c gc-mark.c gc-segment.c gc-malloc.c gc-card.c gc-freelist.c	    \
 	gc_os_dep.c gdbint.c gh_data.c gh_eval.c gh_funcs.c gh_init.c	    \
     gh_io.c gh_list.c gh_predicates.c goops.c gsubr.c guardians.c hash.c    \
-    hashtab.c hooks.c init.c inline.c ioext.c keywords.c		    \
+    hashtab.c hooks.c i18n.c init.c inline.c ioext.c keywords.c		    \
     lang.c list.c							    \
     load.c macros.c mallocs.c modules.c numbers.c objects.c objprop.c	    \
     options.c pairs.c ports.c print.c procprop.c procs.c properties.c	    \
@@ -113,7 +113,7 @@ DOT_X_FILES = alist.x arbiters.x async.x
     error.x eval.x evalext.x extensions.x feature.x fluids.x fports.x	 \
     futures.x								 \
     gc.x  gc-mark.x gc-segment.x gc-malloc.x gc-card.x goops.x		 \
-    gsubr.x guardians.x hash.x hashtab.x hooks.x init.x ioext.x		 \
+    gsubr.x guardians.x hash.x hashtab.x hooks.x i18n.x init.x ioext.x   \
     keywords.x lang.x list.x load.x macros.x mallocs.x modules.x	 \
     numbers.x objects.x objprop.x options.x pairs.x ports.x print.x	 \
     procprop.x procs.x properties.x random.x rdelim.x read.x root.x rw.x \
@@ -132,8 +132,8 @@ DOT_DOC_FILES = alist.doc arbiters.doc a
     extensions.doc feature.doc fluids.doc fports.doc futures.doc	    \
     gc.doc goops.doc							    \
     gsubr.doc gc-mark.doc gc-segment.doc gc-malloc.doc gc-card.doc	    \
-    guardians.doc hash.doc hashtab.doc hooks.doc init.doc ioext.doc	    \
-    keywords.doc lang.doc list.doc load.doc macros.doc			    \
+    guardians.doc hash.doc hashtab.doc hooks.doc i18n.doc init.doc	    \
+    ioext.doc keywords.doc lang.doc list.doc load.doc macros.doc	    \
     mallocs.doc modules.doc numbers.doc objects.doc objprop.doc		    \
     options.doc pairs.doc ports.doc print.doc procprop.doc		    \
     procs.doc properties.doc random.doc rdelim.doc read.doc root.doc rw.doc \
@@ -172,7 +172,7 @@ noinst_HEADERS = convert.i.c	\
 
 libguile_la_DEPENDENCIES = @LIBLOBJS@
 libguile_la_LIBADD = @LIBLOBJS@ ../libguile-ltdl/libguile-ltdl.la $(THREAD_LIBS_LOCAL)
-libguile_la_LDFLAGS = -version-info @LIBGUILE_INTERFACE_CURRENT@:@LIBGUILE_INTERFACE_REVISION@:@LIBGUILE_INTERFACE_AGE@ -export-dynamic -no-undefined
+libguile_la_LDFLAGS = @LTLIBINTL@ -version-info @LIBGUILE_INTERFACE_CURRENT@:@LIBGUILE_INTERFACE_REVISION@:@LIBGUILE_INTERFACE_AGE@ -export-dynamic -no-undefined
 
 # These are headers visible as <guile/mumble.h>
 pkginclude_HEADERS = gh.h
@@ -187,7 +187,7 @@ modinclude_HEADERS = __scm.h alist.h arb
     error.h eval.h							      \
     evalext.h extensions.h feature.h filesys.h fluids.h fports.h futures.h    \
     gc.h gdb_interface.h gdbint.h					      \
-    goops.h gsubr.h guardians.h hash.h hashtab.h hooks.h init.h		      \
+    goops.h gsubr.h guardians.h hash.h hashtab.h hooks.h i18n.h init.h        \
     inline.h ioext.h							      \
     iselect.h keywords.h lang.h list.h load.h macros.h mallocs.h modules.h    \
     net_db.h numbers.h objects.h objprop.h options.h pairs.h ports.h posix.h  \
Index: libguile/init.c
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/init.c,v
retrieving revision 1.159
diff -p -u -r1.159 init.c
--- libguile/init.c	24 Aug 2004 22:13:07 -0000	1.159
+++ libguile/init.c	8 Sep 2004 08:55:41 -0000
@@ -63,6 +63,7 @@
 #include "libguile/hash.h"
 #include "libguile/hashtab.h"
 #include "libguile/hooks.h"
+#include "libguile/i18n.h"
 #include "libguile/iselect.h"
 #include "libguile/ioext.h"
 #include "libguile/keywords.h"
@@ -477,6 +478,7 @@ scm_init_guile_1 (SCM_STACKITEM *base)
   scm_init_properties ();
   scm_init_hooks ();            /* Requires smob_prehistory */
   scm_init_gc ();		/* Requires hooks, async */
+  scm_init_i18n ();
   scm_init_ioext ();
   scm_init_keywords ();
   scm_init_list ();
Index: libguile/posix.c
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/posix.c,v
retrieving revision 1.147
diff -p -u -r1.147 posix.c
--- libguile/posix.c	7 Sep 2004 00:26:48 -0000	1.147
+++ libguile/posix.c	8 Sep 2004 08:55:41 -0000
@@ -39,6 +39,7 @@
 
 #include "libguile/validate.h"
 #include "libguile/posix.h"
+#include "libguile/i18n.h"
 \f
 
 #ifdef HAVE_STRING_H
@@ -1365,7 +1366,7 @@ SCM_DEFINE (scm_setlocale, "setlocale", 
       scm_frame_free (clocale);
     }
 
-  rv = setlocale (scm_to_int (category), clocale);
+  rv = setlocale (scm_to_lc_category (category, FUNC_NAME, 1), clocale);
   if (rv == NULL)
     SCM_SYSERROR;
 
@@ -1929,6 +1930,24 @@ scm_init_posix ()
 #ifdef LC_ALL
   scm_c_define ("LC_ALL", scm_from_int (LC_ALL));
 #endif
+#ifdef LC_PAPER
+  scm_c_define ("LC_PAPER", scm_from_int (LC_PAPER));
+#endif
+#ifdef LC_NAME
+  scm_c_define ("LC_NAME", scm_from_int (LC_NAME));
+#endif
+#ifdef LC_ADDRESS
+  scm_c_define ("LC_ADDRESS", scm_from_int (LC_ADDRESS));
+#endif
+#ifdef LC_TELEPHONE
+  scm_c_define ("LC_TELEPHONE", scm_from_int (LC_TELEPHONE));
+#endif
+#ifdef LC_MEASUREMENT
+  scm_c_define ("LC_MEASUREMENT", scm_from_int (LC_MEASUREMENT));
+#endif
+#ifdef LC_IDENTIFICATION
+  scm_c_define ("LC_IDENTIFICATION", scm_from_int (LC_IDENTIFICATION));
+#endif
 #ifdef PIPE_BUF
   scm_c_define ("PIPE_BUF", scm_from_long (PIPE_BUF));
 #endif
--- ../ugh-cvs/libguile/libguile.h	1970-01-01 01:00:00 +0100
+++ libguile/i18n.h	2004-09-08 09:37:48 +0200
@@ -0,0 +1,39 @@
+/* classes: h_files */
+
+#ifndef SCM_I18N_H
+#define SCM_I18N_H
+
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "libguile/__scm.h"
+
+int scm_to_lc_category (SCM category, const char *subr, int pos);
+SCM_API SCM scm_gettext (SCM msgid, SCM domainname, SCM category);
+SCM_API SCM scm_ngettext (SCM msgid, SCM msgid_plural, SCM n, SCM domainname, SCM category);
+SCM_API SCM scm_textdomain (SCM domainname);
+SCM_API SCM scm_bindtextdomain (SCM domainname, SCM directory);
+SCM_API SCM scm_bind_textdomain_codeset (SCM domainname, SCM encoding);
+SCM_API void scm_init_i18n (void);
+
+#endif  /* SCM_I18N_H */
+
+/*
+  Local Variables:
+  c-file-style: "gnu"
+  End:
+*/
--- ../ugh-cvs/libguile/libguile.c	1970-01-01 01:00:00 +0100
+++ libguile/i18n.c	2004-09-08 10:50:54 +0200
@@ -0,0 +1,303 @@
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libguile/_scm.h"
+#include "libguile/feature.h"
+#include "libguile/i18n.h"
+#include "libguile/strings.h"
+#include "gettext.h"
+#include <locale.h>
+
+
+int
+scm_to_lc_category (SCM category, const char *subr, int pos)
+{
+  if (0
+#ifdef LC_COLLATE
+      || scm_is_eq (category, scm_from_int (LC_COLLATE))
+#endif
+#ifdef LC_CTYPE
+      || scm_is_eq (category, scm_from_int (LC_CTYPE))
+#endif
+#ifdef LC_MONETARY
+      || scm_is_eq (category, scm_from_int (LC_MONETARY))
+#endif
+#ifdef LC_NUMERIC
+      || scm_is_eq (category, scm_from_int (LC_NUMERIC))
+#endif
+#ifdef LC_TIME
+      || scm_is_eq (category, scm_from_int (LC_TIME))
+#endif
+#ifdef LC_MESSAGES
+      || scm_is_eq (category, scm_from_int (LC_MESSAGES))
+#endif
+#ifdef LC_ALL
+      || scm_is_eq (category, scm_from_int (LC_ALL))
+#endif
+#ifdef LC_PAPER
+      || scm_is_eq (category, scm_from_int (LC_PAPER))
+#endif
+#ifdef LC_NAME
+      || scm_is_eq (category, scm_from_int (LC_NAME))
+#endif
+#ifdef LC_ADDRESS
+      || scm_is_eq (category, scm_from_int (LC_ADDRESS))
+#endif
+#ifdef LC_TELEPHONE
+      || scm_is_eq (category, scm_from_int (LC_TELEPHONE))
+#endif
+#ifdef LC_MEASUREMENT
+      || scm_is_eq (category, scm_from_int (LC_MEASUREMENT))
+#endif
+#ifdef LC_IDENTIFICATION
+      || scm_is_eq (category, scm_from_int (LC_IDENTIFICATION))
+#endif
+      )
+    return scm_to_int (category);
+  scm_wrong_type_arg (subr, pos, category);
+}
+
+SCM_DEFINE (scm_gettext, "gettext", 1, 2, 0,
+	    (SCM msgid, SCM domain, SCM category),
+	    "Return the translation of @var{msgid} in the message domain "
+	    "@var{domain}. @var{domain} is optional and defaults to the "
+	    "domain set through (textdomain).  @var{category} is optional "
+	    "and defaults to LC_MESSAGES.")
+#define FUNC_NAME s_scm_gettext
+{
+  char *c_msgid;
+  const char *result;
+
+  SCM_VALIDATE_STRING (1, msgid);
+  c_msgid = scm_to_locale_string (msgid);
+  if (SCM_UNBNDP (domain))
+    {
+      /* 1 argument case.  */
+      result = gettext (c_msgid);
+    }
+  else
+    {
+      char *c_domain;
+
+      SCM_VALIDATE_STRING (2, domain);
+      c_domain = scm_to_locale_string (domain);
+      if (SCM_UNBNDP (category))
+	{
+	  /* 2 argument case.  */
+	  result = dgettext (c_domain, c_msgid);
+	}
+      else
+	{
+	  /* 3 argument case.  */
+	  int c_category;
+
+	  c_category = scm_to_lc_category (category, FUNC_NAME, 3);
+	  result = dcgettext (c_domain, c_msgid, c_category);
+	}
+      free (c_domain);
+    }
+
+  if (result == c_msgid)
+    {
+      free (c_msgid);
+      return msgid;
+    }
+  else
+    {
+      free (c_msgid);
+      return scm_from_locale_string (result);
+    }
+}
+#undef FUNC_NAME
+
+
+SCM_DEFINE (scm_ngettext, "ngettext", 3, 2, 0,
+	    (SCM msgid, SCM msgid_plural, SCM n, SCM domain, SCM category),
+	    "Return the translation of @var{msgid}/@var{msgid_plural} in the "
+	    "message domain @var{domain}, with the plural form being chosen "
+	    "appropriately for the number @var{n}.  @var{domain} is optional "
+	    "and defaults to the domain set through (textdomain). "
+	    "@var{category} is optional and defaults to LC_MESSAGES.")
+#define FUNC_NAME s_scm_ngettext
+{
+  char *c_msgid;
+  char *c_msgid_plural;
+  unsigned long c_n;
+  const char *result;
+
+  SCM_VALIDATE_STRING (1, msgid);
+  c_msgid = scm_to_locale_string (msgid);
+  SCM_VALIDATE_STRING (2, msgid_plural);
+  c_msgid_plural = scm_to_locale_string (msgid_plural);
+  SCM_VALIDATE_ULONG_COPY (3, n, c_n);
+  if (SCM_UNBNDP (domain))
+    {
+      /* 3 argument case.  */
+      result = ngettext (c_msgid, c_msgid_plural, c_n);
+    }
+  else
+    {
+      char *c_domain;
+
+      SCM_VALIDATE_STRING (4, domain);
+      c_domain = scm_to_locale_string (domain);
+      if (SCM_UNBNDP (category))
+	{
+	  /* 4 argument case.  */
+	  result = dngettext (c_domain, c_msgid, c_msgid_plural, c_n);
+	}
+      else
+	{
+	  /* 5 argument case.  */
+	  int c_category;
+
+	  c_category = scm_to_lc_category (category, FUNC_NAME, 5);
+	  result = dcngettext (c_domain, c_msgid, c_msgid_plural, c_n,
+			       c_category);
+	}
+      free (c_domain);
+    }
+
+  if (result == c_msgid)
+    {
+      free (c_msgid_plural);
+      free (c_msgid);
+      return msgid;
+    }
+  else if (result == c_msgid_plural)
+    {
+      free (c_msgid_plural);
+      free (c_msgid);
+      return msgid_plural;
+    }
+  else
+    {
+      free (c_msgid_plural);
+      free (c_msgid);
+      return scm_from_locale_string (result);
+    }
+}
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_textdomain, "textdomain", 0, 1, 0,
+	    (SCM domainname),
+	    "If optional parameter @var{domainname} is supplied, "
+	    "set the textdomain.  "
+	    "Return the textdomain.")
+#define FUNC_NAME s_scm_textdomain
+{
+  char *c_result;
+  char *c_domain;
+
+  if (SCM_UNBNDP (domainname))
+    c_domain = NULL;
+  else
+    {
+      SCM_VALIDATE_STRING (1, domainname);
+      c_domain = scm_to_locale_string (domainname);
+    }
+  c_result = textdomain (c_domain);
+  if (c_domain != NULL)
+    free (c_domain);
+  if (c_result == NULL)
+    SCM_SYSERROR;
+  return scm_from_locale_string (c_result);
+}
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_bindtextdomain, "bindtextdomain", 1, 1, 0,
+	    (SCM domainname, SCM directory),
+	    "If optional parameter @var{directory} is supplied, "
+	    "set message catalogs to directory @{directory}.  "
+	    "Return the directory bound to @var{domainname}.")
+#define FUNC_NAME s_scm_bindtextdomain
+{
+  char *c_domain;
+  char *c_directory;
+  char const *c_result;
+
+  SCM_VALIDATE_STRING (1, domainname);
+  if (SCM_UNBNDP (directory))
+    c_directory = NULL;
+  else
+    {
+      SCM_VALIDATE_STRING (2, directory);
+      c_directory = scm_to_locale_string (directory);
+    }
+  c_domain = scm_to_locale_string (domainname);
+  c_result = bindtextdomain (c_domain, c_directory);
+  free (c_domain);
+  if (c_directory != NULL)
+    free (c_directory);
+  if (c_result == NULL)
+    SCM_SYSERROR;
+  return scm_from_locale_string (c_result);
+}
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_bind_textdomain_codeset, "bind-textdomain-codeset", 1, 1, 0,
+	    (SCM domainname, SCM encoding),
+	    "If optional parameter @var{encoding} is supplied, "
+	    "set encoding for message catalogs of @{domainname}.  "
+	    "Return the encoding of @var{domainname}.")
+#define FUNC_NAME s_scm_bind_textdomain_codeset
+{
+  char *c_domain;
+  char *c_encoding;
+  char const *c_result;
+
+  SCM_VALIDATE_STRING (1, domainname);
+  if (SCM_UNBNDP (encoding))
+    c_encoding = NULL;
+  else
+    {
+      SCM_VALIDATE_STRING (2, encoding);
+      c_encoding = scm_to_locale_string (encoding);
+    }
+  c_domain = scm_to_locale_string (domainname);
+  c_result = bind_textdomain_codeset (c_domain, c_encoding);
+  free (c_domain);
+  if (c_encoding != NULL)
+    free (c_encoding);
+  if (c_result == NULL)
+    {
+      if (SCM_UNBNDP (encoding))
+	return SCM_BOOL_F;
+      SCM_SYSERROR;
+    }
+  return scm_from_locale_string (c_result);
+}
+#undef FUNC_NAME
+
+void 
+scm_init_i18n ()
+{
+  scm_add_feature ("i18n");
+#include "libguile/i18n.x"
+}
+
+
+/*
+  Local Variables:
+  c-file-style: "gnu"
+  End:
+*/
--- ../ugh-cvs/libguile/gettext.h	1970-01-01 01:00:00 +0100
+++ libguile/gettext.h	2004-09-07 09:27:39 +0200
@@ -0,0 +1,69 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+   Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option.  */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions.  */
+# include <libintl.h>
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+   chokes if dcgettext is defined as a macro.  So include it now, to make
+   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
+   as well because people using "gettext.h" will not include <libintl.h>,
+   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+   is OK.  */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Disabled NLS.
+   The casts to 'const char *' serve the purpose of producing warnings
+   for invalid uses of the value returned from these functions.
+   On pre-ANSI systems without 'const', the config.h file is supposed to
+   contain "#define const".  */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
+# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+   extraction of messages, but does not call gettext().  The run-time
+   translation is done at a different place in the code.
+   The argument, String, should be a literal string.  Concatenated strings
+   and other string expressions won't work.
+   The macro's expansion is not parenthesized, so that it is suitable as
+   initializer for static 'char[]' or 'const char[]' variables.  */
+#define gettext_noop(String) String
+
+#endif /* _LIBGETTEXT_H */

[-- Attachment #3: Type: text/plain, Size: 141 bytes --]


-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond - The music typesetter
http://www.xs4all.nl/~jantien       | http://www.lilypond.org

[-- Attachment #4: Type: text/plain, Size: 143 bytes --]

_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-devel

  reply	other threads:[~2004-09-08  8:58 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-20 20:26 i18n, gettext support Bruno Haible
2004-08-23  0:58 ` Kevin Ryde
2004-09-01 16:25 ` Jan Nieuwenhuizen
2004-09-01 20:57   ` Bruno Haible
2004-09-02  9:38     ` Jan Nieuwenhuizen
2004-09-02 16:06       ` Bruno Haible
2004-09-02 16:21         ` Bruno Haible
2004-09-03  1:34           ` Kevin Ryde
2004-09-04 17:25             ` Bruno Haible
2004-09-07  0:13               ` Kevin Ryde
2004-09-07 12:38                 ` Bruno Haible
2004-09-08  1:10                   ` Kevin Ryde
2004-09-07  8:20             ` Jan Nieuwenhuizen
2004-09-07 14:16               ` Jan Nieuwenhuizen
2004-09-08  1:15                 ` Kevin Ryde
2004-09-08  8:58                   ` Jan Nieuwenhuizen [this message]
2004-09-08 10:39                   ` Bruno Haible
2004-09-08 14:37                     ` Jan Nieuwenhuizen
2004-09-08 16:37                       ` Bruno Haible
2004-09-08 21:53                     ` Jan Nieuwenhuizen
2004-09-08 22:45                       ` Kevin Ryde
2004-09-08 23:46                         ` Jan Nieuwenhuizen
2004-09-09 16:25                           ` Jan Nieuwenhuizen
2004-09-15 11:20                             ` Bruno Haible
2004-09-22  0:42                             ` Marius Vollmer
2004-09-22 14:55                               ` Bruno Haible
2004-09-02 17:32         ` Jan Nieuwenhuizen
2004-09-01 21:44   ` Kevin Ryde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87llflgmrn.fsf@peder.flower \
    --to=janneke@gnu.org \
    --cc=bruno@clisp.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).