讯飞翻译脚本
import requests
import os
import datetime
import hashlib
import base64
import hmac
import json
class get_result(object):
def __init__(self, host):
# 应用ID(到控制台获取)
self.APPID = "97d97b07"
# 接口APISercet(到控制台机器翻译服务页面获取)
self.Secret = "YzUxM2NiOTU5ZmZhZDM1NTVmMTk0ZWU1"
# 接口APIKey(到控制台机器翻译服务页面获取)
self.APIKey= "a93fdb53e73c61baab22df4dadb565e9"
# 以下为POST请求
self.Host = host
self.RequestUri = "/v2/its"
# 设置url
# print(host)
self.url = "https://" + host + self.RequestUri
self.HttpMethod = "POST"
self.Algorithm = "hmac-sha256"
self.HttpProto = "HTTP/1.1"
# 设置当前时间
curTime_utc = datetime.datetime.utcnow()
self.Date = self.httpdate(curTime_utc)
# 设置业务参数
self.Text = ""
self.BusinessArgs = {
"from": "",
"to": "",
}
def hashlib_256(self, res):
m = hashlib.sha256(bytes(res.encode(encoding='utf-8'))).digest()
result = "SHA-256=" + base64.b64encode(m).decode(encoding='utf-8')
return result
def httpdate(self, dt):
"""
Return a string representation of a date according to RFC 1123
(HTTP/1.1).
The supplied date must be in UTC.
"""
weekday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()]
month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"][dt.month - 1]
return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (weekday, dt.day, month,
dt.year, dt.hour, dt.minute, dt.second)
def generateSignature(self, digest):
signatureStr = "host: " + self.Host + "\n"
signatureStr += "date: " + self.Date + "\n"
signatureStr += self.HttpMethod + " " + self.RequestUri \
+ " " + self.HttpProto + "\n"
signatureStr += "digest: " + digest
signature = hmac.new(bytes(self.Secret.encode(encoding='utf-8')),
bytes(signatureStr.encode(encoding='utf-8')),
digestmod=hashlib.sha256).digest()
result = base64.b64encode(signature)
return result.decode(encoding='utf-8')
def init_header(self, data):
digest = self.hashlib_256(data)
sign = self.generateSignature(digest)
authHeader = 'api_key="%s", algorithm="%s", ' \
'headers="host date request-line digest", ' \
'signature="%s"' \
% (self.APIKey, self.Algorithm, sign)
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Method": "POST",
"Host": self.Host,
"Date": self.Date,
"Digest": digest,
"Authorization": authHeader
}
return headers
def get_body(self):
content = str(base64.b64encode(self.Text.encode('utf-8')), 'utf-8')
postdata = {
"common": {"app_id": self.APPID},
"business": self.BusinessArgs,
"data": {
"text": content,
}
}
body = json.dumps(postdata)
return body
def call_url(self, text, to_lang):
if self.APPID == '' or self.APIKey == '' or self.Secret == '':
print('Appid 或APIKey 或APISecret 为空!请打开demo代码,填写相关信息。')
return None
self.Text = text
self.BusinessArgs = {
"from": "cn",
"to": to_lang,
}
body = self.get_body()
headers = self.init_header(body)
response = requests.post(self.url, data=body, headers=headers, timeout=8)
status_code = response.status_code
if status_code != 200:
# 鉴权失败
print("Http请求失败,状态码:" + str(status_code) + ",错误信息:" + response.text)
print("请根据错误信息检查代码,接口文档:https://www.xfyun.cn/doc/nlp/xftrans/API.html")
return None
else:
# 鉴权成功
respData = json.loads(response.text)
code = str(respData["code"])
if code != '0':
print("请前往https://www.xfyun.cn/document/error-code?code=" + code + "查询解决办法")
return None
else:
if 'data' in respData and 'result' in respData['data'] and 'trans_result' in respData['data']['result']:
dst_text = respData['data']['result']['trans_result']['dst']
return dst_text
else:
print("无法获取翻译结果。")
return None
# 检查文件的函数
def check_file(file_path):
# 检查文件路径是否存在
if not os.path.exists(file_path):
print(f"错误:文件路径 '{file_path}' 不存在。")
return False
# 检查文件路径是否指向文件
if not os.path.isfile(file_path):
print(f"错误:'{file_path}' 不是一个文件。")
return False
# 检查文件是否可写
if not os.access(file_path, os.W_OK):
print(f"错误:没有写入文件 '{file_path}' 的权限。")
return False
return True
# 向文件中追加翻译后的文本的函数
def append_translated_lines(file_path, content_list, to_language):
# 使用 check_file 函数检查文件
if not check_file(file_path):
return
with open(file_path, 'a', encoding='utf-8') as file:
for line in content_list:
if '"' in line:
parts = line.split('"')
if len(parts) >= 4:
key = parts[1]
value = parts[3]
if to_language != 'zh':
# 对非中文文本进行翻译
translated_text = get_result("itrans.xfyun.cn").call_url(value.strip(), to_language)
if translated_text:
print("翻译结果:", translated_text)
translated_row = f'"{key}" = "{translated_text}" ;\n'
file.write(translated_row)
print(f"语言 {to_language} 翻译结果: {translated_text} ")
else:
print("无法获取翻译结果。")
else:
# 对中文文本直接写入
file.write(f'"{key}" = "{value.strip()}" ;\n')
print(f"语言 {to_language} 翻译结果: {value.strip()} ")
else:
print(f"警告:行 '{line}' 中的格式不正确,无法处理。")
else:
print(f"警告:行 '{line}' 中没有找到双引号,无法处理。")
# 删除已存在的行的函数
def delete_existing_line(file_path, key):
# 使用 check_file 函数检查文件
if not check_file(file_path):
return
# 读取文件内容
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 过滤掉包含指定键的行
filtered_lines = [line for line in lines if '=' in line and key.strip() not in line.split('=')[0].strip()]
# 将过滤后的内容写回文件中
with open(file_path, 'w', encoding='utf-8') as file:
file.writelines(filtered_lines)
# 定义文件路径(需修改)
chinese_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/zh-Hans.lproj/Localizable.strings"
english_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/en.lproj/Localizable.strings"
german_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/de.lproj/Localizable.strings"
french_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/fr.lproj/Localizable.strings"
Spanish_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/es.lproj/Localizable.strings"
greek_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/el.lproj/Localizable.strings"
korean_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/ko.lproj/Localizable.strings"
japanese_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/ja.lproj/Localizable.strings"
russian_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/ru.lproj/Localizable.strings"
brazil_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/pt-BR.lproj/Localizable.strings"
portugal_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/pt-PT.lproj/Localizable.strings"
thai_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/th.lproj/Localizable.strings"
chineseTw_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/zh-Hant.lproj/Localizable.strings"
chineseHongKong_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/zh-HK.lproj/Localizable.strings"
italian_file_path = r"/Users/dhf/Desktop/ios_headset/HeylinkPro/HeylinkPro/it.lproj/Localizable.strings"
# 提供的字符串(需修改)
chinese_content_str = """
"正在安装,请稍后操作" = "正在安装,请稍后操作";
"""
# 按行拆分字符串并去除空行
chinese_content_list = [line.strip() for line in chinese_content_str.strip().split('\n') if line.strip()]
# 删除已存在的行(需修改)
for line in chinese_content_list:
if '=' in line:
key = line.split('=')[0].strip()
delete_existing_line(chinese_file_path, key)
delete_existing_line(english_file_path, key)
delete_existing_line(german_file_path, key)
delete_existing_line(french_file_path, key)
delete_existing_line(Spanish_file_path, key)
delete_existing_line(greek_file_path, key)
delete_existing_line(korean_file_path, key)
delete_existing_line(japanese_file_path, key)
delete_existing_line(russian_file_path, key)
delete_existing_line(brazil_file_path, key)
delete_existing_line(portugal_file_path, key)
delete_existing_line(thai_file_path, key)
delete_existing_line(chineseTw_file_path, key)
delete_existing_line(chineseHongKong_file_path, key)
delete_existing_line(italian_file_path, key)
else:
print(f"警告:行 '{line}' 中没有找到 '=' 分隔符,无法处理。")
# 执行翻译并添加到文件中(需修改)
append_translated_lines(chinese_file_path, chinese_content_list, 'cn')
append_translated_lines(english_file_path, chinese_content_list, 'en')
append_translated_lines(german_file_path, chinese_content_list, 'de')
append_translated_lines(french_file_path, chinese_content_list, 'fr')
append_translated_lines(Spanish_file_path, chinese_content_list, 'es')
append_translated_lines(greek_file_path, chinese_content_list, 'el')
append_translated_lines(korean_file_path, chinese_content_list, 'ko')
append_translated_lines(japanese_file_path, chinese_content_list, 'ja')
append_translated_lines(russian_file_path, chinese_content_list, 'ru')
append_translated_lines(brazil_file_path, chinese_content_list, 'pt')
append_translated_lines(portugal_file_path, chinese_content_list, 'pt')
append_translated_lines(thai_file_path, chinese_content_list, 'th')
append_translated_lines(chineseTw_file_path, chinese_content_list, 'yue')
append_translated_lines(chineseHongKong_file_path, chinese_content_list, 'yue')
append_translated_lines(italian_file_path, chinese_content_list, 'it')
# +------------------------+-------+------------------------+-------+
#讯飞翻译
#https://www.xfyun.cn/doc/nlp/xftrans/API.html#%E8%AF%AD%E7%A7%8D%E5%88%97%E8%A1%A8
# 语种 参数 语种 参数 语种 参数
# 汉语普通话 cn 波斯语 fa 僧伽罗语 si
# 英语 en 芬兰语 fi 斯洛伐克语 sk
# 彝语 ii 希伯来语 he 斯洛文尼亚语 sl
# 广东话 yue 印地语 hi 塞尔维亚语 sr
# 日语 ja 克罗地亚语 hr 巽他语 su
# 俄语 ru 匈牙利语 hu 瑞典语 sv
# 法语 fr 亚美尼亚语 hy 斯瓦希里语 sw
# 西班牙语 es 印尼语 id 泰米尔语 ta
# 阿拉伯语 ar 冰岛语 is 泰卢固语 te
# 意大利语 it 塔加路语(菲律宾) tl 爪哇语 jv
# 土耳其语 tr 罗马尼亚语 ro 马来语 ms
# 越南语 vi 格鲁吉亚语 ka 乌克兰语 uk
# 泰语 th 高棉语 km 乌尔都语 ur
# 韩语 ko 老挝语 lo 南非祖鲁语 zu
# 德语 de 立陶宛语 lt 内蒙语 mn
# 哈萨克语 kka 拉脱维亚语 lv 缅甸语 my
# 南非荷兰语 af 马拉雅拉姆语 ml 外蒙语 nm
# 阿姆哈拉语 am 马拉地语 mr 普什图语 ps
# 阿塞拜疆语 az 博克马尔挪威语 nb 豪萨语 ha
# 孟加拉语 bn 尼泊尔语 ne 乌兹别克语 uz
# 加泰罗尼亚语 ca 荷兰语 nl 土库曼语 tk
# 捷克语 cs 波兰语 pl 塔吉克语 tg
# 丹麦语 da 葡萄牙语 pt 保加利亚语 bg
# 希腊语 el