Introdução
O script abaixo define o idioma para cada programa definido pelo usuário, de acordo com a posição desse idioma no menu de idiomas. Por exemplo, se meu pedido for: inglês (1), chinês (2) e russo (3), posso configurar o Firefox para o idioma 2, o terminal para o idioma 1 e o LibreOffice para o idioma 3.
O script vem em duas partes: a primeira parte é o script real que faz o trabalho, o segundo script serve como um elemento de controle. A idéia é executar o script de configuração de idioma como um aplicativo de inicialização e sempre que você precisar alterar manualmente o idioma - clique duas vezes no atalho do script do controlador.
Pré-requisitos
- Instale o
wmctrl
programa com sudo apt-get install wmctrl
.
Roteiro
#!/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 do Controlador
#!/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
Arquivo do iniciador (.desktop) para o script 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
Arquivo do Launcher (.desktop) para 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
Fazendo o script funcionar
- Crie uma pasta no seu diretório pessoal chamada
bin
. Você pode fazer isso no gerenciador de arquivos ou usar o comando mkdir $HOME/bin
no terminal
- Na
bin
pasta, crie dois arquivos: set-lang.sh
e set-lang-control.sh
. Salve o script set-lang.sh
e o script do controlador em set-lang-control.sh
. Torne os dois scripts executáveis comsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Crie dois
.desktop
arquivos. Um é set-lang.desktop
. Deve ser colocado no .config/autostart
diretório oculto . O segundo é set-lang-controller.desktop
, pode ser colocado em sua bin
pasta. Em seguida, arraste e fixe o set-lang-controller.desktop
arquivo no iniciador . Isso se tornará o atalho para interromper e retomar temporariamente a execução do script.
Observe que a linha Exec=
deve ser alterada para ter seu nome de usuário real no caminho para o script (porque esse é seu diretório pessoal). Por exemplo, o meu seriaExec=/home/serg/bin/set-lang.sh
Explicação e personalização:
O próprio script é executado em um loop while infinito e verifica a janela ativa atual. Se a janela ativa atual corresponder a uma das opções na estrutura do caso, mudaremos para o idioma apropriado. Para evitar a configuração constante, cada parte da estrutura do caso possui uma instrução if que verifica se o idioma já foi definido com o valor desejado.
O clique duplo no iniciador set-lang-controller.sh
verificará o status do set-lang.sh
script; se o script estiver em execução - ele será pausado e, se o script estiver em pausa, será retomado. Uma notificação será mostrada com a mensagem apropriada.
Para personalizar o script, você pode abrir os aplicativos desejados, executar wmctrl -lx
e anotar a terceira coluna - a classe da janela. Saída de amostra:
$ 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
Selecione as classes de janela apropriadas para cada programa. Em seguida, vá para a parte do script que permite a personalização e adicione duas entradas para PROG_CLASS e LANG. Em seguida, adicione a entrada apropriada na estrutura do caso.
Por exemplo, se eu quiser adicionar o Writer do LibreOffice, abro a janela do LibreOffice Writer, vou para o terminal e corro wmctrl -lx
. Isso me dirá que a janela do Writer tem classe libreoffice.libreoffice-writer
. Em seguida, irei ao script, adicionarei PROG_CLASS_4=libreoffice.libreoffice-writer
e LANG4=3
na área apropriada. Observe o número correspondente 4. Em seguida, vá para estrutura do caso e adicione a seguinte entrada entre last ;;
e esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Mais uma vez, observe o sinal $ e o número correspondente 4.
Além disso, se o script estiver sendo executado como um item de inicialização automática e você desejar pará-lo temporariamente para personalizá-lo, use pkill set-lang.sh
e continue comnohup set-lang.sh > /dev/null 2&>1 &
Nota pequena: outra maneira de descobrir a classe de janela para um programa (o material que antecede o suporte redondo único na estrutura do caso) é usar this xprop
e awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}