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

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录

  • 前言
  • 国际化
    • 翻译Api选择
      • 小牛测试
    • 语言选择
    • 代码逻辑
      • 实体对象
      • 翻译帮助类
        • 导出模板
        • 读取文件
        • 翻译
          • 测试
          • 多语言测试
        • 综合翻译
          • 文件准备
          • 测试代码
          • 测试结果
    • 完整代码
      • 实体类
      • 翻译帮助类
      • 网络帮助类
    • 最终效果
      • 翻译前
      • 翻译中
      • 翻译后
  • 总结

前言

为了面向更大的市场,国际化是肯定的。我想如果我开发游戏,至少要支持两种语言,英语和中文简体。

国际化

翻译Api选择

在这里插入图片描述
国内Api也有三种选择,百度,有道和小牛。我这里就选小牛了,比较便宜。

小牛测试

小牛翻译平台

使用PostMan测试成功
在这里插入图片描述

语言选择

在这里插入图片描述
在这里插入图片描述

首先,作为中文为母语,所以我至少支持三种语言。简中,繁中和英语。下面附上小牛的对应参数表

语言参数
简中zh
繁中cht
英语en
德语de
法语fr
西班牙语es
意大利语it
葡萄牙语pt
俄语ru
日语ja
韩语ko

吐槽一下,写了这么多,我都快认不清这个【语】字是什么意思了。

原文选择我这里选择英语作为原文,因为这样可以顺便学一下英语。

代码逻辑

这里使用了MiniExcel
在这里插入图片描述
Json化方式
在这里插入图片描述

实体对象

public class TranslateModel
{public TranslateModel() { }public TranslateModel(string scene,string key,string en) {Scene = scene;Key = key;EN = en;}public string Scene { get; set; }public string Key { get; set; }/// <summary>/// 英语/// </summary>public string EN { get; set; }/// <summary>/// 简体中文/// </summary>public string ZH { get; set; }/// <summary>/// 繁体中文/// </summary>public string CHT { get; set; }/// <summary>/// 德语/// </summary>public string DE { get; set; }/// <summary>/// 法语/// </summary>public string FR { get; set; }/// <summary>/// 西班牙语/// </summary>public string ES { get; set; }/// <summary>/// 意大利语/// </summary>public string IT { get; set; }/// <summary>/// 葡萄牙语/// </summary>public string PT { get; set; }/// <summary>/// 俄语/// </summary>public string RU { get; set; }/// <summary>/// 日语/// </summary>public string JA { get; set; }/// <summary>/// 韩语/// </summary>public string KO { get; set; }
}

翻译帮助类

