Am Freitag, 3. November 2006 21:01 schrieb Bo Peng:

> Therefore, tex2lyx uses the no-translation _(). and
> support/package.C.in uses a different gettext.h with translation.
> Then, there is a link problem.
> 
> I do not have time to trace why gcc passes and the problem can be
> fixed by using tex2lyx/gettext.h for packages.C.

I don't understand at all why gcc (or rather the linker) does not complain. 
BTW src/client has the same problem.

> However, I see no 
> reason for a separate _() function  for tex2lyx and propose that we
> remove tex2lyx/gettext.* and use the src/gettext.*.

It is not that easy unfortunately. Removing tex2lyx/gettext.C does only 
make sense if we enable real translations in tex2lyx at the same time: 
include the files in the po machinery, and either install a separate 
tex2lyx .mo file or make it use the one from LyX.
You can see in the client that that is not trivial, and requires some extra 
code anyway. Therefore I propose to only get rid of the extra headers for 
now. Future interface changes will then cause a compiler error. The 
attached patch does this, and fixes the interface. It goes in later today 
unless I get objections.


Georg
Index: src/gettext.C
===================================================================
--- src/gettext.C	(Revision 15726)
+++ src/gettext.C	(Arbeitskopie)
@@ -14,7 +14,6 @@
 #include "gettext.h"
 #include "messages.h"
 #include "support/environment.h"
-#include "support/docstring.h"
 
 
 namespace lyx {
Index: src/gettext.h
===================================================================
--- src/gettext.h	(Revision 15726)
+++ src/gettext.h	(Arbeitskopie)
@@ -15,8 +15,6 @@
 
 #include "support/docstring.h"
 
-#include <string>
-
 
 namespace lyx {
 
Index: src/client/gettext.C
===================================================================
--- src/client/gettext.C	(Revision 15726)
+++ src/client/gettext.C	(Arbeitskopie)
@@ -37,7 +37,7 @@ Messages & getLyXMessages()
 } // anon namespace
 
 
-string const _(string const & str)
+docstring const _(string const & str)
 {
 	return getLyXMessages().get(str);
 }
Index: src/client/debug.C
===================================================================
--- src/client/debug.C	(Revision 15726)
+++ src/client/debug.C	(Arbeitskopie)
@@ -88,10 +88,10 @@ void lyx_debug_trait::showLevel(ostream 
 		    && errorTags[i].level & level) {
 			// avoid _(...) re-entrance problem
 			// FIXME: should we use _() from gettext.h here?
-			string const s = _(errorTags[i].desc);
-			os << lyx::to_utf8(bformat(lyx::from_utf8(_("Debugging `%1$s' (%2$s)")),
+			lyx::docstring const s = _(errorTags[i].desc);
+			os << lyx::to_utf8(bformat(_("Debugging `%1$s' (%2$s)"),
 						   lyx::from_utf8(errorTags[i].name), 
-						   lyx::from_utf8(s)))
+						   s))
 			   << '\n';
 		}
 	}
@@ -104,7 +104,7 @@ void lyx_debug_trait::showTags(ostream &
 	for (int i = 0; i < numErrorTags ; ++i)
 		os << setw(7) << static_cast<unsigned int>(errorTags[i].level)
 		   << setw(10) << errorTags[i].name
-		   << "  " << _(errorTags[i].desc) << '\n';
+		   << "  " << lyx::to_utf8(_(errorTags[i].desc)) << '\n';
 	os.flush();
 }
 
