在 iTerm2 中使用 DeepLX 翻译

在 Claude 3.5 Sonnet 的帮助下,本地部署了一个 DeepLX 翻译服务,只要在 iTerm2 中输入文字,自动翻译成中文。最震惊的是问 Claude 3.5 Sonnet 后一遍过。下面是不断优化后的结果,从 trans_server.txt 自动查询一些可用的服务。保存翻译的结果到 book.txt,借助其他工具可方便转换为 epub。

deeplx in item2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import requests
import subprocess
import os
import random
import argparse
from datetime import datetime

LOCAL_API_URL = "http://localhost:1188/translate"
API_TOKEN = "your_access_token"
# 获取当前脚本的目录
current_path = os.path.dirname(os.path.realpath(__file__))
# 定义输出文件的路径
OUTPUT_FILE = os.path.join(current_path, "book.txt")
# OUTPUT_FILE = "book.txt"
SERVERS_FILE = "trans_server.txt"
USE_LOCAL_ONLY = False # 设置为 True 只使用本地服务

def update_txt_file(git_repo_path):
# 将 ~ 路径转换为实际路径
git_repo_path = os.path.expanduser(git_repo_path)

# 保存当前工作目录
current_dir = os.getcwd()
try:
# 切换到目标 git 仓库所在目录
os.chdir(git_repo_path)
# 执行 git pull 命令
subprocess.check_call(['git', 'pull'])
except subprocess.CalledProcessError as e:
print(f"Error occurred while updating txt file: {e}")
except FileNotFoundError as e:
print(f"Directory not found: {e}")
finally:
# 切换回原来的工作目录
os.chdir(current_dir)
def load_servers():
with open(SERVERS_FILE, 'r') as f:
return [line.strip() for line in f if line.strip()]

def save_servers(servers):
with open(SERVERS_FILE, 'w') as f:
for server in servers:
f.write(f"{server}\n")

def translate_text(text, source_lang, target_lang="ZH", current_server=None):
if current_server:
servers = [current_server]
else:
servers = [LOCAL_API_URL] + ([] if USE_LOCAL_ONLY else load_servers())
random.shuffle(servers)

headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_TOKEN}"
}
data = {
"text": text,
"source_lang": source_lang,
"target_lang": target_lang
}

for server in servers:
try:
response = requests.post(f"{server}/translate", json=data, headers=headers, timeout=10)
response.raise_for_status()
return response.json(), server
except requests.exceptions.RequestException as e:
print(f"Failed to connect to {server}: {e}")
if server != LOCAL_API_URL and server in load_servers():
remove_unavailable_server(server)

return None, None

def remove_unavailable_server(unavailable_server):
servers = load_servers()
if unavailable_server in servers:
servers.remove(unavailable_server)
save_servers(servers)
print(f"Removed unavailable server {unavailable_server} from {SERVERS_FILE}")

def save_translation(original, translated, server):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
# f.write(f"[{timestamp}]\n")
f.write(f"{original}\n")
f.write(f"{translated}\n")
# f.write(f"Server used: {server}\n")
# f.write("-" * 150 + "\n")

def main(source_lang):

# 替换成包含 txt 文件的 git 仓库路径
git_repo_path = '~/python/gist-ip'

# 调用函数更新 txt 文件
# update_txt_file(git_repo_path)

# 你现有的代码逻辑
# print("Updated txt file successfully, now running main script...")


print("Welcome to the Terminal Translator!")
print(f"Translating from {source_lang} to Chinese.")
print("To finish input and translate, enter a blank line.")
print("To exit, enter 'quit' or press Ctrl+C.")
print(f"Using local service only: {'Yes' if USE_LOCAL_ONLY else 'No'}")
print()

current_server = None

while True:
lines = []
while True:
try:
line = input()
if line.strip().lower() == 'quit':
print("Thank you for using the Terminal Translator. Goodbye!")
return
if not line:
break
lines.append(line)
except KeyboardInterrupt:
print("\nThank you for using the Terminal Translator. Goodbye!")
return

text = '\n'.join(lines).strip()
if not text:
continue

result, server = translate_text(text, source_lang, current_server=current_server)
if result and "data" in result:
translated = result["data"]
print(f"\n{translated}\n")
save_translation(text, translated, server)
current_server = server # 保存当前可用的服务器
else:
print("Translation failed. Trying another server...")
current_server = None # 重置当前服务器
result, server = translate_text(text, source_lang) # 重新尝试翻译
if result and "data" in result:
translated = result["data"]
print(f"\n{translated}\n")
save_translation(text, translated, server)
current_server = server # 保存新的可用服务器
else:
print("Translation failed. No available servers.")

if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Terminal Translator")
parser.add_argument("--lang", default="AUTO", help="Source language (default: EN)")
args = parser.parse_args()
main(args.lang)