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选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场,国际化是肯定…...
服务器大请求体问题定位
背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

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

信息系统项目管理师——第11章项目成本管理(重要)
选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考,需要完全掌握。 选择题大概考3分左右,理论和计算都会考。 案例题,必考内容,挣值相关的计算,必须得会。 论文题,考的比较多,…...

SpringMVC常见面试题
1:Spring mvc执行流程 回答: 版本1:视图版本,jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器,生成处理器对象及处理器拦…...
golang 和java对比
Golang(又称Go)和Java都是目前非常流行的编程语言,但它们有着不同的设计哲学和用途。在本文中,我们将对Golang和Java进行比较,从以下几个方面进行评估:语言特性、性能、并发性能、生态系统和使用场景。 一…...
基于pear-admin-flask 的 flask 使用教程
我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

Android 开发投屏软件
一、背景 作为Android开发总会有给他人share自己APP情况,一般在线会议投屏,总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力,可以在电脑端直接控制手机,同步起来非常方便简单 打开步骤 …...
.Net Web窗口页属性
<%Page %> Page 指令定义 Web 窗体使用的属性,这些属性将被 Web 窗体页分析器和编译器使用。只能包含在 .aspx 文件中。我们每新建一个 Web 页面时,系统会自动为该 Web 页面头部创建一个 Page 指令,来指明页面最基本的属性。 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,修复各种提示错误 加密说明:200拿来的,只有8.1这个文件加密,其他文件无任何加密,已修复各种提示错误 测试其他开源版安装提示错误,有几个文件是加密的 注:开发不易&#…...
Mysql中的那些锁
表锁和行锁 表锁:一锁锁整张表,mysql中锁定颗粒度最大的一种,针对非索引字段加的锁。MyISAM和InnoDb都支持。 行锁:一锁只锁整行,锁定颗粒度最小,针对索引字段加的锁。MyISAM不支持,InnoDb支持…...

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档
文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Linux部署Sonarqube+Gogs+Jenkins(一)
Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录,并且进行解压3. 配置文件/etc/profile,配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…...
程序员开发技术整理(持续整理中)
前端技术: vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件 C#后端技术: webservice:soap架构:简单的通信协议,用于服务通信ORM框架:对象关系映射,如EF:对象实体…...

Java并查集详解(附Leetcode 547.省份数量讲解)
一、并查集概念 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)
前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…...
更新一条SQL的执行流程
在 MySQL中,条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句,并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后,先进行语法…...
深入理解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 框架,运行速度非常快,擅长 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用 Gin,特别适合微服务框架。 简单路由配置 package mai…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...