Index: src/client/messages.C
===================================================================
--- src/client/messages.C	(Revision 15726)
+++ src/client/messages.C	(Arbeitskopie)
@@ -17,6 +17,7 @@
 namespace lyx {
 
 using lyx::support::package;
+using std::endl;
 using std::string;
 
 
@@ -90,21 +91,63 @@ public:
 
 	~Pimpl() {}
 
-	string const get(string const & m) const
+	docstring const get(string const & m) const
 	{
 		if (m.empty())
-			return m;
+			return from_ascii(m);
 
-		char * old = strdup(setlocale(LC_ALL, 0));
+		char * o = setlocale(LC_ALL, 0);
+		string old;
+		if (o)
+			old = o;
 		char * n = setlocale(LC_ALL, lang_.c_str());
-		bindtextdomain(PACKAGE, package().locale_dir().c_str());
+		if (!n)
+			// If we are unable to honour the request we just
+			// return what we got in.
+			return from_ascii(m);
+		errno = 0;
+		char const * c = bindtextdomain(PACKAGE, package().locale_dir().c_str());
+		int e = errno;
+		if (e) {
+			lyxerr[Debug::DEBUG]
+				<< BOOST_CURRENT_FUNCTION << '\n'
+				<< "Error code: " << errno << '\n'
+				<< "Lang, mess: " << lang_ << " " << m << '\n'
+				<< "Directory : " << package().locale_dir() << '\n'
+				<< "Rtn value : " << c << endl;
+		}
+
+#ifdef WORDS_BIGENDIAN
+		static const char * codeset = "UCS-4BE";
+#else
+		static const char * codeset = "UCS-4LE";
+#endif
+		if (!bind_textdomain_codeset(PACKAGE, codeset)) {
+			lyxerr[Debug::DEBUG]
+				<< BOOST_CURRENT_FUNCTION << '\n'
+				<< "Error code: " << errno << '\n'
+				<< "Codeset   : " << codeset << '\n'
+				<< endl;
+		}
+
 		textdomain(PACKAGE);
-		const char* msg = gettext(m.c_str());
-		setlocale(LC_ALL, old);
-		free(old);
-		// If we are unable to honour the request we just
-		// return what we got in.
-		return (!n ? m : string(msg));
+
+		char const * tmp = m.c_str();
+		char const * msg = gettext(tmp);
+		docstring translated;
+		if (!msg) {
+			lyxerr << "Undefined result from gettext" << endl;
+			translated = from_ascii(tmp);
+		} else if (msg == tmp) {
+			//lyxerr << "Same as entered returned" << endl;
+			translated = from_ascii(tmp);
+		} else {
+			lyxerr[Debug::DEBUG] << "We got a translation" << endl;
+			char_type const * ucs4 = reinterpret_cast<char_type const *>(msg);
+			translated = ucs4;
+		}
+		setlocale(LC_ALL, old.c_str());
+		return translated;
 	}
 private:
 	///
@@ -120,7 +163,7 @@ public:
 
 	~Pimpl() {}
 
-	string const get(string const & m) const
+	docstring const get(string const & m) const
 	{
 		return m;
 	}
@@ -143,7 +186,7 @@ Messages::~Messages()
 {}
 
 
-string const Messages::get(string const & msg) const
+docstring const Messages::get(string const & msg) const
 {
 	return pimpl_->get(msg);
 }
Index: src/client/Makefile.am
===================================================================
--- src/client/Makefile.am	(Revision 15726)
+++ src/client/Makefile.am	(Arbeitskopie)
@@ -24,7 +24,6 @@ lyxclient_SOURCES = \
 	debug.C \
 	debug.h \
 	gettext.C \
-	gettext.h \
 	messages.C \
 	messages.h
 
Index: src/client/gettext.h
===================================================================
--- src/client/gettext.h	(Revision 15726)
+++ src/client/gettext.h	(Arbeitskopie)
@@ -1,70 +0,0 @@
-// -*- C++ -*-
-/**
- * \file src/gettext.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Lars Gullik Bjønnes
- * \author Jean-Marc Lasgouttes
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#ifndef GETTEXT_H
-#define GETTEXT_H
-
-#include <string>
-
-
-namespace lyx {
-
-/*
- * Native Language Support
- *
- * The general idea is that any string that should be translated is handled
- * as follows:
- *	_("string")
- *
- * Static strings are special, obviously and must be flagged as follows:
- *	static str = N_("string");
- *
- * And wherever they are used:
- *	_(str)
- *
- * Every file where there are strings needs:
- *	#include "gettext.h"
- *
- * Remember to mention each of these files in "po/POFILES.in"
- *
- * The main() needs a locale_init() and a gettext_init() in the beginning.
- */
-
-/*
- * General translation notes:
- *   Commands/options are not translated
- *   Debug messages are not translated
- *   Panic/fatal (that should not happen) messages need not be translated
- */
-
-
-//#ifdef ENABLE_NLS
-
-///
-std::string const _(std::string const &);
-
-//#else // ENABLE_NLS
-
-///
-//#  define _(str) (str)
-
-//#endif
-
-#  define N_(str) (str)              // for detecting static strings
-
-///
-void locale_init();
-
-
-} // namespace lyx
-
-#endif
Index: src/client/messages.h
===================================================================
--- src/client/messages.h	(Revision 15726)
+++ src/client/messages.h	(Arbeitskopie)
@@ -11,8 +11,9 @@
 #ifndef MESSAGES_H
 #define MESSAGES_H
 
