This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gettext markup of library sources


On Wed, Apr 23, 2003 at 05:34:20PM -0500, Benjamin Kosnik wrote:
> 
> >No error, it's just that the strings aren't being translated when I run
> >a program with LC_MESSAGES set to de or de_DE, say.  Putting a hook in
> >config/locale/gnu/messages_members.h told me that messages::open never gets
> >called.  Hardcoding the local __dir string to the appropriate installation
> >directory didn't help either.
> 
> If you post what you are trying to do, I can try it here.

Let's start with this patch, which lays groundwork but changes no behavior
outside of bitset error conditions.  Also, there's a helper rule added to
po/Makefile.am to regenerate the .pot file, but I didn't actually run it
because it's incomplete.

The location of the "_" macro is debatable.  With this patch we'd only be
using it in funcexcept.cc, so that's where I have it.  Which means in turn
that we could just use "gettext" directly, and #define that as a no-op
macro when libintl.h is missing.  I don't much care either way.


This hasn't caused problems for my builds, and I believe it's safe,
but I'm asking for formal review and approval anyhow because I don't use
gettext myself.


2003-04-24  Phil Edwards  <pme at gcc dot gnu dot org>

	* configure.in:  Test for libintl.h.
	* include/bits/c++config:  Define __N for everybody.
	* include/std/std_bitset.h:  Wrap all __throw* text with __N.
	* po/Makefile.am (pot):  New rule, mostly working.
	* src/functexcept.cc:  Call gettext on all __throw* arguments when
	-fexceptions is in effect.
	* po/Makefile.in, config.h.in, configure:  Regenerate.


Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/configure.in,v
retrieving revision 1.122
diff -u -3 -p -r1.122 configure.in
--- configure.in	23 Apr 2003 22:31:44 -0000	1.122
+++ configure.in	24 Apr 2003 21:11:07 -0000
@@ -401,7 +401,7 @@ else
   # Check for available headers.
   AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h machine/endian.h \
   machine/param.h sys/machine.h fp.h locale.h float.h inttypes.h gconv.h \
-  sys/types.h])
+  sys/types.h libintl.h])
 
   GLIBCPP_CHECK_COMPILER_FEATURES
   GLIBCPP_CHECK_LINKER_FEATURES
Index: include/bits/c++config
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/c++config,v
retrieving revision 1.708
diff -u -3 -p -r1.708 c++config
--- include/bits/c++config	24 Apr 2003 00:17:06 -0000	1.708
+++ include/bits/c++config	24 Apr 2003 21:11:07 -0000
@@ -97,4 +97,11 @@
 # define _GLIBCPP_FAST_MATH 0
 #endif
 
+// XXX These are only placeholders.  They let people mark up the library
+// sources without breaking things, and will be probably be somewhere else
+// once localization of the library itself is functioning.
+//#define _(msgid)     gettext (msgid)
+//#define _(msgid)     (msgid)
+#define __N(msgid)     (msgid)
+
 // End of prewritten config; the discovered settings follow.
Index: include/std/std_bitset.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/std/std_bitset.h,v
retrieving revision 1.13
diff -u -3 -p -r1.13 std_bitset.h
--- include/std/std_bitset.h	15 Apr 2003 06:11:10 -0000	1.13
+++ include/std/std_bitset.h	24 Apr 2003 21:11:07 -0000
@@ -264,7 +264,7 @@ namespace std
     {
       for (size_t __i = 1; __i < _Nw; ++__i)
 	if (_M_w[__i])
-	  __throw_overflow_error("bitset -- too large to fit in unsigned long");
+	  __throw_overflow_error(__N("bitset value is too large to fit in unsigned long"));
       return _M_w[0];
     }
 
@@ -466,7 +466,7 @@ namespace std
       // localized to this single should-never-get-this-far function.
       _WordT&
       _M_getword(size_t) const
-      { __throw_out_of_range("bitset -- zero-length"); return *new _WordT; }
+      { __throw_out_of_range(__N("bitset is zero-length")); return *new _WordT; }
 
       _WordT
       _M_hiword() const { return 0; }
@@ -862,7 +862,7 @@ namespace std
     set(size_t __pos, bool __val = true)
     {
       if (__pos >= _Nb)
-	__throw_out_of_range("bitset -- set() argument too large");
+	__throw_out_of_range(__N("bitset::set() argument too large"));
       return _Unchecked_set(__pos, __val);
     }
 
@@ -887,7 +887,7 @@ namespace std
     reset(size_t __pos)
     {
       if (__pos >= _Nb)
-	__throw_out_of_range("bitset -- reset() argument too large");
+	__throw_out_of_range(__N("bitset::reset() argument too large"));
       return _Unchecked_reset(__pos);
     }
 
