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 definir o Firefox como idioma 2, o terminal como idioma 1 e o LibreOffice como 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 precisar alterar manualmente o idioma - clique duas vezes o atalho para o script do controlador.
Pré-requisitos
- Instale o programa
wmctrl
comsudo apt-get install wmctrl
.
Script
#!/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 de inicialização (.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 chamado
bin
. Você pode fazê-lo no gerenciador de arquivos ou usar o comandomkdir $HOME/bin
no terminal - Na pasta
bin
, crie dois arquivos:set-lang.sh
eset-lang-control.sh
. Salve o script emset-lang.sh
e o script do controlador emset-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 arquivos
.desktop
. Um éset-lang.desktop
. Deve ser colocado no diretório oculto.config/autostart
. O segundo éset-lang-controller.desktop
, pode ser colocado na sua pastabin
. Em seguida, arraste e fixe no lançador o arquivoset-lang-controller.desktop
. Isso se tornará o atalho para parar temporariamente e retomar 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 real). Por exemplo, o meu seria Exec=/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 tem uma instrução if que verifica se o idioma já foi configurado para o valor desejado.
O clique duplo no iniciador para set-lang-controller.sh
verificará o status do script set-lang.sh
; se o script estiver sendo executado, ele será pausado e, se o script for pausado, será retomado. Uma notificação será mostrada com mensagem apropriada.
Para personalizar o script, você pode abrir o (s) aplicativo (s) desejado (s), executar wmctrl -lx
e anotar a terceira coluna - a classe da janela. Exemplo de saída:
$ 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, eu abro a janela do LibreOffice Writer, vou para o terminal e execute wmctrl -lx
. Ele me dirá que a janela do Writer tem classe libreoffice.libreoffice-writer
. Em seguida, irei ao script, adicione PROG_CLASS_4=libreoffice.libreoffice-writer
e LANG4=3
na área apropriada. Observe o número correspondente 4. Em seguida, vá para a estrutura de casos e inclua a seguinte entrada entre os últimos ;;
e esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Novamente, observe o sinal $ e o número 4 correspondente.
Além disso, se o script estiver sendo executado como item de autostart e você quiser pará-lo temporariamente para personalizá-lo, use pkill set-lang.sh
e continue com nohup set-lang.sh > /dev/null 2&>1 &
Nota pequena: outra maneira de descobrir a classe de janela para um programa (aquele que vai antes do único colchete na estrutura do caso) é usar este xprop
e awk
oneliner: xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}