unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: Bruno Haible <bruno@clisp.org>
Cc: guile-devel@gnu.org, Jan Nieuwenhuizen <janneke@gnu.org>
Subject: Re: i18n, gettext support
Date: Sat, 4 Sep 2004 19:25:15 +0200	[thread overview]
Message-ID: <200409041925.15048.bruno@clisp.org> (raw)
In-Reply-To: <87d614b0fq.fsf@zip.com.au>

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

Kevin Ryde wrote:

> LC_MESSAGES and friends already exist as variables.

OK. Find attached a revised patch which takes this into account.

> > + SCM_API SCM scm_get_textdomain (void);
> > + SCM_API SCM scm_set_textdomain (SCM domainname);
>
> I think these could be a single textdomain func taking an optional
> argument.  That's what's done for setlocale for instance, and it
> matches the C routines.
>
> > + SCM_API SCM scm_get_textdomain_dir (SCM domainname);
> > + SCM_API SCM scm_set_textdomain_dir (SCM domainname, SCM directory);
> > + SCM_API SCM scm_get_textdomain_codeset (SCM domainname);
> > + SCM_API SCM scm_set_textdomain_codeset (SCM domainname, SCM encoding);
>
> And I'd call these bindtextdomain, again for similarity to the C
> routines they wrap.
>
> > +   SCM_VARIABLE_SET (gettersym,
> > + 		    scm_make_procedure_with_setter (
> > + 			SCM_VARIABLE_REF (gettersym),
> > + 			SCM_VARIABLE_REF (settersym)));
>
> Procedures with setters are not much used in the core.

That's your point of view, not mine. I would find it irresponsible if I
were to submit a patch which includes destructive functions that don't
bear a '!' in their name.

You and/or Jan can of course spend 15 minutes to modify my patch to fit your
point of view.

In the GNU 'xgettext' extractor and associated example I will support
whatever API you provide in guile.

Bruno

