// ==UserScript==
// @name Nautobot演示汉化
// @namespace Violentmonkey Scripts
// @match https://demo.nautobot.com/*
// @grant none
// @version 0.0.7
// @author -
// @description Nautobo演示汉化,过度汉化必然有坑,请勿用于正式用途
// @author -
// @namespace
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const i18n = new Map([
['Nautobot Demo','Nautobot 演示'],
['Location Types','位置类型'],
['Location Floor Plans','位置平面图'],
['Racks','机架'],
['Rack Groups','机架组'],
['Reservations','保留'],
['Elevations','立面图'],
['Tenancy','租赁'],
['Tenants','租户'],
['Tenant Groups','租户组'],
['Tags','标签'],
['Statuses','状态'],
['Roles','角色'],
['Dynamic Groups','动态组'],
['Devices','设备'],
['Platforms','平台'],
['Virtual Chassis','虚拟机箱'],
['Device Redundancy Groups','设备冗余组'],
['Interface Redundancy Groups','接口冗余组'],
['Device Types','设备类型'],
['Manufacturers','制造商'],
['Cables','线缆'],
['Console Connections','控制台连接'],
['Power Connections','电源连接'],
['Interface Connections','接口连接'],
['Device Components','设备组件'],
['Interfaces','接口'],
['Front Ports','前端口'],
['Rear Ports','后端口'],
['Console Ports','Console端口'],
['Console Server Ports','Console服务器端口'],
['Power Ports','电源端口'],
['Power Outlets','电源插座'],
['Device Bays','设备托架'],
['Inventory Items','清单项目'],
['IPAM','IPAM'],
['IP Addresses','IP 地址'],
['IP Address Assignments','IP 地址分配'],
['Prefixes','前缀'],
['RIRs','RIR'],
['VRFs','VRF'],
['Namespaces','命名空间'],
['Route Targets','路由目标'],
['VLANs','VLAN'],
['VLAN Groups','VLAN 组'],
['Services','服务'],
['BGP - Global','BGP - 全局'],
['Autonomous Systems','自治系统'],
['Peer Group Templates','对等组模板'],
['BGP - Instances','BGP - 实例'],
['Routing Instances','路由实例'],
['Peer Groups','对等组'],
['Peer Group Address-families','对等组地址族'],
['BGP - Peerings','BGP - 对等'],
['Peerings','对等端点'],
['Peer Endpoint Address-families','对等端点地址族'],
['Address-families','地址族'],
['Virtualization','虚拟化'],
['Virtual Machines','虚拟机'],
['Cluster Types','群集类型'],
['Cluster Groups','群集组'],
['Circuits','网路'],
['Circuit Types','网路类型'],
['Providers','提供商'],
['Provider Networks','提供商网络'],
['Circuit Maintenance App','网路维护App'],
['Dashboard','仪表板'],
['Circuit Maintenances','网路维护'],
['Notifications','通知'],
['Notification Sources','通知源'],
['Power Feeds','电源'],
['Power Panels','电源面板'],
['Power','电源'],
['Device Lifecycle','设备生命周期'],
['Hardware Notices','硬件注意事项'],
['Software Lifecycle','软件生命周期'],
['Software Image','软件镜像'],
['Validated Software','已验证软件'],
['CVE','CVE'],
['Vulnerability','漏洞'],
['Contracts','合同'],
['Vendors','供应商'],
['POC','POC'],
['Device Software Validation - Report','设备软件验证 - 报告'],
['Device Software Validation - List','设备软件验证 - 列表'],
['Inventory Item Software Validation - Report','清单项目软件验证 - 报告'],
['Inventory Item Software Validation - List','清单项目软件验证 - 列表'],
['Reports','报告'],
['Secret Groups','机密组'],
['Secrets','机密'],
['Job Approval Queue','作业审批队列'],
['Scheduled Jobs','计划作业'],
['Job Results','作业结果'],
['Job Hooks','作业钩子'],
['Job Buttons','作业按钮'],
['Jobs','作业'],
['Extensibility','扩展'],
['Logging','日志记录'],
['Change Log','更改日志'],
['Data Sources','数据源'],
['Git Repositories','Git 仓库'],
['Data Validation Engine','数据验证引擎'],
['Min/Max Rules','最小/最大规则'],
['Regex Rules','正则表达式规则'],
['Required Rules','必填规则'],
['Unique Rules','唯一规则'],
['Data Compliance','数据合规性'],
['Data Management','数据管理'],
['GraphQL Queries','GraphQL 查询'],
['Relationships','关系'],
['Notes','备注'],
['Automation','自动化'],
['Config Contexts','配置上下文'],
['Config Context Schemas','配置上下文模式'],
['Export Templates','导出模板'],
['External Integrations','外部集成'],
['Webhooks','网络钩子'],
['Miscellaneous','杂项'],
['Computed Fields','计算字段'],
['Custom Fields','自定义字段'],
['Custom Links','自定义链接'],
['Manage','管理'],
['Config Overview','配置概述'],
['Config Compliance','配置合规性'],
['Compliance Report','合规性报告'],
['Config Plans','配置计划'],
['Setup','设置'],
['Compliance Rules','合规规则'],
['Compliance Features','合规性功能'],
['Config Removals','配置删除'],
['Config Replacements','配置替换'],
['Remediation Settings','修复设置'],
['Golden Config Settings','黄金配置设置'],
['Golden Config','黄金配置'],
['FQDNs','FQDN'],
['IP Ranges','IP 范围'],
['Address Objects','地址对象'],
['Address Object Groups','地址对象组'],
['Applications','应用程序'],
['Application Groups','应用程序组'],
['Service Objects','服务对象'],
['Service Object Groups','服务对象组'],
['User Objects','用户对象'],
['User Object Groups','用户对象组'],
['Zones','安全域'],
['Zone','安全域'],
['Policy Rules','策略规则'],
['NAT Policy Rules','NAT 策略规则'],
['NAT Policy','NAT 策略'],
['NAT Policies','NAT 策略'],
['Capirca','Capirca'],
['Capirca Policy Rules','Capirca 策略规则'],
['Installed Plugins','已安装插件'],
['Plugins','插件'],
['General','常规'],
['Single Source of Truth','单一事实源'],
['Logs','日志'],
['Welcome Wizard','欢迎向导'],
['Admin','管理'],
['Profile','用户配置文件'],
['Log out','退出登录'],
['Nautobot ChatOps','ChatOps'],
['Access Grants','访问授权'],
['Command Usage Records','命令使用记录'],
['Device Onboarding','设备载入'],
['Onboarding Tasks','载入任务'],
['Hierarchical geographic locations','多级地理位置'],
['Customers or departments','客户或部门'],
['NAT Rules','NAT规则'],
['Firewall Policies','防火墙策略'],
['Security Rules','安全规则'],
['Equipment racks, optionally organized by group','设备机架,可分组'],
['Physical hardware models by manufacturer','按制造商划分的物理硬件型号'],
['Rack-mounted network equipment, servers, and other devices','机架式网络设备、服务器和其他设备'],
['Represents a set of devices which share a common control plane','代表一组共用控制平面的设备'],
['Represents a set of devices which operate in a failover/HA group','代表在故障转移/HA 组中运行的一组设备'],
['Represents a set of interfaces which operate in a failover/HA group','代表在故障转移/HA 组中运行的一组接口'],
['Electrical circuits delivering power from panels','从面板供电的电路'],
['Electrical panels receiving utility power','接收市电的配电板'],
['Virtual routing and forwarding tables','虚拟路由和转发表'],
['IPv4 and IPv6 network assignments','IPv4 和 IPv6 网络分配'],
['Layer two domains, identified by VLAN ID','由 VLAN ID 标识的二层域'],
['Organizations which provide circuit connectivity','提供网路连接的组织'],
['Communication links for Internet transit, peering, and other services','用于互联网转接、对等互联和其他服务的通信链路'],
['Clusters of physical hosts in which VMs reside','虚拟机所在的物理主机集群'],
['Virtual compute instances running inside clusters','集群内运行的虚拟计算实例'],
['Job history','作业历史'],
['Collections of data and/or job files','数据和/或作业文件的集合'],
['View All Changes','查看所有更改'],
['Software version','软件版本'],
['Local Config Context Data','本地配置上下文数据'],
['Local config context schema','本地配置上下文模式'],
['Enter context data in','输入配置上下文数据使用'],
['Move up','上移'],
['Move Down','下移'],
['Select all','全选'],
['Create and Add Another','创建并再加一项'],
['Find and Merge Duplicate IPs','查找和合并重复IP'],
['NAT (Inside)','NAT (内侧)'],
['Serial number','序列号'],
['Asset tag','资产标签'],
['Outer dimensions','外部尺寸'],
['A comma-separated list of tags','以逗号分隔的标签列表'],
['syntax is supported, as well as','语法可用,也可使用'],
['Permitted object types','允许的对象类型'],
['Configure tables','配置表格'],
['Table Configuration','表格配置'],
['Location type','位置类型'],
['Time zone','时区'],
['Physical address','物理地址'],
['Shipping Address','发货地址'],
['Latitude','纬度'],
['Nestable','可嵌套'],
['Longtitude','经度'],
['Contact name','联系人姓名'],
['Contact phone','联系电话'],
['Contact E-mail','联系电子邮件'],
['Type of Site','站点类型'],
['Autonomous Sytem','自主系统'],
['Add filters','添加过滤器'],
['Change log','更改日志'],
['Rack group','机架组'],
['Facility ID','设施 ID'],
['Manufacturer','制造商'],
['Device type','设备类型'],
['Rack face','机架面'],
['VRF Assignment','VRF 分配'],
['Management','管理'],
['Namespace','命名空间'],
['Status','状态'],
['Parent','父级'],
['Subtree','子树'],
['Tenant','租户'],
['Description','描述'],
['Facility','设施'],
['Edit','编辑'],
['Delete','删除'],
['Configure','配置'],
['Save','保存'],
['Reset','重置'],
['Columns','列'],
['Comments','评论'],
['Create','创建'],
['Cancel','取消'],
['Filter','筛选'],
['Import','导入'],
['Export','导出'],
['Location','位置'],
['Role','角色'],
['Height','高度'],
['Space','空间'],
['Search','搜索'],
['Device','设备'],
['Locations','位置'],
['Software','软件'],
['Routing','路由'],
['Connections','连接'],
['Address','地址'],
['Password','口令'],
['Log in','登入'],
['Username','用户名'],
['User','用户'],
['Organization','组织'],
['Clusters','集群'],
['Service','服务'],
['History','历史'],
['Security','安全'],
['Theme','主题'],
['Docs','文档'],
['Code','代码'],
['Help','帮助'],
['Policies','策略'],
['Policy','策略'],
])
replaceText(document.body)
// |
const bodyObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(addedNode => replaceText(addedNode))
})
})
bodyObserver.observe(document.body, { childList: true, subtree: true })
function replaceText(node) {
nodeForEach(node).forEach(htmlnode => {
i18n.forEach((value, index) => {
// includes可直接使用 === 以提高匹配精度
const textReg = new RegExp(index, 'g')
if (htmlnode instanceof Text && htmlnode.nodeValue.includes(index))
htmlnode.nodeValue = htmlnode.nodeValue.replace(textReg, value)
else if (htmlnode instanceof HTMLInputElement && htmlnode.value.includes(index))
htmlnode.value = htmlnode.value.replace(textReg, value)
})
})
}
function nodeForEach(node) {
const list = []
if (node.childNodes.length === 0) list.push(node)
else {
node.childNodes.forEach(child => {
if (child.childNodes.length === 0) list.push(child)
else list.push(...nodeForEach(child))
})
}
return list
}
})();