প্রতি অ্যাপ্লিকেশন ডিফল্ট কীবোর্ড ভাষা নির্ধারণ করুন


11

নির্দিষ্ট অ্যাপ্লিকেশনগুলির জন্য ডিফল্ট কীবোর্ড ভাষা নির্ধারণ করা সম্ভব? আমি জানি যে সর্বদা একটি ডিফল্ট কীবোর্ড ভাষা দিয়ে একটি অ্যাপ্লিকেশন শুরু করার বিকল্প রয়েছে তবে আমি এটি চাই না।

আমি "ফিক্সড ওয়ার্কস্পেস" এর অনুরূপ কিছু সন্ধান করছি যা আপনি কমপিজকনফিগ ব্যবহার করে সেট করতে পারেন (আপনি ক্রোমকে সর্বদা এক্স 1ওয়াই 1 এ খুলতে, এক্স 2 ওয়াই 1 ইত্যাদিতে টার্মিনাল সেট করেন)। আমি যেখানে Chrome সেট করব এমন কিছু: চেক, টার্মিনাল: ইংরেজি, স্পটিফাই: ইংরাজী, ...


"পাঠ্য এন্ট্রি" তে "প্রতিটি উইন্ডোর জন্য বিভিন্ন উত্সের অনুমতি দিন" বিকল্প রয়েছে is সম্ভবত আপনার জন্য সঠিক দিকের একটি পদক্ষেপ।
গুনার হেজালমারসন 14

হ্যাঁ, আপনাকে ধন্যবাদ, আমি সে সম্পর্কে জানি। এটি আমি প্রয়োজনীয় পদক্ষেপটি বলব তবে দুর্ভাগ্যক্রমে আমি যা অর্জন করতে চাই তা তা নয়। যাই হোক ধন্যবাদ.
গ্রানগর 20

একটি স্ক্রিপ্টিং উপায় আছে। আপনার কেবলমাত্র সেই 3 টি অ্যাপ্লিকেশন প্রয়োজন বা অন্য কোনও অ্যাপ রয়েছে? আপনি স্ক্রিপ্টটি কতটা নমনীয় করতে চান তার উপর নির্ভর করে এটি লিখতে আমার কম-বেশি সময় লাগতে পারে
সের্গি কলডায়াজিনি 16

পাইথন জন্য আরেকটি ভালো কাজ মত @JacobVlijm সাউন্ড;)
Sergiy Kolodyazhnyy

একটি উত্তর পোস্ট। আপনি কী ভাবছেন তা আমাকে জানাতে দিন
সের্গেই কলডিয়াজহনি

উত্তর:


6

ভূমিকা

স্ক্রিপ্ট বেলো ভাষা মেনুতে সেই ভাষার অবস্থান অনুযায়ী প্রতিটি ব্যবহারকারী-সংজ্ঞায়িত প্রোগ্রামের জন্য ভাষা সেট করে। উদাহরণস্বরূপ, যদি আমার আদেশটি হয়: ইংরেজি (1), চাইনিজ (2) এবং রাশিয়ান (3), আমি ফায়ারফক্সকে ভাষা 2 রাখতে, টার্মিনাল 1 টি ভাষা এবং লিবারঅফিসের 3 ভাষা রাখতে পারি।

স্ক্রিপ্টটি দুটি অংশে আসে: প্রথম অংশটি হ'ল আসল স্ক্রিপ্ট যা কাজ করে, দ্বিতীয় স্ক্রিপ্ট একটি নিয়ন্ত্রণকারী উপাদান হিসাবে কাজ করে। ধারণাটি হ'ল ল্যাঙ্গুয়েজ সেটিং স্ক্রিপ্টটিকে একটি স্টার্ট-আপ অ্যাপ্লিকেশন হিসাবে চালানো এবং যখনই আপনাকে ম্যানুয়ালি ভাষা পরিবর্তন করতে হবে - নিয়ামক স্ক্রিপ্টের শর্টকাটে ডাবল ক্লিক করুন।

আগ্রহী

  1. 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 

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

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

স্ক্রিপ্ট কাজ করছে

  1. বলা আপনার হোম ডিরেক্টরিতে একটি ফোল্ডার তৈরি করুন bin। আপনি এটি ফাইল ম্যানেজারে করতে পারেন বা mkdir $HOME/binটার্মিনালে কমান্ডটি ব্যবহার করতে পারেন
  2. ইন 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
  3. দুটি .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 এর Writer, আমি LibreOffice Writer উইন্ডোটি খুলি, টার্মিনালে গিয়ে চালনা করি wmctrl -lx। এটি আমাকে বলবে যে রাইটার উইন্ডোতে ক্লাস রয়েছে libreoffice.libreoffice-writer। এরপরে আমি স্ক্রিপ্টে যাব, যুক্ত করতে PROG_CLASS_4=libreoffice.libreoffice-writerএবং LANG4=3উপযুক্ত জায়গায় area মিলের সংখ্যা 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}


