Linux上超快的本地翻译
安装docker
- 在Archlinux上安装
sudo pacman -S docker
- 如果您所在的机构需要配置代理,创建并编辑文件
/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
- 启动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容器,这样关机的时候就不用再额外等待了。