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
next prev parent 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).