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)
    {
    //这个是我自己封装的,你也可以用微软官方的原生httpclient
        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;
    }


}
测试
        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;
    }
}

最终效果

翻译前

在这里插入图片描述

翻译中

在这里插入图片描述

翻译后

在这里插入图片描述

总结

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

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

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

相关文章

TransformControls 是 Three.js 中的一个类,用于在网页中进行 3D 场景中物体的交互式操作。

demo案例 TransformControls 是 Three.js 中的一个类&#xff0c;用于在网页中进行 3D 场景中物体的交互式操作。让我们来详细讲解它的输入参数、输出、属性和方法&#xff1a; 输入参数&#xff1a; TransformControls 构造函数通常接受两个参数&#xff1a; camera&#…

gcc任意版本安装流程(linux)

一.更换镜像源 仅仅针对有需要换镜像需求的用户 sudo gedit /etc/apt/sources.list 用于在基于Debian的Linux发行版&#xff08;如Ubuntu&#xff09;上用来编辑软件源列表的命令。 我们更换阿里源&#xff1a; deb http://mirrors.aliyun.com/ubuntu/ focal main restricted…

Linux课程____shell脚本应用

一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#xff0c;查看SD卡设备号&#xff0c;如下图所示…

centos 7 安装磐维(PanWeiDB)数据库(单机)

前置环境准备 文件系统环境要求 文件系统环境所要求的扇区必须为512bytes&#xff0c;查看方法如下&#xff1a; [rootdevops-core-highapp3-b-32 ~]#df -h /apps/ [rootdevops-core-highapp3-b-32 ~]#ll /dev/mapper/vg--docker-lvapp [rootdevops-core-highapp3-b-32 ~]#f…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 包(----------transfer--transfer--------)------delay--------包(----------transfer--transfer--------) TKEEP和TSTRB共同决定了是哪种数据流

BEVFusion-ICRA-2023异常

异常&#xff1a; RuntimeError: /tmp/mmcv/mmcv/ops/csrc/pytorch/cuda/sparse_indice.cu 126 cuda execution failed with error 2 ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 2901726) of binary: 解决&#xff1a; …

Arco动态生成表头信息

文章目录 需求分析需求 a-table动态生成表头,需求如下,部分是动态生成的表头,部分是固定的表头信息,现需要在动态表头的表中拿到固定表中的字段信息,但表头是动态表中返给的 分析 用两个表进行接收不同的信息,一个存放固定的 视图<a-table ref="tableRef&quo…

vue3从精通到入门2:虚拟DOM的生成与真实DOM的转化

虚拟 DOM 实现是 Vue 框架的核心部分之一&#xff0c;它负责在真实 DOM 之上抽象出一个轻量级的、可复用的 JavaScript 对象树&#xff0c;用于高效地更新视图。 什么是虚拟DOM? 虚拟 DOM 是一个编程概念&#xff0c;它将真实的 DOM 树抽象为一个轻量级的 JavaScript 对象树…

Spring事务-两种开启事务管理的方式:基于注解的声明式事务管理、基于编程式的事务管理

Spring事务-两种开启事务管理的方式 1、前期准备2、基于注解的声明式事务管理3、基于编程式的事务管理4、声明式事务失效的情况 例子&#xff1a;假设有一个银行转账的业务&#xff0c;其中涉及到从一个账户转钱到另一个账户。在这个业务中&#xff0c;我们需要保证要么两个账户…

Spark—GraphX实战 OneID

OneID 前面我们学习了ID Mapping&#xff0c;包括ID Mapping 的背景介绍和业务场景&#xff0c;以及如何使用Spark 实现ID Mapping&#xff0c;这个过程中涉及到了很多东西&#xff0c;当然我们都通过文章的形式介绍给大家了&#xff0c;所以你再学习今天这一节之前&#xff0…

python项目子模块配置

创建模块子应用 1.在项目中新建一个apps的目录&#xff0c;用于存放所有子模块应用 2.在apps包下创建所需应用 注册模块子应用 1.在主模块里面寻找到配置文件 2.在配置文件中找到 INSTALLED_APPS&#xff0c;添加相应路径apps.users Tips: 由于每次添加都要输入前缀apps.会…

解决:WARN:Tue Mar 26 23:36:57 CST 2024 WARN: Establishing SSL connection

小码在学习Java的JDBC编程中&#xff0c;碰到了一条非常长的异常警告&#xff0c;idea的框都装不下了&#xff01;&#xff01; 一、异常信息 Tue Mar 26 23:36:57 CST 2024 WARN: Establishing SSL connection without servers identity verification is not recommended. Ac…

C++类和对象、面向对象编程 (OOP)

文章目录 一、封装1.抽象、封装2.类和对象(0)学习视频(1)类的构成(2)三种访问权限(3)struct和class的区别(4)私有的成员变量、共有的成员函数(5)类内可以直接访问私有成员&#xff0c;不需要经过对象 二、继承三、多态1.概念2.多态的满足条件3.多态的使用条件4.多态原理剖析5.纯…

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例&#xff1a; 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…

备考ICA----Istio实验9---熔断Circuit Breaking 实验

备考ICA----Istio实验9—熔断Circuit Breaking 实验 1. 环境准备 创建httpbin环境 kubectl apply -f istio/samples/httpbin/httpbin.yaml kubectl get svc httpbin2. 创建测试用客户端 kubectl apply -f istio/samples/httpbin/sample-client/fortio-deploy.yaml3. 创建Ht…

YOLOv8融入低照度图像增强算法---传统算法篇

YOLOv8n原图检测YOLOv8n增强后检测召回率和置信度都有提升 前言 这篇博客讲讲低照度,大家都催我出一些内容,没想到这么多同学搞这个,恰好我也做过这方面的一些工作,那今天就来讲解一些方法,低照度的图像增强大体分“传统算法”和“深度学习算法”; 目前低照度的图像增…

mysql安装及操作

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB&#xff1f; DB的全称是database&#xff0c;即数据库的意思。数据库实际上就是一个文件集合&#xff0c;是一个存储数据的仓库&#xff0c;数据库是按照特定的格式把数据存储起来&#xff0c;用户可以对存储的数据进行…

管理能力学习笔记三:管理者的时间管理法

时间管理三步法 1、对任务进行分类 2、估算任务时间 3、持续反思评估 对任务进行分类 分类方法&#xff1a;时间管理四象限 A类 B类 C类 D类 估算时间 需要预留休息时间和机动时间 持续反思评估 核对检查任务 自我提问 处理日常干扰的办法 对事情发出提问 对话内容进行…