X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmessages.C;h=0fcf097708f33bccf4eca75225e2270050aa5e56;hb=de3c8e5b80effa940c92980032389c868f377d6b;hp=a3748451d4036fecbed94c256a87fcbfe1466ba8;hpb=4fbd6bcd95521b065d991bd6843a541c06eb67ea;p=lyx.git diff --git a/src/messages.C b/src/messages.C index a3748451d4..0fcf097708 100644 --- a/src/messages.C +++ b/src/messages.C @@ -1,38 +1,162 @@ -* \file messages.C +/* \file messages.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \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; +using lyx::support::GetEnvPath; +using lyx::support::lyx_localedir; +using std::string; -Messages::Messages(string const & l, string const & dir) - : lang_(l), localedir_(dir), - loc_gl(lang_.c_str()), - mssg_gl(std::use_facet >(loc_gl)) + +#ifdef ENABLE_NLS + +namespace { + +string const & getLocaleDir() { - lyxerr << "Messages: language(" << l << ") in dir(" << dir << ")" << endl; + static string locale_dir; - cat_gl = mssg_gl.open("lyx", loc_gl, localedir_.c_str()); + if (locale_dir.empty()) { + locale_dir = GetEnvPath("LYX_LOCALEDIR"); + if (locale_dir.empty()) + locale_dir = lyx_localedir(); + } + return locale_dir; } +} // anon namespace + +#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, getLocaleDir().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; + bindtextdomain(PACKAGE, getLocaleDir().c_str()); + textdomain(PACKAGE); + } + + ~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()); + 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)); + } +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); }