pengantar
Skrip di bawah ini menetapkan bahasa untuk setiap program yang ditentukan pengguna, sesuai dengan posisi bahasa itu di menu bahasa. Misalnya, jika pesanan saya adalah: Inggris (1), Cina (2), dan Rusia (3), saya dapat mengatur Firefox untuk memiliki bahasa 2, terminal untuk memiliki bahasa 1, dan LibreOffice untuk memiliki bahasa 3.
Skrip terdiri dari dua bagian: bagian pertama adalah skrip aktual yang berfungsi, skrip kedua berfungsi sebagai elemen pengontrol. Idenya adalah untuk menjalankan skrip pengaturan bahasa sebagai aplikasi start-up dan kapan pun Anda perlu mengubah bahasa secara manual - klik dua kali pintasan ke skrip pengontrol.
Prasyarat
- Instal
wmctrlprogram dengan sudo apt-get install wmctrl.
Naskah
#!/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
Script Pengendali
#!/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
File peluncur (.desktop) untuk skrip 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
File peluncur (.desktop) untuk 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
Membuat skrip berfungsi
- Buat folder di direktori home Anda bernama
bin. Anda dapat melakukannya di manajer file atau menggunakan perintah mkdir $HOME/bindi terminal
- Dalam
binfolder buat dua file: set-lang.shdan set-lang-control.sh. Simpan skrip ke set-lang.shdan skrip pengontrol ke set-lang-control.sh. Jadikan kedua skrip dapat dieksekusisudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Buat dua
.desktopfile. Satu adalah set-lang.desktop. Harus ditempatkan di .config/autostartdirektori tersembunyi . Yang kedua adalah set-lang-controller.desktop, bisa diletakkan di binfolder Anda . Selanjutnya seret dan sematkan ke peluncur set-lang-controller.desktopfile. Ini akan menjadi jalan pintas untuk menghentikan sementara dan melanjutkan eksekusi skrip.
Perhatikan bahwa baris tersebut Exec=harus diubah agar nama pengguna Anda yang sebenarnya ada di jalur ke skrip (karena itu adalah direktori home Anda yang sebenarnya). Misalnya, milik sayaExec=/home/serg/bin/set-lang.sh
Penjelasan dan penyesuaian:
Script itu sendiri berjalan dalam infinite while dan memeriksa jendela aktif saat ini. Jika jendela aktif saat ini cocok dengan salah satu opsi dalam struktur kasus, kami beralih ke bahasa yang sesuai. Untuk menghindari pengaturan konstan, setiap bagian dari struktur case memiliki pernyataan if yang memeriksa apakah bahasa telah diatur ke nilai yang diinginkan.
Mengklik ganda pada peluncur untuk set-lang-controller.shakan memeriksa status set-lang.shskrip; jika skrip sedang berjalan - skrip akan dijeda, dan jika skrip dijeda akan dilanjutkan. Pemberitahuan akan ditampilkan dengan pesan yang sesuai.
Untuk menyesuaikan skrip, Anda dapat membuka aplikasi yang diinginkan, menjalankan wmctrl -lxdan mencatat kolom ketiga - kelas jendela. Output sampel:
$ 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
Pilih kelas jendela yang sesuai untuk setiap program. Selanjutnya, buka bagian skrip yang memungkinkan penyesuaian dan tambahkan dua entri untuk PROG_CLASS dan LANG. Selanjutnya tambahkan entri yang sesuai dalam struktur kasus.
Misalnya, jika saya ingin menambahkan, LibreOffice's Writer, saya membuka jendela LibreOffice Writer, pergi ke terminal dan jalankan wmctrl -lx. Ini akan memberi tahu saya bahwa jendela Writer memiliki kelas libreoffice.libreoffice-writer. Selanjutnya saya akan pergi ke script, tambahkan PROG_CLASS_4=libreoffice.libreoffice-writerdan LANG4=3di area yang sesuai. Perhatikan nomor yang cocok 4. Selanjutnya, pergi ke struktur kasus, dan tambahkan entri berikut antara yang terakhir ;;dan esac:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Sekali lagi, perhatikan tanda $ dan nomor yang cocok 4.
Juga, jika skrip berjalan sebagai item autostart dan Anda ingin menghentikannya sementara untuk menyesuaikannya, gunakan pkill set-lang.shdan lanjutkan dengannohup set-lang.sh > /dev/null 2&>1 &
Catatan kecil: cara lain untuk mengetahui kelas jendela untuk suatu program (hal-hal yang berjalan sebelum braket putaran tunggal dalam struktur kasus) adalah dengan menggunakan ini xpropdan awkoneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}