X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FMessages.cpp;h=5eee6b7f6d5aa20d29b6d255c6b3adb208ce8cd3;hb=f1ab5dfc5878bc736fd185279a0ef7a185b2d8d8;hp=aec3556d20114df4ef462af4bf6f94053217b283;hpb=1c83bf9420f5a533ca1de25db1c937661234292d;p=lyx.git diff --git a/src/support/Messages.cpp b/src/support/Messages.cpp index aec3556d20..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,12 +22,11 @@ #include -using namespace std; +# define N_(str) (str) // for marking strings to be translated -namespace { +using namespace std; -using lyx::docstring; -using lyx::from_ascii; +namespace lyx { void cleanTranslation(docstring & trans) { @@ -48,7 +48,7 @@ void cleanTranslation(docstring & trans) } } -} +} // lyx #ifdef ENABLE_NLS @@ -60,7 +60,7 @@ 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; @@ -86,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); } @@ -99,6 +99,38 @@ void Messages::init() } +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; + +} + + docstring const Messages::get(string const & m) const { if (m.empty()) @@ -110,13 +142,14 @@ docstring const Messages::get(string const & m) const 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"); + 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 @@ -133,13 +166,19 @@ 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) { - LYXERR(Debug::LOCALE, "Same as entered returned"); + 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 { //LYXERR(Debug::LOCALE, "We got a translation"); @@ -152,8 +191,9 @@ 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 " << oldLANGUAGE); + 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") @@ -180,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() { @@ -194,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