成功实现manifest.json调用百度翻译并写入文件,
那么按照这个办法,正则表达式匹配main.js,再调用翻译api就简单了
还得是python
但是
每次打开,obsidian会把我翻译好的部分删除掉,这个问题,待解决,
基本上是实现了,插件的汉化了,
源码稍后等github
成功实现manifest.json调用百度翻译并写入文件,
那么按照这个办法,正则表达式匹配main.js,再调用翻译api就简单了
还得是python
但是
每次打开,obsidian会把我翻译好的部分删除掉,这个问题,待解决,
基本上是实现了,插件的汉化了,
源码稍后等github
python实现功能如下:
查找指定文件夹下的所以指定的文件,
备份文件,如果备份文件已存在,renturn
读取文件内容,
匹配要翻译的所有句子,(可能是多行,不知道是哪一行,
用bing translator翻译找到的句子,
修改文件,
完成
成功使用js调用百度翻译api实现文本翻译,
但是将功能加入自己的插件,
他就不能访问百度api,
错误信息概要:
不能从app//:obsidian.md访问http://百度翻译api
找了一圈,找不到答案
使用的访问包: axios.get()
对js不熟,搞不定,改换python
成功使用py调用百度翻译api翻译,
下一步:实现插件的批量翻译
问题:百度翻译api不能访问太频繁,否则会出错
是否能用其他翻译方法,如本地翻译方案:待测
oh!yeah
成功实现插件汉化,python源码放github上了,
gitee也放一份,
算了直接放源码吧
# -*- coding: utf-8 -*-
import os # 导入os模块,用于操作文件和目录
import json # 导入json模块,用于读写JSON文件
import re # 导入re模块,用于正则表达式操作
import time # 导入time模块,虽然脚本中未使用,但可能用于记录时间
import shutil # 导入shutil模块,用于文件操作,如复制文件
import requests
import random
from hashlib import md5
def Baidu_Text_transAPI(query, from_lang='auto', to_lang='zh'):
# Set your own appid/appkey.
appid = '00000000000'# 你的api
appkey = 'secret'# 你的key
endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path
# Generate salt and sign
def make_md5(s, encoding='utf-8'):
return md5(s.encode(encoding)).hexdigest()
salt = random.randint(32768, 65536)
sign = make_md5(appid + query + str(salt) + appkey)
# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()
return result['trans_result']
def restore_bak_file(folder):
if not os.path.exists(bak_folder):
return
if not os.path.exists(os.path.join(bak_folder,folder)):
return
if os.path.isfile(main_file):
os.remove(main_file)
shutil.copyfile(main_bak_file,main_file)
else:
shutil.copyfile(main_bak_file,main_file)
def del_data(folder):
del_file_path = os.path.join(bak_folder, folder)
if os.path.exists(del_file_path):
shutil.rmtree(del_file_path)
os.remove(del_file_path)
def translate_main(folder):
# 检查bak文件夹是否存在
if not os.path.exists(bak_folder):
os.mkdir(bak_folder)
# 检查bak文件夹下是否存在对应文件夹
if not os.path.exists(os.path.join(bak_folder,folder)):
os.mkdir(os.path.join(bak_folder,folder))
# 备份manifest.json
if os.path.isfile(mnfst_file):
# 检查manifest.json备份文件是否存在
if not os.path.isfile(mnfst_bak_file_path): # 如果备份文件不存在
shutil.copyfile(mnfst_file, mnfst_bak_file_path) # 创建备份文件
# 备份main.js
if os.path.isfile(main_file):
if not os.path.isfile(main_bak_file): # 如果备份文件不存在
shutil.copyfile(main_file, main_bak_file)
with open(main_file, 'r', encoding='utf-8') as f:
main_cont = f.read() # 读取文件内容
need_tran={}
for r in regexps: # 匹配要改的内容字符串
matches = re.findall(r, main_cont)
# print(matches)
for match in matches:
need_tran[match[1]] = match[1]
pattern = re.compile(r'[<>{}\$=]')# 过滤包含<>{}$=的值的键值对
need_tran={k: v for k, v in need_tran.items() if not pattern.search(v) and (len(k)>3)}
translated_json = {} # 初始化翻译后的字典
while need_tran:
res_data = Baidu_Text_transAPI('\n'.join(need_tran.values())) # 调用翻译函数
for l in res_data: # 遍历翻译结果
translated_json[l['src']] = l['dst'] # 将原文和译文添加到字典
need_tran = { # 数据清洗
key: value for key, value in need_tran.items()
if key not in translated_json
}
time.sleep(1)
# 将翻译好的字典写入文件
with open(traned_json_file, 'w', encoding='utf-8') as f:
json.dump(translated_json, f, ensure_ascii=False, indent=4)
for key, value in translated_json.items(): # 遍历翻译后的字典
main_cont = main_cont.replace(key, value) # 替换原文为译文
with open(main_file, 'w', encoding='utf-8') as f: # 写入更新后的文件内容
f.write(main_cont)
def sec_tran_main(folder):
with open(need_tran_json_file, 'r', encoding='utf-8') as f:
need_tran_json = json.load(f)
traned_json_file= os.path.join(bak_folder, folder, 'traned.json')
with open(traned_json_file, 'r', encoding='utf-8') as f:
translated_json = json.load(f)
need_tran_json = { # 数据清洗
key: value for key, value in need_tran_json.items()
if key not in translated_json and (len(key) > 3)
}
if not need_tran_json:
with open(need_tran_json_file, 'w', encoding='utf-8') as f:
json.dump(need_tran_json, f, ensure_ascii=False, indent=4)
return
with open(need_tran_json_file, 'w', encoding='utf-8') as f:
json.dump(need_tran_json, f, ensure_ascii=False, indent=4)
res_data = Baidu_Text_transAPI('\n'.join(need_tran_json.values())) # 调用翻译函数
new_translated_json = {} # 初始化翻译后的字典
for l in res_data: # 遍历翻译结果
new_translated_json[l['src']] = l['dst'] # 将原文和译文添加到字典
# print(translated_json)
# 将翻译好的字典添加到文件
translated_json.update(new_translated_json)
with open(traned_json_file, 'w', encoding='utf-8') as f:
json.dump(translated_json, f, ensure_ascii=False, indent=4)
with open(main_file, 'r', encoding='utf-8') as f:
main_cont = f.read()
for key, value in new_translated_json.items(): # 遍历翻译后的字典
main_cont = main_cont.replace(key, value) # 替换原文为译文
with open(main_file, 'w', encoding='utf-8') as f: # 写入更新后的文件内容
f.write(main_cont)
if __name__ == '__main__':
folder = 'dataview' # 指定要处理的文件路径
regexps = [
r'createEl\(([\'"`]).+?\1.+?\1(.+?)\1',
r'Notice\(\s*([\'"`])(.+?)\1\s*\)',
r'.setText\(\s*([\'"`])(.+?)\1\s*\)',
r'.setButtonText\(\s*([\'"`])(.+?)\1\s*\)',
r'.setName\(\s*([\'"`])(.+?)\1\s*\)',
r'.setDesc\(\s*([\'"`])(.+?)\1\s*\)',
r'.setPlaceholder\(\s*([\'"`])(.+?)\1\s*\)',
r'.setTooltip\(\s*([\'"`])(.+?)\1\s*\)',
r'.appendText\(\s*([\'"`])(.+?)\1\s*\)',
r'.innerText\s*=\s*([\'"`])(.+?)\1'
]
mnfst_file = folder + '/' + 'manifest.json' # 构建manifest.json文件的路径
main_file = folder + '/' + 'main.js'
bak_folder = '翻译数据存档'
mnfst_bak_file_path=os.path.join(bak_folder,folder,'manifest.json')
main_bak_file=os.path.join(bak_folder,folder,'main.js')
need_tran_json_file=os.path.join(bak_folder,folder,'need_tran.json')# 将原文件需要改的内容保存到need_tran
traned_json_file = os.path.join(bak_folder,folder,'traned.json')
translate_main(folder) # 注释掉的函数调用,原本用于处理manifest.json文件
# sec_tran_main(folder)
# restore_bak_file(folder)
# del_data(folder)