আপনাকে ধন্যবাদ, এটি একটি দুর্দান্ত শুরু। একমাত্র (তবে প্রধান) সমস্যা হ'ল আমি সেই অ্যাপ্লিকেশনগুলিতে ভাষাটি স্যুইচ করতে সক্ষম হব না। স্ক্রিপ্টটি সর্বদা আমার সেটিংসকে ওভাররাইড করে। আমি সেই উইন্ডোতেও ভাষাটি স্যুইচ করতে সক্ষম হতে চাই। সুতরাং সম্ভবত অ্যাপ্লিকেশন পিডের জন্য কিছু চেক যুক্ত করুন এবং কেবল প্রথমবারের মতো ভাষা প্রয়োগ করুন বা এরকম কিছু?
গ্রানগর

আমি আরও পছন্দ করব যে এই স্ক্রিপ্টটি ইভেন্ট-চালিত হবে, লুপ-ভিত্তিক নয়। এটি কোনও বড় বিষয় নয় তবে আমি ডিবিাস বা কোনও কিছু দিয়ে কাজটি করার জন্য কীভাবে একটি ছোট সরবরাহ সরবরাহ করতে পারলে আমি সত্যিই প্রশংসা করব (যদি সম্ভব হয়)।
গ্রানগর

@ জিআরএনজিওআর তাই আমি এটি সম্পর্কে কিছুটা চিন্তা করেছি এবং এখন পর্যন্ত স্ক্রিপ্টটি থামিয়ে দিয়ে স্ক্রিপ্টটি kill -STOP $(pgrep set-lang.sh)আবার চালু করার উপায় আমি দেখতে পাচ্ছি না kill -CONT $(pgrep set-lang.sh)। এইভাবে আপনি এটিকে বিরতি দিতে পারেন, ভাষাগুলিতে সাধারণত স্যুইচ করতে পারেন এবং তারপরে আবার শুরু করতে পারেন।
সের্গেই কোলোডিয়াজনি

আমার কাছে একটি দ্রুত ধারণা ছিল যে সম্ভবত দুটি কমান্ডের জন্য একটি কীবোর্ড শর্টকাট ব্যবহার করা এটির উপায় হতে পারে, তবে আমি এখনও এটি পরীক্ষা করে দেখিনি, এখনও পর্যন্ত একটি তত্ত্ব a আমি পর্যাপ্ত নিদ্রা পেয়ে আবার ফিরে আসার পরে আগামীকাল পরীক্ষা করব :) এটি আমাকে গ্রহণযোগ্য ধারণা হতে পারে কিনা তা আমাকে জানান
সের্গি কলডিয়াজহনি

1
দুর্দান্ত এবং পুঙ্খানুপুঙ্খ কাজের জন্য +1! দুই ছোট জিনিস আমি চাই উল্লেখ: এক্সেকিউটেবল মধ্যে ~/bin, পথ (কিংবা এক্সটেনশন প্রয়োজন হবে না যেহেতু এটি রয়েছে $PATHএ দেখুন পুনরায় লগ পরে: lintian.debian.org/tags/script-with-language-extension .html ), এবং আপনি একটি .desktopফাইলের মধ্যে স্টপ / শুরু একত্রিত করতে পারেন ; একটি কুইকলিস্ট বা একটি টগল ফাংশন হয়। আমার কাছে বেশ নিখুঁত দেখাচ্ছে।
জ্যাকব Vlijm

1

আপনি gxneurএটি চালিয়ে ইনস্টল করতে পারেন

sudo apt-get install gxneur

এই সফ্টওয়্যারটি স্বয়ংক্রিয়ভাবে বিন্যাসগুলি স্যুইচ করতে পারে তবে এটি এর সাথে নিখুঁত নয়।

তবে ম্যানুয়াল লেআউট সুইচগুলি সেট আপ করার জন্য এটির খুব সুন্দর সরঞ্জাম রয়েছে।

আপনি যা চান ঠিক তেমন করতে পারেন। নির্দিষ্ট অ্যাপ্লিকেশনগুলির জন্য নির্দিষ্ট বিন্যাস সেট করতে।


0

নিচে স্ক্রিপ্ট তার সম্পাদিত সংস্করণ এই এক , যে একটি জন্য একটি অনুরূপ সমাধান হিসেবে পোস্ট করা হয়েছে একক আবেদন ( gnome-terminal) একটি সময় আগে।

একাধিক অ্যাপ্লিকেশনগুলির জন্য স্বয়ংক্রিয়ভাবে ভাষা সেট করার জন্য এটি ব্যবহার করতে সক্ষম হতে, এই প্রশ্নের জন্য স্ক্রিপ্টটি আংশিকভাবে পুনরায় লেখা হয়েছিল।

অনুশীলনে কীভাবে ব্যবহার করবেন; স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন অনুযায়ী সেট ভাষা মনে রাখবেন

স্ক্রিপ্ট প্রথমবারের শুরু হয়, তাহলে বর্তমান ভাষাটি ডিফল্ট ভাষা, যা একটি লুকানো ফাইলের মধ্যে পালন করা হয় গণ্য করা হয়: ~/.lang_set

