X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLanguage.cpp;h=e588218047aea9c790753aa0d94b1a118188bd99;hb=1e190a2af27ca99831f51567c16e6b39bf4317c3;hp=39c6efda93d6209ef978c0dac5800ad8cbef9ef2;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/Language.cpp b/src/Language.cpp index 39c6efda93..e588218047 100644 --- a/src/Language.cpp +++ b/src/Language.cpp @@ -3,8 +3,9 @@ * 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 * \author Jean-Marc Lasgouttes + * \author Jürgen Spitzmüller * \author Dekel Tsur * * Full author contact details are available in file CREDITS. @@ -14,98 +15,214 @@ #include "Language.h" -#include "support/debug.h" #include "Encoding.h" #include "Lexer.h" #include "LyXRC.h" +#include "support/debug.h" #include "support/FileName.h" +#include "support/lstrings.h" +#include "support/Messages.h" -#include - -using std::endl; -using std::string; +using namespace std; +using namespace lyx::support; namespace lyx { - Languages languages; -Language const * english_language; +Language ignore_lang; +Language latex_lang; Language const * default_language; -Language ignore_lang("ignore", "ignore", "Ignore", false, "", 0, "ignore", ""); Language const * ignore_language = &ignore_lang; -Language latex_lang("latex", "", "Latex", false, "", 0, "latex", ""); Language const * latex_language = &latex_lang; +Language const * reset_language = 0; + + +bool Language::readLanguage(Lexer & lex) +{ + enum LanguageTags { + LA_AS_BABELOPTS = 1, + LA_BABELNAME, + LA_ENCODING, + LA_END, + LA_GUINAME, + LA_INTERNAL_ENC, + LA_LANG_CODE, + LA_LANG_VARIETY, + LA_POLYGLOSSIANAME, + LA_POLYGLOSSIAOPTS, + LA_POSTBABELPREAMBLE, + LA_PREBABELPREAMBLE, + LA_RTL + }; + + // Keep these sorted alphabetically! + LexerKeyword languageTags[] = { + { "asbabeloptions", LA_AS_BABELOPTS }, + { "babelname", LA_BABELNAME }, + { "encoding", LA_ENCODING }, + { "end", LA_END }, + { "guiname", LA_GUINAME }, + { "internalencoding", LA_INTERNAL_ENC }, + { "langcode", LA_LANG_CODE }, + { "langvariety", LA_LANG_VARIETY }, + { "polyglossianame", LA_POLYGLOSSIANAME }, + { "polyglossiaopts", LA_POLYGLOSSIAOPTS }, + { "postbabelpreamble", LA_POSTBABELPREAMBLE }, + { "prebabelpreamble", LA_PREBABELPREAMBLE }, + { "rtl", LA_RTL } + }; + + bool error = false; + bool finished = false; + lex.pushTable(languageTags); + // parse style section + while (!finished && lex.isOK() && !error) { + int le = lex.lex(); + // See comment in LyXRC.cpp. + switch (le) { + case Lexer::LEX_FEOF: + continue; + + case Lexer::LEX_UNDEF: // parse error + lex.printError("Unknown language tag `$$Token'"); + error = true; + continue; + + default: + break; + } + switch (static_cast(le)) { + case LA_END: // end of structure + finished = true; + break; + case LA_AS_BABELOPTS: + lex >> as_babel_options_; + break; + case LA_BABELNAME: + lex >> babel_; + break; + case LA_POLYGLOSSIANAME: + lex >> polyglossia_name_; + break; + case LA_POLYGLOSSIAOPTS: + lex >> polyglossia_opts_; + break; + case LA_ENCODING: + lex >> encodingStr_; + break; + case LA_GUINAME: + lex >> display_; + break; + case LA_INTERNAL_ENC: + lex >> internal_enc_; + break; + case LA_LANG_CODE: + lex >> code_; + break; + case LA_LANG_VARIETY: + lex >> variety_; + break; + case LA_POSTBABELPREAMBLE: + babel_postsettings_ = + lex.getLongString("EndPostBabelPreamble"); + break; + case LA_PREBABELPREAMBLE: + babel_presettings_ = + lex.getLongString("EndPreBabelPreamble"); + break; + case LA_RTL: + lex >> rightToLeft_; + break; + } + } + lex.popTable(); + return finished && !error; +} -void Languages::read(support::FileName const & filename) +bool Language::read(Lexer & lex) { - // We need to set the encoding of latex_lang - latex_lang = Language("latex", "", "Latex", false, "iso8859-1", - encodings.getFromLyXName("iso8859-1"), - "latex", ""); + as_babel_options_ = 0; + encoding_ = 0; + internal_enc_ = 0; + rightToLeft_ = 0; + + if (!lex.next()) { + lex.printError("No name given for language: `$$Token'."); + return false; + } - Lexer lex(0, 0); + lang_ = lex.getString(); + LYXERR(Debug::INFO, "Reading language " << lang_); + if (!readLanguage(lex)) { + LYXERR0("Error parsing language `" << lang_ << '\''); + return false; + } + + encoding_ = encodings.fromLyXName(encodingStr_); + if (!encoding_ && !encodingStr_.empty()) { + encoding_ = encodings.fromLyXName("iso8859-1"); + LYXERR0("Unknown encoding " << encodingStr_); + } + // cache translation status. Calling getMessages() directly in + // PrefLanguage::PrefLanguage() did only work if the gui language + // was set to auto (otherwise all languages would be marked as available). + translated_ = getMessages(code()).available(); + return true; +} + +void Languages::read(FileName const & filename) +{ + Lexer lex; lex.setFile(filename); + lex.setContext("Languages::read"); while (lex.isOK()) { - string lang; - string babel; - string display; - string encoding_str; - string code; - string latex_options; - bool rtl = false; - - if (lex.next()) - lang = lex.getString(); - else + int le = lex.lex(); + switch (le) { + case Lexer::LEX_FEOF: + continue; + + default: break; - LYXERR(Debug::INFO, "Reading language " << lang); - - if (lex.next()) - babel = lex.getString(); - if (lex.next()) - display = lex.getString(); - if (lex.next()) - rtl = lex.getBool(); - if (lex.next()) - encoding_str = lex.getString(); - if (lex.next()) - code = lex.getString(); - if (lex.next()) - latex_options = lex.getString(); - - Encoding const * encoding = encodings.getFromLyXName(encoding_str); - if (!encoding) { - encoding = encodings.getFromLyXName("iso8859-1"); - lyxerr << "Unknown encoding " << encoding_str << endl; } - - languagelist[lang] = Language(lang, babel, display, rtl, - encoding_str, encoding, code, latex_options); + if (lex.getString() != "Language") { + lex.printError("Unknown Language tag `$$Token'"); + continue; + } + Language l; + l.read(lex); + if (!lex) + break; + if (l.lang() == "latex") + latex_lang = l; + else if (l.lang() == "ignore") + ignore_lang = l; + else + languagelist[l.lang()] = l; } default_language = getLanguage(lyxrc.default_language); if (!default_language) { - lyxerr << "Default language \"" << lyxrc.default_language - << "\" not found!" << endl; + LYXERR0("Default language \"" << lyxrc.default_language + << "\" not found!"); default_language = getLanguage("english"); if (!default_language) default_language = &(*languagelist.begin()).second; - lyxerr << "Using \"" << default_language->lang() - << "\" instead!" << endl; + LYXERR0("Using \"" << default_language->lang() << "\" instead!"); } - english_language = getLanguage("english"); - if (!english_language) - english_language = default_language; } Language const * Languages::getLanguage(string const & language) const { + if (language == "reset") + return reset_language; + if (language == "ignore") + return ignore_language; const_iterator it = languagelist.find(language); - return it == languagelist.end() ? 0 : &it->second; + return it == languagelist.end() ? reset_language : &it->second; }