Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈,总结了一下主要以下几点:

1. 说不知道怎么调api

2. 目前只是把所有的中文变成了英文,如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中,否则的话这样的翻译没有意义,后续如果要加俄语或阿拉伯语就没办法进行动态切换了

3. 日志中的中文不需要做多语言,只有返回前端的数据需要做多语言

所以针对上面三点,我又对代码做了些改动,来让整个国际化更加智能。

直接上代码,代码解决了第二个和第三个问题

import json
import os
import re
import tempfile
import shutil
import difflib

from pydantic import BaseModel

from 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: str
    key: str
    value_zh: str
    value_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.parsed


def 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_en
                        translated_line = translated_json.result
                        key = translated_json.key
                        value_zh = translated_json.value_zh
                        value_en = translated_json.value_en
                        translated_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 OpenAI

openai_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981581.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)、CT(匀速转弯)和CA(匀加速),滤波使用EKF。附完整代码

本文介绍一个三维IMM(Interacting Multiple Model)算法,该算法用于目标跟踪,结合了不同运动模型(匀速、匀加速和转弯)。代码使用MATLAB编写,包含仿真、模型预测和结果可视化。订阅专栏后,可直接获得完整代码 文章目录 运行结果完整代码代码解析1. 初始化环境2. 仿真参数…

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点? 在蒸汽机轰鸣的工业革命时代,煤炭、铁路、电报构建了第一个现代经济范式;互联网时代,电力、光纤、物流网络重构了全球经济版图。当前,我们正站…

【Python爬虫】爬取公共交通路网数据

程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用,就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作,不仅仅在速度上让人耳目一新,更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 为了能够在模板中渲染表单,我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm,然…

阿里通义万相2.1模型在亚马逊云科技ECS容器中的私有化部署

本文将主要介绍同义万相v2.1视频生成模型的在AWS上部署的初步测试 通义万相AI模型介绍 通义万相模型是阿里云负责大规模生成式模型的团队,最近发布了通义万相2.1(以下称Wan 2.1),这是一个“全面开源的视频基础模型套件,突破了视频生成的边界…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…

8.路由原理专题

路由器数据转发原理,路由表、FIB、快速转发表的关系 路由的控制平面与转发平面 控制平面:负责路由计算,维护;路由协议运行在控制平面 转发平面:进行数据包的封装,报文转发,路由表,FIB表,快速转发表等 控制平面与转发平面相互独立又协同工作 路由器检查数据包的目…

详细分析KeepAlive的基本知识 并缓存路由(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本2.2 拓展2.3 终极 3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本知识推荐阅读:KeepAlive知识点 从实战中学习,源自实战中vue路由的…

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来,解放双手去做更有趣的事?”Free Auto Clicker 就像你的数字小助手,能在任意位置自动重复点击鼠标。从玩游戏到刷网页,这款免费工具让你告别枯燥的重复操作,效率瞬间起飞! 你有没有想…

【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?

前言 2025年,人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角,AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型,从技术背景、应用领域、性能、成本效益等多个方…

蓝桥杯第15届真题解析

由硬件框图可以知道我们要配置LED 和按键、lcd,解决lcd引脚冲突 LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 按键 按键配置,由原理图按键所对引…

51c自动驾驶~合集22

我自己的原文哦~ https://blog.51cto.com/whaosoft/11870502 #自动驾驶数据闭环最前沿论文 近几年,自动驾驶技术的发展日新月异。从ECCV 2020的NeRF问世再到SIGGRAPH 2023的3DGS,三维重建走上了快速发展的道路!再到自动驾驶端到端技术的…

【Python】——使用python实现GUI图书管理系统:Tkinter+SQLite实战

本文将通过一个完整的python项目——图书管理系统,演示如何利用Tkinter构建GUI 界面,结合SQLite数据库实现增删改查功能。代码简洁易懂,适合python初学者学习和二次开发。 一、项目功能概览 图书管理:添加、查看、修改、删除图书…

Docker创建自定义网桥并指定网段

前言 docker0是Docker默认网络的核心组件, 通过虚拟网桥和NAT技术, 实现了容器间的通信以及容器与外部网络的交互。然而, docker0网段是固定的(通常是172.17.0.0/16), 为了更灵活地管理容器网络,Docker支持创建自定义网桥,允许用户指定网段。 例如, 在…

Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】

文章目录 一.Spring Ai介绍1.0 认识Spring Ai1.1 特征1.1 大模型专业名字介绍1.1.1 RAG(检索增强生成)RAG 的基本原理RAG 的关键技术RAG 的优势RAG 的应用场景 1.1.2 fine-tuning(微调)1.1.3 function-call(函数调用) 1.2 创建简单的Spring Ai项目 二.Spring Ai简单的智能应用2…

51c自动驾驶~合集53

我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出:以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题,而且高度依赖于BEV,严重限…

【C语言】联合体 `union` 的妙用

C 语言联合体的妙用:结合 . 和 -> 操作符与 typedef 的深入剖析 在 C 语言中,联合体(union)是一种独特的复合数据类型,因其内存共享特性而在内存优化、类型切换和底层操作中展现出妙用。与结构体(struct)不同,联合体允许同一块内存存储不同类型的数据,提供高效且灵…

UDP协议(20250303)

1. UDP UDP:用户数据报协议(User Datagram Protocol),传输层协议之一(UDP,TCP) 2. 特性 发送数据时不需要建立链接,节省资源开销不安全不可靠的协议 //一般用在实时性比较高…

自动化学习-使用git进行版本管理

目录 一、为什么要学习git 二、git是什么 三、git如何使用 1、git的下载安装和配置 2、git常用的命令 3、gitee远程仓库的使用 (1)注册 (2)创建仓库 (3)配置公钥(建立电脑和git…