public class TranslateHelper
{/// <summary>
/// 存放读取的数据
/// </summary>
public IEnumerable<TranslateModel> Translates { get; private set; }/// <summary>/// 模板路径/// </summary>public readonly string TemplateUrl = "Assests/translate_template.xlsx";/// <summary>/// 读取路径/// </summary>public readonly string ReadUrl = "Assests/translate_read.xlsx";/// <summary>/// 翻译导出路径/// </summary>public readonly string WriteUrl = "Assests/translate_read.xlsx";public TranslateHelper(){}}
导出模板
/// <summary>
/// 导出模板,如果文件存在则跳过
/// </summary>
public void CreateTemplate()
{if (!File.Exists(TemplateUrl)){var config = new OpenXmlConfiguration(){TableStyles = TableStyles.None};var saveTemplate = new List<TranslateModel>();saveTemplate.Add(new TranslateModel("Main", "Hello", "Hello World!"));MiniExcel.SaveAs(TemplateUrl, saveTemplate,configuration: config);}
}

在这里插入图片描述

读取文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

翻译

这里用一下我的封装

C# HttpClient Get Post简单封装

先来一个Hello world!翻译

在这里插入图片描述

public class TranslateHelper
{public enum Language { zh, cht, en, de, fr, es, it, pt, ru, ja, ko }/// <summary>/// 存放读取的数据/// </summary>public IEnumerable<TranslateModel> Translates { get; private set; }/// <summary>/// 模板路径/// </summary>public const string TemplateUrl = "Assests/translate_template.xlsx";/// <summary>/// 读取路径/// </summary>public const string ReadUrl = "Assests/translate_read.xlsx";/// <summary>/// 翻译导出路径/// </summary>public const string WriteUrl = "Assests/translate_read.xlsx";public const string API_KEY = "你的key";public const string APPID = "你的ip";public const string API_URL = "https://api.niutrans.com/NiuTransServer/translation";public TranslateHelper(){}/// <summary>/// 导出模板,如果文件存在则跳过/// </summary>public void CreateTemplate(){if (!File.Exists(TemplateUrl)){var config = new OpenXmlConfiguration(){TableStyles = TableStyles.None};var saveTemplate = new List<TranslateModel>();saveTemplate.Add(new TranslateModel("Main", "Hello", "Hello World!"));MiniExcel.SaveAs(TemplateUrl, saveTemplate, configuration: config);}}public void Read(){Translates = MiniExcel.Query<TranslateModel>(ReadUrl);}public async Task<string> TranslateFromEN(string en, Language language){//这个是我自己封装的,你也可以用微软官方的原生httpclientvar httpHelper = new MyHttpHelper(API_URL);var data = new{src_text = en,from = "en",to = language.ToString(),apikey = API_KEY,};var res = await httpHelper.JsonHttpPost<Dictionary<string,string>>("", data, null);var str = res["tgt_text"];return str;}}
测试
        static void Main(string[] args){var helper = new TranslateHelper();helper.CreateTemplate();Console.WriteLine("开始!");Task.Run(async () =>{var res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.zh);Console.WriteLine(res);});Console.WriteLine("结束!");Console.ReadKey();}

在这里插入图片描述

多语言测试
Task.Run(async () =>
{var res = "";res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.zh);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.cht);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.de);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.fr);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.es);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.it);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.pt);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.ru);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.ja);Console.WriteLine(res);res = await helper.TranslateFromEN("Hello world!", TranslateHelper.Language.ko);Console.WriteLine(res);
});

在这里插入图片描述

