Giriş
Aşağıdaki komut dosyası, dil menüsünde dilin konumuna göre, kullanıcı tanımlı her program için dili ayarlar. Örneğin, siparişim: İngilizce (1), Çince (2) ve Rusça (3) ise, Firefox'u dil 2'ye, terminal dil 1'e ve LibreOffice dil 3'e ayarlayabilirim.
Komut dosyası iki kısımdan oluşur: birinci kısım işi yapan gerçek komut dosyasıdır, ikinci komut dosyası kontrol elemanı olarak işlev görür. Fikir, dil ayarı komut dosyasını bir başlangıç uygulaması olarak çalıştırmak ve dili el ile değiştirmeniz gerektiğinde - denetleyici komut dosyasının kısayolunu çift tıklatın.
Ön koşul
- İle
wmctrl
programı yükleyin sudo apt-get install wmctrl
.
Senaryo
#!/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
Denetleyici Komut Dosyası
#!/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
Set-lang.sh komut dosyası için başlatıcı (.desktop) dosyası
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
Set-lang-controller.sh için Başlatıcı (.desktop) dosyası
[Desktop Entry]
Name=lang-control
Comment=Shortcut to controlling script
Exec=/home/yourusername/bin/set-lang-control.sh
Type=Application
StartupNotify=true
Terminal=false
Senaryoyu çalıştırma
- Ana dizininizde adlı bir klasör oluşturun
bin
. Dosya yöneticisinden yapabilir veya mkdir $HOME/bin
terminaldeki komutu kullanabilirsiniz
- Gelen
bin
klasörüne iki dosya oluşturun: set-lang.sh
ve set-lang-control.sh
. Komut dosyasını şuraya set-lang.sh
ve denetleyici komut dosyasını şuraya kaydedin set-lang-control.sh
. Her iki betiği de ile çalıştırılabilir yapsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- İki
.desktop
dosya oluşturun . Bir tanesi set-lang.desktop
. Gizli .config/autostart
dizine yerleştirilmelidir . İkincisi set-lang-controller.desktop
, bin
klasörünüze yerleştirilebilir . Sonra set-lang-controller.desktop
dosyayı sürükleyip başlatıcıya sabitleyin . Bu, komut dosyası yürütmesini geçici olarak durdurmak ve sürdürmek için kısayol olacaktır.
NOT hattı olduğunu Exec=
(yani gerçek ev dizini çünkü) komut yolunda gerçek kullanıcı adı olması değişmiş olması gerekir. Örneğin, benimkiExec=/home/serg/bin/set-lang.sh
Açıklama ve özelleştirme:
Komut dosyasının kendisi sonsuz while döngüsünde çalışır ve geçerli etkin pencereyi denetler. Geçerli etkin pencere, vaka yapısındaki seçeneklerden biriyle eşleşiyorsa, uygun dile geçeriz. Sabit ayardan kaçınmak için, vaka yapısının her bir parçası, dilin önceden istenen değere ayarlanıp ayarlanmadığını kontrol eden if ifadesine sahiptir.
Başlatıcıyı çift tıklatmak komut dosyasının set-lang-controller.sh
durumunu kontrol eder set-lang.sh
; komut dosyası çalışıyorsa - duraklatılır ve komut dosyası duraklatılırsa devam ettirilir. Uygun mesajla birlikte bir bildirim gösterilir.
Komut dosyasını özelleştirmek için, istediğiniz uygulamaları açabilir wmctrl -lx
, üçüncü sütunu (pencere sınıfı ) çalıştırabilir ve not edebilirsiniz. Örnek çıktı:
$ 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
Her program için uygun pencere sınıflarını seçin. Ardından, komut dosyasının özelleştirmeye izin veren bölümüne gidin ve PROG_CLASS ve LANG için iki giriş ekleyin. Daha sonra vaka yapısına uygun girişi ekleyin.
Örneğin, LibreOffice'in Yazarını eklemek istersem, LibreOffice Writer penceresini açar, terminale gider ve çalıştırırım wmctrl -lx
. Bana Writer penceresinin sınıfı olduğunu söyleyecek libreoffice.libreoffice-writer
. Daha sonra senaryoya gideceğim PROG_CLASS_4=libreoffice.libreoffice-writer
ve LANG4=3
uygun alana ekleyeceğim . Eşleştirme numarası 4'e dikkat edin. Ardından, vaka yapısına gidin ve son ;;
ile arasına aşağıdaki girişi ekleyin esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Yine, $ işaretine ve eşleşen 4 numarasına dikkat edin.
Ayrıca, komut dosyası otomatik başlatma öğesi olarak çalışıyorsa ve bunu özelleştirmek için geçici olarak durdurmak istiyorsanız pkill set-lang.sh
,nohup set-lang.sh > /dev/null 2&>1 &
Küçük not: Bir programın pencere sınıfını bulmanın başka bir yolu (vaka yapısında tek yuvarlak köşeli parantezden önce gidenler) bunu xprop
ve awk
oneliner'ı kullanmaktır :xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}