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