插件的汉化记录

成功实现manifest.json调用百度翻译并写入文件,
那么按照这个办法,正则表达式匹配main.js,再调用翻译api就简单了
还得是python

但是
每次打开,obsidian会把我翻译好的部分删除掉,这个问题,待解决,

基本上是实现了,插件的汉化了,

源码稍后等github
1 个赞

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)