@@ -911,7 +911,7 @@ namespace std
     flip(size_t __pos)
     {
       if (__pos >= _Nb)
-	__throw_out_of_range("bitset -- flip() argument too large");
+	__throw_out_of_range(__N("bitset::flip() argument too large"));
       return _Unchecked_flip(__pos);
     }
 
@@ -1014,7 +1014,7 @@ namespace std
     test(size_t __pos) const
     {
       if (__pos >= _Nb)
-	__throw_out_of_range("bitset -- test() argument too large");
+	__throw_out_of_range(__N("bitset::test() argument too large"));
       return _Unchecked_test(__pos);
     }
 
Index: po/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/po/Makefile.am,v
retrieving revision 1.6
diff -u -3 -p -r1.6 Makefile.am
--- po/Makefile.am	7 Jan 2002 18:57:06 -0000	1.6
+++ po/Makefile.am	24 Apr 2003 21:11:07 -0000
@@ -22,6 +22,7 @@
 ## USA.
 
 PACKAGE = @PACKAGE@
+glibcpp_srcdir = @glibcpp_srcdir@
 
 # Location of installation directories.
 mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
@@ -76,6 +77,14 @@ install-data-local-yes: all-local-yes
 	  $(mkinstalldirs) $$install_dir; \
 	  $(INSTALL_DATA) $$cat $$install_dir/$(PACKAGE).mo; \
 	done
+
+# Maintainence of the .po template file.  This rule is never run automatically,
+# and updates the source directory.
+pot:
+	cd $(glibcpp_srcdir); \
+	xgettext --default-domain=$(PACKAGE) --add-comments --c++ --debug \
+	  --join-existing -o po/$(PACKAGE).pot --keyword=__N \
+	  `grep -r -l '__N(".*")' .`
 
 # Specify what gets cleaned up on a 'make clean'
 CLEANFILES = $(LOCALE_OUT) 
Index: src/functexcept.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/functexcept.cc,v
retrieving revision 1.3
diff -u -3 -p -r1.3 functexcept.cc
--- src/functexcept.cc	13 Feb 2002 18:29:11 -0000	1.3
+++ src/functexcept.cc	24 Apr 2003 21:11:07 -0000
@@ -1,4 +1,4 @@
-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -32,6 +32,12 @@
 #include <new>
 #include <typeinfo>
 #include <ios>
+#ifdef _GLIBCPP_HAVE_LIBINTL_H
+# include <libintl.h>
+# define _(msgid)   gettext (msgid)
+#else
+# define _(msgid)   (msgid)
+#endif
 
 namespace std 
 {
@@ -54,43 +60,43 @@ namespace std 
 
   void
   __throw_logic_error(const char* __s)
-  { throw logic_error(__s); }
+  { throw logic_error(_(__s)); }
 
   void
   __throw_domain_error(const char* __s)
-  { throw domain_error(__s); }
+  { throw domain_error(_(__s)); }
 
   void
   __throw_invalid_argument(const char* __s)
-  { throw invalid_argument(__s); }
+  { throw invalid_argument(_(__s)); }
 
   void
   __throw_length_error(const char* __s)
-  { throw length_error(__s); }
+  { throw length_error(_(__s)); }
 
   void
   __throw_out_of_range(const char* __s)
-  { throw out_of_range(__s); }
+  { throw out_of_range(_(__s)); }
 
   void
   __throw_runtime_error(const char* __s)
-  { throw runtime_error(__s); }
+  { throw runtime_error(_(__s)); }
 
   void
   __throw_range_error(const char* __s)
-  { throw range_error(__s); }
+  { throw range_error(_(__s)); }
 
   void
   __throw_overflow_error(const char* __s)
-  { throw overflow_error(__s); }
+  { throw overflow_error(_(__s)); }
 
   void
   __throw_underflow_error(const char* __s)
-  { throw underflow_error(__s); }
+  { throw underflow_error(_(__s)); }
 
   void
   __throw_ios_failure(const char* __s)
-  { throw ios_base::failure(__s); }
+  { throw ios_base::failure(_(__s)); }
 #else
   void
   __throw_bad_exception(void)
Index: config.h.in
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config.h.in,v
retrieving revision 1.63
diff -u -3 -p -r1.63 config.h.in
--- config.h.in	17 Apr 2003 03:26:54 -0000	1.63
+++ config.h.in	24 Apr 2003 21:11:05 -0000
@@ -731,6 +731,9 @@
 /* Define if you have the <inttypes.h> header file.  */
 #undef HAVE_INTTYPES_H
 
+/* Define if you have the <libintl.h> header file.  */
+#undef HAVE_LIBINTL_H
+
 /* Define if you have the <locale.h> header file.  */
 #undef HAVE_LOCALE_H
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]