X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FMessages.cpp;h=66b974cfa16bfb4b291f048548c85e8ea42b2036;hb=58ab972f714309aa87e7d956ceda00e18337875f;hp=6ecfba322871765687c7dbee21c130e911d42120;hpb=138b23fac84930cdbfada0067c61480989041113;p=lyx.git diff --git a/src/Messages.cpp b/src/Messages.cpp index 6ecfba3228..66b974cfa1 100644 --- a/src/Messages.cpp +++ b/src/Messages.cpp @@ -56,13 +56,6 @@ using support::setEnv; Messages::Messages(string const & l) : lang_(l), warned_(false) { - if ( lang_.empty() ) { - char const * lc_msgs = 0; -#ifdef HAVE_LC_MESSAGES - lc_msgs = setlocale(LC_MESSAGES, NULL); -#endif - 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); @@ -71,68 +64,62 @@ Messages::Messages(string const & l) } -docstring const Messages::get(string const & m) const +void Messages::init() { - if (m.empty()) - return docstring(); - - // Look for the translated string in the cache. - TranslationCache::iterator it = cache_.find(m); - if (it != cache_.end()) - return it->second; - // The string was not found, use gettext to generate it: - - // In this order, see support/filetools.cpp: - string lang = getEnv("LC_ALL"); - if (lang.empty()) { - lang = getEnv("LC_MESSAGES"); - if (lang.empty()) { - lang = getEnv("LANG"); - if (lang.empty()) - lang = "C"; - } - } -#ifdef HAVE_LC_MESSAGES - char const * lc_msgs = setlocale(LC_MESSAGES, lang_.c_str()); -#endif - // setlocale fails (returns NULL) if the corresponding locale - // is not installed. - // On windows (mingw and cygwin) it always returns NULL. - // Since this method gets called for every translatable - // buffer string like e.g. "Figure:" we warn only once. -#if !defined(_WIN32) && !defined(__CYGWIN__) - if (!warned_ && !lc_msgs) { - warned_ = true; - lyxerr << "Locale " << lang_ << " could not be set" << endl; - } -#endif - // CTYPE controls what getmessage thinks what encoding the po file uses - char const * lc_ctype = setlocale(LC_CTYPE, NULL); - string oldCTYPE = lc_ctype ? lc_ctype : ""; - - setlocale(LC_CTYPE, lang_.c_str()); errno = 0; string const locale_dir = package().locale_dir().toFilesystemEncoding(); char const * c = bindtextdomain(PACKAGE, locale_dir.c_str()); int e = errno; if (e) { LYXERR(Debug::DEBUG) - << BOOST_CURRENT_FUNCTION << '\n' + << BOOST_CURRENT_FUNCTION << '\n' << "Error code: " << errno << '\n' - << "Lang, mess: " << lang_ << " " << m << '\n' << "Directory : " << package().locale_dir().absFilename() << '\n' << "Rtn value : " << c << endl; } if (!bind_textdomain_codeset(PACKAGE, ucs4_codeset)) { LYXERR(Debug::DEBUG) - << BOOST_CURRENT_FUNCTION << '\n' + << BOOST_CURRENT_FUNCTION << '\n' << "Error code: " << errno << '\n' << "Codeset : " << ucs4_codeset << '\n' << endl; } textdomain(PACKAGE); +} + + +docstring const Messages::get(string const & m) const +{ + if (m.empty()) + return docstring(); + + // Look for the translated string in the cache. + TranslationCache::iterator it = cache_.find(m); + if (it != cache_.end()) + return it->second; + + // The string was not found, use gettext to generate it + + string const oldLANGUAGE = getEnv("LANGUAGE"); + string const oldLC_ALL = getEnv("LC_ALL"); + if (!lang_.empty()) { + // This GNU extension overrides any language locale + // wrt gettext. + setEnv("LANGUAGE", lang_); + // However, setting LANGUAGE does nothing when the + // locale is "C". Therefore we set the locale to + // something that is believed to exist on most + // systems. The idea is that one should be able to + // load German documents even without having de_DE + // installed. + setEnv("LC_ALL", "en_US"); +#ifdef HAVE_LC_MESSAGES + setlocale(LC_MESSAGES, ""); +#endif + } + char const * tmp = m.c_str(); char const * msg = gettext(tmp); docstring translated; @@ -158,15 +145,20 @@ docstring const Messages::get(string const & m) const translated = from_ascii(tmp); } else { LYXERR(Debug::DEBUG) << "We got a translation" << endl; - char_type const * ucs4 = reinterpret_cast(msg); - translated = ucs4; + // m is actually not a char const * but ucs4 data + translated = reinterpret_cast(msg); } + + if (!lang_.empty()) { + // Reset everything as it was. + setEnv("LANGUAGE", oldLANGUAGE); + setEnv("LC_ALL", oldLC_ALL); #ifdef HAVE_LC_MESSAGES - setlocale(LC_MESSAGES, lang.c_str()); + setlocale(LC_MESSAGES, ""); #endif - setlocale(LC_CTYPE, oldCTYPE.c_str()); + } - std::pair result = + std::pair result = cache_.insert(std::make_pair(m, translated)); BOOST_ASSERT(result.second); @@ -188,6 +180,10 @@ namespace lyx { Messages::Messages(string const & l) {} +void Messages::init() +{ +} + docstring const Messages::get(string const & m) const {