├── .env.development ├── .env.production ├── .eslintrc.json ├── .gitee ├── ISSUE_TEMPLATE.zh-CN.md └── PULL_REQUEST_TEMPLATE.zh-CN.md ├── .github └── ISSUE_TEMPLATE │ └── --bug.md ├── .gitignore ├── .yarnclean ├── .yarnrc ├── LICENSE ├── README.en.md ├── README.md ├── config-overrides.js ├── package.json ├── public ├── img │ ├── quick_redis.icns │ ├── quick_redis.ico │ ├── quick_redis.png │ └── quick_redis_250.png ├── index.html ├── locales │ ├── cs.json │ ├── de.json │ ├── en.json │ ├── es.json │ ├── fr.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── nl.json │ ├── pl.json │ ├── pt.json │ ├── ru.json │ ├── uk.json │ ├── vi.json │ ├── zh-CN.json │ └── zh-TW.json ├── main.js ├── modules │ ├── ElectronIntlUniversal.js │ ├── command.js │ ├── ipcEvent.js │ └── menu.js ├── preload.js └── renderer.js ├── snap └── snapcraft.yaml ├── src ├── __test_ │ ├── buffer.test.js │ └── lodash.test.js ├── app │ ├── App.js │ └── index.css ├── components │ ├── ErrorBoundary │ │ └── index.js │ ├── LocaleInit │ │ └── index.js │ ├── QuickMonacoEditor │ │ └── index.js │ └── SystemConfig │ │ └── index.js ├── index.js ├── pages │ ├── CommonCss │ │ └── zebra.css │ ├── HostContent │ │ └── index.js │ ├── HostCornerMarker │ │ └── index.js │ ├── HostKey │ │ └── index.js │ ├── HostKeyHash │ │ └── index.js │ ├── HostKeyHeader │ │ └── index.js │ ├── HostKeyList │ │ └── index.js │ ├── HostKeyNotExist │ │ └── index.js │ ├── HostKeySet │ │ └── index.js │ ├── HostKeySortSet │ │ └── index.js │ ├── HostKeyString │ │ └── index.js │ ├── HostKeyTree │ │ └── index.js │ ├── HostTag │ │ └── index.js │ ├── HostTerminal │ │ └── index.js │ ├── HostUrl │ │ └── index.js │ └── ResourceTree │ │ ├── CreateOrUpdateFolderModal.js │ │ ├── CreateOrUpdateHostModal.js │ │ └── index.js ├── readme.md ├── redux │ ├── actions │ │ ├── HostDataAction.js │ │ ├── HostTabsAction.js │ │ └── index.js │ ├── constants │ │ ├── HostDataActionType.js │ │ ├── HostTabsActionType.js │ │ └── common.js │ ├── reducers │ │ ├── HostDataReducer.js │ │ ├── HostTabsReducer.js │ │ └── index.js │ └── store │ │ └── index.js ├── serviceWorker.js ├── services │ ├── CheckUpdateService.js │ ├── HeartbeatService.js │ ├── HostsFileService.js │ ├── KeysHistoryService.js │ ├── LogService.js │ └── RedisService.js └── utils │ ├── BufferUtils.js │ ├── CommonUtils.js │ ├── LocaleUtils.js │ ├── RedisCommand.js │ ├── VersionUtil.js │ └── constant.js └── yarn.lock /.env.development: -------------------------------------------------------------------------------- 1 | # 开发配置 2 | REACT_APP_ENV=dev 3 | REACT_APP_PRODUCT_NAME=QuickRedis -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # 生产配置 2 | REACT_APP_ENV=prod 3 | REACT_APP_PRODUCT_NAME=QuickRedis -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "react-app" 3 | } 4 | -------------------------------------------------------------------------------- /.gitee/ISSUE_TEMPLATE.zh-CN.md: -------------------------------------------------------------------------------- 1 | ### 该问题是怎么引起的? 2 | 3 | 4 | 5 | ### 重现步骤 6 | 7 | 8 | 9 | ### 报错信息 10 | mac 日志文件路径: /Users/{User Directory}/Library/ApplicationSupport/QuickRedis/logs/info.log 11 | windows日志文件路径:C:\Users\{User Directory}\AppData\Roaming\QuickRedis\logs\info.log 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md: -------------------------------------------------------------------------------- 1 | ### 相关的Issue 2 | 3 | 4 | ### 原因(目的、解决的问题等) 5 | 6 | 7 | ### 描述(做了什么,变更了什么) 8 | 9 | 10 | ### 测试用例(新增、改动、可能影响的功能) 11 | 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 提交BUG 3 | about: 提交BUG 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 操作系统 11 | Windows or Linux or Mac 12 | 13 | QuickRedis 版本 14 | 例子:2.6.2 15 | 16 | 问题描述 17 | 提供复现BUG的步骤或者BUG截图 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | dist 25 | /package-lock.json 26 | .vscode 27 | .github 28 | -------------------------------------------------------------------------------- /.yarnclean: -------------------------------------------------------------------------------- 1 | # test directories 2 | __tests__ 3 | test 4 | tests 5 | powered-test 6 | 7 | # asset directories 8 | docs 9 | doc 10 | website 11 | images 12 | assets 13 | 14 | # examples 15 | example 16 | examples 17 | 18 | # code coverage directories 19 | coverage 20 | .nyc_output 21 | 22 | # build scripts 23 | Makefile 24 | Gulpfile.js 25 | Gruntfile.js 26 | 27 | # configs 28 | appveyor.yml 29 | circle.yml 30 | codeship-services.yml 31 | codeship-steps.yml 32 | wercker.yml 33 | .tern-project 34 | .gitattributes 35 | .editorconfig 36 | .*ignore 37 | .eslintrc 38 | .jshintrc 39 | .flowconfig 40 | .documentup.json 41 | .yarn-metadata.json 42 | .travis.yml 43 | 44 | # misc 45 | *.md 46 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | registry "https://registry.npm.taobao.org" 2 | 3 | sass_binary_site "https://npm.taobao.org/mirrors/node-sass/" 4 | phantomjs_cdnurl "http://cnpmjs.org/downloads" 5 | electron_mirror "https://npm.taobao.org/mirrors/electron/" 6 | sqlite3_binary_host_mirror "https://foxgis.oss-cn-shanghai.aliyuncs.com/" 7 | profiler_binary_host_mirror "https://npm.taobao.org/mirrors/node-inspector/" 8 | chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver" 9 | yarn-offline-mirror -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 QuickRedis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.en.md: -------------------------------------------------------------------------------- 1 | # QuickRedis 2 | ## 介绍 3 | QuickRedis 是一款 **永久免费** 的 Redis 可视化管理工具。它支持**直连、哨兵、集群**模式,支持亿万数量级的 key,还有令人兴奋的 UI。QuickRedis 支持 Windows 、 Mac OS X 和 Linux 下运行。 4 | 5 | QuickRedis 是一个效率工具,**当别人在努力敲命令的时候,而你已经在喝茶。** 6 | 7 | **QQ群:1103435496** 8 | 9 | ## 下载地址 10 | ## 重要提示:mac 打开失败,提示“已损坏,无法打开。 您应该将它移到废纸篓。”。则需要先执行命令:sudo xattr -rd com.apple.quarantine /Applications/QuickRedis.app。 11 | [https://gitee.com/quick123official/quick_redis_blog/releases/](https://gitee.com/quick123official/quick_redis_blog/releases/ "https://gitee.com/quick123official/quick_redis_blog/releases/") 12 | 13 | [https://github.com/quick123official/quick_redis_blog/releases/](https://github.com/quick123official/quick_redis_blog/releases/ "https://github.com/quick123official/quick_redis_blog/releases/") 14 | 15 | **使用 百度网盘 下载** 16 | 17 | Windows & Mac OS X & Linux :链接: [https://pan.baidu.com/s/1z1kALlTLIALCH4OwOd1W5g?pwd=54bh](https://pan.baidu.com/s/1z1kALlTLIALCH4OwOd1W5g?pwd=54bh) 18 | 19 | ## 软件截图 20 | 21 | -树形展示keys 22 | ![树形展示keys](https://quick123.net/images/introduction/show_keys_by_tree.jpg "树形展示keys") 23 | 24 | -首页 25 | ![首页](https://quick123.net/images/introduction/key-zset-value.png "首页") 26 | 27 | -连接管理菜单(支持多目录管理、支持复制连接、拖动连接到目录) 28 | ![连接管理菜单](https://quick123.net/images/introduction/host-menu.png "连接管理菜单") 29 | 30 | -多语言(简体中文、繁体中文、英文、日语、法语) 31 | ![多语言](https://quick123.net/images/introduction/muti-language.png "多语言") 32 | 33 | -快速关闭多个 TAB 34 | ![快速关闭多个 TAB](https://quick123.net/images/introduction/fast-close.png "快速关闭多个 TAB") 35 | 36 | -直连模式配置 37 | ![直连模式配置](https://quick123.net/images/introduction/direct-config.png "直连模式配置") 38 | 39 | -哨兵模式配置 40 | ![哨兵模式配置](https://quick123.net/images/introduction/sentinel-config.png "哨兵模式配置") 41 | 42 | -集群模式配置 43 | ![集群模式配置](https://quick123.net/images/introduction/cluster-config.png "集群模式配置") 44 | 45 | -命令行 46 | ![命令行](https://quick123.net/images/introduction/command-line.png "命令行") 47 | 48 | -string 类型管理(支持值的json格式化、修改key、修改ttl、删除key) 49 | ![string 类型管理](https://quick123.net/images/introduction/key-string-value-json.png "string 类型管理") 50 | 51 | -list 类型管理(支持 list 分页查询、新增、删除) 52 | ![list类型管理](https://quick123.net/images/introduction/key-list-value.png "list 类型管理") 53 | 54 | -set 类型管理(支持 set 分页查询、新增、删除) 55 | ![set 类型管理](https://quick123.net/images/introduction/key-set-value.png "set 类型管理") 56 | 57 | -hash 类型管理(支持 hash 分页查询、新增、删除、修改) 58 | ![hash 类型管理](https://quick123.net/images/introduction/key-hash-value.png "hash 类型管理") 59 | 60 | ## FAQ 61 | 如果你有任何使用方面的问题,请通过下面方式留言: 62 | 63 | ### **gitee 地址** 64 | 65 | [https://gitee.com/quick123official/quick_redis_blog/issues](https://gitee.com/quick123official/quick_redis_blog/issues) 66 | 67 | ### **github地址:** 68 | [https://github.com/quick123official/quick_redis_blog/issues](https://github.com/quick123official/quick_redis_blog/issues) 69 | 70 | ## 使用到的开源代码 71 | 72 | [ANTD](https://ant.design/index-cn) [ioredis](https://github.com/luin/ioredis) [react](https://reactjs.org/) [react-intl-universal](https://github.com/alibaba/react-intl-universal) [redux](https://redux.js.org/) [less](http://lesscss.org/features/) 73 | 74 | ## 快速开始 75 | ### 开发阶段:1. yarn run start1;2. yarn run start2 76 | ### 打包:1. yarn run build:mac;2. yarn run pack:mac 77 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuickRedis 2 | ## 介绍 3 | QuickRedis 是一款 **永久免费** 的 Redis 可视化管理工具。它支持**直连、哨兵、集群**模式,支持亿万数量级的 key,还有令人兴奋的 UI。QuickRedis 支持 Windows 、 Mac OS X 和 Linux 下运行。 4 | 5 | QuickRedis 是一个效率工具,**当别人在努力敲命令的时候,而你已经在喝茶。** 6 | 7 | **QQ群:1103435496** 8 | 9 | ## 下载地址 10 | ## 重要提示:mac 打开失败,提示“已损坏,无法打开。 您应该将它移到废纸篓。”。则需要先执行命令:sudo xattr -rd com.apple.quarantine /Applications/QuickRedis.app。 11 | [https://gitee.com/quick123official/quick_redis_blog/releases/](https://gitee.com/quick123official/quick_redis_blog/releases/ "https://gitee.com/quick123official/quick_redis_blog/releases/") 12 | 13 | [https://github.com/quick123official/quick_redis_blog/releases/](https://github.com/quick123official/quick_redis_blog/releases/ "https://github.com/quick123official/quick_redis_blog/releases/") 14 | 15 | **使用 百度网盘 下载** 16 | 17 | Windows & Mac OS X & Linux :链接: [https://pan.baidu.com/s/1z1kALlTLIALCH4OwOd1W5g?pwd=54bh](https://pan.baidu.com/s/1z1kALlTLIALCH4OwOd1W5g?pwd=54bh) 18 | 19 | ## 软件截图 20 | 21 | -树形展示keys 22 | ![树形展示keys](https://quick123.net/images/introduction/show_keys_by_tree.jpg "树形展示keys") 23 | 24 | -首页 25 | ![首页](https://quick123.net/images/introduction/key-zset-value.png "首页") 26 | 27 | -连接管理菜单(支持多目录管理、支持复制连接、拖动连接到目录) 28 | ![连接管理菜单](https://quick123.net/images/introduction/host-menu.png "连接管理菜单") 29 | 30 | -多语言(简体中文、繁体中文、英文、日语、法语) 31 | ![多语言](https://quick123.net/images/introduction/muti-language.png "多语言") 32 | 33 | -快速关闭多个 TAB 34 | ![快速关闭多个 TAB](https://quick123.net/images/introduction/fast-close.png "快速关闭多个 TAB") 35 | 36 | -直连模式配置 37 | ![直连模式配置](https://quick123.net/images/introduction/direct-config.png "直连模式配置") 38 | 39 | -哨兵模式配置 40 | ![哨兵模式配置](https://quick123.net/images/introduction/sentinel-config.png "哨兵模式配置") 41 | 42 | -集群模式配置 43 | ![集群模式配置](https://quick123.net/images/introduction/cluster-config.png "集群模式配置") 44 | 45 | -命令行 46 | ![命令行](https://quick123.net/images/introduction/command-line.png "命令行") 47 | 48 | -string 类型管理(支持值的json格式化、修改key、修改ttl、删除key) 49 | ![string 类型管理](https://quick123.net/images/introduction/key-string-value-json.png "string 类型管理") 50 | 51 | -list 类型管理(支持 list 分页查询、新增、删除) 52 | ![list类型管理](https://quick123.net/images/introduction/key-list-value.png "list 类型管理") 53 | 54 | -set 类型管理(支持 set 分页查询、新增、删除) 55 | ![set 类型管理](https://quick123.net/images/introduction/key-set-value.png "set 类型管理") 56 | 57 | -hash 类型管理(支持 hash 分页查询、新增、删除、修改) 58 | ![hash 类型管理](https://quick123.net/images/introduction/key-hash-value.png "hash 类型管理") 59 | 60 | ## FAQ 61 | 如果你有任何使用方面的问题,请通过下面方式留言: 62 | 63 | ### **gitee 地址** 64 | 65 | [https://gitee.com/quick123official/quick_redis_blog/issues](https://gitee.com/quick123official/quick_redis_blog/issues) 66 | 67 | ### **github地址:** 68 | [https://github.com/quick123official/quick_redis_blog/issues](https://github.com/quick123official/quick_redis_blog/issues) 69 | 70 | ## 使用到的开源代码 71 | 72 | [ANTD](https://ant.design/index-cn) [ioredis](https://github.com/luin/ioredis) [react](https://reactjs.org/) [react-intl-universal](https://github.com/alibaba/react-intl-universal) [redux](https://redux.js.org/) [less](http://lesscss.org/features/) 73 | 74 | ## 快速开始 75 | ### 开发阶段:1. yarn run start1;2. yarn run start2 76 | ### 打包:1. yarn run build:mac;2. yarn run pack:mac 77 | -------------------------------------------------------------------------------- /config-overrides.js: -------------------------------------------------------------------------------- 1 | const { override, fixBabelImports, addLessLoader } = require("customize-cra"); 2 | 3 | module.exports = override( 4 | fixBabelImports("import", { 5 | libraryName: "antd", 6 | libraryDirectory: "es", 7 | style: true, 8 | }), 9 | addLessLoader({ 10 | javascriptEnabled: true, 11 | }) 12 | ); 13 | module.exports = function override(config, env) { 14 | if (env === "production") { 15 | config.output.publicPath = "./"; 16 | } 17 | return config; 18 | }; 19 | /** 20 | * 使用@表示src目录的路径 21 | */ 22 | const path = require("path"); 23 | function resolve(dir) { 24 | return path.join(__dirname, ".", dir); 25 | } 26 | /** 27 | * add monaco-editor-webpack-plugin 28 | */ 29 | const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); 30 | module.exports = function override(config, env) { 31 | config.resolve.alias = { 32 | "@": resolve("src"), 33 | }; 34 | config.plugins.push( 35 | new MonacoWebpackPlugin({ 36 | languages: ["json"], 37 | }) 38 | ); 39 | return config; 40 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "QuickRedis", 3 | "version": "2.7.2", 4 | "license": "MIT", 5 | "private": true, 6 | "description": "QuickRedis", 7 | "author": "https://quick123.net/", 8 | "main": "./build/main.js", 9 | "homepage": ".", 10 | "asar": true, 11 | "dependencies": { 12 | "circular-json": "^0.5.9", 13 | "electron-log": "^4.2.2", 14 | "getmac": "^1.2.1", 15 | "ioredis": "^4.28.5", 16 | "lodash": "^4.17.19", 17 | "react-intl-universal": "^2.2.5", 18 | "react-monaco-editor": "^0.36.0", 19 | "redis-splitargs": "^1.0.1", 20 | "socksv5-fixed": "0.0.6", 21 | "ssh2": "^1.5.0" 22 | }, 23 | "scripts": { 24 | "start1": "react-app-rewired start", 25 | "start2": "run-electron ./public/main.js", 26 | "build:mac": "GENERATE_SOURCEMAP=false react-app-rewired build", 27 | "build:linux": "GENERATE_SOURCEMAP=false react-app-rewired build", 28 | "build:win": "set GENERATE_SOURCEMAP=false && react-app-rewired build", 29 | "test": "react-app-rewired test", 30 | "pack:mac": "electron-builder -m", 31 | "pack:win": "electron-builder -w", 32 | "pack:linux": "electron-builder -l -p never", 33 | "pack:all": "electron-builder -mwl" 34 | }, 35 | "jest": { 36 | "moduleNameMapper": { 37 | "@/(.*)": "/src/$1" 38 | } 39 | }, 40 | "build": { 41 | "extends": null, 42 | "files": [ 43 | "./package.json", 44 | "./build/**/*" 45 | ], 46 | "appId": "com.quick.redis", 47 | "productName": "QuickRedis", 48 | "copyright": "Copyright©2020 https://quick123.net/", 49 | "compression": "maximum", 50 | "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", 51 | "win": { 52 | "target": [ 53 | { 54 | "target": "nsis", 55 | "arch": [ 56 | "ia32" 57 | ] 58 | } 59 | ], 60 | "icon": "./build/img/quick_redis.ico" 61 | }, 62 | "mac": { 63 | "icon": "./build/img/quick_redis.icns" 64 | }, 65 | "linux": {}, 66 | "nsis": { 67 | "oneClick": false, 68 | "allowElevation": true, 69 | "allowToChangeInstallationDirectory": true, 70 | "installerIcon": "./build/img/quick_redis.ico", 71 | "uninstallerIcon": "./build/img/quick_redis.ico", 72 | "installerHeaderIcon": "./build/img/quick_redis.ico", 73 | "createDesktopShortcut": true, 74 | "createStartMenuShortcut": true, 75 | "shortcutName": "QuickRedis" 76 | } 77 | }, 78 | "eslintConfig": { 79 | "extends": "react-app" 80 | }, 81 | "devDependencies": { 82 | "@testing-library/jest-dom": "^4.2.4", 83 | "@testing-library/react": "^9.3.2", 84 | "@testing-library/user-event": "^7.1.2", 85 | "antd": "^4.2.4", 86 | "babel-plugin-import": "^1.13.0", 87 | "customize-cra": "^1.0.0", 88 | "devtron": "^1.4.0", 89 | "electron": "13.6.6", 90 | "electron-builder": "^23.0.2", 91 | "electron-devtools-installer": "^3.1.1", 92 | "global": "^4.4.0", 93 | "less": "^3.10.3", 94 | "less-loader": "^5.0.0", 95 | "monaco-editor-webpack-plugin": "^5.0.0", 96 | "node-uuid": "^1.4.8", 97 | "react": "^16.13.1", 98 | "react-app-rewired": "^2.1.8", 99 | "react-dom": "^16.13.1", 100 | "react-redux": "^7.2.0", 101 | "react-scripts": "^3.4.1", 102 | "react-split-pane": "^0.1.91", 103 | "react-try-catch-render": "^1.0.0", 104 | "redux": "^4.0.5", 105 | "redux-thunk": "^2.3.0", 106 | "run-electron": "^1.0.0", 107 | "terminal-in-react-quick123": "^4.3.5" 108 | }, 109 | "browserslist": { 110 | "production": [ 111 | ">0.2%", 112 | "not dead", 113 | "not op_mini all" 114 | ], 115 | "development": [ 116 | "last 1 chrome version", 117 | "last 1 firefox version", 118 | "last 1 safari version" 119 | ] 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /public/img/quick_redis.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quick123official/quick_redis_blog/c82cdd11026c2339cbf1ede3eeef783dbfa4b831/public/img/quick_redis.icns -------------------------------------------------------------------------------- /public/img/quick_redis.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quick123official/quick_redis_blog/c82cdd11026c2339cbf1ede3eeef783dbfa4b831/public/img/quick_redis.ico -------------------------------------------------------------------------------- /public/img/quick_redis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quick123official/quick_redis_blog/c82cdd11026c2339cbf1ede3eeef783dbfa4b831/public/img/quick_redis.png -------------------------------------------------------------------------------- /public/img/quick_redis_250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quick123official/quick_redis_blog/c82cdd11026c2339cbf1ede3eeef783dbfa4b831/public/img/quick_redis_250.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | QuickRedis 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/locales/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Oznámení", 4 | "common.error": "Chyba", 5 | "common.error.input.value": "Zadejte prosím hodnotu", 6 | "common.ok": "OK", 7 | "common.cancel": "Zrušit", 8 | "common.save.success": "Úspěšně uloženo", 9 | "common.save": "Uložit", 10 | "common.columns.title.op": "Provozní", 11 | "common.columns.title.modify": "Upravit", 12 | "common.columns.title.view": "Zobrazit", 13 | "common.columns.title.delete": "Odstranit", 14 | "common.columns.title.delete.notice": "Opravdu chcete smazat?", 15 | "common.add.record": "Přidat záznam", 16 | "common.modal.title.add": "Přidat záznam", 17 | "common.modal.title.view": "Zobrazit záznam", 18 | "common.modal.title.modify": "Upravit záznam", 19 | "common.search.tooltip.limit": "Dotazovat až 10000 záznamů", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Vytvořit připojení", 24 | "Tree.Menu.UPDATE_CONN": "Upravit připojení", 25 | "Tree.Menu.DEL_CONN": "Smazat připojení", 26 | "Tree.Menu.CREATE_FOLDER": "Vytvořit adresář", 27 | "Tree.Menu.UPDATE_FOLDER": "Upravit adresář", 28 | "Tree.Menu.DEL_FOLDER": "Smazat adresář", 29 | "Tree.Menu.DEL_ALL": "Smazat", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Otevřít příkazový řádek", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Otevřít nové okno", 32 | "Tree.Menu.DISCONNECT_CONN": "Odpojit", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Vytvořit kořenový adresář", 34 | "Tree.Menu.COPY_CONN": "Kopírovat odkaz", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Format json", 39 | "QuickMonacoEditor.delformat": "Odstranit mezery JSON", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Decompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Vyberte jazyk", 46 | "SystemConfig.tree.split": "Nastavit oddělovač", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Konfigurace systému", 49 | "SystemConfig.needRestart": "Abyste se projevili, musíte restartovat.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "vymazat", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Klíč již existuje", 58 | "HostKey.key.not.exist": "Klíč neexistuje nebo byl odstraněn", 59 | "HostKey.create.key": "Vytvořit klíč", 60 | "HostKey.modal.title": "Vytvořit klíč", 61 | "HostKey.modal.keyType": "Vyberte typ hodnoty", 62 | 63 | "HostKey.header.save.notice": "Nejprve prosím uložte", 64 | "HostKey.header.save.delete.success": "Úspěšně smazáno", 65 | "HostKey.header.key.modify.success": "Úspěšně upravit klíč", 66 | "HostKey.header.key.modify.fail": "Klíč se nepodařilo upravit", 67 | "HostKey.header.key.modify.fail.exist": "Klíč se nepodařilo upravit, klíč již existuje", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Neplatná hodnota. Jednotka je sekund.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Zadejte prosím větší hodnotu, jinak bude brzy smazána. Jednotka má několik sekund.", 70 | "HostKey.header.key.ttl.midify.success": "Úspěšně upravit ttl", 71 | "HostKey.header.key.ttl.midify.fail": "Nepodařilo se upravit ttl", 72 | "HostKey.header.key.delete.notice": "Opravdu chcete klíč smazat?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "Zadejte prosím klíč", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Vložit pozici", 80 | "HostKey.HostKeyList.modal.insert.left": "Vložit vlevo", 81 | "HostKey.HostKeyList.modal.insert.right": "Vložit právo", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Zavřít vpravo", 88 | "HostTag.Menu.remove.left": "Zavřít vlevo", 89 | "HostTag.Menu.remove.other": "Zavřít ostatní", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Nejprve prosím nakonfigurujte režim připojení", 94 | "RedisService.error.occurred": "Došlo k chybě.", 95 | "RedisService.info.connection.established.success": "Připojení úspěšně navázáno", 96 | "RedisService.info.connection.close.success": "Připojení ukončeno", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Tipy pro upgrade", 101 | "CheckUpdateService.notification.description": "Aktuální verze je {currentVersion} a nejnovější verze je {latestVersion}. Stáhněte si nejnovější verzi z GitHub nebo Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Chcete-li zobrazit informace o nápovědě, zadejte nápovědu. Dokument příkazu Redis: http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Export připojení je úspěšné", 110 | "ResourceTree.export.fail": "Export připojení se nezdařil", 111 | "ResourceTree.import.success": "Import připojení je úspěšné", 112 | "ResourceTree.import.fail": "Import připojení se nezdařil", 113 | "ResourceTree.reset.success": "Úspěšně obnovit připojení", 114 | "ResourceTree.reset.fail": "Nepodařilo se obnovit připojení", 115 | 116 | "ResourceTree.delete.notice": "Opravdu chcete smazat níže uvedené položky?", 117 | 118 | "ResourceTree.folder.create": "Vytvořit adresář", 119 | "ResourceTree.folder.modify": "Upravit adresář", 120 | "ResourceTree.folder.name": "Název", 121 | "ResourceTree.folder.name.rules": "Zadejte prosím název adresáře", 122 | 123 | "ResourceTree.host.create": "Vytvořit připojení", 124 | "ResourceTree.host.modify": "Upravit připojení", 125 | "ResourceTree.host.name": "Název", 126 | "ResourceTree.host.name.rules": "Zadejte prosím název připojení", 127 | "ResourceTree.host.ip": "Ip / doména", 128 | "ResourceTree.host.ip.rules": "Zadejte IP / doménu", 129 | "ResourceTree.host.port": "Port", 130 | "ResourceTree.host.port.rules": "Zadejte prosím port", 131 | "ResourceTree.host.password": "heslo", 132 | "ResourceTree.host.connectionMode": "Mode", 133 | "ResourceTree.host.connectionMode.direct": "Direct", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Klastr", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Test", 138 | "ResourceTree.host.test.button": "Testovat připojení", 139 | "ResourceTree.host.description": "Popis", 140 | "ResourceTree.host.description.detail": "1. Režim sentinel musí vyplnit pouze název IP / domény jednoho uzlu sentinel; 2. Režim clusteru musí vyplnit pouze název ip / domény jednoho uzlu clusteru . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "Soubor", 145 | "electron.menu.file.import.connection": "Importovat připojení", 146 | "electron.menu.file.export.connection": "Exportovat připojení", 147 | "electron.menu.file.reset.connection": "Obnovit připojení", 148 | "electron.menu.file.system.Configuration": "Konfigurace systému", 149 | "electron.menu.file.exit": "Konec", 150 | "electron.menu.edit": "Upravit", 151 | "electron.menu.edit.undo": "Zpět", 152 | "electron.menu.edit.redo": "Znovu", 153 | "electron.menu.edit.cut": "Vyjmout", 154 | "electron.menu.edit.copy": "Kopírovat", 155 | "electron.menu.edit.paste": "Vložit", 156 | "electron.menu.edit.select.all": "Vybrat vše", 157 | "electron.menu.view": "Zobrazit", 158 | "electron.menu.view.reload": "Znovu načíst", 159 | "electron.menu.view.toggle.full.screen": "Přepnout na celou obrazovku", 160 | "electron.menu.view.switch.dev.tools": "Přepnout vývojářské nástroje", 161 | "electron.menu.window": "Okno", 162 | "electron.menu.window.minimize": "Minimalizovat", 163 | "electron.menu.window.close": "zavřít", 164 | "electron.menu.help": "Nápověda", 165 | "electron.menu.help.minimize": "Minimalizovat", 166 | "electron.menu.help.submit.issues.github": "odeslat problémy (github)", 167 | "electron.menu.help.submit.issues.gitee": "odeslat problémy (gitee)", 168 | "electron.menu.help.officail.website": "Web Officail", 169 | "electron.menu.help.about": "O aplikaci QuickRedis", 170 | "electron.menu.end": "#### elektron.menu.end ####", 171 | 172 | "proxy.use": "Použití proxy", 173 | "proxy.host": "Hostitel agenta", 174 | "proxy.sshport": "SSH port", 175 | "proxy.username": "Uživatelské jméno SSH", 176 | "proxy.password": "Heslo proxy", 177 | "proxy.sshkeypath": "Proxy soukromá přístupová cesta", 178 | "proxy.connecterror": "Připojení proxy selhalo ", 179 | "proxy.privateKey.not.exist": "Chyba tajného souboru", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "Nový adresář pro zobrazení funkcí a manipulaci s nimi", 183 | "notification.support.host.key.tree.description": "Jak povolit tuto funkci: Hlavní nabídka -> Soubor -> Nastavení systému -> Nastavit oddělovač", 184 | "notification.end00": "#### upozornění ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Notice", 4 | "common.error": "Error", 5 | "common.error.input.value": "Please input value", 6 | "common.ok": "OK", 7 | "common.cancel": "Cancel", 8 | "common.save.success": "Saved successfully", 9 | "common.save": "Save", 10 | "common.columns.title.op": "Operating", 11 | "common.columns.title.modify": "Modify", 12 | "common.columns.title.view": "View", 13 | "common.columns.title.delete": "Delete", 14 | "common.columns.title.delete.notice": "Are you sure to delete?", 15 | "common.add.record": "Add Record", 16 | "common.modal.title.add": "Add Record", 17 | "common.modal.title.view": "View Record", 18 | "common.modal.title.modify": "Modify Record", 19 | "common.search.tooltip.limit": "Query up to 10000 records", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Create connection", 24 | "Tree.Menu.UPDATE_CONN": "Modify connection", 25 | "Tree.Menu.DEL_CONN": "Delete connection", 26 | "Tree.Menu.CREATE_FOLDER": "Create directory", 27 | "Tree.Menu.UPDATE_FOLDER": "Modify directory", 28 | "Tree.Menu.DEL_FOLDER": "Delete directory", 29 | "Tree.Menu.DEL_ALL": "Delete", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Open the command line", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Open a new window", 32 | "Tree.Menu.DISCONNECT_CONN": "Disconnect", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Create root directory", 34 | "Tree.Menu.COPY_CONN": "Copy link", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Format json", 39 | "QuickMonacoEditor.delformat": "Delete json spaces", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Dekompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Select language", 46 | "SystemConfig.tree.split": "Set separator", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "System configuration", 49 | "SystemConfig.needRestart": "You need to restart to take effect.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "Delete", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Key already exists", 58 | "HostKey.key.not.exist": "Key does not exist or has been deleted", 59 | "HostKey.create.key": "Create key", 60 | "HostKey.modal.title": "Create key", 61 | "HostKey.modal.keyType": "Choose value type", 62 | 63 | "HostKey.header.save.notice": "Please save first", 64 | "HostKey.header.save.delete.success": "Successfully deleted", 65 | "HostKey.header.key.modify.success": "Modify key successfully", 66 | "HostKey.header.key.modify.fail": "Failed to modify key", 67 | "HostKey.header.key.modify.fail.exist": "Failed to modify the key, the key already exists", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Illegal value. The unit is seconds.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Please input a larger value, otherwise it will be deleted soon. The unit is seconds.", 70 | "HostKey.header.key.ttl.midify.success": "Modify ttl successfully", 71 | "HostKey.header.key.ttl.midify.fail": "Failed to modify ttl", 72 | "HostKey.header.key.delete.notice": "Are you sure to delete the key?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "Please input key", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Insert position", 80 | "HostKey.HostKeyList.modal.insert.left": "Insert left", 81 | "HostKey.HostKeyList.modal.insert.right": "Insert right", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Close right", 88 | "HostTag.Menu.remove.left": "Close left", 89 | "HostTag.Menu.remove.other": "Close other", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Please configure the connection mode first", 94 | "RedisService.error.occurred": "An error occurred. ", 95 | "RedisService.info.connection.established.success": "Connection established successfully", 96 | "RedisService.info.connection.close.success": "Connection closed", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Upgrade tips", 101 | "CheckUpdateService.notification.description": "The current version is {currentVersion}, and the latest version is {latestVersion}. Please download the latest version from GitHub or Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Click the tab key to display the command usage method. Redis command reference document: https://redis.io/commands?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Export connection is successful", 110 | "ResourceTree.export.fail": "Export connection failed", 111 | "ResourceTree.import.success": "Import connection is successful", 112 | "ResourceTree.import.fail": "Import connection failed", 113 | "ResourceTree.reset.success": "Successfully reset the connection", 114 | "ResourceTree.reset.fail": "Failed to reset connection", 115 | 116 | "ResourceTree.delete.notice": "Are you sure to delete the entries below?", 117 | 118 | "ResourceTree.folder.create": "Create directory", 119 | "ResourceTree.folder.modify": "Modify directory", 120 | "ResourceTree.folder.name": "Name", 121 | "ResourceTree.folder.name.rules": "Please input the directory name", 122 | 123 | "ResourceTree.host.create": "Create connection", 124 | "ResourceTree.host.modify": "Modify connection", 125 | "ResourceTree.host.name": "Name", 126 | "ResourceTree.host.name.rules": "Please input the connection name", 127 | "ResourceTree.host.ip": "Ip/Domain", 128 | "ResourceTree.host.ip.rules": "Please input the Ip/Domain", 129 | "ResourceTree.host.port": "Port", 130 | "ResourceTree.host.port.rules": "Please input the port", 131 | "ResourceTree.host.password": "password", 132 | "ResourceTree.host.connectionMode": "Mode", 133 | "ResourceTree.host.connectionMode.direct": "Direct", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Cluster", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Test", 138 | "ResourceTree.host.test.button": "Test connection", 139 | "ResourceTree.host.description": "Description", 140 | "ResourceTree.host.description.detail": "1. The sentinel mode only needs to fill in the ip/domain name of one sentinel node; 2. The cluster mode only needs to fill in the ip/domain name of one cluster node.", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "File", 145 | "electron.menu.file.import.connection": "Import connection", 146 | "electron.menu.file.export.connection": "Export connection", 147 | "electron.menu.file.reset.connection": "Reset connection", 148 | "electron.menu.file.system.Configuration": "System Configuration", 149 | "electron.menu.file.exit": "Exit", 150 | "electron.menu.edit": "Edit", 151 | "electron.menu.edit.undo": "Undo", 152 | "electron.menu.edit.redo": "Redo", 153 | "electron.menu.edit.cut": "Cut", 154 | "electron.menu.edit.copy": "Copy", 155 | "electron.menu.edit.paste": "Paste", 156 | "electron.menu.edit.select.all": "Select All", 157 | "electron.menu.view": "View", 158 | "electron.menu.view.reload": "Reload", 159 | "electron.menu.view.toggle.full.screen": "Toggle full screen", 160 | "electron.menu.view.switch.dev.tools": "Switch developer tools", 161 | "electron.menu.window": "Window", 162 | "electron.menu.window.minimize": "Minimize", 163 | "electron.menu.window.close": "close", 164 | "electron.menu.help": "Help", 165 | "electron.menu.help.minimize": "Minimize", 166 | "electron.menu.help.submit.issues.github": "submit issues (github)", 167 | "electron.menu.help.submit.issues.gitee": "submit issues (gitee)", 168 | "electron.menu.help.officail.website": "Officail Website", 169 | "electron.menu.help.about": "About QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "Using a proxy", 173 | "proxy.host": "Agent host", 174 | "proxy.sshport": "SSH port", 175 | "proxy.username": "SSH user name", 176 | "proxy.password": "Proxy password", 177 | "proxy.sshkeypath": "Proxy private key path", 178 | "proxy.connecterror": "Proxy connection failed", 179 | "proxy.privateKey.not.exist": "Secret key file error", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "New feature-use directory to display and manipulate keys", 183 | "notification.support.host.key.tree.description": "How to enable this feature: Main Menu -> File -> System Settings -> Set Delimiter", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Memperhatikan", 4 | "common.error": "Kesalahan", 5 | "common.error.input.value": "Harap masukkan nilai", 6 | "common.ok": "OK", 7 | "common.cancel": "Cancel", 8 | "common.save.success": "Berhasil disimpan", 9 | "common.save": "Save", 10 | "common.columns.title.op": "Operasi", 11 | "common.columns.title.modify": "Ubah", 12 | "common.columns.title.view": "Melihat", 13 | "common.columns.title.delete": "Hapus", 14 | "common.columns.title.delete.notice": "Anda yakin ingin menghapus?", 15 | "common.add.record": "Tambahkan Rekam", 16 | "common.modal.title.add": "Tambahkan Rekaman", 17 | "common.modal.title.view": "Lihat Record", 18 | "common.modal.title.modify": "Ubah Record", 19 | "common.search.tooltip.limit": "Buat kueri hingga 10000 catatan", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Buat koneksi", 24 | "Tree.Menu.UPDATE_CONN": "Ubah koneksi", 25 | "Tree.Menu.DEL_CONN": "Hapus koneksi", 26 | "Tree.Menu.CREATE_FOLDER": "Buat direktori", 27 | "Tree.Menu.UPDATE_FOLDER": "Ubah direktori", 28 | "Tree.Menu.DEL_FOLDER": "Hapus direktori", 29 | "Tree.Menu.DEL_ALL": "Hapus", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Buka baris perintah", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Buka jendela baru", 32 | "Tree.Menu.DISCONNECT_CONN": "Putuskan", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Buat direktori root", 34 | "Tree.Menu.COPY_CONN": "Salin link", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Format json", 39 | "QuickMonacoEditor.delformat": "Hapus spasi json", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Dekompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Pilih bahasa", 46 | "SystemConfig.tree.split": "Atur pemisah", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Konfigurasi sistem", 49 | "SystemConfig.needRestart": "Anda perlu memulai ulang untuk menerapkannya.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "menghapus", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Kunci sudah ada", 58 | "HostKey.key.not.exist": "Kunci tidak ada atau telah dihapus", 59 | "HostKey.create.key": "Buat kunci", 60 | "HostKey.modal.title": "Buat kunci", 61 | "HostKey.modal.keyType": "Pilih jenis nilai", 62 | 63 | "HostKey.header.save.notice": "Harap simpan dulu", 64 | "HostKey.header.save.delete.success": "Berhasil dihapus", 65 | "HostKey.header.key.modify.success": "Ubah kunci berhasil", 66 | "HostKey.header.key.modify.fail": "Gagal mengubah kunci", 67 | "HostKey.header.key.modify.fail.exist": "Gagal mengubah kunci, kunci sudah ada", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Nilai ilegal. Unitnya adalah detik.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Harap masukkan nilai yang lebih besar, jika tidak maka akan segera dihapus. Unitnya adalah detik.", 70 | "HostKey.header.key.ttl.midify.success": "Modifikasi ttl berhasil", 71 | "HostKey.header.key.ttl.midify.fail": "Gagal mengubah ttl", 72 | "HostKey.header.key.delete.notice": "Apakah Anda yakin akan menghapus kunci?", 73 | 74 | "HostKey.String.start": "#### String HostKey ####", 75 | "HostKey.String.save.input.key": "Harap masukkan kunci", 76 | "HostKey.String.end00": "#### String HostKey ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Sisipkan posisi", 80 | "HostKey.HostKeyList.modal.insert.left": "Sisipkan kiri", 81 | "HostKey.HostKeyList.modal.insert.right": "Sisipkan kanan", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Tutup kanan", 88 | "HostTag.Menu.remove.left": "Tutup kiri", 89 | "HostTag.Menu.remove.other": "Tutup lainnya", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Harap konfigurasikan mode koneksi terlebih dahulu", 94 | "RedisService.error.occurred": "Terjadi kesalahan.", 95 | "RedisService.info.connection.established.success": "Sambungan berhasil dibuat", 96 | "RedisService.info.connection.close.success": "Sambungan ditutup", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Tips peningkatan", 101 | "CheckUpdateService.notification.description": "Versi saat ini adalah {currentVersion}, dan versi terbaru adalah {latestVersion}. Unduh versi terbaru dari GitHub atau Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Ketik bantuan untuk melihat info bantuan. Dokumen perintah Redis: http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Ekspor koneksi berhasil", 110 | "ResourceTree.export.fail": "Koneksi ekspor gagal", 111 | "ResourceTree.import.success": "Impor koneksi berhasil", 112 | "ResourceTree.import.fail": "Impor koneksi gagal", 113 | "ResourceTree.reset.success": "Berhasil menyetel ulang koneksi", 114 | "ResourceTree.reset.fail": "Gagal menyetel ulang koneksi", 115 | 116 | "ResourceTree.delete.notice": "Apakah Anda yakin akan menghapus entri di bawah?", 117 | 118 | "ResourceTree.folder.create": "Buat direktori", 119 | "ResourceTree.folder.modify": "Ubah direktori", 120 | "ResourceTree.folder.name": "Name", 121 | "ResourceTree.folder.name.rules": "Silakan masukkan nama direktori", 122 | 123 | "ResourceTree.host.create": "Buat koneksi", 124 | "ResourceTree.host.modify": "Ubah koneksi", 125 | "ResourceTree.host.name": "Name", 126 | "ResourceTree.host.name.rules": "Harap masukkan nama koneksi", 127 | "ResourceTree.host.ip": "Ip / Domain", 128 | "ResourceTree.host.ip.rules": "Harap masukkan Ip / Domain", 129 | "ResourceTree.host.port": "Port", 130 | "ResourceTree.host.port.rules": "Harap masukkan port", 131 | "ResourceTree.host.password": "password", 132 | "ResourceTree.host.connectionMode": "Mode", 133 | "ResourceTree.host.connectionMode.direct": "Langsung", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Cluster", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Test", 138 | "ResourceTree.host.test.button": "Uji koneksi", 139 | "ResourceTree.host.description": "Description", 140 | "ResourceTree.host.description.detail": "1. Mode sentinel hanya perlu mengisi nama ip / domain dari satu node sentinel; 2. Mode cluster hanya perlu mengisi nama ip / domain dari satu node cluster . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "File", 145 | "electron.menu.file.import.connection": "Impor koneksi", 146 | "electron.menu.file.export.connection": "Ekspor koneksi", 147 | "electron.menu.file.reset.connection": "Reset koneksi", 148 | "electron.menu.file.system.Configuration": "Konfigurasi Sistem", 149 | "electron.menu.file.exit": "Keluar", 150 | "electron.menu.edit": "Edit", 151 | "electron.menu.edit.undo": "Urungkan", 152 | "electron.menu.edit.redo": "Ulangi", 153 | "electron.menu.edit.cut": "Potong", 154 | "electron.menu.edit.copy": "Salin", 155 | "electron.menu.edit.paste": "Tempel", 156 | "electron.menu.edit.select.all": "Pilih Semua", 157 | "electron.menu.view": "Tampilan", 158 | "electron.menu.view.reload": "Reload", 159 | "electron.menu.view.toggle.full.screen": "Toggle full screen", 160 | "electron.menu.view.switch.dev.tools": "Ganti alat pengembang", 161 | "electron.menu.window": "Jendela", 162 | "electron.menu.window.minimize": "Minimize", 163 | "electron.menu.window.close": "tutup", 164 | "electron.menu.help": "Bantuan", 165 | "electron.menu.help.minimize": "Minimize", 166 | "electron.menu.help.submit.issues.github": "submit issues (github)", 167 | "electron.menu.help.submit.issues.gitee": "submit issues (gitee)", 168 | "electron.menu.help.officail.website": "Situs Web Resmi", 169 | "electron.menu.help.about": "Tentang QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "Gunakan proxy", 173 | "proxy.host": "Proxy Host", 174 | "proxy.sshport": "port SSH", 175 | "proxy.username": "nama pengguna SSH", 176 | "proxy.password": "Proxy Password", 177 | "proxy.sshkeypath": "Jalur kunci pribadi proxy", 178 | "proxy.connecterror": "Sambungan proxy gagal", 179 | "proxy.privateKey.not.exist": "Kesalahan file kunci rahasia", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "Direktori penggunaan fitur baru untuk menampilkan dan memanipulasi kunci", 183 | "notification.support.host.key.tree.description": "Cara mengaktifkan fitur ini: Menu Utama -> File -> Pengaturan Sistem -> Set Pembatas", 184 | "notification.end00": "#### notifikasi ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "####共通####", 3 | "common.notice": "通知", 4 | "common.error": "エラー", 5 | "common.error.input.value": "値を入力してください", 6 | "common.ok": "OK", 7 | "common.cancel": "キャンセル", 8 | "common.save.success": "正常に保存されました", 9 | "common.save": "保存", 10 | "common.columns.title.op": "操作中", 11 | "common.columns.title.modify": "変更", 12 | "common.columns.title.view": "表示", 13 | "common.columns.title.delete": "削除", 14 | "common.columns.title.delete.notice": "本当に削除しますか?", 15 | "common.add.record": "レコードを追加", 16 | "common.modal.title.add": "レコードを追加", 17 | "common.modal.title.view": "レコードを表示", 18 | "common.modal.title.modify": "レコードの変更", 19 | "common.search.tooltip.limit": "最大1000レコードのクエリ", 20 | "common.end00": "####共通####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "接続を作成", 24 | "Tree.Menu.UPDATE_CONN": "接続を変更", 25 | "Tree.Menu.DEL_CONN": "接続を削除", 26 | "Tree.Menu.CREATE_FOLDER": "ディレクトリを作成", 27 | "Tree.Menu.UPDATE_FOLDER": "ディレクトリを変更", 28 | "Tree.Menu.DEL_FOLDER": "ディレクトリを削除", 29 | "Tree.Menu.DEL_ALL": "削除", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "コマンドラインを開く", 31 | "Tree.Menu.CREATE_CONN_MUTI": "新しいウィンドウを開く", 32 | "Tree.Menu.DISCONNECT_CONN": "切断", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "ルートディレクトリを作成", 34 | "Tree.Menu.COPY_CONN": "リンクをコピー", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "フォーマットJSON", 39 | "QuickMonacoEditor.delformat": "jsonスペースの削除", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "あっしゅ GZip", 42 | "QuickMonacoEditor.ungzip": "ストレス解消 GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "言語を選択してください", 46 | "SystemConfig.tree.split": "区切り文字を設定する", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "システム構成", 49 | "SystemConfig.needRestart": "有効にするには再起動する必要があります。", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "削除", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "キーはすでに存在します", 58 | "HostKey.key.not.exist": "キーが存在しないか削除されました", 59 | "HostKey.create.key": "キーを作成", 60 | "HostKey.modal.title": "キーを作成", 61 | "HostKey.modal.keyType": "値のタイプを選択してください", 62 | 63 | "HostKey.header.save.notice": "最初に保存してください", 64 | "HostKey.header.save.delete.success": "削除に成功しました", 65 | "HostKey.header.key.modify.success": "キーを正常に変更", 66 | "HostKey.header.key.modify.fail": "キーの変更に失敗しました", 67 | "HostKey.header.key.modify.fail.exist": "キーの変更に失敗しました。キーはすでに存在しています", 68 | "HostKey.header.key.ttl.midify.illegal.value": "無効な値。単位は秒です。", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "大きな値を入力してください。入力しない場合,すぐに削除されます。単位は秒です。", 70 | "HostKey.header.key.ttl.midify.success": "ttlを正常に変更", 71 | "HostKey.header.key.ttl.midify.fail": "ttlの変更に失敗しました", 72 | "HostKey.header.key.delete.notice": "キーを削除してもよろしいですか?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "キーを入力してください", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "位置を挿入", 80 | "HostKey.HostKeyList.modal.insert.left": "左に挿入", 81 | "HostKey.HostKeyList.modal.insert.right": "権利を挿入", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "右を閉じる", 88 | "HostTag.Menu.remove.left": "左を閉じる", 89 | "HostTag.Menu.remove.other": "他を閉じる", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "最初に接続モードを設定してください", 94 | "RedisService.error.occurred": "エラーが発生しました。", 95 | "RedisService.info.connection.established.success": "接続が正常に確立されました", 96 | "RedisService.info.connection.close.success": "接続が閉じました", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "アップグレードのヒント", 101 | "CheckUpdateService.notification.description": "現在のバージョンは{currentVersion},最新バージョンは{latestVersion}です。最新バージョンをGitHubまたはGiteeからダウンロードしてください。", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "ヘルプ情報を表示するには,helpと入力してください。Redisコマンドドキュメント:http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "接続のエクスポートは成功しました", 110 | "ResourceTree.export.fail": "接続のエクスポートに失敗しました", 111 | "ResourceTree.import.success": "接続のインポートが成功しました", 112 | "ResourceTree.import.fail": "接続のインポートに失敗しました", 113 | "ResourceTree.reset.success": "接続を正常にリセットしました", 114 | "ResourceTree.reset.fail": "接続のリセットに失敗しました", 115 | 116 | "ResourceTree.delete.notice": "以下のエントリを削除してもよろしいですか?", 117 | 118 | "ResourceTree.folder.create": "ディレクトリを作成", 119 | "ResourceTree.folder.modify": "ディレクトリを変更", 120 | "ResourceTree.folder.name": "名前", 121 | "ResourceTree.folder.name.rules": "ディレクトリ名を入力してください", 122 | 123 | "ResourceTree.host.create": "接続を作成", 124 | "ResourceTree.host.modify": "接続を変更", 125 | "ResourceTree.host.name": "名前", 126 | "ResourceTree.host.name.rules": "接続名を入力してください", 127 | "ResourceTree.host.ip": "IP /ドメイン", 128 | "ResourceTree.host.ip.rules": "IP /ドメインを入力してください", 129 | "ResourceTree.host.port": "ポート", 130 | "ResourceTree.host.port.rules": "ポートを入力してください", 131 | "ResourceTree.host.password": "パスワード", 132 | "ResourceTree.host.connectionMode": "モード", 133 | "ResourceTree.host.connectionMode.direct": "直接", 134 | "ResourceTree.host.connectionMode.sentinel": "センチネル", 135 | "ResourceTree.host.connectionMode.cluster": "クラスター", 136 | "ResourceTree.host.sentinel.password": "センチネルパス", 137 | "ResourceTree.host.test": "テスト", 138 | "ResourceTree.host.test.button": "テスト接続", 139 | "ResourceTree.host.description": "説明", 140 | "ResourceTree.host.description.detail": "1.センチネルモードでは,1つのセンチネルノードのip / domain名のみを入力する必要があります; 2.クラスターモードでは,1つのクラスターノードのip / domain名のみを入力する必要があります。 ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "ファイル", 145 | "electron.menu.file.import.connection": "接続のインポート", 146 | "electron.menu.file.export.connection": "接続のエクスポート", 147 | "electron.menu.file.reset.connection": "接続をリセット", 148 | "electron.menu.file.system.Configuration": "システム構成", 149 | "electron.menu.file.exit": "終了", 150 | "electron.menu.edit": "編集", 151 | "electron.menu.edit.undo": "元に戻す", 152 | "electron.menu.edit.redo": "やり直し", 153 | "electron.menu.edit.cut": "カット", 154 | "electron.menu.edit.copy": "コピー", 155 | "electron.menu.edit.paste": "貼り付け", 156 | "electron.menu.edit.select.all": "すべて選択", 157 | "electron.menu.view": "表示", 158 | "electron.menu.view.reload": "リロード", 159 | "electron.menu.view.toggle.full.screen": "全画面を切り替えます", 160 | "electron.menu.view.switch.dev.tools": "開発者ツールの切り替え", 161 | "electron.menu.window": "ウィンドウ", 162 | "electron.menu.window.minimize": "最小化", 163 | "electron.menu.window.close": "閉じる", 164 | "electron.menu.help": "ヘルプ", 165 | "electron.menu.help.minimize": "最小化", 166 | "electron.menu.help.submit.issues.github": "問題を提出する(github)", 167 | "electron.menu.help.submit.issues.gitee": "課題を提出(gitee)", 168 | "electron.menu.help.officail.website": "公式ウェブサイト", 169 | "electron.menu.help.about": "QuickRedisについて", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "プロキシを使う", 173 | "proxy.host": "エージェントHost", 174 | "proxy.sshport": "SSHポート", 175 | "proxy.username": "SSHユーザ名", 176 | "proxy.password": "プロキシパスワード", 177 | "proxy.sshkeypath": "秘密鍵のプロキシパス", 178 | "proxy.connecterror": "プロキシ接続に失敗しました", 179 | "proxy.privateKey.not.exist": "秘密鍵ファイルエラー", 180 | 181 | "notification.start": "####通知####", 182 | "notification.support.host.key.tree.title": "新機能-ディレクトリを使用してキーを表示および操作する", 183 | "notification.support.host.key.tree.description": "この機能を有効にする方法:メインメニュー->ファイル->システム設定->区切り文字の設定", 184 | "notification.end00": "####通知####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "공지", 4 | "common.error": "오류", 5 | "common.error.input.value": "값을 입력하십시오", 6 | "common.ok": "확인", 7 | "common.cancel": "취소", 8 | "common.save.success": "성공적으로 저장되었습니다", 9 | "common.save": "저장", 10 | "common.columns.title.op": "운영 중", 11 | "common.columns.title.modify": "수정", 12 | "common.columns.title.view": "보기", 13 | "common.columns.title.delete": "삭제", 14 | "common.columns.title.delete.notice": "정말 삭제 하시겠습니까?", 15 | "common.add.record": "레코드 추가", 16 | "common.modal.title.add": "레코드 추가", 17 | "common.modal.title.view": "레코드보기", 18 | "common.modal.title.modify": "레코드 수정", 19 | "common.search.tooltip.limit": "최대 10000 개의 레코드 쿼리", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "연결 만들기", 24 | "Tree.Menu.UPDATE_CONN": "연결 수정", 25 | "Tree.Menu.DEL_CONN": "연결 삭제", 26 | "Tree.Menu.CREATE_FOLDER": "디렉토리 생성", 27 | "Tree.Menu.UPDATE_FOLDER": "디렉토리 수정", 28 | "Tree.Menu.DEL_FOLDER": "디렉토리 삭제", 29 | "Tree.Menu.DEL_ALL": "삭제", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "명령 줄 열기", 31 | "Tree.Menu.CREATE_CONN_MUTI": "새 창 열기", 32 | "Tree.Menu.DISCONNECT_CONN": "연결 해제", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "루트 디렉토리 생성", 34 | "Tree.Menu.COPY_CONN": "링크 복사", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "json 형식", 39 | "QuickMonacoEditor.delformat": "json 공백 삭제", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "압축 GZip", 42 | "QuickMonacoEditor.ungzip": "해제 GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "언어 선택", 46 | "SystemConfig.tree.split": "구분자 설정", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "시스템 구성", 49 | "SystemConfig.needRestart": "적용하려면 다시 시작해야합니다.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "지우다", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### 호스트 키 ####", 57 | "HostKey.key.exist": "키가 이미 있습니다.", 58 | "HostKey.key.not.exist": "키가 존재하지 않거나 삭제되었습니다", 59 | "HostKey.create.key": "키 생성", 60 | "HostKey.modal.title": "키 생성", 61 | "HostKey.modal.keyType": "값 유형 선택", 62 | 63 | "HostKey.header.save.notice": "먼저 저장하십시오", 64 | "HostKey.header.save.delete.success": "성공적으로 삭제됨", 65 | "HostKey.header.key.modify.success": "키를 성공적으로 수정", 66 | "HostKey.header.key.modify.fail": "키 수정 실패", 67 | "HostKey.header.key.modify.fail.exist": "키를 수정하지 못했습니다. 키가 이미 있습니다.", 68 | "HostKey.header.key.ttl.midify.illegal.value": "잘못된 값입니다. 단위는 초입니다.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "더 큰 값을 입력하십시오. 그렇지 않으면 곧 삭제됩니다. 단위는 초입니다.", 70 | "HostKey.header.key.ttl.midify.success": "ttl을 성공적으로 수정", 71 | "HostKey.header.key.ttl.midify.fail": "ttl 수정 실패", 72 | "HostKey.header.key.delete.notice": "키를 삭제 하시겠습니까?", 73 | 74 | "HostKey.String.start": "#### 호스트 키 문자열 ####", 75 | "HostKey.String.save.input.key": "키를 입력하십시오", 76 | "HostKey.String.end00": "#### 호스트 키 문자열 ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "위치 삽입", 80 | "HostKey.HostKeyList.modal.insert.left": "왼쪽 삽입", 81 | "HostKey.HostKeyList.modal.insert.right": "오른쪽 삽입", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### 호스트 키 ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "오른쪽 닫기", 88 | "HostTag.Menu.remove.left": "왼쪽 닫기", 89 | "HostTag.Menu.remove.other": "기타 닫기", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "먼저 연결 모드를 구성하십시오", 94 | "RedisService.error.occurred": "오류가 발생했습니다.", 95 | "RedisService.info.connection.established.success": "연결이 성공적으로 설정되었습니다.", 96 | "RedisService.info.connection.close.success": "연결이 닫혔습니다.", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "업그레이드 팁", 101 | "CheckUpdateService.notification.description": "현재 버전은 {currentVersion}이고 최신 버전은 {latestVersion}입니다. GitHub 또는 Gitee에서 최신 버전을 다운로드하십시오.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### 호스트 터미널 ####", 105 | "HostTerminal.descriptions.msg": "도움말 정보를 보려면 help를 입력하십시오. Redis 명령 문서 : http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### 호스트 터미널 ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "내보내기 연결 성공", 110 | "ResourceTree.export.fail": "내보내기 연결 실패", 111 | "ResourceTree.import.success": "가져 오기 연결 성공", 112 | "ResourceTree.import.fail": "가져 오기 연결 실패", 113 | "ResourceTree.reset.success": "연결 재설정 성공", 114 | "ResourceTree.reset.fail": "연결 재설정 실패", 115 | 116 | "ResourceTree.delete.notice": "아래 항목을 삭제 하시겠습니까?", 117 | 118 | "ResourceTree.folder.create": "디렉토리 생성", 119 | "ResourceTree.folder.modify": "디렉토리 수정", 120 | "ResourceTree.folder.name": "이름", 121 | "ResourceTree.folder.name.rules": "디렉토리 이름을 입력하십시오", 122 | 123 | "ResourceTree.host.create": "연결 생성", 124 | "ResourceTree.host.modify": "연결 수정", 125 | "ResourceTree.host.name": "이름", 126 | "ResourceTree.host.name.rules": "연결 이름을 입력하십시오", 127 | "ResourceTree.host.ip": "Ip / 도메인", 128 | "ResourceTree.host.ip.rules": "IP / 도메인을 입력하십시오", 129 | "ResourceTree.host.port": "포트", 130 | "ResourceTree.host.port.rules": "포트를 입력하십시오", 131 | "ResourceTree.host.password": "암호", 132 | "ResourceTree.host.connectionMode": "모드", 133 | "ResourceTree.host.connectionMode.direct": "직접", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "클러스터", 136 | "ResourceTree.host.sentinel.password": "센티넬 패스", 137 | "ResourceTree.host.test": "테스트", 138 | "ResourceTree.host.test.button": "연결 테스트", 139 | "ResourceTree.host.description": "설명", 140 | "ResourceTree.host.description.detail": "1. 센티넬 모드는 한 센티넬 노드의 IP / 도메인 이름 만 입력하면됩니다. 2. 클러스터 모드는 한 클러스터 노드의 IP / 도메인 이름 만 입력하면됩니다. . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "파일", 145 | "electron.menu.file.import.connection": "연결 가져 오기", 146 | "electron.menu.file.export.connection": "연결 내보내기", 147 | "electron.menu.file.reset.connection": "연결 재설정", 148 | "electron.menu.file.system.Configuration": "시스템 구성", 149 | "electron.menu.file.exit": "종료", 150 | "electron.menu.edit": "편집", 151 | "electron.menu.edit.undo": "실행 취소", 152 | "electron.menu.edit.redo": "다시 실행", 153 | "electron.menu.edit.cut": "잘라 내기", 154 | "electron.menu.edit.copy": "복사", 155 | "electron.menu.edit.paste": "붙여 넣기", 156 | "electron.menu.edit.select.all": "모두 선택", 157 | "electron.menu.view": "보기", 158 | "electron.menu.view.reload": "다시로드", 159 | "electron.menu.view.toggle.full.screen": "전체 화면 전환", 160 | "electron.menu.view.switch.dev.tools": "개발자 도구 전환", 161 | "electron.menu.window": "창", 162 | "electron.menu.window.minimize": "최소화", 163 | "electron.menu.window.close": "닫기", 164 | "electron.menu.help": "도움말", 165 | "electron.menu.help.minimize": "최소화", 166 | "electron.menu.help.submit.issues.github": "문제 제출 (github)", 167 | "electron.menu.help.submit.issues.gitee": "문제 제출 (gitee)", 168 | "electron.menu.help.officail.website": "공식 웹 사이트", 169 | "electron.menu.help.about": "QuickRedis 정보", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "사용 에이전트", 173 | "proxy.host": "대리 Host", 174 | "proxy.sshport": "SSH 포트", 175 | "proxy.username": "사용자 이름 SSH", 176 | "proxy.password": "프 록 시 비밀번호", 177 | "proxy.sshkeypath": "대리 비밀 키 루트", 178 | "proxy.connecterror": "프 록 시 연결 실패", 179 | "proxy.privateKey.not.exist": "비밀 키 파일 오류", 180 | 181 | "notification.start": "#### 알림 ####", 182 | "notification.support.host.key.tree.title": "키를 표시하고 조작하기위한 새로운 기능 사용 디렉토리", 183 | "notification.support.host.key.tree.description": "이 기능 활성화 방법 : 주 메뉴-> 파일-> 시스템 설정-> 구분 기호 설정", 184 | "notification.end00": "#### 알림 ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Uwaga", 4 | "common.error": "Błąd", 5 | "common.error.input.value": "Wprowadź wartość", 6 | "common.ok": "OK", 7 | "common.cancel": "Anuluj", 8 | "common.save.success": "Zapisano pomyślnie", 9 | "common.save": "Zapisz", 10 | "common.columns.title.op": "Działający", 11 | "common.columns.title.modify": "Modyfikuj", 12 | "common.columns.title.view": "Widok", 13 | "common.columns.title.delete": "Usuń", 14 | "common.columns.title.delete.notice": "Czy na pewno chcesz usunąć?", 15 | "common.add.record": "Dodaj rekord", 16 | "common.modal.title.add": "Dodaj rekord", 17 | "common.modal.title.view": "Wyświetl rekord", 18 | "common.modal.title.modify": "Modyfikuj rekord", 19 | "common.search.tooltip.limit": "Zapytaj do 10000 rekordów", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Utwórz połączenie", 24 | "Tree.Menu.UPDATE_CONN": "Modyfikuj połączenie", 25 | "Tree.Menu.DEL_CONN": "Usuń połączenie", 26 | "Tree.Menu.CREATE_FOLDER": "Utwórz katalog", 27 | "Tree.Menu.UPDATE_FOLDER": "Modyfikuj katalog", 28 | "Tree.Menu.DEL_FOLDER": "Usuń katalog", 29 | "Tree.Menu.DEL_ALL": "Usuń", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Otwórz wiersz poleceń", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Otwórz nowe okno", 32 | "Tree.Menu.DISCONNECT_CONN": "Rozłącz", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Utwórz katalog główny", 34 | "Tree.Menu.COPY_CONN": "Kopiuj link", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Formatuj json", 39 | "QuickMonacoEditor.delformat": "Usuń spacje json", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Dekompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Wybierz język", 46 | "SystemConfig.tree.split": "Ustaw separator", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Konfiguracja systemu", 49 | "SystemConfig.needRestart": "Musisz zrestartować, aby odniosły skutek.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "kasować", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Klucz już istnieje", 58 | "HostKey.key.not.exist": "Klucz nie istnieje lub został usunięty", 59 | "HostKey.create.key": "Utwórz klucz", 60 | "HostKey.modal.title": "Utwórz klucz", 61 | "HostKey.modal.keyType": "Wybierz typ wartości", 62 | 63 | "HostKey.header.save.notice": "Najpierw zapisz", 64 | "HostKey.header.save.delete.success": "Pomyślnie usunięto", 65 | "HostKey.header.key.modify.success": "Modyfikacja klucza powiodła się", 66 | "HostKey.header.key.modify.fail": "Nie udało się zmodyfikować klucza", 67 | "HostKey.header.key.modify.fail.exist": "Nie udało się zmodyfikować klucza, klucz już istnieje", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Niedozwolona wartość. Jednostką są sekundy.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Proszę wprowadzić większą wartość, w przeciwnym razie zostanie ona wkrótce usunięta. Jednostką są sekundy.", 70 | "HostKey.header.key.ttl.midify.success": "Modyfikacja ttl powiodła się", 71 | "HostKey.header.key.ttl.midify.fail": "Nie udało się zmodyfikować ttl", 72 | "HostKey.header.key.delete.notice": "Czy na pewno chcesz usunąć klucz?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "Wprowadź klucz", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Wstaw pozycję", 80 | "HostKey.HostKeyList.modal.insert.left": "Wstaw z lewej", 81 | "HostKey.HostKeyList.modal.insert.right": "Wstaw z prawej", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Zamknij w prawo", 88 | "HostTag.Menu.remove.left": "Zamknij w lewo", 89 | "HostTag.Menu.remove.other": "Zamknij inne", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Najpierw skonfiguruj tryb połączenia", 94 | "RedisService.error.occurred": "Wystąpił błąd.", 95 | "RedisService.info.connection.established.success": "Połączenie nawiązane pomyślnie", 96 | "RedisService.info.connection.close.success": "Połączenie zamknięte", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Wskazówki dotyczące aktualizacji", 101 | "CheckUpdateService.notification.description": "Aktualna wersja to {currentVersion}, a najnowsza wersja to {latestVersion}. Pobierz najnowszą wersję z GitHub lub Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Wpisz pomoc, aby wyświetlić informacje pomocy. Dokument polecenia Redis: http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Eksportuj połączenie powiodło się", 110 | "ResourceTree.export.fail": "Połączenie eksportu nie powiodło się", 111 | "ResourceTree.import.success": "Importowanie połączenia powiodło się", 112 | "ResourceTree.import.fail": "Połączenie importu nie powiodło się", 113 | "ResourceTree.reset.success": "Pomyślnie zresetowano połączenie", 114 | "ResourceTree.reset.fail": "Nie udało się zresetować połączenia", 115 | 116 | "ResourceTree.delete.notice": "Czy na pewno chcesz usunąć poniższe wpisy?", 117 | 118 | "ResourceTree.folder.create": "Utwórz katalog", 119 | "ResourceTree.folder.modify": "Modyfikuj katalog", 120 | "ResourceTree.folder.name": "Nazwa", 121 | "ResourceTree.folder.name.rules": "Podaj nazwę katalogu", 122 | 123 | "ResourceTree.host.create": "Utwórz połączenie", 124 | "ResourceTree.host.modify": "Modyfikuj połączenie", 125 | "ResourceTree.host.name": "Nazwa", 126 | "ResourceTree.host.name.rules": "Wprowadź nazwę połączenia", 127 | "ResourceTree.host.ip": "Ip / domena", 128 | "ResourceTree.host.ip.rules": "Wprowadź adres IP / domenę", 129 | "ResourceTree.host.port": "Port", 130 | "ResourceTree.host.port.rules": "Wprowadź port", 131 | "ResourceTree.host.password": "hasło", 132 | "ResourceTree.host.connectionMode": "Tryb", 133 | "ResourceTree.host.connectionMode.direct": "Bezpośredni", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Klaster", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Test", 138 | "ResourceTree.host.test.button": "Testuj połączenie", 139 | "ResourceTree.host.description": "Opis", 140 | "ResourceTree.host.description.detail": "1. W trybie wartownika wystarczy wpisać adres IP / nazwę domeny jednego węzła wartowniczego; 2. W trybie klastra wystarczy podać adres IP / nazwę domeny jednego węzła klastra . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "Plik", 145 | "electron.menu.file.import.connection": "Importuj połączenie", 146 | "electron.menu.file.export.connection": "Eksportuj połączenie", 147 | "electron.menu.file.reset.connection": "Resetuj połączenie", 148 | "electron.menu.file.system.Configuration": "Konfiguracja systemu", 149 | "electron.menu.file.exit": "Wyjście", 150 | "electron.menu.edit": "Edytuj", 151 | "electron.menu.edit.undo": "Cofnij", 152 | "electron.menu.edit.redo": "Ponów", 153 | "electron.menu.edit.cut": "Wytnij", 154 | "electron.menu.edit.copy": "Kopiuj", 155 | "electron.menu.edit.paste": "Wklej", 156 | "electron.menu.edit.select.all": "Zaznacz wszystko", 157 | "electron.menu.view": "Widok", 158 | "electron.menu.view.reload": "Załaduj ponownie", 159 | "electron.menu.view.toggle.full.screen": "Przełącz na pełny ekran", 160 | "electron.menu.view.switch.dev.tools": "Przełącz narzędzia programistyczne", 161 | "electron.menu.window": "Okno", 162 | "electron.menu.window.minimize": "Minimalizuj", 163 | "electron.menu.window.close": "zamknij", 164 | "electron.menu.help": "Pomoc", 165 | "electron.menu.help.minimize": "Minimalizuj", 166 | "electron.menu.help.submit.issues.github": "zgłoś problemy (github)", 167 | "electron.menu.help.submit.issues.gitee": "zgłoś problemy (gitee)", 168 | "electron.menu.help.officail.website": "Strona internetowa urzędu", 169 | "electron.menu.help.about": "Informacje o QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "Korzystanie z pośrednika", 173 | "proxy.host": "Agent prowadzący", 174 | "proxy.sshport": "Port SSH", 175 | "proxy.username": "Nazwa użytkownika SSH", 176 | "proxy.password": "Hasło pośrednika", 177 | "proxy.sshkeypath": "Ścieżka klucza prywatnego pośrednika", 178 | "proxy.connecterror": "Błąd połączenia pośrednika", 179 | "proxy.privateKey.not.exist": "Błąd tajnego klucza", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "Nowy katalog użycia funkcji do wyświetlania i manipulowania klawiszami", 183 | "notification.support.host.key.tree.description": "Jak włączyć tę funkcję: Menu główne -> Plik -> Ustawienia systemowe -> Ustaw separator", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Notice", 4 | "common.error": "Erro", 5 | "common.error.input.value": "Insira o valor", 6 | "common.ok": "OK", 7 | "common.cancel": "Cancelar", 8 | "common.save.success": "Salvo com sucesso", 9 | "common.save": "Salvar", 10 | "common.columns.title.op": "Operando", 11 | "common.columns.title.modify": "Modificar", 12 | "common.columns.title.view": "Exibir", 13 | "common.columns.title.delete": "Excluir", 14 | "common.columns.title.delete.notice": "Tem certeza que deseja excluir?", 15 | "common.add.record": "Adicionar registro", 16 | "common.modal.title.add": "Adicionar registro", 17 | "common.modal.title.view": "Ver registro", 18 | "common.modal.title.modify": "Modificar registro", 19 | "common.search.tooltip.limit": "Consultar até 10000 registros", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Criar conexão", 24 | "Tree.Menu.UPDATE_CONN": "Modificar conexão", 25 | "Tree.Menu.DEL_CONN": "Excluir conexão", 26 | "Tree.Menu.CREATE_FOLDER": "Criar diretório", 27 | "Tree.Menu.UPDATE_FOLDER": "Modificar diretório", 28 | "Tree.Menu.DEL_FOLDER": "Excluir diretório", 29 | "Tree.Menu.DEL_ALL": "Excluir", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Abra a linha de comando", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Abrir uma nova janela", 32 | "Tree.Menu.DISCONNECT_CONN": "Desconectar", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Criar diretório raiz", 34 | "Tree.Menu.COPY_CONN": "Copiar link", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Format json", 39 | "QuickMonacoEditor.delformat": "Excluir espaços json", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Dekompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Selecione o idioma", 46 | "SystemConfig.tree.split": "Definir separador", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Configuração do sistema", 49 | "SystemConfig.needRestart": "Você precisa reiniciar para fazer efeito.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "excluir", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "A chave já existe", 58 | "HostKey.key.not.exist": "A chave não existe ou foi excluída", 59 | "HostKey.create.key": "Criar chave", 60 | "HostKey.modal.title": "Criar chave", 61 | "HostKey.modal.keyType": "Escolha o tipo de valor", 62 | 63 | "HostKey.header.save.notice": "Salve primeiro", 64 | "HostKey.header.save.delete.success": "Excluído com sucesso", 65 | "HostKey.header.key.modify.success": "Modificar chave com sucesso", 66 | "HostKey.header.key.modify.fail": "Falha ao modificar a chave", 67 | "HostKey.header.key.modify.fail.exist": "Falha ao modificar a chave, a chave já existe", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Valor ilegal. A unidade é segundos.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Insira um valor maior, caso contrário, ele será excluído em breve. A unidade é de segundos.", 70 | "HostKey.header.key.ttl.midify.success": "Modificar ttl com sucesso", 71 | "HostKey.header.key.ttl.midify.fail": "Falha ao modificar ttl", 72 | "HostKey.header.key.delete.notice": "Tem certeza que deseja excluir a chave?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "Insira a chave", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Inserir posição", 80 | "HostKey.HostKeyList.modal.insert.left": "Inserir à esquerda", 81 | "HostKey.HostKeyList.modal.insert.right": "Inserir à direita", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Fechar à direita", 88 | "HostTag.Menu.remove.left": "Fechar à esquerda", 89 | "HostTag.Menu.remove.other": "Fechar outro", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Configure primeiro o modo de conexão", 94 | "RedisService.error.occurred": "Ocorreu um erro.", 95 | "RedisService.info.connection.established.success": "Conexão estabelecida com sucesso", 96 | "RedisService.info.connection.close.success": "Conexão fechada", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Dicas de atualização", 101 | "CheckUpdateService.notification.description": "A versão atual é {currentVersion} e a versão mais recente é {latestVersion}. Faça download da versão mais recente no GitHub ou Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Digite help para ver as informações de ajuda. Documento de comando do Redis: http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "A conexão de exportação foi bem-sucedida", 110 | "ResourceTree.export.fail": "Falha na conexão de exportação", 111 | "ResourceTree.import.success": "Importação com sucesso", 112 | "ResourceTree.import.fail": "Falha na importação de conexão", 113 | "ResourceTree.reset.success": "Reinicie a conexão com sucesso", 114 | "ResourceTree.reset.fail": "Falha ao redefinir a conexão", 115 | 116 | "ResourceTree.delete.notice": "Tem certeza que deseja excluir as entradas abaixo?", 117 | 118 | "ResourceTree.folder.create": "Criar diretório", 119 | "ResourceTree.folder.modify": "Modificar diretório", 120 | "ResourceTree.folder.name": "Nome", 121 | "ResourceTree.folder.name.rules": "Por favor, insira o nome do diretório", 122 | 123 | "ResourceTree.host.create": "Criar conexão", 124 | "ResourceTree.host.modify": "Modificar conexão", 125 | "ResourceTree.host.name": "Nome", 126 | "ResourceTree.host.name.rules": "Por favor, insira o nome da conexão", 127 | "ResourceTree.host.ip": "Ip / Domínio", 128 | "ResourceTree.host.ip.rules": "Insira o IP / Domínio", 129 | "ResourceTree.host.port": "Porta", 130 | "ResourceTree.host.port.rules": "Insira a porta", 131 | "ResourceTree.host.password": "senha", 132 | "ResourceTree.host.connectionMode": "Modo", 133 | "ResourceTree.host.connectionMode.direct": "Direto", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Cluster", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Teste", 138 | "ResourceTree.host.test.button": "Testar conexão", 139 | "ResourceTree.host.description": "Descrição", 140 | "ResourceTree.host.description.detail": "1. O modo sentinela só precisa preencher o ip / nome de domínio de um nó sentinela; 2. O modo cluster só precisa preencher o ip / nome de domínio de um nó de cluster . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "Arquivo", 145 | "electron.menu.file.import.connection": "Importar conexão", 146 | "electron.menu.file.export.connection": "Exportar conexão", 147 | "electron.menu.file.reset.connection": "Reiniciar conexão", 148 | "electron.menu.file.system.Configuration": "Configuração do sistema", 149 | "electron.menu.file.exit": "Sair", 150 | "electron.menu.edit": "Editar", 151 | "electron.menu.edit.undo": "Desfazer", 152 | "electron.menu.edit.redo": "Refazer", 153 | "electron.menu.edit.cut": "Cortar", 154 | "electron.menu.edit.copy": "Copiar", 155 | "electron.menu.edit.paste": "Colar", 156 | "electron.menu.edit.select.all": "Selecionar tudo", 157 | "electron.menu.view": "Exibir", 158 | "electron.menu.view.reload": "Reload", 159 | "electron.menu.view.toggle.full.screen": "Alternar tela inteira", 160 | "electron.menu.view.switch.dev.tools": "Alternar ferramentas de desenvolvedor", 161 | "electron.menu.window": "Janela", 162 | "electron.menu.window.minimize": "Minimize", 163 | "electron.menu.window.close": "fechar", 164 | "electron.menu.help": "Ajuda", 165 | "electron.menu.help.minimize": "Minimize", 166 | "electron.menu.help.submit.issues.github": "enviar problemas (github)", 167 | "electron.menu.help.submit.issues.gitee": "enviar problemas (gitee)", 168 | "electron.menu.help.officail.website": "Site da Officail", 169 | "electron.menu.help.about": "Sobre QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "Usando um proxy", 173 | "proxy.host": "Agente anfitrião.", 174 | "proxy.sshport": "Porta SSH", 175 | "proxy.username": "Nome do utilizador SSH", 176 | "proxy.password": "Senha Proxy", 177 | "proxy.sshkeypath": "Localização provável Da chave Privada", 178 | "proxy.connecterror": "A conexão do'proxy'falhou", 179 | "proxy.privateKey.not.exist": "Erro de arquivo de chave secreta", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "Novo diretório de uso de recursos para exibir e manipular chaves", 183 | "notification.support.host.key.tree.description": "Como habilitar este recurso: Menu Principal -> Arquivo -> Configurações do Sistema -> Definir Delimitador", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "Уведомление", 4 | "common.error": "Ошибка", 5 | "common.error.input.value": "Введите значение", 6 | "common.ok": "ОК", 7 | "common.cancel": "Отменить", 8 | "common.save.success": "Сохранено успешно", 9 | "common.save": "Сохранить", 10 | "common.columns.title.op": "Рабочий", 11 | "common.columns.title.modify": "Изменить", 12 | "common.columns.title.view": "Просмотр", 13 | "common.columns.title.delete": "Удалить", 14 | "common.columns.title.delete.notice": "Вы действительно хотите удалить?", 15 | "common.add.record": "Добавить запись", 16 | "common.modal.title.add": "Добавить запись", 17 | "common.modal.title.view": "Просмотр записи", 18 | "common.modal.title.modify": "Изменить запись", 19 | "common.search.tooltip.limit": "Запросить до 10000 записей", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Создать соединение", 24 | "Tree.Menu.UPDATE_CONN": "Изменить соединение", 25 | "Tree.Menu.DEL_CONN": "Удалить соединение", 26 | "Tree.Menu.CREATE_FOLDER": "Создать каталог", 27 | "Tree.Menu.UPDATE_FOLDER": "Изменить каталог", 28 | "Tree.Menu.DEL_FOLDER": "Удалить каталог", 29 | "Tree.Menu.DEL_ALL": "Удалить", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Открыть командную строку", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Открыть новое окно", 32 | "Tree.Menu.DISCONNECT_CONN": "Отключить", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Создать корневой каталог", 34 | "Tree.Menu.COPY_CONN": "Копировать ссылку", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Формат json", 39 | "QuickMonacoEditor.delformat": "Удалить пробелы json", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Compression GZip", 42 | "QuickMonacoEditor.ungzip": "Dekompression GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Выбрать язык", 46 | "SystemConfig.tree.split": "Установить разделитель", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Конфигурация системы", 49 | "SystemConfig.needRestart": "Для вступления в силу необходимо перезапустить.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "Удалить", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Ключ уже существует", 58 | "HostKey.key.not.exist": "Ключ не существует или был удален", 59 | "HostKey.create.key": "Создать ключ", 60 | "HostKey.modal.title": "Создать ключ", 61 | "HostKey.modal.keyType": "Выбрать тип значения", 62 | 63 | "HostKey.header.save.notice": "Сначала сохраните", 64 | "HostKey.header.save.delete.success": "Успешно удалено", 65 | "HostKey.header.key.modify.success": "Изменить ключ успешно", 66 | "HostKey.header.key.modify.fail": "Не удалось изменить ключ", 67 | "HostKey.header.key.modify.fail.exist": "Не удалось изменить ключ, ключ уже существует", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Недопустимое значение. Единица измерения - секунды.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Пожалуйста, введите большее значение, иначе оно скоро будет удалено. Единица измерения - секунды.", 70 | "HostKey.header.key.ttl.midify.success": "Изменить ttl успешно", 71 | "HostKey.header.key.ttl.midify.fail": "Не удалось изменить ttl", 72 | "HostKey.header.key.delete.notice": "Вы уверены, что хотите удалить ключ?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "Пожалуйста, введите ключ", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Вставить позицию", 80 | "HostKey.HostKeyList.modal.insert.left": "Вставить слева", 81 | "HostKey.HostKeyList.modal.insert.right": "Вставить справа", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Закрыть вправо", 88 | "HostTag.Menu.remove.left": "Закрыть слева", 89 | "HostTag.Menu.remove.other": "Закрыть другое", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Сначала настройте режим подключения", 94 | "RedisService.error.occurred": "Произошла ошибка.", 95 | "RedisService.info.connection.established.success": "Соединение установлено успешно", 96 | "RedisService.info.connection.close.success": "Соединение закрыто", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Советы по обновлению", 101 | "CheckUpdateService.notification.description": "Текущая версия - {currentVersion}, а последняя версия - {latestVersion}. Загрузите последнюю версию с GitHub или Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Введите help, чтобы просмотреть справочную информацию. Документ команды Redis: http://www.redis.cn/commands.html?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Экспортное соединение успешно", 110 | "ResourceTree.export.fail": "Ошибка подключения к экспорту", 111 | "ResourceTree.import.success": "Импортировать соединение успешно", 112 | "ResourceTree.import.fail": "Ошибка подключения при импорте", 113 | "ResourceTree.reset.success": "Успешно сбросить соединение", 114 | "ResourceTree.reset.fail": "Не удалось сбросить соединение", 115 | 116 | "ResourceTree.delete.notice": "Вы действительно хотите удалить записи ниже?", 117 | 118 | "ResourceTree.folder.create": "Создать каталог", 119 | "ResourceTree.folder.modify": "Изменить каталог", 120 | "ResourceTree.folder.name": "Имя", 121 | "ResourceTree.folder.name.rules": "Введите имя каталога", 122 | 123 | "ResourceTree.host.create": "Создать соединение", 124 | "ResourceTree.host.modify": "Изменить соединение", 125 | "ResourceTree.host.name": "Имя", 126 | "ResourceTree.host.name.rules": "Введите имя подключения", 127 | "ResourceTree.host.ip": "IP / домен", 128 | "ResourceTree.host.ip.rules": "Пожалуйста, введите Ip / домен", 129 | "ResourceTree.host.port": "Порт", 130 | "ResourceTree.host.port.rules": "Введите порт", 131 | "ResourceTree.host.password": "пароль", 132 | "ResourceTree.host.connectionMode": "Режим", 133 | "ResourceTree.host.connectionMode.direct": "Прямой", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Кластер", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Тест", 138 | "ResourceTree.host.test.button": "Проверить соединение", 139 | "ResourceTree.host.description": "Описание", 140 | "ResourceTree.host.description.detail": "1. В дозорном режиме необходимо указать только IP / доменное имя одного контрольного узла; 2. В режиме кластера необходимо заполнить только IP / доменное имя одного узла кластера. . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electrons.menu.start ####", 144 | "electron.menu.file": "Файл", 145 | "electron.menu.file.import.connection": "Импортировать соединение", 146 | "electron.menu.file.export.connection": "Экспортное соединение", 147 | "electron.menu.file.reset.connection": "Сбросить соединение", 148 | "electron.menu.file.system.Configuration": "Конфигурация системы", 149 | "electron.menu.file.exit": "Выход", 150 | "electron.menu.edit": "Редактировать", 151 | "electron.menu.edit.undo": "Отменить", 152 | "electron.menu.edit.redo": "Вернуть", 153 | "electron.menu.edit.cut": "Вырезать", 154 | "electron.menu.edit.copy": "Копировать", 155 | "electron.menu.edit.paste": "Вставить", 156 | "electron.menu.edit.select.all": "Выбрать все", 157 | "electron.menu.view": "Просмотр", 158 | "electron.menu.view.reload": "Перезагрузить", 159 | "electron.menu.view.toggle.full.screen": "Включить полноэкранный режим", 160 | "electron.menu.view.switch.dev.tools": "Переключить инструменты разработчика", 161 | "electron.menu.window": "Окно", 162 | "electron.menu.window.minimize": "Свернуть", 163 | "electron.menu.window.close": "закрыть", 164 | "electron.menu.help": "Помощь", 165 | "electron.menu.help.minimize": "Свернуть", 166 | "electron.menu.help.submit.issues.github": "отправить проблемы (github)", 167 | "electron.menu.help.submit.issues.gitee": "отправить проблемы (gitee)", 168 | "electron.menu.help.officail.website": "Официальный веб-сайт", 169 | "electron.menu.help.about": "О QuickRedis", 170 | "electron.menu.end": "#### electrons.menu.end ####", 171 | 172 | "proxy.use": "Использовать прокси", 173 | "proxy.host": "Прокси-хост", 174 | "proxy.sshport": "Порт SSH", 175 | "proxy.username": "Имя пользователя SSH", 176 | "proxy.password": "Пароль прокси", 177 | "proxy.sshkeypath": "Путь к закрытому ключу прокси", 178 | "proxy.connecterror": "Ошибка подключения прокси", 179 | "proxy.privateKey.not.exist": "Ошибка файла секретного ключа", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "Новый каталог использования функций для отображения и управления ключами", 183 | "notification.support.host.key.tree.description": "Как включить эту функцию: Главное меню -> Файл -> Системные настройки -> Установить разделитель", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### chung ####", 3 | "common.notice": "Thông báo", 4 | "common.error": "Lỗi", 5 | "common.error.input.value": "Vui lòng nhập giá trị", 6 | "common.ok": "Được", 7 | "common.cancel": "Hủy", 8 | "common.save.success": "Đã lưu thành công", 9 | "common.save": "Lưu", 10 | "common.columns.title.op": "Đang hoạt động", 11 | "common.columns.title.modify": "Sửa đổi", 12 | "common.columns.title.view": "Xem", 13 | "common.columns.title.delete": "Xóa", 14 | "common.columns.title.delete.notice": "Bạn có chắc chắn xóa không?", 15 | "common.add.record": "Thêm Bản ghi", 16 | "common.modal.title.add": "Thêm Bản ghi", 17 | "common.modal.title.view": "Xem Bản ghi", 18 | "common.modal.title.modify": "Sửa đổi Bản ghi", 19 | "common.search.tooltip.limit": "Truy vấn tối đa 10000 bản ghi", 20 | "common.end00": "#### chung ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "Tạo kết nối", 24 | "Tree.Menu.UPDATE_CONN": "Sửa đổi kết nối", 25 | "Tree.Menu.DEL_CONN": "Xóa kết nối", 26 | "Tree.Menu.CREATE_FOLDER": "Tạo thư mục", 27 | "Tree.Menu.UPDATE_FOLDER": "Sửa đổi thư mục", 28 | "Tree.Menu.DEL_FOLDER": "Xóa thư mục", 29 | "Tree.Menu.DEL_ALL": "Xóa", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "Mở dòng lệnh", 31 | "Tree.Menu.CREATE_CONN_MUTI": "Mở cửa sổ mới", 32 | "Tree.Menu.DISCONNECT_CONN": "Ngắt kết nối", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "Tạo thư mục gốc", 34 | "Tree.Menu.COPY_CONN": "Sao chép liên kết", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "Định dạng json", 39 | "QuickMonacoEditor.delformat": "Xóa khoảng trắng json", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "Giải GZip", 42 | "QuickMonacoEditor.ungzip": "nén GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "Chọn ngôn ngữ", 46 | "SystemConfig.tree.split": "Đặt dấu phân cách", 47 | "SystemConfig.auto.format.json": "Format json automatically", 48 | "SystemConfig.title": "Cấu hình hệ thống", 49 | "SystemConfig.needRestart": "Bạn cần khởi động lại để có hiệu lực.", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "xóa bỏ", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Khóa đã tồn tại", 58 | "HostKey.key.not.exist": "Khóa không tồn tại hoặc đã bị xóa", 59 | "HostKey.create.key": "Tạo khóa", 60 | "HostKey.modal.title": "Tạo khóa", 61 | "HostKey.modal.keyType": "Chọn loại giá trị", 62 | 63 | "HostKey.header.save.notice": "Vui lòng lưu trước", 64 | "HostKey.header.save.delete.success": "Đã xóa thành công", 65 | "HostKey.header.key.modify.success": "Sửa đổi khóa thành công", 66 | "HostKey.header.key.modify.fail": "Không thể sửa đổi khóa", 67 | "HostKey.header.key.modify.fail.exist": "Không thể sửa đổi khóa, khóa đã tồn tại", 68 | "HostKey.header.key.ttl.midify.illegal.value": "Giá trị không hợp lệ. Đơn vị là giây.", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "Vui lòng nhập giá trị lớn hơn, nếu không giá trị đó sẽ sớm bị xóa. Đơn vị là giây.", 70 | "HostKey.header.key.ttl.midify.success": "Sửa đổi ttl thành công", 71 | "HostKey.header.key.ttl.midify.fail": "Không thể sửa đổi ttl", 72 | "HostKey.header.key.delete.notice": "Bạn có chắc chắn xóa khóa không?", 73 | 74 | "HostKey.String.start": "#### Chuỗi HostKey ####", 75 | "HostKey.String.save.input.key": "Vui lòng nhập khóa", 76 | "HostKey.String.end00": "#### Chuỗi HostKey ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "Chèn vị trí", 80 | "HostKey.HostKeyList.modal.insert.left": "Chèn sang trái", 81 | "HostKey.HostKeyList.modal.insert.right": "Chèn bên phải", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "Đóng bên phải", 88 | "HostTag.Menu.remove.left": "Đóng bên trái", 89 | "HostTag.Menu.remove.other": "Đóng tệp khác", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "Trước tiên hãy định cấu hình chế độ kết nối", 94 | "RedisService.error.occurred": "Đã xảy ra lỗi.", 95 | "RedisService.info.connection.established.success": "Kết nối được thiết lập thành công", 96 | "RedisService.info.connection.close.success": "Kết nối đã đóng", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "Mẹo nâng cấp", 101 | "CheckUpdateService.notification.description": "Phiên bản hiện tại là {currentVersion} và phiên bản mới nhất là {newVersion}. Vui lòng tải xuống phiên bản mới nhất từ ​​GitHub hoặc Gitee.", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "Nhấp vào phím tab để hiển thị phương pháp sử dụng lệnh. Tài liệu tham khảo lệnh Redis: https://redis.io/commands?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "Kết nối xuất thành công", 110 | "ResourceTree.export.fail": "Kết nối xuất không thành công", 111 | "ResourceTree.import.success": "Kết nối nhập thành công", 112 | "ResourceTree.import.fail": "Nhập kết nối không thành công", 113 | "ResourceTree.reset.success": "Đặt lại thành công kết nối", 114 | "ResourceTree.reset.fail": "Không thể đặt lại kết nối", 115 | 116 | "ResourceTree.delete.notice": "Bạn có chắc chắn xóa các mục bên dưới không?", 117 | 118 | "ResourceTree.folder.create": "Tạo thư mục", 119 | "ResourceTree.folder.modify": "Sửa đổi thư mục", 120 | "ResourceTree.folder.name": "Tên", 121 | "ResourceTree.folder.name.rules": "Vui lòng nhập tên thư mục", 122 | 123 | "ResourceTree.host.create": "Tạo kết nối", 124 | "ResourceTree.host.modify": "Sửa đổi kết nối", 125 | "ResourceTree.host.name": "Tên", 126 | "ResourceTree.host.name.rules": "Vui lòng nhập tên kết nối", 127 | "ResourceTree.host.ip": "Ip / Tên miền", 128 | "ResourceTree.host.ip.rules": "Vui lòng nhập Ip / Tên miền", 129 | "ResourceTree.host.port": "Cổng", 130 | "ResourceTree.host.port.rules": "Vui lòng nhập cổng", 131 | "ResourceTree.host.password": "mật khẩu", 132 | "ResourceTree.host.connectionMode": "Chế độ", 133 | "ResourceTree.host.connectionMode.direct": "Trực tiếp", 134 | "ResourceTree.host.connectionMode.sentinel": "Sentinel", 135 | "ResourceTree.host.connectionMode.cluster": "Cụm", 136 | "ResourceTree.host.sentinel.password": "Sentinel Pass", 137 | "ResourceTree.host.test": "Kiểm tra", 138 | "ResourceTree.host.test.button": "Kiểm tra kết nối", 139 | "ResourceTree.host.description": "Mô tả", 140 | "ResourceTree.host.description.detail": "1. Chế độ sentinel chỉ cần điền ip / tên miền của một nút sentinel; 2. Chế độ cluster chỉ cần điền ip / tên miền của một nút cluster . ", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "Tệp", 145 | "electron.menu.file.import.connection": "Nhập kết nối", 146 | "electron.menu.file.export.connection": "Xuất kết nối", 147 | "electron.menu.file.reset.connection": "Đặt lại kết nối", 148 | "electron.menu.file.system.Configuration": "Cấu hình hệ thống", 149 | "electron.menu.file.exit": "Thoát", 150 | "electron.menu.edit": "Chỉnh sửa", 151 | "electron.menu.edit.undo": "Hoàn tác", 152 | "electron.menu.edit.redo": "Làm lại", 153 | "electron.menu.edit.cut": "Cắt", 154 | "electron.menu.edit.copy": "Sao chép", 155 | "electron.menu.edit.paste": "Dán", 156 | "electron.menu.edit.select.all": "Chọn tất cả", 157 | "electron.menu.view": "Xem", 158 | "electron.menu.view.reload": "Tải lại", 159 | "electron.menu.view.toggle.full.screen": "Chuyển đổi toàn màn hình", 160 | "electron.menu.view.switch.dev.tools": "Chuyển đổi công cụ dành cho nhà phát triển", 161 | "electron.menu.window": "Cửa sổ", 162 | "electron.menu.window.minimize": "Thu nhỏ", 163 | "electron.menu.window.close": "đóng", 164 | "electron.menu.help": "Trợ giúp", 165 | "electron.menu.help.minimize": "Thu nhỏ", 166 | "electron.menu.help.submit.issues.github": "gửi vấn đề (github)", 167 | "electron.menu.help.submit.issues.gitee": "gửi vấn đề (gitee)", 168 | "electron.menu.help.officail.website": "Trang web officialail", 169 | "electron.menu.help.about": "Giới thiệu về QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "Sử dụng proxy", 173 | "proxy.host": "Máy chủ proxy", 174 | "proxy.sshport": "Cổng SSH", 175 | "proxy.username": "Tên người dùng SSH", 176 | "proxy.password": "Mật khẩu proxy", 177 | "proxy.sshkeypath": "Đường dẫn khóa cá nhân proxy", 178 | "proxy.connecterror": "Kết nối proxy không thành công", 179 | "proxy.privateKey.not.exist": "Lỗi tệp khóa bí mật", 180 | 181 | "notification.start": "#### thông báo ####", 182 | "notification.support.host.key.tree.title": "Thư mục sử dụng tính năng mới để hiển thị và thao tác các phím", 183 | "notification.support.host.key.tree.description": "Cách bật tính năng này: Menu Chính -> Tệp -> Cài đặt Hệ thống -> Đặt Dấu phân cách", 184 | "notification.end00": "#### thông báo ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "通知", 4 | "common.error": "错误", 5 | "common.error.input.value": "请输入值", 6 | "common.ok": "确定", 7 | "common.cancel": "取消", 8 | "common.save.success": "成功保存", 9 | "common.save": "保存", 10 | "common.columns.title.op": "操作", 11 | "common.columns.title.modify": "修改", 12 | "common.columns.title.view": "查看", 13 | "common.columns.title.delete": "删除", 14 | "common.columns.title.delete.notice": "您确定要删除吗?", 15 | "common.add.record": "添加记录", 16 | "common.modal.title.add": "添加记录", 17 | "common.modal.title.view": "查看记录", 18 | "common.modal.title.modify": "修改记录", 19 | "common.search.tooltip.limit": "最多查询 10000 条记录", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "创建连接", 24 | "Tree.Menu.UPDATE_CONN": "修改连接", 25 | "Tree.Menu.DEL_CONN": "删除连接", 26 | "Tree.Menu.CREATE_FOLDER": "创建目录", 27 | "Tree.Menu.UPDATE_FOLDER": "修改目录", 28 | "Tree.Menu.DEL_FOLDER": "删除目录", 29 | "Tree.Menu.DEL_ALL": "删除", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "打开命令行", 31 | "Tree.Menu.CREATE_CONN_MUTI": "打开一个新窗口", 32 | "Tree.Menu.DISCONNECT_CONN": "断开连接", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "创建根目录", 34 | "Tree.Menu.COPY_CONN": "复制链接", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "格式化 json", 39 | "QuickMonacoEditor.delformat": "删除 json 空格", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "压缩GZip", 42 | "QuickMonacoEditor.ungzip": "解压GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "选择语言", 46 | "SystemConfig.tree.split": "设置分隔符", 47 | "SystemConfig.auto.format.json": "自动格式化json", 48 | "SystemConfig.title": "系统配置", 49 | "SystemConfig.needRestart": "您需要重新启动才能生效。", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "删除", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Key 已存在", 58 | "HostKey.key.not.exist": "Key 不存在或已被删除", 59 | "HostKey.create.key": "创建 Key", 60 | "HostKey.modal.title": "创建 Key", 61 | "HostKey.modal.keyType": "选择 value 类型", 62 | 63 | "HostKey.header.save.notice": "请先保存", 64 | "HostKey.header.save.delete.success": "已成功删除", 65 | "HostKey.header.key.modify.success": "成功修改 Key", 66 | "HostKey.header.key.modify.fail": "修改 Key 失败", 67 | "HostKey.header.key.modify.fail.exist": "无法修改 Key,Key 已经存在", 68 | "HostKey.header.key.ttl.midify.illegal.value": "非法值。单位是秒。", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "请输入一个较大的值,否则它将很快被删除。单位为秒。", 70 | "HostKey.header.key.ttl.midify.success": "成功修改 ttl", 71 | "HostKey.header.key.ttl.midify.fail": "修改 ttl 失败", 72 | "HostKey.header.key.delete.notice": "您确定要删除 Key 吗?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "请输入 Key", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "插入位置", 80 | "HostKey.HostKeyList.modal.insert.left": "向左插入", 81 | "HostKey.HostKeyList.modal.insert.right": "向右插入", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "关闭右侧", 88 | "HostTag.Menu.remove.left": "关闭左侧", 89 | "HostTag.Menu.remove.other": "关闭其他", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "请先配置连接模式", 94 | "RedisService.error.occurred": "发生了错误。", 95 | "RedisService.info.connection.established.success": "连接建立成功", 96 | "RedisService.info.connection.close.success": "连接已关闭", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "升级提示", 101 | "CheckUpdateService.notification.description": "当前版本为{currentVersion},最新版本为{latestVersion}。请从 GitHub 或 Gitee 下载最新版本。", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "点击 tab 键会出现命令使用方法。Redis命令参考文档: https://redis.io/commands?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "导出连接成功", 110 | "ResourceTree.export.fail": "导出连接失败", 111 | "ResourceTree.import.success": "导入连接成功", 112 | "ResourceTree.import.fail": "导入连接失败", 113 | "ResourceTree.reset.success": "已成功重置连接", 114 | "ResourceTree.reset.fail": "重置连接失败", 115 | 116 | "ResourceTree.delete.notice": "您确定要删除下面的条目吗?", 117 | 118 | "ResourceTree.folder.create": "创建目录", 119 | "ResourceTree.folder.modify": "修改目录", 120 | "ResourceTree.folder.name": "名称", 121 | "ResourceTree.folder.name.rules": "请输入目录名称", 122 | 123 | "ResourceTree.host.create": "创建连接", 124 | "ResourceTree.host.modify": "修改连接", 125 | "ResourceTree.host.name": "名称", 126 | "ResourceTree.host.name.rules": "请输入连接名称", 127 | "ResourceTree.host.ip": "Ip 或域名", 128 | "ResourceTree.host.ip.rules": "请输入 Ip 或域名", 129 | "ResourceTree.host.port": "端口", 130 | "ResourceTree.host.port.rules": "请输入端口", 131 | "ResourceTree.host.password": "密码", 132 | "ResourceTree.host.connectionMode": "连接模式", 133 | "ResourceTree.host.connectionMode.direct": "直连", 134 | "ResourceTree.host.connectionMode.sentinel": "哨兵", 135 | "ResourceTree.host.connectionMode.cluster": "集群", 136 | "ResourceTree.host.sentinel.password": "哨兵密码", 137 | "ResourceTree.host.test": "测试", 138 | "ResourceTree.host.test.button": "测试连接", 139 | "ResourceTree.host.description": "描述", 140 | "ResourceTree.host.description.detail": "1.哨兵模式仅需要填写一个哨兵节点的 Ip 或域名; 2.集群模式只需要填写一个群集节点的 Ip 或域名", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "文件", 145 | "electron.menu.file.import.connection": "导入连接", 146 | "electron.menu.file.export.connection": "导出连接", 147 | "electron.menu.file.reset.connection": "重置连接", 148 | "electron.menu.file.system.Configuration": "系统配置", 149 | "electron.menu.file.exit": "退出", 150 | "electron.menu.edit": "编辑", 151 | "electron.menu.edit.undo": "撤消", 152 | "electron.menu.edit.redo": "重做", 153 | "electron.menu.edit.cut": "剪切", 154 | "electron.menu.edit.copy": "复制", 155 | "electron.menu.edit.paste": "粘贴", 156 | "electron.menu.edit.select.all": "全选", 157 | "electron.menu.view": "查看", 158 | "electron.menu.view.reload": "重新加载", 159 | "electron.menu.view.toggle.full.screen": "切换全屏", 160 | "electron.menu.view.switch.dev.tools": "切换开发人员工具", 161 | "electron.menu.window": "窗口", 162 | "electron.menu.window.minimize": "最小化", 163 | "electron.menu.window.close": "关闭", 164 | "electron.menu.help": "帮助", 165 | "electron.menu.help.minimize": "最小化", 166 | "electron.menu.help.submit.issues.github": "提交问题(github)", 167 | "electron.menu.help.submit.issues.gitee": "提交问题(gitee)", 168 | "electron.menu.help.officail.website": "官方网站", 169 | "electron.menu.help.about": "关于 QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "使用代理", 173 | "proxy.host": "代理Host", 174 | "proxy.sshport": "SSH端口", 175 | "proxy.username": "SSH用户名", 176 | "proxy.password": "代理密码", 177 | "proxy.sshkeypath": "代理私钥路径", 178 | "proxy.connecterror": "代理连接失败", 179 | "proxy.privateKey.not.exist": "秘钥文件错误", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "新增功能 - 使用目录显示和操作keys", 183 | "notification.support.host.key.tree.description": "启用该功能的方法:主菜单 -> 文件 -> 系统设置 -> 设置分隔符", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/locales/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "common.start": "#### common ####", 3 | "common.notice": "通知", 4 | "common.error": "錯誤", 5 | "common.error.input.value": "請輸入值", 6 | "common.ok": "確定", 7 | "common.cancel": "取消", 8 | "common.save.success": "成功保存", 9 | "common.save": "保存", 10 | "common.columns.title.op": "操作", 11 | "common.columns.title.modify": "修改", 12 | "common.columns.title.view": "查看", 13 | "common.columns.title.delete": "刪除", 14 | "common.columns.title.delete.notice": "您確定要刪除嗎?", 15 | "common.add.record": "添加記錄", 16 | "common.modal.title.add": "添加記錄", 17 | "common.modal.title.view": "查看記錄", 18 | "common.modal.title.modify": "修改記錄", 19 | "common.search.tooltip.limit": "最多查詢 10000 條記錄", 20 | "common.end00": "#### common ####", 21 | 22 | "Tree.Menu.start": "#### Tree.Menu ####", 23 | "Tree.Menu.CREATE_CONN": "創建連接", 24 | "Tree.Menu.UPDATE_CONN": "修改連接", 25 | "Tree.Menu.DEL_CONN": "刪除連接", 26 | "Tree.Menu.CREATE_FOLDER": "創建目錄", 27 | "Tree.Menu.UPDATE_FOLDER": "修改目錄", 28 | "Tree.Menu.DEL_FOLDER": "刪除目錄", 29 | "Tree.Menu.DEL_ALL": "刪除", 30 | "Tree.Menu.CREATE_CONN_TERMINAL": "打開命令行", 31 | "Tree.Menu.CREATE_CONN_MUTI": "打開一個新窗口", 32 | "Tree.Menu.DISCONNECT_CONN": "斷開連接", 33 | "Tree.Menu.CREATE_FOLDER_ON_ROOT": "創建根目錄", 34 | "Tree.Menu.COPY_CONN": "復制鏈接", 35 | "Tree.Menu.end00": "#### Tree.Menu ####", 36 | 37 | "QuickMonacoEditor.start": "#### QuickMonacoEditor ####", 38 | "QuickMonacoEditor.format": "格式化 json", 39 | "QuickMonacoEditor.delformat": "刪除 json 空格", 40 | "QuickMonacoEditor.end00": "#### QuickMonacoEditor ####", 41 | "QuickMonacoEditor.gzip": "壓縮 GZip", 42 | "QuickMonacoEditor.ungzip": "解壓 GZip", 43 | 44 | "SystemConfig.start": "#### SystemConfig ####", 45 | "SystemConfig.lang": "選擇語言", 46 | "SystemConfig.tree.split": "設置分隔符", 47 | "SystemConfig.auto.format.json": "自動格式化json", 48 | "SystemConfig.title": "系統配置", 49 | "SystemConfig.needRestart": "您需要重新啟動才能生效。", 50 | "SystemConfig.end00": "#### SystemConfig ####", 51 | 52 | "HostKeyTree.start": "#### HostKey ####", 53 | "HostKeyTree.delete.key.node": "刪除", 54 | "HostKeyTree.end00": "#### HostKey ####", 55 | 56 | "HostKey.start": "#### HostKey ####", 57 | "HostKey.key.exist": "Key 已存在", 58 | "HostKey.key.not.exist": "Key 不存在或已被刪除", 59 | "HostKey.create.key": "創建 Key", 60 | "HostKey.modal.title": "創建 Key", 61 | "HostKey.modal.keyType": "選擇 value 類型", 62 | 63 | "HostKey.header.save.notice": "請先保存", 64 | "HostKey.header.save.delete.success": "已成功刪除", 65 | "HostKey.header.key.modify.success": "成功修改 Key", 66 | "HostKey.header.key.modify.fail": "修改 Key 失敗", 67 | "HostKey.header.key.modify.fail.exist": "無法修改 Key,Key 已經存在", 68 | "HostKey.header.key.ttl.midify.illegal.value": "非法值。單位是秒。", 69 | "HostKey.header.key.ttl.midify.illegal.value.2": "請輸入一個較大的值,否則它將很快被刪除。單位為秒。", 70 | "HostKey.header.key.ttl.midify.success": "成功修改 ttl", 71 | "HostKey.header.key.ttl.midify.fail": "修改 ttl 失敗", 72 | "HostKey.header.key.delete.notice": "您確定要刪除 Key 嗎?", 73 | 74 | "HostKey.String.start": "#### HostKey String ####", 75 | "HostKey.String.save.input.key": "請輸入 Key", 76 | "HostKey.String.end00": "#### HostKey String ####", 77 | 78 | "HostKey.HostKeyList.start": "#### HostKey HostKeyList ####", 79 | "HostKey.HostKeyList.modal.insert.position": "插入位置", 80 | "HostKey.HostKeyList.modal.insert.left": "向左插入", 81 | "HostKey.HostKeyList.modal.insert.right": "向右插入", 82 | "HostKey.HostKeyList.end00": "#### HostKey HostKeyList ####", 83 | 84 | "HostKey.end00": "#### HostKey ####", 85 | 86 | "HostTag.start": "#### HostTag ####", 87 | "HostTag.Menu.remove.rigth": "關閉右側", 88 | "HostTag.Menu.remove.left": "關閉左側", 89 | "HostTag.Menu.remove.other": "關閉其他", 90 | "HostTag.end00": "#### HostTag ####", 91 | 92 | "RedisService.start": "#### RedisService ####", 93 | "RedisService.error.configure.connection.mode": "請先配置連接模式", 94 | "RedisService.error.occurred": "發生了錯誤。", 95 | "RedisService.info.connection.established.success": "連接建立成功", 96 | "RedisService.info.connection.close.success": "連接已關閉", 97 | "RedisService.end00": "#### RedisService ####", 98 | 99 | "CheckUpdateService.start": "#### CheckUpdateService ####", 100 | "CheckUpdateService.notification.message": "升級提示", 101 | "CheckUpdateService.notification.description": "當前版本為{currentVersion},最新版本為{latestVersion}。請從 GitHub 或 Gitee 下載最新版本。", 102 | "CheckUpdateService.end00": "#### CheckUpdateService ####", 103 | 104 | "HostTerminal.start": "#### HostTerminal ####", 105 | "HostTerminal.descriptions.msg": "點擊 tab 鍵會出現命令使用方法。Redis命令參考文檔: https://redis.io/commands?from=QuickRedis", 106 | "HostTerminal.end00": "#### HostTerminal ####", 107 | 108 | "ResourceTree.start": "#### ResourceTree ####", 109 | "ResourceTree.export.success": "導出連接成功", 110 | "ResourceTree.export.fail": "導出連接失敗", 111 | "ResourceTree.import.success": "導入連接成功", 112 | "ResourceTree.import.fail": "導入連接失敗", 113 | "ResourceTree.reset.success": "已成功重置連接", 114 | "ResourceTree.reset.fail": "重置連接失敗", 115 | 116 | "ResourceTree.delete.notice": "您確定要刪除下面的條目嗎?", 117 | 118 | "ResourceTree.folder.create": "創建目錄", 119 | "ResourceTree.folder.modify": "修改目錄", 120 | "ResourceTree.folder.name": "名稱", 121 | "ResourceTree.folder.name.rules": "請輸入目錄名稱", 122 | 123 | "ResourceTree.host.create": "創建連接", 124 | "ResourceTree.host.modify": "修改連接", 125 | "ResourceTree.host.name": "名稱", 126 | "ResourceTree.host.name.rules": "請輸入連接名稱", 127 | "ResourceTree.host.ip": "Ip 或域名", 128 | "ResourceTree.host.ip.rules": "請輸入 Ip 或域名", 129 | "ResourceTree.host.port": "端口", 130 | "ResourceTree.host.port.rules": "請輸入端口", 131 | "ResourceTree.host.password": "密碼", 132 | "ResourceTree.host.connectionMode": "連接模式", 133 | "ResourceTree.host.connectionMode.direct": "直連", 134 | "ResourceTree.host.connectionMode.sentinel": "哨兵", 135 | "ResourceTree.host.connectionMode.cluster": "集群", 136 | "ResourceTree.host.sentinel.password": "哨兵密碼", 137 | "ResourceTree.host.test": "測試", 138 | "ResourceTree.host.test.button": "測試連接", 139 | "ResourceTree.host.description": "描述", 140 | "ResourceTree.host.description.detail": "1.哨兵模式僅需要填寫一個哨兵節點的 Ip 或域名; 2.集群模式只需要填寫一個群集節點的 Ip 或域名", 141 | "ResourceTree.end": "#### ResourceTree ####", 142 | 143 | "electron.menu.start": "#### electron.menu.start ####", 144 | "electron.menu.file": "文件", 145 | "electron.menu.file.import.connection": "導入連接", 146 | "electron.menu.file.export.connection": "導出連接", 147 | "electron.menu.file.reset.connection": "重置連接", 148 | "electron.menu.file.system.Configuration": "系統配置", 149 | "electron.menu.file.exit": "退出", 150 | "electron.menu.edit": "編輯", 151 | "electron.menu.edit.undo": "撤消", 152 | "electron.menu.edit.redo": "重做", 153 | "electron.menu.edit.cut": "剪切", 154 | "electron.menu.edit.copy": "復制", 155 | "electron.menu.edit.paste": "粘貼", 156 | "electron.menu.edit.select.all": "全選", 157 | "electron.menu.view": "查看", 158 | "electron.menu.view.reload": "重新加載", 159 | "electron.menu.view.toggle.full.screen": "切換全屏", 160 | "electron.menu.view.switch.dev.tools": "切換開發人員工具", 161 | "electron.menu.window": "窗口", 162 | "electron.menu.window.minimize": "最小化", 163 | "electron.menu.window.close": "關閉", 164 | "electron.menu.help": "幫助", 165 | "electron.menu.help.minimize": "最小化", 166 | "electron.menu.help.submit.issues.github": "提交問題(github)", 167 | "electron.menu.help.submit.issues.gitee": "提交問題(gitee)", 168 | "electron.menu.help.officail.website": "官方網站", 169 | "electron.menu.help.about": "關於 QuickRedis", 170 | "electron.menu.end": "#### electron.menu.end ####", 171 | 172 | "proxy.use": "使用代理", 173 | "proxy.host": "代理Host", 174 | "proxy.sshport": "SSH端口", 175 | "proxy.username": "SSH用戶名", 176 | "proxy.password": "代理密碼", 177 | "proxy.sshkeypath": "代理私鑰路徑", 178 | "proxy.connecterror": "代理連接失敗", 179 | "proxy.privateKey.not.exist": "秘鑰文件錯誤", 180 | 181 | "notification.start": "#### notification ####", 182 | "notification.support.host.key.tree.title": "新增功能 - 使用目錄顯示和操作keys", 183 | "notification.support.host.key.tree.description": "啟用該功能的方法:主菜單 -> 文件 -> 系統設置 -> 設置分隔符", 184 | "notification.end00": "#### notification ####" 185 | } 186 | -------------------------------------------------------------------------------- /public/main.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow, Menu, dialog } = require("electron"); 2 | const Log = require("electron-log"); 3 | const path = require("path"); 4 | const menu = require("./modules/menu"); 5 | const ipcEvent = require("./modules/ipcEvent"); 6 | let mainWindow; 7 | 8 | /** 9 | *创建主进程窗口 10 | * 11 | */ 12 | function createWindow() { 13 | // 添加log 14 | let userDataDir = app.getPath("userData"); 15 | Log.transports.file.file = userDataDir + "/logs/info.log"; 16 | // 只允许启动一个进程 17 | const gotTheLock = app.requestSingleInstanceLock(); 18 | if (!gotTheLock) { 19 | app.quit(); 20 | } else { 21 | app.on("second-instance", (event, commandLine, workingDirectory) => { 22 | // 当运行第二个实例时,将会聚焦到mainWindow这个窗口 23 | if (mainWindow) { 24 | if (mainWindow.isMinimized()) { 25 | mainWindow.restore(); 26 | } 27 | mainWindow.focus(); 28 | mainWindow.once("ready-to-show", () => { 29 | mainWindow.show(); 30 | }); 31 | } 32 | }); 33 | } 34 | // 添加开发插件 35 | if (!app.isPackaged) { 36 | // dev 37 | const { 38 | default: installExtension, 39 | REACT_DEVELOPER_TOOLS, 40 | } = require("electron-devtools-installer"); 41 | app.whenReady().then(() => { 42 | installExtension(REACT_DEVELOPER_TOOLS) 43 | .then((name) => console.log(`Added Extension: ${name}`)) 44 | .catch((err) => console.log("An error occurred: ", err)); 45 | }); 46 | } 47 | // 创建BrowserWindow 48 | let openDevTools = true; 49 | if (app.isPackaged) { 50 | // 生产环境,不开启devtools 51 | openDevTools = false; 52 | } 53 | mainWindow = new BrowserWindow({ 54 | show: false, 55 | webPreferences: { 56 | nodeIntegration: true, 57 | preload: path.join(__dirname, "./preload.js"), 58 | devTools: openDevTools, 59 | enableRemoteModule: true, 60 | contextIsolation: false, 61 | }, 62 | backgroundColor: "#EBEBEB", 63 | }); 64 | 65 | // 添加菜单 66 | const aplicationMenu = Menu.buildFromTemplate(menu.init(mainWindow)); 67 | Menu.setApplicationMenu(aplicationMenu); 68 | // 初始化事件 69 | ipcEvent.init(mainWindow); 70 | // 最大化 71 | mainWindow.maximize(); 72 | 73 | if (!app.isPackaged) { 74 | // 非打包状态,表示开发环境 75 | mainWindow.loadURL("http://localhost:3000/"); 76 | // Open the DevTools. 77 | mainWindow.webContents.openDevTools(); 78 | } else { 79 | // 打包状态,表示生产环境 80 | mainWindow.loadURL( 81 | `file://${__dirname}/index.html?version=${app.getVersion()}` 82 | ); 83 | } 84 | // 关闭窗口 85 | mainWindow.on("closed", function () { 86 | mainWindow = null; 87 | }); 88 | // 在加载页面时,渲染进程第一次完成绘制时,如果窗口还没有被显示,渲染进程会发出 ready-to-show 事件 。 在此事件后显示窗口将没有视觉闪烁 89 | mainWindow.once("ready-to-show", () => { 90 | mainWindow.show(); 91 | }); 92 | 93 | // 吃掉当用户点击鼠标返回按钮 94 | mainWindow.on("app-command", (e, cmd) => { 95 | if (cmd === "browser-backward" && mainWindow.webContents.canGoBack()) { 96 | // 啥事都不干 97 | } 98 | }); 99 | // 崩溃处理 100 | mainWindow.webContents.on("crashed", () => { 101 | const options = { 102 | type: "info", 103 | title: "渲染器进程崩溃", 104 | message: "这个进程已经崩溃.", 105 | buttons: ["重载", "关闭"], 106 | }; 107 | dialog.showMessageBox(options, (index) => { 108 | if (index === 0) { 109 | mainWindow.reload(); 110 | } else { 111 | mainWindow.close(); 112 | } 113 | }); 114 | }); 115 | } 116 | 117 | app.allowRendererProcessReuse = false; 118 | 119 | app.on("ready", createWindow); 120 | 121 | //关闭程序 122 | app.on("window-all-closed", function () { 123 | if (process.platform !== "darwin") { 124 | app.quit(); 125 | } 126 | }); 127 | 128 | app.on("activate", function () { 129 | if (mainWindow === null) createWindow(); 130 | }); 131 | 132 | // GPU进程崩溃 133 | app.on("gpu-process-crashed", function () { 134 | Log.error("[cmd=main] gpu-process-crashed"); 135 | app.exit(0); 136 | }); 137 | -------------------------------------------------------------------------------- /public/modules/ElectronIntlUniversal.js: -------------------------------------------------------------------------------- 1 | let Log = require("electron-log"); 2 | const { app } = require("electron"); 3 | let fs = require("fs"); 4 | let path = require("path"); 5 | let lodash = require("lodash"); 6 | /** 7 | * electron 多语言 8 | */ 9 | 10 | const ElectronIntlUniversal = { 11 | langData: {}, 12 | /** 13 | * 初始化 14 | */ 15 | init: () => { 16 | // 导入语言配置文件 17 | let currentLocale = ElectronIntlUniversal.readSystemConfig().lang; 18 | let langPath = path.join( 19 | __dirname, 20 | "./../locales/" + currentLocale + ".json" 21 | ); 22 | let langJsonData = undefined; 23 | try { 24 | langJsonData = fs.readFileSync(langPath, "utf-8"); 25 | } catch (e) { 26 | Log.error("[cmd=ElectronIntlUniversal] init error", langPath, e); 27 | } 28 | ElectronIntlUniversal.langData = JSON.parse(langJsonData); 29 | }, 30 | get: (key) => { 31 | let result = lodash.get(ElectronIntlUniversal.langData, key); 32 | if (result === null) { 33 | return key; 34 | } else { 35 | return result; 36 | } 37 | }, 38 | LOCALES: [ 39 | { 40 | label: "English", 41 | value: "en", 42 | }, 43 | { 44 | label: "简体中文", 45 | value: "zh-CN", 46 | }, 47 | { 48 | label: "繁體中文", 49 | value: "zh-TW", 50 | }, 51 | { 52 | label: "Español", 53 | value: "es", 54 | }, 55 | { 56 | label: "Português", 57 | value: "pt", 58 | }, 59 | { 60 | label: "русский", 61 | value: "ru", 62 | }, 63 | { 64 | label: "日本語", 65 | value: "ja", 66 | }, 67 | { 68 | label: "Deutsche", 69 | value: "de", 70 | }, 71 | { 72 | label: "français", 73 | value: "fr", 74 | }, 75 | { 76 | label: "한국어", 77 | value: "ko", 78 | }, 79 | { 80 | label: "Tiếng Việt", 81 | value: "vi", 82 | }, 83 | { 84 | label: "čeština", 85 | value: "cs", 86 | }, 87 | { 88 | label: "bahasa Indonesia", 89 | value: "id", 90 | }, 91 | { 92 | label: "italiano", 93 | value: "it", 94 | }, 95 | { 96 | label: "Nederlands", 97 | value: "nl", 98 | }, 99 | { 100 | label: "Polskie", 101 | value: "pl", 102 | }, 103 | { 104 | label: "Український", 105 | value: "uk", 106 | }, 107 | ], 108 | /** 109 | * 获取 系统配置 文件路径 110 | * @static 111 | * @returns 112 | * @memberof ElectronIntlUniversal 113 | */ 114 | getSystemConfigFilePath: () => { 115 | const { app } = require("electron"); 116 | let userDataPath = app.getPath("userData"); 117 | let filePath = userDataPath + "/system_config.json"; 118 | return filePath; 119 | }, 120 | /** 121 | *读取系统配置文件 122 | * 123 | * @static 124 | * @memberof ElectronIntlUniversal 125 | */ 126 | readSystemConfig: () => { 127 | let systemConfigData = undefined; 128 | let filePath = undefined; 129 | try { 130 | filePath = ElectronIntlUniversal.getSystemConfigFilePath(); 131 | systemConfigData = fs.readFileSync(filePath, "utf-8"); 132 | } catch (e) { 133 | Log.error( 134 | "[cmd=ElectronIntlUniversal] readSystemConfig error", 135 | filePath, 136 | e 137 | ); 138 | } 139 | if (systemConfigData !== undefined) { 140 | systemConfigData = JSON.parse(systemConfigData); 141 | } else { 142 | let userLocale = app.getLocale(); 143 | let locale = undefined; 144 | for (let l of ElectronIntlUniversal.LOCALES.values()) { 145 | if (userLocale.startsWith(l.value)) { 146 | locale = l.value; 147 | } 148 | } 149 | if (locale === undefined) { 150 | locale = "en"; 151 | } 152 | systemConfigData = { lang: locale, splitSign: ":" }; 153 | } 154 | return systemConfigData; 155 | }, 156 | }; 157 | module.exports = ElectronIntlUniversal; 158 | -------------------------------------------------------------------------------- /public/modules/ipcEvent.js: -------------------------------------------------------------------------------- 1 | const { app, dialog, ipcMain } = require("electron"); 2 | module.exports = { 3 | init: (mainWindow) => { 4 | // 处理显示消息事件 5 | ipcMain.on("show-message", (event, arg) => { 6 | dialog.showMessageBox(mainWindow, { 7 | type: arg.type, 8 | title: arg.title, 9 | detail: arg.detail, 10 | }); 11 | }); 12 | // 处理获取操作系统事件 13 | ipcMain.on("get-platform", (event, arg) => { 14 | event.sender.send("get-platform-reply", process.platform); 15 | }); 16 | 17 | // 处理获取mac地址事件 18 | require("getmac").getMac(function (err, macAddress) { 19 | if (err || !macAddress) { 20 | macAddress = "default"; 21 | } 22 | macAddress = macAddress.split(":").join(""); 23 | ipcMain.on("get-host-url-params", (event, arg) => { 24 | let params = 25 | "NextId=" + macAddress + "&version=" + app.getVersion(); 26 | event.sender.send("get-host-url-params-reply-" + arg, params); 27 | }); 28 | }); 29 | }, 30 | }; 31 | -------------------------------------------------------------------------------- /public/preload.js: -------------------------------------------------------------------------------- 1 | // All of the Node.js APIs are available in the preload process. 2 | // It has the same sandbox as a Chrome extension. 3 | window.addEventListener('DOMContentLoaded', () => { 4 | const replaceText = (selector, text) => { 5 | const element = document.getElementById(selector) 6 | if (element) element.innerText = text 7 | } 8 | 9 | for (const type of ['chrome', 'node', 'electron']) { 10 | replaceText(`${type}-version`, process.versions[type]) 11 | } 12 | }) 13 | window.require = require; 14 | -------------------------------------------------------------------------------- /public/renderer.js: -------------------------------------------------------------------------------- 1 | // This file is required by the index.html file and will 2 | // be executed in the renderer process for that window. 3 | // No Node.js APIs are available in this process because 4 | // `nodeIntegration` is turned off. Use `preload.js` to 5 | // selectively enable features needed in the rendering 6 | // process. -------------------------------------------------------------------------------- /snap/snapcraft.yaml: -------------------------------------------------------------------------------- 1 | 2 | # After registering a name on build.snapcraft.io, commit an uncommented line: 3 | name: quickredis 4 | version: '0.1' # just for humans, typically '1.2+git' or '1.3.2' 5 | summary: Single-line elevator pitch for your amazing snap # 79 char long summary 6 | description: | 7 | This is my-snap's description. You have a paragraph or two to tell the 8 | most important story about your snap. Keep it under 100 words though, 9 | we live in tweetspace and your description wants to look good in the snap 10 | store. 11 | 12 | grade: devel # must be 'stable' to release into candidate/stable channels 13 | confinement: devmode # use 'strict' once you have the right plugs and slots 14 | 15 | parts: 16 | my-part: 17 | # See 'snapcraft plugins' 18 | plugin: nil 19 | 20 | -------------------------------------------------------------------------------- /src/__test_/buffer.test.js: -------------------------------------------------------------------------------- 1 | import { sortedUniq } from "lodash"; 2 | import BufferUtils from "./../utils/BufferUtils"; 3 | test("bufToHex", () => { 4 | let str1 = "quickredis快快"; 5 | let buffer1 = Buffer.from(str1); 6 | // 1. 长度为16的可见字符 7 | let bufVisible1 = BufferUtils.bufferVisible(buffer1); 8 | expect(buffer1.length).toBe(16); 9 | expect(bufVisible1).toBe(true); 10 | expect(buffer1.toString()).toBe(str1); 11 | expect(BufferUtils.bufferToString(buffer1)).toBe(str1); 12 | // 2. 不可见字符 13 | let str2 = "\\xac\\xed:POST_USER_ID:4995_114351107008778"; 14 | let buffer2 = BufferUtils.hexToBuffer(str2); 15 | let bufVisible2 = BufferUtils.bufferVisible(buffer2); 16 | expect(buffer2.length).toBe(36); 17 | expect(bufVisible2).toBe(false); 18 | expect(BufferUtils.bufferToString(buffer2)).toEqual( 19 | expect.not.stringMatching(str2) 20 | ); 21 | // 3. hexToBuffer 22 | let hex3 = "\\xac\\xed\\x00\\x05t\\x00\\x1bspring.data.redis:111:22282"; 23 | let buffer3 = BufferUtils.hexToBuffer(hex3); 24 | let hex3Orgi = BufferUtils.bufferToString(buffer3); 25 | expect(hex3Orgi).toBe(hex3); 26 | }); 27 | -------------------------------------------------------------------------------- /src/__test_/lodash.test.js: -------------------------------------------------------------------------------- 1 | var lodash = require("lodash"); 2 | test("lodash", () => { 3 | var users = [ 4 | { 'user': 'fred', 'age': 48 }, 5 | { 'user': 'barney', 'age': 34 }, 6 | { 'user': 'fred', 'age': 40 }, 7 | { 'user': 'barney', 'age': 36 } 8 | ]; 9 | // 以 `user` 升序排序 再 `age` 以降序排序。 10 | users = lodash.orderBy(users, ['user', 'age'], ['asc', 'desc']); 11 | console.log(users); 12 | lodash.uniqWith(); 13 | let truncateResult = lodash.truncate( 14 | "GeeksforGeeks, is a computer science portal. GeeksforGeeks GeeksforGeeks GeeksforGeeks", 15 | { 16 | length: 22, 17 | omission: "***", 18 | } 19 | ); 20 | expect(truncateResult).toBe("GeeksforGeeks, is a***"); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import "antd/dist/antd.css"; 3 | import ResourceTree from "@/pages/ResourceTree"; 4 | import SystemConfig from "@/components/SystemConfig"; 5 | import LocaleInit from "@/components/LocaleInit"; 6 | import HostTag from "@/pages/HostTag"; 7 | import SplitPane from "react-split-pane"; 8 | import HeartbeatService from "@/services/HeartbeatService"; 9 | import CheckUpdateService from "@/services/CheckUpdateService"; 10 | import "@/app/index.css"; 11 | 12 | class App extends Component { 13 | // left width = 300(minSize)+15(line)+ 14 | componentDidMount() { 15 | window.addEventListener("resize", this.resize.bind(this)); 16 | this.resize(); 17 | HeartbeatService.start(); 18 | CheckUpdateService.start(); 19 | } 20 | resize() { 21 | this.refs.hostTagDiv.style.width = 22 | window.innerWidth - 23 | this.refs.resourceTreeDiv.offsetWidth - 24 | 30 + 25 | "px"; 26 | } 27 | componentWillUnmount() { 28 | window.removeEventListener("resize", this.resize); 29 | } 30 | render() { 31 | return ( 32 | 38 | (document.body.style.cursor = "col-resize") 39 | } 40 | onDragFinished={() => { 41 | document.body.style.cursor = "auto"; 42 | this.resize(); 43 | }} 44 | > 45 |
53 | 54 | 55 | 56 |
57 |
58 | 59 |
60 |
61 | ); 62 | } 63 | } 64 | 65 | export default App; 66 | -------------------------------------------------------------------------------- /src/app/index.css: -------------------------------------------------------------------------------- 1 | .Resizer { 2 | background: #000; 3 | opacity: 0.2; 4 | z-index: 1; 5 | -moz-box-sizing: border-box; 6 | -webkit-box-sizing: border-box; 7 | box-sizing: border-box; 8 | -moz-background-clip: padding; 9 | -webkit-background-clip: padding; 10 | background-clip: padding-box; 11 | } 12 | 13 | .Resizer:hover { 14 | -webkit-transition: all 1s ease; 15 | transition: all 1s ease; 16 | } 17 | 18 | .Resizer.horizontal { 19 | height: 15px; 20 | margin: -5px 0; 21 | border-top: 5px solid rgba(255, 255, 255, 0); 22 | border-bottom: 5px solid rgba(255, 255, 255, 0); 23 | cursor: row-resize; 24 | width: 100%; 25 | } 26 | 27 | .Resizer.horizontal:hover { 28 | border-top: 5px solid rgba(0, 0, 0, 0.5); 29 | border-bottom: 5px solid rgba(0, 0, 0, 0.5); 30 | } 31 | 32 | .Resizer.vertical { 33 | width: 15px; 34 | margin: 0 -5px; 35 | border-left: 5px solid rgba(255, 255, 255, 0); 36 | border-right: 5px solid rgba(255, 255, 255, 0); 37 | cursor: col-resize; 38 | } 39 | 40 | .Resizer.vertical:hover { 41 | border-left: 5px solid rgba(0, 0, 0, 0.5); 42 | border-right: 5px solid rgba(0, 0, 0, 0.5); 43 | } 44 | .Resizer.disabled { 45 | cursor: not-allowed; 46 | } 47 | .Resizer.disabled:hover { 48 | border-color: transparent; 49 | } 50 | -------------------------------------------------------------------------------- /src/components/ErrorBoundary/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { message } from "antd"; 3 | import Log from "@/services/LogService"; 4 | /** 5 | *异常处理 6 | * 7 | * @class ErrorBoundary 8 | * @extends {React.Component} 9 | */ 10 | class ErrorBoundary extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | this.state = { hasError: false, errorMsg: "" }; 14 | } 15 | 16 | static getDerivedStateFromError(error) { 17 | // 显示错误到ui 18 | return { hasError: true, errorMsg: error }; 19 | } 20 | 21 | componentDidCatch(error, errorInfo) { 22 | // 这里上报错误或者打印错误日志 23 | Log.error("[cmd=ErrorBoundary] componentDidCatch error", error, errorInfo); 24 | } 25 | 26 | render() { 27 | if (this.state.hasError) { 28 | message.error( 29 | "An exception occurs, please report to the official github" + 30 | this.state.errorMsg 31 | ); 32 | this.setState({ hasError: false, errorMsg: "" }); 33 | } 34 | return this.props.children; 35 | } 36 | } 37 | export default ErrorBoundary; 38 | -------------------------------------------------------------------------------- /src/components/LocaleInit/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import LocaleUtils from "@/utils/LocaleUtils"; 3 | import intl from "react-intl-universal"; 4 | require("intl/locale-data/jsonp/en.js"); 5 | require("intl/locale-data/jsonp/zh.js"); 6 | require("intl/locale-data/jsonp/fr.js"); 7 | require("intl/locale-data/jsonp/ja.js"); 8 | /** 9 | * 系统配置 10 | */ 11 | class LocaleInit extends React.Component { 12 | constructor(props) { 13 | super(props); 14 | // 导入语言配置文件 15 | let currentLocale = LocaleUtils.readSystemConfig().lang; 16 | intl.init({ 17 | currentLocale, 18 | locales: { 19 | [currentLocale]: require("./../../../public/locales/" + 20 | currentLocale), 21 | }, 22 | }); 23 | } 24 | render() { 25 | return
; 26 | } 27 | } 28 | 29 | export default LocaleInit; 30 | -------------------------------------------------------------------------------- /src/components/QuickMonacoEditor/index.js: -------------------------------------------------------------------------------- 1 | import MonacoEditor from "react-monaco-editor"; 2 | import { Row, Col, Button, Space, message } from "antd"; 3 | import React from "react"; 4 | import intl from "react-intl-universal"; 5 | const pako = require('pako'); 6 | 7 | /** 8 | * 扩展 MonacoEditor 9 | * 10 | * @class QuickMonacoEditor 11 | * @extends {MonacoEditor} 12 | */ 13 | class QuickMonacoEditor extends React.Component { 14 | // MonacoEditor Options 15 | MONACO_EDITOR_OPTIONS = { 16 | minimap: { 17 | enabled: false, 18 | }, 19 | wordWrap: "on", 20 | fontSize: 14, 21 | scrollbar: { 22 | useShadows: true, 23 | vertical: "visible", 24 | horizontal: "visible", 25 | horizontalSliderSize: 20, 26 | verticalSliderSize: 20, 27 | horizontalScrollbarSize: 20, 28 | verticalScrollbarSize: 20, 29 | }, 30 | autoIndent: false, 31 | autoClosingQuotes: true, 32 | autoClosingBrackets: true, 33 | autoClosingOvertype: true, 34 | colorDecorators: true, 35 | copyWithSyntaxHighlighting: true, 36 | cursorSmoothCaretAnimation: true, 37 | contextmenu: true, 38 | overviewRulerBorder: true, 39 | mouseWheelZoom: true, 40 | fontFamily: "Consolas, 'Courier New', monospace", 41 | roundedSelection: true, 42 | automaticLayout: true, 43 | }; 44 | /** 45 | *组件更新 46 | * 47 | * @param {*} prevProps 48 | * @memberof QuickMonacoEditor 49 | */ 50 | componentDidUpdate(prevProps) { 51 | this.refs.monacoEditor.editor.setSelection({ 52 | startLineNumber: 1, 53 | startColumn: 1, 54 | endLineNumber: 1, 55 | endColumn: 1, 56 | }); 57 | this.refs.monacoEditor.editor.layout(); 58 | } 59 | /** 60 | * 格式化 Json 61 | */ 62 | formatJson() { 63 | try { 64 | let formattedStr = JSON.stringify( 65 | JSON.parse(this.props.value), 66 | null, 67 | 4 68 | ); 69 | this.props.onChange(formattedStr); 70 | } catch (error) { 71 | message.error("Json format error:" + error); 72 | } 73 | } 74 | /** 75 | *monacoEditor did mount 76 | * 77 | * @param {*} monacoEditor 78 | * @param {*} monaco 79 | * @memberof QuickMonacoEditor 80 | */ 81 | editorDidMount(monacoEditor, monaco) { 82 | monacoEditor.addCommand( 83 | monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S, 84 | () => { 85 | this.props.saveValue(); 86 | } 87 | ); 88 | monacoEditor.focus(); 89 | } 90 | /** 91 | * 删除 Json 空格 92 | */ 93 | delBlankJson() { 94 | try { 95 | let formattedStr = JSON.stringify(JSON.parse(this.props.value)); 96 | this.props.onChange(formattedStr); 97 | } catch (error) { 98 | message.error("Json format error:" + error); 99 | } 100 | } 101 | 102 | /** 103 | * 解压gzip 104 | */ 105 | ungzip() { 106 | try { 107 | let targetData = this.props.value; 108 | // 将base64编码的数据转换成原始的压缩数据 109 | const compressedData = new Uint8Array(atob(targetData).split('').map(char => char.charCodeAt())); 110 | console.log(compressedData); 111 | // 对压缩数据进行解压缩处理 112 | const data = pako.ungzip(compressedData, { to: 'string' }); 113 | this.props.onChange(data); 114 | } catch (error) { 115 | message.error("Json format error:" + error); 116 | } 117 | } 118 | 119 | /** 120 | * 压缩gzip 121 | */ 122 | gzip() { 123 | try { 124 | let oriData = this.props.value; 125 | const compressedData = pako.gzip(oriData); 126 | const base64Data = btoa(String.fromCharCode.apply(null, compressedData)); 127 | this.props.onChange(base64Data); 128 | } catch (error) { 129 | message.error("Json format error:" + error); 130 | } 131 | 132 | } 133 | 134 | render() { 135 | return ( 136 |
137 | 138 | 139 | 140 | 141 | 144 | 147 | 150 | 153 | 154 | 155 | 156 |
157 | { 166 | this.props.onChange(value); 167 | }} 168 | editorDidMount={this.editorDidMount.bind( 169 | this 170 | )} 171 | /> 172 |
173 | 174 |
175 |
176 |
177 | ); 178 | } 179 | } 180 | export default QuickMonacoEditor; 181 | -------------------------------------------------------------------------------- /src/components/SystemConfig/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Modal, Row, Col, Select, Input, Tooltip, Checkbox } from "antd"; 3 | import LocaleUtils from "@/utils/LocaleUtils"; 4 | import intl from "react-intl-universal"; 5 | import { ExclamationCircleOutlined } from "@ant-design/icons"; 6 | const { Option } = Select; 7 | const { confirm } = Modal; 8 | const { ipcRenderer, remote } = window.require("electron"); 9 | /** 10 | * 系统配置 11 | */ 12 | class SystemConfig extends React.Component { 13 | needRestart = false; 14 | state = { 15 | visible: false, 16 | config: { lang: "", splitSign: "", autoFormatJson: true }, 17 | }; 18 | componentDidMount() { 19 | // 重置连接事件 20 | ipcRenderer.on("system-config", (event, arg) => { 21 | this.showModal(); 22 | }); 23 | } 24 | 25 | showModal = () => { 26 | this.setState({ 27 | visible: true, 28 | config: LocaleUtils.readSystemConfig(), 29 | }); 30 | }; 31 | 32 | handleOk = (e) => { 33 | this.setState({ 34 | visible: false, 35 | }); 36 | LocaleUtils.saveSystemConfig(this.state.config); 37 | if (this.needRestart) { 38 | this.needRestart = false; 39 | confirm({ 40 | title: intl.get("common.notice"), 41 | icon: , 42 | content: intl.get("SystemConfig.needRestart"), 43 | onOk() { 44 | remote.app.quit(); 45 | }, 46 | onCancel() {}, 47 | }); 48 | } 49 | }; 50 | 51 | handleCancel = (e) => { 52 | this.needRestart = false; 53 | this.setState({ 54 | visible: false, 55 | }); 56 | }; 57 | /** 58 | *修改语言 59 | * 60 | * @param {*} val 61 | * @memberof SystemConfig 62 | */ 63 | handleLangChange(val) { 64 | this.setState({ 65 | config: { ...this.state.config, lang: val }, 66 | }); 67 | this.needRestart = true; 68 | } 69 | /** 70 | *修改分隔符 71 | * 72 | * @memberof SystemConfig 73 | */ 74 | handleSplitSignChange = (event) => { 75 | this.setState({ 76 | config: { ...this.state.config, splitSign: event.target.value }, 77 | }); 78 | this.needRestart = true; 79 | }; 80 | /** 81 | *修改自动格式化json 82 | * 83 | * @memberof SystemConfig 84 | */ 85 | handleAutoFormatJsonChange = (event) => { 86 | this.setState({ 87 | config: { 88 | ...this.state.config, 89 | autoFormatJson: event.target.checked, 90 | }, 91 | }); 92 | }; 93 | 94 | render() { 95 | let options = LocaleUtils.LOCALES.map((l) => ( 96 | 99 | )); 100 | return ( 101 |
102 | 108 | 109 | {intl.get("SystemConfig.lang")} 110 | 111 | 119 | 120 | 121 | {intl.get("SystemConfig.tree.split")} 122 | 123 | 124 | 125 | 132 | 133 | 134 | 135 | {intl.get("SystemConfig.auto.format.json")} 136 | 137 | 138 | 142 | 143 | 144 | 145 |
146 | ); 147 | } 148 | } 149 | export default SystemConfig; 150 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import App from "@/app/App"; 4 | import { Provider } from "react-redux"; 5 | import store from "@/redux/store"; 6 | import ErrorBoundary from "@/components/ErrorBoundary"; 7 | import * as serviceWorker from "@/serviceWorker"; 8 | 9 | ReactDOM.render( 10 | 11 | 12 | 13 | 14 | , 15 | document.getElementById("root") 16 | ); 17 | 18 | serviceWorker.unregister(); 19 | -------------------------------------------------------------------------------- /src/pages/CommonCss/zebra.css: -------------------------------------------------------------------------------- 1 | .hostKeyZebraHighlight { 2 | background-color: #f8f8f9; 3 | } 4 | .hostKeyCursor { 5 | cursor: pointer; 6 | } 7 | .hostKeySelected { 8 | background-color: #ebf7ff; 9 | } 10 | -------------------------------------------------------------------------------- /src/pages/HostCornerMarker/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | /** 4 | * HostCornerMarker 5 | * 作者: 修罗大人 6 | * 时间: 2021-04-16 14:04:00 7 | * 描述: 自定义组件,实现角标提示 8 | * @class HostCornerMarker 9 | * @extends {Component} 10 | */ 11 | class HostCornerMarker extends Component { 12 | render() { 13 | return ( 14 | 15 | {this.props.title}({this.props.total}) 16 | 17 | ); 18 | } 19 | } 20 | 21 | export default HostCornerMarker; 22 | -------------------------------------------------------------------------------- /src/pages/HostKeyNotExist/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { Result } from "antd"; 3 | import intl from "react-intl-universal"; 4 | /** 5 | * HostKeyNotExist-keyType 不存在 6 | * 7 | * @class HostKeyList 8 | * @extends {Component} 9 | */ 10 | class HostKeyNotExist extends Component { 11 | state = { msg: "" }; 12 | UNSAFE_componentWillReceiveProps(nextProps) { 13 | this.props = nextProps; 14 | this.setState({ msg: intl.get("HostKey.key.not.exist") }); 15 | } 16 | render() { 17 | return ( 18 |
19 | 20 |
21 | ); 22 | } 23 | } 24 | 25 | export default HostKeyNotExist; 26 | -------------------------------------------------------------------------------- /src/pages/HostKeyString/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { Button, Space, Form, message, Tag } from "antd"; 3 | import HostKeyHeader from "@/pages/HostKeyHeader"; 4 | import Log from "@/services/LogService"; 5 | import QuickMonacoEditor from "@/components/QuickMonacoEditor"; 6 | import intl from "react-intl-universal"; 7 | import LocaleUtils from "@/utils/LocaleUtils"; 8 | import BufferUtils from "@/utils/BufferUtils"; 9 | var lodash = window.require("lodash"); 10 | 11 | /** 12 | *hostkey-string-管理 13 | * 14 | * @class HostKeyString 15 | * @extends {Component} 16 | */ 17 | class HostKeyString extends Component { 18 | initValues = { value: "" }; 19 | /** 20 | * 只执行一次。第一次渲染后调用,只在客户端 21 | */ 22 | componentDidMount() { 23 | let redisKey = this.props.redisKey; 24 | this.refreshValue(redisKey); 25 | } 26 | /** 27 | *组件更新 28 | * 29 | * @param {*} prevProps 30 | * @memberof HostKeyString 31 | */ 32 | componentDidUpdate(prevProps) { 33 | if (this.props.redisKey !== prevProps.redisKey) { 34 | let redisKey = this.props.redisKey; 35 | this.refreshValue(redisKey); 36 | } 37 | } 38 | /** 39 | * 刷新 value 40 | */ 41 | refreshValue(key) { 42 | let redis = this.props.node.redis; 43 | let form = this.refs.form; 44 | if (form === undefined) { 45 | return; 46 | } 47 | let bufferKey = BufferUtils.hexToBuffer(key); 48 | redis.getBuffer(bufferKey).then( 49 | (value) => { 50 | if (value === null || value === undefined) { 51 | value = ""; 52 | } 53 | value = BufferUtils.bufferToString(value); 54 | value = lodash.truncate(value, { 55 | length: 40960, 56 | omission: "......", 57 | }); 58 | let autoFormatJson = 59 | LocaleUtils.readSystemConfig(false).autoFormatJson; 60 | if (autoFormatJson) { 61 | try { 62 | let formatJson = JSON.stringify( 63 | JSON.parse(value), 64 | null, 65 | 4 66 | ); 67 | value = formatJson; 68 | } catch (error) { 69 | // 非json格式,忽略 70 | } 71 | } 72 | form.setFieldsValue({ value: value }); 73 | }, 74 | (err) => { 75 | message.error("" + err); 76 | Log.error("HostKeyString refreshValue error", err); 77 | } 78 | ); 79 | } 80 | /** 81 | * 保存值 82 | */ 83 | saveValue() { 84 | // 取form的redisKey值 85 | let redisKey = 86 | this.refs.hostKeyHeader.refs.form.getFieldValue("redisKey"); 87 | if (redisKey === "") { 88 | // 如果没有输入,则提示 89 | message.error(intl.get("HostKey.String.save.input.key")); 90 | return; 91 | } 92 | // 更新 state oldRedisKey 93 | this.refs.hostKeyHeader.setState({ oldRedisKey: redisKey }); 94 | let redis = this.props.node.redis; 95 | let form = this.refs.form; 96 | if (form === undefined) { 97 | return; 98 | } 99 | let newValue = form.getFieldValue("value"); 100 | let newKeyBuffer = BufferUtils.hexToBuffer(redisKey); 101 | let newValueBuffer = BufferUtils.hexToBuffer(newValue); 102 | redis.set(newKeyBuffer, newValueBuffer).then( 103 | (value) => { 104 | message.info(intl.get("common.save.success")); 105 | }, 106 | (err) => { 107 | message.error("" + err); 108 | Log.error("HostKeyString saveValue error", err); 109 | } 110 | ); 111 | } 112 | render() { 113 | return ( 114 |
115 | 120 | type: string 121 | 128 |
129 | 130 | 135 | 136 |
137 | 140 |
141 |
142 | ); 143 | } 144 | } 145 | 146 | export default HostKeyString; 147 | -------------------------------------------------------------------------------- /src/pages/HostTag/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import HostContent from "@/pages/HostContent"; 3 | import HostTerminal from "@/pages/HostTerminal"; 4 | import HostUrl from "@/pages/HostUrl"; 5 | import { Tabs, Menu, Dropdown } from "antd"; 6 | import { connect } from "react-redux"; 7 | import { 8 | activeHostTab, 9 | removeHostTab, 10 | removeHostTabByType, 11 | } from "@/redux/actions/HostTabsAction"; 12 | import { OPEN_TAB_TYPE, HOST_TAB_REMOVE_TYPE } from "@/utils/constant"; 13 | import intl from "react-intl-universal"; 14 | const { TabPane } = Tabs; 15 | /** 16 | * HOST-TAB管理 17 | * 18 | * @class HostContent 19 | * @extends {Component} 20 | */ 21 | 22 | class HostTag extends Component { 23 | onTabClick = (activeKey) => { 24 | this.props.activeHostTab(activeKey); 25 | }; 26 | onEdit = (targetKey, action) => { 27 | this[action](targetKey); 28 | }; 29 | remove = (targetKey) => { 30 | this.props.removeHostTab(targetKey); 31 | }; 32 | clickHostTagMenu = (item) => { 33 | this.props.removeHostTabByType(item.key); 34 | }; 35 | /** 36 | * HostTagMenu 37 | */ 38 | HostTagMenu = ( 39 | 40 | 41 | {intl.get("HostTag.Menu.remove.rigth")} 42 | 43 | 44 | {intl.get("HostTag.Menu.remove.left")} 45 | 46 | 47 | {intl.get("HostTag.Menu.remove.other")} 48 | 49 | 50 | ); 51 | /** 52 | * HostTagMenuDropdown 53 | * @param {*} obj 54 | */ 55 | HostTagMenuDropdown = (obj) => ( 56 | 57 | {obj} 58 | 59 | ); 60 | render() { 61 | return ( 62 |
63 | 70 | {this.props.hostTabsReducer.tabs.map((tab) => ( 71 | 77 |
82 | {tab.node.type === OPEN_TAB_TYPE.CONN || 83 | tab.node.type === OPEN_TAB_TYPE.CONN_MUTI ? ( 84 | 85 | ) : ( 86 | "" 87 | )} 88 | {tab.node.type === 89 | OPEN_TAB_TYPE.CONN_TERMINAL ? ( 90 | 94 | ) : ( 95 | "" 96 | )} 97 | {tab.node.type === OPEN_TAB_TYPE.URL ? ( 98 | 102 | ) : ( 103 | "" 104 | )} 105 |
106 |
107 | ))} 108 |
109 |
110 | ); 111 | } 112 | } 113 | 114 | const mapStateToProps = (state) => { 115 | return { 116 | hostTabsReducer: state.hostTabsReducer, 117 | }; 118 | }; 119 | export default connect(mapStateToProps, { 120 | activeHostTab, 121 | removeHostTab, 122 | removeHostTabByType, 123 | })(HostTag); 124 | -------------------------------------------------------------------------------- /src/pages/HostUrl/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import uuid from "node-uuid"; 3 | const { ipcRenderer } = window.require("electron"); 4 | /** 5 | * 打开页面 6 | * 7 | * @class HostUrl 8 | * @extends {Component} 9 | */ 10 | class HostUrl extends Component { 11 | state = { url: "", hostUrlIframeKey: uuid.v4() }; 12 | 13 | componentDidMount() { 14 | setTimeout( 15 | function () { 16 | ipcRenderer.on( 17 | "get-host-url-params-reply-HostUrl", 18 | (event, arg) => { 19 | this.setState({ 20 | url: 21 | "https://redis.quick123.net/?from=QuickRedis&" + 22 | arg + 23 | "&r=" + 24 | uuid.v4(), 25 | hostUrlIframeKey: uuid.v4(), 26 | }); 27 | } 28 | ); 29 | ipcRenderer.send("get-host-url-params", "HostUrl"); 30 | }.bind(this), 31 | 2000 32 | ); 33 | } 34 | 35 | render() { 36 | return ( 37 |
38 |