综合翻译
/// <summary>
/// 读取并写入机翻结果
/// </summary>
/// <returns></returns>
public async Task ReadAndWrite()
{if(!File.Exists(ReadUrl)){Console.WriteLine($"[{ReadUrl}]文件不存在,读取失败");return;}else{Translates = MiniExcel.Query<TranslateModel>(ReadUrl).ToArray();}if (File.Exists(WriteUrl)){Console.WriteLine($"[{WriteUrl}]文件已存在,跳过翻译");return ;}else{for(var i = 0;i< Translates.Count();i++){Console.WriteLine($"翻译进度:[{i}/{Translates.Count()}]");Translates[i] = await TranslateAllFromEN(Translates[i]);}//将数据保留MiniExcel.SaveAs(WriteUrl, Translates);}}/// <summary>
/// 从EN翻译全部
/// </summary>
/// <returns></returns>
public async Task<TranslateModel> TranslateAllFromEN(TranslateModel translateModel)
{if (translateModel.EN != null && translateModel.EN != ""){var en = translateModel.EN;translateModel.ZH = await TranslateFromEN(en, Language.zh);translateModel.CHT = await TranslateFromEN(en, Language.cht);translateModel.DE = await TranslateFromEN(en, Language.de);translateModel.FR = await TranslateFromEN(en, Language.fr);translateModel.ES = await TranslateFromEN(en, Language.es);translateModel.IT = await TranslateFromEN(en, Language.it);translateModel.PT = await TranslateFromEN(en, Language.pt);translateModel.RU = await TranslateFromEN(en, Language.ru);translateModel.JA = await TranslateFromEN(en, Language.ja);translateModel.KO = await TranslateFromEN(en, Language.ko);Console.WriteLine(JsonConvert.SerializeObject(translateModel));}else{Console.WriteLine($"Scene[{translateModel.Scene}],Key[{translateModel.Key}]的EN为空");}return translateModel;}/// <summary>
/// EN单独翻译
/// </summary>
/// <param name="en"></param>
/// <param name="language"></param>
/// <returns></returns>
public async Task<string> TranslateFromEN(string en, Language language)
{//防止请求过快,小牛API并发有限制await Task.Delay(100);//Console.WriteLine(language.ToString());var httpHelper = new MyHttpHelper(API_URL);var data = new{src_text = en,from = "en",to = language.ToString(),apikey = API_KEY,};var res = await httpHelper.JsonHttpPost<Dictionary<string,string>>("", data, null);var str = res["tgt_text"];return str;
}
文件准备

在这里插入图片描述

在这里插入图片描述

测试代码
Task.Run(async () =>
{await helper.ReadAndWrite();});
测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

实体类

public class TranslateModel
{public TranslateModel() { }public TranslateModel(string scene,string key,string en) {Scene = scene;Key = key;EN = en;}public string Scene { get; set; }public string Key { get; set; }/// <summary>/// 英语/// </summary>public string EN { get; set; }/// <summary>/// 简体中文/// </summary>public string ZH { get; set; }/// <summary>/// 繁体中文/// </summary>public string CHT { get; set; }/// <summary>/// 德语/// </summary>public string DE { get; set; }/// <summary>/// 法语/// </summary>public string FR { get; set; }/// <summary>/// 西班牙语/// </summary>public string ES { get; set; }/// <summary>/// 意大利语/// </summary>public string IT { get; set; }/// <summary>/// 葡萄牙语/// </summary>public string PT { get; set; }/// <summary>/// 俄语/// </summary>public string RU { get; set; }/// <summary>/// 日语/// </summary>public string JA { get; set; }/// <summary>/// 韩语/// </summary>public string KO { get; set; }
}

翻译帮助类

public class TranslateHelper
{public enum Language { zh, cht, en, de, fr, es, it, pt, ru, ja, ko }/// <summary>/// 存放读取的数据/// </summary>public TranslateModel[] Translates { get; private set; }/// <summary>/// 模板路径/// </summary>public const string TemplateUrl = "Assests/translate_template.xlsx";/// <summary>/// 读取路径/// </summary>public const string ReadUrl = "Assests/translate_read.xlsx";/// <summary>/// 翻译导出路径/// </summary>public const string WriteUrl = "Assests/translate_write.xlsx";public const string API_KEY = "你的key";public const string APPID = "你的appid";public const string API_URL = "https://api.niutrans.com/NiuTransServer/translation";public TranslateHelper(){}/// <summary>/// 导出模板,如果文件存在则跳过/// </summary>public void CreateTemplate(){if (!File.Exists(TemplateUrl)){var config = new OpenXmlConfiguration(){TableStyles = TableStyles.None};var saveTemplate = new List<TranslateModel>();saveTemplate.Add(new TranslateModel("Main", "Hello", "Hello World!"));MiniExcel.SaveAs(TemplateUrl, saveTemplate, configuration: config);}else{Console.WriteLine($"[{TemplateUrl}]文件已存在,跳过创建");}}/// <summary>/// 读取并写入机翻结果/// </summary>/// <returns></returns>public async Task ReadAndWrite(){if(!File.Exists(ReadUrl)){Console.WriteLine($"[{ReadUrl}]文件不存在,读取失败");return;}else{Translates = MiniExcel.Query<TranslateModel>(ReadUrl).ToArray();}if (File.Exists(WriteUrl)){Console.WriteLine($"[{WriteUrl}]文件已存在,跳过翻译");return ;}else{for(var i = 0;i< Translates.Count();i++){Console.WriteLine($"翻译进度:[{i+1}/{Translates.Count()}]");Translates[i] = await TranslateAllFromEN(Translates[i]);}var config = new OpenXmlConfiguration(){TableStyles = TableStyles.None};//将数据保留MiniExcel.SaveAs(WriteUrl, Translates,configuration:config);}}/// <summary>/// 从EN翻译全部/// </summary>/// <returns></returns>public async Task<TranslateModel> TranslateAllFromEN(TranslateModel translateModel){if (translateModel.EN != null && translateModel.EN != ""){var en = translateModel.EN;translateModel.ZH = await TranslateFromEN(en, Language.zh);translateModel.CHT = await TranslateFromEN(en, Language.cht);translateModel.DE = await TranslateFromEN(en, Language.de);translateModel.FR = await TranslateFromEN(en, Language.fr);translateModel.ES = await TranslateFromEN(en, Language.es);translateModel.IT = await TranslateFromEN(en, Language.it);translateModel.PT = await TranslateFromEN(en, Language.pt);translateModel.RU = await TranslateFromEN(en, Language.ru);translateModel.JA = await TranslateFromEN(en, Language.ja);translateModel.KO = await TranslateFromEN(en, Language.ko);Console.WriteLine(JsonConvert.SerializeObject(translateModel));}else{Console.WriteLine($"Scene[{translateModel.Scene}],Key[{translateModel.Key}]的EN为空");}return translateModel;}/// <summary>/// EN单独翻译/// </summary>/// <param name="en"></param>/// <param name="language"></param>/// <returns></returns>public async Task<string> TranslateFromEN(string en, Language language){//防止请求过快,小牛API并发有限制await Task.Delay(100);//Console.WriteLine(language.ToString());var httpHelper = new MyHttpHelper(API_URL);var data = new{src_text = en,from = "en",to = language.ToString(),apikey = API_KEY,};var res = await httpHelper.JsonHttpPost<Dictionary<string,string>>("", data, null);var str = res["tgt_text"];return str;}}

网络帮助类

public class MyHttpHelper
{private string baseUrl;/// <summary>/// 基础Api/// </summary>public string BaseUrl{get{return baseUrl;}set{baseUrl = value;MyHttpClient = new HttpClient(){BaseAddress = new Uri(baseUrl)};}}public HttpClient MyHttpClient { get; set; }public MyHttpHelper(){}public MyHttpHelper(string baseUrl){BaseUrl = baseUrl;}/// <summary>/// 序列化返回值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="api"></param>/// <param name="strParams"></param>/// <returns></returns>public async Task<T> JsonHttpGet<T>(string api, Dictionary<string, string> strParams){var res = await MyHttpGet(api, strParams);return await res.Content.ReadFromJsonAsync<T>();}/// <summary>/// 序列化返回值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="api"></param>/// <param name="value"></param>/// <param name="strParams"></param>/// <returns></returns>public async Task<T> JsonHttpPost<T>(string api, object value, Dictionary<string, string> strParams){var res = await MyHttpPost(api, value, strParams);return await res.Content.ReadFromJsonAsync<T>();}/// <summary>/// 序列化请求/// </summary>/// <param name="api"></param>/// <param name="param"></param>/// <returns></returns>public async Task<HttpResponseMessage> MyHttpGet(string api, Dictionary<string, string> param){string paramStr = DictionaryToParams(param);return await MyHttpClient.GetAsync(api + paramStr);}/// <summary>/// 自定义的转发功能/// </summary>/// <param name="api"></param>/// <param name="dataname"></param>/// <param name="value"></param>/// <returns></returns>public Task<HttpResponseMessage> MyHttpPost(string api, object value, Dictionary<string, string> strParams){return MyHttpClient.PostAsync(api + DictionaryToParams(strParams), new StringContent(JsonConvert.SerializeObject(value), Encoding.UTF8, "application/json"));}/// <summary>/// 字典转参数/// </summary>/// <param name="param"></param>/// <returns></returns>public string DictionaryToParams(Dictionary<string, string> param){var res = "";if (param != null){var list = param.ToList();if (list.Count != 0){for (var i = 0; i < list.Count; i++){if (i != 0){res += "&";}res += $"{list[i].Key}={list[i].Value}";}res = "?" + res;}}return res;}
}

最终效果

翻译前

在这里插入图片描述

翻译中

在这里插入图片描述

翻译后

在这里插入图片描述

总结

多语言发布,这样可以让我们的游戏在更多的国家用户使用。虽然我暂时没有这个需求,但是说不定也有别的项目需要多语言的本地化接入。

相关文章:

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…...

服务器大请求体问题定位

背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

Vue指令之v-model

调了半天没反应&#xff0c;结果是没引用Vue&#xff0c;我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下&#xff0c;Vue是数据驱动的&#xff0c;即数据发生改变后网页就会刷新一次&#xff0c;更改对应的网页内容&#xff0c;即数据单向绑定了网页内容。而使用…...

信息系统项目管理师——第11章项目成本管理(重要)

选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考&#xff0c;需要完全掌握。 选择题大概考3分左右&#xff0c;理论和计算都会考。 案例题&#xff0c;必考内容&#xff0c;挣值相关的计算&#xff0c;必须得会。 论文题&#xff0c;考的比较多&#xff0c;…...

SpringMVC常见面试题

1&#xff1a;Spring mvc执行流程 回答&#xff1a; 版本1&#xff1a;视图版本&#xff0c;jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器&#xff0c;生成处理器对象及处理器拦…...

golang 和java对比

Golang&#xff08;又称Go&#xff09;和Java都是目前非常流行的编程语言&#xff0c;但它们有着不同的设计哲学和用途。在本文中&#xff0c;我们将对Golang和Java进行比较&#xff0c;从以下几个方面进行评估&#xff1a;语言特性、性能、并发性能、生态系统和使用场景。 一…...

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask&#xff0c;这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况&#xff0c;一般在线会议投屏&#xff0c;总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力&#xff0c;可以在电脑端直接控制手机&#xff0c;同步起来非常方便简单 打开步骤 …...

.Net Web窗口页属性

<%Page %> Page 指令定义 Web 窗体使用的属性&#xff0c;这些属性将被 Web 窗体页分析器和编译器使用。只能包含在 .aspx 文件中。我们每新建一个 Web 页面时&#xff0c;系统会自动为该 Web 页面头部创建一个 Page 指令&#xff0c;来指明页面最基本的属性。 Langu…...

渐变色x轴换行柱状图

// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …...

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…...

Mysql中的那些锁

表锁和行锁 表锁&#xff1a;一锁锁整张表&#xff0c;mysql中锁定颗粒度最大的一种&#xff0c;针对非索引字段加的锁。MyISAM和InnoDb都支持。 行锁&#xff1a;一锁只锁整行&#xff0c;锁定颗粒度最小&#xff0c;针对索引字段加的锁。MyISAM不支持&#xff0c;InnoDb支持…...

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…...

程序员开发技术整理(持续整理中)

前端技术&#xff1a; vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件 C#后端技术&#xff1a; webservice&#xff1a;soap架构&#xff1a;简单的通信协议&#xff0c;用于服务通信ORM框架&#xff1a;对象关系映射&#xff0c;如EF&#xff1a;对象实体…...

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xff0c;…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…...

更新一条SQL的执行流程

在 MySQL中&#xff0c;条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句&#xff0c;并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后&#xff0c;先进行语法…...

深入理解nginx mp4流媒体模块[上]

目录 1. 引言2. 配置3. 源码分析3.1 配置指令3.1.1 mp43.1.2 mp4_buffer_size3.1.3 mp4_max_buffer_size3.1.4 mp4_start_key_frame 3.2 MP4的请求处理过程3.2.1 预处理3.2.2 找到并打开本地mp4文件3.2.3 解析请求参数3.2.4 MP4文件的处理 深入理解nginx mp4流媒体模块[上] 深入…...

Go 之 Gin 框架

Gin 是一个 Go (Golang) 编写的轻量级 web 框架&#xff0c;运行速度非常快&#xff0c;擅长 Api 接口的高并发&#xff0c;如果项目的规模不大&#xff0c;业务相对简单&#xff0c;这个时候我们也推荐您使用 Gin&#xff0c;特别适合微服务框架。 简单路由配置 package mai…...

【超全】基于Springboot多维分类的知识管理系统【包括源码+文档+调试】

&#x1f495;&#x1f495;发布人&#xff1a; 码上青云 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#xff0c;欢迎咨询。 &#x1f495;&#x1f495;程序开发、技术解答、代码讲解、文档&#xff0c; &#x1f31…...

Java高频面试题:RocketMQ有哪些使用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Java高频面试题&#xff1a;RocketMQ有哪些使用场景&#xff1f;】面试题 。希望对大家有帮助&#xff1b;Java高频面试题&#xff1a;RocketMQ有哪些使用场景&#xff1f;RocketMQ 是阿里巴巴开源的一款分布式消息中间件&#xff0…...

利用快马平台快速构建高清乱码生成器:编码错误可视化原型开发指南

最近在调试一个多语言网站时&#xff0c;遇到了各种编码问题导致的乱码现象。为了更直观地理解不同编码错误的表现形式&#xff0c;我尝试用InsCode(快马)平台快速搭建了一个高清乱码生成器&#xff0c;效果出乎意料地好。下面分享下这个项目的实现思路和具体操作&#xff1a; …...

实战应用:从git安装到项目初始化,用快马生成数据分析项目版本控制模板

今天想和大家分享一个数据分析项目中经常被忽视但极其重要的环节——Git版本控制的初始化配置。作为一个经常用Python做数据分析的开发者&#xff0c;我发现很多人在项目初期就忽略了版本控制的重要性&#xff0c;导致后期协作时出现各种混乱。下面我就结合InsCode(快马)平台&a…...

TranslucentTB深度解析:如何用5MB内存实现Windows任务栏的视觉革命

TranslucentTB深度解析&#xff1a;如何用5MB内存实现Windows任务栏的视觉革命 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在Windows…...

项目介绍 MATLAB实现基于灰狼优化算法(GWO)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码)

MATLAB实现基于灰狼优化算法&#xff08;GWO&#xff09;进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问以下链接地址 MATLAB实现基于灰狼优化算法&#xff08;GWO&#xff09;进行无人机三维路径规划的详细项目实例-CSDN博客 https://blo…...

Stable Diffusion XL 1.0开源大模型教程:灵感画廊app.py核心逻辑解读

Stable Diffusion XL 1.0开源大模型教程&#xff1a;灵感画廊app.py核心逻辑解读 “见微知著&#xff0c;凝光成影。将梦境的碎片&#xff0c;凝结为永恒的视觉诗篇。” 如果你对AI绘画感兴趣&#xff0c;一定听说过Stable Diffusion XL 1.0这个强大的开源模型。但面对复杂的参…...

FreeRTOS+LwIP 2.2.0实战:手把手教你理解tcpip_thread的消息处理机制

FreeRTOSLwIP 2.2.0实战&#xff1a;深入解析tcpip_thread的消息驱动架构 在嵌入式网络开发中&#xff0c;理解协议栈的线程模型是构建稳定系统的关键。当FreeRTOS遇上LwIP&#xff0c;tcpip_thread就像一位不知疲倦的邮差&#xff0c;日夜处理着来自各方的网络报文。本文将带您…...

告别Transformer!用PyTorch从零实现MLP-Mixer图像分类(附完整代码与调参技巧)

告别Transformer&#xff01;用PyTorch从零实现MLP-Mixer图像分类&#xff08;附完整代码与调参技巧&#xff09; 在计算机视觉领域&#xff0c;Transformer架构近年来风头无两&#xff0c;但你是否想过——仅用多层感知机&#xff08;MLP&#xff09;也能构建高性能视觉模型&a…...

【含文档+PPT+源码】基于springboot的教师评价系统的设计与实现

项目介绍本课程演示的是一款基于springboot的教师评价系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项…...