Gpt翻译完整版
上一篇文章收到了很多小伙伴的反馈,总结了一下主要以下几点:
1. 说不知道怎么调api
2. 目前只是把所有的中文变成了英文,如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中,否则的话这样的翻译没有意义,后续如果要加俄语或阿拉伯语就没办法进行动态切换了
3. 日志中的中文不需要做多语言,只有返回前端的数据需要做多语言
所以针对上面三点,我又对代码做了些改动,来让整个国际化更加智能。
直接上代码,代码解决了第二个和第三个问题
import json
import os
import re
import tempfile
import shutil
import difflibfrom pydantic import BaseModelfrom OpenAIClient import client# 判断文本中是否包含中文字符(这里只检测实际内容,不包括缩进)
def has_chinese(text: str) -> bool:return bool(re.search(r"[\u4e00-\u9fff]", text))# 调用大语言模型进行翻译的函数
def translate_text(text: str) -> str:return get_completion(text)class TransResult(BaseModel):result: strkey: strvalue_zh: strvalue_en: str# gpt-4o-mini
def get_completion_eng_word(code_segment, model="gpt-4o-mini"):# return 'return Result.error("FILE_UPLOAD_FAILED," + state.getState());'messages = [{"role": "system","content": ("你是一个专业的代码国际化助手。请将代码中所有的中文提示信息翻译成英文。翻译后的英文应该简短、准确,并且遵循以下规则:""1. 使用单个英文单词来表示中文内容,如果一个中文句子由多个词组成,请用下划线连接多个单词。""2. 所有被翻译的英文单词应全部用小写。未翻译的单词保持原状""3. 请确保替换后的翻译尽量简洁,避免过长的英文描述。""4. 保持代码结构和格式不变,仅替换中文字符串内容。不改变代码的其它部分。"'5. 如果输入的代码中字符串中需要拼接变量的,类似 return Result.succeed("导入数据成功,一共【"+rowNum+"】行"); ,需要把变量提取出来,当成参数传入,输出应为:’''{"result":"return Result.succeed("import_data_success_count", rowNum);", "key":"import_data_success_count", "value_zh":"导入数据成功,一共【"+rowNum+"】行", "value_en":"The data import is successful, and there are a total of ["+rowNum+"] rows"}'"6. 输出的内容为一个json结构, 包含result,为翻译之后完整的结果(结果中可能有双引号需要做转义),key为翻译出来的以下划线连接的那个单词, value_zh为原来的中文,value_en为原来的中文直接翻译的英文的句子""例如:""请翻译以下代码:"'@NotEmpty(message = "前置经纬度不能为空")'"输出应为:"'{"result":"@NotEmpty(message = "pre_points_is_empty")", "key":"pre_points_is_empty", "value_zh":"前置经纬度不能为空", "value_en":"pre points is empty"}'"请翻译以下代码:"'throw new BusinessException("获取分布式锁失败,请稍后再试");'"输出应为:"""'{"result":"throw new BusinessException("get_lock_error");", "key":"get_lock_error", "value_zh":"获取分布式锁失败,请稍后再试", "value_en":"Failed to obtain distributed locks, please try again later"}'),},{"role": "user", "content": f"请翻译以下代码:\n{code_segment}"},]response1 = client.beta.chat.completions.parse(model=model,messages=messages,temperature=0,response_format=TransResult,)return response1.choices[0].message.parseddef get_completion(code_segment, model="gpt-4o-mini"):messages = [{"role": "system","content": ("你是一个专业的代码翻译助手。请将代码中的中文文本翻译成英文,""保持代码结构和格式不变,仅替换字符串内容。保持变量名和函数名不变。""你只需要输出翻译之后的内容,不需要添加额外的其它的内容,""输出与输入除了翻译的内容变化,其它应该完全保持完全一致,不要输出markdown的格式。"),},{"role": "user", "content": f"请翻译以下代码:\n{code_segment}"},]response1 = client.chat.completions.create(model=model,messages=messages,temperature=0,)return response1.choices[0].message.content# 定义全局数组来存储翻译结果
translated_values_zh = []
translated_values_en = []# 处理单个文件:逐行读取,遇到中文的行进行翻译替换,同时保留原有缩进
def process_file(file_path: str, max_line_length: int = 2000, special_keywords: list = None
) -> None:temp_file = tempfile.NamedTemporaryFile(mode="w", delete=False, encoding="utf-8")try:with open(file_path, "r", encoding="utf-8") as f:for line in f:# 提取行的前导缩进和实际内容(去除换行符)indent_match = re.match(r"^(\s*)", line)indent = indent_match.group(1) if indent_match else ""content = line[len(indent) :].rstrip("\n")if has_chinese(content):# 如果content中包含Result或包含@NotNull,或包含@Size或包含@NotEmpty,则用另一种方式进行翻译if any(keyword in content for keyword in special_keywords):translated_json = get_completion_eng_word(content)# 提取result, key, value_zh, value_entranslated_line = translated_json.resultkey = translated_json.keyvalue_zh = translated_json.value_zhvalue_en = translated_json.value_entranslated_line = "\n".join(indent + part for part in translated_line.splitlines())line = translated_line + "\n"print(f"Processed: {file_path}, zh: {key} = {value_zh}, en: {key} = {value_en}")translated_values_zh.append(f"{key}={value_zh}")translated_values_en.append(f"{key}={value_en}")else:translated_line = translate_text(content)# 保留每一行的缩进translated_line = "\n".join(indent + part for part in translated_line.splitlines())line = translated_line + "\n"temp_file.write(line)temp_file.close()shutil.move(temp_file.name, file_path)except Exception as e:print(f"Error processing {file_path}: {e}")if os.path.exists(temp_file.name):os.remove(temp_file.name)# 遍历目录,对指定后缀的文件进行处理
def process_directory(root_dir: str,file_extensions: list,special_keywords: list = None,max_line_length: int = 2000,
) -> None:for subdir, _, files in os.walk(root_dir):for file in files:if any(file.endswith(ext) for ext in file_extensions):file_path = os.path.join(subdir, file)process_file(file_path, max_line_length, special_keywords)if __name__ == "__main__":root_directory = "D:\\XX\\xxx\\"special_keywords = ["Result.","@NotNull","@Size","@NotEmpty","@NotBlank","@Pattern","@Min","@Max","Exception","Assert.",]extensions = [".java"]process_directory(root_directory, extensions, special_keywords)# 输出翻译结果到 .properties 文件with open("messages_zh.properties","w",encoding="utf-8",) as f_zh, open("messages_en.properties","w",encoding="utf-8",) as f_en:# 写入中文翻译结果for value in translated_values_zh:f_zh.write(value + "\n")# 写入英文翻译结果for value in translated_values_en:f_en.write(value + "\n")print("翻译结果已写入 translated_values_zh.properties 和 translated_values_en.properties 文件。")
这里使用了 pydantic 对输出的结果进行格式化为了json,相比上一篇的直接输出翻译后的结果优势是:可以让大模型同时提取其中的key和value_zh和value_en,这样可以直接把这两个结果写入properties配置文件,省去了自己生成properties文件的过程。
针对日志和注释不需要做多语言的,直接通过另一个propmt将中文全部翻译成英文即可。
再来看问题1,不知道怎么调api,非常简单
from openai import OpenAIopenai_api_key = "sk-xxxxxxxxxxxxxxxxxx"
openai_api_base = "https://api.gptsapi.net/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)
因为openai需要翻墙到国外,所以我买了国内的代理的api,非常便宜,先冲5刀,一共也就一顿饭钱。我翻译了一整个项目才花了1.5刀,真是便宜哇。下面是我调用的记录,真是很省钱哇。
有了这个便宜的api我感觉我可以干好多事了,后续我也会用这个api来做各种智能化的应用,欢迎关注我。另外,我这边也同步开通了哔站,录了一些视频来更加透彻的带大家来一起学习AI,让AI成为我们最忠实的硅基家人。
哔站主页
魔幻AI人的个人空间-魔幻AI人个人主页-哔哩哔哩视频哔哩哔哩魔幻AI人的个人空间,提供魔幻AI人分享的视频、音频、文章、动态、收藏等内容,关注魔幻AI人账号,第一时间了解UP主动态。魔幻AI人,对AI如此痴迷https://space.bilibili.com/543835355?spm_id_from=333.1387.0.0
相关文章:

