From 7a892373bfc7dc186024c463889771a33975c68f Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sat, 9 Mar 2019 12:00:40 +0100 Subject: [PATCH] Do not use GUI language for shortcut info inset if no translation is available Fixes: #11508 Now there is the opposite case which needs to be addressed: If no translation is available for a shortcut in a non-latin-scripted document, we need to switch the language to English. --- src/KeyMap.cpp | 7 +-- src/KeyMap.h | 3 +- src/KeySequence.cpp | 6 +-- src/KeySequence.h | 2 +- src/frontends/KeySymbol.h | 2 +- src/frontends/qt4/GuiKeySymbol.cpp | 5 +- src/insets/InsetInfo.cpp | 79 +++++++++++++++++++++--------- 7 files changed, 70 insertions(+), 34 deletions(-) diff --git a/src/KeyMap.cpp b/src/KeyMap.cpp index af5f5b8223..e18fb74e7e 100644 --- a/src/KeyMap.cpp +++ b/src/KeyMap.cpp @@ -476,7 +476,8 @@ docstring const KeyMap::print(bool forgui) const docstring KeyMap::printBindings(FuncRequest const & func, - KeySequence::outputFormat format) const + KeySequence::outputFormat format, + bool const untranslated) const { Bindings bindings = findBindings(func); if (bindings.empty()) @@ -486,10 +487,10 @@ docstring KeyMap::printBindings(FuncRequest const & func, Bindings::const_iterator cit = bindings.begin(); Bindings::const_iterator cit_end = bindings.end(); // print the first item - res << cit->print(format); + res << cit->print(format, untranslated); // more than one shortcuts? for (++cit; cit != cit_end; ++cit) - res << ", " << cit->print(format); + res << ", " << cit->print(format, untranslated); return res.str(); } diff --git a/src/KeyMap.h b/src/KeyMap.h index 95a5f61c5e..849ba0cdad 100644 --- a/src/KeyMap.h +++ b/src/KeyMap.h @@ -118,7 +118,8 @@ public: /// Given an action, print the keybindings. docstring printBindings(FuncRequest const & func, - KeySequence::outputFormat format) const; + KeySequence::outputFormat format, + bool const untranslated = false) const; struct Binding { Binding(FuncRequest const & r, KeySequence const & s, ItemType t) diff --git a/src/KeySequence.cpp b/src/KeySequence.cpp index c80490f38f..f1530c8866 100644 --- a/src/KeySequence.cpp +++ b/src/KeySequence.cpp @@ -133,7 +133,7 @@ size_t KeySequence::parse(string const & s) } -docstring const KeySequence::print(outputFormat format) const +docstring const KeySequence::print(outputFormat format, bool const untranslated) const { docstring buf; @@ -142,10 +142,10 @@ docstring const KeySequence::print(outputFormat format) const for (size_t i = 0; i != length; ++i) { switch (format) { case Portable: - buf += sequence[i].print(modifiers[i].first, false); + buf += sequence[i].print(modifiers[i].first, false, untranslated); break; case ForGui: - buf += sequence[i].print(modifiers[i].first, true); + buf += sequence[i].print(modifiers[i].first, true, untranslated); break; case BindFile: KeyModifier mod = modifiers[i].first; diff --git a/src/KeySequence.h b/src/KeySequence.h index cae65d536f..444fb08719 100644 --- a/src/KeySequence.h +++ b/src/KeySequence.h @@ -72,7 +72,7 @@ public: * @param format output format * @see parse() */ - docstring const print(outputFormat format) const; + docstring const print(outputFormat format, bool const untranslated = false) const; /** * Return the current sequence and available options as diff --git a/src/frontends/KeySymbol.h b/src/frontends/KeySymbol.h index 6f9b0645f1..cdb5f8f3a1 100644 --- a/src/frontends/KeySymbol.h +++ b/src/frontends/KeySymbol.h @@ -56,7 +56,7 @@ public: * Use the native UI format when \c forgui is true. * i.e. (translated and with special characters for Mac OS X) */ - docstring const print(KeyModifier mod, bool forgui) const; + docstring const print(KeyModifier mod, bool forgui, bool untranslated = false) const; /// int key() const { return key_; } diff --git a/src/frontends/qt4/GuiKeySymbol.cpp b/src/frontends/qt4/GuiKeySymbol.cpp index a01682cae2..6f496ecea1 100644 --- a/src/frontends/qt4/GuiKeySymbol.cpp +++ b/src/frontends/qt4/GuiKeySymbol.cpp @@ -686,7 +686,7 @@ char_type KeySymbol::getUCSEncoded() const } -docstring const KeySymbol::print(KeyModifier mod, bool forgui) const +docstring const KeySymbol::print(KeyModifier mod, bool forgui, bool untranslated) const { int tmpkey = key_; @@ -703,7 +703,8 @@ docstring const KeySymbol::print(KeyModifier mod, bool forgui) const QString str; if (forgui) - str = seq.toString(QKeySequence::NativeText); + str = untranslated ? seq.toString(QKeySequence::PortableText) + : seq.toString(QKeySequence::NativeText); else { #ifdef Q_OS_MAC // Qt/Mac does not use Command and friends in the diff --git a/src/insets/InsetInfo.cpp b/src/insets/InsetInfo.cpp index d6c68ed6b2..f9309c118c 100644 --- a/src/insets/InsetInfo.cpp +++ b/src/insets/InsetInfo.cpp @@ -167,6 +167,12 @@ set getTexFileList(string const & filename) // remove duplicates return list; } + +bool translateString(docstring const in, docstring & out, string const lcode) +{ + out = translateIfPossible(in, lcode); + return in != out; +} } // namespace anon @@ -710,15 +716,21 @@ void InsetInfo::setInfo(string const & name) void InsetInfo::error(docstring const & err, Language const * lang) { - setText(bformat(translateIfPossible(err, lang->code()), from_utf8(params_.name)), - Font(inherit_font, lang), false); + docstring const res = translateIfPossible(err, lang->code()); + bool const translated = res != err; + // If the string is not translated, we use default lang (English) + Font const f = translated ? Font(inherit_font, lang) : Font(inherit_font); + setText(bformat(res, from_utf8(params_.name)), f, false); } void InsetInfo::info(docstring const & err, Language const * lang) { - setText(translateIfPossible(err, lang->code()), - Font(inherit_font, lang), false); + docstring const res = translateIfPossible(err, lang->code()); + bool const translated = res != err; + // If the string is not translated, we use default lang (English) + Font const f = translated ? Font(inherit_font, lang) : Font(inherit_font); + setText(translateIfPossible(err, lang->code()), f, false); } @@ -774,84 +786,105 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) { break; } docstring sequence; - if (params_.type == InsetInfoParams::SHORTCUT_INFO) + docstring seq_untranslated; + if (params_.type == InsetInfoParams::SHORTCUT_INFO) { sequence = bindings.begin()->print(KeySequence::ForGui); - else + seq_untranslated = bindings.begin()->print(KeySequence::ForGui, true); + } else { sequence = theTopLevelKeymap().printBindings(func, KeySequence::ForGui); + seq_untranslated = theTopLevelKeymap().printBindings(func, KeySequence::ForGui, true); + } // QKeySequence returns special characters for keys on the mac // Since these are not included in many fonts, we // re-translate them to textual names (see #10641) odocstringstream ods; string const lcode = params_.lang->code(); + docstring trans; + bool is_translated = sequence != seq_untranslated; for (size_t n = 0; n < sequence.size(); ++n) { char_type const c = sequence[n]; switch(c) { case 0x21b5://Return gui = _("Return[[Key]]"); - ods << translateIfPossible(from_ascii("Return[[Key]]"), lcode); + is_translated = translateString(from_ascii("Return[[Key]]"), trans, lcode); + ods << trans; break; case 0x21b9://Tab both directions (Win) gui = _("Tab[[Key]]"); - ods << translateIfPossible(from_ascii("Tab[[Key]]"), lcode); + is_translated = translateString(from_ascii("Tab[[Key]]"), trans, lcode); + ods << trans; break; case 0x21de://Qt::Key_PageUp gui = _("PgUp"); - ods << translateIfPossible(from_ascii("PgUp"), lcode); + is_translated = translateString(from_ascii("PgUp"), trans, lcode); + ods << trans; break; case 0x21df://Qt::Key_PageDown gui = _("PgDown"); - ods << translateIfPossible(from_ascii("PgDown"), lcode); + is_translated = translateString(from_ascii("PgDown"), trans, lcode); + ods << trans; break; case 0x21e4://Qt::Key_Backtab gui = _("Backtab"); - ods << translateIfPossible(from_ascii("Backtab"), lcode); + is_translated = translateString(from_ascii("Backtab"), trans, lcode); + ods << trans; break; case 0x21e5://Qt::Key_Tab gui = _("Tab"); - ods << translateIfPossible(from_ascii("Tab"), lcode); + is_translated = translateString(from_ascii("Tab"), trans, lcode); + ods << trans; break; case 0x21e7://Shift gui = _("Shift"); - ods << translateIfPossible(from_ascii("Shift"), lcode); + is_translated = translateString(from_ascii("Shift"), trans, lcode); + ods << trans; break; case 0x21ea://Qt::Key_CapsLock gui = _("CapsLock"); - ods << translateIfPossible(from_ascii("CapsLock"), lcode); + is_translated = translateString(from_ascii("CapsLock"), trans, lcode); + ods << trans; break; case 0x2303://Control gui = _("Control[[Key]]"); - ods << translateIfPossible(from_ascii("Control[[Key]]"), lcode); + is_translated = translateString(from_ascii("Control[[Key]]"), trans, lcode); + ods << trans; break; case 0x2318://CMD gui = _("Command[[Key]]"); - ods << translateIfPossible(from_ascii("Command[[Key]]"), lcode); + is_translated = translateString(from_ascii("Command[[Key]]"), trans, lcode); + ods << trans; break; case 0x2324://Qt::Key_Enter gui = _("Return[[Key]]"); - ods << translateIfPossible(from_ascii("Return[[Key]]"), lcode); + is_translated = translateString(from_ascii("Return[[Key]]"), trans, lcode); + ods << trans; break; case 0x2325://Option key gui = _("Option[[Key]]"); - ods << translateIfPossible(from_ascii("Option[[Key]]"), lcode); + is_translated = translateString(from_ascii("Option[[Key]]"), trans, lcode); + ods << trans; break; case 0x2326://Qt::Key_Delete gui = _("Delete[[Key]]"); - ods << translateIfPossible(from_ascii("Delete[[Key]]"), lcode); + is_translated = translateString(from_ascii("Delete[[Key]]"), trans, lcode); + ods << trans; break; case 0x232b://Qt::Key_Backspace gui = _("Fn+Del"); - ods << translateIfPossible(from_ascii("Fn+Delete"), lcode); + is_translated = translateString(from_ascii("Fn+Del"), trans, lcode); + ods << trans; break; case 0x238b://Qt::Key_Escape gui = _("Esc"); - ods << translateIfPossible(from_ascii("Esc"), lcode); + is_translated = translateString(from_ascii("Esc"), trans, lcode); + ods << trans; break; default: ods.put(c); } } - setText(ods.str(), guilang); - params_.force_ltr = !guilang->rightToLeft() && !params_.lang->rightToLeft(); + setText(ods.str(), is_translated ? guilang : nullptr); + params_.force_ltr = !is_translated || (!guilang->rightToLeft() && !params_.lang->rightToLeft()); break; } case InsetInfoParams::LYXRC_INFO: { -- 2.39.5