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
wmctrl
program 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/bin
di terminal
- Dalam
bin
folder buat dua file: set-lang.sh
dan set-lang-control.sh
. Simpan skrip ke set-lang.sh
dan 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
.desktop
file. Satu adalah set-lang.desktop
. Harus ditempatkan di .config/autostart
direktori tersembunyi . Yang kedua adalah set-lang-controller.desktop
, bisa diletakkan di bin
folder Anda . Selanjutnya seret dan sematkan ke peluncur set-lang-controller.desktop
file. 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.sh
akan memeriksa status set-lang.sh
skrip; 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 -lx
dan 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-writer
dan LANG4=3
di 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.sh
dan 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 xprop
dan awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}