Einführung
Das folgende Skript legt die Sprache für jedes benutzerdefinierte Programm entsprechend der Position dieser Sprache im Sprachmenü fest. Wenn meine Bestellung beispielsweise Englisch (1), Chinesisch (2) und Russisch (3) lautet, kann ich Firefox auf Sprache 2, Terminal auf Sprache 1 und LibreOffice auf Sprache 3 einstellen.
Das Skript besteht aus zwei Teilen: Teil eins ist das eigentliche Skript, das die Arbeit erledigt, das zweite Skript dient als Steuerelement. Die Idee ist , die Spracheinstellung Skript als laufen Start-up - Anwendung und wann immer Sie manuell ändern Sprache benötigen - Mit Doppelklick auf die Verknüpfung zu dem Controller Skript.
Voraussetzungen
- Installieren Sie das
wmctrl
Programm mit sudo apt-get install wmctrl
.
Skript
#!/bin/sh
# Author: Serg Kolo
# Date: August 4, 2015
# Description: This script forces assigned input languages
# for specific windows
# Version:2
# Use this part to set programs and their respective languages
# PROG_CLASS or a running window can be found with the
# wmctrl -lx command
# If you want to add another program to the list,
# follow the template PROG_CLASS_num=window.Class
# and bellow that $LANGnum=num
PROG_CLASS_1=gedit.Gedit
LANG1=2
PROG_CLASS_2=gnome-terminal-server.Gnome-terminal
LANG2=0
PROG_CLASS_3=Navigator.Firefox
LANG3=1
# While loop below gets the job done.
# If you need to send languages for more programs - copy
# the first entry and replace $PROG_CLASS_1 with $PROG_CLASS_num
# where num is respective number of a program
# Replace $LANGnum with the respective language number. After the "="
# post positional number of the language you want to use.
# Remember the count starts from 0
while [ 1 ];do
WM_CLASS=$(wmctrl -lx | awk -v search=$(printf %x $(xdotool getactivewindow)) '{ if($1~search) print $3 }' )
CURRENT=$(gsettings get org.gnome.desktop.input-sources current| awk '{print $2}')
case $WM_CLASS in
$PROG_CLASS_1)
if [ $CURRENT -ne $LANG1 ];then
gsettings set org.gnome.desktop.input-sources current $LANG1
fi
;;
$PROG_CLASS_2)
if [ $CURRENT -ne $LANG2 ];then
gsettings set org.gnome.desktop.input-sources current $LANG2
fi
;;
$PROG_CLASS_3)
if [ $CURRENT -ne $LANG3 ];then
gsettings set org.gnome.desktop.input-sources current $LANG3
fi
;;
esac
sleep 0.250
done
Controller-Skript
#!/bin/sh
# set -x
# Author: Serg Kolo
# Date: August 8, 2015
# Description: Controller script for set-lang.sh script
# Allows pausing and resuming execution of set-lang.sh
STATUS=$(ps -o stat -p $(pgrep -o set-lang.sh) | awk '{getline;print }')
case $STATUS in
T) kill -CONT $(pgrep set-lang.sh)
notify-send 'RESUMED'
;;
S) kill -STOP $(pgrep set-lang.sh)
notify-send 'STOPED'
;;
*) exit ;;
esac
Launcher-Datei (.desktop) für das Skript set-lang.sh
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
Launcher-Datei (.desktop) für set-lang-controller.sh
[Desktop Entry]
Name=lang-control
Comment=Shortcut to controlling script
Exec=/home/yourusername/bin/set-lang-control.sh
Type=Application
StartupNotify=true
Terminal=false
Damit das Skript funktioniert
- Erstellen Sie einen Ordner in Ihrem Home-Verzeichnis mit dem Namen
bin
. Sie können dies im Dateimanager tun oder den Befehl mkdir $HOME/bin
im Terminal verwenden
bin
Erstellen Sie im Ordner zwei Dateien: set-lang.sh
und set-lang-control.sh
. Speichern Sie das Skript in set-lang.sh
und das Controller-Skript in set-lang-control.sh
. Machen Sie beide Skripte ausführbar mitsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Erstellen Sie zwei
.desktop
Dateien. Eins ist set-lang.desktop
. Muss im versteckten .config/autostart
Verzeichnis abgelegt werden . Zweitens ist set-lang-controller.desktop
, kann in Ihrem bin
Ordner platziert werden. Ziehen Sie anschließend die set-lang-controller.desktop
Datei per Drag & Pin an den Launcher . Dies wird zur Verknüpfung zum vorübergehenden Stoppen und Fortsetzen der Skriptausführung.
HINWEIS : Die Zeile Exec=
muss geändert werden, damit Ihr tatsächlicher Benutzername im Pfad zum Skript enthalten ist (da dies Ihr tatsächliches Ausgangsverzeichnis ist). Zum Beispiel wäre meineExec=/home/serg/bin/set-lang.sh
Erklärung und Anpassung:
Das Skript selbst wird in einer Endlosschleife ausgeführt und überprüft das aktuell aktive Fenster. Wenn das aktuell aktive Fenster mit einer der Optionen in der Fallstruktur übereinstimmt, wechseln wir zur entsprechenden Sprache. Um eine konstante Einstellung zu vermeiden, verfügt jeder Teil der Fallstruktur über eine if-Anweisung, die prüft, ob die Sprache bereits auf den gewünschten Wert eingestellt wurde.
Durch Doppelklicken auf den Launcher für set-lang-controller.sh
wird der Status des set-lang.sh
Skripts überprüft . Wenn das Skript ausgeführt wird, wird es angehalten, und wenn das Skript angehalten wird, wird es fortgesetzt. Eine Benachrichtigung wird mit der entsprechenden Nachricht angezeigt.
Um das Skript anzupassen, können Sie die gewünschten Anwendungen öffnen wmctrl -lx
, die dritte Spalte ausführen und notieren - die Fensterklasse. Beispielausgabe:
$ wmctrl -lx | awk '$4="***" {print}'
0x02c00007 0 gnome-terminal-server.Gnome-terminal *** Terminal
0x03a0000a 0 desktop_window.Nautilus *** Desktop
0x04a00002 0 N/A *** XdndCollectionWindowImp
0x04a00005 0 N/A *** unity-launcher
0x04a00008 0 N/A *** unity-panel
0x04a0000b 0 N/A *** unity-dash
0x04a0000c 0 N/A *** Hud
0x012000a6 0 Navigator.Firefox *** unity - Assign default keyboard language per-application - Ask Ubuntu - Mozilla Firefox
Wählen Sie für jedes Programm die entsprechenden Fensterklassen aus. Wechseln Sie als Nächstes zu dem Teil des Skripts, der die Anpassung ermöglicht, und fügen Sie zwei Einträge für PROG_CLASS und LANG hinzu. Fügen Sie als Nächstes den entsprechenden Eintrag in die Fallstruktur ein.
Wenn ich beispielsweise LibreOffice's Writer hinzufügen möchte, öffne ich das LibreOffice Writer-Fenster, gehe zum Terminal und führe es aus wmctrl -lx
. Es wird mir sagen, dass das Writer-Fenster Klasse hat libreoffice.libreoffice-writer
. Als nächstes gehe ich zum Skript, füge hinzu PROG_CLASS_4=libreoffice.libreoffice-writer
und LANG4=3
in den entsprechenden Bereich. Beachten Sie die übereinstimmende Nummer 4. Wechseln Sie als Nächstes zur Fallstruktur und fügen Sie den folgenden Eintrag zwischen last ;;
und hinzu esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Beachten Sie erneut das $ -Zeichen und die übereinstimmende Nummer 4.
Wenn das Skript als Autostart-Element ausgeführt wird und Sie es vorübergehend anhalten möchten, um es anzupassen, verwenden Sie es pkill set-lang.sh
und fahren Sie mit fortnohup set-lang.sh > /dev/null 2&>1 &
Kleiner Hinweis: Eine andere Möglichkeit, die Fensterklasse für ein Programm herauszufinden (das Zeug, das in der Fallstruktur vor einer einzelnen runden Klammer steht), besteht darin, dies xprop
und einen awk
Oneliner zu verwenden:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}