diff --git a/src/Buffer.cpp b/src/Buffer.cpp index df3ae9fb35..f2dbb88840 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1874,6 +1874,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 0650da1b8e..78e31eb93d 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -736,6 +736,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 b136f86020..9fbc134fd4 100644 --- a/src/LaTeXFeatures.h +++ b/src/LaTeXFeatures.h @@ -124,6 +124,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 9801668846..902eab3ad4 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 c26a77d568..594a324253 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)