Gpt翻译完整版
上一篇文章收到了很多小伙伴的反馈,总结了一下主要以下几点: 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文,如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中,…...

雷池WAF的为什么选择基于Docker
Docker 是一种开源的容器化平台,可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点: 容器:Docker 使用容器来封装应用程序及其依赖项,使其能够在任何环境中都能…...
美股回测:历史高频分钟数据的分享下载与策略解析20250305
美股回测:历史高频分钟数据的分享下载与策略解析20250305 在金融分析和投资决策的精细化过程中,美股历史分钟高频数据发挥着至关重要的作用。这些数据以其详尽性和精确性,记录了股票每分钟的价格波动和成交量变化,为投资者提供了…...

【文生图】windows 部署stable-diffusion-webui
windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 带图片的详细功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…...
[Python入门学习记录(小甲鱼)]第3章 Python基础知识
第3章 基础知识 前面三章都没啥用,这一章开始进入主题。 3.1 变量 变量顾名思义就是一个可变的量,但Python的变量更像是一个名字,通过这个名字可以找到我们想要的值。注意点如下: Python不需要显式声明,但使用之前…...

某系统webpack接口泄露引发的一系列漏洞
视频教程在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录: 信息搜集 未授权敏感信息泄露越权任意用户密码重置 1.越权访问 2.大量敏感信息 越权 任意用户密码重置 信息搜集 这里找到从小穿一条裤子长大的兄弟,要挟他交…...

