Observe a resposta abaixo
A resposta foi originalmente escrita para 14.04, mas reescrita em 6 de janeiro de 2017, para também funcionar em (pelo menos) 16.04 e 16.10. wmctrl
não é mais necessário.
Script para definir automaticamente um idioma diferente para um único aplicativo.
Oquefaz
- Executandooscriptemsegundoplano,ousuáriopodedefinirumidiomadiferenteparaumaplicativoespecífico(nessecaso,
gnome-terminal
).Bastaexecutaroscripte,comoaplicativonafrente,definiroidiomadesejado. - Oidiomaserálembrado,noscript(duranteaexecução),bemcomoemumarquivooculto,aserlembradonapróximavezemqueoscriptforexecutado(nareinicializaçãodocomputador).
- Seousuáriodefinirofocoparaoutroaplicativo,oscriptvoltaráparaoidiomapadrão,sejaelequalfor.Alémdisso,oidiomapadrãoserálembrado,masousuáriopoderáalterá-loaqualquermomento(tambémoidiomaalteradoélembrado)
Notas
- Oscriptusaumconjuntoestendidodeferramentas(funções)paralevaremcontaqueousuáriodevepoderalteraroconjuntodeidiomasusados,eosidiomasdevemserlembrados,comosugeridono(s)comentário(s).Noentanto,émuito"leve", pois só usa a (s) função (ões) quando é necessário.
O script
#!/usr/bin/env python3
import subprocess
import time
import os
import ast
#--- set the "targeted" exceptional application below
app = "gnome-terminal"
#---
l_file = os.path.join(os.environ["HOME"], app+"_lang")
def_lang = os.path.join(os.environ["HOME"], "def_lang")
k = ["org.gnome.desktop.input-sources", "current", "sources"]
def get(cmd):
# helper function
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def run(cmd):
# helper function
subprocess.Popen(cmd)
def front():
# see if app has active window
front = get(["xdotool", "getactivewindow"])
data = get(["xprop", "-id", front])
if all([front, data]):
return app in get(["xprop", "-id", front])
else:
pass
def getlang():
# get the currently set language (from index, in case the sources are changed)
currindex = int(get(["gsettings", "get", k[0], k[1]]).split()[-1])
return sources[currindex]
def get_stored(file):
# read the set language
return sources.index(ast.literal_eval(open(file).read().strip()))
def get_sources():
return ast.literal_eval(get(["gsettings", "get", k[0], k[2]]))
sources = get_sources()
appfront1 = None
currlang1 = getlang()
while True:
time.sleep(1)
appfront2 = front()
if appfront2 != None:
currlang2 = getlang()
# change of frontmost app (type)
if appfront2 != appfront1:
if appfront2:
try:
run(["gsettings", "set", k[0], k[1], str(get_stored(l_file))])
except FileNotFoundError:
open(l_file, "wt").write(str(currlang2))
elif not appfront2:
try:
run(["gsettings", "set", k[0], k[1], str(get_stored(def_lang))])
except FileNotFoundError:
open(def_lang, "wt").write(str(currlang2))
elif currlang2 != currlang1:
f = l_file if appfront2 else def_lang
open(f, "wt").write(str(currlang2))
appfront1 = appfront2
currlang1 = currlang2
Como usar
-
O script usa
xdotool
:sudo apt-get install xdotool
-
Copie o script acima em um arquivo vazio, salve-o como
set_language.py
-
Teste-o pelo comando:
python3 /path/to/set_language.py
Ao executar o script:
- defina o idioma (padrão).
- abra o terminal (gnome-), defina o idioma a ser usado com o terminal
- Alterne entre os dois e veja se o idioma muda automaticamente.
Você pode alterar o idioma padrão como o idioma do terminal a qualquer momento . Os idiomas definidos serão lembrados. -
Se tudo funcionar como esperado, adicione-o a Aplicativos de inicialização: Adicionar a aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
python3 /path/to/set_language.py
Explicação, a história curta (conceitual):
O script usa dois arquivos para armazenar os idiomas definidos para o idioma padrão e o idioma usado no aplicativo excepcional ( gnome-terminal
, neste caso, mas você pode definir qualquer aplicativo).
O script, em seguida, periodicamente (uma vez por segundo) faz dois testes:
- Se a janela ativa pertencer ao aplicativo excepcional
- Qual é o idioma de entrada atualmente definido
O script compara a situação com o (s) teste (s) um segundo atrás. Então se:
-
houve uma mudança na aplicação:
excepcional - > padrão : leia o arquivo de idioma para o idioma padrão & amp; Definir idioma. Se o arquivo não existir (jet), crie-o, armazene o idioma atual como padrão.
padrão - > excepcional : o contrário. -
Se houve uma mudança na linguagem (mas não na classe da janela):
Podemos supor que o usuário defina um idioma diferente para o aplicativo excepcional ou o idioma de entrada padrão - > escreva o idioma de entrada usado atualmente no arquivo correspondente (para idioma padrão ou idioma excepcional).