Pony of Shadows

Uncertainty is Fascinating.


Linux上超快的本地翻译

安装docker

  1. 在Archlinux上安装
sudo pacman -S docker
  1. 如果您所在的机构需要配置代理,创建并编辑文件/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=socks5h://127.0.0.1:20170"
Environment="HTTPS_PROXY=socks5h://127.0.0.1:20170"
Environment="NO_PROXY=localhost,127.0.0.1"

注意,对于v2raya,使用socks5而非HTTPS代理是必要的。 3. 让当前用户有权限使用docker

sudo usermod -aG docker $USER
  1. 启动docker服务
sudo systemctl enable --now docker

生成并启动libretranslate的容器

创建并编辑~/.local/bin/start_libretranslate.sh:

#!/bin/bash
#required by toggle-translate.sh

CONTAINER_NAME="libretranslate"

# 检查是否已经有容器在跑
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}\$"; then
  echo "Container ${CONTAINER_NAME} already exists."
  docker start ${CONTAINER_NAME}
  echo "now started"
else
  echo "Creating and starting new LibreTranslate container..."
  docker run -d --name libretranslate \
    -p 5000:5000 \
    -e LT_LOAD_ONLY=en,zh \
    -e LT_HOST=0.0.0.0 \
    libretranslate/libretranslate
fi

运行这个脚本会自动启动libretranslate的容器,如果本地该容器不存在,会自动下载它的image。因为docker下载站连接不稳定,可能需要多尝试几次。我设置的参数:

  • 只加载英语和中文的模型
  • 占用5000端口

在hyprland上用wl-paste监听clipboard更新并翻译,用jq提取返回的json数据得到翻译结果

创建并编辑~/.local/bin/clipboard-listener.sh:

#!/bin/bash
# required by toggle-translate.sh
wl-paste --watch bash ~/.local/bin/trans_and_notify.sh

创建并编辑~/.local/bin/trans_and_notify.sh:

#!/bin/bash
# required by clipboard-listener.sh
set -e
c=$(wl-paste)
[ -n "$c" ]
c=$(echo "$c" | awk 'NR==1{sub(/^[[:space:]]+/, "")} {if (/-$/){sub(/-$/,""); printf "%s", $0} else {printf "%s ", $0}}' | tr -d "\r" | tr -d '\000-\037\177')
if [[ ! $c =~ [一-龥] ]]; then
  t=$(curl -s -X POST http://localhost:5000/translate \
    -H "Content-Type: application/json" \
    -d "$(jq -n --arg q "$c" --arg src "en" --arg tgt "zh" \
      "{q: \$q, source: \$src, target: \$tgt}")" \
    | jq -r ".translatedText")
  msg="🆎→🀄 $(echo "$t" | grep -o -P '.{1,20}')"
  hyprctl notify 6 15000 "rgb(FF99CC)" "$msg"
else
  t=$(curl -s -X POST http://localhost:5000/translate \
    -H "Content-Type: application/json" \
    -d "$(jq -n --arg q "$c" --arg src "zh" --arg tgt "en" \
      "{q: \$q, source: \$src, target: \$tgt}")" \
    | jq -r ".translatedText")
  msg="🆎→🀄 $(echo "$t" | grep -o -P '.{1,20}')"
  hyprctl notify 6 15000 "rgb(FF99CC)" "$msg"
fi

wl-paste监听clipboard的每一次更新,判断是否为英文,并通过5000端口访问libretranslate容器,将clipboard内容上传5000drkz并收到到网页json文件。然后jq从json文件中读取翻译结果,通过hyprctl notify形成桌面通知。

hyprland快捷开关复制翻译

创建并编辑~/.local/bin/toggle-translate.sh:

#!/bin/bash
# required by ~/.config/hypr/hyprland.conf

# 检查监听进程是否正在运行
if pgrep -x wl-paste; then
    # 如果监听进程正在运行,结束翻译引擎并杀死进程
    #docker stop libretranslate
    pkill -x wl-paste
    hyprctl notify 6 3000 'rgb(FF5555)' $'⏸️ 复制后翻译已关闭,但libretranslate仍在运行。'
else
    # 如果没有运行,启动监听进程
    nohup bash /home/shadows/.local/bin/clipboard-listener.sh > /dev/null 2>&1 &
    wl-copy --clear
    bash ~/.local/bin/start_libretranslate.sh
    hyprctl notify 6 3000 'rgb(55FF55)' $'🔤 复制后翻译已开启'
fi

然后在hyprland配置文件~/.config/hypr/hyprland.conf中加入按键绑定:

bind = $mainMod, Z, exec, bash ~/.local/bin/toggle-translate.sh
bind = $mainMod SHIFT, Z, exec, bash -c "docker stop libretranslate && hyprctl notify 6 3000 'rgb(55FF55)' $'❌ libretranslate已关闭'; pkill -x wl-paste"

至此全部配置完成。

  • 按Super+Z切换复制翻译(开启复制翻译时会启动libretranslate容器)
  • 按Super+Shift+Z关闭libretranslate容器,这样关机的时候就不用再额外等待了。