Unity汉化一个插件 制作插件汉化工具
我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...
尝试在Unity中汉化一个插件
效果:
思路:
如何在Unity中把一个自己喜欢的插件变成中文?在Unity中编写插件一般会用到编辑器扩展
在编辑器扩展中想在Inspector显示自己想要的属性名或者别的什么,就需要用到编辑器扩展的API
把这些固定的API存到一个字典里,例如“EditorGUILayout.PropertyField”,“LabelField”...我可以尝试先读取我们想要汉化插件的Editor文件夹下的每一个代码的每一行
把每一行的每个字符与字典做一个对比
对比成功就说明此行代码可以被汉化,收集可以被汉化的代码行,然后把可以被汉化的代码行替换成我们想要的代码
替换成功后保存代码听起来好像没啥问题,试试看
- 创建一个存储字典的代码
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu()]
public class SearchCharacterData : ScriptableObject
{[Header("检索字符对")]public List<Item> items;[Header("添加字符对")]public bool addItem = false;private void OnValidate(){if (addItem){addItem = false;items.Add(new Item());}}/// <summary>/// 物品数据/// </summary>[System.Serializable]public class Item{public string startStr;public string endStr;}
}
-
完成之后我们就可以在项目中创建一个自定义字典了
-
在字典中添加几对常用AIP用来测试
-
创建一个编辑器窗口代码
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;[System.Serializable]
public class Editor_ChinesizationTool : EditorWindow
{private static Editor_ChinesizationTool _window;[MenuItem("Tools/汉化编辑器")]public static void GUIDRefReplaceWin(){Rect wr = new Rect(0, 0, 300, 1000);//窗口大小_window = (Editor_ChinesizationTool)GetWindow(typeof(Editor_ChinesizationTool), true, "汉化编辑");// false 表示不能停靠的_window.Show();}
}
没想到要去翻译一个插件,竟然要自己先写一个...造孽啊~
- 读文件
/// <summary>/// 读取数据/// </summary>/// <returns></returns>public List<string> ReadFileInfo(bool IsUpdateNewData = true){Datas.Clear();CurrentDatas.Clear();CurrentSplitDatas.Clear();if (IsUpdateNewData) NewSplitDatas.Clear();StreamReader sr = null;//读取string assetsName = FileInfo.FullName;sr = File.OpenText(assetsName.Substring(assetsName.IndexOf("Assets")));//读取文件//读取所有行int line = 0;string data = null;do{data = sr.ReadLine();if (data != null){Datas.Add(data);CurrentDatas.Add(data);foreach (var item in searchCharacterData.items){string csData = FindString(data, item.startStr, item.endStr);if (csData != ""){CurrentSplitDatas.Add(new NewCSData(line, csData));if (IsUpdateNewData) NewSplitDatas.Add(new NewCSData(line, csData));break;}}}line++;} while (data != null);sr.Close();//关闭流sr.Dispose();//销毁流return CurrentDatas;}
- 将改好的数据进行写入
void WriteFileInfo(List<string> datas){StreamWriter sw;//写入if (!FileInfo.Exists){Debug.LogError("无法写入,没有该文件");return;}ClearData(path);sw = FileInfo.AppendText();//打开文件foreach (string linedata in datas){sw.WriteLine(linedata);}sw.Flush();//清除缓冲区sw.Close();//关闭流sw.Dispose();//销毁流//ReadFileInfo();}
- 稍稍修正一下编辑器页面,随便导入一个插件试试看
源码
注意!此文件需要放在Editor文件夹下才可以正常使用
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;[System.Serializable]
public class Editor_ChinesizationTool : EditorWindow
{private static Editor_ChinesizationTool _window;public string modelPath = "Assets";public List<CSData> cslist = new List<CSData>();public static Rect modelRect;int maxLineCount = 5;Vector2 csDataPos, contentPos;SearchCharacterData searchCharacterData = null;CSData CurrentCSData = null;[MenuItem("Tools/汉化编辑器")]public static void GUIDRefReplaceWin(){Rect wr = new Rect(0, 0, 300, 1000);//窗口大小_window = (Editor_ChinesizationTool)GetWindow(typeof(Editor_ChinesizationTool), true, "汉化编辑");// false 表示不能停靠的_window.Show();}private Material m_material;//1private void OnEnable(){m_material = new Material(Shader.Find("Hidden/Internal-Colored"));//2m_material.hideFlags = HideFlags.HideAndDontSave;//3}void OnGUI(){EditorGUILayout.Space();EditorGUILayout.LabelField("将文件夹拖拽到此处");EditorGUILayout.Space();GUI.SetNextControlName("input1");//设置下一个控件的名字modelRect = EditorGUILayout.GetControlRect();modelPath = EditorGUI.TextField(modelRect, modelPath);EditorGUILayout.Space();DragFolder();EditorGUILayout.Space();searchCharacterData = EditorGUILayout.ObjectField("", searchCharacterData, typeof(SearchCharacterData), true) as SearchCharacterData;// 导出材质if (searchCharacterData == null){GUILayout.Label("请添加字典");return;}if (GUILayout.Button("读取文件")){ReadFile();CurrentCSData = null;}if (CurrentCSData == null){int currentLineCount = 1;csDataPos = EditorGUILayout.BeginScrollView(csDataPos, GUILayout.Width(1000), GUILayout.Height(500));bool isLineEnd = true;maxLineCount = EditorGUILayout.IntField("每行显示脚本的个数", maxLineCount);foreach (CSData csdate in cslist){if (currentLineCount == 1){GUILayout.BeginHorizontal();isLineEnd = false;}if (GUILayout.Button(csdate.name)){CurrentCSData = csdate;}if (currentLineCount == maxLineCount){GUILayout.EndHorizontal();currentLineCount = 0;isLineEnd = true;}currentLineCount++;}if (isLineEnd == false){GUILayout.EndHorizontal();}GUILayout.EndScrollView();}if (CurrentCSData != null){EditorGUILayout.BeginVertical("HelpBox");GUILayout.BeginHorizontal();csDataPos = EditorGUILayout.BeginScrollView(csDataPos, GUILayout.Width(500), GUILayout.Height(700));#region 显示代码int line = 1;lineLocations.Clear();foreach (var date in CurrentCSData.CurrentDatas){GUILayout.Label(line + " " + date);foreach (var item in CurrentCSData.CurrentSplitDatas){if (line == item.line){LineLocation lineLocation = new LineLocation();Rect rect = GUILayoutUtility.GetLastRect();lineLocation.FirstRect = new Vector2(rect.x, rect.y - csDataPos.y);lineLocation.FirstRectOffset = csDataPos;lineLocations.Add(lineLocation);}}line++;}GUILayout.EndScrollView();GUILayout.Space(100);#endregioncontentPos = EditorGUILayout.BeginScrollView(contentPos, GUILayout.Width(700), GUILayout.Height(700));for (int i = 0; i < CurrentCSData.CurrentSplitDatas.Count; i++){//GUILayout.BeginHorizontal();GUILayout.Label(CurrentCSData.CurrentSplitDatas[i].line + 1 + " " + CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line]);//找到可更换数据lineLocations[i].FirstRect.y += contentPos.y;lineLocations[i].LastRectOffset = contentPos;Rect rect = GUILayoutUtility.GetLastRect();lineLocations[i].LastRect = new Vector2(rect.x, rect.y);CurrentCSData.NewSplitDatas[i].data = EditorGUILayout.TextField(CurrentCSData.NewSplitDatas[i].data);//GUILayout.EndHorizontal();}foreach (var item in lineLocations){m_material.SetPass(0);//4GL.Begin(GL.LINES);GL.Color(Color.red);GL.Vertex3(item.FirstRect.x - 100+10, LimitMax(item.FirstRect.y + 30,690+ item.LastRectOffset.y, item.LastRectOffset.y), 0);GL.Vertex3(item.FirstRect.x - 105+10, LimitMax(item.FirstRect.y + 30, 690+ item.LastRectOffset.y, item.LastRectOffset.y), 0);GL.End();GL.Begin(GL.LINES);GL.Color(Color.black);GL.Vertex3(item.FirstRect.x - 100+10, LimitMax(item.FirstRect.y + 30,690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);//================================================================================================GL.Vertex3(item.LastRect.x-10, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0); GL.End();GL.Begin(GL.LINES);GL.Color(Color.red);GL.Vertex3(item.LastRect.x-10, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);GL.Vertex3(item.LastRect.x-5, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);GL.End();//Debug.Log("FirstRect:" + item.FirstRect+"__"+ "LastRect:"+ item.LastRect);//break;}GUILayout.EndScrollView();GUILayout.EndHorizontal();GUILayout.BeginHorizontal();if (GUILayout.Button("确认更改")){CurrentCSData.ReadFileInfo(false);for (int i = 0; i < CurrentCSData.CurrentSplitDatas.Count; i++){CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line] =ReplaceStr(CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line],CurrentCSData.CurrentSplitDatas[i].data,CurrentCSData.NewSplitDatas[i].data);}for (int i = 0; i < CurrentCSData.Datas.Count; i++){CurrentCSData.Datas[i] = CurrentCSData.CurrentDatas[i];}CurrentCSData.WriterData();AssetDatabase.Refresh();}if (GUILayout.Button("重新选择文件")){CurrentCSData = null;}GUILayout.EndHorizontal();GUILayout.EndVertical();}EditorGUILayout.Space();}List<LineLocation> lineLocations = new List<LineLocation>();public class LineLocation{public Vector2 FirstRectOffset;public Vector2 FirstRect;public Vector2 LastRectOffset;public Vector2 LastRect;}public void ReadFile(){GetAllFilesAndDertorys(modelPath, searchCharacterData);}/// <summary>/// 获得拖拽文件/// </summary>void DragFolder(){//鼠标位于当前窗口if (mouseOverWindow == this){//拖入窗口未松开鼠标if (Event.current.type == EventType.DragUpdated){DragAndDrop.visualMode = DragAndDropVisualMode.Generic;//改变鼠标外观// 判断区域if (modelRect.Contains(Event.current.mousePosition))GUI.FocusControl("input1");}//拖入窗口并松开鼠标else if (Event.current.type == EventType.DragExited){string dragPath = string.Join("", DragAndDrop.paths);// 判断区域if (modelRect.Contains(Event.current.mousePosition))modelPath = dragPath;// 取消焦点(不然GUI不会刷新)GUI.FocusControl(null);}}}static string FindString(string str, string StartStr, string EndStr){if (str.Length < 3)return "";int index3 = str.IndexOf(StartStr);if (index3 != -1){int index4 = str.IndexOf(EndStr, index3);if (index4 != -1){return str.Substring(index3 + StartStr.Length, index4 - index3 - StartStr.Length);}}return "";}void GetAllFilesAndDertorys(string _path, SearchCharacterData searchCharacterData){//判断路径是否存在if (Directory.Exists(_path)){#region 找到Editor文件夹DirectoryInfo dir = new DirectoryInfo(_path);DirectoryInfo[] allDirs = dir.GetDirectories("*", SearchOption.AllDirectories);string EditorPath = "";foreach (var item in allDirs){//忽略.metaif (item.Name.EndsWith(".meta")) continue;string assetsName = item.FullName;assetsName = assetsName.Substring(assetsName.IndexOf("Assets"));if (item.Name == "Editor"){EditorPath = assetsName;break;}}#endregionif (EditorPath != ""){#region 得到Editor文件夹下所有的.cs文件DirectoryInfo editorDir = new DirectoryInfo(EditorPath);cslist.Clear();int ListIndex = 0;foreach (var item in editorDir.GetFiles("*", SearchOption.AllDirectories)){//忽略.metastring assetsName = item.FullName;assetsName = assetsName.Substring(assetsName.IndexOf("Assets"));if (item.Name.EndsWith(".meta")) continue;if (item.Name.EndsWith(".cs")){cslist.Add(new CSData(ListIndex, item, assetsName, searchCharacterData, this));}ListIndex++;}#endregionforeach (var item in cslist){item.ReadFileInfo();}}else{Debug.LogError("该目录没有Editor文件夹");}}}string ReplaceStr(string str, string oldStr, string newStr){if (str.Length < 3)return "";int strIndex = str.IndexOf(oldStr);if (strIndex != -1){string startStr = str.Substring(0, strIndex);string endStr = str.Substring(strIndex + oldStr.Length);return startStr + newStr + endStr;}return "";}public float LimitMax(float f, float maxValue = 690, float minValue = 0){//return f;return Math.Min(maxValue, Math.Max(f, minValue));}[System.Serializable]public class CSData{Editor_ChinesizationTool editor_ChinesizationTool = null;SearchCharacterData searchCharacterData = null;public string name;private FileInfo fileInfo;public int ListIndex = -1;public string path;/// <summary>/// 原始数据/// </summary>public List<string> Datas = new List<string>();/// <summary>/// 当前数据/// </summary>public List<string> CurrentDatas = new List<string>();/// <summary>/// 新数据/// </summary>public List<NewCSData> CurrentSplitDatas = new List<NewCSData>();public List<NewCSData> NewSplitDatas = new List<NewCSData>();public FileInfo FileInfo{get{if (fileInfo == null){editor_ChinesizationTool.ReadFile();fileInfo = editor_ChinesizationTool.cslist[ListIndex].FileInfo;}return fileInfo;}set => fileInfo = value;}public CSData(int mListIndex, FileInfo mfileInfo, string path, SearchCharacterData searchCharacterData, Editor_ChinesizationTool parent){FileInfo = mfileInfo;this.path = path;this.name = FileInfo.Name;this.searchCharacterData = searchCharacterData;this.ListIndex = mListIndex;this.editor_ChinesizationTool = parent;}/// <summary>/// 写入数据/// </summary>public void WriterData(){WriteFileInfo(Datas);}/// <summary>/// 读取数据/// </summary>/// <returns></returns>public List<string> ReadFileInfo(bool IsUpdateNewData = true){Datas.Clear();CurrentDatas.Clear();CurrentSplitDatas.Clear();if (IsUpdateNewData) NewSplitDatas.Clear();StreamReader sr = null;//读取string assetsName = FileInfo.FullName;sr = File.OpenText(assetsName.Substring(assetsName.IndexOf("Assets")));//读取文件//读取所有行int line = 0;string data = null;do{data = sr.ReadLine();if (data != null){Datas.Add(data);CurrentDatas.Add(data);foreach (var item in searchCharacterData.items){string csData = FindString(data, item.startStr, item.endStr);if (csData != ""){CurrentSplitDatas.Add(new NewCSData(line, csData));if (IsUpdateNewData) NewSplitDatas.Add(new NewCSData(line, csData));break;}}}line++;} while (data != null);sr.Close();//关闭流sr.Dispose();//销毁流return CurrentDatas;}void WriteFileInfo(List<string> datas){StreamWriter sw;//写入if (!FileInfo.Exists){Debug.LogError("无法写入,没有该文件");return;}ClearData(path);sw = FileInfo.AppendText();//打开文件foreach (string linedata in datas){sw.WriteLine(linedata);}sw.Flush();//清除缓冲区sw.Close();//关闭流sw.Dispose();//销毁流//ReadFileInfo();}void ClearData(string path){StreamWriter tmpWrite = new StreamWriter(path);tmpWrite.Write("");tmpWrite.Close();}}[System.Serializable]public class NewCSData{public int line = 0;public string data = "";public NewCSData(int line, string data){this.line = line;this.data = data;}}
}
最后的最后:
我自己反正没实践过,可以先拿这个玩玩看还是挺有意思的~
觉得有意思可以改巴改巴,也可以把建议放在评论区,有空我就更新一下~
Demo源码
相关文章:

Unity汉化一个插件 制作插件汉化工具
我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...尝试在Unity中汉化一个插件 效果: 思路: 如何在Unity中把一个自己喜欢的插件…...

从过滤器初识责任链设计模式
下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…...

Redis7安装配置
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

切分支解决切不走因为未合并的路径如何解决
改代码的时候改做分支了,本来是在另一个分支上面改代码,结果改到另一个放置上面,然后想着使用git stash进行保存,然后切到另外一个分支再pop,结果不行。 报这个错误,导致切不过去,因为我这边pop…...

自动化运维:Ansible之playbook基于ROLES部署LNMP平台
目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…...

SpringBoot整合MQ
1.创建工程并引入依赖 <!-- 添加rocketmq的启动器--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.1.1</version></dependency>2.编写…...

算法训练day37|贪心算法 part06(LeetCode738.单调递增的数字)
文章目录 738.单调递增的数字思路分析代码实现 738.单调递增的数字 题目链接🔥🔥 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的…...

【C++基础】4. 变量
文章目录 【 1. 变量的定义 】【 2. 变量的声明 】示例 【 3. 左值和右值 】 变量:相当于是程序可操作的数据存储区的名称。在 C 中,有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局&am…...

jmeter setUp Thread Group
SetUp Thread Group 是一种特殊类型的线程组,它用于在主测试计划执行之前执行一些初始化任务。 SetUp Thread Group 通常用于以下几种情况: 用户登录:在模拟用户执行实际测试之前,模拟用户登录到系统以获取访问权限。 创建会话&a…...

图神经网络教程之GCN(pyG)
图神经网络-pyG版本的GCN Data(数据) data.x、data.edge_index、data.edge_attr、data.y、data.pos 举个例子 import torch from torch_geometric.data import Data edge_index torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtypetorch.long) #代表…...

python中的逻辑运算
逻辑运算 逻辑运算符是python用来进行逻辑判断的运算符,虽然运算符只有and、or、not三种,但是理解这三个运算符的原理才是最重要的 python中对false的认定 逻辑运算符是python用来进行逻辑判断的运算符,虽然运算符只有and、or、not三种&…...

TortoiseGit设置作者信息和用户名、密码存储
前言 Git 客户端每次与服务器交互,都需要输入密码,但是我们可以配置保存密码,只需要输入一次,就不再需要输入密码。 操作说明 在任意文件夹下,空白处,鼠标右键点击 在弹出菜单中按照下图点击 依次点击下…...

Fragment.OnPause的事情
我们知道Fragment的生命周期依附于相应Activity的生命周期,如果activity A调用了onPause,则A里面的fragment也会相应收到onPause回调,这里以support27.1.1版本的源码来说明Fragment生命周期onPause的事情。 当activity执行onPause时ÿ…...

【C++基础】5. 变量作用域
文章目录 【 1. 局部变量 】【 2. 全局变量 】【 3. 局部变量和全局变量的初始化 】 作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量。 在函数参数的定义中声明的变量,称…...

Python列表排序
介绍一个关于列表排序的sort方法,看下面的案例: """ 列表的sort方法来对列表进行自定义排序 """# 准备列表 my_list [["a", 33], ["b", 55], ["c", 11]]# 排序,基于带名函数 …...

(云HIS)云医院管理系统源码 SaaS模式 B/S架构 基于云计算技术
通过提供“一个中心多个医院”平台,为集团连锁化的医院和区域医疗提供最前沿的医疗信息化云解决方案。 一、概述 云HIS系统源码是一款满足基层医院各类业务需要的健康云产品。该系统能帮助基层医院完成日常各类业务,提供病患预约挂号支持、收费管理、病…...

sql:SQL优化知识点记录(十一)
(1)用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql: 查看一下我们执行过的sql 显示sql查询声明周期完整的过程: 当执行过程出现了下面这4个中的时,就会有问题导致效率慢 8这个sql创建…...

leetcode-链表类题目
文章目录 链表(Linked List) 链表(Linked List) 定义:链表(Linked List)是一种线性表数据结构,他用一组任意的存储单元来存储数据,同时存储当前数据元素的直接后继元素所…...

数据结构——哈希
哈希表 是一种使用哈希函数组织数据的数据结构,它支持快速插入和搜索。 哈希表(又称散列表)的原理为:借助 哈希函数,将键映射到存储桶地址。更确切地说, 1.首先开辟一定长度的,具有连续物理地址…...

效果好的it监控系统特点
一个好的IT监控系统应该具备以下特点: 全面性:IT监控系统应该能够监视和管理IT系统的所有方面,包括网络、服务器、应用程序和数据库等。这样可以确保系统的各个方面都得到充分的监视和管理。 可靠性:IT监控系统需要保持高可…...

leetcode1288. 删除被覆盖区间(java)
删除被覆盖区间 题目描述贪心法代码演示 题目描述 难度 - 中等 leetcode1288. 删除被覆盖区间 给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。 只有当 c < a 且 b < d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。 在完成所有删除操作…...

Python 虚拟环境相关命令
一 激活 在 cd venv/scripts 进入虚拟环境 执行命令 activate 1、创建虚拟环境 $ python -m venv 2、激活虚拟环境 $ source <venv>/bin/activate 3、关闭虚拟环境 $ deactivate...

使用U盘同步WSL2中的git项目
1、将U盘挂载到WSL2中 假设U盘在windows资源管理器中被识别为F盘,需要在WSL2中创建一个目录挂载U盘 sudo mkdir /mnt/f sudo mount -t drvfs F: /mnt/f后续所有的操作都完成后,拔掉U盘前,可以使用下面的命令从WSL2中安全的移除U盘 umount …...

Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装
Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 目录 Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 一、简单介绍 二、ControlNet 插件下载安装 三、ControlNet 插件模型下载安装 四、ControlNet 插件其他的下载安装方式 五、Co…...

CMAK学习
VS中的cmake_cmake vs_今天也要debug的博客-CSDN博客 利用vs2017 CMake开发跨平台C项目实战_cmake vs2017_神气爱哥的博客-CSDN博客 【【入门】在VS中使用CMake管理若干程序】https://www.bilibili.com/video/BV1iz4y117rZ?vd_source0aeb782d0b9c2e6b0e0cdea3e2121eba...

Python 推导式
Python 推导式 Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式: 列表(list)推导式字典(dict)推导式集合(set)推导式元组(tuple)推导式 列表推导式 列表推导式格式为&…...

es6的新特性有哪些
ES6(ECMAScript 2015)是JavaScript的一个重要版本,引入了许多新的语法和功能。以下是ES6的一些主要特性: 块级作用域(Block Scope):引入了let和const关键字,可以在块级作用域中声明变…...

logstash 消费kafka数据,转发到tcp端口
1, logstash 配置文件 [roothost1: ] cat /opt/logstash/kafka-to-tcp.yml input { kafka {bootstrap_servers > "192.168.0.11:9092" #这里可以是kafka集群,如"192.168.149.101:9092,192.168.149.102:9092"consumer_threads &…...

航天智信:严控航天系统研发安全,助力建设“航天强国”
航天智信作为中国航天科工三院在信息装备领域“做大做强”的重要布局,主要从事系统运用与联合体系研究,复杂信息系统的顶层设计、总体论证及研制生产,提供体系级、系统级信息系统整体解决方案,以及信息安全系统的设计研发与集成验…...

阿里云2核4G服务器5M带宽五年租用价格表
阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS,轻量2核4G4M带宽服务器297元一年,2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等,买5年可以享受3折优惠,阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…...