X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmessages.C;h=1877ae2f0b23ca72e096248f2ca04f1e9604fe3e;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=9966178e5a967eb7f33d23c29e918e83f8fe47ec;hpb=795e9a7586527296ed037e2a0f1d3a321ba9e7ed;p=lyx.git diff --git a/src/messages.C b/src/messages.C index 9966178e5a..1877ae2f0b 100644 --- a/src/messages.C +++ b/src/messages.C @@ -4,35 +4,159 @@ * * \author Lars Gullik Bjønnes * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include #include "messages.h" -#include "debug.h" +#include "support/filetools.h" +#include "support/path_defines.h" -using std::endl; +#include +using lyx::support::GetEnvPath; +using lyx::support::lyx_localedir; -Messages::Messages(string const & l, string const & dir) - : lang_(l), localedir_(dir), - loc_gl(lang_.c_str()), - mssg_gl(std::use_facet >(loc_gl)) -{ - lyxerr << "Messages: language(" << l << ") in dir(" << dir << ")" << endl; +using std::string; - cat_gl = mssg_gl.open("lyx", loc_gl, localedir_.c_str()); -} +#ifdef ENABLE_NLS + + +#if 0 + +-#include + +// This version of the Pimpl utilizes the message capability of +// libstdc++ that is distributed with GNU G++. +class Messages::Pimpl { +public: + typedef std::messages::catalog catalog; + + Pimpl(string const & l) + : lang_(l), + loc_gl(lang_.c_str()), + mssg_gl(std::use_facet >(loc_gl)) + { + //lyxerr << "Messages: language(" << l + // << ") in dir(" << dir << ")" << std::endl; + + cat_gl = mssg_gl.open(PACKAGE, loc_gl, lyx_localedir().c_str()); + + } + + ~Pimpl() + { + mssg_gl.close(cat_gl); + } + + string const get(string const & msg) const + { + return mssg_gl.get(cat_gl, 0, 0, msg); + } +private: + /// + string lang_; + /// + std::locale loc_gl; + /// + std::messages const & mssg_gl; + /// + catalog cat_gl; +}; +#else + +#ifdef HAVE_LOCALE_H +# include +#endif + +# if HAVE_GETTEXT +# include // use the header already in the system *EK* +# else +# include "../intl/libintl.h" +# endif + +// This is a more traditional variant. +class Messages::Pimpl { +public: + Pimpl(string const & l) + : lang_(l) + { + //lyxerr << "Messages: language(" << l + // << ") in dir(" << dir << ")" << std::endl; + } + + ~Pimpl() {} + + string const get(string const & m) const + { + if (m.empty()) + return m; + + char * old = strdup(setlocale(LC_ALL, 0)); + char * n = setlocale(LC_ALL, lang_.c_str()); + bindtextdomain(PACKAGE, lyx_localedir().c_str()); + textdomain(PACKAGE); + const char* msg = gettext(m.c_str()); + // 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. + string translated(n ? msg : m); + static boost::regex const reg("^([^\\[]*)\\[\\[[^\\]]*\\]\\]$"); + boost::smatch sub; + if (regex_match(translated, sub, reg)) + translated = sub.str(1); + setlocale(LC_ALL, old); + free(old); + return translated; + } +private: + /// + string lang_; +}; +#endif + +#else // ENABLE_NLS +// This is the dummy variant. +class Messages::Pimpl { +public: + Pimpl(string const &) {} + + ~Pimpl() {} + + string const get(string const & m) const + { + return m; + } +}; +#endif + + +Messages::Messages() + : pimpl_(new Pimpl("")) +{} + + +Messages::Messages(string const & l) + : pimpl_(new Pimpl(l)) +{} + + +// We need this for the sake of scoped_ptr Messages::~Messages() -{ - mssg_gl.close(cat_gl); -} +{} string const Messages::get(string const & msg) const { - return mssg_gl.get(cat_gl, 0, 0, msg); + return pimpl_->get(msg); }