তারপরে ব্যবহারটি সহজ: আপনি যদি geditসামনের সর্বাধিক উইন্ডোতে উদাহরণস্বরূপ চালনা করেন এবং কোনও আলাদা ভাষা সেট করেন তবে সেই ভাষাটি geditতখন থেকে স্বয়ংক্রিয়ভাবে সংযুক্ত থাকে, যতক্ষণ না আপনি আবার ভাষাটি geditসামনে রেখে পরিবর্তন করেন ।

নির্দিষ্ট ভাষা / অ্যাপ্লিকেশনগুলির সংখ্যা নীতিগতভাবে সীমাহীন; কেবল অ্যাপ্লিকেশনটি চালান এবং সামনে অ্যাপ্লিকেশন উইন্ডোটি দিয়ে ভাষা সেট করুন। কোডটি সম্পাদনা না করে অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে সেট এবং স্মরণ হয়ে যাবে।

ঘটনা চালিত?

যদিও স্ক্রিপ্টটি একটি লুপে চালিত হয় তবে সংস্থানগুলির ব্যবহার খুব কম হয়। ইভেন্ট চালিত মানে এই যে ইভেন্টটি সামনেরতম উইন্ডোর পরিবর্তন। আমি লুপ পরীক্ষা করার চেয়ে সামনের সর্বাধিক উইন্ডোতে "গুপ্তচরবৃত্তি" করা ছাড়া অন্য কোনও বিকল্প দেখছি না।

এই পান্ডুলিপি

#!/usr/bin/env python3
import subprocess
import os
import time

key = [
    "org.gnome.desktop.input-sources",
    "gsettings get ", "gsettings set ",
    " sources", " current",
    ]

prev = os.environ["HOME"]+"/.lang_set"

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def get_front():
    # produce the frontmost application
    try:
        focus = str(hex(int(get("xdotool getwindowfocus").strip())))
        front = focus[:2]+"0"+focus[2:]
        cmd = "wmctrl -lp"
        w_list = subprocess.check_output(["/bin/bash", "-c",cmd]).decode("utf-8")
        w_match = [w for w in w_list.splitlines() if front in w][0].split()[2]
        application = get("ps -p "+w_match+" -o comm=").strip()
        # fix for 15.04, where the process name of gnome-terminal varies
        application = "gnome-terminal" if "gnome-terminal" in application else application
        return application
    except subprocess.CalledProcessError:
        return None

def get_lang():
    # get the currently running language (output = string)
    curr_n = int(get(key[1]+key[0]+key[4]).strip().split()[-1])
    return str(eval(get(key[1]+key[0]+key[3]))[curr_n])

def read_prev(application):
    # reads the possibly set languages for general and specific use (list)
    if not os.path.exists(prev):
        currlang = get_lang()
        open(prev, "wt").write("default "+currlang+"\n"+application+" "+currlang)
        return [currlang, currlang]
    else:
        return [l.strip() for l in open(prev).readlines()]

def write_changed(application, lang):
    changelist = read_prev(front_2)
    try:
        match = changelist.index([l for l in changelist if application in l][0])
        changelist[match] = application+" "+lang+"\n"
    except IndexError:
        changelist.append(application+" "+lang+"\n")
    open(prev, "wt").write(("\n").join(changelist))

def set_lang(lang):
    # set the currently used language (input = string)
    lang_i = eval(get(key[1]+key[0]+key[3])).index(eval(lang))  
    cmd = key[2]+key[0]+key[4]+" "+str(lang_i)
    subprocess.Popen(["/bin/bash", "-c", cmd])

front_1 = get_front(); lang_1 = get_lang()

while True:
    time.sleep(1)
    front_2 = get_front(); lang_2 = get_lang()
    if front_2 != None:
        if front_2 != front_1:
            try:
                setlist = read_prev(front_2)
                match = [l for l in setlist if front_2 in l][0]
            except IndexError:
                match = [l for l in setlist if "default" in l][0]
                set_lang(match[match.find(" ")+1:])            
        elif lang_2 != lang_1:
            write_changed(front_2, lang_2)
    front_1 = front_2; lang_1 = lang_2

কিভাবে বসাব

  1. স্ক্রিপ্ট দুটি xdotoolএবং ব্যবহার করে wmctrl:

    sudo apt-get install wmctrl xdotool
    
  2. উপরের স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন set_language.py

  3. কমান্ড দ্বারা এটি পরীক্ষা করুন:

    python3 /path/to/set_language.py
    
  4. যদি সমস্ত প্রত্যাশিত হিসাবে কাজ করে তবে এটি স্টার্টআপ অ্যাপ্লিকেশনগুলিতে যুক্ত করুন: স্টার্টআপ অ্যাপ্লিকেশনগুলিতে যুক্ত করুন: ড্যাশ> স্টার্টআপ অ্যাপ্লিকেশন> যুক্ত করুন। কমান্ড যুক্ত করুন:

    python3 /path/to/set_language.py
    

এক মাপ সব ফিট! +1
ফাব্বী

আরে এর জন্য আপনাকে অনেক ধন্যবাদ, আমি শীঘ্রই এটি সন্ধান করব এবং এ সম্পর্কে আমার কেমন লাগছে তা আপনাকে জানাতে হবে :)
গ্রাংগর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.