+#include "support/docstring.h"
+
 #include <boost/scoped_ptr.hpp>
-#include <string>
 
 
 namespace lyx {
@@ -27,7 +28,7 @@ public:
 	///
 	~Messages();
 	///
-	std::string const get(std::string const & msg) const;
+	docstring const get(std::string const & msg) const;
 private:
 	class Pimpl;
 	boost::scoped_ptr<Pimpl> pimpl_;
Index: src/tex2lyx/gettext.C
===================================================================
--- src/tex2lyx/gettext.C	(Revision 15726)
+++ src/tex2lyx/gettext.C	(Arbeitskopie)
@@ -16,12 +16,10 @@
 
 namespace lyx {
 
-using std::string;
 
-
-string const _(string const & str)
+docstring const _(std::string const & str)
 {
-	return str;
+	return from_ascii(str);
 }
 
 
Index: src/tex2lyx/Makefile.am
===================================================================
--- src/tex2lyx/Makefile.am	(Revision 15726)
+++ src/tex2lyx/Makefile.am	(Arbeitskopie)
@@ -42,7 +42,6 @@ tex2lyx_SOURCES = \
 	context.C \
 	context.h \
 	gettext.C \
-	gettext.h \
 	lengthcommon.C \
 	lyxfont.C \
 	lyxfont.h \
Index: src/tex2lyx/gettext.h
===================================================================
--- src/tex2lyx/gettext.h	(Revision 15726)
+++ src/tex2lyx/gettext.h	(Arbeitskopie)
@@ -1,33 +0,0 @@
-// -*- C++ -*-
-/**
- * \file tex2lyx/gettext.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Lars Gullik Bjønnes
- * \author Jean-Marc Lasgouttes
- *
- * Full author contact details are available in file CREDITS.
- */
-#ifndef GETTEXT_H
-#define GETTEXT_H
-
-#include <string>
-
-
-namespace lyx {
-
-
-///
-std::string const _(std::string const &);
-
-/// for detecting static strings
-#define N_(str) (str)
-
-///
-void locale_init();
-
-
-} // namespace lyx
-
-#endif
Index: po/POTFILES.in
===================================================================
--- po/POTFILES.in	(Revision 15726)
+++ po/POTFILES.in	(Arbeitskopie)
@@ -1,4 +1,3 @@
-src/BranchList.h
 src/BufferView.C
 src/Chktex.C
 src/CutAndPaste.C
@@ -12,7 +11,6 @@ src/bufferlist.C
 src/bufferparams.C
 src/bufferview_funcs.C
 src/client/debug.C
-src/client/gettext.h
 src/converter.C
 src/debug.C
 src/exporter.C
Index: development/scons/scons_manifest.py
===================================================================
--- development/scons/scons_manifest.py	(Revision 15726)
+++ development/scons/scons_manifest.py	(Arbeitskopie)
@@ -972,7 +972,6 @@ src_frontends_qt4_files = Split('''
 
 src_client_header_files = Split('''
     debug.h
-    gettext.h
     messages.h
 ''')
 
@@ -989,7 +988,6 @@ src_client_files = Split('''
 src_tex2lyx_header_files = Split('''
     Spacing.h
     context.h
-    gettext.h
     lyxfont.h
     messages.h
     tex2lyx.h

Reply via email to