परिचय
स्क्रिप्ट मेनू भाषा मेनू में उस भाषा की स्थिति के अनुसार, प्रत्येक उपयोगकर्ता-निर्धारित कार्यक्रम के लिए भाषा सेट करता है। उदाहरण के लिए, यदि मेरा आदेश है: अंग्रेजी (1), चीनी (2), और रूसी (3), तो मैं भाषा 2 के लिए फ़ायरफ़ॉक्स, भाषा 1 के लिए टर्मिनल और भाषा 3 के लिए लिबरऑफिस सेट कर सकता हूं।
स्क्रिप्ट दो भागों में आती है: भाग एक वास्तविक स्क्रिप्ट है जो काम करती है, दूसरी स्क्रिप्ट एक नियंत्रित तत्व के रूप में कार्य करती है। भाषा सेटिंग स्क्रिप्ट को स्टार्ट-अप एप्लिकेशन के रूप में चलाने का विचार है और जब भी आपको मैन्युअल रूप से भाषा बदलने की आवश्यकता होती है - नियंत्रक स्क्रिप्ट पर शॉर्टकट पर डबल क्लिक करें।
पूर्व आवश्यक वस्तुएँ
- के
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
सेट- lang.sh स्क्रिप्ट के लिए लॉन्चर (.desktop) फ़ाइल
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
सेट-lang-controller.sh के लिए लॉन्चर (.desktop) फ़ाइल
[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
टर्मिनल में कमांड का उपयोग कर सकते हैं
- में
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 के लिए दो प्रविष्टियाँ जोड़ता है। अगला मामले की संरचना में उपयुक्त प्रविष्टि जोड़ें।
उदाहरण के लिए, अगर मुझे जोड़ना है, लिब्रे ऑफिस राइटर, मैं लिबर ऑफिस राइटर विंडो खोलता हूं, टर्मिनल पर जाता हूं और रन करता हूं 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
ऑनलाइनर का उपयोग करना है:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}