From: Jean-Marc Lasgouttes Date: Fri, 16 Nov 2007 14:31:16 +0000 (+0000) Subject: remove properly [[context]] strings from translated messages X-Git-Tag: 1.6.10~7324 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=70a25df0ee04e92f3fa2f189a8a489e44924aef8;p=features.git 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 --- diff --git a/src/Messages.cpp b/src/Messages.cpp index fd136d6a56..1056564619 100644 --- a/src/Messages.cpp +++ b/src/Messages.cpp @@ -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 -#include #include +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 -# include -#endif +# ifdef HAVE_LOCALE_H +# include +# endif # if HAVE_GETTEXT # include // 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) - 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); + 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 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(msg); + trans = reinterpret_cast(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 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