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

XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译

XunityAutoTranslator-Gemini-API

本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文unity游戏文本翻译成简体中文。

日文游戏文本AI翻译API (基于Google Gemini)

本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文游戏文本翻译成简体中文。

功能特点

  • AI 驱动翻译: 使用 Google Gemini GenAI 模型 gemini-2.0-flash-001 进行高质量的日文到简体中文翻译。
  • 游戏文本优化: 针对游戏文本特点进行了优化,例如保留格式标签、处理特殊符号、保留原文风格等。
  • 质量检测与重试: 自动检测译文质量,当检测到译文包含日文或重复内容时,会自动重试翻译。
  • 高并发处理: 使用 Flask 框架和 gevent WSGI 服务器,支持高并发请求处理。
  • 异步请求处理: 使用队列和线程池异步处理翻译请求,避免阻塞主线程,提高服务器响应速度。
  • 简单易用: 提供简洁的 HTTP GET API 接口 /translate,方便集成到各种游戏或工具中。

快速开始

1. 前置条件

  • Python 3.6+
  • 已安装必要的 Python 库 (见(###2-依赖库))
  • Google Gemini API 密钥

2. 依赖库

请确保已安装以下 Python 库:

import os
import re
import json
import time
from flask import Flask, request
from gevent.pywsgi import WSGIServer
from urllib.parse import unquote
from threading import Thread
from queue import Queue
import concurrent.futures
from google import genai  # 导入 Google GenAI 库

配置说明

API 配置

Model_Type = "gemini-2.0-flash-001" # 使用的模型类型, 请根据Google的文档自行修改
client = genai.Client(api_key="YOUR_API_KEY") # 替换为你的 API 密钥

3. 配置 API 密钥

请修改代码,打开 脚本文件名.py 文件,找到以下代码行:

client = genai.Client(api_key=“YOUR_API_KEY”) # 使用 genai.Client 初始化客户端,并配置 API 密钥 请替换为您的 API 密钥

将 “YOUR_API_KEY” 替换为您自己的 Google Gemini API 密钥。 注意:请务必替换为您自己的 API 密钥,否则API将无法正常工作。

4. 运行 API 服务 在代码所在目录下,打开终端并执行以下命令:

   python 脚本文件名.py

配置XUnity.AutoTranslator看我上一篇文章:

XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译

代码配置

以下参数在代码中直接定义,您可以根据需要修改代码进行调整:

  • Model_Type: 使用的 Google Gemini GenAI 模型类型,默认为 “gemini-2.0-flash-001”。您可以根据 Google GenAI API 的支持情况选择其他模型。
  • repeat_count: 重复内容检测阈值,默认为 5。用于检测译文中是否存在重复内容,数值越大,对重复内容检测的容忍度越高。
  • prompt: 基础提示词 (Prompt),用于指导 AI 模型进行翻译。您可以根据需要修改提示词,以优化翻译效果。
  • prompt_list: 提示词列表,默认为包含单个基础提示词的列表。您可以配置多个提示词,程序会在翻译失败时自动尝试使用列表中的下一个提示词进行重试翻译。
  • MAX_WORKERS: 线程池最大工作线程数,默认为 2。您可以根据服务器性能和并发需求调整线程池大小。

代码如下:

import os
import re
import json
import time
from flask import Flask, request
from gevent.pywsgi import WSGIServer
from urllib.parse import unquote
from threading import Thread
from queue import Queue
import concurrent.futures
from google import genai  # 导入 Google GenAI 库# 启用虚拟终端序列,支持 ANSI 转义代码,允许在终端显示彩色文本
os.system('')# dict_path='用户替换字典.json' # 替换字典路径。如果不需要使用替换字典,请将此变量留空(设为 None 或空字符串 "")
dict_path=None # 替换字典路径。如果不需要使用替换字典,请将此变量留空(设为 None 或空字符串 "")
# API 配置参数
Model_Type =  "gemini-2.0-flash-001"    # 使用的模型类型,选择 GenAI 支持的模型,例如 "gemini-2.0-flash"# 创建 Google GenAI 客户端实例
# 使用 genai.Client 进行客户端初始化,并配置 API 密钥
# 注意:请将 "YOUR_API_KEY" 替换为您自己的 Google GenAI API 密钥
client = genai.Client(api_key="YOUR_API_KEY") # 使用 genai.Client 初始化客户端,并配置 API 密钥  **请替换为您的 API 密钥**# 译文重复内容检测参数
repeat_count=5 # 重复内容阈值。如果译文中有任意单字或单词连续重复出现次数大于等于 repeat_count,则认为译文质量不佳,会触发重试翻译逻辑# 提示词 (Prompt) 配置
prompt= '''
你是资深本地化专家,负责将游戏日文文本译为简体中文。
**你的任务是精确翻译日文文本,仅输出译文,请勿添加任何与原文无关的解释、说明、补充信息或其他任何文字。** 接收文本后,请严格按照以下要求翻译:
翻译范围:翻译普通日文文本,保留原文叙述风格。
保留格式:保留转义字符、格式标签等非日文文本内容。
翻译原则:忠实准确,确保语义无误;对露骨性描写,可直白粗俗表述,不删减篡改;对双关语等特殊表达,找目标语言等效表达,保原作意图风格。
文本类型:游戏文本含角色对话、旁白、武器及物品名称、技能描述、格式标签、特殊符号等。
以下是待翻译的游戏文本:''' # 基础提示词,用于指导模型进行翻译,定义了翻译的角色、范围、格式、原则和文本类型
prompt_list=[prompt] # 提示词列表。可以配置多个提示词,程序会依次尝试使用列表中的提示词进行翻译,直到获得满意的结果
# l=len(prompt_list) # 获取提示词列表的长度 (此变量目前未被直接使用,移除)# 提示字典相关的提示词配置
dprompt0='\n在翻译中使用以下字典,字典的格式为{\'原文\':\'译文\'}\n' # 提示模型在翻译时使用提供的字典。字典格式为 JSON 格式的字符串,键为原文,值为译文
dprompt1='\nDuring the translation, use a dictionary in {\'Japanese text \':\'translated text \'} format\n' # 英文版的字典提示词,可能用于多语言支持或模型偏好
# dprompt_list 字典提示词列表,与 prompt_list 提示词列表一一对应。当使用 prompt_list 中的第 i 个提示词时,会同时使用 dprompt_list 中的第 i 个字典提示词
dprompt_list=[dprompt0,dprompt1,dprompt1]
MAX_WORKERS = 2 # 线程池最大工作线程数 (直接在代码中定义)app = Flask(__name__) # 创建 Flask 应用实例# 读取提示字典
prompt_dict= {} # 初始化提示字典为空字典
if dict_path: # 检查是否配置了字典路径try:with open(dict_path, 'r', encoding='utf8') as f: # 尝试打开字典文件tempdict = json.load(f) # 加载 JSON 字典数据# 按照字典 key 的长度从长到短排序,确保优先匹配长 key,避免短 key 干扰长 key 的匹配sortedkey = sorted(tempdict.keys(), key=lambda x: len(x), reverse=True)for i in sortedkey:prompt_dict[i] = tempdict[i] # 将排序后的字典数据存入 prompt_dictprint(f"\033[32m字典文件 {dict_path} 加载成功,共加载 {len(prompt_dict)} 个词条。\033[0m") # 打印字典加载成功的消息except FileNotFoundError:print(f"\033[33m警告:字典文件 {dict_path} 未找到。\033[0m") # 警告用户字典文件未找到except json.JSONDecodeError:print(f"\033[31m错误:字典文件 {dict_path} JSON 格式错误,请检查字典文件。\033[0m") # 错误提示 JSON 格式错误except Exception as e:print(f"\033[31m读取字典文件时发生未知错误: {e}\033[0m") # 捕获其他可能的文件读取或 JSON 解析错误def contains_japanese(text):"""检测文本中是否包含日文字符。"""pattern = re.compile(r'[\u3040-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FE]') # 日文字符的 Unicode 范围正则表达式return pattern.search(text) is not None # 使用正则表达式搜索文本中是否包含日文字符def has_repeated_sequence(string, count):"""检测字符串中是否存在连续重复的字符或子串。"""# 检查单个字符的重复for char in set(string):if string.count(char) >= count:return True# 检查字符串片段(子串)的重复for size in range(2, len(string) // count + 1):for start in range(0, len(string) - size + 1):substring = string[start:start + size]matches = re.findall(re.escape(substring), string)if len(matches) >= count:return Truereturn False# 获得文本中包含的字典词汇 (优化后)
def get_dict(text, dictionary):"""从文本中提取出在提示字典 (dictionary) 中存在的词汇及其翻译 (优化版本,不修改原文).Args:text (str): 待处理的文本.dictionary (dict): 提示字典.Returns:dict:  一个字典,key 为在文本中找到的字典原文,value 为对应的译文.如果文本中没有找到任何字典词汇,则返回空字典."""res = {}for key in dictionary:if key in text:res[key] = dictionary[key]return resrequest_queue = Queue()  # 创建请求队列
def handle_translation(text, translation_queue):"""处理翻译请求的核心函数."""text = unquote(text) # URL 解码max_retries = 3  # 最大 API 请求重试次数retries = 0  # 重试计数器special_chars = [',', '。', '?','...'] # 句末特殊字符text_end_special_char = Noneif text and text[-1] in special_chars: # 避免空字符串索引错误text_end_special_char = text[-1]special_char_start = "「"special_char_end = "」"has_special_start = text.startswith(special_char_start)has_special_end = text.endswith(special_char_end)if has_special_start and has_special_end:text = text[len(special_char_start):-len(special_char_end)]try: # 捕获 API 异常dict_inuse = get_dict(text, prompt_dict) # 获取字典词汇 (优化: 仅调用一次)for i in range(len(prompt_list)): # 遍历提示词列表prompt = prompt_list[i]if dict_inuse: # 如果有字典词汇,则添加字典提示prompt += dprompt_list[i] + str(dict_inuse)content_to_translate = prompt + text # 构建完整的翻译内容response_test = client.models.generate_content( # API 调用model=Model_Type, contents=content_to_translate)translations = response_test.textprint(f"【API 原始输出 (未经处理):】\n{repr(translations)}")  # 打印原始值if translations.endswith("\n"): # 移除尾部换行符translations = translations[:-1]print(f"【API 翻译结果 (经处理):】\n{repr(translations)}") # 打印处理后的值,用于调试或日志记录# print(f'{prompt}\n{translations}')  # 打印提示词和翻译结果, 调试用if has_special_start and has_special_end: # 特殊字符处理if not translations.startswith(special_char_start):translations = special_char_start + translationsif not translations.endswith(special_char_end):translations = translations + special_char_endtranslation_end_special_char = Noneif translations and translations[-1] in special_chars: # 避免空字符串索引错误translation_end_special_char = translations[-1]if text_end_special_char and translation_end_special_char:if text_end_special_char != translation_end_special_char:translations = translations[:-1] + text_end_special_charelif text_end_special_char and not translation_end_special_char:translations += text_end_special_charelif not text_end_special_char and translation_end_special_char:translations = translations[:-1]contains_japanese_characters = contains_japanese(translations) # 检测日文repeat_check = has_repeated_sequence(translations, repeat_count) # 重复检测if not contains_japanese_characters and not repeat_check: # 质量检测通过则跳出循环breakelif contains_japanese_characters:print("\033[31m检测到译文中包含日文字符,尝试使用下一个提示词进行翻译。\033[0m")continueelif repeat_check:print("\033[31m检测到译文中存在重复短语。\033[0m")# 可以在此处添加更复杂的重试策略,例如更换提示词组合,调整模型参数等 (当前版本暂未实现)breakif not contains_japanese_characters and not repeat_check: # 最终质量检测pass # 翻译成功print(f"\033[36m[译文]\033[0m:\033[31m {translations}\033[0m")print("-------------------------------------------------------------------------------------------------------")translation_queue.put(translations) # 放入结果队列except Exception as e: # API 异常处理retries += 1print(f"\033[31mAPI请求超时或发生错误 (第 {retries} 次重试): {e}\033[0m") # 打印错误信息if retries == max_retries:print(f"\033[31m达到最大重试次数,翻译失败。\033[0m")translation_queue.put(False) # 放入失败标志return # 达到最大重试次数,返回time.sleep(1) # 等待重试handle_translation(text, translation_queue) # 递归重试return # 重试后返回@app.route('/translate', methods=['GET'])
def translate():"""Flask 路由函数,处理 "/translate" GET 请求."""text = request.args.get('text')  # 获取待翻译文本print(f"\033[36m[原文]\033[0m \033[35m{text}\033[0m") # 打印原文translation_queue = Queue() # 创建结果队列request_queue.put_nowait(text) # 放入请求队列with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: # 使用配置的线程池大小 (直接使用硬编码值)future = executor.submit(handle_translation, text, translation_queue) # 提交翻译任务try: # 超时处理translation_result = future.result(timeout=30) # 获取结果,设置超时时间except concurrent.futures.TimeoutError:print("\033[31m翻译请求超时。\033[0m") # 打印超时信息return "[请求超时] " + text, 500 # 返回超时错误translation = translation_queue.get() # 获取翻译结果request_queue.get_nowait() # 从请求队列移除已处理请求if isinstance(translation, str): # 翻译成功return translation # 返回翻译结果else: # 翻译失败return "[翻译失败] " , 500 # 返回失败状态码def main():"""主函数,启动 Flask 应用和 gevent 服务器."""print("\033[31m服务器在 http://127.0.0.1:4000 上启动\033[0m") # 启动信息http_server = WSGIServer(('127.0.0.1', 4000), app, log=None, error_log=None) # 创建 gevent WSGIServer 实例http_server.serve_forever() # 启动服务器if __name__ == '__main__':main() # 运行主函数

我的上一篇帖子:XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
本项目地址:项目地址

相关文章:

XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译

XunityAutoTranslator-Gemini-API 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文unity游戏文本翻译成简体中文。 日文游戏文本AI翻译API (基于Google Gemini) 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型…...

深刻理解构件生产线

我们可以将构件生产线类比为软件开发中的一种高效、模块化的构建方式。下面,我将结合Java编程的概念来详细讲解构件生产线的含义和实现方式。 一、构件生产线的概念 构件生产线在软件开发中,类似于工厂中的自动化生产线,它通过将复杂的软件…...

nlp 自然语言处理+bert model +问答系统 question answer system(python 完整代码)

pre-trained bert model 预训练好的Bert模型 本地实现问答系统 用这条命令将bert下载到本地: model.save_pretrained("path/to/model") 也有参考这篇文章 https://colab.research.google.com/drive/1uSlWtJdZmLrI3FCNIlUHFxwAJiSu2J0-#scrollTo=AaweLnNXGhTY …...

【Excel】【VBA】根据内容调整打印区域

Excel VBA:自动调整打印区域的实用代码解析 在Excel中,我们经常需要调整打印区域。今天介绍一段VBA代码,它可以根据C列的内容自动调整打印区域。 Dim ws As Worksheet Dim lastRow As Long Dim r As Long 设置当前工作表 Set ws ActiveSh…...

【读书笔记·VLSI电路设计方法解密】问题53:什么是逻辑综合

逻辑综合是将期望的电路行为的抽象形式(通常以RTL表示)转换为基于逻辑门(标准单元)的设计实现的过程。这一过程由具有复杂算法的自动综合工具完成。逻辑综合的结果是网表,它由各种标准单元和特殊宏单元组成。该网表的功…...

Redis 的备份机制

Redis 的备份机制 Redis 是一个高性能的基于内存的键值存储数据库,虽然所有操作都在内存中完成,但 Redis 也提供了持久化机制来确保数据的可靠性和可恢复性。这主要通过 RDB 和 AOF 两种备份机制实现。 RDB(Redis Database Backup&#xff…...

CountDownlatch实现原理

文章目录 类图及概要核心方法await() 方法await(long timeout, TimeUnit unit) 方法countDown() 方法getCount() 方法 总结 类图及概要 CountDownLatch 内部有个计数器,并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器,在何…...

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出,保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段,可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护,确保其安全性。 为…...

现代未来派品牌海报徽标设计无衬线英文字体安装包 THANKS LAB

THANK LAB 是一种高级未来主义的软字体,将时尚的现代设计与光滑圆润的边缘相结合,营造出大胆而平易近人的美感。这款字体非常适合品牌、海报、标题、UI/UX 和科幻主题项目,旨在激发创造力。THANK LAB Futuristic Soft Font 完全支持拉丁字母、…...

基于Flask框架的食谱数据可视化分析系统的设计与实现

【Flask】基于Flask框架的食谱数据可视化分析系统的设计与实现 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 在当今数字化时代,信息可视化已成为一种高效的数据理解和传播手段。…...

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI,你可以执行以下命令: yarn global add vue/cli这个命令会全局安装 Vue CLI,让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...

矩阵-旋转图像

旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。输入:二维数组 输出:void 思路:tempM…...

自用开发的商标和工作小工具!

近日普推知产老杨把个人小站改了版,也把以前业余开发的小工具做了下优化和增加了一些新的小工具,这些在线小工具手机和电脑双适应,普推老杨日常也在用,主要在商标方面和内容制做。 商标名称图样免费生成主要用在可以生成符合商标申…...

基于腾讯云大模型知识引擎×DeepSeek构建八字、六爻赛博算卦娱乐应用

引言 随着DeepSeek的火爆,其强大的思维链让不少人越用越香,由于其缜密的思维和推理能力,不少人开发出了不少花里胡哨的玩法,其中一种就是以八字、六爻为代表的玄学文化正以“赛博玄学”的新形态席卷年轻群体。 针对于八字、六爻…...

八股文实战之JUC:静态方法的锁和普通方法的锁

1、对于staic同步方法锁住的是class类模板(Class对象) 对象是线程(调用者) 调用者只有获取资源的锁才能调用 2、普通同步方法 锁住的资源是class对象 对象是线程(调用者)即: 静态同步方法&a…...

VTK知识学习(42)-基本的图形操作(三)

1、网格平滑 1)概述 现代扫描技术的发展使得获取点云数据不再困难,通过曲面重建技术可以获取表面网格来表示各种复杂的实体。但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。 拉普拉斯平滑是一种常用的网格…...

代码随想录算法训练营day40(补0208)

买卖股票专栏 1.买卖股票最佳时机 贪心法,好想 题目 121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖…...

python基于深度学习实现遮挡人脸识别系统的详细方案

以下是一个基于深度学习实现遮挡人脸识别系统的详细方案,使用Python语言: 一、需求理解 遮挡人脸识别系统旨在准确识别出即使面部部分被遮挡(如口罩、眼镜等)的人的身份。该系统将利用深度学习技术,结合合适的数据集进行训练,以达到较高的识别准确率。 二、系统架构 …...

【Python爬虫(43)】云端探秘:Python分布式爬虫部署攻略

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

Java集合框架大师课:从青铜到王者的数据结构指南(一)

🚀 Java集合框架大师课:从青铜到王者的数据结构指南(一) 🌟 系列定位:全网最懂小白的JCF实战教程 | 建议搭配IDE边学边练 🎯 学习路线图 第一章:初识JCF江湖 1.1 什么是JCF&#xf…...

Vmware虚拟机Ubantu安装Docker、k8s、kuboard

准备工作: 切换用户:su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…...

Java面试——Tomcat

优质博文:IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。Service主要包含两个部分:Connector和…...

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:优化的基本过程 在游戏编程中,优化是一个非常重要的学习内容,尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度,以及如何提升其性能。在这个阶段,已经…...

【EB-02】TC397 Tresos 最小工程配置

TC397 Tresos 最小工程配置 1. 新建demo 工程2. 配置消除错误2.1 ResourceM 设置2.2 McalLib模块配置3. 生成代码3.1 校验工程3.2 生成代码1. 新建demo 工程 新建工程 设置工程名称 选择芯片型号 选择添加模块 得到最小工程需求模块 2. 配置消除错误 2.1 ResourceM 设置 设置芯…...

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...

前端面试题

以下是一些前端面试题: 一、HTML/CSS部分 如何实现一个元素的背景颜色渐变效果,并且在不同浏览器中保持兼容性? 答案: 对于现代浏览器,可以使用标准的CSS渐变语法。 线性渐变示例(从左到右,红色到蓝色):background: linear - gradient(to right, red, blue);径向渐变…...

Win11 24h2 不能正常使用ensp的问题(已解决)

因为Win11 24h2的内核大小更改,目前virtualbox在7.1.4中更新解决了。所以Win11 24H2系统版本无法使用 5.x.xx的virtualbox版本,virtualbox对于这个5.x.xx版本早已停止维护,所以这个以后不会有调整。 对应的报错代码是 virtualbox错误代码&…...

Hyper-V初探

听说window自带虚拟机,小窃喜了一下,这样就不用下载第三方虚拟机软件了:VMware或者Oracle VirtualBox,但是本地搜索一看,发现没有安装,百度了一下说家庭中文版是个阉割版的系统,只有教育版&…...

IP协议

IP协议介绍 IP地址=目标网络+目标主机 IP协议是网络层协议 IP报头格式 [IP报头图片] IP报头解析 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4…...

Django Admin: 实现基于数据库实际值的动态过滤器

在 Django Admin 中,我们经常需要使用 list_filter 来为管理界面添加过滤功能。然而,有时我们希望过滤器能够动态地反映数据库中的实际值,而不是依赖于预定义的选项。本文将介绍如何实现一个基于数据库实际值的动态过滤器,以 ECR 仓库的区域过滤为例。 问题背景 在管理 E…...

overflow-x: auto 使用鼠标实现横向滚动,区分触摸板和鼠标滚动事件的方法

假设一个 div 的滚动只设置了 overflow-x: auto 我们发现使用鼠标的滚轮是无法左右滚动的,但是使用笔记本电脑的触摸板,或者在移动设备上是可以滚动的。所以我们需要兼容一下鼠标的横向滚动功能。 我们可以监控 wheel 事件,然后根据位置来计…...

DPVS-2:单臂负载均衡测试

上一篇编译安装了DPVS,这一篇开启DPVS的负载均衡测试 : 单臂 FULL NAT模式 拓扑-单臂 单臂模式 DPVS 单独物理机 CLINET,和两个RS都是另一个物理机的虚拟机,它们网卡都绑定在一个桥上br0 , 二层互通。 启动DPVS …...

宇树科技13家核心零部件供应商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…...

sqli-labs之Kali搭建靶场环境

背景: SQL注入是一种常见的Web安全漏洞,攻击者可以通过该漏洞在应用程序中执行任意的SQL命令。为了帮助开发者和安全研究人员更好地理解和防范SQL注入攻击,sqli-labs应运而生。它是一个开源项目,提供了一系列的SQL注入练习环境&a…...

Kafka在Windows系统使用delete命令删除Topic时出现的问题

在使用Windows的Kafka时,想要删除某一个主题,发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…...

JVM 面试题相关总结

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

动态记忆网络 DeepMind的MEMO架构允许在推理时动态读写记忆矩阵,记忆容量提升40倍

为了更深入地理解 MEMO 架构的意义,我来详细解读一下,并探讨它在实际应用中的潜力: MEMO 架构的核心思想 MEMO (Memorizing over Memorized) 架构的核心思想是 “层叠记忆”。 传统的记忆网络通常只有一个外部记忆模块,而 MEMO …...

go 并发 gorouting chan channel select Mutex sync.One

goroutine // head&#xff1a; 前缀 index&#xff1a;是一个int的指针 func print(head string, index *int) {for i : 0; i < 5; i {// 指针对应的int *indexfmt.Println(*index, head, i)// 暂停1stime.Sleep(1 * time.Second)} }/* Go 允许使用 go 语句开启一个新的运…...

【STM32 基于PID的闭环电机控制系统】

STM32 基于PID的闭环电机控制系统 目录 STM32 基于PID的闭环电机控制系统一、PID算法在STM32F103C8T6中的实现思路二、代码实现与解释三、PID算法的调试与优化四、总结 一、PID算法在STM32F103C8T6中的实现思路 基本概念 • 目标 &#xff1a;通过PID算法调节电机的转速&#…...

Linux命令后双减号符(--)的含义

个人博客地址&#xff1a;Linux命令后双减号符&#xff08;--&#xff09;的含义 | 一张假钞的真实世界 Unix/Linux下各种命令的参数&#xff0c;都是以减号符&#xff08;-&#xff09;后面跟单字符参数&#xff0c;比如-r&#xff09;或者双减号符&#xff08;--&#xff09…...

QT闲记-工具栏

工具栏通常用来放置常用的操作按钮,如QPushButton,QAction等。可以放置在顶部,底部,左侧,右侧,并且支持拖曳,浮动。 1、创建工具栏 通常通过QMainWindow 提供的addToolBar()来创建,它跟菜单栏一样,如果需要工具栏,一般情况下,我们设置这个类的基类为QMainWindow。 …...

Linux中ps -ef命令详解

ps -ef 是一个常用的 Unix/Linux 命令&#xff0c;用于显示当前系统中所有进程的详细信息。具体来说&#xff0c;ps 是 "process status" 的缩写&#xff0c;用于查看进程的状态。-ef 是 ps 命令的选项组合&#xff0c;用于指定输出的格式和内容。 选项解释&#xf…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 随着 Web 浏览器能力的增加&#xff0c;其复杂性也在迅速增加。从很多方面看&#xff0c;现代 Web 浏览器已经成为构建于诸多规范之上、集不同 API 于一身的“瑞士军刀”。浏览器规范的生态在某种程度上是混乱而无序的。一些规范如 HTML5&…...

详解分布式ID实践

引言 分布式ID&#xff0c;所谓的分布式ID&#xff0c;就是针对整个系统而言&#xff0c;任何时刻获取一个ID&#xff0c;无论系统处于何种情况&#xff0c;该值不会与之前产生的值重复&#xff0c;之后获取分布式ID时&#xff0c;也不会再获取到与其相同的值&#xff0c;它是…...

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…...

uniapp中@input输入事件在修改值只有第一次有效的问题解决

在uniapp中使用输入框&#xff0c;要求输入不超过7个字&#xff0c;所以需要监听输入事件&#xff0c;当每次输入文字的时候&#xff0c;就把输入的值截断&#xff0c;取前7个值。但是在input事件中&#xff0c;重新赋值的值发生了变化&#xff0c;但是页面上的还是没有变&…...

单片机 code RO-data RW-data ZI-data以及OTA学习

带着问题去学习&#xff1a;这些数据是什么&#xff1f;分别放在哪里&#xff0c; 是什么&#xff1a;我个人的理解 code 和RO-data 分别是代码和只读数据&#xff0c;RW-data以及ZI-data分别是读写数据和初始化数据。 codeRO-data的大小正好是所占用ROM的大小&#xff0c;RO…...

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号&#xff0c;都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…...

【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结

wsl2dockerDeepseekDify部署本地大模型知识库问题总结 基于ollama部署本地文本模型和嵌入模型 部署教程 DeepSeekdify 本地知识库&#xff1a;真的太香了 问题贴&#xff1a;启动wsl中docker中的dify相关的容器 发现postgre服务和daemon服务一直在重启&#xff0c;导致前端加…...

实战解析传统发电站智能化改造-第二期(带图带教程)

传统发电站的智能化改造&#xff0c;如同为老工匠配备高科技工具&#xff0c;提升效率与精准度。改造后的发电站兼具传统与智能&#xff0c;更高效、环保&#xff0c;适应现代能源需求。智慧系统搭建平台是连接感知层和应用层的桥梁&#xff0c;将原始数据转化为有价值的信息&a…...