บทนำ
ซอลเบลโลว์สคริปต์ตั้งค่าภาษาสำหรับแต่ละโปรแกรมที่ผู้ใช้กำหนดตามตำแหน่งของภาษานั้นในเมนูภาษา ตัวอย่างเช่นหากคำสั่งของฉันคือ: อังกฤษ (1), จีน (2) และรัสเซีย (3) ฉันสามารถตั้งค่า Firefox ให้มีภาษา 2 เทอร์มินัลให้มีภาษา 1 และ LibreOffice มีภาษา 3
สคริปต์มีสองส่วน: ส่วนที่หนึ่งเป็นสคริปต์จริงที่ทำงานได้สคริปต์ที่สองทำหน้าที่เป็นองค์ประกอบควบคุม แนวคิดคือการเรียกใช้สคริปต์การตั้งค่าภาษาเป็นแอปพลิเคชันเริ่มต้นและเมื่อใดก็ตามที่คุณต้องการเปลี่ยนภาษาด้วยตนเอง - ดับเบิลคลิกที่ทางลัดไปยังสคริปต์ควบคุม
requisites ก่อน
- ติดตั้งโปรแกรม
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
ไฟล์ Launcher (.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
ไฟล์ Launcher (.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
ใน terminal
- ใน
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
คำอธิบายและการปรับแต่ง:
สคริปต์จะทำงานแบบไม่สิ้นสุดในขณะที่วนซ้ำและตรวจสอบหน้าต่างปัจจุบันที่ใช้งานอยู่ หากหน้าต่างที่ใช้งานในปัจจุบันตรงกับหนึ่งในตัวเลือกในโครงสร้างเคสเราจะเปลี่ยนเป็นภาษาที่เหมาะสม เพื่อหลีกเลี่ยงการตั้งค่าคงที่แต่ละส่วนของโครงสร้างเคสจะมีคำสั่งที่ตรวจสอบว่าภาษานั้นถูกตั้งค่าเป็นค่าที่ต้องการหรือไม่
การดับเบิลคลิกที่ตัวเรียกใช้สำหรับ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 ถัดไปเพิ่มรายการที่เหมาะสมในโครงสร้างเคส
ตัวอย่างเช่นถ้าผมต้องการที่จะเพิ่มนักเขียน LibreOffice ผมเปิดหน้าต่างเขียน LibreOffice wmctrl -lx
ไปยังสถานีและเรียกใช้ libreoffice.libreoffice-writer
มันจะบอกฉันว่าหน้าต่างเขียนมีระดับ ต่อไปฉันจะไปที่สคริปต์เพิ่มPROG_CLASS_4=libreoffice.libreoffice-writer
และLANG4=3
ในพื้นที่ที่เหมาะสม สังเกตการจับคู่หมายเลข 4 ถัดไปไปที่โครงสร้างเคสและเพิ่มรายการต่อไปนี้ระหว่างล่าสุด;;
และ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 &
บันทึกย่อขนาดเล็ก: อีกวิธีหนึ่งในการค้นหาคลาสหน้าต่างสำหรับโปรแกรม (สิ่งที่ไปก่อนวงเล็บเหลี่ยมรอบเดียวในโครงสร้างเคส) คือการใช้สิ่งนี้xprop
และawk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}