]> git.lyx.org Git - lyx.git/commitdiff
Do not use GUI language for shortcut info inset if no translation is available
authorJuergen Spitzmueller <spitz@lyx.org>
Sat, 9 Mar 2019 11:00:40 +0000 (12:00 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Sat, 9 Mar 2019 11:00:40 +0000 (12:00 +0100)
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
src/KeyMap.h
src/KeySequence.cpp
src/KeySequence.h
src/frontends/KeySymbol.h
src/frontends/qt4/GuiKeySymbol.cpp
src/insets/InsetInfo.cpp

index af5f5b8223eaf1c685bb7654c6672b606a010123..e18fb74e7e4299ca221449d42ea5e65c7c57a590 100644 (file)
@@ -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();
 }
 
index 95a5f61c5e996ff68e7cc2b3ce18035d6b86703e..849ba0cdad6ee5f089a0ff1b478cb76128a0fe1d 100644 (file)
@@ -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)
index c80490f38fafa03f72f6a7183554157128a9bfed..f1530c886686370a916fdd6c87cfd56a13865ca5 100644 (file)
@@ -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;
index cae65d536fcea8f091fac214d2d8c31581ec4409..444fb0871975095d14a8be5b59fb1762602e61a0 100644 (file)
@@ -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
index 6f9b0645f1412f95d8ffd1e7030f2cd519c8a17b..cdb5f8f3a111573005143faf302b1f30583b9ad7 100644 (file)
@@ -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_; }
index a01682cae2ed36d1f191cf0a3b52fc574558eb4c..6f496ecea119cd068f389d6cf79a1df1af224e28 100644 (file)
@@ -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
index d6c68ed6b2eaf3b93af4ea8d3260a3fc6a0fb952..f9309c118c9a4ee9f7b1f426f2d5f2d78b89795c 100644 (file)
@@ -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: {