Вступление
Сценарий ниже устанавливает язык для каждой пользовательской программы в соответствии с положением этого языка в языковом меню. Например, если мой порядок: английский (1), китайский (2) и русский (3), я могу установить для Firefox язык 2, для терминала язык 1, а для LibreOffice язык 3.
Сценарий состоит из двух частей: первая часть представляет собой фактический сценарий, выполняющий эту работу, а второй сценарий выполняет роль управляющего элемента. Идея состоит в том, чтобы запустить сценарий языковых настроек в качестве запускаемого приложения, и всякий раз, когда вам нужно вручную изменить язык - дважды щелкните ярлык на сценарии контроллера.
Предпосылки
- Установите
wmctrl
программу с помощью sudo apt-get install wmctrl
.
скрипт
#!/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
Скрипт контроллера
#!/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
Файл запуска (.desktop) для скрипта 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
Файл запуска (.desktop) для 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
Заставить скрипт работать
- Создайте папку в вашем домашнем каталоге с именем
bin
. Вы можете сделать это в файловом менеджере или использовать команду mkdir $HOME/bin
в терминале
- В
bin
папке создайте два файла: set-lang.sh
и set-lang-control.sh
. Сохранить скрипт в set-lang.sh
и контроллер скрипт в set-lang-control.sh
. Сделайте оба скрипта исполняемыми сsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Создайте два
.desktop
файла. Один есть set-lang.desktop
. Должен быть размещен в скрытом .config/autostart
каталоге. Второй set-lang-controller.desktop
, может быть помещен в вашу bin
папку. Затем перетащите и запустите set-lang-controller.desktop
файл запуска . Это станет ярлыком для временной остановки и возобновления выполнения скрипта.
Обратите внимание, что строка Exec=
должна быть изменена, чтобы фактическое имя пользователя указывалось в пути к скрипту (потому что это фактический домашний каталог). Например, мой будетExec=/home/serg/bin/set-lang.sh
Объяснение и настройка:
Сам скрипт выполняется в бесконечном цикле while и проверяет текущее активное окно. Если текущее активное окно соответствует одному из параметров в структуре дела, мы переключаемся на соответствующий язык. Чтобы избежать установки констант, каждая часть структуры case имеет оператор if, который проверяет, задан ли для языка желаемое значение.
Двойной щелчок на панели запуска для set-lang-controller.sh
проверки состоянияset-lang.sh
скрипта; если скрипт запущен - он будет приостановлен, а если скрипт приостановлен, он будет возобновлен. Уведомление будет показано с соответствующим сообщением.
Чтобы настроить скрипт, вы можете открыть нужные приложения, запустить wmctrl -lx
и отметить третий столбец - класс окна. Пример вывода:
$ 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
Выберите соответствующие классы окна для каждой программы. Затем перейдите к той части скрипта, которая позволяет выполнить настройку, и добавьте две записи для PROG_CLASS и LANG. Затем добавьте соответствующую запись в структуру дела.
Например, если я хочу добавить Writer LibreOffice, я открываю окно Writer LibreOffice, перехожу в терминал и запускаю wmctrl -lx
. Это скажет мне, что у окна Writer есть класс libreoffice.libreoffice-writer
. Далее я пойду к сценарию, добавлю PROG_CLASS_4=libreoffice.libreoffice-writer
и LANG4=3
в соответствующую область. Обратите внимание на совпадение с номером 4. Затем перейдите к структуре дела и добавьте следующую запись между last ;;
и esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Опять же, обратите внимание на знак $ и соответствующий номер 4.
Кроме того, если скрипт работает как элемент автозапуска, и вы хотите временно остановить его, чтобы настроить его, используйте pkill set-lang.sh
и возобновите сnohup set-lang.sh > /dev/null 2&>1 &
Небольшое примечание: еще один способ выяснить класс окна для программы (то, что идет перед одинарной круглой скобкой в структуре case) - использовать это xprop
и awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}