From d190ae7787f3d21cb9349f9bca062a8700b0f3c4 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Thu, 27 Oct 2016 09:59:01 +0200 Subject: [PATCH] Issue an error message if conflicting languages are used Some languages are only supported by Babel, some only by Polyglossia. If these are combined, we issue an error message now. Fixes: #10456 --- src/Buffer.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/LaTeXFeatures.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/LaTeXFeatures.h | 4 ++++ src/Language.cpp | 6 ++++++ src/Language.h | 2 ++ status.22x | 3 +++ 6 files changed, 92 insertions(+) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 2f06f18e37..4d3088458f 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1876,6 +1876,47 @@ void Buffer::writeLaTeXSource(otexstream & os, // Write the preamble runparams.use_babel = params().writeLaTeX(os, features, d->filename.onlyPath()); + + if (!runparams.dryrun && features.hasPolyglossiaExclusiveLanguages() + && !features.hasOnlyPolyglossiaLanguages()) { + docstring blangs; + docstring plangs; + vector bll = features.getBabelExclusiveLanguages(); + vector pll = features.getPolyglossiaExclusiveLanguages(); + if (!bll.empty()) { + docstring langs; + for (vector::const_iterator it = bll.begin(); it != bll.end(); ++it) { + if (!langs.empty()) + langs += ", "; + langs += _(*it); + } + blangs = bll.size() > 1 ? + support::bformat(_("The languages %1$s are only supported by Babel."), langs) + : support::bformat(_("The language %1$s is only supported by Babel."), langs); + } + if (!pll.empty()) { + docstring langs; + for (vector::const_iterator it = pll.begin(); it != pll.end(); ++it) { + if (!langs.empty()) + langs += ", "; + langs += _(*it); + } + plangs = pll.size() > 1 ? + support::bformat(_("The languages %1$s are only supported by Polyglossia."), langs) + : support::bformat(_("The language %1$s is only supported by Polyglossia."), langs); + if (!blangs.empty()) + plangs += "\n"; + } + + frontend::Alert::warning( + _("Incompatible Languages!"), + support::bformat( + _("You cannot use the following languages " + "together in one LaTeX document because " + "they require conflicting language packages:\n" + "%1$s%2$s"), + plangs, blangs)); + } // Japanese might be required only in some children of a document, // but once required, we must keep use_japanese true. diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index db2aa74cb7..96f0ced7e8 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -683,6 +683,42 @@ bool LaTeXFeatures::hasPolyglossiaExclusiveLanguages() const } +vector LaTeXFeatures::getPolyglossiaExclusiveLanguages() const +{ + vector result; + // first the main language + if (params_.language->isPolyglossiaExclusive()) + result.push_back(params_.language->display()); + // now the secondary languages + LanguageList::const_iterator const begin = UsedLanguages_.begin(); + for (LanguageList::const_iterator cit = begin; + cit != UsedLanguages_.end(); + ++cit) { + if ((*cit)->isPolyglossiaExclusive()) + result.push_back((*cit)->display()); + } + return result; +} + + +vector LaTeXFeatures::getBabelExclusiveLanguages() const +{ + vector result; + // first the main language + if (params_.language->isBabelExclusive()) + result.push_back(params_.language->display()); + // now the secondary languages + LanguageList::const_iterator const begin = UsedLanguages_.begin(); + for (LanguageList::const_iterator cit = begin; + cit != UsedLanguages_.end(); + ++cit) { + if ((*cit)->isBabelExclusive()) + result.push_back((*cit)->display()); + } + return result; +} + + string LaTeXFeatures::getBabelLanguages() const { ostringstream languages; diff --git a/src/LaTeXFeatures.h b/src/LaTeXFeatures.h index 38273e4fa2..6c3e888b48 100644 --- a/src/LaTeXFeatures.h +++ b/src/LaTeXFeatures.h @@ -122,6 +122,10 @@ public: bool hasOnlyPolyglossiaLanguages() const; /// check if a language is supported only by polyglossia bool hasPolyglossiaExclusiveLanguages() const; + /// A vector of all used languages supported only by polyglossia + std::vector getPolyglossiaExclusiveLanguages() const; + /// A vector of all used languages supported only by babel + std::vector getBabelExclusiveLanguages() const; /// std::string getBabelLanguages() const; /// diff --git a/src/Language.cpp b/src/Language.cpp index dc38bfcf24..760d7a1ba7 100644 --- a/src/Language.cpp +++ b/src/Language.cpp @@ -44,6 +44,12 @@ bool Language::isPolyglossiaExclusive() const } +bool Language::isBabelExclusive() const +{ + return !babel().empty() && polyglossia().empty() && requires().empty(); +} + + docstring const Language::translateLayout(string const & m) const { if (m.empty()) diff --git a/src/Language.h b/src/Language.h index ed1bd8715e..55f4b76f21 100644 --- a/src/Language.h +++ b/src/Language.h @@ -44,6 +44,8 @@ public: std::string const polyglossiaOpts() const { return polyglossia_opts_; } /// Is this language only supported by polyglossia? bool isPolyglossiaExclusive() const; + /// Is this language only supported by babel? + bool isBabelExclusive() const; /// quotation marks style std::string const quoteStyle() const { return quote_style_; } /// requirement (package, function) diff --git a/status.22x b/status.22x index 0a10e6ae28..29a63088bb 100644 --- a/status.22x +++ b/status.22x @@ -47,6 +47,9 @@ What's new - When using Return in an empty paragraph and the depth is reduced, the layout of the paragraph is now changed accordingly. +- Issue an error message if incompatible languages (in terms of language package + requirements) are used (bug 10456). + * DOCUMENTATION AND LOCALIZATION