A partir de pequenos textos em espanhol, que retirei de um grande relatório, para o projeto TumbaElBloqueo, precisei traduzí-los para vários idiomas (cinco). Pesquisei opções, e as com excelente reputação, são muito caras. E como pretendia automatizar essa tarefa, que será recorrente, me deparei com o LibreTranslate, pois além de ser uma ferramenta especializada, é OpenSouce.

Muito fácil instalar o pacote Python e usar, e até mesmo disponibilizar uma API e um site web local, mas eu queria um serviço permanente em minha máquina.

Costumo usar ASDF para gerir versões de linguagens de programação, mas, até por “conselho” recebido da LLM, usei o Python do sistema mesmo. Mas deixei o uso com ASDF explicado para referência.

Aqui segue uma espécie de logbook da minha instalação em um Fedora.

Um pequeno exemplo de uso

Aqui um exemplo bem simples de como usar (não usei requests) pra não complicar.

import json
from urllib.request import Request, urlopen

API_URL = "http://localhost:5000/translate"

TARGETS = {
    "pt": "Português",
    "en": "English",
    "fr": "Français",
    "it": "Italiano",
    "de": "Deutsch",
}


def translate(text, source, target):
    payload = json.dumps({
        "q": text,
        "source": source,
        "target": target,
    }).encode("utf-8")

    request = Request(
        API_URL,
        data=payload,
        headers={"Content-Type": "application/json"},
        method="POST",
    )

    with urlopen(request, timeout=30) as response:
        result = json.load(response)

    return result["translatedText"]


if __name__ == "__main__":
    text = "Hola, ¿cómo estás?"

    for code, language in TARGETS.items():
        translated = translate(text, source="es", target=code)
        print(f"{language:10} ({code}): {translated}")

Como saída, tem-se:

paulo@null ~> python t.py 
Português  (pt): Olá, como estás?
English    (en): Hey, how are you?
Français   (fr): Ça va ?
Italiano   (it): Ehi, come stai?
Deutsch    (de): Hey, wie geht es dir?

Estrutura de diretórios

/data/libtranslate/
├── venv/                          ← virtualenv isolado
│   ├── bin/
│   │   ├── python3.14 → /usr/bin/python3.14
│   │   ├── libretranslate         ← entrypoint
│   │   └── pip
│   └── lib/python3.14/site-packages/
├── .local/
│   └── share/argos-translate/packages/  ← modelos de tradução (~6,5 GB)
└── .config/
    └── argos-translate/

Instalação

1. Criar diretório

sudo mkdir -p /data/libtranslate

2. Ativar versão do Python com ASDF

asdf install python 3.14.6t
asdf set -u python 3.14.6t

3. Criar virtualenv apontando para o Python do sistema

O Python do ASDF fica em /home/$USER/.asdf/installs/python/ (inacessível para outros usuários). Por isso o venv é criado com o binário do sistema (/usr/bin/python3.14), garantindo que o usuário do serviço consiga executá-lo.

/usr/bin/python3.14 -m venv /data/libtranslate/venv

4. Instalar o LibreTranslate

/data/libtranslate/venv/bin/pip install libretranslate

Na primeira execução, o LibreTranslate baixa automaticamente os modelos de tradução (~6,5 GB). Os modelos ficam em ~/.local/share/argos-translate/packages/ (no caso, /data/libtranslate/.local/...).

5. Criar usuário dedicado

sudo useradd -r -s /usr/sbin/nologin -d /data/libtranslate libretranslate

6. Ajustar permissões

sudo chown -R libretranslate: /data/libtranslate

Configuração do serviço

7. Criar unit systemd

Arquivo: /etc/systemd/system/libretranslate.service

[Unit]
Description=LibreTranslate API
After=network.target

[Service]
Type=simple
User=libretranslate
Group=libretranslate
WorkingDirectory=/data/libtranslate
ExecStart=/data/libtranslate/venv/bin/libretranslate --host 127.0.0.1 --port 5000
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

8. Corrigir contexto SELinux

Em sistemas com SELinux em modo enforcing, o contexto default_t do diretório /data/ impede a execução pelo systemd. É necessário ajustar o contexto para bin_t:

sudo chcon -t bin_t /data/libtranslate/venv/bin/libretranslate

9. Ativar e iniciar

sudo systemctl daemon-reload
sudo systemctl enable libretranslate
sudo systemctl start  libretranslate

Gerenciamento

AçãoComando
Statussudo systemctl status libretranslate
Iniciarsudo systemctl start libretranslate
Pararsudo systemctl stop libretranslate
Reiniciarsudo systemctl restart libretranslate
Logssudo journalctl -u libretranslate -f
Habilitar no bootsudo systemctl enable libretranslate
Desabilitar no bootsudo systemctl disable libretranslate

Teste

# Verificar se a API responde
curl -X POST http://localhost:5000/translate \
  -d "q=Hello world&source=en&target=pt"

# Resposta esperada:
# {"translatedText":"Olá, mundo"}

Atualização do Python (ASDF)

  1. Instalar nova versão:
asdf install python 3.14.7t     # exemplo
asdf set -u python 3.14.7t
  1. Verificar se o novo Python está disponível em /usr/bin/python3.14. Se não, copiar:
sudo cp "$(asdf where python)/bin/python3.14" /usr/local/bin/
  1. Recriar o virtualenv:
sudo systemctl stop libretranslate
sudo rm -rf /data/libtranslate/venv
/usr/bin/python3.14 -m venv /data/libtranslate/venv      # ou /usr/local/bin/python3.14
/data/libtranslate/venv/bin/pip install libretranslate
sudo chcon -t bin_t /data/libtranslate/venv/bin/libretranslate
sudo systemctl start libretranslate

Atualização do LibreTranslate

sudo systemctl stop libretranslate
sudo -u libretranslate /data/libtranslate/venv/bin/pip install --upgrade libretranslate
sudo systemctl start libretranslate

Para atualizar os modelos de tradução:

sudo -u libretranslate /data/libtranslate/venv/bin/pip install --upgrade argos-translate-lt argos-translate-files

Solução de problemas

Erro 203/EXEC (Permission denied)

Causa: SELinux bloqueando a execução do binário (contexto default_t em vez de bin_t).

Solução:

sudo chcon -t bin_t /data/libtranslate/venv/bin/libretranslate
sudo systemctl restart libretranslate

Para verificar:

ls -Z /data/libtranslate/venv/bin/libretranslate
# Deve mostrar: system_u:object_r:bin_t:s0

Erro 203/EXEC — python3.14 inacessível

Causa: o python3.14 do venv é um symlink para /home/$USER/.asdf/... (permissão 700).

Solução: recriar o venv com o Python do sistema:

sudo rm -rf /data/libtranslate/venv
/usr/bin/python3.14 -m venv /data/libtranslate/venv
/data/libtranslate/venv/bin/pip install libretranslate

Serviço não escuta na porta após iniciar

Causa: o LibreTranslate está baixando ou carregando modelos na primeira execução. Pode levar de 1 a 5 minutos e consumir vários GB de RAM.

Verificação:

sudo journalctl -u libretranslate -f

Modelos de tradução não aparecem

O diretório de modelos é relativo ao home do usuário do serviço:

sudo ls -la /data/libtranslate/.local/share/argos-translate/packages/