Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


Hi,

I've fixed my introduced regression:

on master: http://cgit.freedesktop.org/libreoffice/core/commit/?id=76dcd76509ec0b2078a95f282e09696a8e91cbb0

And with these two attachments for 3-5 and 3-6 branch. Would be nice if someone could check and sign it.

Thomas
From cba811c7b8b50e04236ee9022d0ca94c0b8cd7ad Mon Sep 17 00:00:00 2001
From: Thomas Arnhold <thomas@arnhold.org>
Date: Mon, 4 Jun 2012 18:21:58 +0200
Subject: [PATCH] fdo#50415 and fdo#34638 Fix Shortcut names are not localized
 on Linux

This partially reverts commit 2233aa52da14ec85331aee1163b885fe9a9fb507

Before the keyboard name was used to determine the target language
for translation of UI shortcuts. With this patch the UI locale
is used to determine the language.

Related to:
- 8d9e2d9a211f710e91ac7c607fea25895282d245
- 04b9c2f633f0be1b676933943bdd0b1dc58b5471

Change-Id: I14c6759dc405db490d210a78ce19e1416efb7ac7
---
 vcl/Library_vclplug_gen.mk          |    1 +
 vcl/inc/unx/saldisp.hxx             |    9 +
 vcl/unx/generic/app/keysymnames.cxx |  372 +++++++++++++++++++++++++++++++++++
 vcl/unx/generic/app/saldisp.cxx     |   21 +-
 4 files changed, 396 insertions(+), 7 deletions(-)
 create mode 100644 vcl/unx/generic/app/keysymnames.cxx

diff --git a/vcl/Library_vclplug_gen.mk b/vcl/Library_vclplug_gen.mk
index 3ff257a..c018a9d 100644
--- a/vcl/Library_vclplug_gen.mk
+++ b/vcl/Library_vclplug_gen.mk
@@ -73,6 +73,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_gen,\
     vcl/unx/generic/app/i18n_status \
     vcl/unx/generic/app/i18n_wrp \
     vcl/unx/generic/app/i18n_xkb \
+    vcl/unx/generic/app/keysymnames \
     vcl/unx/generic/app/randrwrapper \
     vcl/unx/generic/app/saldata \
     vcl/unx/generic/app/saldisp \
diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx
index fce2a68..c83b42b 100644
--- a/vcl/inc/unx/saldisp.hxx
+++ b/vcl/inc/unx/saldisp.hxx
@@ -434,6 +434,15 @@ public:
     void                SetupInput( SalI18N_InputMethod *pInputMethod );
 };
 
+
+// get foreign key names
+namespace vcl_sal {
+    rtl::OUString getKeysymReplacementName(
+        rtl::OUString pLang,
+        KeySym nSymbol );
+}
+
+
 #endif // _SV_SALDISP_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/app/keysymnames.cxx b/vcl/unx/generic/app/keysymnames.cxx
