]> git.lyx.org Git - lyx.git/blobdiff - src/messages.C
bug 2298: cursorTop/Bottom/Home/End does not redraw after dEPM
[lyx.git] / src / messages.C
index 7c9db6142bd1c0bdf1c84f01198935838664e532..989bb9a0d0c5b84bd0b48d0948d2105cbe455be9 100644 (file)
 #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;
@@ -86,8 +89,10 @@ public:
        Pimpl(string const & l)
                : lang_(l)
        {
-               if ( lang_.empty() )
-                       lang_ = setlocale(LC_MESSAGES, NULL);
+               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);
@@ -102,7 +107,6 @@ public:
                if (m.empty())
                        return m;
 
-               //string oldMSG = setlocale(LC_MESSAGES, NULL);
                // In this order, see support/filetools.C:
                string lang = getEnv("LC_ALL");
                if (lang.empty()) {
@@ -114,9 +118,23 @@ public:
                        }
                }
                
-               char const * works = setlocale(LC_MESSAGES, lang_.c_str());
+               char const * lc_msgs = setlocale(LC_MESSAGES, lang_.c_str());
+               // setlocale fails (returns NULL) if the corresponding locale
+               // is not installed.
+               // On windows (mingw) it always returns NULL.
+               // Since this method gets called for every translatable
+               // buffer string like e.g. "Figure:" we warn only once.
+#ifndef _WIN32
+               static bool warned = false;
+               if (!warned && !lc_msgs) {
+                       warned = true;
+                       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());
                errno = 0;
                char const * c = bindtextdomain(PACKAGE, package().locale_dir().c_str());
@@ -131,7 +149,7 @@ public:
                }
                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.