Giới thiệu
Tập lệnh dưới đây đặt ngôn ngữ cho từng chương trình do người dùng xác định, theo vị trí của ngôn ngữ đó trong menu ngôn ngữ. Chẳng hạn, nếu đơn hàng của tôi là: tiếng Anh (1), tiếng Trung (2) và tiếng Nga (3), tôi có thể đặt Firefox có ngôn ngữ 2, thiết bị đầu cuối có ngôn ngữ 1 và LibreOffice có ngôn ngữ 3.
Kịch bản có hai phần: phần một là kịch bản thực tế thực hiện công việc, tập lệnh thứ hai đóng vai trò là yếu tố kiểm soát. Ý tưởng là để chạy tập lệnh cài đặt ngôn ngữ như một ứng dụng khởi động và bất cứ khi nào bạn cần thay đổi ngôn ngữ theo cách thủ công - nhấp đúp vào phím tắt đến tập lệnh điều khiển.
Điều kiện tiên quyết
- Cài đặt
wmctrl
chương trình với sudo apt-get install wmctrl
.
Kịch bản
#!/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 điều khiển
#!/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
Tệp trình khởi chạy (.desktop) cho tập lệnh 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
Tệp trình khởi chạy (.desktop) cho set-lang-controll.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
Làm cho kịch bản hoạt động
- Tạo một thư mục trong thư mục nhà của bạn được gọi là
bin
. Bạn có thể làm điều đó trong trình quản lý tệp hoặc sử dụng lệnh mkdir $HOME/bin
trong thiết bị đầu cuối
- Trong
bin
thư mục tạo hai tệp: set-lang.sh
và set-lang-control.sh
. Lưu tập lệnh set-lang.sh
và tập lệnh điều khiển vào set-lang-control.sh
. Làm cho cả hai tập lệnh thực thi vớisudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Tạo hai
.desktop
tập tin. Một là set-lang.desktop
. Phải được đặt trong .config/autostart
thư mục ẩn . Thứ hai là set-lang-controller.desktop
, có thể được đặt trong bin
thư mục của bạn . Tiếp theo kéo và ghim vào trình khởi chạy set-lang-controller.desktop
tệp. Điều này sẽ trở thành lối tắt để tạm thời dừng và tiếp tục thực thi tập lệnh.
LƯU Ý rằng dòng Exec=
phải được thay đổi để có tên người dùng thực tế của bạn trong đường dẫn đến tập lệnh (vì đó là thư mục chính thực tế của bạn). Ví dụ, của tôi sẽ làExec=/home/serg/bin/set-lang.sh
Giải thích và tùy biến:
Kịch bản lệnh tự chạy trong một vòng lặp vô hạn và kiểm tra cửa sổ hiện hoạt. Nếu cửa sổ hiện hoạt phù hợp với một trong các tùy chọn trong cấu trúc trường hợp, chúng tôi sẽ chuyển sang ngôn ngữ phù hợp. Để tránh cài đặt không đổi, mỗi phần của cấu trúc trường hợp có câu lệnh if kiểm tra xem ngôn ngữ đã được đặt thành giá trị mong muốn chưa.
Nhấp đúp chuột vào launcher cho set-lang-controller.sh
sẽ kiểm tra trạng thái của set-lang.sh
tập lệnh; nếu tập lệnh đang chạy - nó sẽ bị tạm dừng và nếu tập lệnh bị tạm dừng, nó sẽ được tiếp tục. Một thông báo sẽ được hiển thị với thông điệp thích hợp.
Để tùy chỉnh tập lệnh, bạn có thể mở (các) ứng dụng mong muốn, chạy wmctrl -lx
và ghi chú cột thứ ba - lớp cửa sổ. Đầu ra mẫu:
$ 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
Chọn các lớp cửa sổ thích hợp cho mỗi chương trình. Tiếp theo, đi đến phần của tập lệnh cho phép tùy chỉnh và thêm hai mục nhập cho PROG_CLASS và LANG. Tiếp theo thêm mục thích hợp trong cấu trúc trường hợp.
Chẳng hạn, nếu tôi muốn thêm, Nhà văn của LibreOffice, tôi mở cửa sổ LibreOffice Writer, đi đến terminal và chạy wmctrl -lx
. Nó sẽ cho tôi biết rằng cửa sổ Nhà văn có lớp libreoffice.libreoffice-writer
. Tiếp theo tôi sẽ đi đến kịch bản, thêm PROG_CLASS_4=libreoffice.libreoffice-writer
và LANG4=3
trong khu vực thích hợp. Thông báo khớp số 4. Tiếp theo, đi đến cấu trúc trường hợp và thêm mục sau đây giữa cuối ;;
và esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Một lần nữa, hãy chú ý dấu $ và khớp số 4.
Ngoài ra, nếu tập lệnh đang chạy như một mục tự khởi động và bạn muốn tạm thời dừng nó để tùy chỉnh nó, hãy sử dụng pkill set-lang.sh
và tiếp tục vớinohup set-lang.sh > /dev/null 2&>1 &
Lưu ý nhỏ: một cách khác để tìm ra lớp cửa sổ cho một chương trình (thứ đó đi trước dấu ngoặc tròn đơn trong cấu trúc trường hợp) là sử dụng cái này xprop
và awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}