remove properly [[context]] strings from translated messages

src/Messages.cpp: general cleanup.
	(cleanTranslation): remove [[context]] strings from a docstring. Use
	plain string manupulation instead of regular expressions.
	(get): use cleanTranslation also on strings that got translated.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21641 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jean-Marc Lasgouttes 2007-11-16 14:31:16 +00:00
parent 8b1cc5bfef
commit 70a25df0ee

View File

@ -15,20 +15,51 @@
#include "support/docstring.h"
#include "support/environment.h"
#include "support/filetools.h"
#include "support/Package.h"
#include "support/unicode.h"
#include <boost/current_function.hpp>
#include <boost/regex.hpp>
#include <cerrno>
using std::endl;
using std::map;
using std::string;
namespace {
using lyx::docstring;
using lyx::from_ascii;
void cleanTranslation(docstring & trans)
{
/*
Some english words have different translations, depending on
context. In these cases the original string is augmented by
context information (e.g. "To:[[as in 'From page x to page
y']]" and "To:[[as in 'From format x to format y']]". This
means that we need to filter out everything in double square
brackets at the end of the string, otherwise the user sees
bogus messages. If we are unable to honour the request we
just return what we got in.
*/
docstring::size_type const pos1 = trans.find(from_ascii("[["));
if (pos1 != docstring::npos) {
docstring::size_type const pos2
= trans.find(from_ascii("]]"), pos1);
if (pos2 != docstring::npos)
trans.erase(pos1, pos2 - pos1 + 2);
}
}
}
#ifdef ENABLE_NLS
#ifdef HAVE_LOCALE_H
# ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
# endif
# if HAVE_GETTEXT
# include <libintl.h> // use the header already in the system *EK*
@ -36,15 +67,8 @@
# include "../intl/libintl.h"
# endif
using std::endl;
using std::make_pair;
using std::map;
using std::string;
namespace lyx {
static boost::regex const reg("^([^\\[]*)\\[\\[[^\\]]*\\]\\]$");
using support::package;
using support::getEnv;
using support::setEnv;
@ -115,35 +139,23 @@ docstring const Messages::get(string const & m) const
#endif
}
char const * tmp = m.c_str();
char const * msg = gettext(tmp);
docstring translated;
if (!msg || msg == tmp) {
if (!msg)
char const * m_c = m.c_str();
char const * trans_c = gettext(m_c);
docstring trans;
if (!trans_c)
lyxerr << "Undefined result from gettext" << endl;
//else
// lyxerr << "Same as entered returned" << endl;
// Some english words have different translations,
// depending on context. In these cases the original
// string is augmented by context information (e.g.
// "To:[[as in 'From page x to page y']]" and
// "To:[[as in 'From format x to format y']]".
// This means that we need to filter out everything
// in double square brackets at the end of the
// string, otherwise the user sees bogus messages.
// If we are unable to honour the request we just
// return what we got in.
boost::smatch sub;
if (regex_match(m, sub, reg))
translated = from_ascii(sub.str(1));
else
translated = from_ascii(tmp);
else if (trans_c == m_c) {
LYXERR(Debug::DEBUG, "Same as entered returned");
trans = from_ascii(m);
} else {
LYXERR(Debug::DEBUG, "We got a translation");
// m is actually not a char const * but ucs4 data
translated = reinterpret_cast<char_type const *>(msg);
trans = reinterpret_cast<char_type const *>(trans_c);
}
cleanTranslation(trans);
// Reset environment variables as they were.
if (!lang_.empty()) {
// Reset everything as it was.
setEnv("LANGUAGE", oldLANGUAGE);
@ -154,7 +166,7 @@ docstring const Messages::get(string const & m) const
}
std::pair<TranslationCache::iterator, bool> result =
cache_.insert(std::make_pair(m, translated));
cache_.insert(std::make_pair(m, trans));
BOOST_ASSERT(result.second);
@ -166,11 +178,6 @@ docstring const Messages::get(string const & m) const
#else // ENABLE_NLS
// This is the dummy variant.
using std::endl;
using std::make_pair;
using std::map;
using std::string;
namespace lyx {
Messages::Messages(string const & l) {}
@ -182,13 +189,9 @@ void Messages::init()
docstring const Messages::get(string const & m) const
{
// See comment above
boost::smatch sub;
static boost::regex const reg("^([^\\[]*)\\[\\[[^\\]]*\\]\\]$");
if (regex_match(m, sub, reg))
return from_ascii(sub.str(1));
else
return from_ascii(m);
docstring trans = from_ascii(m);
cleanTranslation(trans);
return trans;
}
} // namespace lyx