讯飞翻译脚本

45 阅读6分钟

讯飞翻译脚本

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