]> git.lyx.org Git - lyx.git/blobdiff - src/messages.C
Add GTK bibitem dialog
[lyx.git] / src / messages.C
index 50b5d9ca750ec26077051aa3eb67e14dae3b50f0..3baa83c3e451be4f77df6adc984b33d213e6f47a 100644 (file)
 #include "debug.h"
 #include "messages.h"
 #include "support/filetools.h"
+#include "support/environment.h"
 #include "support/package.h"
 
+#include <boost/current_function.hpp>
 #include <boost/regex.hpp>
 
+#include <cerrno>
+
 using lyx::support::package;
+using lyx::support::getEnv;
+using lyx::support::setEnv;
 
 using std::string;
 
@@ -83,12 +89,15 @@ public:
        Pimpl(string const & l)
                : lang_(l)
        {
-               if ( lang_.empty() )
-                       lang_ = setlocale(LC_MESSAGES, NULL);
-               lyxerr << "Messages: language(" << lang_
-               //       << ") in dir(" << dir 
-                      << ")" << std::endl;
-               
+               if ( lang_.empty() ) {
+                       char const * lc_msgs = setlocale(LC_MESSAGES, NULL);
+                       lang_ = lc_msgs ? lc_msgs : "";
+               }
+               // strip off any encoding suffix, i.e., assume 8-bit po files
+               string::size_type i = lang_.find(".");
+               lang_ = lang_.substr(0, i);
+               lyxerr[Debug::DEBUG] << BOOST_CURRENT_FUNCTION
+                                     << ": language(" << lang_ << ")" << std::endl;
        }
 
        ~Pimpl() {}
@@ -98,15 +107,42 @@ public:
                if (m.empty())
                        return m;
 
-               string oldMSG = setlocale(LC_MESSAGES, NULL);
-               bool works = setlocale(LC_MESSAGES, lang_.c_str());
+               //string oldMSG = setlocale(LC_MESSAGES, NULL);
+               // In this order, see support/filetools.C:
+               string lang = getEnv("LC_ALL");
+               if (lang.empty()) {
+                       lang = getEnv("LC_MESSAGES");
+                       if (lang.empty()) {
+                               lang = getEnv("LANG");
+                               if (lang.empty())
+                                       lang = "C";
+                       }
+               }
+               
+               char const * lc_msgs = setlocale(LC_MESSAGES, lang_.c_str());
+#ifndef _WIN32
+               if (!lc_msgs)
+                       lyxerr << "Locale " << lang_ << " could not be set" << std::endl;
+#endif
                // CTYPE controls what getmessage thinks what encoding the po file uses
-               string oldCTYPE = setlocale(LC_CTYPE, NULL);
+               char const * lc_ctype = setlocale(LC_CTYPE, NULL);
+               string oldCTYPE = lc_ctype ? lc_ctype : "";
+
                setlocale(LC_CTYPE, lang_.c_str());
-               bindtextdomain(PACKAGE, package().locale_dir().c_str());
+               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 << std::endl;
+               }
                textdomain(PACKAGE);
                const char* msg = gettext(m.c_str());
-               string translated(works ? msg : m);
+               string translated(msg ? msg : m);
                // Some english words have different translations, depending
                // on context. In these cases the original string is
                // augmented by context information (e.g.
@@ -121,7 +157,7 @@ public:
                boost::smatch sub;
                if (regex_match(translated, sub, reg))
                        translated = sub.str(1);
-               setlocale(LC_MESSAGES, oldMSG.c_str());
+               setlocale(LC_MESSAGES, lang.c_str());
                setlocale(LC_CTYPE, oldCTYPE.c_str());
                return translated;
        }