X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FMessages.cpp;h=5eee6b7f6d5aa20d29b6d255c6b3adb208ce8cd3;hb=f1ab5dfc5878bc736fd185279a0ef7a185b2d8d8;hp=1e49cc62b368d4ed9d5ba9f33c8df7387ad4a1de;hpb=309ce3bf0cb2c8e53c16e4097f1004ca0371ec78;p=lyx.git diff --git a/src/support/Messages.cpp b/src/support/Messages.cpp index 1e49cc62b3..5eee6b7f6d 100644 --- a/src/support/Messages.cpp +++ b/src/support/Messages.cpp @@ -2,7 +2,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ @@ -14,6 +14,7 @@ #include "support/debug.h" #include "support/docstring.h" #include "support/environment.h" +#include "support/lstrings.h" #include "support/Package.h" #include "support/unicode.h" @@ -21,15 +22,12 @@ #include +# define N_(str) (str) // for marking strings to be translated + using namespace std; namespace lyx { -// Instanciate static member. -string Messages::main_lang_; - -namespace { - void cleanTranslation(docstring & trans) { /* @@ -50,7 +48,6 @@ void cleanTranslation(docstring & trans) } } -} // anonymous } // lyx @@ -63,29 +60,13 @@ void cleanTranslation(docstring & trans) # if HAVE_GETTEXT # include // use the header already in the system *EK* # else -# include "../../intl/libintl.h" +# include "intl/libintl.h" # endif using namespace lyx::support; namespace lyx { -void Messages::setDefaultLanguage() -{ - char * env_lang[5] = {"LANGUAGE", "LC_ALL", "LC_MESSAGES", "LC_MESSAGE", - "LANG"}; - for (size_t i = 0; i != 5; ++i) { - string const lang = getEnv(env_lang[i]); - if (lang.empty()) - continue; - Messages::main_lang_ = lang; - return; - } - // Not found! - LYXERR(Debug::LOCALE, "Default language not found!"); -} - - // This version use the traditional gettext. Messages::Messages(string const & l) : lang_(l), warned_(false) @@ -105,7 +86,7 @@ void Messages::init() int e = errno; if (e) { LYXERR(Debug::LOCALE, "Error code: " << errno << '\n' - << "Directory : " << package().locale_dir().absFilename() << '\n' + << "Directory : " << package().locale_dir().absFileName() << '\n' << "Rtn value : " << c); } @@ -115,9 +96,38 @@ void Messages::init() } textdomain(PACKAGE); +} + + +string Messages::language() const +{ + // get the language from the gmo file + string const test = N_("[[Replace with the code of your language]]"); + string const trans = to_utf8(get(test)); + if (trans == test) { + LYXERR0("Something is weird."); + return string(); + } else + return trans; +} + + +bool Messages::available(string const & c) +{ + static string locale_dir = package().locale_dir().toFilesystemEncoding(); + string code = c; + // this loops at most twice + while (true) { + string const filen = locale_dir + "/" + code + + "/LC_MESSAGES/"PACKAGE".mo"; + if (FileName(filen).isReadableFile()) + return true; + if (contains(code, '_')) + code = token(code, '_', 0); + else return false; + } + return false; - // Reset default language; - setDefaultLanguage(); } @@ -133,11 +143,13 @@ docstring const Messages::get(string const & m) const // The string was not found, use gettext to generate it static string oldLC_ALL; + static string oldLANGUAGE; if (!lang_.empty()) { oldLC_ALL = getEnv("LC_ALL"); // This GNU extension overrides any language locale // wrt gettext. LYXERR(Debug::LOCALE, "Setting LANGUAGE to " << lang_); + oldLANGUAGE = getEnv("LANGUAGE"); if (!setEnv("LANGUAGE", lang_)) LYXERR(Debug::LOCALE, "\t... failed!"); // However, setting LANGUAGE does nothing when the @@ -154,12 +166,18 @@ docstring const Messages::get(string const & m) const #endif } + // FIXME: gettext sometimes "forgets" the ucs4_codeset we set + // in init(), which leads to severe message corruption (#7371) + // We set it again here unconditionally. A real fix must be found! + LASSERT(bind_textdomain_codeset(PACKAGE, ucs4_codeset), /**/); + char const * m_c = m.c_str(); char const * trans_c = gettext(m_c); docstring trans; - if (!trans_c) - LYXERR(Debug::LOCALE, "Undefined result from gettext"); - else if (trans_c == m_c) { + if (!trans_c) { + LYXERR(Debug::LOCALE, "Undefined result from gettext for `" << m << "'."); + trans = from_ascii(m); + } else if (trans_c == m_c) { //LYXERR(Debug::LOCALE, "Same as entered returned"); trans = from_ascii(m); } else { @@ -173,9 +191,10 @@ docstring const Messages::get(string const & m) const // Reset environment variables as they were. if (!lang_.empty()) { // Reset everything as it was. - LYXERR(Debug::LOCALE, "restoring LANGUAGE from " << getEnv("LANGUAGE") - << " to " << main_lang_); - if (!setEnv("LANGUAGE", main_lang_)) + LYXERR(Debug::LOCALE, "restoring LANGUAGE from " + << getEnv("LANGUAGE") + << " to " << oldLANGUAGE); + if (!setEnv("LANGUAGE", oldLANGUAGE)) LYXERR(Debug::LOCALE, "\t... failed!"); LYXERR(Debug::LOCALE, "restoring LC_ALL from " << getEnv("LC_ALL") << " to " << oldLC_ALL); @@ -201,7 +220,7 @@ docstring const Messages::get(string const & m) const namespace lyx { -Messages::Messages(string const & l) {} +Messages::Messages(string const & /* l */) {} void Messages::init() { @@ -215,6 +234,17 @@ docstring const Messages::get(string const & m) const return trans; } +std::string Messages::language() const + { + return string(); + } + +bool Messages::available(string const & c) +{ + (void)c; + return false; +} + } // namespace lyx #endif