X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FMessages.cpp;h=5eee6b7f6d5aa20d29b6d255c6b3adb208ce8cd3;hb=f1ab5dfc5878bc736fd185279a0ef7a185b2d8d8;hp=0aa29d84e0290caecd3b0e36e865c0a637c29d51;hpb=58f11263559b0119bae320e4cc5496292da4c387;p=lyx.git diff --git a/src/support/Messages.cpp b/src/support/Messages.cpp index 0aa29d84e0..5eee6b7f6d 100644 --- a/src/support/Messages.cpp +++ b/src/support/Messages.cpp @@ -22,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) { /* @@ -51,7 +48,6 @@ void cleanTranslation(docstring & trans) } } -} // anonymous } // lyx @@ -64,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 const * 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) @@ -116,17 +96,38 @@ void Messages::init() } textdomain(PACKAGE); - - // Reset default language; - setDefaultLanguage(); } -bool Messages::available() const +string Messages::language() const { - string const test = languageTestString(); + // 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)); - return !trans.empty() && trans != 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; + } @@ -165,6 +166,11 @@ 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; @@ -228,10 +234,15 @@ docstring const Messages::get(string const & m) const return trans; } +std::string Messages::language() const + { + return string(); + } -bool Messages::available() const +bool Messages::available(string const & c) { - return true; + (void)c; + return false; } } // namespace lyx