【计算机网络入门】初学计算机网络(十一)重要
目录 1. CIDR无分类编址 1.1 CIDR的子网划分 1.1.1 定长子网划分 1.1.2 变长子网划分 2. 路由聚合 2.1 最长前缀匹配原则 3. 网络地址转换NAT 3.1 端口号 3.2 IP地址不够用? 3.3 公网IP和内网IP 3.4 NAT作用 4. ARP协议 4.1 如何利用IP地址找到MAC地址…...

决策树(Decision Tree)基础知识
目录 一、回忆1、*机器学习的三要素:1)*函数族2)*目标函数2.1)*模型的其他复杂度参数 3)*优化算法 2、*前处理/后处理1)前处理:特征工程2)后处理:模型选择和模型评估 3、…...

Nat Mach Intell | AI分子对接算法评测
《Nature Machine Intelligence》发表重磅评测,系统评估AI与物理方法在虚拟筛选(VS)中的表现,突破药物发现效率瓶颈。 核心评测体系:三大数据集 研究团队构建了三个新型测试集: TrueDecoy:含14…...
【自学笔记】Hadoop基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Hadoop基础知识点总览1. Hadoop简介2. Hadoop生态系统3. HDFS(Hadoop Distributed File System)HDFS基本命令 4. MapReduceWordCount示例&am…...
【Linux】使用问题汇总
#1 ssh连接的时候报Key exchange failed 原因:服务端版本高,抛弃了一些不安全的交换密钥算法,且客户端版本比较旧,不支持安全性较高的密钥交换算法。 解决方案: 如果是内网应用,安全要求不这么高…...

(二 十 二)趣学设计模式 之 备忘录模式!
目录 一、 啥是备忘录模式?二、 为什么要用备忘录模式?三、 备忘录模式的实现方式四、 备忘录模式的优缺点五、 备忘录模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...

交叉编译openssl及curl
操作环境:Ubuntu20.04 IDE工具:Clion2020.2 curl下载地址:https://curl.se/download/ openssl下载地址:https://openssl-library.org/source/old/index.html 直接交叉编译curl会报错找不到openssl,所以需要先交叉编…...
【每日八股】计算机网络篇(三):IP
目录 DNS 查询服务器的基本流程DNS 采用 TCP 还是 UDP,为什么?默认使用 UDP 的原因需要使用 TCP 的场景?总结 DNS 劫持是什么?解决办法?浏览器输入一个 URL 到显示器显示的过程?URL 解析TCP 连接HTTP 请求页…...

Gartner:数据安全平台DSP提升数据流转及使用安全
2025 年 1 月 7 日,Gartner 发布“China Context:Market Guide for Data Security Platforms”(《数据安全平台市场指南——中国篇》,以下简称指南),报告主要聚焦中国数据安全平台(Data Securit…...

从vue源码解析Vue.set()和this.$set()
前言 最近死磕了一段时间vue源码,想想觉得还是要输出点东西,我们先来从Vue提供的Vue.set()和this.$set()这两个api看看它内部是怎么实现的。 Vue.set()和this.$set()应用的场景 平时做项目的时候难免不会对 数组或者对象 进行这样的骚操作操作ÿ…...
深入浅出:UniApp 从入门到精通全指南
https://juejin.cn/post/7440119937644101684 uni-app官网 uniapp安卓离线打包流程_uniapp离线打包-CSDN博客 本文是关于 UniApp 从入门到精通的全指南,涵盖基础入门(环境搭建、创建项目、项目结构、编写运行)、核心概念与进阶知识&#x…...

DeepSeek未来发展趋势:开创智能时代的新风口
DeepSeek未来发展趋势:开创智能时代的新风口 随着人工智能(AI)、深度学习(DL)和大数据的飞速发展,众多创新型技术已经逐渐走向成熟,而DeepSeek作为这一领域的新兴力量,正逐步吸引越…...

阻塞队列的实现(线程案例)
一.什么是阻塞队列? 1.如果对于一个满的队列,还要把元素入队列,此时这个队列就会阻塞等待,一直阻塞到这个队列不满为止,从而把这个元素入队列! 2.如果对于一个空的队列,还要从队列拿出元素&…...
http status是什么?常见的http状态码指的是什么意思?
HTTP 状态码 HTTP 状态码(HTTP Status Code)是服务器在响应客户端请求时返回的一个三位数字代码,用于表示请求的处理结果。HTTP 状态码是 HTTP 协议的一部分,帮助客户端(如浏览器或应用程序)了解请求是否成…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...