[-- Attachment #2: guile-diffs --]
[-- Type: text/x-diff, Size: 21513 bytes --]

ChangeLog:
2004-09-02  Bruno Haible  <bruno@clisp.org>

	* configure.in: Add AM_GNU_GETTEXT invocation.

libguile/ChangeLog:
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.

diff -r -c3 --exclude=Makefile --exclude='*.texi' --exclude='*.info*' --exclude=configure --exclude=Makefile.in guile-1.7.1.orig/configure.in guile-1.7.1/configure.in
*** guile-1.7.1.orig/configure.in	2004-08-26 16:23:34.000000000 +0200
--- guile-1.7.1/configure.in	2004-09-01 22:05:51.000000000 +0200
***************
*** 637,642 ****
--- 637,645 ----
              [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.
  
diff -r -c3 --exclude=Makefile --exclude='*.texi' --exclude='*.info*' --exclude=configure --exclude=Makefile.in guile-1.7.1.orig/libguile/init.c guile-1.7.1/libguile/init.c
*** guile-1.7.1.orig/libguile/init.c	2004-08-25 11:45:13.000000000 +0200
--- guile-1.7.1/libguile/init.c	2004-09-02 13:43:11.000000000 +0200
***************
*** 63,68 ****
--- 63,69 ----
  #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,482 ****
--- 478,484 ----
    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 ();
diff -r -c3 --exclude=Makefile --exclude='*.texi' --exclude='*.info*' --exclude=configure --exclude=Makefile.in guile-1.7.1.orig/libguile/Makefile.am guile-1.7.1/libguile/Makefile.am
*** guile-1.7.1.orig/libguile/Makefile.am	2004-08-25 11:45:10.000000000 +0200
--- guile-1.7.1/libguile/Makefile.am	2004-09-02 17:47:55.000000000 +0200
***************
*** 97,103 ****
      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		    \
      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	    \
--- 97,103 ----
      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 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,119 ****
      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		 \
      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 \
--- 113,119 ----
      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 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,139 ****
      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			    \
      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 \
--- 132,139 ----
      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 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,178 ****
  
  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
  
  # These are headers visible as <guile/mumble.h>
  pkginclude_HEADERS = gh.h
--- 172,178 ----
  
  libguile_la_DEPENDENCIES = @LIBLOBJS@
  libguile_la_LIBADD = @LIBLOBJS@ ../libguile-ltdl/libguile-ltdl.la $(THREAD_LIBS_LOCAL)
! 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,193 ****
      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		      \
      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  \
--- 187,193 ----
      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 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  \
*** /dev/null	1970-01-01 01:00:00.000000000 +0100
--- guile-1.7.1/libguile/i18n.h	2004-09-02 14:05:22.000000000 +0200
***************
*** 0 ****
--- 1,41 ----
+ /* 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"
+ 
+ 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_get_textdomain (void);
+ SCM_API SCM scm_set_textdomain (SCM domainname);
+ SCM_API SCM scm_get_textdomain_dir (SCM domainname);
+ SCM_API SCM scm_set_textdomain_dir (SCM domainname, SCM directory);
+ SCM_API SCM scm_get_textdomain_codeset (SCM domainname);
+ SCM_API SCM scm_set_textdomain_codeset (SCM domainname, SCM encoding);
+ SCM_API void scm_init_i18n (void);
+ 
+ #endif  /* SCM_I18N_H */
+ 
+ /*
+   Local Variables:
+   c-file-style: "gnu"
+   End:
+ */
*** /dev/null	1970-01-01 01:00:00.000000000 +0100
--- guile-1.7.1/libguile/i18n.c	2004-09-04 19:10:24.000000000 +0200
***************
*** 0 ****
--- 1,323 ----
+ /* 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/discouraged.h"
+ #include "libguile/feature.h"
+ #include "libguile/i18n.h"
+ #include "libguile/strings.h"
+ #include "gettext.h"
+ #include <locale.h>
+ 
+ 
+ static int
+ scm_validate_category (SCM category, const char *subr, int pos)
+ {
+   if (scm_is_eq (category, scm_from_int (LC_MESSAGES))
+       || scm_is_eq (category, scm_from_int (LC_CTYPE))
+       || scm_is_eq (category, scm_from_int (LC_TIME))
+       || scm_is_eq (category, scm_from_int (LC_COLLATE))
+       || scm_is_eq (category, scm_from_int (LC_MONETARY)))
+     return scm_to_int (category);
+   else
+     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_validate_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_makfrom0str (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_validate_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_makfrom0str (result);
+     }
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_get_textdomain, "textdomain", 0, 0, 0,
+ 	    (void),
+ 	    "Return the current message domain.")
+ #define FUNC_NAME s_scm_get_textdomain
+ {
+   const char *result;
+ 
+   result = textdomain (NULL);
+   if (result == NULL)
+     return SCM_BOOL_F;
+   else
+     return scm_makfrom0str (result);
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_set_textdomain, "set!-textdomain", 1, 0, 0,
+ 	    (SCM domain),
+ 	    "Change the current message domain.")
+ #define FUNC_NAME s_scm_set_textdomain
+ {
+   char *c_domain;
+ 
+   SCM_VALIDATE_STRING (1, domain);
+   c_domain = scm_to_locale_string (domain);
+   if (textdomain (c_domain) == NULL)
+     SCM_SYSERROR;
+   free (c_domain);
+   return domain;
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_get_textdomain_dir, "textdomaindir", 1, 0, 0,
+ 	    (SCM domain),
+ 	    "Return the base directory for message catalogs for the given "
+ 	    "message domain.")
+ #define FUNC_NAME s_scm_get_textdomain_dir
+ {
+   char *c_domain;
+   const char *result;
+ 
+   SCM_VALIDATE_STRING (1, domain);
+   c_domain = scm_to_locale_string (domain);
+   result = bindtextdomain (c_domain, NULL);
+   free (c_domain);
+   if (result == NULL)
+     return SCM_BOOL_F;
+   else
+     return scm_makfrom0str (result);
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_set_textdomain_dir, "set!-textdomaindir", 2, 0, 0,
+ 	    (SCM domain, SCM directory),
+ 	    "Change the base directory for message catalogs for the given "
+ 	    "message domain.")
+ #define FUNC_NAME s_scm_set_textdomain_dir
+ {
+   char *c_domain;
+   char *c_directory;
+ 
+   SCM_VALIDATE_STRING (1, domain);
+   SCM_VALIDATE_STRING (2, directory);
+   c_domain = scm_to_locale_string (domain);
+   c_directory = scm_to_locale_string (directory);
+   if (bindtextdomain (c_domain, c_directory) == NULL)
+     SCM_SYSERROR;
+   free (c_directory);
+   free (c_domain);
+   return directory;
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_get_textdomain_codeset, "textdomain-codeset", 1, 0, 0,
+ 	    (SCM domain),
+ 	    "Return the encoding for message catalogs for the given message "
+ 	    "domain.")
+ #define FUNC_NAME s_scm_get_textdomain_codeset
+ {
+   char *c_domain;
+   const char *result;
+ 
+   SCM_VALIDATE_STRING (1, domain);
+   c_domain = scm_to_locale_string (domain);
+   result = bind_textdomain_codeset (c_domain, NULL);
+   free (c_domain);
+   if (result == NULL)
+     return SCM_BOOL_F;
+   else
+     return scm_makfrom0str (result);
+ }
+ #undef FUNC_NAME
+ 
+ 
+ SCM_DEFINE (scm_set_textdomain_codeset, "set!-textdomain-codeset", 2, 0, 0,
+ 	    (SCM domain, SCM encoding),
+ 	    "Change the encoding for message catalogs for the given message "
+ 	    "domain.")
+ #define FUNC_NAME s_scm_set_textdomain_codeset
+ {
+   char *c_domain;
+   char *c_encoding;
+ 
+   SCM_VALIDATE_STRING (1, domain);
+   SCM_VALIDATE_STRING (2, encoding);
+   c_domain = scm_to_locale_string (domain);
+   c_encoding = scm_to_locale_string (encoding);
+   if (bind_textdomain_codeset (c_domain, c_encoding) == NULL)
+     SCM_SYSERROR;
+   free (c_encoding);
+   free (c_domain);
+   return encoding;
+ }
+ #undef FUNC_NAME
+ 
+ 
+ void 
+ scm_init_i18n ()
+ {
+   SCM gettersym, settersym;
+ 
+   scm_add_feature ("i18n");
+ #include "libguile/i18n.x"
+ 
+   gettersym = scm_c_lookup ("textdomain");
+   settersym = scm_c_lookup ("set!-textdomain");
+   SCM_VARIABLE_SET (gettersym,
+ 		    scm_make_procedure_with_setter (
+ 			SCM_VARIABLE_REF (gettersym),
+ 			SCM_VARIABLE_REF (settersym)));
+ 
+   gettersym = scm_c_lookup ("textdomaindir");
+   settersym = scm_c_lookup ("set!-textdomaindir");
+   SCM_VARIABLE_SET (gettersym,
+ 		    scm_make_procedure_with_setter (
+ 			SCM_VARIABLE_REF (gettersym),
+ 			SCM_VARIABLE_REF (settersym)));
+ 
+   gettersym = scm_c_lookup ("textdomain-codeset");
+   settersym = scm_c_lookup ("set!-textdomain-codeset");
+   SCM_VARIABLE_SET (gettersym,
+ 		    scm_make_procedure_with_setter (
+ 			SCM_VARIABLE_REF (gettersym),
+ 			SCM_VARIABLE_REF (settersym)));
+ }
+ 
+ 
+ /*
+   Local Variables:
+   c-file-style: "gnu"
+   End:
+ */
*** /dev/null	1970-01-01 01:00:00.000000000 +0100
--- guile-1.7.1/libguile/gettext.h	2002-05-10 13:20:06.000000000 +0200
***************
*** 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: 143 bytes --]

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

  reply	other threads:[~2004-09-04 17:25 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 [this message]
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
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=200409041925.15048.bruno@clisp.org \
    --to=bruno@clisp.org \
    --cc=guile-devel@gnu.org \
    --cc=janneke@gnu.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).