当前位置: 首页 > news >正文

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文件中&#xff0c…...

雷池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 原因:服务端版本高,抛弃了一些不安全的交换密钥算法,且客户端版本比较旧,不支持安全性较高的密钥交换算法。 解决方案: 如果是内网应用,安全要求不这么高&#xf…...

(二 十 二)趣学设计模式 之 备忘录模式!

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

交叉编译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()应用的场景 平时做项目的时候难免不会对 数组或者对象 进行这样的骚操作操作&#xff…...

深入浅出: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 协议的一部分,帮助客户端(如浏览器或应用程序)了解请求是否成…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

OpenLayers 可视化之热力图

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...