commit 55c9bc218a0dac64d9df1d24532453194f8e9674
Author: Juergen Spitzmueller <[email protected]>
Date: Sat Mar 9 12:00:40 2019 +0100
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 af5f5b8..e18fb74 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 95a5f61..849ba0c 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 c80490f..f1530c8 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 cae65d5..444fb08 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 6f9b064..cdb5f8f 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 a01682c..6f496ec 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 d6c68ed..f9309c1 100644
--- a/src/insets/InsetInfo.cpp
+++ b/src/insets/InsetInfo.cpp
@@ -167,6 +167,12 @@ set<string> 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: {