new file mode 100644
index 0000000..bc1d705
--- /dev/null
+++ b/vcl/unx/generic/app/keysymnames.cxx
@@ -0,0 +1,372 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined(SOLARIS) && !defined(AIX)
+#include <tools/prex.h>
+#include <X11/XKBlib.h>
+#include <tools/postx.h>
+#endif
+
+#include <unx/saldisp.hxx>
+#include <X11/keysym.h>
+#include <sal/macros.h>
+
+#if !defined (SunXK_Undo)
+#define SunXK_Undo      0x0000FF65  // XK_Undo
+#define SunXK_Again     0x0000FF66  // XK_Redo
+#define SunXK_Find      0x0000FF68  // XK_Find
+#define SunXK_Stop      0x0000FF69  // XK_Cancel
+#define SunXK_Props     0x1005FF70
+#define SunXK_Front     0x1005FF71
+#define SunXK_Copy      0x1005FF72
+#define SunXK_Open      0x1005FF73
+#define SunXK_Paste     0x1005FF74
+#define SunXK_Cut       0x1005FF75
+#endif
+
+#include <string.h>
+#include <rtl/ustring.hxx>
+
+namespace vcl_sal {
+
+    struct KeysymNameReplacement
+    {
+        KeySym          aSymbol;
+        const char*     pName;
+    };
+
+    struct KeyboardReplacements
+    {
+        const char*                     pLangName;
+        const KeysymNameReplacement*    pReplacements;
+        int                             nReplacements;
+    };
+
+    // ====================================================================
+    //
+    // CAUTION CAUTION CAUTION
+    // every string value in the replacements tables must be in UTF8
+    // be careful with your editor !
+    //
+    // ====================================================================
+
+    static const struct KeysymNameReplacement aImplReplacements_English[] =
+    {
+        { XK_Control_L, "Ctrl" },
+        { XK_Control_R, "Ctrl" },
+        { XK_Escape, "Esc" },
+        { XK_space, "Space" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Turkish[] =
+    {
+        { XK_Control_L, "Ctrl" },
+        { XK_Control_R, "Ctrl" },
+        { XK_Right, "Sağ" },
+        { XK_Left, "Sol" },
+        { XK_Up, "Yukarı" },
+        { XK_Down, "Aşağı" },
+        { XK_space, "Boşluk" }
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Russian[] =
+    {
+        { XK_Right, "Вправо" },
+        { XK_Left, "Влево" },
+        { XK_Up, "Вверх" },
+        { XK_Down, "Вниз" },
+        { XK_space, "Пробел" }
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_German[] =
+    {
+        { XK_Control_L, "Strg" },
+        { XK_Control_R, "Strg" },
+        { XK_Shift_L, "Umschalt" },
+        { XK_Shift_R, "Umschalt" },
+        { XK_Alt_L, "Alt" },
+        { XK_Alt_R, "Alt Gr" },
+        { XK_Page_Up, "Bild auf" },
+        { XK_Page_Down, "Bild ab" },
+        { XK_End, "Ende" },
+        { XK_Home, "Pos 1" },
+        { XK_Insert, "Einfg" },
+        { XK_Delete, "Entf" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Rechts" },
+        { XK_Left, "Links" },
+        { XK_Up, "Oben" },
+        { XK_Down, "Unten" },
+        { XK_BackSpace, "Rückschritt" },
+        { XK_Return, "Eingabe" },
+        { XK_slash, "Schrägstrich" },
+        { XK_space, "Leertaste" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Wiederholen" },
+        { SunXK_Props, "Eigenschaften" },
+        { SunXK_Undo,  "Zurücknehmen" },
+        { SunXK_Front, "Vordergrund" },
+        { SunXK_Copy,  "Kopieren" },
+        { SunXK_Open,  "Öffnen" },
+        { SunXK_Paste, "Einsetzen" },
+        { SunXK_Find,  "Suchen" },
+        { SunXK_Cut,   "Ausschneiden" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_French[] =
+    {
+        { XK_Shift_L, "Maj" },
+        { XK_Shift_R, "Maj" },
+        { XK_Page_Up, "Pg. Préc" },
+        { XK_Page_Down, "Pg. Suiv" },
+        { XK_End, "Fin" },
+        { XK_Home, "Origine" },
+        { XK_Insert, "Insérer" },
+        { XK_Delete, "Suppr" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Droite" },
+        { XK_Left, "Gauche" },
+        { XK_Up, "Haut" },
+        { XK_Down, "Bas" },
+        { XK_BackSpace, "Ret. Arr" },
+        { XK_Return, "Retour" },
+        { XK_KP_Enter, "Entrée" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Encore" },
+        { SunXK_Props, "Props" },
+        { SunXK_Undo,  "Annuler" },
+        { SunXK_Front, "Devant" },
+        { SunXK_Copy,  "Copy" },
+        { SunXK_Open,  "Ouvrir" },
+        { SunXK_Paste, "Coller" },
+        { SunXK_Find,  "Cher." },
+        { SunXK_Cut,   "Couper" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Italian[] =
+    {
+        { XK_Shift_L, "Maiusc" },
+        { XK_Shift_R, "Maiusc" },
+        { XK_Page_Up, "PgSu" },
+        { XK_Page_Down, "PgGiu" },
+        { XK_End, "Fine" },
+        { XK_Insert, "Ins" },
+        { XK_Delete, "Canc" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "A destra" },
+        { XK_Left, "A sinistra" },
+        { XK_Up, "Sposta verso l'alto" },
+        { XK_Down, "Sposta verso il basso" },
+        { XK_BackSpace, "Backspace" },
+        { XK_Return, "Invio" },
+        { XK_space, "Spazio" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Ancora" },
+        { SunXK_Props, "Proprietà" },
+        { SunXK_Undo,  "Annulla" },
+        { SunXK_Front, "Davanti" },
+        { SunXK_Copy,  "Copia" },
+        { SunXK_Open,  "Apri" },
+        { SunXK_Paste, "Incolla" },
+        { SunXK_Find,  "Trova" },
+        { SunXK_Cut,   "Taglia" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Dutch[] =
+    {
+        { XK_Page_Up, "PageUp" },
+        { XK_Page_Down, "PageDown" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Rechts" },
+        { XK_Left, "Links" },
+        { XK_Up, "Boven" },
+        { XK_Down, "Onder" },
+        { XK_BackSpace, "Backspace" },
+        { XK_Return, "Return" },
+        { XK_space, "Spatiebalk" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Again" },
+        { SunXK_Props, "Props" },
+        { SunXK_Undo,  "Undo" },
+        { SunXK_Front, "Front" },
+        { SunXK_Copy,  "Copy" },
+        { SunXK_Open,  "Open" },
+        { SunXK_Paste, "Paste" },
+        { SunXK_Find,  "Find" },
+        { SunXK_Cut,   "Cut" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Norwegian[] =
+    {
+        { XK_Shift_L, "Skift" },
+        { XK_Shift_R, "Skift" },
+        { XK_Page_Up, "PageUp" },
+        { XK_Page_Down, "PageDown" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Hyre" },
+        { XK_Left, "Venstre" },
+        { XK_Up, "Opp" },
+        { XK_Down, "Ned" },
+        { XK_BackSpace, "Tilbake" },
+        { XK_Return, "Enter" },
+        { SunXK_Stop,  "Avbryt" },
+        { SunXK_Again, "Gjenta" },
+        { SunXK_Props, "Egenskaper" },
+        { SunXK_Undo,  "Angre" },
+        { SunXK_Front, "Front" },
+        { SunXK_Copy,  "Kopi" },
+        { SunXK_Open,  "Åpne" },
+        { SunXK_Paste, "Lim" },
+        { SunXK_Find,  "Søk" },
+        { SunXK_Cut,   "Klipp" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Swedish[] =
+    {
+        { XK_Shift_L, "Skift" },
+        { XK_Shift_R, "Skift" },
+        { XK_Page_Up, "PageUp" },
+        { XK_Page_Down, "PageDown" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Höger" },
+        { XK_Left, "Vänster" },
+        { XK_Up, "Up" },
+        { XK_Down, "Ned" },
+        { XK_BackSpace, "Backsteg" },
+        { XK_Return, "Retur" },
+        { XK_space, "Blank" },
+        { SunXK_Stop,  "Avbryt" },
+        { SunXK_Again, "Upprepa" },
+        { SunXK_Props, "Egenskaper" },
+        { SunXK_Undo,  "Ångra" },
+        { SunXK_Front, "Fram" },
+        { SunXK_Copy,  "Kopiera" },
+        { SunXK_Open,  "Öppna" },
+        { SunXK_Paste, "Klistra in" },
+        { SunXK_Find,  "Sök" },
+        { SunXK_Cut,   "Klipp ut" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Portuguese[] =
+    {
+        { XK_Page_Up, "PageUp" },
+        { XK_Page_Down, "PageDown" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Direita" },
+        { XK_Left, "Esquerda" },
+        { XK_Up, "Acima" },
+        { XK_Down, "Abaixo" },
+        { XK_BackSpace, "Backspace" },
+        { XK_Return, "Enter" },
+        { XK_slash, "Barra" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Again" },
+        { SunXK_Props, "Props" },
+        { SunXK_Undo,  "Undo" },
+        { SunXK_Front, "Front" },
+        { SunXK_Copy,  "Copy" },
+        { SunXK_Open,  "Open" },
+        { SunXK_Paste, "Paste" },
+        { SunXK_Find,  "Find" },
+        { SunXK_Cut,   "Cut" },
+    };
+
+    static const struct KeysymNameReplacement aImplReplacements_Spanish[] =
+    {
+        { XK_Shift_L, "Mayús" },
+        { XK_Shift_R, "Mayús" },
+        { XK_Page_Up, "RePág" },
+        { XK_Page_Down, "AvPág" },
+        { XK_End, "Fin" },
+        { XK_Home, "Inicio" },
+        { XK_Delete, "Supr" },
+        { XK_Escape, "Esc" },
+        { XK_Right, "Hacia la derecha" },
+        { XK_Left, "Hacia la izquierda" },
+        { XK_Up, "Hacia arriba" },
+        { XK_Down, "Hacia abajo" },
+        { XK_BackSpace, "Ret" },
+        { XK_Return, "Entrada" },
+        { XK_space, "Espacio" },
+        { XK_KP_Enter, "Intro" },
+        { SunXK_Stop,  "Stop" },
+        { SunXK_Again, "Repetir" },
+        { SunXK_Props, "Props" },
+        { SunXK_Undo,  "Anular" },
+        { SunXK_Front, "Delante" },
+        { SunXK_Copy,  "Copiar" },
+        { SunXK_Open,  "Abrir" },
+        { SunXK_Paste, "Pegar" },
+        { SunXK_Find,  "Buscar" },
+        { SunXK_Cut,   "Cortar" },
+    };
+
+    static const struct KeyboardReplacements aKeyboards[] =
+    {
+        { "de", aImplReplacements_German, SAL_N_ELEMENTS(aImplReplacements_German) },
+        { "es", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
+        { "fr", aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
+        { "it", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
+        { "nl", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
+        { "no", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
+        { "pt", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) },
+        { "ru", aImplReplacements_Russian, SAL_N_ELEMENTS(aImplReplacements_Russian) },
+        { "sv", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
+        { "tr", aImplReplacements_Turkish, SAL_N_ELEMENTS(aImplReplacements_Turkish) },
+    };
+
+    // translate keycodes, used within the displayed menu shortcuts
+    rtl::OUString getKeysymReplacementName( rtl::OUString pLang, KeySym nSymbol )
+    {
+        for( unsigned int n = 0; n < SAL_N_ELEMENTS(aKeyboards); n++ )
+        {
+            if( pLang.equalsAscii( aKeyboards[n].pLangName ) )
+            {
+                const struct KeysymNameReplacement* pRepl = aKeyboards[n].pReplacements;
+                for( int m = aKeyboards[n].nReplacements ; m ; )
+                {
+                    if( nSymbol == pRepl[--m].aSymbol )
+                        return rtl::OUString( pRepl[m].pName, strlen(pRepl[m].pName), 
RTL_TEXTENCODING_UTF8 );
+                }
+            }
+        }
+
+        // try english fallbacks
+        const struct KeysymNameReplacement* pRepl = aImplReplacements_English;
+        for( int m = SAL_N_ELEMENTS(aImplReplacements_English); m ; )
+        {
+            if( nSymbol == pRepl[--m].aSymbol )
+                return rtl::OUString( pRepl[m].pName, strlen(pRepl[m].pName), 
RTL_TEXTENCODING_UTF8 );
+        }
+
+        return rtl::OUString();
+    }
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx
index ee4f094..2c34fd0 100644
--- a/vcl/unx/generic/app/saldisp.cxx
+++ b/vcl/unx/generic/app/saldisp.cxx
@@ -66,6 +66,9 @@ Status XineramaGetInfo(Display*, int, XRectangle*, unsigned char*, int*);
 
 #include <tools/postx.h>
 
+#include <svtools/langhelp.hxx>
+#include <vcl/svapp.hxx>
+
 #include <unx/salunx.h>
 #include <sal/types.h>
 #include "unx/i18n_im.hxx"
@@ -755,6 +758,7 @@ sal_uInt16 SalDisplay::GetIndicatorState() const
 
 rtl::OUString SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const
 {
+    rtl::OUString aLang = Application::GetSettings().GetUILocale().Language;
     rtl::OUString aRet;
 
     // return an empty string for keysyms that are not bound to
@@ -766,13 +770,16 @@ rtl::OUString SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const
             aRet = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "???" ) );
         else
         {
-            const char *pString = XKeysymToString( nKeySym );
-            int n = strlen( pString );
-
-            if( n > 2 && pString[n-2] == '_' )
-                aRet = rtl::OUString( pString, n-2, RTL_TEXTENCODING_ISO_8859_1 );
-            else
-                aRet = rtl::OUString( pString, n, RTL_TEXTENCODING_ISO_8859_1 );
+            aRet = ::vcl_sal::getKeysymReplacementName( aLang, nKeySym );
+            if( aRet.isEmpty() )
+            {
+                const char *pString = XKeysymToString( nKeySym );
+                int n = strlen( pString );
+                if( n > 2 && pString[n-2] == '_' )
+                    aRet = rtl::OUString( pString, n-2, RTL_TEXTENCODING_ISO_8859_1 );
+                else
+                    aRet = rtl::OUString( pString, n, RTL_TEXTENCODING_ISO_8859_1 );
+            }
         }
     }
     return aRet;
-- 
1.7.10.3

From 002d68826a0655ca05c4ed77e4358f1455b5eb77 Mon Sep 17 00:00:00 2001
From: Thomas Arnhold <thomas@arnhold.org>
Date: Tue, 5 Jun 2012 22:26:07 +0200
Subject: [PATCH] fdo#50415 and fdo#34638 Fix Shortcut names are not localized
 on Linux

This partially reverts commit 2233aa52da14ec85331aee1163b885fe9a9fb507
and commit 8d9e2d9a211f710e91ac7c607fea25895282d245

Before the keyboard name was used to determine the target language
for translation of UI shortcuts. With this patch the UI locale
is used to determine the language.

Related to:
- 8d9e2d9a211f710e91ac7c607fea25895282d245
- 04b9c2f633f0be1b676933943bdd0b1dc58b5471

Change-Id: Id7ee05ed4065dd4f0c12d283413e97092e95a15f
---
 vcl/inc/unx/saldisp.hxx             |    9 ++
 vcl/unx/generic/app/keysymnames.cxx |  248 +++--------------------------------
 vcl/unx/generic/app/saldisp.cxx     |   28 ++--
 3 files changed, 42 insertions(+), 243 deletions(-)

diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx
index 83bf9ea..150a100 100644
--- a/vcl/inc/unx/saldisp.hxx
+++ b/vcl/inc/unx/saldisp.hxx
@@ -474,6 +474,15 @@ namespace vcl_sal {
 }
 
 
+
+// get foreign key names
+namespace vcl_sal {
+    rtl::OUString getKeysymReplacementName(
+        rtl::OUString pLang,
+        KeySym nSymbol );
+}
+
+
 #endif // _SV_SALDISP_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/app/keysymnames.cxx b/vcl/unx/generic/app/keysymnames.cxx
index fa1eafd..bc1d705 100644
--- a/vcl/unx/generic/app/keysymnames.cxx
+++ b/vcl/unx/generic/app/keysymnames.cxx
@@ -26,7 +26,6 @@
  *
  ************************************************************************/
 
-
 #if !defined(SOLARIS) && !defined(AIX)
 #include <tools/prex.h>
 #include <X11/XKBlib.h>
@@ -50,19 +49,8 @@
 #define SunXK_Cut       0x1005FF75
 #endif
 
-#ifdef SOLARIS
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/kbio.h>
-#include <sys/kbd.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <deflt.h>
-#include <unistd.h>
-#include <stdlib.h>
-#endif
-
 #include <string.h>
+#include <rtl/ustring.hxx>
 
 namespace vcl_sal {
 
@@ -74,7 +62,7 @@ namespace vcl_sal {
 
     struct KeyboardReplacements
     {
-        const char*                     pKeyboardName;
+        const char*                     pLangName;
         const KeysymNameReplacement*    pReplacements;
         int                             nReplacements;
     };
@@ -340,243 +328,45 @@ namespace vcl_sal {
 
     static const struct KeyboardReplacements aKeyboards[] =
     {
-#ifdef SOLARIS
-        { "Germany5", aImplReplacements_German, SAL_N_ELEMENTS(aImplReplacements_German) },
-        { "Germany4", aImplReplacements_German, SAL_N_ELEMENTS(aImplReplacements_German) },
-        { "France5",  aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
-        { "France6",  aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
-        { "France_x86", aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
-        { "Italy5", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        { "Italy5-Hobo", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        { "Italy4", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        { "Italy6", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        { "Italy_x86", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        { "Netherland4", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Netherland5", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Netherland5-Hobo", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Netherland6", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Netherland_x86", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Norway5", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
-        { "Norway5-Hobo", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) 
},
-        { "Norway4", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
-        { "Norway6", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
-        { "Norway_x86", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
-        { "Portugal5", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) 
},
-        { "Portugal5-Hobo", aImplReplacements_Portuguese, 
SAL_N_ELEMENTS(aImplReplacements_Portuguese) },
-        { "Portugal4", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) 
},
-        { "Portugal6", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) 
},
-        { "Portugal_x86", aImplReplacements_Portuguese, 
SAL_N_ELEMENTS(aImplReplacements_Portuguese) },
-        { "Spain5", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Spain5-Hobo", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Spain4", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Spain6", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Spain_x86", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Sweden5", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-        { "Sweden5-Hobo", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-        { "Sweden4", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-        { "Sweden6", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-        { "Sweden_x86", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-#endif
-        { "U.S. English", aImplReplacements_English, SAL_N_ELEMENTS(aImplReplacements_English) },
-        { "United Kingdom", aImplReplacements_English, SAL_N_ELEMENTS(aImplReplacements_English) },
-        // Germany, German
-        { "German", aImplReplacements_German, SAL_N_ELEMENTS(aImplReplacements_German) },
-        { "France", aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
-        { "French", aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
-        // Italy, Italian
-        { "Ital", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
-        // Norway, Norwegian
-        { "Norw", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
-        // Portugal, Portuguese
-        { "Portu", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) },
-        { "Spain", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        { "Spanish", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
-        // Sweden, Swedish
-        { "Swed", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
-        { "Netherland", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        { "Dutch", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
-        // Turkish, Turkey
-        { "Turk", aImplReplacements_Turkish, SAL_N_ELEMENTS(aImplReplacements_Turkish) },
-        // Russian, Russia
-        { "Russia", aImplReplacements_Russian, SAL_N_ELEMENTS(aImplReplacements_Russian) },
-        { "English", aImplReplacements_English, SAL_N_ELEMENTS(aImplReplacements_English) }
+        { "de", aImplReplacements_German, SAL_N_ELEMENTS(aImplReplacements_German) },
+        { "es", aImplReplacements_Spanish, SAL_N_ELEMENTS(aImplReplacements_Spanish) },
+        { "fr", aImplReplacements_French, SAL_N_ELEMENTS(aImplReplacements_French) },
+        { "it", aImplReplacements_Italian, SAL_N_ELEMENTS(aImplReplacements_Italian) },
+        { "nl", aImplReplacements_Dutch, SAL_N_ELEMENTS(aImplReplacements_Dutch) },
+        { "no", aImplReplacements_Norwegian, SAL_N_ELEMENTS(aImplReplacements_Norwegian) },
+        { "pt", aImplReplacements_Portuguese, SAL_N_ELEMENTS(aImplReplacements_Portuguese) },
+        { "ru", aImplReplacements_Russian, SAL_N_ELEMENTS(aImplReplacements_Russian) },
+        { "sv", aImplReplacements_Swedish, SAL_N_ELEMENTS(aImplReplacements_Swedish) },
+        { "tr", aImplReplacements_Turkish, SAL_N_ELEMENTS(aImplReplacements_Turkish) },
     };
 
-    rtl::OUString getKeysymReplacementName( const char* pKeyboard, KeySym nSymbol )
+    // translate keycodes, used within the displayed menu shortcuts
+    rtl::OUString getKeysymReplacementName( rtl::OUString pLang, KeySym nSymbol )
     {
         for( unsigned int n = 0; n < SAL_N_ELEMENTS(aKeyboards); n++ )
         {
-            if( ! strncasecmp( pKeyboard, aKeyboards[n].pKeyboardName, strlen( 
aKeyboards[n].pKeyboardName ) ) )
+            if( pLang.equalsAscii( aKeyboards[n].pLangName ) )
             {
                 const struct KeysymNameReplacement* pRepl = aKeyboards[n].pReplacements;
                 for( int m = aKeyboards[n].nReplacements ; m ; )
                 {
                     if( nSymbol == pRepl[--m].aSymbol )
-                        return String( pRepl[m].pName, RTL_TEXTENCODING_UTF8 );
+                        return rtl::OUString( pRepl[m].pName, strlen(pRepl[m].pName), 
RTL_TEXTENCODING_UTF8 );
                 }
             }
         }
+
         // try english fallbacks
         const struct KeysymNameReplacement* pRepl = aImplReplacements_English;
         for( int m = SAL_N_ELEMENTS(aImplReplacements_English); m ; )
         {
             if( nSymbol == pRepl[--m].aSymbol )
-                return String( pRepl[m].pName, RTL_TEXTENCODING_UTF8 );
+                return rtl::OUString( pRepl[m].pName, strlen(pRepl[m].pName), 
RTL_TEXTENCODING_UTF8 );
         }
+
         return rtl::OUString();
     }
 
 }
 
-#ifdef SOLARIS
-typedef struct {
-    int         n_layout;
-    const char* p_description;
-} keyboard_layout;
-
-static const keyboard_layout type0_layout[] =
-{
-    { 0, "US4" },
-    { -1, NULL }
-};
-
-static const keyboard_layout type3_layout[] =
-{
-    { 0, "US3" },
-    { -1, NULL }
-};
-
-static const keyboard_layout type4_layout[] =
-{
-    { 0,  "US4" },
-    { 1,  "US4" },
-    { 2,  "FranceBelg4" },
-    { 3,  "Canada4" },
-    { 4,  "Denmark4" },
-    { 5,  "Germany4" },
-    { 6,  "Italy4" },
-    { 7,  "Netherland4" },
-    { 8,  "Norway4" },
-    { 9,  "Portugal4" },
-    { 10, "SpainLatAm4" },
-    { 11, "SwedenFin4" },
-    { 12, "Switzer_Fr4" },
-    { 13, "Switzer_Ge4" },
-    { 14, "UK4" },
-    { 16, "Korea4" },
-    { 17, "Taiwan4" },
-    { 19, "US101A_PC" },
-    { 19, "US101A_Sun" },
-    { 32, "Japan4" },
-    { 33, "US5" },
-    { 34, "US_UNIX5" },
-    { 35, "France5" },
-    { 36, "Denmark5" },
-    { 37, "Germany5" },
-    { 38, "Italy5" },
-    { 39, "Netherland5" },
-    { 40, "Norway5" },
-    { 41, "Portugal5" },
-    { 42, "Spain5" },
-    { 43, "Sweden5" },
-    { 44, "Switzer_Fr5" },
-    { 45, "Switzer_Ge5" },
-    { 46, "UK5" },
-    { 47, "Korea5" },
-    { 48, "Taiwan5" },
-    { 49, "Japan5" },
-    { 50, "Canada_Fr5" },
-    { 51, "Hungary5" },
-    { 52, "Poland5" },
-    { 53, "Czech5" },
-    { 54, "Russia5" },
-    { 55, "Latvia5" },
-    { 56, "Turkey5" },
-    { 57, "Greece5" },
-    { 58, "Estonia5" },
-    { 59, "Lithuania5" },
-    { 63, "Canada_Fr5_TBITS5" },
-    { 80, "US5_Hobo" },
-    { 81, "US_UNIX5_Hobo" },
-    { 82, "France5_Hobo" },
-    { 83, "Denmark5_Hobo" },
-    { 84, "Germany5_Hobo" },
-    { 85, "Italy5_Hobo" },
-    { 86, "Netherland5_Hobo" },
-    { 87, "Norway5_Hobo" },
-    { 88, "Portugal5_Hobo" },
-    { 89, "Spain5_Hobo" },
-    { 90, "Sweden5_Hobo" },
-    { 91, "Switzer_Fr5_Hobo" },
-    { 92, "Switzer_Ge5_Hobo" },
-    { 93, "UK5_Hobo" },
-    { 94, "Korea5_Hobo" },
-    { 95, "Taiwan5_Hobo" },
-    { 96, "Japan5_Hobo" },
-    { 97, "Canada_Fr5_Hobo" },
-    { -1, NULL }
-};
-
-static const keyboard_layout type101_layout[] =
-{
-    {  0, "US101A_x86" },
-    {  1, "US101A_x86" },
-    { 34, "J3100_x86" },
-    { 35, "France_x86" },
-    { 36, "Denmark_x86" },
-    { 37, "Germany_x86" },
-    { 38, "Italy_x86" },
-    { 39, "Netherland_x86" },
-    { 40, "Norway_x86" },
-    { 41, "Portugal_x86" },
-    { 42, "Spain_x86" },
-    { 43, "Sweden_x86" },
-    { 44, "Switzer_Fr_x86" },
-    { 45, "Switzer_Ge_x86" },
-    { 46, "UK_x86" },
-    { 47, "Korea_x86" },
-    { 48, "Taiwan_x86" },
-    { 49, "Japan_x86" },
-    { 50, "Canada_Fr2_x86" },
-    { 51, "Hungary_x86" },
-    { 52, "Poland_x86" },
-    { 53, "Czech_x86" },
-    { 54, "Russia_x86" },
-    { 55, "Latvia_x86" },
-    { 56, "Turkey_x86" },
-    { 57, "Greece_x86" },
-    { 59, "Lithuania_x86" },
-    { 1001, "MS_US101A_x86" },
-    { -1, NULL }
-};
-
-static const keyboard_layout type6_layout[] =
-{
-    { 0,  "US6" },
-    { 6,  "Denmark6" },
-    { 7,  "Finnish6" },
-    { 8,  "France6" },
-    { 9,  "Germany6" },
-    { 14, "Italy6" },
-    { 15, "Japan6" },
-    { 16, "Korea6" },
-    { 18, "Netherland6" },
-    { 19, "Norway6" },
-    { 22, "Portugal6" },
-    { 25, "Spain6" },
-    { 26, "Sweden6" },
-    { 27, "Switzer_Fr6" },
-    { 28, "Switzer_Ge6" },
-    { 30, "Taiwan6" },
-    { 32, "UK6" },
-    { 33, "US6" },
-    { -1, NULL }
-};
-#endif
-
-
-#if OSL_DEBUG_LEVEL > 1
-#include <stdio.h>
-#endif
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx
index 33f94b2..e2b05e2 100644
--- a/vcl/unx/generic/app/saldisp.cxx
+++ b/vcl/unx/generic/app/saldisp.cxx
@@ -70,6 +70,9 @@ Status XineramaGetInfo(Display*, int, XRectangle*, unsigned char*, int*);
 
 #include <tools/postx.h>
 
+#include <svtools/langhelp.hxx>
+#include <vcl/svapp.hxx>
+
 #include <unx/salunx.h>
 #include <sal/types.h>
 #include "unx/i18n_im.hxx"
@@ -936,6 +939,7 @@ sal_uInt16 SalDisplay::GetIndicatorState() const
 
 rtl::OUString SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const
 {
+    rtl::OUString aLang = Application::GetSettings().GetUILocale().Language;
     rtl::OUString aRet;
 
     // return an empty string for keysyms that are not bound to
@@ -947,20 +951,16 @@ rtl::OUString SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const
             aRet = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "???" ) );
         else
         {
-            // lp#818761: removing the problematic call to GetKeyboardName() as
-            // getKeysymReplacementName only provides the name of the key named
-            // as given by the l10n of the _keyboard_ (not the locale) e.g. a
-            // german keyboard would name "Ctrl" instead as "Strg". Assuming
-            // this change to be safe as getKeysymReplacementName falls back to
-            // English names anyway.
-            // this code is completely removed on master/3.6 anyway, see
-            // commit 2233aa52da14ec85331aee1163b885fe9a9fb507
-            const char *pString = XKeysymToString( nKeySym );
-            int n = strlen( pString );
-            if( n > 2 && pString[n-2] == '_' )
-                aRet = rtl::OUString( pString, n-2, RTL_TEXTENCODING_ISO_8859_1 );
-            else
-                aRet = rtl::OUString( pString, n, RTL_TEXTENCODING_ISO_8859_1 );
+            aRet = ::vcl_sal::getKeysymReplacementName( aLang, nKeySym );
+            if( aRet.isEmpty() )
+            {
+                const char *pString = XKeysymToString( nKeySym );
+                int n = strlen( pString );
+                if( n > 2 && pString[n-2] == '_' )
+                    aRet = rtl::OUString( pString, n-2, RTL_TEXTENCODING_ISO_8859_1 );
+                else
+                    aRet = rtl::OUString( pString, n, RTL_TEXTENCODING_ISO_8859_1 );
+            }
         }
     }
     return aRet;
-- 
1.7.10.3


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.