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
This commit is contained in:
Juergen Spitzmueller 2016-10-27 09:59:01 +02:00
parent 9740c36e80
commit 07c82e9f84
5 changed files with 89 additions and 0 deletions

View File

@ -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<string> bll = features.getBabelExclusiveLanguages();
vector<string> pll = features.getPolyglossiaExclusiveLanguages();
if (!bll.empty()) {
docstring langs;
for (vector<string>::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<string>::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.

View File

@ -736,6 +736,42 @@ bool LaTeXFeatures::hasPolyglossiaExclusiveLanguages() const
}
vector<string> LaTeXFeatures::getPolyglossiaExclusiveLanguages() const
{
vector<string> 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<string> LaTeXFeatures::getBabelExclusiveLanguages() const
{
vector<string> 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;

View File

@ -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<std::string> getPolyglossiaExclusiveLanguages() const;
/// A vector of all used languages supported only by babel
std::vector<std::string> getBabelExclusiveLanguages() const;
///
std::string getBabelLanguages() const;
///

View File

@ -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())

View File

@ -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)