From 2f1aa67896477a150aff196d453abdb351f80e23 Mon Sep 17 00:00:00 2001 From: huxiaoshuang Date: Wed, 23 Nov 2022 10:27:46 +0800 Subject: [PATCH] 'init --- BaiduTrans.py | 50 ++++++++++++++++ app.py | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++ tclient.py | 51 ++++++++++++++++ trans.py | 116 +++++++++++++++++++++++++++++++++++ 4 files changed, 380 insertions(+) create mode 100644 BaiduTrans.py create mode 100644 app.py create mode 100644 tclient.py create mode 100644 trans.py diff --git a/BaiduTrans.py b/BaiduTrans.py new file mode 100644 index 0000000..e5c2fa2 --- /dev/null +++ b/BaiduTrans.py @@ -0,0 +1,50 @@ +# 百度通用翻译API,不包含词典、tts语音合成等资源,如有相关需求请联系translate_api@baidu.com +# coding=utf-8 + +import http.client +import hashlib +import urllib +import random +import json +import time + +appid = '20181013000218671' # 填写你的appid +secretKey = '3CJvgUQRitUNeo7shcTJ' # 填写你的密钥 + +httpClient = None +myurl = '/api/trans/vip/translate' + +# fromLang = 'auto' # 原文语种 +# toLang = 'zh' # 译文语种 +# toLang = 'en' # 译文语种 + +salt = random.randint(32768, 65536) +q = 'apple' + + +def transBaidu(q='hello',fromLang='',toLang=''): + # print('q---',q) + sign = appid + q + str(salt) + secretKey + sign = hashlib.md5(sign.encode()).hexdigest() + global myurl + myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote( + q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign + + try: + httpClient = http.client.HTTPConnection('api.fanyi.baidu.com') + httpClient.request('GET', myurl) + # response是HTTPResponse对象 + response = httpClient.getresponse() + result_all = response.read().decode("utf-8") + result = json.loads(result_all) + # print (type(result)) + # print ((result)) + # print('翻译结果-----',result['trans_result'][0]["dst"]) + time.sleep(1) #限制频率 + # print(result) + return(result['trans_result'][0]["dst"]) + except Exception as e: + print('error---',e) + finally: + if httpClient: + httpClient.close() \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..9107053 --- /dev/null +++ b/app.py @@ -0,0 +1,163 @@ +# from importlib.resources import path +import os +import re +import string +import time + +from BaiduTrans import transBaidu +from trans import getinfo,postData,transI18,transWord +from tclient import tenTrans +import requests +import random + + + +# 处理单个文件 +def transFile(fileName): + # 生成新的数据data [lines的形式] + newData=[] + print('执行文件===>',fileName) + # 读取每一行 + with open(fileName,'r',encoding='utf8') as fLines: + # for line in fLines.readlines(): #依次读取每行 + for index,line in enumerate(fLines.readlines()): #依次读取每行 + newline = line.strip() #去掉每行头尾空白 -获取字符串 + # print ("读取的数据为: %s" % (line)) + # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 + # (.*?) 表示"非贪婪"模式,===>只保存第一个匹配到的子串 + # ^title: |^label: | :使用模板字符串 =使用{} + matchObj = re.match( r'(.*text: |.*title: |.*label: |.*label=|.*placeholder=|.*message: |.*placeholder: |.*title=)["||\'](.*?)["||\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + + matchObjsingal = re.match( r'(.*text: |.*title: |.*label: |.*message: |.*placeholder: )[\'](.*?)[\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + matchObjmore = re.match( r'(.*text: |.*title: |.*label: |.*message: |.*placeholder: )["](.*?)["]', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + + matchquerysl= re.match( r'(.*label=|.*placeholder=|.*title=)[\'](.*?)[\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + matchquerymore= re.match( r'(.*label=|.*placeholder=|.*title=)["](.*?)["]', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + + # 识别中文字符 + znRe=re.match( r'.*["||\']([\u4e00-\u9fa5]+?)["||\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + znResigal=re.match( r'.*["||\']([\u4e00-\u9fa5]+?)["||\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + znRemore=re.match( r'.*["||\']([\u4e00-\u9fa5]+?)["||\']', newline, re.M|re.I) #匹配title/label开始---- '/"结束 | re.M| + + + + + # 匹配 + if matchObj: + # if False: + print ("原始语句------------------------ : ", matchObj.group()) #label: "hello' + # print ("matchObj.group(1) : ", matchObj.group(1)) #标识符 label: + # print ("matchObj.group(2) : ", matchObj.group(2)) #要替换的字符串 hello + oldWord=matchObj.group(2) + # enWord=transBaidu(oldWord,'zh','en') # 百度-执行中文翻译 + enWord=tenTrans(oldWord,'zh','en') # 执行中文翻译 + Idword=tenTrans(oldWord,'zh','id') # 执行印尼翻译 --api不支持 + key=transI18(oldWord,enWord,Idword) + globalKey='`${'+'window.i18n("{key}")'.format(key=key)+'}`' + reline=line + if matchObjsingal: + reline=line.replace("'{}'".format(oldWord),globalKey,1) #仅全局替换1次字符 + elif matchObjmore: + reline=line.replace("\"{}\"".format(oldWord),globalKey,1) #仅全局替换1次字符 + elif matchquerysl: + if '==' not in line or '?' not in line: + globalKey='{'+'`${'+'window.i18n("{key}")'.format(key=key)+'}`'+'}' + reline=line.replace("'{}'".format(oldWord),globalKey,1) #仅全局替换1次字符 + elif matchquerymore: + # 判断?或者==表达式 [排除翻译] + if '==' not in line or '?' not in line: + globalKey='{'+'`${'+'window.i18n("{key}")'.format(key=key)+'}`'+'}' + reline=line.replace("\"{}\"".format(oldWord),globalKey,1) #仅全局替换1次字符 + #replace替换-字符串 + # reline=line.replace("'{}'".format(oldWord),globalKey,1) #仅全局替换1次字符 + print('globalKey--',globalKey) + print('替换语句------------------------ ',reline) + #每行写入 + newData.append(reline) + else: + # 识别中文字符 + newznList=re.findall("[\u4e00-\u9fa5]+",newline) + newznListsignal=re.findall('[\u4e00-\u9fa5]+',newline) + # newznListMore=re.findall('[\u4e00-\u9fa5]+',newline) + # newznList=re.findall('["||\'][\u4e00-\u9fa5]+["||\']',newline) + # newznListsignal=re.findall('[\'][\u4e00-\u9fa5]+[\']',newline) + # newznListMore=re.findall('["][\u4e00-\u9fa5]+["]',newline) + print('newznList',newznList) + print('newznListsignal',newznListsignal) + # print('newznListMore',newznListMore) + + + + + # 没有中文字符 + if(len(newznList)==0): + # print ("No match!!") + newData.append(line) + else: + znline=line + # znline=tensWord(line,newznList) + for index,znWord in enumerate(newznList): + # print('newList',newznList) + # 翻译中文单词-英文 + # enWord=transBaidu(znWord,'zh','en') # 百度-执行中文翻译 + enWord=tenTrans(znWord,'zh','en') # 执行中文翻译 + Idword=tenTrans(znWord,'zh','id') # 执行印尼翻译 --api不支持 + enwordkey=transI18(znWord,enWord,Idword) + print('znWord---enWord',znWord,enWord) + enwordKey='`${'+'window.i18n("{key}")'.format(key=enwordkey)+'}`' + # znline=znline.replace(znWord,enwordKey,1) #仅全局替换1次字符 + if znWord in newznListsignal: + print('单个') + znline=znline.replace("'{}'".format(znWord),enwordKey,1) #仅全局替换1次字符 + znline=znline.replace("\"{}\"".format(znWord),enwordKey,1) #仅全局替换1次字符 + # znline=znline.replace(znWord,enwordKey,1) #仅全局替换1次字符 + + print('znline1--',znline) + + # if znWord in newznListMore: + # print('双引号') + # print('znline222--',znline) + # znline=znline.replace("\"{}\"".format(znWord),enwordKey,1) #仅全局替换1次字符 + # # znline=znline.replace(znWord,enwordKey,1) #仅全局替换1次字符 + # print('znline2--',znline) + + # znline=znline.replace("\"{}\"".format(znWord),enwordKey,1) #仅全局替换1次字符 + # print('znline--',znline) + print('znline--',znline) + newData.append(znline) + + + + + # 写入文件 + with open(fileName,'w',encoding='utf8') as newfLines: + newfLines.writelines(newData) + +def listFile(): + newDir = input('请输入文件或者目录:') + # 判断类型: 文件还是目录 + #1. 文件类型 + if(os.path.isfile(newDir)): + transFile(newDir) + # pass + else: + #2. 目录类型 + print('遍历目录',newDir) + for root, dirs, files in os.walk(eval(repr(newDir.replace('"', '')))): + # for root, dirs, files in os.walk(eval(repr(".")) , topdown=False): + # 遍历子目录 + for name in dirs: + pass + # 遍历文件名 + for name in files: + fileName=os.path.join(os.getcwd(), root,name) #windows系统异常 + print(fileName) + transFile(fileName) + + +# 主程序-打包exe +if __name__=='__main__': + listFile() + input("按任意键回车停止") + print("已停止") + diff --git a/tclient.py b/tclient.py new file mode 100644 index 0000000..25e78ea --- /dev/null +++ b/tclient.py @@ -0,0 +1,51 @@ +import json +from tencentcloud.common import credential +from tencentcloud.common.profile.client_profile import ClientProfile +from tencentcloud.common.profile.http_profile import HttpProfile +from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException +from tencentcloud.tmt.v20180321 import tmt_client, models + +def tenTrans(SourceText='',Source='zh',Target=''): + try: + # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 + # 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 + cred = credential.Credential("AKIDZ1CFLH3dz8HJ7jicO2TVRAgFua7RXQ6m", "rVza2GMMExW2k5JSaZJyY3QrBLRJyQfu") + # 实例化一个http选项,可选的,没有特殊需求可以跳过 + httpProfile = HttpProfile() + httpProfile.endpoint = "tmt.tencentcloudapi.com" + + # 实例化一个client选项,可选的,没有特殊需求可以跳过 + clientProfile = ClientProfile() + clientProfile.httpProfile = httpProfile + # 实例化要请求产品的client对象,clientProfile是可选的 + client = tmt_client.TmtClient(cred, "ap-beijing", clientProfile) + + # 实例化一个请求对象,每个接口都会对应一个request对象 + req = models.TextTranslateRequest() + params = { + "SourceText": SourceText, + "Source": Source, + "Target": Target, + "ProjectId": 1314553376 + } + req.from_json_string(json.dumps(params)) + + # 返回的resp是一个TextTranslateResponse的实例,与请求对象对应 + resp = client.TextTranslate(req) + # 输出json格式的字符串回包 + print(resp.to_json_string()) + print(resp.TargetText) + return(resp.TargetText) + + + # { + # "Response": { + # "RequestId": "6c9f968b-4149-4256-a567-8af75f28e180", + # "Source": "zh", + # "Target": "en", + # "TargetText": "Hello" + # } + # } + + except TencentCloudSDKException as err: + print(err) \ No newline at end of file diff --git a/trans.py b/trans.py new file mode 100644 index 0000000..2987a3c --- /dev/null +++ b/trans.py @@ -0,0 +1,116 @@ + +from BaiduTrans import transBaidu +import requests +import random +import os +import re +import time +from tclient import tenTrans + +def getinfo(oldWord): + print('查询多语言------------------------ ') + searchUrl='http://vision.xytech.com/api/language/index' + searchPayload = {'bizId': '48', 'current': '1','pageSize': '10','search':oldWord} + headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36','Accept':'application/json, text/plain, */*','Content-Type':'application/json; charset=utf-8','Cookie':'_clck=1becfu3|1|f11|0; locale=zh_CN; XY_USER=t0LuUri548F8CcdkpOeuJw==s'} + r = requests.get(searchUrl,headers=headers, params=searchPayload) + return r + +def postData(oldWord='',newWord='',Idword='',newkey=''): + print('!!!!!!===新增多语言====!!!!!!!! ') + print('中文:',oldWord) + print('英文:',newWord) + # print('印尼:',Idword) + print('key编码:',newkey) + print('-------------------------------') + postUrl='http://vision.xytech.com/api/language/create' + headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36','Accept':'application/json, text/plain, */*','Content-Type':'application/json; charset=utf-8','Cookie':'_clck=1becfu3|1|f11|0; locale=zh_CN; XY_USER=t0LuUri548F8CcdkpOeuJw==s'} + # in_ID印尼语=>'in_ID':Idword, + postPayload={'bizId':'48','en_US':newWord,'key':newkey,'zh_CN':oldWord,'in_ID':Idword,'id':45809} + r = requests.post(postUrl,headers=headers, params=postPayload) + return r + + +def transI18(oldWord:str,newWord:str,Idword:str): + # print('调用多语言接口------------------------ ') + # 生成自由编码 + newkey='' + try: + # newkey=newWord.replace(' ','-') +'-'+str(random.randint(1,10000) ) + newkey=newWord.replace(' ','_') +'_'+str(random.randint(1,10000) ) # 下划线容易复制 + + except: + newkey=oldWord+'-'+str(random.randint(1,10000)) + print('生成key: ',newkey) + r = getinfo(oldWord) + newlist=r.json()["data"] + + if(len(newlist)>0): + itemArr=[] + for item in newlist: + itemArr.append(item["key"]) + itemArr.append(item["zh_CN"]) + if item["zh_CN"]==oldWord: + print('中文数据存在------------------------ ') + newkey=item["key"] + print('newkey-----',newkey) + break + elif item["key"]==oldWord: + # pass + print('key数据存在------------------------ ') + newkey=item["key"] + break + else: + pass + # print('数据库不存在------------------------ ') + #post新增接口 + + if newWord!='None' : + r =postData(oldWord,newWord,newkey) + print('post----',r.json()) + if oldWord not in itemArr: + print('数据库不存在------------------------ ') + #post新增接口 + # r =postData(oldWord,newWord,Idword,newkey) + else: + # print('没有查询结果') + #post新增接口 + newWord!='None' : + r =postData(oldWord,newWord,Idword,newkey) + # print('即将替换的key值------------------------ ',newkey) + return newkey + + +# oldWord=input('请输入要翻译的单词:') +# newWord=transBaidu(oldWord) # 执行翻译 +# key=transI18(oldWord,newWord) +# globalKey='`${'+'window.i18n("{key}")'.format(key=key)+'}`' + +def transWord(): + print('windows请先关闭charles和clash代理') + oldWord=input('请输入要翻译的单词:') + newWord=transBaidu(oldWord,'zh','en') # 百度-执行中文翻译 + newWord=tenTrans(oldWord,'zh','en') # 执行中文翻译 + Idword=tenTrans(oldWord,'zh','id') # 执行印尼翻译 --api不支持 + key=transI18(oldWord,newWord,Idword) + win='window.i18n("{key}")'.format(key=key) + globalKey='`${'+'window.i18n("{key}")'.format(key=key)+'}`'+', //'+'{oldWord}'.format(oldWord=oldWord) + objStr='{`'+'window.i18n("{key}")'.format(key=key)+'`}' + print('-----------------') + print("中文: ",oldWord) + print("英语: ",newWord) + print("印尼: ",Idword) + print('-----------------') + print("key:",key) + print("win语句:",win) + print("str语句:",globalKey) + print("obj语句:",objStr) + + + print('-----------------') + print(' ') + + +# 主程序-打包exe +if __name__=='__main__': + while True: + transWord() \ No newline at end of file