.babelrc000066400000000000000000000003501517666434100124640ustar00rootroot00000000000000{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "current" } } ] ], "plugins": ["angularjs-annotate"] } .github/000077500000000000000000000000001517666434100124335ustar00rootroot00000000000000.github/workflows/000077500000000000000000000000001517666434100144705ustar00rootroot00000000000000.github/workflows/build.yml000066400000000000000000000016761517666434100163240ustar00rootroot00000000000000# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: build on: schedule: - cron: '0 0 1 * *' push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: ['lts/*'] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - run: npm i -g grunt-cli - run: npm install - run: grunt .gitignore000066400000000000000000000004201517666434100130570ustar00rootroot00000000000000/build /node_modules /*.log /*.iws .idea/workspace.xml .idea/tasks.xml .idea/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml .idea/inspectionProfiles/profiles_settings.xml node_modules/.yarn-integrity /dist .DS_Store /test-results /tests/screenshots.npmignore000066400000000000000000000004751517666434100131000ustar00rootroot00000000000000/.babelrc /.github /.idea /.vscode /.travis.yml /.scrutinizer.yml /AGENTS.* /agents /artifacts /build /corifeus-boot.json /coverage /Gruntfile.js /node_modules /playwright-report /playwright*.* /secure /src/**/* /test /test-results /tests /tsconfig.json /*.iml /*.ipr /*.iws /*.lock *.log npm-debug.log* yarn-*.log* Gruntfile.js000066400000000000000000000017441517666434100133760ustar00rootroot00000000000000const utils = require('corifeus-utils'); module.exports = (grunt) => { const builder = require(`corifeus-builder`); const gruntUtil = builder.utils; const loader = new builder.loader(grunt); loader.js({ }); grunt.registerTask('default', ['cory-npm', 'clean', 'cory-replace', 'cory:license', 'publish']); grunt.registerTask('build', ['publish']); grunt.registerTask('publish', async function() { const done = this.async() const cwd = process.cwd() try { await gruntUtil.spawn({ grunt: grunt, gruntThis: this, }, { cmd: `${cwd}/node_modules/.bin/webpack${gruntUtil.commandAddon}`, args: [ '--config', './src/builder/webpack.config.js', '--mode=production' ] }); done() } catch(e) { done(e) } }) } LICENSE000066400000000000000000000020131517666434100120740ustar00rootroot00000000000000MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.README.md000066400000000000000000000106231517666434100123540ustar00rootroot00000000000000# This is a development package For the full-blown package, please follow: https://github.com/patrikx3/redis-ui https://www.npmjs.com/package/p3x-redis-ui https://corifeus.com/redis-ui [//]: #@corifeus-header [![NPM](https://img.shields.io/npm/v/p3x-redis-ui-material.svg)](https://www.npmjs.com/package/p3x-redis-ui-material) [![Donate for PatrikX3 / P3X](https://img.shields.io/badge/Donate-PatrikX3-003087.svg)](https://paypal.me/patrikx3) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Corifeus @ Facebook](https://img.shields.io/badge/Facebook-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [![Uptime ratio (90 days)](https://network.corifeus.com/public/api/uptime-shield/31ad7a5c194347c33e5445dbaf8.svg)](https://network.corifeus.com/status/31ad7a5c194347c33e5445dbaf8) --- # 💿 The p3x-redis-ui-material web interface that connects to the p3x-redis-ui-server via http and socket.io v2026.4.340 🌌 **Bugs are evident™ - MATRIX️** 🚧 **This project is under active development!** 📢 **We welcome your feedback and contributions.** ### NodeJS LTS is supported ### 🛠️ Built on NodeJs version ```txt v24.14.1 ``` # 📦 Built on Angular ```text 21.2.6 ``` # 📝 Description [//]: #@corifeus-header:end The is the `p3x-redis-ui-material` web gui, that uses the `p3x-redis-ui-server`. It is based on Socket.IO and Angular with Angular Material, uses themes light/dark schema and internationalization (21 languages). # For development standalone For file names do not use camelCase, but use kebab-case. Folder should be named as kebab-case as well. As you can see, all code filenames are using it like that, please do not change that. Please apply the `.editorconfig` settings in your IDE. Then: ```bash npm install npm run dev ``` The frontend is available @ http://localhost:8080 [//]: #@corifeus-footer --- ## 🚀 Quick and Affordable Web Development Services If you want to quickly and affordably develop your next digital project, visit [corifeus.eu](https://corifeus.eu) for expert solutions tailored to your needs. --- ## 🌐 Powerful Online Networking Tool Discover the powerful and free online networking tool at [network.corifeus.com](https://network.corifeus.com). **🆓 Free** Designed for professionals and enthusiasts, this tool provides essential features for network analysis, troubleshooting, and management. Additionally, it offers tools for: - 📡 Monitoring TCP, HTTP, and Ping to ensure optimal network performance and reliability. - 📊 Status page management to track uptime, performance, and incidents in real time with customizable dashboards. All these features are completely free to use. --- ## ❤️ Support Our Open-Source Project If you appreciate our work, consider ⭐ starring this repository or 💰 making a donation to support server maintenance and ongoing development. Your support means the world to us—thank you! --- ### 🌍 About My Domains All my domains, including [patrikx3.com](https://patrikx3.com), [corifeus.eu](https://corifeus.eu), and [corifeus.com](https://corifeus.com), are developed in my spare time. While you may encounter minor errors, the sites are generally stable and fully functional. --- ### 📈 Versioning Policy **Version Structure:** We follow a **Major.Minor.Patch** versioning scheme: - **Major:** 📅 Corresponds to the current year. - **Minor:** 🌓 Set as 4 for releases from January to June, and 10 for July to December. - **Patch:** 🔧 Incremental, updated with each build. **🚨 Important Changes:** Any breaking changes are prominently noted in the readme to keep you informed. --- [**P3X-REDIS-UI-MATERIAL**](https://corifeus.com/redis-ui-material) Build v2026.4.340 [![NPM](https://img.shields.io/npm/v/p3x-redis-ui-material.svg)](https://www.npmjs.com/package/p3x-redis-ui-material) [![Donate for PatrikX3 / P3X](https://img.shields.io/badge/Donate-PatrikX3-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end artifacts/000077500000000000000000000000001517666434100130535ustar00rootroot00000000000000artifacts/reduce-bundle-size.txt000066400000000000000000000022451517666434100173050ustar00rootroot000000000000002020 October 18 08:00 AM -r--r----- 1 www-data www-data 2.3K Oct 17 20:38 2eb6240af39282952504b5e016895183.js -r--r----- 1 www-data www-data 2.6K Oct 17 20:38 59bde89bce5c1126ba5ee99c55ec48c8.js -r--r----- 1 www-data www-data 186K Oct 17 20:38 main.3b4993afb7ef0c773dd2.js -r--r----- 1 www-data www-data 12K Oct 17 20:38 main.82603f4092c1cd8f8cf9.css -r--r----- 1 www-data www-data 2.2M Oct 17 20:38 vendor.2bf99f4796897bbcdde3.js -r--r----- 1 www-data www-data 500K Oct 17 20:38 vendor.8cec4ee3d875369b3db2.css 2955,7 2020 October 18 11:00 AM -r-------- 1 www-data www-data 2.3K Oct 18 10:43 2eb6240af39282952504b5e016895183.js -r-------- 1 www-data www-data 2.6K Oct 18 10:43 59bde89bce5c1126ba5ee99c55ec48c8.js -r-------- 1 www-data www-data 23K Oct 18 10:43 f7186078e00d958aa2b316483dfc7e1c.js -r-------- 1 www-data www-data 1.2M Oct 18 10:43 362.chunk.js -r-------- 1 www-data www-data 189K Oct 18 10:43 main.5bb26a2fed2bb6572b27.js -r-------- 1 www-data www-data 12K Oct 18 10:43 main.f0afde82d9f3f4ba2c8d.css -r-------- 1 www-data www-data 925K Oct 18 10:43 vendor.423e956f43a2d1406ae5.js -r-------- 1 www-data www-data 500K Oct 18 10:43 vendor.8adbf377a94fd3e73b2c.css 2882,7 package.json000066400000000000000000000104161517666434100133630ustar00rootroot00000000000000{ "name": "p3x-redis-ui-material", "version": "2026.4.340", "description": "💿 The p3x-redis-ui-material web interface that connects to the p3x-redis-ui-server via http and socket.io", "corifeus": { "icon": "fas fa-database", "code": "Fireball", "opencollective": false, "build": true, "nodejs": "v24.14.1", "reponame": "redis-ui-material", "publish": true, "prefix": "p3x-", "type": "p3x", "angular": "21.2.6" }, "main": "src/index.js", "scripts": { "test": "grunt", "dev": "webpack serve --config ./src/builder/webpack.config.js", "dev-webpack": "webpack serve --config ./src/builder/webpack.config.js", "build": "grunt build && webpack --config ./src/builder/webpack.config.js --mode=production", "stats": "grunt build && WEBPACK_STATS=1 webpack --mode=production --config ./src/builder/webpack.config.js && webpack-bundle-analyzer ./dist/stats.json", "test-gui": "node node_modules/@playwright/test/cli.js test tests/ --reporter=list", "test-gui-preview": "node node_modules/@playwright/test/cli.js test tests/ --reporter=list --headed" }, "repository": { "type": "git", "url": "https://github.com/patrikx3/redis-ui-material.git" }, "keywords": [ "redis", "ui", "gui", "web", "electron", "desktop", "server", "angularjs", "javascript", "material", "dark", "light" ], "author": "Patrik Laszlo ", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@angular-devkit/build-angular": "^21.2.5", "@angular/animations": "^21", "@angular/cdk": "^21.2.4", "@angular/common": "^21", "@angular/compiler": "^21", "@angular/compiler-cli": "^21.2.6", "@angular/core": "^21", "@angular/forms": "^21", "@angular/material": "^21.2.4", "@angular/platform-browser": "^21", "@angular/platform-browser-dynamic": "^21", "@angular/router": "^21.2.6", "@babel/core": "^7.29.0", "@babel/preset-env": "^7.29.2", "@fontsource/roboto": "^5.2.10", "@fontsource/roboto-mono": "^5.2.8", "@fortawesome/fontawesome-free": "^7.2.0", "@ngtools/webpack": "^21.2.5", "@playwright/test": "^1.59.0", "babel-loader": "^10.1.1", "clean-webpack-plugin": "^4.0.0", "concurrently": "^9.2.1", "copy-webpack-plugin": "^14.0.0", "corifeus-builder": "^2025.4.135", "corifeus-utils": "^2025.4.123", "css-loader": "^7.1.4", "css-minimizer-webpack-plugin": "^8.0.0", "html-loader": "^5.1.0", "html-webpack-plugin": "^5.6.6", "humanize-duration": "^3.33.2", "js-htmlencode": "^0.3.0", "lodash": "^4.18.0", "material-design-icons-iconfont": "^6.7.0", "mini-css-extract-plugin": "^2.10.2", "mobile-detect": "^1.4.5", "playwright": "^1.59.0", "pretty-bytes": "^7.1.0", "raw-loader": "^4.0.2", "rxjs": "^7.8.2", "sass": "^1.98.0", "sass-loader": "^16.0.7", "socket.io-client": "^4.8.3", "source-map-loader": "^5.0.0", "style-loader": "^4.0.0", "terser-webpack-plugin": "^5.4.0", "timestring": "^7.0.0", "ts-loader": "^9.5.4", "typescript": "^6.0.2", "webpack": "^5.105.4", "webpack-bundle-analyzer": "^5.3.0", "webpack-cli": "^7.0.2", "webpack-dev-server": "^5.2.3", "webpack-remove-debug": "^0.1.0", "zone.js": "^0.16.1" }, "engines": { "node": ">=12.13.0" }, "homepage": "https://corifeus.com/redis-ui-material", "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "dependencies": { "@codemirror/lang-json": "^6.0.2", "@codemirror/state": "^6.6.0", "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.41.0", "@uiw/codemirror-theme-github": "^4.25.9", "codemirror": "^6.0.2", "dayjs": "^1.11.20", "uplot": "^1.6.32" } }playwright.config.ts000066400000000000000000000026031517666434100151020ustar00rootroot00000000000000import { defineConfig } from '@playwright/test'; import { existsSync, readFileSync } from 'fs'; import { resolve } from 'path'; // Auto-load secure/playwright.env if it exists (not committed to git) const envFile = resolve(__dirname, 'secure/playwright.env'); if (existsSync(envFile)) { for (const line of readFileSync(envFile, 'utf8').split('\n')) { const m = line.match(/^([^#=]+)=(.*)$/); if (m) process.env[m[1].trim()] ??= m[2].trim(); } } const productionSettingsUrl = process.env.PLAYWRIGHT_PROD_SETTINGS_URL || 'https://redis.patrikx3.com/settings'; const productionHttpUsername = process.env.PLAYWRIGHT_PROD_HTTP_USERNAME; const productionHttpPassword = process.env.PLAYWRIGHT_PROD_HTTP_PASSWORD; const productionHttpCredentials = productionHttpUsername && productionHttpPassword ? { username: productionHttpUsername, password: productionHttpPassword, origin: new URL(productionSettingsUrl).origin, } : undefined; export default defineConfig({ testDir: './tests', timeout: 30000, use: { baseURL: 'http://localhost:8080', headless: true, httpCredentials: productionHttpCredentials, viewport: { width: 1280, height: 900 }, screenshot: 'only-on-failure', }, projects: [ { name: 'chromium', use: { browserName: 'chromium' }, }, ], }); src/000077500000000000000000000000001517666434100116625ustar00rootroot00000000000000src/builder/000077500000000000000000000000001517666434100133105ustar00rootroot00000000000000src/builder/webpack.config.js000066400000000000000000000201531517666434100165270ustar00rootroot00000000000000const path = require('path'); const config = require('corifeus-builder/src/utils/config').config const webpack = require('webpack'); const { AngularWebpackPlugin } = require('@ngtools/webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin').CleanWebpackPlugin; const minimize = process.argv.includes('--mode=production'); const mode = minimize ? 'production' : 'development'; const useStats = process.env.hasOwnProperty('WEBPACK_STATS') const filenamePrefix = minimize ? '[id].[contenthash]' : '[name]' let minimizer = undefined; const top = process.cwd() const buildDir = top + `/dist`; let devtool; devtool = minimize ? false : 'source-map'; const pkg = require('../../package') // Note: 'unsafe-eval' is required for Angular JIT compiler (used during development / hybrid ngUpgrade mode). // Once fully migrated to Angular AOT compilation, 'unsafe-eval' can be removed. const cspPolicy = "default-src 'self'; script-src 'self' https://www.googletagmanager.com 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' ws: wss: http://localhost:* http://127.0.0.1:* https://www.google-analytics.com https://region1.google-analytics.com; frame-src https://redis.io; object-src 'none'; base-uri 'self'; form-action 'self'" // https://github.com/webpack-contrib/webpack-hot-middleware/tree/master/example /* https://stackoverflow.com/questions/44317394/webpack-dev-server-with-hot-reload-reloading-entire-page-with-css-changes 'webpack-dev-server/client?http://localhost:8080', 'webpack/hot/only-dev-server', */ const vendorEntry = [ top + "/src/vendor.js" ] const mainEntry = [ top + (minimize ? "/src/main.js" : '/src/main-development.js') ] const entry = { vendor: vendorEntry, main: mainEntry, // editor: editorEntry, } if (!minimize) { vendorEntry.push('webpack/hot/only-dev-server') vendorEntry.unshift('webpack-dev-server/client?http://localhost:8080/') } const plugins = [ new HtmlWebpackPlugin({ template: `${top}/src/index.html`, inject: 'head', scriptLoading: 'defer', chunks: ['vendor', 'main'], title: pkg.description, minify: minimize }), new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename: !minimize ? '[name].css' : '[id].[contenthash].css', chunkFilename: !minimize ? '[name].css' : '[id].[contenthash].css', }), ]; if (useStats) { const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; plugins.push( new BundleAnalyzerPlugin() ) } if (minimize) { plugins.unshift( new CleanWebpackPlugin() ) devtool = false; const bannerText = require('corifeus-builder').utils.license(); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); minimizer = [ new CssMinimizerPlugin(), new TerserPlugin({ parallel: true, extractComments: { condition: /^\**!|@preserve|@license|@cc_on/, filename: function (fileOptions) { return `${fileOptions.filename}.LICENSE.txt`; }, banner: function (webpackBanner) { return ` ${bannerText} For more information about all licenses, please see ${webpackBanner} `; } }, terserOptions: { compress: { warnings: false }, ecma: config.ecma, // todo found out if mangle use or not // mangle: false === keep function names // mangle: true === drop function names // for mangle true we are using angularjs-annotate with babel mangle: true, }, }), ] plugins.push( new webpack.BannerPlugin({ banner: bannerText, include: /\.css$/, exclude: /\.ts$|\.js$/, // hash:[hash], chunkhash:[chunkhash], name:[name], filebase:[filebase], query:[query], file:[file] }) ) /* https://webpack.js.org/guides/build-performance/#source-maps plugins.push( new webpack.SourceMapDevToolPlugin({ filename: 'sourcemaps/[file].map', append: '\n//# sourceMappingURL=./[url]' }) ) */ } // Auto-inject p3xr module reference for every bare `p3xr` variable access. // This replaces the global window.p3xr with a webpack module — invisible in browser console. plugins.push( new webpack.ProvidePlugin({ p3xr: path.resolve(__dirname, '../core/p3xr.js'), }) ) // Angular AOT compilation — eliminates @angular/compiler from the bundle (~1MB savings) plugins.push( new AngularWebpackPlugin({ tsconfig: path.resolve(__dirname, '../../tsconfig.json'), jitMode: false, }) ) const rules = [ { test: /\.[cm]?js$/, include: /node_modules/, resolve: { fullySpecified: false }, use: { loader: 'babel-loader', options: { compact: false, plugins: [ '@angular/compiler-cli/linker/babel', ], }, }, }, { test: /\.[jt]sx?$/, exclude: /node_modules/, loader: '@ngtools/webpack', }, { test: /\.(scss|css)$/, // exclude: [`${cwd}/src/assets/ngivr.scss`], use: [ { loader: MiniCssExtractPlugin.loader, options: { }, }, 'css-loader', 'sass-loader', ], }, { test: /\.html$/i, use: [{ loader: 'html-loader', options: { minimize: minimize, esModule: false, }, }] }, { test: /\.(png|jpe?g|gif|ico)$/, type: 'asset/resource', }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, ] let optimization = { minimize: minimize, minimizer: minimizer, } if (minimize) { } else { optimization = Object.assign(optimization, { runtimeChunk: 'single', splitChunks: { cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendor-modules', chunks: 'all', }, }, }, }) } const webpackConfig = { // watch: true, devtool: devtool, entry: entry, output: { path: buildDir, filename: `${filenamePrefix}.js`, // chunkFilename: `${filenamePrefix}.js`, // publicPath: '{{ app.url_subdir }}/webpack/', publicPath: ``, assetModuleFilename: 'assets/[hash][ext]', }, resolve: { extensions: ['.ts', '.js'], }, module: { rules: rules }, optimization: optimization, plugins: plugins, mode: mode, devServer: { headers: { 'Content-Security-Policy': cspPolicy, }, static: { directory: './src/public', staticOptions: {}, publicPath: "/", serveIndex: true, watch: true, }, host: '0.0.0.0', historyApiFallback: { rewrites: [ {from: /.*\..*/, to: '/index.html'} ] }, // hotOnly: true, client: { overlay: false, }, }, } webpackConfig.ignoreWarnings = [/Failed to parse source map/]; module.exports = webpackConfig src/core/000077500000000000000000000000001517666434100126125ustar00rootroot00000000000000src/core/api.js000066400000000000000000000004071517666434100137220ustar00rootroot00000000000000p3xr.api = { host: undefined, } const apiUrl = new URL(location.toString()) if (global.p3xrDevMode === true && apiUrl.port === "8080") { p3xr.api.host = `http://${apiUrl.hostname}:7843` } else { p3xr.api.host = `${apiUrl.protocol}//${apiUrl.host}` } src/core/clipboard.js000066400000000000000000000003341517666434100151070ustar00rootroot00000000000000p3xr.clipboard = async (opts) => { try { await navigator.clipboard.writeText(opts.value); return true; } catch (err) { console.error("Failed to copy:", err); return false; } };src/core/clone.js000066400000000000000000000015601517666434100142520ustar00rootroot00000000000000const isObject = require('lodash/isObject'); const transform = require('lodash/transform'); function removeHashKeys(data) { if (data instanceof ArrayBuffer) { const clone = new ArrayBuffer(data.byteLength); new Uint8Array(clone).set(new Uint8Array(data)); return clone; } // Check explicitly for null and array to prevent treating them as objects if (Array.isArray(data)) { return data.map(item => removeHashKeys(item)); } else if (isObject(data) && !Array.isArray(data) && data !== null && typeof data !== 'string') { return transform(data, (result, value, key) => { if (key !== '$$hashKey') { result[key] = isObject(value) ? removeHashKeys(value) : value; } }); } else { return data; } } p3xr.clone = (value) => { return removeHashKeys(value); }; src/core/dom.js000066400000000000000000000046121517666434100137320ustar00rootroot00000000000000// https://www.google.hu/search?q=javascript+vanilla+position&oq=javascript+vanilla+position&aqs=chrome..69i57.3908j0j7&sourceid=chrome&ie=UTF-8 // https://www.kirupa.com/html5/get_element_position_using_javascript.htm const dom = {} dom.getPosition = function getPosition(el) { let leftPos = 0; let topPos = 0; if (el === undefined) { return { left: 0, top: 0, width: 0, height: 0, } } const style = el.currentStyle || window.getComputedStyle(el); const width = el.offsetWidth // or use style.width const marginSide = parseFloat(style.marginLeft) + parseFloat(style.marginRight) const paddingSide = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) const borderSide = parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth) const height = el.offsetHeight // or use style.width const marginHorizontal = parseFloat(style.marginTop) + parseFloat(style.marginBottom) const paddingHorizontal = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) const borderHorizontal = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth) const result = { width: width + marginSide + paddingSide + borderSide, height: height + marginHorizontal + paddingHorizontal + borderHorizontal } while (el) { if (el.tagName === "BODY") { // deal with browser quirks with body/window/document and page scroll const leftScroll = el.scrollLeft || document.documentElement.scrollLeft; const topScroll = el.scrollTop || document.documentElement.scrollTop; leftPos += (el.offsetLeft - leftScroll + el.clientLeft); topPos += (el.offsetTop - topScroll + el.clientTop); } else { // for all other non-BODY elements leftPos += (el.offsetLeft - el.scrollLeft + el.clientLeft); topPos += (el.offsetTop - el.scrollTop + el.clientTop); } el = el.offsetParent; } result.left = leftPos result.top = topPos return result; } /* // deal with the page getting resized or scrolled window.addEventListener("scroll", updatePosition, false); window.addEventListener("resize", updatePosition, false); function updatePosition() { // add your code to update the position when your browser // is resized or scrolled } */ p3xr.dom = domsrc/core/is-bot.js000066400000000000000000000015061517666434100143470ustar00rootroot00000000000000const pattern = new RegExp('spider|bot|yahoo|bing|google|yandex|lynx|curl|embedly|quora|outbrain|pinterest|vkShare|W3C_Validator|crawl|borg|slurp|archiver|netresearch|lycos|scooter|altavista|teoma|oegp|charlotte|http client|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|semanticdiscovery|snappy|speedy|voila|vortex|voyager|zao|zeal|dataparksearch|findlinks|browsermob|httpmonitor|bingpreview|pagepeeker|webthumb|url2png|zooshot|gomeza|google sketchup|read later|pingdom|facebook|rackspace|scan|link|ezine|preview|dig|tarantula|urllib|jakarta|wget|rget|monitor|libwww|moozilla|seer|spice|snoopy|feedfetcher|wordpress|java|netfront|archive|xenu|feed|appmanager|covario|perl|host|lwp|page speed|ptst|digext|nutch|sleuth|yottaamonitor|bubing|corifeus', 'i'); p3xr.isBot = () => { return pattern.test(navigator.userAgent); }; src/core/next-id.js000066400000000000000000000010431517666434100145160ustar00rootroot00000000000000let currentId = 0 let currentIdTime = Date.now() p3xr.nextId = () => { const now = Date.now(); if (currentIdTime !== now) { currentId = 0; currentIdTime = now } const comingId = ++currentId; const randomHex = p3xr.random().reverse().padStart(15, '0'); const timeHex = currentIdTime.toString(16).padStart(12, '0').reverse() const comingIdHex = comingId.toString(16).padStart(3, '0').reverse(); const newId = `P3Xid${timeHex}${comingIdHex}${randomHex}`; //console.log(newId) return newId } src/core/p3xr.js000066400000000000000000000002601517666434100140420ustar00rootroot00000000000000// Shared p3xr object — NOT on window/global. // Import with: const p3xr = require('./core/p3xr') or import p3xr from '../../core/p3xr' const p3xr = {} module.exports = p3xr src/core/random.js000066400000000000000000000002121517666434100144230ustar00rootroot00000000000000p3xr.random = () => { return (Math.floor(Math.random() * (99999999999999999 - 10000000000000000)) + 10000000000000000).toString(16) } src/core/settings.js000066400000000000000000000201561517666434100150140ustar00rootroot00000000000000const prettyBytesModule = require('pretty-bytes') const prettyBytes = prettyBytesModule.default || prettyBytesModule p3xr.settings = { prettyBytes: (value) => { return prettyBytes(value, { locale: p3xr.settings.language.current }) }, // Custom humanize-duration language definitions for unsupported locales humanizeDurationCustomLanguages: { az: { y: () => 'il', mo: () => 'ay', w: () => 'həftə', d: () => 'gün', h: () => 'saat', m: () => 'dəqiqə', s: () => 'saniyə', ms: () => 'millisaniyə' }, be: { y: (c) => c === 1 ? 'год' : 'гадоў', mo: (c) => c === 1 ? 'месяц' : 'месяцаў', w: (c) => c === 1 ? 'тыдзень' : 'тыдняў', d: (c) => c === 1 ? 'дзень' : 'дзён', h: (c) => c === 1 ? 'гадзіна' : 'гадзін', m: (c) => c === 1 ? 'хвіліна' : 'хвілін', s: (c) => c === 1 ? 'секунда' : 'секунд', ms: (c) => c === 1 ? 'мілісекунда' : 'мілісекунд' }, bs: { y: (c) => c === 1 ? 'godina' : 'godina', mo: (c) => c === 1 ? 'mjesec' : 'mjeseci', w: (c) => c === 1 ? 'sedmica' : 'sedmica', d: (c) => c === 1 ? 'dan' : 'dana', h: (c) => c === 1 ? 'sat' : 'sati', m: (c) => c === 1 ? 'minuta' : 'minuta', s: (c) => c === 1 ? 'sekunda' : 'sekundi', ms: (c) => c === 1 ? 'milisekunda' : 'milisekundi' }, fil: { y: () => 'taon', mo: () => 'buwan', w: () => 'linggo', d: () => 'araw', h: () => 'oras', m: () => 'minuto', s: () => 'segundo', ms: () => 'millisegundo' }, hy: { y: () => '\u057F\u0561\u0580\u056B', mo: () => '\u0561\u0574\u056B\u057D', w: () => '\u0577\u0561\u0562\u0561\u0569', d: () => '\u0585\u0580', h: () => '\u056A\u0561\u0574', m: () => '\u0580\u0578\u057A\u0565', s: () => '\u057E\u0561\u0575\u0580\u056F\u0575\u0561\u0576', ms: () => '\u0574\u056B\u056C\u056B\u057E\u0561\u0575\u0580\u056F\u0575\u0561\u0576' }, ka: { y: (c) => c === 1 ? 'წელი' : 'წელი', mo: (c) => c === 1 ? 'თვე' : 'თვე', w: (c) => c === 1 ? 'კვირა' : 'კვირა', d: (c) => c === 1 ? 'დღე' : 'დღე', h: (c) => c === 1 ? 'საათი' : 'საათი', m: (c) => c === 1 ? 'წუთი' : 'წუთი', s: (c) => c === 1 ? 'წამი' : 'წამი', ms: () => 'მილიწამი' }, kk: { y: (c) => c === 1 ? 'жыл' : 'жыл', mo: (c) => c === 1 ? 'ай' : 'ай', w: (c) => c === 1 ? 'апта' : 'апта', d: (c) => c === 1 ? 'күн' : 'күн', h: (c) => c === 1 ? 'сағат' : 'сағат', m: (c) => c === 1 ? 'минут' : 'минут', s: (c) => c === 1 ? 'секунд' : 'секунд', ms: () => 'миллисекунд' }, ky: { y: (c) => c === 1 ? 'жыл' : 'жыл', mo: (c) => c === 1 ? 'ай' : 'ай', w: (c) => c === 1 ? 'апта' : 'апта', d: (c) => c === 1 ? 'күн' : 'күн', h: (c) => c === 1 ? 'саат' : 'саат', m: (c) => c === 1 ? 'мүнөт' : 'мүнөт', s: (c) => c === 1 ? 'секунд' : 'секунд', ms: () => 'миллисекунд' }, ne: { y: () => 'वर्ष', mo: () => 'महिना', w: () => 'हप्ता', d: () => 'दिन', h: () => 'घण्टा', m: () => 'मिनेट', s: () => 'सेकेन्ड', ms: () => 'मिलिसेकेन्ड' }, si: { y: () => 'වසර', mo: () => 'මාස', w: () => 'සති', d: () => 'දින', h: () => 'පැය', m: () => 'මිනිත්තු', s: () => 'තත්පර', ms: () => 'මිලි තත්පර' }, tg: { y: (c) => c === 1 ? 'сол' : 'сол', mo: (c) => c === 1 ? 'моҳ' : 'моҳ', w: (c) => c === 1 ? 'ҳафта' : 'ҳафта', d: (c) => c === 1 ? 'рӯз' : 'рӯз', h: (c) => c === 1 ? 'соат' : 'соат', m: (c) => c === 1 ? 'дақиқа' : 'дақиқа', s: (c) => c === 1 ? 'сония' : 'сония', ms: () => 'миллисония' }, nb: { y: (c) => c === 1 ? 'år' : 'år', mo: (c) => c === 1 ? 'måned' : 'måneder', w: (c) => c === 1 ? 'uke' : 'uker', d: (c) => c === 1 ? 'dag' : 'dager', h: (c) => c === 1 ? 'time' : 'timer', m: (c) => c === 1 ? 'minutt' : 'minutter', s: (c) => c === 1 ? 'sekund' : 'sekunder', ms: () => 'millisekund' }, }, getHumanizeDurationLanguage: () => { const map = { 'pt-BR': 'pt', 'zn': 'zh_CN', 'zh-HK': 'zh_TW', 'zh-TW': 'zh_TW', 'pt-PT': 'pt', } const current = p3xr.settings.language.current return map[current] || current || 'en' }, getHumanizeDurationOptions: () => { return { language: p3xr.settings.getHumanizeDurationLanguage(), languages: p3xr.settings.humanizeDurationCustomLanguages, } }, handleConnectionIsClosed: (error) => { if (error?.message === 'Connection is closed.') { p3xr.state.connection = undefined return true } return false }, maxLightKeysCount: 110000, // maxLightKeysCount: 1, resizeMinWidth: 315, socket: { timeout: 300000, }, toast: { timeout: 5000, position: 'bottom right', }, debounce: 100, debounceSearch: 2000, connection: { storageKeyCurrentDatabase: 'p3xr-main-current-database', getStorageKeyCurrentDatabase: (id) => { return p3xr.settings.connection.storageKeyCurrentDatabase + '-' + id } }, tree: { storageKey: 'p3xr-main-treecontrol-divider', defaultDivider: ':', }, redisTreeDivider: ':', animation: 0, animationSettings: { default: 0, storageKey: 'p3xr-animation-settings', }, jsonFormat: 4, googleAnalytics: 'G-8M2CK7993T', jsonFormatSettings: { default: 4, storageKey: 'p3xr-json-format', }, paging: { default: 250, storageKey: 'p3xr-main-treecontrol-page-size' }, keyPage: { default: 5, storageKey: 'p3xr-main-key-page-size', }, keyPageCount: 5, language: { momentDateMap: { en: 'en', ar: 'ar', az: 'az', be: 'be', bg: 'bg', bn: 'bn', cs: 'cs', da: 'da', de: 'de', el: 'el', es: 'es', et: 'et', fi: 'fi', fil: 'tl-ph', fr: 'fr', he: 'he', hr: 'hr', hu: 'hu', hy: 'hy-am', id: 'id', it: 'it', ja: 'ja', ka: 'ka', kk: 'kk', km: 'km', ko: 'ko', ky: 'ky', lt: 'lt', mk: 'mk', ms: 'ms', ne: 'ne', nl: 'nl', no: 'nb', pl: 'pl', 'pt-BR': 'pt-br', 'pt-PT': 'pt', ro: 'ro', ru: 'ru', sk: 'sk', sl: 'sl', sr: 'sr', sv: 'sv', tg: 'tg', th: 'th', tr: 'tr', uk: 'uk', vi: 'vi', 'zh-HK': 'zh-hk', 'zh-TW': 'zh-tw', zn: 'zh-cn', bs: 'bs', si: 'si', sw: 'sw', ta: 'ta', }, defaultLanguage: 'en', current: undefined, storageKey: 'p3xr-language', translation: {} }, pageCount: 50, maxValueDisplay: 1024, maxValueAsBuffer: 1000 * 256, maxValueDisplaySetting: { default: 1024, storageKey: 'p3xr-main-treecontrol-max-value-display' }, maxKeys: 1000, maxKeysSettings: { default: 1000, max: 100000, storageKey: 'p3xr-max-keys' }, keySortInfo: { default: true, storageKey: 'p3xr-main-treecontrol-key-sort', }, keysSort: true, searchClientSide: false, searchInfoClientSide: { default: false, storageKey: 'p3xr-main-treecontrol-search-client-mode' }, searchStartsWith: false, searchInfoStartsWith: { default: false, storageKey: 'p3xr-main-treecontrol-search-starts-with' }, connectInfo: { storageKey: 'p3xr-layout-connect', } } src/core/sort.js000066400000000000000000000014311517666434100141360ustar00rootroot00000000000000p3xr.sort = { naturalCompareDocument: () => { return (a, b) => { const regexTemplate = /(\d+)|(\D+)/g; const ax = [], bx = []; a.replace(regexTemplate, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) }); b.replace(regexTemplate, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) }); while (ax.length && bx.length) { const an = ax.shift(); const bn = bx.shift(); const nn = (parseFloat(an[0]) - parseFloat(bn[0])) || an[1].localeCompare(bn[1]); if (nn) { return nn; } } return ax.length - bx.length; } } } src/core/state-properties.js000066400000000000000000000237031517666434100164670ustar00rootroot00000000000000/** * LocalStorage-backed computed properties on p3xr.settings and p3xr.state. * * Ported from angular/boot.js .run() block — no AngularJS dependency. */ const merge = require('lodash/merge') function getStorage(name) { try { const value = localStorage.getItem(name) return value !== null ? value : undefined } catch { return undefined } } function setStorage(name, value) { try { localStorage.setItem(name, String(value)) } catch { /* ignore */ } } // --- search --- let search Object.defineProperty(p3xr.state, 'search', { get: () => { search = getStorage('p3xr-state-search') if (search === undefined) search = '' return search }, set: (value) => { search = value setStorage('p3xr-state-search', value) } }) // --- redisTreeDivider --- let treeDivider Object.defineProperty(p3xr.settings, 'redisTreeDivider', { get: () => { treeDivider = getStorage(p3xr.settings.tree.storageKey) if (treeDivider === undefined) treeDivider = p3xr.settings.tree.defaultDivider return treeDivider }, set: (value) => { treeDivider = value setStorage(p3xr.settings.tree.storageKey, value) } }) // --- jsonFormat --- let jsonFormat Object.defineProperty(p3xr.settings, 'jsonFormat', { get: () => { jsonFormat = getStorage(p3xr.settings.jsonFormatSettings.storageKey) if (jsonFormat === undefined) jsonFormat = p3xr.settings.jsonFormatSettings.default return parseInt(jsonFormat) }, set: (value) => { jsonFormat = value setStorage(p3xr.settings.jsonFormatSettings.storageKey, value) } }) // --- animation --- let animation const $body = document.body const setAnimation = () => { $body.classList.remove('p3xr-no-animation', 'p3xr-animation') if (p3xr.settings.animation) { $body.classList.add('p3xr-animation') } else { $body.classList.add('p3xr-no-animation') } } Object.defineProperty(p3xr.settings, 'animation', { get: () => { animation = getStorage(p3xr.settings.animationSettings.storageKey) if (animation === undefined) animation = p3xr.settings.animationSettings.default return parseInt(animation) === 1 }, set: (value) => { animation = value setStorage(p3xr.settings.animationSettings.storageKey, value) setAnimation() } }) setAnimation() // --- maxValueDisplay --- let maxValueDisplay Object.defineProperty(p3xr.settings, 'maxValueDisplay', { get: () => { maxValueDisplay = getStorage(p3xr.settings.maxValueDisplaySetting.storageKey) if (maxValueDisplay === undefined) maxValueDisplay = p3xr.settings.maxValueDisplaySetting.default return parseInt(maxValueDisplay) }, set: (value) => { maxValueDisplay = parseInt(value) setStorage(p3xr.settings.maxValueDisplaySetting.storageKey, value) } }) // --- maxKeys --- let maxKeysDisplay Object.defineProperty(p3xr.settings, 'maxKeys', { get: () => { maxKeysDisplay = getStorage(p3xr.settings.maxKeysSettings.storageKey) if (maxKeysDisplay === undefined) maxKeysDisplay = p3xr.settings.maxKeysSettings.default let value = parseInt(maxKeysDisplay) if (isNaN(value) || value < 5 || value > p3xr.settings.maxKeysSettings.max) { value = p3xr.settings.maxKeysSettings.default } return value }, set: (value) => { maxKeysDisplay = parseInt(value) setStorage(p3xr.settings.maxKeysSettings.storageKey, value) } }) // --- language --- let language Object.defineProperty(p3xr.settings.language, 'current', { get: () => { language = getStorage(p3xr.settings.language.storageKey) if (language === undefined) { try { const navLang = (navigator.language || '').toLowerCase() if (navLang.startsWith('zh')) language = 'zn' else if (navLang.startsWith('ru')) language = 'ru' else language = p3xr.settings.language.defaultLanguage } catch (e) { language = p3xr.settings.language.defaultLanguage } require('dayjs').locale(p3xr.settings.language.momentDateMap[language]) } return language }, set: (value) => { if (value === undefined) value = p3xr.settings.language.defaultLanguage language = value require('dayjs').locale(p3xr.settings.language.momentDateMap[language]) const en = p3xr.settings.language.translation['en'] || {} const selected = p3xr.settings.language.translation[value] || {} // Log missing keys (dev only) const missing = [] const isObject = (v) => v && typeof v === 'object' && !Array.isArray(v) const diffKeys = (base, target, path = '') => { Object.keys(base || {}).forEach((k) => { const nextPath = path ? `${path}.${k}` : k if (!(target && Object.prototype.hasOwnProperty.call(target, k))) { missing.push(nextPath) } else if (isObject(base[k]) && isObject(target[k])) { diffKeys(base[k], target[k], nextPath) } }) } try { diffKeys(en, selected) if (missing.length) console.warn(`[i18n] Missing translation keys for '${value}':`, missing) } catch (e) { /* noop */ } p3xr.strings = merge({}, en, selected) setStorage(p3xr.settings.language.storageKey, value) } }) // Initialize language p3xr.settings.language.current = getStorage(p3xr.settings.language.storageKey) // --- keysSort --- let keysSort Object.defineProperty(p3xr.settings, 'keysSort', { get: () => { keysSort = getStorage(p3xr.settings.keySortInfo.storageKey) if (keysSort === undefined) keysSort = p3xr.settings.keySortInfo.default else if (keysSort === 'true') keysSort = true else if (keysSort === 'false') keysSort = false return keysSort }, set: (value) => { keysSort = value setStorage(p3xr.settings.keySortInfo.storageKey, value) } }) // --- searchClientSide --- let searchClientSide Object.defineProperty(p3xr.settings, 'searchClientSide', { get: () => { searchClientSide = getStorage(p3xr.settings.searchInfoClientSide.storageKey) if (searchClientSide === undefined) searchClientSide = p3xr.settings.searchInfoClientSide.default else if (searchClientSide === 'true') searchClientSide = true else if (searchClientSide === 'false') searchClientSide = false if (p3xr.state.keysRaw.length > p3xr.settings.maxLightKeysCount || p3xr.state.dbsize > p3xr.settings.maxLightKeysCount) { searchClientSide = false } return searchClientSide }, set: (value) => { searchClientSide = value setStorage(p3xr.settings.searchInfoClientSide.storageKey, value) } }) // --- searchStartsWith --- let searchStartsWith Object.defineProperty(p3xr.settings, 'searchStartsWith', { get: () => { searchStartsWith = getStorage(p3xr.settings.searchInfoStartsWith.storageKey) if (searchStartsWith === undefined) searchStartsWith = p3xr.settings.searchInfoStartsWith.default else if (searchStartsWith === 'true') searchStartsWith = true else if (searchStartsWith === 'false') searchStartsWith = false return searchStartsWith }, set: (value) => { searchStartsWith = value setStorage(p3xr.settings.searchInfoStartsWith.storageKey, value) } }) // --- expandedNodes --- let expandedNodes = [] p3xr.state.expandedNodes = expandedNodes Object.defineProperty(p3xr.state, 'expandedNodes', { get: () => expandedNodes, set: (value) => { expandedNodes = value } }) p3xr.state.savedExpandedNodes = [] // --- page --- let page = 1 Object.defineProperty(p3xr.state, 'page', { get: () => page, set: (value) => { page = parseInt(value) } }) // --- keys (paginated, filtered) --- p3xr.state._filteredKeysRaw = [] Object.defineProperty(p3xr.state, 'keys', { get: () => { let globalKeysRaw = (p3xr.state.keysRaw || []).slice() if (p3xr.settings.searchClientSide && typeof p3xr.state.search === 'string' && p3xr.state.search.length > 0) { if (p3xr.settings.searchStartsWith) { globalKeysRaw = globalKeysRaw.filter(k => k.startsWith(p3xr.state.search)) } else { globalKeysRaw = globalKeysRaw.filter(k => k.includes(p3xr.state.search)) } } p3xr.state._filteredKeysRaw = globalKeysRaw if (globalKeysRaw.length <= p3xr.settings.pageCount) { return globalKeysRaw } const start = (p3xr.state.page - 1) * p3xr.settings.pageCount return globalKeysRaw.slice(start, start + p3xr.settings.pageCount) } }) Object.defineProperty(p3xr.state, 'pages', { get: () => { const raw = p3xr.state._filteredKeysRaw || p3xr.state.keysRaw || [] return Math.ceil(raw.length / p3xr.settings.pageCount) } }) // --- pageCount --- let pageCount Object.defineProperty(p3xr.settings, 'pageCount', { get: () => { pageCount = getStorage(p3xr.settings.paging.storageKey) if (pageCount === undefined) pageCount = p3xr.settings.paging.default else pageCount = parseInt(pageCount) return pageCount }, set: (value) => { pageCount = value setStorage(p3xr.settings.paging.storageKey, value) } }) // --- keyPageCount --- let keyPageCount Object.defineProperty(p3xr.settings, 'keyPageCount', { get: () => { keyPageCount = getStorage(p3xr.settings.keyPage.storageKey) if (keyPageCount === undefined) keyPageCount = p3xr.settings.keyPage.default else keyPageCount = parseInt(keyPageCount) return keyPageCount }, set: (value) => { keyPageCount = value setStorage(p3xr.settings.keyPage.storageKey, value) } }) console.info('P3X Redis UI state properties initialized (standalone)') src/core/state.js000066400000000000000000000026251517666434100142750ustar00rootroot00000000000000p3xr.state = { treeDividers: [], // All features are free — always enterprise donated: true, // All features are free — always enterprise hasProOrEnterpriseJsonBinary: true, license: { licenseEditable: true, editableActive: true, disabled: false, hasLicenseKey: false, licenseKeyMasked: '', tier: 'free', valid: false, reason: 'LICENSE_MISSING', licenseStatus: 'inactive', maxDevices: null, activeDevices: null, deviceLease: null, daysLeft: null, features: [], }, theme: undefined, connection: undefined, currentDatabase: undefined, redisChanged: false, databaseIndexes: [0], connections: [], redisConnections: {}, keys: [], cfg: undefined, version: undefined, keysInfo: undefined, failed: false, keysRaw: [], search: '', commands: [], reducedFunctions: false, dbsize: undefined, monitor: false, //infoObject: undefined, monitorPattern: '*', } Object.defineProperty(p3xr.state, 'themeLayout', { get: () => { return p3xr.state.theme + 'Layout' } }) Object.defineProperty(p3xr.state, 'themeCommon', { get: () => { return p3xr.state.theme + 'Common' } }) p3xr.connectionsReset = () => { p3xr.state.connections = { list: [] } } p3xr.connectionsReset() src/core/strings.js000066400000000000000000000001451517666434100146410ustar00rootroot00000000000000p3xr.translations = { en: require('../strings/en/strings') } p3xr.strings = p3xr.translations.en src/decorate/000077500000000000000000000000001517666434100134505ustar00rootroot00000000000000src/decorate/string.js000066400000000000000000000002071517666434100153130ustar00rootroot00000000000000if (!String.prototype.reverse) { String.prototype.reverse = function () { return this.split('').reverse().join('') } } src/index.html000066400000000000000000000120651517666434100136630ustar00rootroot00000000000000 P3X Redis UI
src/main-development.js000066400000000000000000000003741517666434100154700ustar00rootroot00000000000000global.p3xrDevMode = true console.log('-------------------------------------') console.log(' development mode ') console.log('-------------------------------------') if (module.hot) { module.hot.accept() } require('./main') src/main.js000066400000000000000000000221151517666434100131450ustar00rootroot00000000000000require('./scss/index.scss') // fontawesome //require('@fortawesome/fontawesome-free/js/all') require('./decorate/string') // p3xr is injected by webpack ProvidePlugin — not on window // Explicit require as safety net (ProvidePlugin also auto-injects) const p3xr = require('./core/p3xr') // Capture Electron UI storage bootstrap data from URL query params BEFORE Angular's // router strips them during its initial redirect (e.g. / → /settings). // This makes the data available on p3xr.electronUiStorageBootstrap for SettingsComponent. try { const encoded = new URLSearchParams(window.location.search).get('p3xreUiStorage') if (encoded) { const base64 = encoded.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(encoded.length / 4) * 4, '=') const parsed = JSON.parse(atob(base64)) if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { p3xr.electronUiStorageBootstrap = parsed } } } catch (e) { // ignore — bootstrap data is optional } // Also try window.name (set by Electron shell via iframe.name before src is loaded) if (!p3xr.electronUiStorageBootstrap) { try { const fromName = window.name ? JSON.parse(window.name) : null if (fromName?.p3xreUiStorage && typeof fromName.p3xreUiStorage === 'object') { p3xr.electronUiStorageBootstrap = fromName.p3xreUiStorage } } catch (e) { // ignore } } p3xr.theme = { dark: undefined, light: undefined, } p3xr.ui = { // Fallback no-op overlay to avoid runtime crashes before overlay bootstrap. overlay: { show: () => {}, hide: () => {}, }, htmlEncode: global.htmlEncode } require('./core/settings') require('./core/strings') require('./core/random') require('./core/is-bot') require('./core/next-id') require('./core/api') require('./core/state') require('./core/dom') require('./core/sort') require('./core/clipboard') require('./core/clone') require('./overlay/overlay') // English is always loaded synchronously — it is the required fallback for all other languages. p3xr.settings.language.translation['en'] = require('./strings/en/strings') // Lazy-load any non-English translation on demand. // Each case produces a separate webpack chunk (~25 KiB each) loaded only when needed. // Returns a Promise that resolves once the translation is stored in // p3xr.settings.language.translation[lang]. p3xr.settings.language.loadTranslation = (lang) => { if (p3xr.settings.language.translation[lang]) { return Promise.resolve(p3xr.settings.language.translation[lang]) } let loader switch (lang) { case 'ar': loader = import(/* webpackChunkName: "i18n-ar" */ './strings/ar/strings'); break case 'az': loader = import(/* webpackChunkName: "i18n-az" */ './strings/az/strings'); break case 'be': loader = import(/* webpackChunkName: "i18n-be" */ './strings/be/strings'); break case 'bg': loader = import(/* webpackChunkName: "i18n-bg" */ './strings/bg/strings'); break case 'bn': loader = import(/* webpackChunkName: "i18n-bn" */ './strings/bn/strings'); break case 'cs': loader = import(/* webpackChunkName: "i18n-cs" */ './strings/cs/strings'); break case 'da': loader = import(/* webpackChunkName: "i18n-da" */ './strings/da/strings'); break case 'de': loader = import(/* webpackChunkName: "i18n-de" */ './strings/de/strings'); break case 'el': loader = import(/* webpackChunkName: "i18n-el" */ './strings/el/strings'); break case 'es': loader = import(/* webpackChunkName: "i18n-es" */ './strings/es/strings'); break case 'et': loader = import(/* webpackChunkName: "i18n-et" */ './strings/et/strings'); break case 'fi': loader = import(/* webpackChunkName: "i18n-fi" */ './strings/fi/strings'); break case 'fil': loader = import(/* webpackChunkName: "i18n-fil" */ './strings/fil/strings'); break case 'fr': loader = import(/* webpackChunkName: "i18n-fr" */ './strings/fr/strings'); break case 'he': loader = import(/* webpackChunkName: "i18n-he" */ './strings/he/strings'); break case 'hr': loader = import(/* webpackChunkName: "i18n-hr" */ './strings/hr/strings'); break case 'hu': loader = import(/* webpackChunkName: "i18n-hu" */ './strings/hu/strings'); break case 'hy': loader = import(/* webpackChunkName: "i18n-hy" */ './strings/hy/strings'); break case 'id': loader = import(/* webpackChunkName: "i18n-id" */ './strings/id/strings'); break case 'it': loader = import(/* webpackChunkName: "i18n-it" */ './strings/it/strings'); break case 'ja': loader = import(/* webpackChunkName: "i18n-ja" */ './strings/ja/strings'); break case 'ka': loader = import(/* webpackChunkName: "i18n-ka" */ './strings/ka/strings'); break case 'kk': loader = import(/* webpackChunkName: "i18n-kk" */ './strings/kk/strings'); break case 'km': loader = import(/* webpackChunkName: "i18n-km" */ './strings/km/strings'); break case 'ko': loader = import(/* webpackChunkName: "i18n-ko" */ './strings/ko/strings'); break case 'ky': loader = import(/* webpackChunkName: "i18n-ky" */ './strings/ky/strings'); break case 'lt': loader = import(/* webpackChunkName: "i18n-lt" */ './strings/lt/strings'); break case 'mk': loader = import(/* webpackChunkName: "i18n-mk" */ './strings/mk/strings'); break case 'ms': loader = import(/* webpackChunkName: "i18n-ms" */ './strings/ms/strings'); break case 'ne': loader = import(/* webpackChunkName: "i18n-ne" */ './strings/ne/strings'); break case 'nl': loader = import(/* webpackChunkName: "i18n-nl" */ './strings/nl/strings'); break case 'no': loader = import(/* webpackChunkName: "i18n-no" */ './strings/no/strings'); break case 'pl': loader = import(/* webpackChunkName: "i18n-pl" */ './strings/pl/strings'); break case 'pt-BR': loader = import(/* webpackChunkName: "i18n-pt-BR" */ './strings/pt-BR/strings'); break case 'pt-PT': loader = import(/* webpackChunkName: "i18n-pt-PT" */ './strings/pt-PT/strings'); break case 'ro': loader = import(/* webpackChunkName: "i18n-ro" */ './strings/ro/strings'); break case 'ru': loader = import(/* webpackChunkName: "i18n-ru" */ './strings/ru/strings'); break case 'sk': loader = import(/* webpackChunkName: "i18n-sk" */ './strings/sk/strings'); break case 'sl': loader = import(/* webpackChunkName: "i18n-sl" */ './strings/sl/strings'); break case 'sr': loader = import(/* webpackChunkName: "i18n-sr" */ './strings/sr/strings'); break case 'sv': loader = import(/* webpackChunkName: "i18n-sv" */ './strings/sv/strings'); break case 'tg': loader = import(/* webpackChunkName: "i18n-tg" */ './strings/tg/strings'); break case 'th': loader = import(/* webpackChunkName: "i18n-th" */ './strings/th/strings'); break case 'tr': loader = import(/* webpackChunkName: "i18n-tr" */ './strings/tr/strings'); break case 'uk': loader = import(/* webpackChunkName: "i18n-uk" */ './strings/uk/strings'); break case 'vi': loader = import(/* webpackChunkName: "i18n-vi" */ './strings/vi/strings'); break case 'zh-HK': loader = import(/* webpackChunkName: "i18n-zh-HK" */ './strings/zh-HK/strings'); break case 'zh-TW': loader = import(/* webpackChunkName: "i18n-zh-TW" */ './strings/zh-TW/strings'); break case 'zn': loader = import(/* webpackChunkName: "i18n-zn" */ './strings/zn/strings'); break case 'bs': loader = import(/* webpackChunkName: "i18n-bs" */ './strings/bs/strings'); break case 'si': loader = import(/* webpackChunkName: "i18n-si" */ './strings/si/strings'); break case 'sw': loader = import(/* webpackChunkName: "i18n-sw" */ './strings/sw/strings'); break case 'ta': loader = import(/* webpackChunkName: "i18n-ta" */ './strings/ta/strings'); break default: return Promise.resolve(p3xr.settings.language.translation['en']) } return loader.then(m => { p3xr.settings.language.translation[lang] = m.default || m return p3xr.settings.language.translation[lang] }) } // Read the language from localStorage so we can pre-load the correct // translation before bootstrapping Angular. let _initialLang = 'en' try { _initialLang = localStorage.getItem(p3xr.settings.language.storageKey) || 'en' } catch { /* ignore */ } // Load the initial language (no-op for English — already loaded above), then boot. p3xr.settings.language.loadTranslation(_initialLang).then(() => { // Initialize cookie-backed state properties (standalone, no AngularJS) require('./core/state-properties') // Bootstrap Angular (standalone, no AngularJS) require('./ng/main') }) src/main.scss000066400000000000000000000003531517666434100135040ustar00rootroot00000000000000@use "./overlay/overlay.scss"; @use "./ng/pages/database/key/key-types.scss"; @use "./ng/themes/_theme-custom.scss"; @use "./ng/themes/_theme-definitions.scss"; @use "./ng/themes/angular-material-themes.scss"; @use "./scss/vars.scss"; src/ng/000077500000000000000000000000001517666434100122665ustar00rootroot00000000000000src/ng/app.routes.ts000066400000000000000000000044521517666434100147430ustar00rootroot00000000000000import { Routes } from '@angular/router'; export const appRoutes: Routes = [ { path: 'info', loadComponent: () => import( /* webpackChunkName: "page-info" */ './pages/info.component' ).then(m => m.InfoComponent), }, { path: 'settings', loadComponent: () => import( /* webpackChunkName: "page-settings" */ './pages/settings.component' ).then(m => m.SettingsComponent), }, { path: 'database', loadComponent: () => import( /* webpackChunkName: "page-main" */ './pages/database/database.component' ).then(m => m.DatabaseComponent), children: [ { path: 'statistics', loadComponent: () => import( /* webpackChunkName: "page-statistics" */ './pages/database/statistics.component' ).then(m => m.StatisticsComponent), }, { path: 'key/:key', loadComponent: () => import( /* webpackChunkName: "page-main-key" */ './pages/database/database-key.component' ).then(m => m.DatabaseKeyComponent), }, { path: '', redirectTo: 'statistics', pathMatch: 'full', }, ], }, { path: 'search', loadComponent: () => import( /* webpackChunkName: "page-search" */ './pages/search/search.component' ).then(m => m.SearchComponent), }, { path: 'monitoring', loadComponent: () => import( /* webpackChunkName: "page-monitoring" */ './pages/monitoring/monitoring.component' ).then(m => m.MonitoringComponent), }, { path: 'main', redirectTo: 'database', pathMatch: 'prefix', }, { path: 'socketio-error', loadComponent: () => import( /* webpackChunkName: "page-error" */ './components/p3xr-error.component' ).then(m => m.P3xrErrorComponent), }, { path: '', redirectTo: 'settings', pathMatch: 'full', }, { path: '**', redirectTo: 'settings', }, ]; src/ng/components/000077500000000000000000000000001517666434100144535ustar00rootroot00000000000000src/ng/components/confirm-dialog.component.ts000066400000000000000000000042261517666434100217220ustar00rootroot00000000000000import { Component, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { DialogCancelButtonComponent } from './dialog-cancel-button.component'; export interface ConfirmDialogData { title: string; message: string; disableCancel?: boolean; okButton?: string; cancelButton?: string; } @Component({ selector: 'p3xr-confirm-dialog', standalone: true, imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule, MatToolbarModule, DialogCancelButtonComponent], template: ` {{ data.title }}
@if (!data.disableCancel) { } `, styles: [` .p3xr-dialog-message { white-space: normal; } `], }) export class ConfirmDialogComponent { constructor( @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData, @Inject(MatDialogRef) private dialogRef: MatDialogRef, ) {} onOk(): void { this.dialogRef.close(true); } onCancel(): void { this.dialogRef.close(false); } } src/ng/components/dialog-cancel-button.component.ts000066400000000000000000000036731517666434100230300ustar00rootroot00000000000000import { Component, Input, Output, EventEmitter, Inject, ChangeDetectorRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../services/i18n.service'; /** * Shared responsive cancel button for all dialogs. * - Wide screens: shows icon + text * - Small screens: shows icon only + tooltip * * Usage: * * */ @Component({ selector: 'p3xr-dialog-cancel', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule], template: ` `, }) export class DialogCancelButtonComponent { @Input() label: string = ''; @Input() icon: string = 'cancel'; @Output() cancel = new EventEmitter(); isWide = true; constructor( @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(I18nService) private i18n: I18nService, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.breakpointObserver.observe('(min-width: 600px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); } ngOnInit(): void { if (!this.label) { this.label = this.i18n.strings().intention?.cancel || 'Cancel'; } } } src/ng/components/json-tree.component.ts000066400000000000000000000202701517666434100207330ustar00rootroot00000000000000import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; import { FlatTreeControl } from '@angular/cdk/tree'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; interface JsonNode { key: string; value: any; type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null'; children?: JsonNode[]; childCount?: number; } interface FlatJsonNode { key: string; value: any; type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null'; level: number; expandable: boolean; childCount?: number; } /** * JSON tree viewer using Angular Material mat-tree. * Displays a JSON object/array as an expandable tree with syntax-colored values. * * Usage: * */ @Component({ selector: 'p3xr-json-tree', standalone: true, imports: [CommonModule, MatTreeModule, MatIconModule, MatButtonModule], encapsulation: ViewEncapsulation.None, template: ` {{ node.key }}: {{ formatDisplay(node) }} {{ node.key }} {{ node.type === 'array' ? '[' : '{' }} @if (!treeControl.isExpanded(node)) { ... {{ node.type === 'array' ? ']' : '}' }} ({{ node.childCount }}) } `, styles: [` .p3xr-json-mat-tree { font-family: 'Roboto Mono', monospace; font-size: 13px; background: inherit !important; } .p3xr-json-mat-tree .mat-tree-node, .p3xr-json-mat-tree .mat-nested-tree-node { background: inherit !important; color: inherit !important; } .p3xr-json-mat-tree .mat-tree-node { min-height: 24px; height: auto; line-height: 1.6; } .p3xr-json-tree-toggle-hidden { visibility: hidden !important; } .p3xr-json-tree-toggle { width: 24px !important; height: 24px !important; padding: 0 !important; flex-shrink: 0; } .p3xr-json-tree-toggle .mat-icon { font-size: 18px; width: 18px; height: 18px; opacity: 0.6; } .p3xr-json-tree-leaf-content { flex: 1; min-width: 0; display: flex; align-items: flex-start; gap: 6px; } .p3xr-json-tree-leaf-key { flex-shrink: 0; white-space: nowrap; } .p3xr-json-tree-value { word-break: break-word; min-width: 0; } .p3xr-json-tree-key { font-weight: bold; color: var(--p3xr-json-key-color, #881391); } .p3xr-json-tree-colon { opacity: 0.6; } .p3xr-json-tree-bracket { opacity: 0.5; } .p3xr-json-tree-ellipsis { opacity: 0.4; margin: 0 2px; } .p3xr-json-tree-count { opacity: 0.4; font-size: 11px; margin-left: 4px; align-self: center; } :host { display: block; overflow: auto; } .p3xr-json-tree-value-string { color: var(--p3xr-json-value-string, #0b7500); } .p3xr-json-tree-value-number { color: var(--p3xr-json-value-number, #1a01cc); } .p3xr-json-tree-value-boolean { color: var(--p3xr-json-value-boolean, #c41a16); } .p3xr-json-tree-value-null { color: var(--p3xr-json-value-null, #808080); font-style: italic; } .p3xr-json-mat-tree .p3xr-json-tree-value { word-break: break-all; } .p3xr-json-mat-tree.p3xr-json-tree-nowrap .p3xr-json-tree-value { white-space: nowrap; word-break: normal; } .p3xr-json-mat-tree.p3xr-json-tree-nowrap .mat-tree-node { flex-wrap: nowrap; } `], }) export class JsonTreeComponent implements OnChanges { @Input() data: any; @Input() label: string = ''; @Input() expanded: boolean | 'recursive' = true; @Input() depth: number = 0; @Input() wrap: boolean = true; private transformer = (node: JsonNode, level: number): FlatJsonNode => ({ key: node.key, value: node.value, type: node.type, level: level, expandable: node.type === 'object' || node.type === 'array', childCount: node.childCount, }); treeControl = new FlatTreeControl( node => node.level, node => node.expandable, ); private treeFlattener = new MatTreeFlattener( this.transformer, node => node.level, node => node.expandable, node => node.children, ); dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); hasChild = (_: number, node: FlatJsonNode) => node.expandable; ngOnChanges(_changes: SimpleChanges): void { this.buildTree(); } private buildTree(): void { if (this.data === undefined || this.data === null) { this.dataSource.data = []; return; } const rootNode = this.jsonToNode(this.label || 'root', this.data); // If root is object/array, show its children directly under the root label this.dataSource.data = rootNode.children ? [rootNode] : [rootNode]; // Expand based on the expanded input if (this.expanded === 'recursive') { this.treeControl.expandAll(); } else if (this.expanded === true) { // Expand only the first level const flatNodes = this.treeControl.dataNodes; for (const node of flatNodes) { if (node.level === 0 && node.expandable) { this.treeControl.expand(node); } } } } private jsonToNode(key: string, value: any): JsonNode { if (value === null) { return { key, value: null, type: 'null' }; } if (Array.isArray(value)) { const children = value.map((item, index) => this.jsonToNode(String(index), item)); return { key, value, type: 'array', children, childCount: children.length }; } if (typeof value === 'object') { const children = Object.keys(value).map(k => this.jsonToNode(k, value[k])); return { key, value, type: 'object', children, childCount: children.length }; } return { key, value, type: typeof value as any }; } formatDisplay(node: FlatJsonNode): string { if (node.type === 'null') return 'null'; if (node.type === 'string') return `"${node.value}"`; return String(node.value); } } src/ng/components/p3xr-accordion.component.ts000066400000000000000000000113611517666434100216610ustar00rootroot00000000000000import { Component, Input, Inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { I18nService } from '../services/i18n.service'; /** * Accordion component — matches AngularJS p3xrAccordion exactly. * * Production reference: https://redis.patrikx3.com/settings * - Toolbar: grey/muted bg from Layout sub-theme, 48px height, 20px bold title * - Content: white/neutral bg (NOT tinted), thin border matching toolbar color * - No border-radius on content area (square corners) * - Toolbar has slight shadow when collapsed, flat when expanded */ @Component({ selector: 'p3xr-ng-accordion', standalone: true, imports: [CommonModule, MatToolbarModule, MatButtonModule, MatIconModule, MatTooltipModule], template: `
{{ title }}
@if (extended) {
}
`, styles: [` :host { display: block; } .p3xr-accordion-wrapper { margin-bottom: 0; } .p3xr-accordion-toolbar { height: 48px; min-height: 48px; max-height: 48px; font-size: 20px; font-weight: 400; background-color: var(--p3xr-accordion-bg) !important; color: rgba(0, 0, 0, 0.87) !important; padding: 0; border-radius: 4px 4px 0 0; box-shadow: 0 1px 1px rgba(0,0,0,0.3); } .p3xr-accordion-toolbar.p3xr-collapsed { box-shadow: 0 1px 1px rgba(0,0,0,0.4); border-radius: 4px; } /* Inner flex layout matching AngularJS md-toolbar-tools */ .p3xr-accordion-toolbar-inner { display: flex; align-items: center; width: 100%; height: 48px; padding: 0 8px 0 16px; box-sizing: border-box; } .p3xr-accordion-content { border: 1px solid var(--p3xr-accordion-bg); border-radius: 0 0 4px 4px; } .p3xr-accordion-title { flex: 1; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .p3xr-accordion-actions { display: flex; align-items: center; } .p3xr-accordion-toggle { flex-shrink: 0; width: 40px !important; height: 40px !important; padding: 0 !important; } `] }) export class P3xrAccordionComponent implements OnInit { @Input() title: string = ''; @Input() accordionKey: string = ''; readonly strings; extended = true; private static counter = 0; private storageKey = ''; constructor(@Inject(I18nService) private i18n: I18nService) { this.strings = this.i18n.strings; } ngOnInit(): void { if (!this.accordionKey) { this.accordionKey = String(++P3xrAccordionComponent.counter); } this.storageKey = `p3xr-accordion-extended-${this.accordionKey}`; this.loadState(); } toggle(): void { this.extended = !this.extended; this.saveState(); } private loadState(): void { try { const value = localStorage.getItem(this.storageKey); this.extended = value === null ? true : value === 'true'; } catch { this.extended = true; } } private saveState(): void { try { localStorage.setItem(this.storageKey, String(this.extended)); } catch {} } } src/ng/components/p3xr-button.component.ts000066400000000000000000000071571517666434100212430ustar00rootroot00000000000000import { Component, Input, Inject, ChangeDetectorRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule, TooltipPosition } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; /** * Button component — Angular standalone replacement for AngularJS p3xrButton. * * Features: * - Shows icon (Material or FontAwesome) + label on wide screens * - Shows icon + tooltip on narrow screens (< 720px) * - Supports custom CSS classes (btn-primary, btn-accent, btn-warn) * - `raised` input switches from flat (mat-button) to filled (mat-flat-button) */ @Component({ selector: 'p3xr-ng-button', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule], template: ` @if (raised) { @if (isWide) { } @else { } } @else { @if (isWide) { } @else { } } `, styles: [` :host { display: inline-block; } :host button { margin: 0 !important; } `] }) export class P3xrButtonComponent { @Input() label: string = ''; @Input() mdIcon: string | undefined; @Input() faIcon: string | undefined; @Input() tooltipDirection: string = 'above'; @Input() classes: string = ''; @Input() disabled = false; @Input() raised = false; isWide = true; constructor( @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.breakpointObserver.observe('(min-width: 720px)').subscribe(result => { this.isWide = result.matches; this.cdr.markForCheck(); }); } get tooltipPosition(): TooltipPosition { switch (this.tooltipDirection) { case 'top': return 'above'; case 'bottom': return 'below'; case 'above': case 'below': case 'left': case 'right': case 'before': case 'after': return this.tooltipDirection; default: return 'above'; } } } src/ng/components/p3xr-error.component.ts000066400000000000000000000063161517666434100210550ustar00rootroot00000000000000import { Component, Input, OnInit, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatToolbarModule } from '@angular/material/toolbar'; import { P3xrButtonComponent } from './p3xr-button.component'; import { I18nService } from '../services/i18n.service'; import { RedisStateService } from '../services/redis-state.service'; /** * Error page component — Angular standalone replacement for AngularJS p3xrError. * * Displays Socket.IO connection error with a reload button. * During hybrid mode, receives $stateParams.error via the downgraded binding. * * AngularJS usage: (routed via UI-Router) * Downgraded usage: */ @Component({ selector: 'p3xr-ng-error', standalone: true, imports: [CommonModule, MatToolbarModule, P3xrButtonComponent], template: ` {{ strings().title?.socketioConnectError || 'Connection Error' }} `, }) export class P3xrErrorComponent implements OnInit { @Input() error: any; strings; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(RedisStateService) private state: RedisStateService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.state.failed.set(true); } reload(): void { location.href = '/'; } } src/ng/components/p3xr-input.component.ts000066400000000000000000000061121517666434100210550ustar00rootroot00000000000000import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; /** * Styled input component — Angular standalone replacement for AngularJS p3xrInput directive. * * The AngularJS version used $mdColors and p3xrCommon for dynamic background/color/border. * The Angular version uses CSS custom properties from the theme system: * --p3xr-input-bg, --p3xr-input-color, --p3xr-border-color * * Implements ControlValueAccessor so it works with ngModel and reactive forms. * * AngularJS usage: * Downgraded usage: */ @Component({ selector: 'p3xr-ng-input', standalone: true, imports: [CommonModule, FormsModule], template: ` `, styles: [` :host { display: inline-block; vertical-align: top; } .p3xr-input { box-sizing: border-box; width: 100%; } .p3xr-input { padding: 3px; border-style: solid; border-width: 2px; margin: 1px; } .p3xr-input:focus { margin: 0px; border-width: 3px; outline: none; } `], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => P3xrInputComponent), multi: true, }] }) export class P3xrInputComponent implements ControlValueAccessor { @Input() type: string = 'text'; @Input() step: string | undefined; @Input() min: string | undefined; @Input() max: string | undefined; @Input() placeholder: string = ''; @Output() enterPressed = new EventEmitter(); value: any = ''; focused = false; private onChange: (value: any) => void = () => { }; onTouched: () => void = () => { }; onValueChange(newValue: any): void { this.value = newValue; this.onChange(newValue); } writeValue(value: any): void { this.value = value; } registerOnChange(fn: (value: any) => void): void { this.onChange = fn; } registerOnTouched(fn: () => void): void { this.onTouched = fn; } onEnterPressed(event: KeyboardEvent): void { event.preventDefault(); // Emit after the current input event turn so parent ngModel handlers have settled. setTimeout(() => this.enterPressed.emit()); } } src/ng/components/p3xr-responsive-button.component.ts000066400000000000000000000047221517666434100234310ustar00rootroot00000000000000import { Component, Input, Output, EventEmitter, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; /** * Responsive action button — shows mat-raised-button with text+icon on desktop (>960px), * mat-mini-fab with icon-only + tooltip on mobile. * * Usage: * * * * Colors: 'primary' | 'accent' | 'warn' */ @Component({ selector: 'p3xr-responsive-button', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule], template: ` @if (isWide) { } @else { } `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class P3xrResponsiveButtonComponent implements OnInit, OnDestroy { @Input() icon = ''; @Input() label = ''; @Input() color: 'primary' | 'accent' | 'warn' = 'primary'; @Input() disabled = false; @Output() clicked = new EventEmitter(); isWide = true; private unsub: (() => void) | null = null; constructor( @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) {} ngOnInit(): void { const sub = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); this.unsub = () => sub.unsubscribe(); } ngOnDestroy(): void { this.unsub?.(); } } src/ng/dialogs/000077500000000000000000000000001517666434100137105ustar00rootroot00000000000000src/ng/dialogs/ask-authorization-dialog.component.ts000066400000000000000000000063631517666434100232020ustar00rootroot00000000000000import { Component, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { I18nService } from '../services/i18n.service'; /** * Ask Authorization dialog — Angular replacement for p3xrDialogAskAuthorization. * Simple username/password form. Returns { username, password } on submit. */ @Component({ selector: 'p3xr-ask-authorization-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatToolbarModule, DialogCancelButtonComponent, ], template: `
{{ strings().label?.askAuth || 'Authorization' }} {{ strings().form?.connection?.label?.username || 'Username' }} {{ strings().form?.connection?.label?.password || 'Password' }}
`, styles: [` .full-width { width: 100%; } .p3xr-dialog-content { min-width: 300px; } `], }) export class AskAuthorizationDialogComponent { model = { username: '', password: '' }; strings; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(I18nService) private i18n: I18nService, ) { this.strings = this.i18n.strings; } submit(): void { this.dialogRef.close(this.model); } cancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/ask-authorization-dialog.service.ts000066400000000000000000000022211517666434100226250ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the Ask Authorization dialog. * Uses dynamic import() for lazy loading — the dialog component code * is only downloaded when the dialog is first opened. */ @Injectable({ providedIn: 'root' }) export class AskAuthorizationDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options?: { $event?: any }): Promise<{ username: string; password: string }> { const { AskAuthorizationDialogComponent } = await import( /* webpackChunkName: "dialog-ask-auth" */ './ask-authorization-dialog.component' ); const dialogRef = this.dialog.open(AskAuthorizationDialogComponent, createDialogPopupSettings()); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { if (result) { resolve(result); } else { reject(); } }); }); } } src/ng/dialogs/command-palette-dialog.component.ts000066400000000000000000000122471517666434100225760ustar00rootroot00000000000000import { Component, Inject, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatListModule } from '@angular/material/list'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { I18nService } from '../services/i18n.service'; import { ShortcutsService, ShortcutDef } from '../services/shortcuts.service'; @Component({ selector: 'p3xr-command-palette-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatListModule, MatIconModule, MatInputModule, MatFormFieldModule, ], template: `
@for (item of filtered; track item.label; let i = $index) {
{{ item.description }} {{ item.label }}
} @if (filtered.length === 0) {
{{ strings().label?.noResults || 'No results' }}
}
`, styles: [` .p3xr-command-palette { width: 100%; min-width: 400px; } .p3xr-command-palette-search { display: flex; align-items: center; gap: 8px; padding: 12px 16px; border-bottom: 1px solid var(--p3xr-list-border, rgba(0,0,0,0.12)); } .p3xr-command-palette-search input { flex: 1; border: none; outline: none; background: transparent; color: inherit; font-size: 16px; font-family: inherit; } .p3xr-command-palette-list { max-height: 300px; overflow-y: auto; } .p3xr-command-palette-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; cursor: pointer; } .p3xr-command-palette-item:hover, .p3xr-command-palette-item-active { background: var(--p3xr-hover-bg, rgba(0,0,0,0.04)); } .p3xr-command-palette-empty { padding: 16px; text-align: center; opacity: 0.5; } `], }) export class CommandPaletteDialogComponent implements OnInit, AfterViewInit { @ViewChild('searchInput') searchInput!: ElementRef; search = ''; selectedIndex = 0; strings; allItems: Array<{ label: string; description: string; shortcut: ShortcutDef }> = []; filtered: Array<{ label: string; description: string; shortcut: ShortcutDef }> = []; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(I18nService) private i18n: I18nService, @Inject(ShortcutsService) private shortcutsService: ShortcutsService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { const strings = this.strings(); const seen = new Set(); this.allItems = []; for (const s of this.shortcutsService.getShortcuts()) { if (seen.has(s.descriptionKey)) continue; seen.add(s.descriptionKey); this.allItems.push({ label: s.label, description: strings?.label?.[s.descriptionKey] || s.descriptionKey, shortcut: s }); } this.filtered = [...this.allItems]; } ngAfterViewInit(): void { setTimeout(() => this.searchInput?.nativeElement?.focus(), 50); } onKeydown(event: KeyboardEvent): void { if (event.key === 'ArrowDown') { event.preventDefault(); this.selectedIndex = Math.min(this.selectedIndex + 1, this.filtered.length - 1); } else if (event.key === 'ArrowUp') { event.preventDefault(); this.selectedIndex = Math.max(this.selectedIndex - 1, 0); } else if (event.key === 'Enter') { event.preventDefault(); if (this.filtered[this.selectedIndex]) this.execute(this.filtered[this.selectedIndex]); } else if (event.key === 'Escape') { this.dialogRef.close(); } else { this.filter(); } } filter(): void { const q = this.search.toLowerCase().trim(); this.filtered = q ? this.allItems.filter(i => i.description.toLowerCase().includes(q) || i.label.toLowerCase().includes(q)) : [...this.allItems]; this.selectedIndex = 0; } execute(item: { shortcut: ShortcutDef }): void { this.dialogRef.close(); item.shortcut.action(); } } src/ng/dialogs/command-palette-dialog.service.ts000066400000000000000000000015731517666434100222340ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; @Injectable({ providedIn: 'root' }) export class CommandPaletteDialogService { private openRef: MatDialogRef | null = null; constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(): Promise { if (this.openRef) return; const { CommandPaletteDialogComponent } = await import( /* webpackChunkName: "dialog-command-palette" */ './command-palette-dialog.component' ); this.openRef = this.dialog.open(CommandPaletteDialogComponent, { width: '500px', maxWidth: '90vw', position: { top: '100px' }, panelClass: 'p3xr-command-palette-panel', autoFocus: false, }); this.openRef.afterClosed().subscribe(() => { this.openRef = null; }); } } src/ng/dialogs/connection-dialog.component.ts000066400000000000000000001124431517666434100216620ustar00rootroot00000000000000import { AfterViewInit, Component, Inject, NgZone, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { CommonModule } from '@angular/common'; import { CdkTextareaAutosize, TextFieldModule } from '@angular/cdk/text-field'; import { FormsModule, NgForm } from '@angular/forms'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { I18nService } from '../services/i18n.service'; import { SocketService } from '../services/socket.service'; import { CommonService } from '../services/common.service'; import { AskAuthorizationDialogService } from './ask-authorization-dialog.service'; declare const p3xr: any; export interface ConnectionDialogData { type: 'new' | 'edit'; model?: any; } /** * Connection dialog -- Angular replacement for p3xrDialogConnection. * Allows creating/editing Redis connections with support for SSH, TLS, * cluster, and sentinel modes. License tier gating controls feature availability. */ @Component({ selector: 'p3xr-connection-dialog', standalone: true, imports: [ CommonModule, FormsModule, TextFieldModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule, MatAutocompleteModule, DialogCancelButtonComponent, ], template: `
@if (readonlyConnections) { {{ strings().label?.connectiondView }} } @else if (options.type === 'new') { {{ strings().label?.connectiondAdd }} } @else { {{ strings().label?.connectiondEdit }} }
@if (model.id && options.type !== 'new') { {{ strings().label?.id?.id }}
{{ strings().label?.id?.info }}
} {{ strings().form?.connection?.label?.name }} @if (p3xrConnectionForm.controls['name']?.hasError('required') && p3xrConnectionForm.controls['name']?.touched) { {{ strings().form?.error?.required }} } {{ strings().form?.connection?.label?.group || 'Group' }} @for (g of existingGroups; track g) { {{ g }} } {{ model.ssh ? strings().label?.ssh?.on : strings().label?.ssh?.off }} @if (!isReadonlyTier()) {
{{ strings().label?.proSshOnly }}
} @if (model.ssh) {
SSH {{ strings().label?.ssh?.sshHost }} @if (p3xrConnectionForm.controls['sshHost']?.hasError('required') && p3xrConnectionForm.controls['sshHost']?.touched) { {{ strings().form?.error?.required }} } {{ strings().label?.ssh?.sshPort }} @if (p3xrConnectionForm.controls['sshPort']?.hasError('required') && p3xrConnectionForm.controls['sshPort']?.touched) { {{ strings().form?.error?.required }} } {{ strings().label?.ssh?.sshUsername }} @if (p3xrConnectionForm.controls['sshUsername']?.hasError('required') && p3xrConnectionForm.controls['sshUsername']?.touched) { {{ strings().form?.error?.required }} } {{ strings().label?.ssh?.sshPassword }} @if (!readonlyConnections) { }
{{ strings().label?.passwordSecure }}
{{ strings().label?.ssh?.sshPrivateKey }}
{{ strings().label?.secureFeature }}

}

Node 1 {{ strings().form?.connection?.label?.host }} {{ strings().form?.connection?.label?.port }} @if (p3xrConnectionForm.controls['port']?.hasError('min') || p3xrConnectionForm.controls['port']?.hasError('max')) { {{ strings().form?.error?.port }} } {{ strings().label?.askAuth }} {{ strings().form?.connection?.label?.username }} {{ strings().form?.connection?.label?.password }} @if (!readonlyConnections) { }
{{ strings().label?.passwordSecure }}


{{ model.readonly ? strings().label?.readonly?.on : strings().label?.readonly?.off }} @if (!isReadonlyTier()) {
{{ strings().label?.proReadonlyOnly }}
}

{{ model.cluster ? strings().label?.cluster?.on : strings().label?.cluster?.off }}
{{ model.sentinel ? strings().label?.sentinel?.on : strings().label?.sentinel?.off }}
@if (isEnterpriseTier() && (model.cluster === true || model.sentinel === true) && !readonlyConnections) {
{{ strings().label?.addNode }}
}
@if (!isEnterpriseTier()) {
{{ strings().label?.enterpriseClusterSentinelOnly }}
} @if (isEnterpriseTier() && model.sentinel === true) { {{ strings().label?.sentinel?.name }} @if (p3xrConnectionForm.controls['sentinelName']?.hasError('required') && p3xrConnectionForm.controls['sentinelName']?.touched) { {{ strings().form?.error?.required }} } } @if (isEnterpriseTier() && (model.cluster === true || model.sentinel === true)) {
@for (node of model.nodes; track node.id; let idx = $index; let last = $last) {
Node {{ idx + 2 }} @if (!readonlyConnections) {
}
@if (node.id) { {{ strings().label?.id?.nodeId }}
{{ strings().label?.id?.info }}
} {{ strings().form?.connection?.label?.host }} {{ strings().form?.connection?.label?.port }} @if (p3xrConnectionForm.controls['nodePort' + idx]?.hasError('min') || p3xrConnectionForm.controls['nodePort' + idx]?.hasError('max')) { {{ strings().form?.error?.port }} } @if (p3xrConnectionForm.controls['nodePort' + idx]?.hasError('required') && p3xrConnectionForm.controls['nodePort' + idx]?.touched) { {{ strings().form?.error?.required }} } {{ strings().form?.connection?.label?.username }} {{ strings().form?.connection?.label?.password }} @if (!readonlyConnections) { }
{{ strings().label?.passwordSecure }}
@if (!last) {
 
}
}
}
{{ strings().label?.tlsWithoutCert }} {{ strings().label?.tlsRejectUnauthorized }}
@if (model.tlsWithoutCert !== true) {
TLS TLS (redis.crt)
{{ strings().label?.tlsSecure }}

TLS (redis.key)
{{ strings().label?.tlsSecure }}

TLS (ca.crt)
{{ strings().label?.tlsSecure }}

}
@if (!readonlyConnections) { }
`, styles: [` .md-block { width: 100%; } .p3xr-hide-xs { } .p3xr-show-xs { display: none; } @media (max-width: 699px) { .p3xr-hide-xs { display: none; } .p3xr-show-xs { display: inline; } } `], }) export class ConnectionDialogComponent implements AfterViewInit { @ViewChild('p3xrConnectionForm') formRef!: NgForm; @ViewChildren(CdkTextareaAutosize) autosizeTextareas!: QueryList; options: ConnectionDialogData; model: any; strings; existingGroups: string[] = []; groupEnabled = false; // Password visibility toggles passwordVisible = false; sshPasswordVisible = false; nodePasswordVisible: Record = {}; // Readonly connections mode from global state get readonlyConnections(): boolean { return !!p3xr?.state?.cfg?.readonlyConnections; } constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: ConnectionDialogData, @Inject(I18nService) private i18n: I18nService, @Inject(SocketService) private socketService: SocketService, @Inject(CommonService) private commonService: CommonService, @Inject(AskAuthorizationDialogService) private askAuthDialogService: AskAuthorizationDialogService, @Inject(NgZone) private ngZone: NgZone, ) { this.strings = this.i18n.strings; this.options = data; this.model = this.initModel(data); // Collect existing group names for autocomplete const connections = p3xr?.state?.connections?.list || []; const groups = new Set(); for (const conn of connections) { if (conn.group && typeof conn.group === 'string' && conn.group.trim()) { groups.add(conn.group.trim()); } } this.existingGroups = [...groups].sort(); this.groupEnabled = !!this.model.group?.trim(); } onGroupToggle(): void { if (!this.groupEnabled) { this.model.group = undefined; } } ngAfterViewInit(): void { this.scheduleTextareaResize(); this.autosizeTextareas.changes.subscribe(() => this.scheduleTextareaResize()); } scheduleTextareaResize(): void { this.ngZone.runOutsideAngular(() => { requestAnimationFrame(() => { requestAnimationFrame(() => { this.autosizeTextareas?.forEach((textarea) => textarea.resizeToFitContent(true)); }); }); }); } private initModel(data: ConnectionDialogData): any { let model: any; if (data.model !== undefined) { model = p3xr.clone(data.model); // For existing connections, set sensitive fields to the model id // (server-side resolves these by id) model.password = data.model.id; model.tlsCrt = data.model.id; model.tlsKey = data.model.id; model.tlsCa = data.model.id; model.sshPassword = data.model.id; model.sshPrivateKey = data.model.id; } else { model = { name: undefined, host: undefined, port: 6379, askAuth: false, password: undefined, username: undefined, id: undefined, group: undefined, readonly: undefined, tlsWithoutCert: false, tlsRejectUnauthorized: false, tlsCrt: undefined, tlsKey: undefined, tlsCa: undefined, }; } // Ensure SSH fields exist if (!model.hasOwnProperty('ssh')) { model = { ...model, ssh: false, sshHost: undefined, sshPort: 22, sshUsername: undefined, sshPassword: data.model?.id, sshPrivateKey: data.model?.id, }; } if (!model.hasOwnProperty('cluster')) { model.cluster = false; } if (!model.hasOwnProperty('sentinel')) { model.sentinel = false; } if (!model.hasOwnProperty('nodes')) { model.nodes = []; } // For existing nodes, set password to node id (server-side resolves) for (const node of model.nodes) { node.password = node.id; } return model; } // --- License tier helpers --- private getActiveTier(): string { // All features are free — always return enterprise tier return 'enterprise'; } isReadonlyTier(): boolean { const tier = this.getActiveTier(); return tier === 'pro' || tier === 'enterprise'; } isEnterpriseTier(): boolean { return this.getActiveTier() === 'enterprise'; } // --- Cluster/Sentinel mutual exclusion --- onClusterChange(): void { if (this.model.cluster === true) { this.model.sentinel = false; } } onSentinelChange(): void { if (this.model.sentinel === true) { this.model.cluster = false; } } // --- Node management --- addNode(index?: number): void { const newNode = { host: undefined, port: undefined, password: undefined, username: undefined, id: p3xr.nextId(), }; if (index === undefined) { this.model.nodes.push(newNode); } else { this.model.nodes.splice(index + 1, 0, newNode); } } async removeNode(ev: Event, index: number): Promise { try { await this.commonService.confirm({ event: ev, message: this.strings().confirm?.deleteConnectionText, }); this.model.nodes.splice(index, 1); this.commonService.toast({ message: this.strings().status?.nodeRemoved, }); } catch (e) { if (e === undefined) { return; } this.commonService.generalHandleError(e); } } // --- Form validation --- private handleInvalidForm(): boolean { if (this.formRef && this.formRef.invalid) { this.commonService.toast({ message: this.strings().form?.error?.invalid, }); return false; } return true; } // --- Test connection --- async testConnection($event: Event): Promise { // Mark form as submitted to trigger validation display if (this.formRef) { Object.keys(this.formRef.controls).forEach(key => { this.formRef.controls[key].markAsTouched(); }); } if (!this.handleInvalidForm()) { return; } try { const authModel = p3xr.clone(this.model); if (this.model.askAuth === true) { const auth = await this.askAuthDialogService.show({ $event: $event, }); authModel.username = undefined; authModel.password = undefined; if (auth.username) { authModel.username = auth.username; } if (auth.password) { authModel.password = auth.password; } } p3xr.ui.overlay.show({ message: this.strings().title?.connectingRedis, }); const response = await this.socketService.request({ action: 'redis-test-connection', payload: { model: authModel, }, }); console.warn('response', response); this.commonService.toast({ message: this.strings().status?.redisConnected, }); } catch (e) { this.commonService.generalHandleError(e); } finally { p3xr.ui.overlay.hide(); } } // --- Save --- async submit(): Promise { if (!this.handleInvalidForm()) { return; } if (this.model.host === undefined) { this.model.host = 'localhost'; } if (this.model.port === undefined) { this.model.port = 6379; } if (this.options.type === 'new') { this.model.id = p3xr.nextId(); } for (const node of this.model.nodes) { if (node.host === undefined) { node.host = 'localhost'; } if (node.id === undefined) { node.id = p3xr.nextId(); } } try { const saveModel = p3xr.clone(this.model); // Trim group name to avoid inconsistencies if (typeof saveModel.group === 'string') { saveModel.group = saveModel.group.trim() || undefined; } // Strip features by license tier if (!this.isReadonlyTier()) { saveModel.readonly = false; saveModel.ssh = false; saveModel.sshHost = undefined; saveModel.sshPort = 22; saveModel.sshUsername = undefined; saveModel.sshPassword = undefined; saveModel.sshPrivateKey = undefined; } if (!this.isEnterpriseTier()) { saveModel.cluster = false; saveModel.sentinel = false; saveModel.sentinelName = undefined; saveModel.nodes = []; } await this.socketService.request({ action: 'connection-save', payload: { model: saveModel, }, }); this.commonService.toast({ message: this.options.type === 'new' ? this.strings().status?.added : this.strings().status?.saved, }); this.dialogRef.close(undefined); } catch (e) { this.commonService.generalHandleError(e); } } // --- Cancel --- cancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/connection-dialog.service.ts000066400000000000000000000033001517666434100213070ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import type { ConnectionDialogData } from './connection-dialog.component'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the Connection dialog. * Uses dynamic import() for lazy loading -- the dialog component code * is only downloaded when the dialog is first opened. */ @Injectable({ providedIn: 'root' }) export class ConnectionDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} /** * Opens the connection dialog. * Matches the AngularJS p3xrDialogConnection.show() API. * * @param options.type - 'new' for creating a new connection, 'edit' for editing existing * @param options.model - existing connection model (for edit mode) * @param options.$event - the triggering DOM event (unused in Angular Material but kept for API compat) */ async show(options: { type: 'new' | 'edit'; model?: any; $event?: any }): Promise { const { ConnectionDialogComponent } = await import( /* webpackChunkName: "dialog-connection" */ './connection-dialog.component' ); const data: ConnectionDialogData = { type: options.type, model: options.model, }; const dialogRef = this.dialog.open(ConnectionDialogComponent, createDialogPopupSettings({ data, panelClass: ['fullscreen-dialog', 'p3xr-connection-dialog-panel'], })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe(() => { resolve(); }); }); } } src/ng/dialogs/dialog-popup.ts000066400000000000000000000051471517666434100166670ustar00rootroot00000000000000import { MatDialogConfig } from '@angular/material/dialog'; type DialogPanelClass = string | string[] | undefined; type DialogBackdropClass = string | string[] | undefined; export interface DialogPopupSettings extends Omit, 'panelClass' | 'backdropClass'> { panelClass?: DialogPanelClass; backdropClass?: DialogBackdropClass; } const BASE_DIALOG_PANEL_CLASS = 'p3xr-dialog-panel'; const BASE_DIALOG_BACKDROP_CLASS = 'p3xr-dialog-backdrop'; const NO_ANIMATION_PANEL_CLASS = 'p3xr-dialog-no-animation'; const NO_ANIMATION_BACKDROP_CLASS = 'p3xr-dialog-backdrop-no-animation'; function normalizeClassList(value: string | string[] | undefined): string[] { if (!value) { return []; } const classes = Array.isArray(value) ? value : [value]; return classes.filter((value): value is string => typeof value === 'string' && value.length > 0); } function readStorageItem(name: string): string | null { try { return localStorage.getItem(name); } catch { return null; } } function isDialogAnimationEnabled(): boolean { if (typeof document === 'undefined') { return true; } const body = document.body; if (body?.classList.contains('p3xr-no-animation')) { return false; } if (body?.classList.contains('p3xr-animation')) { return true; } return readStorageItem('p3xr-animation-settings') === '1'; } export function createDialogPopupSettings(options: DialogPopupSettings = {}): MatDialogConfig { const { panelClass, backdropClass, autoFocus, disableClose, maxWidth, maxHeight, enterAnimationDuration, exitAnimationDuration, ...rest } = options; const animationEnabled = isDialogAnimationEnabled(); const panelClasses = [BASE_DIALOG_PANEL_CLASS, ...normalizeClassList(panelClass)]; const backdropClasses = [BASE_DIALOG_BACKDROP_CLASS, ...normalizeClassList(backdropClass)]; if (!animationEnabled) { panelClasses.push(NO_ANIMATION_PANEL_CLASS); backdropClasses.push(NO_ANIMATION_BACKDROP_CLASS); } return { autoFocus: autoFocus ?? true, disableClose: disableClose ?? false, maxWidth: maxWidth ?? '100vw', maxHeight: maxHeight ?? '100vh', enterAnimationDuration: enterAnimationDuration ?? (animationEnabled ? undefined : '0ms'), exitAnimationDuration: exitAnimationDuration ?? (animationEnabled ? undefined : '0ms'), ...rest, panelClass: Array.from(new Set(panelClasses)), backdropClass: Array.from(new Set(backdropClasses)), }; } src/ng/dialogs/json-editor-dialog.component.ts000066400000000000000000000263711517666434100217640ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../services/i18n.service'; import { ThemeService } from '../services/theme.service'; import { CommonService } from '../services/common.service'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; declare const p3xr: any; export interface JsonEditorDialogData { value: string; hideFormatSave?: boolean; } @Component({ selector: 'p3xr-json-editor-dialog', standalone: true, imports: [ CommonModule, MatDialogModule, MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule, DialogCancelButtonComponent, ], template: ` edit {{ strings().intention?.jsonViewEditor || 'JSON Editor' }} @if (isJson) {
} @else { {{ strings().label?.jsonViewNotParsable || 'Not valid JSON' }} } @if (isJson && !isReadonly) { @if (!hideFormatSave) { } } `, styles: [` .hide-sm { display: inline; } .p3xr-dialog-content-editor { padding: 0 !important; overflow: hidden !important; } .p3xr-dialog-content-message { min-height: 320px; } .p3xr-codemirror-host { height: 100%; min-height: inherit; } .p3xr-codemirror-host .cm-editor { height: 100%; } @media (max-width: 959px) { .hide-sm { display: none; } } `], }) export class JsonEditorDialogComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('editorContainer') editorContainer!: ElementRef; isJson = false; isReadonly = false; hideFormatSave = false; lineWrap = true; minHeight = '400px'; strings; private editorView: any; private wrapCompartment: any; private EditorViewClass: any; private obj: any; private resizeHandler: any; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: JsonEditorDialogData, @Inject(I18nService) private i18n: I18nService, @Inject(ThemeService) private theme: ThemeService, @Inject(CommonService) private common: CommonService, @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, ) { this.strings = this.i18n.strings; } ngOnInit(): void { try { this.obj = JSON.parse(this.data.value); this.isJson = true; } catch (e) { this.obj = undefined; this.isJson = false; } this.isReadonly = p3xr?.state?.connection?.readonly === true; this.hideFormatSave = this.data.hideFormatSave === true; this.updateMinHeight(); } async ngAfterViewInit(): Promise { if (!this.isJson || !this.editorContainer) return; const { EditorView, keymap, lineNumbers, highlightActiveLineGutter, highlightSpecialChars, drawSelection, highlightActiveLine, rectangularSelection, crosshairCursor } = await import( /* webpackChunkName: "codemirror-view" */ '@codemirror/view' ); const { EditorState, Compartment } = await import( /* webpackChunkName: "codemirror-state" */ '@codemirror/state' ); this.wrapCompartment = new Compartment(); const { json } = await import( /* webpackChunkName: "codemirror-lang-json" */ '@codemirror/lang-json' ); const { defaultKeymap, history, historyKeymap } = await import( /* webpackChunkName: "codemirror-commands" */ '@codemirror/commands' ); const { bracketMatching, foldGutter, foldKeymap, indentOnInput, syntaxHighlighting, defaultHighlightStyle } = await import( /* webpackChunkName: "codemirror-language" */ '@codemirror/language' ); const { closeBrackets, closeBracketsKeymap } = await import( /* webpackChunkName: "codemirror-autocomplete" */ '@codemirror/autocomplete' ); const { searchKeymap, highlightSelectionMatches } = await import( /* webpackChunkName: "codemirror-search" */ '@codemirror/search' ); const { lintKeymap } = await import( /* webpackChunkName: "codemirror-lint" */ '@codemirror/lint' ); let themeExtension; if (this.theme.isDark()) { const { oneDark } = await import( /* webpackChunkName: "codemirror-theme-dark" */ '@codemirror/theme-one-dark' ); themeExtension = oneDark; } else { const { githubLight } = await import( /* webpackChunkName: "codemirror-theme-light" */ '@uiw/codemirror-theme-github' ); themeExtension = githubLight; } const doc = JSON.stringify(this.obj, null, p3xr?.settings?.jsonFormat ?? 2); this.EditorViewClass = EditorView; this.editorView = new EditorView({ state: EditorState.create({ doc: doc, extensions: [ lineNumbers(), highlightActiveLineGutter(), highlightSpecialChars(), history(), foldGutter(), drawSelection(), indentOnInput(), syntaxHighlighting(defaultHighlightStyle, { fallback: true }), bracketMatching(), closeBrackets(), rectangularSelection(), crosshairCursor(), highlightActiveLine(), highlightSelectionMatches(), keymap.of([ ...closeBracketsKeymap, ...defaultKeymap, ...searchKeymap, ...historyKeymap, ...foldKeymap, ...lintKeymap, ]), json(), themeExtension, EditorView.theme({ '.cm-scroller': { 'overflow-x': 'scroll', 'scrollbar-width': 'auto', }, '.cm-scroller::-webkit-scrollbar': { 'height': '12px', 'display': 'block', }, '.cm-scroller::-webkit-scrollbar-track': { 'background': 'rgba(128, 128, 128, 0.1)', }, '.cm-scroller::-webkit-scrollbar-thumb': { 'background': 'rgba(128, 128, 128, 0.4)', 'border-radius': '6px', }, '.cm-scroller::-webkit-scrollbar-thumb:hover': { 'background': 'rgba(128, 128, 128, 0.6)', }, }), this.wrapCompartment.of(this.lineWrap ? EditorView.lineWrapping : []), EditorState.readOnly.of(this.isReadonly), ], }), parent: this.editorContainer.nativeElement, }); // Resize handler this.resizeHandler = () => { this.updateMinHeight(); }; window.addEventListener('resize', this.resizeHandler); } ngOnDestroy(): void { if (this.resizeHandler) { window.removeEventListener('resize', this.resizeHandler); } if (this.editorView) { this.editorView.destroy(); this.editorView = undefined; } } toggleWrap(): void { this.lineWrap = !this.lineWrap; if (this.editorView && this.wrapCompartment && this.EditorViewClass) { this.editorView.dispatch({ effects: this.wrapCompartment.reconfigure(this.lineWrap ? this.EditorViewClass.lineWrapping : []), }); } } save(format: boolean): void { try { const text = this.editorView.state.doc.toString(); const parsed = JSON.parse(text); const result = JSON.stringify(parsed, null, format ? (p3xr?.settings?.jsonFormat ?? 2) : 0); this.dialogRef.close({ obj: result }); } catch (e) { this.common.generalHandleError(e); } } close(): void { this.dialogRef.close(undefined); } private updateMinHeight(): void { const isMobile = this.breakpointObserver.isMatched('(max-width: 959px)'); this.minHeight = isMobile ? '100%' : `${Math.max(10, window.innerHeight - 100)}px`; } } src/ng/dialogs/json-editor-dialog.service.ts000066400000000000000000000032271517666434100214150ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; import { MainCommandService } from '../services/main-command.service'; /** * Service to open the JSON Editor dialog. * Uses dynamic import() for lazy loading. * Returns { obj: string } (JSON string) on save, or rejects on cancel. */ @Injectable({ providedIn: 'root' }) export class JsonEditorDialogService { constructor( @Inject(MatDialog) private dialog: MatDialog, @Inject(MainCommandService) private cmd: MainCommandService, ) {} async show(options: { value: string; event?: any; $event?: any; hideFormatSave?: boolean }): Promise<{ obj: string }> { const { JsonEditorDialogComponent } = await import( /* webpackChunkName: "dialog-json-editor" */ './json-editor-dialog.component' ); // Pause resizer during dialog this.cmd.mainResizer$.next({ drag: false }); const dialogRef = this.dialog.open(JsonEditorDialogComponent, createDialogPopupSettings({ data: { value: options.value, hideFormatSave: options.hideFormatSave }, disableClose: true, width: '75%', maxHeight: '90vh', })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { // Resume resizer this.cmd.mainResizer$.next({ drag: true }); if (result) { resolve(result); } else { reject(); } }); }); } } src/ng/dialogs/json-view-dialog.component.ts000066400000000000000000000077521517666434100214520ustar00rootroot00000000000000import { Component, Inject, OnInit, ViewChild } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { JsonTreeComponent } from '../components/json-tree.component'; import { I18nService } from '../services/i18n.service'; export interface JsonViewDialogData { value: string; } /** * JSON View dialog — Angular replacement for p3xrDialogJsonView. * Displays a JSON string as an expandable tree. Replaces angular-json-tree. */ @Component({ selector: 'p3xr-json-view-dialog', standalone: true, imports: [ CommonModule, MatDialogModule, MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule, JsonTreeComponent, ], template: ` table_chart {{ strings().intention?.jsonViewShow || 'JSON View' }} @if (isJson) { } @if (isJson) { } @else {
{{ strings().label?.jsonViewNotParsable || 'Not valid JSON' }}
}
`, styles: [` .p3xr-json-view-content { min-height: 200px; max-height: 70vh; overflow: auto; } `], }) export class JsonViewDialogComponent implements OnInit { @ViewChild(JsonTreeComponent) jsonTree?: JsonTreeComponent; obj: any; isJson = false; treeExpanded: boolean | 'recursive' = true; strings; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: JsonViewDialogData, @Inject(I18nService) private i18n: I18nService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { try { this.obj = JSON.parse(this.data.value); this.isJson = true; } catch (e) { this.obj = undefined; this.isJson = false; } } expandAll(): void { this.jsonTree?.treeControl.expandAll(); } collapseAll(): void { this.jsonTree?.treeControl.collapseAll(); // Keep root expanded const root = this.jsonTree?.treeControl.dataNodes?.[0]; if (root) { this.jsonTree!.treeControl.expand(root); } } close(): void { this.dialogRef.close(); } } src/ng/dialogs/json-view-dialog.service.ts000066400000000000000000000017371517666434100211050ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the JSON View dialog. * Uses dynamic import() for lazy loading. */ @Injectable({ providedIn: 'root' }) export class JsonViewDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options: { value: string; event?: any; $event?: any }): Promise { const { JsonViewDialogComponent } = await import( /* webpackChunkName: "dialog-json-view" */ './json-view-dialog.component' ); const dialogRef = this.dialog.open(JsonViewDialogComponent, createDialogPopupSettings({ data: { value: options.value }, width: '75%', maxHeight: '90vh', })); return new Promise((resolve) => { dialogRef.afterClosed().subscribe(() => resolve()); }); } } src/ng/dialogs/key-import-dialog.component.ts000066400000000000000000000121611517666434100216170ustar00rootroot00000000000000import { Component, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatDividerModule } from '@angular/material/divider'; import { MatRadioModule } from '@angular/material/radio'; import { ScrollingModule } from '@angular/cdk/scrolling'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { I18nService } from '../services/i18n.service'; import { SocketService } from '../services/socket.service'; import { CommonService } from '../services/common.service'; declare const p3xr: any; @Component({ selector: 'p3xr-key-import-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatToolbarModule, MatButtonModule, MatIconModule, MatDividerModule, MatRadioModule, ScrollingModule, DialogCancelButtonComponent, ], template: ` {{ strings().intention?.importKeys || 'Import Keys' }}
{{ strings().label?.importPreview || 'Preview' }} ({{ data.keys.length }})
{{ entry.key }} {{ strings().redisTypes?.[entry.type] || entry.type }}
{{ strings().label?.importConflict || 'If key already exists:' }}
{{ strings().label?.importOverwrite || 'Overwrite' }} {{ strings().label?.importSkip || 'Skip' }}
`, styles: [` .p3xr-import-preview-list { height: 300px; } .p3xr-import-preview-row { display: flex; align-items: center; justify-content: space-between; width: 100%; gap: 8px; height: 40px; padding: 0 16px; box-sizing: border-box; border-bottom: 1px solid var(--p3xr-list-border, rgba(0,0,0,0.12)); } .p3xr-import-key-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: 'Roboto Mono', monospace; font-size: 13px; } `], }) export class KeyImportDialogComponent { strings; conflictMode: 'overwrite' | 'skip' = 'overwrite'; importing = false; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: { keys: any[] }, @Inject(I18nService) private i18n: I18nService, @Inject(SocketService) private socket: SocketService, @Inject(CommonService) private common: CommonService, ) { this.strings = this.i18n.strings; } trackByKey(_index: number, entry: any): string { return entry.key; } cancel(): void { this.dialogRef.close(null); } async doImport(): Promise { const keys = this.data.keys; const conflictMode = this.conflictMode; this.dialogRef.close({ pending: true, keys, conflictMode }); } } src/ng/dialogs/key-import-dialog.service.ts000066400000000000000000000020731517666434100212560ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; @Injectable({ providedIn: 'root' }) export class KeyImportDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options: { data: any }): Promise { const { KeyImportDialogComponent } = await import( /* webpackChunkName: "dialog-key-import" */ './key-import-dialog.component' ); const dialogRef = this.dialog.open(KeyImportDialogComponent, createDialogPopupSettings({ data: options.data, disableClose: true, width: '700px', maxWidth: '95vw', maxHeight: '90vh', })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { if (result) { resolve(result); } else { reject(); } }); }); } } src/ng/dialogs/key-new-or-set-dialog.component.ts000066400000000000000000000371631517666434100223160ustar00rootroot00000000000000import { Component, Inject, OnInit, ChangeDetectorRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../services/i18n.service'; import { CommonService } from '../services/common.service'; import { SocketService } from '../services/socket.service'; import { JsonViewDialogService } from './json-view-dialog.service'; import { JsonEditorDialogService } from './json-editor-dialog.service'; declare const p3xr: any; export interface KeyNewOrSetDialogData { type: 'add' | 'edit' | 'append'; $event?: any; node?: any; model?: any; } /** * Key New/Edit dialog — Angular replacement for p3xrDialogKeyNewOrSet. * Multi-type form for creating or editing Redis keys (string, list, hash, set, zset, stream). */ @Component({ selector: 'p3xr-key-new-or-set-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule, DialogCancelButtonComponent, ], template: `
{{ getTitle() }} {{ strings().form?.key?.field?.key || 'Key' }} @if (keyForm.controls['key']?.invalid && keyForm.controls['key']?.touched) { {{ strings().form?.key?.error?.key }} } {{ strings().form?.key?.field?.type || 'Type' }} @for (t of types; track t) { {{ strings().redisTypes?.[t] || t }} } @switch (model.type) { @case ('list') { {{ strings().form?.key?.field?.index || 'Index' }}
{{ strings().label?.redisListIndexInfo }}
} @case ('hash') { {{ strings().form?.key?.field?.hashKey || 'Hash Key' }} @if (keyForm.controls['hashKey']?.invalid && keyForm.controls['hashKey']?.touched) { {{ strings().form?.key?.error?.hashKey }} } } @case ('zset') { {{ strings().form?.key?.field?.score || 'Score' }} @if (keyForm.controls['score']?.invalid && keyForm.controls['score']?.touched) { {{ strings().form?.key?.error?.score }} } } @case ('stream') { {{ strings().form?.key?.field?.streamTimestamp || 'Timestamp' }} @if (keyForm.controls['streamTimestamp']?.invalid && keyForm.controls['streamTimestamp']?.touched) { {{ strings().form?.key?.error?.streamTimestamp }} }
{{ strings().label?.streamTimestampId }}
} } @if (model.type !== 'stream' && hasProOrEnterprise()) { } @if (hasProOrEnterprise()) { } {{ strings().label?.validateJson || 'Validate JSON' }} @if (model.type === 'stream') {
{{ strings().label?.streamValue }}
} @if (isBuffer) {
{{ strings().label?.isBuffer?.({ maxValueAsBuffer: p3xr?.settings?.prettyBytes?.(p3xr?.settings?.maxValueAsBuffer) ?? '' }) }} {{ bufferDisplay(model.value) }}
} {{ strings().form?.key?.field?.value || 'Value' }} @if (keyForm.controls['value']?.invalid && keyForm.controls['value']?.touched) { {{ strings().form?.key?.error?.value }} }
@if (!isReadonly) { }
`, styles: [` .full-width { width: 100%; } .info-text { opacity: 0.5; font-size: 12px; margin-bottom: 8px; } .hide-sm { display: inline; } @media (max-width: 959px) { .hide-sm { display: none; } } `], }) export class KeyNewOrSetDialogComponent implements OnInit { model: any = {}; options: KeyNewOrSetDialogData; get types(): string[] { const base = ['string', 'list', 'hash', 'set', 'zset', 'stream']; if (p3xr?.state?.hasReJSON && p3xr?.state?.hasProOrEnterpriseJsonBinary) { base.push('json'); } return base; } validateJson = false; isReadonly = false; isBuffer = false; isWide = window.innerWidth >= 720; strings; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: KeyNewOrSetDialogData, @Inject(I18nService) private i18n: I18nService, @Inject(CommonService) private common: CommonService, @Inject(SocketService) private socket: SocketService, @Inject(JsonViewDialogService) private jsonViewDialog: JsonViewDialogService, @Inject(JsonEditorDialogService) private jsonEditorDialog: JsonEditorDialogService, @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; this.options = data; } ngOnInit(): void { this.isReadonly = p3xr?.state?.connection?.readonly === true; this.breakpointObserver.observe('(min-width: 720px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); this.model = { type: 'string', key: this.data.node?.key ? this.data.node.key + (p3xr?.settings?.redisTreeDivider ?? ':') : '', value: undefined, score: undefined, streamTimestamp: '*', hashKey: undefined, index: undefined, }; if (this.data.model) { Object.assign(this.model, this.data.model); } this.isBuffer = typeof this.model.value === 'object' && this.model.value !== null; } getTitle(): string { const s = this.strings(); if (this.options.type === 'edit') return s.form?.key?.label?.formName?.edit || 'Edit Key'; if (this.options.type === 'append') return s.form?.key?.label?.formName?.append || 'Append'; return s.form?.key?.label?.formName?.add || 'Add Key'; } hasProOrEnterprise(): boolean { return p3xr?.state?.hasProOrEnterpriseJsonBinary === true; } bufferDisplay(value: any): string { if (value?.byteLength !== undefined) { return '(' + p3xr?.settings?.prettyBytes(value.byteLength) + ')'; } return ''; } async copy(): Promise { await p3xr.clipboard({ value: this.model.value }); this.common.toast(this.strings().status?.dataCopied || 'Copied'); } async openJsonViewer(): Promise { await this.jsonViewDialog.show({ value: this.model.value }); } async openJsonEditor(): Promise { try { const result = await this.jsonEditorDialog.show({ value: this.model.value }); this.model.value = result.obj; } catch (e) { /* cancelled */ } } formatJson(): void { try { this.model.value = JSON.stringify(JSON.parse(this.model.value), null, p3xr?.settings?.jsonFormat ?? 2); } catch (e) { this.common.toast(this.strings().label?.jsonViewNotParsable || 'Not valid JSON'); } } async onFileSelected(event: Event): Promise { const input = event.target as HTMLInputElement; const file = input.files?.[0]; if (!file) return; try { await this.common.confirm({ message: this.strings().confirm?.uploadBuffer || 'Upload buffer?' }); const arrayBuffer = await file.arrayBuffer(); this.model.value = arrayBuffer; this.isBuffer = true; this.common.toast(this.strings().confirm?.uploadBufferDone || 'Buffer uploaded'); } catch (e) { /* cancelled */ } input.value = ''; } async submit(): Promise { if (!this.model.key || this.model.key.trim().length === 0) { this.common.toast(this.strings().form?.key?.error?.key || 'Key cannot be empty'); return; } if (this.validateJson) { try { JSON.parse(this.model.value); } catch (e) { this.common.toast(this.strings().label?.jsonViewNotParsable || 'Not valid JSON'); return; } } try { p3xr.ui.overlay.show(); const response = await this.socket.request({ action: 'key-new-or-set', payload: { type: this.options.type, originalValue: this.data.model?.value, originalHashKey: this.data.model?.hashKey, model: p3xr.clone(this.model), }, }); if (typeof window['gtag'] === 'function') { window['gtag']('config', p3xr?.settings?.googleAnalytics, { page_path: '/key-new-or-set' }); } this.common.toast(this.strings().status?.set || 'Saved'); this.dialogRef.close(response); } catch (e) { this.common.generalHandleError(e); } finally { p3xr.ui.overlay.hide(); } } cancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/key-new-or-set-dialog.service.ts000066400000000000000000000023461517666434100217470ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the Key New/Edit dialog. * Uses dynamic import() for lazy loading. */ @Injectable({ providedIn: 'root' }) export class KeyNewOrSetDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options: { type: 'add' | 'edit' | 'append'; $event?: any; node?: any; model?: any; }): Promise { const { KeyNewOrSetDialogComponent } = await import( /* webpackChunkName: "dialog-key-new-or-set" */ './key-new-or-set-dialog.component' ); const dialogRef = this.dialog.open(KeyNewOrSetDialogComponent, createDialogPopupSettings({ data: options, disableClose: true, width: '75%', maxHeight: '90vh', })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { if (result) { resolve(result); } else { reject(); } }); }); } } src/ng/dialogs/prompt-dialog.component.ts000066400000000000000000000065611517666434100210470ustar00rootroot00000000000000import { Component, Inject, ChangeDetectorRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; export interface PromptDialogData { title: string; placeholder: string; initialValue?: string; okButton: string; cancelButton: string; } @Component({ selector: 'p3xr-prompt-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule, DialogCancelButtonComponent, ], template: ` {{ data.title }} {{ data.placeholder }} @if (inputField.invalid && inputField.touched) { {{ data.placeholder }} is required } `, styles: [`.full-width { width: 100%; min-width: 0; }`], }) export class PromptDialogComponent { value: string; isWide = true; constructor( @Inject(MAT_DIALOG_DATA) public data: PromptDialogData, @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.value = data.initialValue || ''; this.breakpointObserver.observe('(min-width: 600px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); } onOk(): void { if (!this.value?.trim()) return; this.dialogRef.close(this.value); } onCancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/treecontrol-settings-dialog.component.ts000066400000000000000000000442661517666434100237300ustar00rootroot00000000000000import { Component, Inject, OnInit, AfterViewInit, ViewChild, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, NgForm, AbstractControl } from '@angular/forms'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { ErrorStateMatcher } from '@angular/material/core'; import { MatInputModule } from '@angular/material/input'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { I18nService } from '../services/i18n.service'; import { SettingsService } from '../services/settings.service'; import { CommonService } from '../services/common.service'; import { MainCommandService } from '../services/main-command.service'; import { SocketService } from '../services/socket.service'; import { TreeBuilderService } from '../services/tree-builder.service'; declare const p3xr: any; /** * Tree control settings dialog — Angular replacement for p3xrDialogTreecontrolSettings. * Edits pagination, sorting, search, display, and animation settings. */ @Component({ selector: 'p3xr-treecontrol-settings-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatSlideToggleModule, MatButtonModule, MatIconModule, MatToolbarModule, DialogCancelButtonComponent, ], template: `
{{ strings().form?.treeSettings?.label?.formName || 'Redis Settings' }}
@if (reducedFunctions) {
{{ strings().form?.treeSettings?.keyCount?.() }}
{{ strings().label?.tooManyKeys?.({ count: keysRawLength, maxLightKeysCount: settings.maxLightKeysCount }) }}
}
{{ strings().form?.treeSettings?.field?.treeSeparator || 'Tree separator' }}
{{ strings().label?.treeSeparatorEmpty }}
{{ strings().form?.treeSettings?.field?.page || 'Page size' }} @if (isFieldInvalid('pageCount', 10, 5000)) {
{{ strings().form?.treeSettings?.error?.page || 'The page count must be an integer between 10 - 5000' }}
}
{{ strings().form?.treeSettings?.field?.keyPageCount || 'Key page size' }} @if (isFieldInvalid('keyPageCount', 5, 100)) {
{{ strings().form?.treeSettings?.error?.keyPageCount }}
}
{{ strings().form?.treeSettings?.maxValueDisplay || 'Max value display' }} @if (isFieldInvalid('maxValueDisplay', -1, 32768)) {
{{ strings().form?.treeSettings?.error?.maxValueDisplay }}
} @else {
{{ strings().form?.treeSettings?.maxValueDisplayInfo }}
}
{{ strings().form?.treeSettings?.maxKeys || 'Max keys' }} @if (isFieldInvalid('maxKeys', 5, 100000)) {
{{ strings().form?.treeSettings?.error?.maxKeys }}
} @else {
{{ strings().form?.treeSettings?.maxKeysInfo }}
}
@if (!reducedFunctions) {
{{ model.keysSort ? strings().label?.keysSort?.on : strings().label?.keysSort?.off }}
{{ strings().label?.treeKeyStore }}
{{ model.searchClientSide ? strings().form?.treeSettings?.label?.searchModeClient : strings().form?.treeSettings?.label?.searchModeServer }}
{{ strings().page?.treeControls?.search?.info }} @if (dbsize > settings.maxLightKeysCount) {
{{ strings().page?.treeControls?.search?.largeSetInfo }}
}
}
{{ model.searchStartsWith ? strings().form?.treeSettings?.label?.searchModeStartsWith : strings().form?.treeSettings?.label?.searchModeIncludes }}
{{ model.jsonFormat ? strings().form?.treeSettings?.label?.jsonFormatTwoSpace : strings().form?.treeSettings?.label?.jsonFormatFourSpace }}
{{ model.animation ? strings().form?.treeSettings?.label?.animation : strings().form?.treeSettings?.label?.noAnimation }}
`, encapsulation: ViewEncapsulation.None, styles: [` .md-block { width: 100%; } .p3xr-field-error .mdc-line-ripple::before, .p3xr-field-error .mdc-line-ripple::after { border-bottom-color: #f44336 !important; } .p3xr-field-error .mdc-floating-label, .p3xr-field-error .mat-mdc-form-field-required-marker { color: #f44336 !important; } .p3xr-field-error-text { color: #f44336; font-size: 12px; margin-top: -16px; padding-left: 16px; } .p3xr-field-hint-text { color: var(--mat-app-text-color, rgba(0, 0, 0, 0.6)); opacity: 0.7; font-size: 12px; margin-top: -16px; padding-left: 16px; } `], }) export class TreecontrolSettingsDialogComponent implements OnInit, AfterViewInit { @ViewChild('settingsForm') private formRef?: NgForm; model: any = {}; reducedFunctions = false; keysRawLength = 0; dbsize = 0; strings; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(I18nService) private i18n: I18nService, @Inject(SettingsService) public settings: SettingsService, @Inject(CommonService) private common: CommonService, @Inject(MainCommandService) private cmd: MainCommandService, @Inject(SocketService) private socket: SocketService, @Inject(TreeBuilderService) private treeBuilder: TreeBuilderService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { // Read current settings into local model this.model = { treeSeparator: this.settings.redisTreeDivider(), pageCount: this.settings.pageCount(), keyPageCount: this.settings.keyPageCount(), keysSort: this.settings.keysSort(), searchClientSide: this.settings.searchClientSide(), searchStartsWith: this.settings.searchStartsWith(), maxValueDisplay: this.settings.maxValueDisplay(), maxKeys: this.settings.maxKeys(), jsonFormat: this.settings.jsonFormat() === 2, animation: this.settings.animation(), }; // Read state from global p3xr const state = p3xr?.state; this.reducedFunctions = state?.reducedFunctions ?? false; this.keysRawLength = state?.keysRaw?.length ?? 0; this.dbsize = state?.dbsize ?? 0; } ngAfterViewInit(): void { // Validate all fields after the form is ready so pre-filled invalid values show errors setTimeout(() => this.validateAllFields()); } isFieldInvalid(fieldName: string, min: number, max: number): boolean { const value = this.model[fieldName]; if (value === null || value === undefined || value === '') { return true; } const num = Number(value); return isNaN(num) || !Number.isInteger(num) || num < min || num > max; } validateField(fieldName: string, min: number, max: number): void { const control = this.formRef?.controls[fieldName]; if (!control) { return; } if (this.isFieldInvalid(fieldName, min, max)) { control.setErrors({ range: true }); control.markAsTouched(); } else { control.setErrors(null); } } onFieldChange(fieldName: string, min: number, max: number): void { setTimeout(() => this.validateField(fieldName, min, max)); } validateAllFields(): void { this.validateField('pageCount', 10, 5000); this.validateField('keyPageCount', 5, 100); this.validateField('maxValueDisplay', -1, 32768); this.validateField('maxKeys', 5, 100000); } showFieldError(controlName: string): boolean { const control = this.formRef?.controls[controlName]; return !!control && control.invalid && (control.touched || this.formRef?.submitted); } private markAllControlsTouched(): void { if (!this.formRef) { return; } Object.values(this.formRef.controls).forEach((control) => { control.markAsTouched(); control.updateValueAndValidity(); }); } private handleInvalidForm(): boolean { if (this.formRef?.invalid) { this.common.toast({ message: this.strings().form?.error?.invalid || 'Invalid form', }); return false; } return true; } submit(): void { this.markAllControlsTouched(); const hasRangeError = this.isFieldInvalid('pageCount', 10, 5000) || this.isFieldInvalid('keyPageCount', 5, 100) || this.isFieldInvalid('maxValueDisplay', -1, 32768) || this.isFieldInvalid('maxKeys', 5, 100000); if (hasRangeError || !this.handleInvalidForm()) { this.common.toast({ message: this.strings().form?.error?.invalid || 'Please fix the errors before saving', }); return; } // Save to Angular SettingsService signals this.settings.redisTreeDivider.set(this.model.treeSeparator); this.settings.pageCount.set(this.model.pageCount); this.settings.keyPageCount.set(this.model.keyPageCount); this.settings.keysSort.set(this.model.keysSort); this.settings.searchClientSide.set(this.model.searchClientSide); this.settings.searchStartsWith.set(this.model.searchStartsWith); this.settings.maxValueDisplay.set(this.model.maxValueDisplay); this.settings.maxKeys.set(this.model.maxKeys); this.settings.jsonFormat.set(this.model.jsonFormat ? 2 : 4); this.settings.animation.set(this.model.animation); // Update global p3xr settings and trigger tree refresh if (p3xr?.settings) { p3xr.settings.redisTreeDivider = this.model.treeSeparator; p3xr.settings.pageCount = this.model.pageCount; p3xr.settings.keyPageCount = this.model.keyPageCount; p3xr.settings.keysSort = this.model.keysSort; p3xr.settings.searchClientSide = this.model.searchClientSide; p3xr.settings.searchStartsWith = this.model.searchStartsWith; p3xr.settings.maxValueDisplay = this.model.maxValueDisplay; p3xr.settings.maxKeys = this.model.maxKeys; p3xr.settings.jsonFormat = this.model.jsonFormat ? 2 : 4; p3xr.settings.animation = this.model.animation ? 1 : 0; } if (p3xr?.state) { p3xr.state.page = 1; p3xr.state.redisChanged = true; } // Always refresh from server — settings like sort, page size, max keys affect the data this.cmd.refresh().then(() => { this.socket.stateChanged$.next(); this.socket.tick(); }); this.dialogRef.close(); } cancel(): void { this.dialogRef.close(); } } src/ng/dialogs/treecontrol-settings-dialog.service.ts000066400000000000000000000020551517666434100233540ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the Tree Control Settings dialog. * Uses dynamic import() for lazy loading. */ @Injectable({ providedIn: 'root' }) export class TreecontrolSettingsDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options?: { $event?: any }): Promise { const { TreecontrolSettingsDialogComponent } = await import( /* webpackChunkName: "dialog-treecontrol-settings" */ './treecontrol-settings-dialog.component' ); const dialogRef = this.dialog.open(TreecontrolSettingsDialogComponent, createDialogPopupSettings({ width: '75vw', maxWidth: '75vw', panelClass: ['fullscreen-dialog', 'p3xr-tree-settings-dialog-panel'], })); return new Promise((resolve) => { dialogRef.afterClosed().subscribe(() => resolve()); }); } } src/ng/dialogs/ttl-dialog.component.ts000066400000000000000000000117701517666434100203270ustar00rootroot00000000000000import { Component, Inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; import { DialogCancelButtonComponent } from '../components/dialog-cancel-button.component'; import { I18nService } from '../services/i18n.service'; import { CommonService } from '../services/common.service'; declare const p3xr: any; const timestring = require('timestring'); const humanizeDuration = require('humanize-duration'); export interface TtlDialogData { model: { ttl: number }; } /** * TTL dialog — Angular replacement for p3xrDialogTtl. * Edits TTL value with number input and human-readable timestring input. */ @Component({ selector: 'p3xr-ttl-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatToolbarModule, DialogCancelButtonComponent, ], template: `
{{ strings().confirm?.ttl?.title || 'TTL' }}
{{ strings().confirm?.ttl?.textContent }}
{{ strings().confirm?.ttl?.placeholder || 'TTL (seconds)' }} {{ strings().confirm?.ttl?.convertTextToTime || 'Duration' }}
`, styles: [` .full-width { width: 100%; } `], }) export class TtlDialogComponent implements OnInit { model: { ttl: number } = { ttl: -1 }; convertTextToTime = ''; strings; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: TtlDialogData, @Inject(I18nService) private i18n: I18nService, @Inject(CommonService) private common: CommonService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.model = { ...this.data.model }; if (typeof this.model.ttl === 'number' && this.model.ttl > 0) { try { const hdOpts = p3xr?.settings?.getHumanizeDurationOptions?.() ?? {}; this.convertTextToTime = humanizeDuration(this.model.ttl * 1000, { ...hdOpts, delimiter: ' ', }); } catch (e) { this.convertTextToTime = ''; } } } onTextTimeChange(value: string): void { try { this.model.ttl = timestring(String(value), 's'); } catch (e) { console.warn('timestring parse error', e); } } openTimestringNpm(): void { window.open('https://www.npmjs.com/package/timestring#keywords', '_blank'); } submit(): void { if (isNaN(this.model.ttl)) { this.model.ttl = Math.round(this.model.ttl); } this.dialogRef.close({ model: this.model }); } cancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/ttl-dialog.service.ts000066400000000000000000000022131517666434100177550ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; /** * Service to open the TTL dialog. * Uses dynamic import() for lazy loading — the dialog component code * is only downloaded when the dialog is first opened. */ @Injectable({ providedIn: 'root' }) export class TtlDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(options: { $event?: any; model: { ttl: number } }): Promise<{ model: { ttl: number } }> { const { TtlDialogComponent } = await import( /* webpackChunkName: "dialog-ttl" */ './ttl-dialog.component' ); const dialogRef = this.dialog.open(TtlDialogComponent, createDialogPopupSettings({ data: { model: options.model }, })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { if (result) { resolve(result); } else { reject(); } }); }); } } src/ng/layout/000077500000000000000000000000001517666434100136035ustar00rootroot00000000000000src/ng/layout/layout.component.html000066400000000000000000000314341517666434100200140ustar00rootroot00000000000000
@if (!state.failed()) { @if (isWide) { } @else { } } @else { @if (isWide) { } @else { } } @if (currentConnection) { @if (isWide) { } @else { } } @if (currentConnection && hasRediSearch) { @if (isWide) { } @else { } } @if (currentConnection) { @if (isWide) { } @else { } } @if (!state.failed()) { @if (isWide) { } @else { } } @if (!state.failed()) { @if (isWide) { } @else { } }
@if (!isElectron && currentVersion && isWide) {
{{ currentVersion }}
}
src/ng/layout/layout.component.scss000066400000000000000000000036701517666434100200240ustar00rootroot00000000000000// The global p3xr-layout.scss defines all the positional rules // (#p3xr-layout-header-container, #p3xr-layout-footer-container, etc.) // via src/injector.scss — no duplication needed here. @use '../../scss/vars' as v; // Host element: block so header+footer fixed divs overlay the page correctly. :host { display: block; } // Flex spacer used in both header and footer toolbars. .p3xr-layout-spacer { flex: 1 1 auto; } .p3xr-layout-content, .p3xr-layout-content-electron { position: absolute; left: 0px; right: 0px; margin-bottom: v.$toolbar-height; } #p3xr-layout-header-version-donated { position: fixed; top: 35px; left: 20px; width: 120px; text-align: right; z-index: 3; font-size: 10px; line-height: 1; opacity: 0.7; pointer-events: none; } .p3xr-layout-content-electron { } .p3xr-layout-content { padding: v.$layout-padding; padding-bottom: 0px !important; margin-top: v.$toolbar-height; } #p3xr-layout-header-container { top: 0px; } #p3xr-layout-footer-container { bottom: 0px; } #p3xr-layout-header-container, #p3xr-layout-footer-container { position: fixed; z-index: 2; left: 0px; width: 100%; } // Connection menu group labels .p3xr-connection-menu-group-label { padding: 6px 16px 2px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; opacity: 0.6; pointer-events: none; } // Shared keyboard-key badge used in Info page and Command Palette .p3xr-kbd { display: inline-block; padding: 2px 8px; font-family: 'Roboto Mono', monospace; font-size: 12px; border: 1px solid var(--p3xr-list-border, rgba(0, 0, 0, 0.12)); border-radius: 4px; background: var(--p3xr-input-bg, #f5f5f5); color: var(--p3xr-input-color, #333); min-width: 70px; text-align: center; white-space: nowrap; } .p3xr-kbd-small { min-width: 50px; font-size: 11px; } src/ng/layout/layout.component.ts000066400000000000000000000531721517666434100175010ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, HostListener, NgZone, ChangeDetectorRef, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation, ViewChild, ElementRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule, Router, NavigationEnd } from '@angular/router'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu'; import { MatDividerModule } from '@angular/material/divider'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { filter } from 'rxjs/operators'; declare const p3xr: any; import { ThemeService } from '../services/theme.service'; import { I18nService } from '../services/i18n.service'; import { RedisStateService } from '../services/redis-state.service'; import { SocketService } from '../services/socket.service'; import { CommonService } from '../services/common.service'; import { NavigationService } from '../services/navigation.service'; import { AskAuthorizationDialogService } from '../dialogs/ask-authorization-dialog.service'; import { MainCommandService } from '../services/main-command.service'; import { ShortcutsService } from '../services/shortcuts.service'; // Side-effect: webpack processes the SCSS through sass-loader → css-loader → MiniCssExtractPlugin require('./layout.component.scss'); /** * Angular layout component — replaces the AngularJS p3xrLayout component. * * Renders the fixed header toolbar (app name, home, settings) and fixed footer * toolbar (connection menu, disconnect, donate, language, theme, github). * * Electron bridge: * global.p3xrSetLanguage(key) — called by webview inject script to set language * global.p3xrSetMenu(route) — called by webview inject script to navigate * * Both globals are preserved exactly as they were in the AngularJS controller * so existing Electron integration continues to work without any changes. */ @Component({ selector: 'p3xr-layout', standalone: true, imports: [ CommonModule, RouterModule, MatToolbarModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule, MatTooltipModule, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './layout.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class LayoutComponent implements OnInit, OnDestroy { // Header buttons: text hidden below 720px (matches AngularJS p3xr-button component) isWide = true; // Footer buttons: different AngularJS breakpoints per button isGtXs = true; // >600px — Theme button text (AngularJS: hide-xs) isGtSm = true; // >960px — Disconnect/Language/GitHub text (AngularJS: hide-xs hide-sm) isElectron = false; isElectronInitialized = false; private readonly unsubFns: Array<() => void> = []; constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(BreakpointObserver) private readonly breakpointObserver: BreakpointObserver, @Inject(ThemeService) readonly theme: ThemeService, @Inject(I18nService) readonly i18n: I18nService, @Inject(RedisStateService) readonly state: RedisStateService, @Inject(SocketService) private readonly socket: SocketService, @Inject(CommonService) private readonly common: CommonService, @Inject(AskAuthorizationDialogService) private readonly authDialog: AskAuthorizationDialogService, @Inject(NavigationService) private readonly nav: NavigationService, @Inject(Router) private readonly router: Router, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, @Inject(ShortcutsService) readonly shortcuts: ShortcutsService, ) {} @HostListener('document:keydown', ['$event']) onKeydown(event: KeyboardEvent): void { this.shortcuts.handleKeydown(event); } ngOnInit(): void { // Remove the loading splash shown before Angular bootstraps document.getElementById('p3xr-loading')?.remove(); // Initialize filtered languages list this.filterLanguages(); // Header: 720px (matches AngularJS p3xr-button component threshold) const sub720 = this.breakpointObserver.observe('(min-width: 720px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); // Footer: 600px (AngularJS hide-xs — Theme button) const sub600 = this.breakpointObserver.observe('(min-width: 600px)').subscribe(r => { this.isGtXs = r.matches; this.cdr.markForCheck(); }); // Footer: 960px (AngularJS hide-xs hide-sm — Disconnect/Language/GitHub) const sub960 = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isGtSm = r.matches; this.cdr.markForCheck(); }); this.unsubFns.push(() => { sub720.unsubscribe(); sub600.unsubscribe(); sub960.unsubscribe(); }); this.isElectron = /electron/i.test(navigator.userAgent); // Auto-connect from localStorage on startup const savedConnection = this.readConnectionFromStorage(); if (savedConnection) { this.connect(savedConnection); } // Subscribe to socket events this.subscribeSocketEvents(); // Google Analytics route tracking this.setupRouteTracking(); // Subscribe to connect/disconnect requests from other components const subConnect = this.cmd.connectRequest$.subscribe((req) => { this.connect(req.connection); }); const subDisconnect = this.cmd.disconnectRequest$.subscribe(() => { this.disconnect(); }); this.unsubFns.push(() => { subConnect.unsubscribe(); subDisconnect.unsubscribe(); }); // Expose Electron bridge globals with a delay so the app is fully ready. setTimeout(() => this.setupElectronBridge(), 3000); } ngOnDestroy(): void { this.unsubFns.forEach(fn => fn()); } // --- Computed properties (read by template) --- get connectionName(): string { const conn = this.state.connection(); const strings = this.i18n.strings(); if (conn) { const fn = strings?.label?.connected; return typeof fn === 'function' ? fn({ name: conn.name }) : (conn.name ?? ''); } return strings?.intention?.connect ?? 'Connect'; } readonly sortedThemeKeys = [ 'light', 'enterprise', 'dark', 'darkNeu', 'darkoBluo', 'matrix', 'redis', ]; get themeSelectedKey(): string { const theme = this.theme.currentTheme(); if (!theme.startsWith('p3xrTheme')) return ''; const raw = theme.slice('p3xrTheme'.length); return raw.charAt(0).toLowerCase() + raw.slice(1); } get hasRediSearch(): boolean { return !!p3xr?.state?.hasRediSearch; } get reducedFunctions(): boolean { return !!p3xr?.state?.reducedFunctions; } get currentVersion(): string | undefined { return this.state.version(); } get connectionsList(): any[] { return this.state.connections()?.list ?? []; } get groupedConnectionsList(): Array<{ name: string; connections: any[] }> { const list = this.connectionsList; let groupMode = false; try { groupMode = localStorage.getItem('p3xr-connection-group-mode') === 'true'; } catch { /* ignore */ } if (!groupMode) { return [{ name: '', connections: list }]; } const groups = new Map(); for (const conn of list) { const groupName = conn.group?.trim() || ''; if (!groups.has(groupName)) { groups.set(groupName, []); } groups.get(groupName)!.push(conn); } const result: Array<{ name: string; connections: any[] }> = []; for (const [name, connections] of groups) { result.push({ name, connections }); } return result; } get currentConnection(): any { return this.state.connection(); } @ViewChild('languageSearchInput') languageSearchInput!: ElementRef; @ViewChild('languageMenuTrigger') languageMenuTrigger!: MatMenuTrigger; languageSearch = ''; filteredLanguages: string[] = []; highlightedLanguageIndex = 0; get availableLanguages(): string[] { return Object.keys(this.i18n.strings()?.language ?? {}); } onLanguageSearchInput(value: string): void { this.languageSearch = value; this.filterLanguages(); this.highlightedLanguageIndex = this.findCurrentLanguageIndex(); this.cdr.markForCheck(); } onLanguageMenuOpened(): void { this.highlightedLanguageIndex = this.findCurrentLanguageIndex(); setTimeout(() => { this.languageSearchInput?.nativeElement?.focus(); this.scrollHighlightedLanguageIntoView(); }); } private findCurrentLanguageIndex(): number { const idx = this.filteredLanguages.indexOf(this.i18n.currentLang()); return idx >= 0 ? idx : 0; } onLanguageMenuClosed(): void { this.languageSearch = ''; this.filterLanguages(); } onLanguageSearchKeydown(event: KeyboardEvent): void { if (event.key === 'Escape') { this.languageMenuTrigger.closeMenu(); return; } if (event.key === 'Enter') { event.preventDefault(); this.onLanguageSearchEnter(); return; } if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); const len = this.filteredLanguages.length; if (len === 0) return; if (event.key === 'ArrowDown') { this.highlightedLanguageIndex = (this.highlightedLanguageIndex + 1) % len; } else { this.highlightedLanguageIndex = (this.highlightedLanguageIndex - 1 + len) % len; } this.scrollHighlightedLanguageIntoView(); this.cdr.markForCheck(); return; } event.stopPropagation(); } onLanguageSearchEnter(): void { if (this.filteredLanguages.length > 0) { this.setLanguage(this.filteredLanguages[this.highlightedLanguageIndex]); this.languageMenuTrigger.closeMenu(); } } private scrollHighlightedLanguageIntoView(): void { setTimeout(() => { const menu = document.querySelector('.p3xr-language-menu .mat-mdc-menu-content'); if (!menu) return; const items = menu.querySelectorAll('.mat-mdc-menu-item'); const target = items[this.highlightedLanguageIndex]; target?.scrollIntoView({ block: 'nearest' }); }); } private filterLanguages(): void { const all = this.availableLanguages; const search = this.languageSearch.trim().toLowerCase(); if (!search) { this.filteredLanguages = all; return; } this.filteredLanguages = all.filter(key => { const label = this.languageLabel(key).toLowerCase(); return label.includes(search) || key.toLowerCase().includes(search); }); } themeLabel(key: string): string { return this.i18n.strings()?.label?.theme?.[key] ?? key; } languageLabel(key: string): string { return this.i18n.strings()?.language?.[key] ?? key; } // --- Actions --- navigateTo(stateName: string, params?: any): void { this.nav.navigateTo(stateName, params); } reloadPage(): void { location.href = '/'; } setTheme(key: string): void { this.theme.setTheme(this.theme.generateThemeName(key)); } setThemeAuto(): void { this.theme.setTheme('auto'); } async setLanguage(key: string): Promise { try { // Load translation chunk before switching (lazy loading support) const loader = p3xr?.settings?.language?.loadTranslation; if (typeof loader === 'function') { await loader(key); } this.i18n.setLanguage(key); if (this.isElectron) { await this.socket.request({ action: 'set-language', payload: { key } }); this.isElectronInitialized = true; } this.filterLanguages(); this.cdr.markForCheck(); } catch (e) { this.common.generalHandleError(e); } } async connect(connection: any): Promise { console.time('connect'); connection = this.cloneConnection(connection); try { const dbStorageKey = p3xr?.settings?.connection ?.getStorageKeyCurrentDatabase?.(connection.id); const db = this.getStorageString(dbStorageKey); if (connection.askAuth === true) { const auth = await this.authDialog.show(); connection.username = auth.username || undefined; connection.password = auth.password || undefined; } const strings = this.i18n.strings(); p3xr?.ui?.overlay?.show({ message: strings?.title?.connectingRedis ?? 'Connecting...', }); const response = await this.socket.request({ action: 'connection-connect', payload: { connection, db }, }); // Update global p3xr.state const st = p3xr?.state; if (st) { st.page = 1; st.monitor = false; st.dbsize = response.dbsize; const databaseIndexes: number[] = []; let i = 0; while (i < response.databases) databaseIndexes.push(i++); st.databaseIndexes = databaseIndexes; st.connection = connection; st.commands = []; Object.keys(response.commands ?? {}).forEach(k => { st.commands.push(response.commands[k][0]); }); st.commands.sort(); // Detect loaded Redis modules const modules = Array.isArray(response.modules) ? response.modules : []; st.modules = modules; st.hasReJSON = modules.some((m: any) => m.name === 'ReJSON'); st.hasRediSearch = modules.some((m: any) => m.name === 'search'); st.hasTimeSeries = modules.some((m: any) => m.name === 'timeseries'); } await this.common.loadRedisInfoResponse({ response }); this.state.syncFromGlobal(); this.socket.stateChanged$.next(); this.setStorageObject( p3xr?.settings?.connectInfo?.storageKey, connection, ); // No navigation — just refresh the current view in place } catch (error) { this.removeStorageItem(p3xr?.settings?.connectInfo?.storageKey); const st = p3xr?.state; if (st) st.connection = undefined; this.state.connection.set(undefined); this.common.generalHandleError(error); } finally { p3xr?.ui?.overlay?.hide(); this.cdr.markForCheck(); } console.timeEnd('connect'); } async disconnect(): Promise { await this.cmd.disconnect(); this.cdr.markForCheck(); } reducedFunctionality(): void { const strings = this.i18n.strings(); const st = p3xr?.state; const fn = strings?.label?.tooManyKeys; const message = typeof fn === 'function' ? fn({ count: st?.keysRaw?.length ?? 0, maxLightKeysCount: p3xr?.settings?.maxLightKeysCount ?? 0, }) : ''; this.common.confirm({ disableCancel: true, message }).catch(() => {}); } openLink(target: 'github' | 'githubRelease' | 'githubChangelog' | 'donate'): void { const urls: Record = { github: 'https://github.com/patrikx3/redis-ui', githubRelease: 'https://github.com/patrikx3/redis-ui/releases', githubChangelog: 'https://github.com/patrikx3/redis-ui/blob/master/change-log.md#change-log', donate: 'https://www.paypal.me/patrikx3', }; window.open(urls[target], '_blank'); } // --- Private helpers --- private cloneConnection(connection: any): any { return typeof p3xr?.clone === 'function' ? p3xr.clone(connection) : JSON.parse(JSON.stringify(connection)); } private readConnectionFromStorage(): any { return this.getStorageObject( p3xr?.settings?.connectInfo?.storageKey, ); } private getStorageString(name: string | undefined): string | undefined { if (!name) return undefined; try { return localStorage.getItem(name) ?? undefined; } catch { return undefined; } } private getStorageObject(name: string | undefined): any { const raw = this.getStorageString(name); if (!raw) return undefined; try { return JSON.parse(raw); } catch { return undefined; } } private setStorageObject(name: string | undefined, value: any): void { if (!name) return; try { localStorage.setItem(name, JSON.stringify(value)); } catch {} } private removeStorageItem(name: string | undefined): void { if (!name) return; try { localStorage.removeItem(name); } catch {} } private subscribeSocketEvents(): void { const sub1 = this.socket.redisDisconnected$.subscribe(() => { this.state.connection.set(undefined); this.nav.navigateTo('settings'); this.cdr.markForCheck(); }); const sub2 = this.socket.socketError$.subscribe((error: any) => { this.removeStorageItem(p3xr?.settings?.connectInfo?.storageKey); this.common.generalHandleError(error); this.nav.navigateTo('socketio-error'); const isHttpAuth = error?.message === 'http_auth_required' || error?.code === 'http_auth_required'; const strings = this.i18n.strings(); const msg = isHttpAuth ? strings.confirm?.socketioAuthRequired : strings.confirm?.socketioConnectError; this.common.confirm({ disableCancel: false, message: msg ?? 'Connection error' }).then(() => { location.reload(); }).catch(() => {}); this.cdr.markForCheck(); }); const sub3 = this.socket.connections$.subscribe(() => { this.state.syncFromGlobal(); this.cdr.markForCheck(); }); const sub4 = this.socket.configuration$.subscribe(() => { this.state.syncFromGlobal(); this.cdr.markForCheck(); }); const sub5 = this.socket.licenseUpdate$.subscribe(() => { this.state.syncFromGlobal(); this.cdr.markForCheck(); }); this.unsubFns.push( () => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.unsubscribe(); sub5.unsubscribe(); } ); } private setupRouteTracking(): void { if (p3xr?.isBot?.()) return; const sub = this.router.events.pipe( filter((event): event is NavigationEnd => event instanceof NavigationEnd) ).subscribe((event) => { try { const path = event.urlAfterRedirects.toLowerCase().startsWith('/database/key/') ? '/database/key' : event.urlAfterRedirects; (globalThis as any).gtag?.('config', p3xr?.settings?.googleAnalytics, { page_path: path }, ); } catch { /* noop */ } }); this.unsubFns.push(() => sub.unsubscribe()); } /** * Expose the Electron bridge globals. * * Electron injects a script into the webview that calls: * global.p3xrSetLanguage(key) — sets the UI language * global.p3xrSetMenu(route) — navigates to a route * * These are the SAME globals as the AngularJS controller exposed. * Keeping them with the same names and behaviour ensures no changes are * needed in the Electron host application. */ private setupElectronBridge(): void { if (!this.isElectron) return; // Listen for postMessage from the Electron shell (iframe parent). window.addEventListener('message', (event: MessageEvent) => { const data = event.data; if (!data || typeof data.type !== 'string') return; if (data.type === 'p3x-set-language' && typeof data.translation === 'string') { this.ngZone.run(async () => { try { await this.setLanguage(data.translation); } catch (e) { console.warn('[LayoutComponent] p3x-set-language failed', e); } }); } else if (data.type === 'p3x-menu' && typeof data.action === 'string') { this.ngZone.run(() => { try { this.nav.navigateTo(data.action); } catch (e) { console.warn('[LayoutComponent] p3x-menu failed', e); } }); } }); } } src/ng/main.ts000066400000000000000000000026331517666434100135660ustar00rootroot00000000000000import 'zone.js'; import { bootstrapApplication } from '@angular/platform-browser'; import { importProvidersFrom, enableProdMode, isDevMode } from '@angular/core'; import { RouterModule } from '@angular/router'; import { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar'; import { MatDialogModule } from '@angular/material/dialog'; import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; import { MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/tooltip'; import { appRoutes } from './app.routes'; import { LayoutComponent } from './layout/layout.component'; // Enable Angular production mode when webpack builds in production mode. // This disables dev-only assertion checks (NG0100, "Should be run in update mode"). if (process.env.NODE_ENV === 'production') { enableProdMode(); } bootstrapApplication(LayoutComponent, { providers: [ importProvidersFrom( RouterModule.forRoot(appRoutes), MatSnackBarModule, MatDialogModule, ), { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { appearance: 'fill' } }, { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: { position: 'above' } }, ], }).then((appRef) => { (globalThis as any).__p3xr_snackbar = appRef.injector.get(MatSnackBar); console.info('Angular bootstrap complete'); }).catch(err => { console.error('Angular bootstrap error:', err); }); src/ng/pages/000077500000000000000000000000001517666434100133655ustar00rootroot00000000000000src/ng/pages/console/000077500000000000000000000000001517666434100150275ustar00rootroot00000000000000src/ng/pages/console/console.component.html000066400000000000000000000151461517666434100213670ustar00rootroot00000000000000
@if (type !== 'quick') { {{ strings().label?.console || 'Console' }} {{ strings().intention?.pubsubMonitor || 'PubSub Monitor' }} @if (showMonitorPopup) {
}
} @else { {{ embedded ? (strings().label?.console || 'Console') : (strings().intention?.quickConsole || 'Quick Console') }} {{ strings().intention?.pubsubMonitor || 'PubSub Monitor' }} @if (showMonitorPopup) {
}
@if (!embedded) { }
}
@if (type === 'quick' && !embedded) {
}
@if (type !== 'quick') {
}
@for (cmd of filteredCommands; track cmd) { {{ cmd }} }
src/ng/pages/console/console.component.scss000066400000000000000000000153431517666434100213750ustar00rootroot00000000000000p3xr-console { display: block; width: 100%; height: 100%; } .p3xr-console-root { display: flex; flex-direction: column; width: 100%; height: 100%; } .p3xr-console-root-embedded { overflow: hidden; #p3xr-console-content { flex: 1 1 auto; min-height: 0; } } p3xr-console .mat-toolbar { min-height: 48px; height: 48px; color: white; position: relative; z-index: 2; } p3xr-console .mat-toolbar * { color: inherit; } // Force mat-checkbox inside the console toolbar to use white outline/border // and transparent background (Angular Material uses internal CSS variables) p3xr-console .mat-toolbar .mat-mdc-checkbox { --mdc-checkbox-unselected-icon-color: rgba(255, 255, 255, 0.7); --mdc-checkbox-unselected-hover-icon-color: white; --mdc-checkbox-unselected-focus-icon-color: white; --mdc-checkbox-unselected-pressed-icon-color: white; --mdc-checkbox-selected-icon-color: rgba(255, 255, 255, 0.7); --mdc-checkbox-selected-hover-icon-color: white; --mdc-checkbox-selected-focus-icon-color: white; --mdc-checkbox-selected-pressed-icon-color: white; --mdc-checkbox-selected-checkmark-color: white; --mdc-checkbox-selected-container-color: transparent; --mdc-checkbox-selected-hover-state-layer-color: rgba(255, 255, 255, 0.1); --mdc-checkbox-selected-focus-state-layer-color: rgba(255, 255, 255, 0.1); --mdc-checkbox-selected-pressed-state-layer-color: rgba(255, 255, 255, 0.1); --mat-checkbox-label-text-color: white; // Direct override on the checkbox frame since CSS variables alone don't reach it .mdc-checkbox__background { border-color: rgba(255, 255, 255, 0.7) !important; } // When checked, make the container transparent with white checkmark .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background { border-color: white !important; background-color: transparent !important; .mdc-checkbox__checkmark { color: white !important; } } } // Buttons inside console toolbar: inherit color, match AngularJS md-button styling p3xr-console .mat-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) { color: inherit !important; letter-spacing: 0.1px !important; text-transform: uppercase !important; height: 36px !important; min-height: 36px !important; min-width: auto !important; padding: 0px 8px !important; margin: 0px 8px !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; // Hover: lighten on dark toolbar background (matches header buttons) &:hover { background-color: rgba(255, 255, 255, 0.15) !important; } } p3xr-console .mat-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) *, p3xr-console .mat-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) .mdc-button__label { color: inherit !important; letter-spacing: 0.1px !important; } p3xr-console .mat-toolbar mat-icon, p3xr-console .mat-toolbar .material-icons { font-size: 24px; width: 24px; height: 24px; } .p3xr-console-toolbar-tools { display: flex; align-items: center; width: 100%; height: 100%; padding: 0 8px; } .p3xr-console-toolbar-actions { display: inline-flex; align-items: center; } .p3xr-console-title { font-size: 20px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .p3xr-toolbar-spacer { flex: 1 1 auto; } .p3xr-console-monitor-wrap { position: relative; display: inline-flex; align-items: center; } .p3xr-console-monitor-label { white-space: nowrap; font-size: 20px; } // Scale down the checkbox to match AngularJS (transform: scale(0.75)) p3xr-console .mat-toolbar .p3xr-console-monitor-wrap .mat-mdc-checkbox { transform: scale(0.75); } // PubSub monitor pattern popup — appears on hover below the checkbox .p3xr-monitor-input { position: absolute; top: 48px; left: 50%; transform: translateX(-50%); z-index: 10; } .p3xr-monitor-input-toolbar { border: none; padding: 6px; min-height: 0; border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } // Match the main console command input sizing .p3xr-monitor-pattern-input { width: 200px; height: 40px; font-size: 16px; font-family: 'Roboto Mono', monospace !important; font-weight: 500; box-sizing: border-box; padding: 3px; border-style: solid; border-width: 2px; margin: 1px; } .p3xr-monitor-pattern-input:focus { margin: 0; border-width: 3px; outline: none; } #p3xr-console-content { font-family: 'Roboto Mono', monospace; text-align: center; #p3xr-console-content-resizer { cursor: ew-resize; position: relative; left: -10px; width: 20px !important; } #p3xr-console-content-output { min-width: calc(100% - 20px); text-align: left; overflow: auto; pre { font-family: 'Roboto Mono', monospace; } } } .p3xr-console-content-output-item:before { content: "> "; opacity: 0.5; } // Console input #p3xr-console-autocomplete { position: relative; overflow: hidden; width: 100% } #p3xr-console-autocomplete.p3xr-console-autocomplete-embedded { position: relative; width: 100%; min-width: 0; overflow-x: hidden; } #p3xr-console-autocomplete.p3xr-console-autocomplete-embedded #p3xr-console-input { min-width: 100%; width: 100%; position: relative; box-sizing: border-box; overflow: hidden; } p3xr-console.p3xr-console-embedded-collapsed #p3xr-console-autocomplete.p3xr-console-autocomplete-embedded #p3xr-console-input { min-width: calc(100% - 1px); width: calc(100% - 1px); } #p3xr-console-input { width: 100%; box-sizing: border-box; height: 38px; padding: 3px; border-style: solid; border-width: 2px; margin: 1px; font-family: 'Roboto Mono', monospace; } #p3xr-console-input:focus { margin: 0; border-width: 3px; outline: none; } // Mat-autocomplete panel styling for console .p3xr-console-autocomplete-panel.mat-mdc-autocomplete-panel { font-family: 'Roboto Mono', monospace; font-size: 13px; .mat-mdc-option { min-height: 32px; font-size: 13px; font-family: 'Roboto Mono', monospace; } } @media (max-width: 959px) { .p3xr-console-root-embedded #p3xr-console-content-output { overflow-x: hidden; pre { white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; } } } src/ng/pages/console/console.component.ts000066400000000000000000000465461517666434100210610ustar00rootroot00000000000000import { Component, Input, Inject, OnInit, OnDestroy, AfterViewInit, NgZone, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormControl } from '@angular/forms'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { P3xrButtonComponent } from '../../components/p3xr-button.component'; import { I18nService } from '../../services/i18n.service'; import { CommonService } from '../../services/common.service'; import { SocketService } from '../../services/socket.service'; import { RedisParserService } from '../../services/redis-parser.service'; import { MainCommandService } from '../../services/main-command.service'; require('./console.component.scss'); declare const p3xr: any; const htmlEncode = (globalThis as any).htmlEncode; const consoleOutputStorageKey = 'p3xr-console-output-v1'; const consoleOutputMaxBytes = 10 * 1024 * 1024; let actionHistoryPosition = -1; @Component({ selector: 'p3xr-console', standalone: true, imports: [ CommonModule, FormsModule, ReactiveFormsModule, MatToolbarModule, MatCheckboxModule, MatTooltipModule, MatAutocompleteModule, MatInputModule, MatFormFieldModule, P3xrButtonComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './console.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class ConsoleComponent implements OnInit, AfterViewInit, OnDestroy { @Input() type: string = ''; @Input() embedded: boolean = false; searchText = ''; searchControl = new FormControl(''); monitorEnabled = false; monitorPattern = '*'; showMonitorPopup = false; filteredCommands: string[] = []; readonly strings; private readonly unsubs: Array<() => void> = []; private index = 0; private monitorPopupTimeout: any = null; private monitorPatternDebounce: any = null; // DOM references private containerEl: HTMLElement | null = null; private headerEl: HTMLElement | null = null; private footerEl: HTMLElement | null = null; private consoleHeaderEl: HTMLElement | null = null; private outputEl: HTMLElement | null = null; private autocompleteEl: HTMLElement | null = null; private inputEl: HTMLElement | null = null; private scrollers: HTMLElement | null = null; private persistOutputDebounced: any; private inputFocusHandler: any; private inputBlurHandler: any; private resizeFn: any; constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(ElementRef) private readonly elementRef: ElementRef, @Inject(I18nService) private readonly i18n: I18nService, @Inject(CommonService) private readonly common: CommonService, @Inject(SocketService) private readonly socket: SocketService, @Inject(RedisParserService) private readonly redisParser: RedisParserService, @Inject(MainCommandService) private readonly cmd: MainCommandService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.monitorEnabled = p3xr.state.monitor ?? false; this.monitorPattern = p3xr.state.monitorPattern ?? '*'; // Filter commands as user types this.searchControl.valueChanges.subscribe((value: string | null) => { this.searchText = value || ''; if (value && value.length > 0 && p3xr.state.commands?.length > 0) { const text = value.toUpperCase(); this.filteredCommands = p3xr.state.commands .filter((cmd: string) => cmd.toUpperCase().includes(text)) .slice(0, 15); } else { this.filteredCommands = []; } }); } ngAfterViewInit(): void { this.ngZone.runOutsideAngular(() => this.initJQuery()); } ngOnDestroy(): void { this.elementRef.nativeElement.classList.remove('p3xr-console-embedded-collapsed'); if (this.persistOutputDebounced?.flush) { this.persistOutputDebounced.flush(); } else { this.persistConsoleOutputNow(); } if (this.inputEl) { if (this.inputFocusHandler) this.inputEl.removeEventListener('focus', this.inputFocusHandler); if (this.inputBlurHandler) this.inputEl.removeEventListener('blur', this.inputBlurHandler); } window.removeEventListener('resize', this.resizeFn); this.socket.getClient()?.removeListener?.('pubsub-message', this.onPubSubMessage); if (this.monitorPopupTimeout) clearTimeout(this.monitorPopupTimeout); if (this.monitorPatternDebounce) clearTimeout(this.monitorPatternDebounce); this.unsubs.forEach(fn => fn()); } // --- Event emission via Angular services --- private emitToAngularJS(eventName: string, payload?: any): void { switch (eventName) { case 'p3xr-console-activate': this.cmd.consoleActivate$.next(); break; case 'p3xr-console-deactivate': this.cmd.consoleDeactivate$.next(); break; case 'p3xr-console-embedded-resize': this.cmd.consoleEmbeddedResize$.next(); break; default: // Other events (p3xr-quick-console, p3xr-quick-console-quit) — noop for now break; } } // --- Actions --- activate(): void { if (this.embedded) { this.emitToAngularJS('p3xr-console-activate'); } } async actionEnter(): Promise { const enter = (this.searchText || '').trim(); if (!enter) return; let response: any; try { response = await this.socket.request({ action: 'console', payload: { command: enter }, }); const result = htmlEncode(String(this.redisParser.consoleParse(response.result))); this.outputAppend(`${htmlEncode(enter)}
${result}
`); if (response.hasOwnProperty('database')) { p3xr.state.currentDatabase = response.database; p3xr.state.redisChanged = true; this.socket.stateChanged$.next(); } this.searchText = ''; this.searchControl.setValue(''); } catch (e: any) { console.error(e); this.outputAppend(`${htmlEncode(enter)}
${this.i18n.strings().code?.[e.message] || e.message}
`); } finally { const history = response?.generatedCommand ?? enter; this.updateCommandHistory(history); this.scrollOutputToBottom(); if (this.type === 'quick' || this.embedded) { this.cmd.refresh({ withoutParent: true }); } } } onKeyDown(event: KeyboardEvent): void { // Let mat-autocomplete handle ArrowDown/ArrowUp when panel is open if (this.filteredCommands.length > 0 && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) { return; } if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') { actionHistoryPosition = -1; return; } const actionHistory = this.getActionHistory(); if (actionHistory.length < 1) return; event.preventDefault(); event.stopPropagation(); if (event.key === 'ArrowDown') { if (actionHistoryPosition === -1) actionHistoryPosition = actionHistory.length; actionHistoryPosition--; if (actionHistoryPosition < 0) actionHistoryPosition = actionHistory.length - 1; } else { actionHistoryPosition++; if (actionHistoryPosition >= actionHistory.length) actionHistoryPosition = 0; } const value = actionHistory[actionHistoryPosition] ?? ''; this.searchText = value; this.searchControl.setValue(value, { emitEvent: false }); } onAutocompleteSelected(event: any): void { this.searchText = event.option.value; } clearConsole(): void { if (!this.outputEl) return; this.outputEl.innerHTML = ''; this.outputAppend('' + (this.i18n.strings().label?.welcomeConsole ?? 'Welcome to the Redis Console') + ''); this.outputAppend((this.i18n.strings().label?.welcomeConsoleInfo ?? 'Cursor UP or DOWN history is enabled') + '
'); this.persistConsoleOutputNow(); this.scrollOutputToBottom(); (this.inputEl as HTMLElement)?.focus(); } async setMonitorState(): Promise { try { p3xr.state.monitor = this.monitorEnabled; await this.socket.request({ action: 'set-subscription', payload: { subscription: this.monitorEnabled, subscriberPattern: p3xr.state.monitorPattern, }, }); } catch (e) { this.common.generalHandleError(e); this.monitorEnabled = false; p3xr.state.monitor = false; } } toggleMonitor(): void { // checkbox ngModelChange handles the state } onMonitorMouseEnter(): void { if (this.embedded && this.elementRef.nativeElement.classList.contains('p3xr-console-embedded-collapsed')) { return; } if (this.monitorPopupTimeout) { clearTimeout(this.monitorPopupTimeout); this.monitorPopupTimeout = null; } this.showMonitorPopup = true; } onMonitorMouseLeave(): void { if (this.monitorPopupTimeout) { clearTimeout(this.monitorPopupTimeout); } this.monitorPopupTimeout = setTimeout(() => { this.showMonitorPopup = false; this.monitorPopupTimeout = null; }, 1000); } onMonitorPatternChange(value: string): void { this.monitorPattern = value; p3xr.state.monitorPattern = value; if (this.monitorPatternDebounce) { clearTimeout(this.monitorPatternDebounce); } this.monitorPatternDebounce = setTimeout(() => { this.setMonitorState(); this.monitorPatternDebounce = null; }, 1000); } openCommands(event: Event): void { window.open('https://redis.io/docs/latest/commands/', '_blank'); } closeConsole(): void { this.emitToAngularJS('p3xr-quick-console-quit'); } dragStart(): void { if (this.embedded) return; this.emitToAngularJS('p3xr-quick-console', { start: true }); } dragEnd(): void { if (this.embedded) return; this.emitToAngularJS('p3xr-quick-console', { start: false }); } // --- DOM init --- private initJQuery(): void { const debounce = require('lodash/debounce'); const rootEl = this.elementRef.nativeElement; this.containerEl = rootEl.querySelector('#p3xr-console-content'); this.headerEl = document.getElementById('p3xr-layout-header-container'); this.footerEl = document.getElementById('p3xr-layout-footer-container'); this.consoleHeaderEl = rootEl.querySelector('#p3xr-console-header'); this.outputEl = rootEl.querySelector('#p3xr-console-content-output'); this.autocompleteEl = rootEl.querySelector('#p3xr-console-autocomplete'); this.scrollers = this.containerEl; this.resizeFn = debounce(() => this.rawResize(), p3xr.settings.debounce); window.addEventListener('resize', this.resizeFn); this.rawResize(); this.persistOutputDebounced = debounce(() => this.persistConsoleOutputNow(), p3xr.settings.debounce); // PubSub listener this.socket.getClient()?.on?.('pubsub-message', this.onPubSubMessage); // Listen for resize events from main component const resizeSub = this.cmd.consoleEmbeddedResize$.subscribe(() => { if (this.embedded) this.rawResize(); }); this.unsubs.push(() => resizeSub.unsubscribe()); // Setup input after a tick setTimeout(() => { this.inputEl = rootEl.querySelector('#p3xr-console-input'); this.setInputTheme(); if (!this.restoreConsoleOutput()) { this.clearConsole(); } else { this.scrollOutputToBottom(); } this.rawResize(); // Embedded focus/blur handlers if (this.embedded) { this.inputFocusHandler = () => { this.emitToAngularJS('p3xr-console-activate'); }; this.inputBlurHandler = () => { setTimeout(() => { const active = document.activeElement; if (active?.id === 'p3xr-console-input') return; const root = this.elementRef.nativeElement; if (root && active && root.contains(active)) return; this.emitToAngularJS('p3xr-console-deactivate'); }, 0); }; this.inputEl?.addEventListener('focus', this.inputFocusHandler); this.inputEl?.addEventListener('blur', this.inputBlurHandler); } }); } private onPubSubMessage = (data: any): void => { if (p3xr.state.monitor === false) return; const message = htmlEncode(String(data.message)); this.outputAppend(`PubSub channel: ${data.channel}
${message}
`); if (this.scrollers) this.scrollers.scrollTop = this.scrollers.scrollHeight; }; private setInputTheme(): void { if (!this.inputEl) return; this.inputEl.style.borderColor = 'var(--p3xr-input-border-color, var(--p3xr-border-color))'; this.inputEl.style.backgroundColor = 'var(--p3xr-input-bg)'; this.inputEl.style.color = 'var(--p3xr-input-color)'; } private rawResize(): void { if (!this.containerEl) return; if (this.embedded) { const hostElement = this.elementRef.nativeElement; const hostRect = hostElement?.getBoundingClientRect(); const hostHeight = hostRect?.height || Math.floor(window.innerHeight * 0.33); const headerHeight = this.consoleHeaderEl?.offsetHeight || 0; const autocompleteHeight = this.autocompleteEl?.offsetHeight || 44; const collapsed = hostHeight <= 120; hostElement.classList.toggle('p3xr-console-embedded-collapsed', collapsed); const outputHeight = collapsed ? 0 : Math.max(hostHeight - headerHeight - autocompleteHeight, 0); this.containerEl.style.height = outputHeight + 'px'; this.containerEl.style.maxHeight = outputHeight + 'px'; this.containerEl.style.overflow = collapsed ? 'hidden' : 'auto'; this.containerEl.style.display = collapsed ? 'none' : 'block'; if (this.outputEl) { this.outputEl.style.display = collapsed ? 'none' : 'block'; } this.scrollOutputToBottom(); return; } // Non-embedded resize let minus = 0; for (const el of [this.headerEl, this.footerEl, this.consoleHeaderEl]) { if (el) minus += el.offsetHeight; } const windowHeight = window.innerHeight; const adjustments = this.type === 'quick' ? 105 : 70; const outputHeight = Math.max(windowHeight - minus - adjustments, 0); this.containerEl.style.height = outputHeight + 'px'; this.containerEl.style.maxHeight = outputHeight + 'px'; } // --- Output management --- private outputAppend(message: string): void { if (!this.outputEl) return; this.outputEl.insertAdjacentHTML('beforeend', `${message}
`); this.trimOutputToLimit(consoleOutputMaxBytes); this.persistOutputDebounced?.(); this.scrollOutputToBottom(); } private scrollOutputToBottom(): void { setTimeout(() => { if (!this.scrollers) return; this.scrollers.scrollTop = this.scrollers.scrollHeight; if (this.outputEl) this.outputEl.scrollTop = this.outputEl.scrollHeight; }, 0); } private trimOutputToLimit(maxBytes: number): void { if (!this.outputEl) return; let html = this.outputEl.innerHTML || ''; while (this.getByteSize(html) > maxBytes) { if (!this.dropOldestOutputChunk()) break; html = this.outputEl.innerHTML || ''; } } private dropOldestOutputChunk(): boolean { if (!this.outputEl) return false; const items = this.outputEl.querySelectorAll('.p3xr-console-content-output-item'); if (items.length < 1) return false; const removeCount = Math.max(Math.floor(items.length * 0.1), 1); for (let i = 0; i < removeCount; i++) items[i].remove(); return true; } private getByteSize(value: string): number { try { return new Blob([value || '']).size; } catch { return (value || '').length; } } private persistConsoleOutputNow(): void { if (!this.outputEl) return; this.trimOutputToLimit(consoleOutputMaxBytes); while (true) { const html = this.outputEl.innerHTML || ''; try { localStorage.setItem(consoleOutputStorageKey, html); return; } catch { if (!this.dropOldestOutputChunk()) { try { localStorage.removeItem(consoleOutputStorageKey); } catch { /* ignore */ } return; } } } } private restoreConsoleOutput(): boolean { if (!this.outputEl) return false; let stored = ''; try { stored = localStorage.getItem(consoleOutputStorageKey) || ''; } catch { stored = ''; } if (!stored) return false; this.outputEl.innerHTML = stored; this.trimOutputToLimit(consoleOutputMaxBytes); this.persistConsoleOutputNow(); const items = this.outputEl.querySelectorAll('.p3xr-console-content-output-item'); const lastItem = items.length > 0 ? items[items.length - 1] : null; if (lastItem) { const lastIndex = Number(lastItem.getAttribute('data-index')); if (Number.isFinite(lastIndex)) this.index = lastIndex + 1; } return true; } // --- Command history --- private getActionHistory(): string[] { try { return JSON.parse(localStorage.getItem('console-history') || '[]'); } catch { return []; } } private updateCommandHistory(entry: string): void { let history = this.getActionHistory(); const idx = history.indexOf(entry); if (idx > -1) history.splice(idx, 1); history.unshift(entry); if (history.length > 20) history = history.slice(0, 20); localStorage.setItem('console-history', JSON.stringify(history)); actionHistoryPosition = -1; } } src/ng/pages/database/000077500000000000000000000000001517666434100151315ustar00rootroot00000000000000src/ng/pages/database/database-header.component.ts000066400000000000000000000256331517666434100225050ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../services/i18n.service'; import { MainCommandService } from '../../services/main-command.service'; import { SocketService } from '../../services/socket.service'; declare const p3xr: any; @Component({ selector: 'p3xr-database-header', standalone: true, imports: [ CommonModule, FormsModule, MatToolbarModule, MatButtonModule, MatIconModule, MatTooltipModule, MatSelectModule, MatFormFieldModule, ], template: `
@if (!isXs) {

{{ strings().intention?.main || 'P3X Redis UI' }}

} @if (hasConnection) { @if (!isCluster) {
DB: {{ hasKeys(currentDatabase) ? 'radio_button_checked' : 'radio_button_unchecked' }} {{ currentDatabase }} @for (dbIndex of databaseIndexes; track dbIndex) { {{ hasKeys(dbIndex) ? 'radio_button_checked' : 'radio_button_unchecked' }} {{ dbIndex }} }
} @if (!isReadonly) { @if (isWide) { } @else { } } @if (isWide) { } @else { } @if (isWide) { } @else { } }
`, styles: [` :host { display: block; } .p3xr-database-header-toolbar { height: 48px; min-height: 48px; max-height: 48px; padding: 0 8px 0 16px; border-radius: 4px 4px 0 0; } .p3xr-database-header-tools { display: flex; align-items: center; width: 100%; height: 48px; } .p3xr-database-header-title { flex: 1; font-size: 20px; font-weight: 400; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .p3xr-database-header-link { cursor: pointer; text-decoration: none; color: inherit; } .p3xr-database-header-db-selector { display: flex; align-items: center; margin: 0; padding: 0; } .p3xr-database-header-db-label { font-size: 14px; font-weight: bold; margin-right: 2px; } .p3xr-database-header-db-field { width: 80px; position: relative; top: 1px; } .p3xr-database-header-db-field ::ng-deep .mdc-text-field { background: transparent !important; padding: 0 8px !important; } .p3xr-database-header-db-field ::ng-deep .mat-mdc-form-field-subscript-wrapper { display: none; } .p3xr-database-header-db-field ::ng-deep .mdc-line-ripple { display: none; } .p3xr-database-header-db-field ::ng-deep .mat-mdc-select-arrow-wrapper { padding-left: 0; } .p3xr-database-header-db-field ::ng-deep .mat-mdc-select-trigger { display: flex; align-items: center; } .p3xr-database-header-db-field ::ng-deep .mat-mdc-select-value { display: flex; align-items: center; } .p3xr-database-header-db-field ::ng-deep .mat-mdc-select-value-text { display: flex; align-items: center; } .p3xr-database-header-db-field ::ng-deep mat-select-trigger { display: flex; align-items: center; gap: 4px; } .p3xr-database-header-db-field ::ng-deep mat-select-trigger .p3xr-db-indicator { font-size: 18px !important; width: 18px !important; height: 18px !important; line-height: 18px !important; overflow: hidden; flex-shrink: 0; } `], changeDetection: ChangeDetectionStrategy.OnPush, }) export class DatabaseHeaderComponent implements OnInit, OnDestroy { readonly strings; isXs = false; isWide = true; hasConnection = false; isCluster = false; isReadonly = false; currentDatabase: number = 0; databaseIndexes: number[] = []; private keyspaceDatabases: Record = {}; private readonly unsubs: Array<() => void> = []; constructor( @Inject(BreakpointObserver) private readonly breakpointObserver: BreakpointObserver, @Inject(I18nService) private readonly i18n: I18nService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(SocketService) private readonly socket: SocketService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.syncFromGlobal(); // Subscribe to socket events for reactive state updates const sub1 = this.socket.connections$.subscribe(() => this.syncFromGlobal()); const sub2 = this.socket.redisDisconnected$.subscribe(() => this.syncFromGlobal()); const sub3 = this.socket.licenseUpdate$.subscribe(() => this.syncFromGlobal()); const sub4 = this.socket.stateChanged$.subscribe(() => this.syncFromGlobal()); this.unsubs.push(() => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.unsubscribe(); }); const xsSub = this.breakpointObserver.observe('(max-width: 599px)').subscribe(result => { this.isXs = result.matches; this.cdr.markForCheck(); }); this.unsubs.push(() => xsSub.unsubscribe()); const wideSub = this.breakpointObserver.observe('(min-width: 720px)').subscribe(result => { this.isWide = result.matches; this.cdr.markForCheck(); }); this.unsubs.push(() => wideSub.unsubscribe()); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); } hasKeys(dbIndex: number): boolean { return !!this.keyspaceDatabases[dbIndex]; } selectDatabase(dbIndex: number): void { this.currentDatabase = dbIndex; this.cmd.selectDatabase(dbIndex).then(() => { this.syncFromGlobal(); }); // Force re-render after mat-select closes setTimeout(() => this.cdr.detectChanges()); } save(): void { this.cmd.save(); } goStatistics(): void { this.cmd.statistics(); } refresh(): void { this.cmd.refresh({ withoutParent: false }); } private syncFromGlobal(): void { const state = p3xr?.state; this.hasConnection = state?.connection !== undefined; this.isCluster = state?.connection?.cluster === true; this.isReadonly = state?.connection?.readonly === true; this.databaseIndexes = state?.databaseIndexes ?? []; this.keyspaceDatabases = state?.info?.keyspaceDatabases ?? {}; this.currentDatabase = this.cmd.currentDatabase; this.cdr.detectChanges(); } } src/ng/pages/database/database-key.component.html000066400000000000000000000150231517666434100223530ustar00rootroot00000000000000@if (loading) {
} @if (!loading && response) {
@if (!isReadonly) { @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } } @if (isGtSm) { } @else { }
{{ strings()?.page?.key?.label?.key }}: {{ key }}
{{ strings()?.page?.key?.label?.ttl }}: @if (response.ttl === -1) { {{ strings()?.page?.key?.label?.ttlNotExpire }} } @else { {{ response.ttl }} }
{{ strings()?.page?.key?.label?.type }}: {{ strings()?.redisTypes?.[response.type] }}
{{ strings()?.page?.key?.label?.encoding }}: {{ response.encoding }}
{{ strings()?.page?.key?.label?.length }}: {{ charactersPrettyBytes(response.size) }}  {{ response.size }} {{ strings()?.page?.key?.label?.lengthString }} @if (response.length) { , {{ response.length }} {{ strings()?.page?.key?.label?.lengthItem }} }
@switch (response.type) { @case ('string') { } @case ('list') { } @case ('hash') { } @case ('set') { } @case ('zset') { } @case ('stream') { } @case ('json') { } } } src/ng/pages/database/database-key.component.scss000066400000000000000000000027551517666434100223720ustar00rootroot00000000000000.p3xr-database-key-loading { display: flex; justify-content: center; align-items: center; min-height: 100%; padding: 32px; } .p3xr-database-key-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; padding: 4px 8px; } .p3xr-database-key-info { border-top: 1px solid rgba(255, 255, 255, 0.12); } body.p3xr-theme-light .p3xr-database-key-info { border-top-color: rgba(0, 0, 0, 0.12); } .p3xr-database-key-info-row { display: flex; justify-content: space-between; align-items: baseline; padding: 12px 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.12); strong { white-space: nowrap; margin-right: 16px; } span { text-align: right; overflow: hidden; text-overflow: ellipsis; user-select: text; } } body.p3xr-theme-light .p3xr-database-key-info-row { border-bottom-color: rgba(0, 0, 0, 0.12); } // Only key and TTL rows are clickable with hover .p3xr-database-key-info-row-clickable { cursor: pointer; &:hover { background-color: rgba(255, 255, 255, 0.1) !important; } } body.p3xr-theme-light .p3xr-database-key-info-row-clickable:hover { background-color: rgba(0, 0, 0, 0.1) !important; } .p3xr-database-key-ttl-value { display: flex; flex-direction: column; align-items: flex-end; } .p3xr-database-key-ttl-hint { opacity: 0.5; font-size: 0.85em; font-weight: normal; } src/ng/pages/database/database-key.component.ts000066400000000000000000000337001517666434100220370ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, NgZone, ChangeDetectorRef, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation, effect } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../services/i18n.service'; import { SocketService } from '../../services/socket.service'; import { CommonService } from '../../services/common.service'; import { MainCommandService } from '../../services/main-command.service'; import { ThemeService } from '../../services/theme.service'; import { TtlDialogService } from '../../dialogs/ttl-dialog.service'; import { KeyStringComponent } from './key/key-string.component'; import { KeyHashComponent } from './key/key-hash.component'; import { KeyListComponent } from './key/key-list.component'; import { KeySetComponent } from './key/key-set.component'; import { KeyZsetComponent } from './key/key-zset.component'; import { KeyStreamComponent } from './key/key-stream.component'; import { KeyJsonComponent } from './key/key-json.component'; import { NavigationService } from '../../services/navigation.service'; require('./database-key.component.scss'); require('./key/key-types.scss'); declare const p3xr: any; @Component({ selector: 'p3xr-database-key', standalone: true, imports: [ CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, MatProgressSpinnerModule, KeyStringComponent, KeyHashComponent, KeyListComponent, KeySetComponent, KeyZsetComponent, KeyStreamComponent, KeyJsonComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './database-key.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class DatabaseKeyComponent implements OnInit, OnDestroy { loading = false; response: any = null; key = ''; isReadonly = false; isGtSm = true; strings; private ttlInterval: any; private wasExpiring = false; private readonly unsubFns: Array<() => void> = []; constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(BreakpointObserver) private readonly breakpointObserver: BreakpointObserver, @Inject(I18nService) private readonly i18n: I18nService, @Inject(SocketService) private readonly socket: SocketService, @Inject(CommonService) private readonly common: CommonService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(ThemeService) private readonly theme: ThemeService, @Inject(TtlDialogService) private readonly ttlDialog: TtlDialogService, @Inject(NavigationService) private readonly nav: NavigationService, @Inject(ActivatedRoute) private readonly route: ActivatedRoute, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; // Regenerate highlight when theme changes effect(() => { this.theme.currentTheme(); // track the signal if (this.key) { this.removeHighlight(); this.generateHighlight(); } }); } ngOnInit(): void { this.key = this.getStateParam('key') || ''; this.isReadonly = p3xr?.state?.connection?.readonly === true; const sub = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isGtSm = r.matches; this.cdr.markForCheck(); }); this.unsubFns.push(() => sub.unsubscribe()); this.loadKey(); this.generateHighlight(); // Listen for refresh events via MainCommandService const refreshSub = this.cmd.refreshKey$.subscribe(() => { this.refresh({ withoutParent: true }); }); this.unsubFns.push(() => refreshSub.unsubscribe()); // React to key-to-key navigation (Angular Router reuses the component) const paramSub = this.route.paramMap.subscribe(params => { const newKey = params.get('key') || ''; if (newKey && newKey !== this.key) { this.key = newKey; this.loadKey(); this.generateHighlight(); this.cdr.markForCheck(); } }); this.unsubFns.push(() => paramSub.unsubscribe()); } ngOnDestroy(): void { this.clearTtlInterval(); this.removeHighlight(); this.unsubFns.forEach(fn => fn()); } // --- Actions --- addKey(event: Event): void { event.stopPropagation(); this.cmd.keyNew$.next({ event, node: { key: this.key } }); } deleteKey(event: Event): void { this.cmd.keyDelete$.next({ key: this.key, event }); } rename(event: Event): void { this.cmd.keyRename$.next({ key: this.key, event }); } async setTtl(event: Event): Promise { try { const confirmResponse = await this.ttlDialog.show({ $event: event, model: { ttl: this.response.ttl === -1 ? '' : this.response.ttl }, }); if (confirmResponse === undefined) return; const ttlStr = String(confirmResponse.model.ttl).trim(); if (ttlStr === '' || confirmResponse.model.ttl == null) { await this.socket.request({ action: 'persist', payload: { key: this.key } }); this.gtag('/persist'); await this.refresh(); this.common.toast(this.i18n.strings().status.persisted); } else if (!/^-?\d+$/.test(ttlStr)) { this.common.toast(this.i18n.strings().status.notInteger); } else { await this.socket.request({ action: 'expire', payload: { key: this.key, ttl: parseInt(ttlStr) }, }); this.gtag('/expire'); await this.refresh(); this.common.toast(this.i18n.strings().status.ttlChanged); } } catch (e) { this.common.generalHandleError(e); } } async refresh(options: { withoutParent?: boolean } = {}): Promise { this.gtag('/refresh'); await this.loadKey(options); } charactersPrettyBytes(length: number): string { if (!length || length < 1024) return ''; return '(' + (p3xr?.settings?.prettyBytes?.(length) ?? '') + ')'; } // --- Private --- private async loadKey(options: { withoutParent?: boolean } = {}): Promise { this.clearTtlInterval(); let hadError: any; try { const response = await this.socket.request({ action: 'key-get', payload: { key: this.key }, }); this.response = response; if (response.ttl === -2) { this.checkTtl(); return; } response.size = 0; this.decodeValueBuffer(response); this.calculateSize(response); if (response.ttl > -1) this.wasExpiring = true; this.loadTtl(); } catch (e) { hadError = e; console.error(e); if (!p3xr?.settings?.handleConnectionIsClosed?.(e)) { this.common.alert(this.i18n.strings().label.unableToLoadKey({ key: this.key })); } else { this.common.alert((e as any)?.message ?? String(e)); } } finally { if (hadError) { this.navigateTo('database.statistics'); } else if (!options.withoutParent) { const resize = this.getStateParam('resize'); if (resize) resize(); } this.loading = false; this.cdr.markForCheck(); } } private decodeValueBuffer(response: any): void { const { type, valueBuffer } = response; const td = new TextDecoder(); switch (type) { case 'string': response.value = td.decode(valueBuffer); break; case 'list': case 'set': response.value = valueBuffer.map((buf: any) => td.decode(buf)); break; case 'hash': response.value = {}; Object.entries(valueBuffer).forEach(([key, buf]: [string, any]) => { response.value[key] = td.decode(buf); }); break; case 'zset': response.value = []; for (let i = 0; i < valueBuffer.length; i += 2) { response.value.push(td.decode(valueBuffer[i])); response.value.push(td.decode(valueBuffer[i + 1])); } break; case 'json': // JSON.GET with $ returns a JSON string (always compact from Redis) const rawJson = td.decode(valueBuffer); try { const parsed = JSON.parse(rawJson); // JSONPath $ returns array wrapper, unwrap it const unwrapped = Array.isArray(parsed) ? parsed[0] : parsed; response.value = JSON.stringify(unwrapped, null, p3xr?.settings?.jsonFormat ?? 2); } catch { response.value = rawJson; } break; case 'stream': const decodeEntry = (entry: any): any => { return entry.map((item: any) => { if (Array.isArray(item)) return decodeEntry(item); if (ArrayBuffer.isView(item) || item instanceof ArrayBuffer) return td.decode(item); return item; }); }; response.value = valueBuffer.map((entry: any) => decodeEntry(entry)); break; } } private calculateSize(response: any): void { if (response.type !== 'stream') { if (typeof response.valueBuffer === 'object' && response.length > 0) { for (const k of Object.keys(response.valueBuffer)) { response.size += response.valueBuffer[k].byteLength; } } else if (Array.isArray(response.valueBuffer)) { for (const buf of response.valueBuffer) response.size += buf.byteLength; } else { response.size = response.valueBuffer.byteLength; } } else { const sumBytes = (arr: any[]): number => { let total = 0; const process = (el: any) => { if (ArrayBuffer.isView(el) || el instanceof ArrayBuffer) total += el.byteLength; else if (Array.isArray(el)) el.forEach(process); }; arr.forEach(process); return total; }; response.size = sumBytes(response.valueBuffer); } } private loadTtl(): void { if (!this.response || this.response.ttl <= -1) return; const humanizeDuration = require('humanize-duration'); const updateTtl = () => { if (!this.checkTtl()) { this.clearTtlInterval(); return; } const hdOpts = p3xr?.settings?.getHumanizeDurationOptions?.() ?? {}; const parsed = ' ' + humanizeDuration(this.response.ttl * 1000, { ...hdOpts, delimiter: ' ', }); const el = document.getElementById('p3xr-database-key-ttl-counter'); if (el) el.innerText = parsed; }; updateTtl(); if (!p3xr?.state?.reducedFunctions) { this.clearTtlInterval(); this.ttlInterval = setInterval(() => { this.response.ttl--; updateTtl(); }, 1000); } } private checkTtl(): boolean { if (this.response.ttl < -1 || (this.wasExpiring && this.response.ttl < 1)) { this.common.toast(this.i18n.strings().status.keyIsNotExisting); this.clearTtlInterval(); p3xr.state.redisChanged = true; this.navigateTo('database.statistics'); return false; } return true; } private clearTtlInterval(): void { if (this.ttlInterval) { clearInterval(this.ttlInterval); this.ttlInterval = null; } } private generateHighlight(): void { this.removeHighlight(); const isDark = p3xr?.state?.theme?.includes?.('Dark') || p3xr?.state?.theme?.includes?.('Matrix'); const bg = isDark ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.15)'; const color = isDark ? 'white' : 'black'; const style = document.createElement('style'); style.id = 'p3xr-theme-styles-tree-key'; style.textContent = `[data-p3xr-tree-key="${p3xr?.ui?.htmlEncode?.(this.key) ?? ''}"] .p3xr-database-tree-node-label { background-color: ${bg} !important; color: ${color} !important; padding: 2px; }`; document.head.appendChild(style); } private removeHighlight(): void { document.getElementById('p3xr-theme-styles-tree-key')?.remove(); } // --- Helpers --- private getStateParam(name: string): any { return this.route.snapshot.paramMap.get(name); } private navigateTo(state: string, params?: any): void { this.nav.navigateTo(state, params); } private gtag(page: string): void { try { if (typeof (window as any).gtag === 'function') { (window as any).gtag('config', p3xr?.settings?.googleAnalytics, { page_path: page }); } } catch { /* noop */ } } } src/ng/pages/database/database-tree.component.html000066400000000000000000000104011517666434100225150ustar00rootroot00000000000000
@if (node.expandable) { } @if (!isReadonly) { @if (node.type === 'folder') { close } @else { close } add }
src/ng/pages/database/database-tree.component.scss000066400000000000000000000062251517666434100225350ustar00rootroot00000000000000// Host element — fill the parent container p3xr-database-tree { display: block; height: 100%; width: 100%; overflow: hidden; } // Tree viewport — fills parent container .p3xr-database-tree-viewport { height: 100%; width: 100%; } // Each flat node row .p3xr-database-tree-row { display: flex; align-items: center; height: 28px; line-height: 28px; white-space: nowrap; cursor: default; } // Folder expand/collapse icon — Font Awesome folder via ::before .p3xr-tree-branch-head { display: inline-block; font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 900; font-size: 24px; line-height: 28px; width: 28px; text-align: center; margin-right: 4px; cursor: pointer; color: var(--p3xr-tree-branch-color); } .p3xr-tree-branch-head.tree-collapsed::before { content: "\f07b"; // fa-folder } .p3xr-tree-branch-head.tree-expanded::before { content: "\f07c"; // fa-folder-open } // Redis type icons .p3xr-database-treecontrol-node-icon { display: inline-block; min-width: 12px; text-align: center; } // Node label container .p3xr-database-tree-node { cursor: pointer; line-height: 28px; white-space: nowrap; } .p3xr-database-tree-node-label { // Used by main-key component CSS for highlighting selected key } .p3xr-database-tree-node-count { opacity: 0.5; } // Hover action icons — shared sizing .p3xr-database-treecontrol-folder-icon, .p3xr-database-treecontrol-delete-icon { font-size: 18px !important; height: 18px !important; width: 18px !important; min-width: 18px !important; min-height: 18px !important; line-height: 18px !important; cursor: pointer; vertical-align: middle; } // Add icon — warn/accent color .p3xr-database-treecontrol-folder-icon { color: var(--p3xr-common-warn-color); } // Delete icon — red warn color .p3xr-database-treecontrol-delete-icon { color: var(--p3xr-btn-warn-bg); } // TTL indicator badge .p3xr-tree-ttl-badge { display: inline-flex; align-items: center; gap: 3px; font-size: 11px; margin-left: 6px; opacity: 0.7; white-space: nowrap; } .p3xr-tree-ttl-icon { font-size: 11px; margin-left: 6px; padding: 4px; cursor: default; } .p3xr-tree-ttl-green { color: #4caf50; } .p3xr-tree-ttl-yellow { color: #ff9800; } .p3xr-tree-ttl-red { color: #f44336; } .p3xr-tree-ttl-pulse { animation: p3xr-ttl-pulse 1s infinite; } @keyframes p3xr-ttl-pulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } .p3xr-database-tree-actions { display: inline-flex; align-items: center; position: relative; top: -1px; visibility: hidden; } .p3xr-database-tree-row:hover .p3xr-database-tree-actions { visibility: visible; } @media (max-width: 599px) { .p3xr-database-tree-node { display: inline-block; } // On mobile the tree is in a flex column with no explicit pixel height. // cdk-virtual-scroll-viewport needs a concrete height to render. p3xr-database-tree { height: auto; min-height: 100px; } .p3xr-database-tree-viewport { height: 20vh; min-height: 100px; } } src/ng/pages/database/database-tree.component.ts000066400000000000000000000355261517666434100222160ustar00rootroot00000000000000import { Component, Input, Inject, OnInit, OnDestroy, NgZone, ElementRef, ViewChild, ChangeDetectorRef, ChangeDetectionStrategy, ViewEncapsulation, CUSTOM_ELEMENTS_SCHEMA, effect } from '@angular/core'; import { CommonModule } from '@angular/common'; import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling'; import { MatTooltipModule } from '@angular/material/tooltip'; import { I18nService } from '../../services/i18n.service'; import { CommonService } from '../../services/common.service'; import { ThemeService } from '../../services/theme.service'; import { SocketService } from '../../services/socket.service'; import { KeyNewOrSetDialogService } from '../../dialogs/key-new-or-set-dialog.service'; import { NavigationService } from '../../services/navigation.service'; import { MainCommandService } from '../../services/main-command.service'; import { TreeBuilderService } from '../../services/tree-builder.service'; require('./database-tree.component.scss'); declare const p3xr: any; export interface FlatTreeNode { label: string; key: string; level: number; expandable: boolean; type: 'folder' | 'element'; childCount: number; keysInfo?: { type: string; length: number; ttl?: number }; // Reference to the original hierarchical node (for expandedNodes sync) _sourceNode?: any; } @Component({ selector: 'p3xr-database-tree', standalone: true, imports: [ CommonModule, ScrollingModule, MatTooltipModule, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './database-tree.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class DatabaseTreeComponent implements OnInit, OnDestroy { @Input() p3xrResize: any; @Input() p3xrMainRef: any; @ViewChild(CdkVirtualScrollViewport) private viewport?: CdkVirtualScrollViewport; dataSource: FlatTreeNode[] = []; isEnabled = false; isReadonly = false; divider = ':'; readonly strings; private expandedKeys = new Set(); private hierarchicalNodes: any[] = []; private readonly unsubs: Array<() => void> = []; constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(ElementRef) private readonly elementRef: ElementRef, @Inject(I18nService) private readonly i18n: I18nService, @Inject(CommonService) private readonly common: CommonService, @Inject(ThemeService) private readonly theme: ThemeService, @Inject(SocketService) private readonly socket: SocketService, @Inject(KeyNewOrSetDialogService) private readonly keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(NavigationService) private readonly nav: NavigationService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, @Inject(TreeBuilderService) private readonly treeBuilder: TreeBuilderService, ) { this.strings = this.i18n.strings; effect(() => { this.i18n.currentLang(); this.cdr.markForCheck(); }); } ngOnInit(): void { this.syncGlobalState(); this.attachWindowFocusListener(); this.startPolling(); // Subscribe to MainCommandService events const subDelete = this.cmd.keyDelete$.subscribe((arg) => { this.ngZone.run(() => this.deleteKey(arg.event, arg.key)); }); this.unsubs.push(() => subDelete.unsubscribe()); const subRename = this.cmd.keyRename$.subscribe((arg) => { this.ngZone.run(() => this.renameKey(arg.event, arg.key)); }); this.unsubs.push(() => subRename.unsubscribe()); const subKeyNew = this.cmd.keyNew$.subscribe((arg) => { this.ngZone.run(() => this.addKey(arg.event, arg.node ? { ...arg, _sourceNode: arg.node } as any : arg as any)); }); this.unsubs.push(() => subKeyNew.unsubscribe()); const subTreeEnabled = this.cmd.treeControlEnabled$.subscribe((enabled) => { this.ngZone.run(() => { this.isEnabled = enabled; }); }); this.unsubs.push(() => subTreeEnabled.unsubscribe()); const subTreeRefresh = this.cmd.treeRefresh$.subscribe(() => { this.ngZone.run(() => { this.syncGlobalState(); this.rebuildTree(); }); }); this.unsubs.push(() => subTreeRefresh.unsubscribe()); const subExpand = this.common.treeExpandAll$.subscribe(() => this.ngZone.run(() => { const allFolderKeys = new Set(); const collect = (nodes: any[]) => { for (const node of nodes) { if (node.type === 'folder') { allFolderKeys.add(node.key); collect(node.children ?? []); } } }; collect(this.hierarchicalNodes); this.expandedKeys = allFolderKeys; this.flattenVisibleNodes(); this.syncExpandedNodesToGlobal(); this.cdr.markForCheck(); })); this.unsubs.push(() => subExpand.unsubscribe()); const subCollapse = this.common.treeCollapseAll$.subscribe(() => this.ngZone.run(() => { this.expandedKeys = new Set(); this.flattenVisibleNodes(); this.syncExpandedNodesToGlobal(); this.cdr.markForCheck(); })); this.unsubs.push(() => subCollapse.unsubscribe()); setTimeout(() => { this.isEnabled = true; this.cdr.markForCheck(); }, 50); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); } // --- TTL indicator removed: tree TTL is fetched once and becomes stale, // causing mismatch with the fresh TTL in key view. See feature-03 docs. // The server still includes TTL in keysInfo for potential future use. // --- Tree data --- trackByKey(_index: number, node: FlatTreeNode): string { return node.key; } isExpanded(node: FlatTreeNode): boolean { return this.expandedKeys.has(node.key); } toggleExpand(node: FlatTreeNode): void { if (this.expandedKeys.has(node.key)) { this.expandedKeys.delete(node.key); } else { this.expandedKeys.add(node.key); } this.flattenVisibleNodes(); this.syncExpandedNodesToGlobal(); } // --- Node actions --- selectNode(node: FlatTreeNode): void { this.navigateTo('database.key', { key: node.key, }); } async deleteKey(event: Event, key: string): Promise { try { event.preventDefault(); event.stopPropagation(); await this.common.confirm({ message: this.i18n.strings().confirm.deleteKey, }); await this.socket.request({ action: 'delete', payload: { key }, }); if (typeof window['gtag'] === 'function') { window['gtag']('config', p3xr.settings.googleAnalytics, { page_path: '/delete' }); } this.navigateTo('database.statistics'); this.common.toast(this.i18n.strings().status.deletedKey({ key })); await this.cmd.refresh(); this.rebuildTree(); } catch (e) { this.common.generalHandleError(e); } } async renameKey(event: Event, key: string): Promise { try { event?.stopPropagation?.(); const newKey = await this.common.prompt({ title: this.i18n.strings().confirm.rename.title, placeholder: this.i18n.strings().confirm.rename.placeholder, initialValue: key, ok: this.i18n.strings().intention.rename, cancel: this.i18n.strings().intention.cancel, }); await this.socket.request({ action: 'rename', payload: { key, keyNew: newKey }, }); if (typeof window['gtag'] === 'function') { window['gtag']('config', p3xr.settings.googleAnalytics, { page_path: '/rename' }); } this.navigateTo('database.key', { key: newKey, }); this.common.toast(this.i18n.strings().status.renamedKey); await this.cmd.refresh(); this.rebuildTree(); } catch (e) { this.common.generalHandleError(e); } } async deleteTree(event: Event, node: FlatTreeNode): Promise { try { event.stopPropagation(); await this.common.confirm({ message: this.i18n.strings().confirm.deleteAllKeys({ key: node.key }), }); await this.socket.request({ action: 'key-del-tree', payload: { key: node.key, redisTreeDivider: p3xr.settings.redisTreeDivider, }, }); this.common.toast(this.i18n.strings().status.treeDeleted({ key: node.key })); // If currently viewing a key under the deleted tree, go to statistics const currentPath = location.pathname; if (currentPath.startsWith('/database/key/')) { const currentKey = decodeURIComponent(currentPath.slice('/database/key/'.length).replace(/~/g, '%')); if (currentKey.startsWith(node.key + p3xr.settings.redisTreeDivider)) { this.navigateTo('database.statistics'); } } await this.cmd.refresh(); this.rebuildTree(); } catch (e) { this.common.generalHandleError(e); } } async addKey(event: Event, node: FlatTreeNode): Promise { try { event.stopPropagation(); const response = await this.keyNewOrSetDialog.show({ type: 'add', $event: event, node: node._sourceNode ?? { key: node.key }, }); await this.cmd.refresh(); this.rebuildTree(); this.navigateTo('database.key', { key: response.key, }); } catch (e) { this.common.generalHandleError(e); } } // --- Tooltips --- extractNodeTooltip(node: FlatTreeNode): string { if (node.type !== 'folder' && node.keysInfo) { const strings = this.i18n.strings(); return p3xr.ui.htmlEncode((strings.redisTypes?.[node.keysInfo.type] ?? node.keysInfo.type) + ' - ' + node.key); } return p3xr.ui.htmlEncode(node.key); } deleteTreeTooltip(node: FlatTreeNode): string { return this.i18n.strings().confirm?.deleteAllKeys?.({ key: node.key }) ?? ''; } // --- Tree rebuild --- private rebuildTree(): void { const state = p3xr?.state; if (!state) { return; } this.divider = p3xr.settings?.redisTreeDivider ?? ':'; this.isReadonly = state.connection?.readonly === true; const keys: string[] = state.keysRaw ?? []; const keysInfo: any = state.keysInfo ?? {}; this.treeBuilder.keysToTreeControl({ keys, divider: this.divider, keysInfo, }).then(({ nodes }) => { this.hierarchicalNodes = nodes; this.flattenVisibleNodes(); this.requestViewRefresh(); }); } private flattenVisibleNodes(): void { const result: FlatTreeNode[] = []; const flatten = (nodes: any[], level: number) => { for (const node of nodes) { result.push({ label: node.label, key: node.key, level, expandable: node.type === 'folder', type: node.type, childCount: node.childCount ?? 0, keysInfo: node.keysInfo, _sourceNode: node, }); if (node.type === 'folder' && this.expandedKeys.has(node.key) && node.children?.length > 0) { flatten(node.children, level + 1); } } }; flatten(this.hierarchicalNodes, 0); this.dataSource = result; } private syncExpandedNodesToGlobal(): void { // Build array of node objects matching the expanded keys const expandedNodeObjects: any[] = []; const collectExpanded = (nodes: any[]) => { for (const node of nodes) { if (node.type === 'folder' && this.expandedKeys.has(node.key)) { expandedNodeObjects.push(node); } if (node.children?.length > 0) { collectExpanded(node.children); } } }; collectExpanded(this.hierarchicalNodes); p3xr.state.expandedNodes = expandedNodeObjects; } private syncGlobalState(): void { this.divider = p3xr?.settings?.redisTreeDivider ?? ':'; this.isReadonly = p3xr?.state?.connection?.readonly === true; } // --- Polling for change detection --- private startPolling(): void { let lastSnapshot = ''; const id = setInterval(() => { const snapshot = JSON.stringify({ keysLength: p3xr?.state?.keysRaw?.length, divider: p3xr?.settings?.redisTreeDivider, readonly: p3xr?.state?.connection?.readonly, }); if (snapshot !== lastSnapshot) { lastSnapshot = snapshot; this.ngZone.run(() => { this.syncGlobalState(); this.rebuildTree(); }); } }, 300); this.unsubs.push(() => clearInterval(id)); // Initial build this.ngZone.run(() => this.rebuildTree()); } private attachWindowFocusListener(): void { const focusListener = () => { if (this.isEnabled) { this.ngZone.run(() => { this.isEnabled = false; setTimeout(() => { this.isEnabled = true; this.rebuildTree(); }); }); } }; window.addEventListener('focus', focusListener); this.unsubs.push(() => window.removeEventListener('focus', focusListener)); } // --- Navigation --- private navigateTo(state: string, params?: any): void { this.nav.navigateTo(state, params); } private requestViewRefresh(): void { setTimeout(() => { try { this.cdr.detectChanges(); this.viewport?.checkViewportSize(); } catch { // Ignore late refreshes during teardown. } }); } } src/ng/pages/database/database-treecontrol-controls.component.html000066400000000000000000000152541517666434100257720ustar00rootroot00000000000000
@if (treeDividers.length > 0) { @for (divider of treeDividers; track divider) { } }
@if (pages > 1) { / {{ pages }} } @else { {{ keyCountText() }}  } src/ng/pages/database/database-treecontrol-controls.component.scss000066400000000000000000000111101517666434100257640ustar00rootroot00000000000000:host { display: block; margin-top: 2px; min-height: 24px; text-align: center; } #p3xr-database-treecontrol-controls-container { display: inline-block; } .p3xr-database-treecontrol-controls-leading { float: left; line-height: 31px; } .p3xr-database-treecontrol-controls-search { clear: both; padding: 5px; text-align: left; line-height: 24px; } .p3xr-database-treecontrol-controls-pager { display: inline-block; position: relative; top: 2px; vertical-align: middle; line-height: 24px; } .p3xr-database-treecontrol-controls-keycount { float: right; line-height: 26px; margin-top: 6px; opacity: 0.5; } .p3xr-database-treecontrol-divider-menu-label { font-family: 'Roboto Mono', monospace; font-size: 14px; font-weight: 500; } // Divider mat-menu overlay panel — rendered outside the component in CDK overlay // translateX shifts popup left to center on the divider input instead of the trigger arrow .p3xr-divider-menu.mat-mdc-menu-panel { min-width: 20px !important; max-width: 40px !important; transform: translateX(-20px); .mat-mdc-menu-content { padding: 0 !important; } .mat-mdc-menu-item { min-height: 28px; height: 28px; padding: 0 !important; min-width: 0; text-align: center; justify-content: center; .mdc-list-item__primary-text { width: 100%; text-align: center; } } .p3xr-database-treecontrol-divider-menu-label { display: block; text-align: center; width: 100%; } } // Icon buttons — match AngularJS md-button.md-icon-button with overrides .p3xr-database-treecontrol-icon-button { align-items: center; background: none; border: 0; border-radius: 50%; color: var(--p3xr-treecontrol-icon-color); cursor: pointer; display: inline-flex; height: 24px; justify-content: center; line-height: 24px; margin: 0; min-height: 24px; min-width: 24px; padding: 0; vertical-align: middle; width: 24px; } .p3xr-database-treecontrol-icon-button:focus { outline: none; } .p3xr-database-treecontrol-icon-button .material-icons { display: block; font-size: 24px; height: 24px; line-height: 24px; width: 24px; } .p3xr-database-treecontrol-root-add { color: var(--p3xr-common-warn-color); cursor: pointer; display: inline-block; font-size: 24px; height: 24px; line-height: 24px; vertical-align: middle; width: 24px; } .p3xr-database-treecontrol-icon-primary { color: var(--p3xr-btn-primary-bg); } // Divider input — sits inline with icon buttons p3xr-ng-input.p3xr-database-treecontrol-divider-input { font-family: 'Roboto Mono', monospace; font-size: 14px; font-weight: 500; text-align: center; vertical-align: middle !important; width: 23px; } p3xr-ng-input.p3xr-database-treecontrol-divider-input input.p3xr-input { text-align: center; } // Divider dropdown trigger button — clicks to open the divider selector .p3xr-database-treecontrol-divider-trigger { background: none; border: 0; color: var(--p3xr-treecontrol-icon-color); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; height: 24px; margin: 0; padding: 0; vertical-align: middle; width: 14px; } .p3xr-database-treecontrol-divider-trigger .material-icons { font-size: 18px; height: 18px; width: 18px; } // Page input — inside pager row p3xr-ng-input.p3xr-database-treecontrol-page-input { vertical-align: middle !important; width: 48px; } // Pager text "/ 101" alignment .p3xr-database-treecontrol-pager-text { vertical-align: middle; } // Menu hint text shown below export/import when search is active .p3xr-menu-hint { padding: 0 16px 8px; font-size: 11px; opacity: 0.5; font-style: italic; pointer-events: none; line-height: 1.3; } // Search input p3xr-ng-input.p3xr-database-treecontrol-search-input { vertical-align: middle !important; width: auto; } // Not readonly: search + hamburger + add = 3 trailing buttons, +clear = 4 .p3xr-database-treecontrol-search-input.search-full { width: calc(100% - 73px); } .p3xr-database-treecontrol-search-input.search-full-clear { width: calc(100% - 98px); } // Readonly: search + hamburger = 2 trailing buttons, +clear = 3 .p3xr-database-treecontrol-search-input.search-readonly { width: calc(100% - 48px); } .p3xr-database-treecontrol-search-input.search-readonly-clear { width: calc(100% - 73px); } src/ng/pages/database/database-treecontrol-controls.component.ts000066400000000000000000000317261517666434100254560ustar00rootroot00000000000000import { Component, Input, Inject, OnInit, OnDestroy, NgZone, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatMenuModule } from '@angular/material/menu'; import { MatIconModule } from '@angular/material/icon'; import { MatDividerModule } from '@angular/material/divider'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; declare const p3xr: any; import { P3xrInputComponent } from '../../components/p3xr-input.component'; import { I18nService } from '../../services/i18n.service'; import { CommonService } from '../../services/common.service'; import { MainCommandService } from '../../services/main-command.service'; import { SocketService } from '../../services/socket.service'; import { TreecontrolSettingsDialogService } from '../../dialogs/treecontrol-settings-dialog.service'; import { KeyImportDialogService } from '../../dialogs/key-import-dialog.service'; require('./database-treecontrol-controls.component.scss'); @Component({ selector: 'p3xr-database-treecontrol-controls', standalone: true, imports: [ CommonModule, FormsModule, MatTooltipModule, MatMenuModule, MatIconModule, MatDividerModule, P3xrInputComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './database-treecontrol-controls.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) export class DatabaseTreecontrolControlsComponent implements OnInit, OnDestroy { @Input() p3xrMainRef: any; page = 1; pages = 0; search = ''; keyCount = 0; redisTreeDivider = ':'; treeDividers: string[] = []; searchClientSide = false; isReadonly = false; readonly strings; private readonly unsubs: Array<() => void> = []; private readonly dividerChange$ = new Subject(); constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(ElementRef) private readonly elementRef: ElementRef, @Inject(I18nService) private readonly i18n: I18nService, @Inject(CommonService) private readonly common: CommonService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(TreecontrolSettingsDialogService) private readonly treeSettingsDialog: TreecontrolSettingsDialogService, @Inject(KeyImportDialogService) private readonly keyImportDialog: KeyImportDialogService, @Inject(SocketService) private readonly socket: SocketService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.syncFromGlobal(); // If search was restored from state (e.g. cookie), trigger it if (this.search) { this.onSearchChange(); } const sub = this.dividerChange$.pipe(debounceTime(666)).subscribe((value) => { this.applyDivider(value); }); this.unsubs.push(() => sub.unsubscribe()); const refreshSub = this.cmd.treeRefresh$.subscribe(() => { this.ngZone.run(() => { this.syncFromGlobal(); this.requestViewRefresh(); }); }); this.unsubs.push(() => refreshSub.unsubscribe()); } ngOnDestroy(): void { this.unsubs.forEach((unsub) => unsub()); } keyCountText(): string { const fn = this.strings()?.status?.keyCount; return typeof fn === 'function' ? fn({ keyCount: this.keyCount }) : String(this.keyCount); } searchPlaceholder(): string { const searchStrings = this.strings()?.page?.treeControls?.search; return this.searchClientSide ? (searchStrings?.placeholderClient || 'Search keys') : (searchStrings?.placeholderServer || 'Search keys on server'); } treeExpandAll(): void { this.common.treeExpandAll$.next(); } treeCollapseAll(): void { this.common.treeCollapseAll$.next(); } async refreshTree(): Promise { await this.cmd.refresh(); this.ngZone.run(() => { this.syncFromGlobal(); this.requestViewRefresh(); }); } async openTreeSettingDialog(event: Event): Promise { await this.treeSettingsDialog.show({ $event: event }); this.syncFromGlobal(); this.requestViewRefresh(); } onDividerInputChange(value: string): void { this.redisTreeDivider = value ?? ''; if (p3xr?.settings) { p3xr.settings.redisTreeDivider = this.redisTreeDivider; } this.dividerChange$.next(this.redisTreeDivider); } setDivider(value: string): void { this.redisTreeDivider = value ?? ''; this.applyDivider(this.redisTreeDivider); } private applyDivider(value: string): void { if (p3xr?.settings) { p3xr.settings.redisTreeDivider = value; } if (p3xr?.state) { p3xr.state.redisChanged = true; } this.cmd.treeRefresh$.next(); this.syncFromGlobal(); } pageAction(page: 'first' | 'prev' | 'next' | 'last'): void { const state = p3xr?.state; if (!state) { return; } switch (page) { case 'prev': if (state.page - 1 >= 1) { state.page = state.page - 1; } break; case 'next': if (state.page + 1 <= state.pages) { state.page = state.page + 1; } break; case 'last': state.page = state.pages; break; case 'first': state.page = 1; break; } this.syncFromGlobal(); } onPageInputChange(value: any): void { const parsed = parseInt(value, 10); const state = p3xr?.state; if (!state) { return; } state.page = isNaN(parsed) ? 1 : parsed; this.pageChange(); } pageChange(): void { const state = p3xr?.state; if (!state) { return; } if (state.page < 1) { state.page = 1; } else if (state.page > state.pages) { state.page = state.pages; } this.syncFromGlobal(); } onSearchModelChange(value: string): void { this.search = value ?? ''; if (p3xr?.state) { p3xr.state.search = this.search; } } async onSearchChange(): Promise { if (!p3xr?.state) { return; } p3xr.state.search = this.search; p3xr.state.page = 1; if (p3xr.settings?.searchClientSide) { p3xr.state.redisChanged = true; } await this.cmd.refresh(); this.syncFromGlobal(); this.requestViewRefresh(); this.socket.tick(); } async clearSearch(): Promise { this.search = ''; await this.onSearchChange(); } async exportKeys(): Promise { const keys = p3xr?.state?.keysRaw; if (!Array.isArray(keys) || keys.length === 0) { this.common.toast({ message: this.strings().label?.noKeysToExport || 'No keys to export' }); return; } try { p3xr?.ui?.overlay?.show({ message: this.strings().label?.exportProgress || 'Exporting keys...', }); const response = await this.socket.request({ action: 'key-export', payload: { keys }, }); const json = JSON.stringify(response.data, null, 2); const blob = new Blob([json], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; const connName = p3xr?.state?.connection?.name || 'redis'; const db = p3xr?.state?.currentDatabase ?? 0; a.download = `${connName}-db${db}-export.json`; a.click(); URL.revokeObjectURL(url); this.common.toast({ message: this.strings().status?.exportDone || 'Export complete' }); } catch (e) { this.common.generalHandleError(e); } finally { p3xr?.ui?.overlay?.hide(); } } async importKeys(): Promise { const input = document.createElement('input'); input.type = 'file'; input.accept = '.json'; input.onchange = async () => { const file = input.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onerror = () => this.common.generalHandleError(reader.error); reader.onload = async (e: any) => { try { const parsed = JSON.parse(e.target.result); if (!parsed?.keys || !Array.isArray(parsed.keys) || parsed.keys.length === 0) { this.common.toast({ message: this.strings().label?.importNoKeys || 'No keys found in file' }); return; } const result = await this.keyImportDialog.show({ data: parsed }); if (result?.pending) { // Dialog closed, now show overlay and do import try { p3xr?.ui?.overlay?.show({ message: this.strings().label?.importProgress || 'Importing keys...', }); const response = await this.socket.request({ action: 'key-import', payload: { keys: result.keys, conflictMode: result.conflictMode, }, }); const data = response.data; const statusFn = this.strings().status?.importDone; const message = typeof statusFn === 'function' ? statusFn(data) : `Import complete: ${data.created} created, ${data.skipped} skipped, ${data.errors} errors`; this.common.toast({ message }); } finally { p3xr?.ui?.overlay?.hide(); } // Refresh tree after import await this.cmd.refresh(); this.ngZone.run(() => { this.syncFromGlobal(); this.requestViewRefresh(); }); } } catch (e: any) { if (e !== undefined && e !== null) { this.common.generalHandleError(e); } } }; reader.readAsText(file); }; input.click(); } searchInputClass(): string { const hasSearch = this.search.length > 0; if (this.isReadonly) { return hasSearch ? 'search-readonly-clear' : 'search-readonly'; } return hasSearch ? 'search-full-clear' : 'search-full'; } exportLabel(): string { const strings = this.strings(); if (this.search.length > 0) { const fn = strings.intention?.exportSearchResults; return typeof fn === 'function' ? fn({ count: this.keyCount }) : `Export ${this.keyCount} results`; } const fn = strings.intention?.exportAllKeys; return typeof fn === 'function' ? fn({ count: this.keyCount }) : `Export all ${this.keyCount} keys`; } addRootKey(event: Event): void { this.cmd.addKey({ event }); } private syncFromGlobal(): void { // Access state.keys to trigger the computed getter that updates globalKeysRaw // (pages getter depends on globalKeysRaw which is set inside the keys getter) const _keys = p3xr?.state?.keys; this.page = Number(p3xr?.state?.page ?? 1); this.pages = Number(p3xr?.state?.pages ?? 0); this.search = p3xr?.state?.search ?? ''; this.keyCount = Array.isArray(p3xr?.state?.keysRaw) ? p3xr.state.keysRaw.length : 0; this.redisTreeDivider = p3xr?.settings?.redisTreeDivider ?? ':'; this.treeDividers = Array.isArray(p3xr?.state?.cfg?.treeDividers) ? p3xr.state.cfg.treeDividers.slice() : []; this.searchClientSide = !!p3xr?.settings?.searchClientSide; this.isReadonly = p3xr?.state?.connection?.readonly === true; } private requestViewRefresh(): void { setTimeout(() => { try { this.cdr.detectChanges(); } catch { // Ignore late refreshes during teardown. } }); } } src/ng/pages/database/database.component.html000066400000000000000000000044751517666434100215760ustar00rootroot00000000000000
{{ strings().title?.main }}
src/ng/pages/database/database.component.scss000066400000000000000000000046111517666434100215750ustar00rootroot00000000000000@use "../../../scss/vars" as v; p3xr-database { @media (max-width:350px) { .p3xr-database-toolbar-button-hide-on-small { display: none; } } p3xr-database-header, .p3xr-content-border { border-top-left-radius: v.$border-radius; border-top-right-radius: v.$border-radius; } #p3xr-database-treecontrol-container { position: fixed; overflow: auto; } #p3xr-database-treecontrol-container-directive-small { display: block; flex: 1 1 auto; min-height: 0; max-height: none; overflow-y: auto; overflow-x: auto; } .p3xr-database-treecontrol-folder-icon { transform: scale(0.75); } #p3xr-database-content-container { position: fixed; overflow: auto; display: block; } #p3xr-database-content.p3xr-database-content-with-bottom-console { position: relative; overflow-x: hidden; &::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: inherit; pointer-events: none; z-index: 1; } } .p3xr-database-bottom-console-mobile { height: 33vh; min-height: 220px; margin-top: auto; border-top: 1px solid rgba(255, 255, 255, 0.16); overflow-x: hidden; } @media (max-width: 959px) { #p3xr-database-content { overflow-x: hidden; } .p3xr-database-has-connection { display: flex; flex-direction: column; min-height: 100%; } } } #p3xr-database-content-sizer { position: fixed; display: block; cursor: ew-resize; z-index: 8; background-color: var(--p3xr-accordion-bg); transition: background-color 0.15s ease; body.p3xr-theme-dark &:hover { filter: brightness(1.3); } body.p3xr-theme-dark &.p3xr-resizer-active { filter: brightness(1.6); } body.p3xr-theme-light &:hover { filter: brightness(0.85); } body.p3xr-theme-light &.p3xr-resizer-active { filter: brightness(0.7); } } #p3xr-database-bottom-console-panel { position: fixed; overflow: hidden; box-sizing: border-box; border-top: 1px solid rgba(255, 255, 255, 0.16); z-index: 9; } src/ng/pages/database/database.component.ts000066400000000000000000000426721517666434100212610ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, NgZone, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../services/i18n.service'; import { MainCommandService } from '../../services/main-command.service'; import { NavigationService } from '../../services/navigation.service'; import { SocketService } from '../../services/socket.service'; import { DatabaseHeaderComponent } from './database-header.component'; import { DatabaseTreecontrolControlsComponent } from './database-treecontrol-controls.component'; import { DatabaseTreeComponent } from './database-tree.component'; import { ConsoleComponent } from '../console/console.component'; declare const p3xr: any; require('./database.component.scss'); const debounce = require('lodash/debounce'); @Component({ selector: 'p3xr-database', standalone: true, imports: [ CommonModule, RouterModule, DatabaseHeaderComponent, DatabaseTreecontrolControlsComponent, DatabaseTreeComponent, ConsoleComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './database.component.html', styles: [` :host { display: block; } `], }) export class DatabaseComponent implements OnInit, OnDestroy { readonly strings; isXs = false; hasConnection = false; hasConnections = false; resizerActive = false; resizeClicked = false; private resizerMouseoverOn = false; private resizeLeft: number | undefined = undefined; private bottomConsoleExpanded = false; private screenSizeIsSmall = false; private containerEl!: HTMLElement; private headerEl!: HTMLElement; private footerEl!: HTMLElement; private consoleHeaderEl!: HTMLElement; private resizerEl: HTMLElement | undefined; private resizeObserver!: ResizeObserver; private observedElement: HTMLElement | null = null; private resizeTimeoutId: any; private readonly unsubs: Array<() => void> = []; private readonly resizeMinWidth = p3xr.settings.resizeMinWidth; private readonly bottomConsoleCollapsedHeight = 88; constructor( @Inject(NgZone) private readonly ngZone: NgZone, @Inject(BreakpointObserver) private readonly breakpointObserver: BreakpointObserver, @Inject(I18nService) private readonly i18n: I18nService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(NavigationService) private readonly nav: NavigationService, @Inject(SocketService) private readonly socket: SocketService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.syncFromGlobal(); // Subscribe to socket events for reactive state updates const sub1 = this.socket.connections$.subscribe(() => this.syncFromGlobal()); const sub2 = this.socket.redisDisconnected$.subscribe(() => { this.syncFromGlobal(); this.nav.navigateTo('settings'); }); const sub3 = this.socket.configuration$.subscribe(() => this.syncFromGlobal()); const sub4 = this.socket.stateChanged$.subscribe(() => { this.syncFromGlobal(); setTimeout(() => this.rawResize(), 50); }); this.unsubs.push(() => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.unsubscribe(); }); const xsSub = this.breakpointObserver.observe('(max-width: 599px)').subscribe(result => { const wasSmall = this.isXs; this.isXs = result.matches; if (!this.isXs && wasSmall) { clearTimeout(this.resizeTimeoutId); this.resizeTimeoutId = setTimeout(() => this.rawResize(), 4 * p3xr.settings.debounce); } this.screenSizeIsSmall = this.isXs; this.cdr.markForCheck(); }); this.unsubs.push(() => xsSub.unsubscribe()); // Init DOM references this.ngZone.runOutsideAngular(() => { setTimeout(() => this.initDom(), 0); }); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); window.removeEventListener('resize', this.boundRawResize); document.removeEventListener('mousedown', this.boundOnDocumentMouseDown); this.destroyResizer(); this.resizeObserver?.disconnect(); } // --- Template methods --- goSettings(): void { this.nav.navigateTo('settings'); } // --- Resize engine (ported from AngularJS) --- readonly resize = debounce(() => { this.resizeLeft = undefined; this.rawResize(); }, p3xr.settings.debounce); private readonly boundRawResize = () => this.rawResize(); private readonly boundOnDocumentMouseDown = (e: MouseEvent) => this.onDocumentMouseDown(e); private initDom(): void { this.containerEl = document.getElementById('p3xr-database-content')!; this.headerEl = document.getElementById('p3xr-layout-header-container')!; this.footerEl = document.getElementById('p3xr-layout-footer-container')!; this.consoleHeaderEl = document.querySelector('p3xr-database-header') as HTMLElement; this.rawResize(); window.addEventListener('resize', this.boundRawResize); document.addEventListener('mousedown', this.boundOnDocumentMouseDown); // Navigate to statistics if on bare /database if (this.nav.currentUrl === '/database' || this.nav.currentUrl === '/database/') { this.nav.navigateTo('database.statistics'); } if (p3xr.state.redisChanged) { p3xr.state.redisChanged = false; if (p3xr.state.connection) { this.cmd.refresh(); } } p3xr.state.page = 1; setTimeout(() => this.rawResize(), 250); // ResizeObserver for tree controls this.resizeObserver = new ResizeObserver(entries => { if (!this.resizeClicked) { window.requestAnimationFrame(() => { if (!Array.isArray(entries) || !entries.length) return; this.rawResize(); }); } }); this.watchResizeObserver(); // Listen for events via Angular services const consoleSub1 = this.cmd.consoleActivate$.subscribe(() => { if (!this.isXs && !this.bottomConsoleExpanded) { this.bottomConsoleExpanded = true; this.rawResize(); this.cmd.consoleEmbeddedResize$.next(); } }); const consoleSub2 = this.cmd.consoleDeactivate$.subscribe(() => { if (!this.isXs && this.bottomConsoleExpanded) { this.bottomConsoleExpanded = false; this.rawResize(); this.cmd.consoleEmbeddedResize$.next(); } }); const stateSub = this.socket.stateChanged$.subscribe(() => this.watchResizeObserver()); this.unsubs.push(() => { consoleSub1.unsubscribe(); consoleSub2.unsubscribe(); stateSub.unsubscribe(); }); } private rawResize(): void { if (!this.containerEl || !this.headerEl || !this.footerEl || !this.consoleHeaderEl) return; let minus = 0; for (const el of [this.headerEl, this.footerEl, this.consoleHeaderEl]) { minus += el.offsetHeight; } const windowHeight = window.innerHeight; const outputPositionMinus = 11; const bottomConsolePanel = document.getElementById('p3xr-database-bottom-console-panel'); const isDesktop = !this.isXs; let bottomConsoleHeight = 0; const hasDesktopConsole = isDesktop && p3xr.state?.connection !== undefined; const availableHeight = Math.max(windowHeight - minus - outputPositionMinus, 100); if (hasDesktopConsole) { bottomConsoleHeight = this.getBottomConsoleHeight(availableHeight); } const containerHeight = Math.max(availableHeight, 0); this.containerEl.style.height = containerHeight + 'px'; this.containerEl.style.maxHeight = containerHeight + 'px'; const containerPosition = p3xr.dom.getPosition(this.containerEl); if (!containerPosition || !Number.isFinite(containerPosition.height) || !Number.isFinite(containerPosition.width)) { return; } const contentAreaHeight = Math.max(containerPosition.height - bottomConsoleHeight, 0); // Bottom console panel if (bottomConsolePanel) { if (hasDesktopConsole && bottomConsoleHeight > 0) { const s = bottomConsolePanel.style; s.display = 'block'; s.position = 'absolute'; s.top = 'auto'; s.left = '-1px'; s.height = bottomConsoleHeight + 'px'; s.width = 'auto'; s.right = '-1px'; s.bottom = '0'; } else { bottomConsolePanel.style.display = 'none'; } } // Tree control const treeControl = document.getElementById('p3xr-database-treecontrol-container'); if (treeControl) { const treeControlControls = document.getElementById('p3xr-database-treecontrol-controls-container'); if (!treeControlControls) { this.destroyResizer(); return; } const treeControlControlsPosition = p3xr.dom.getPosition(treeControlControls); treeControl.style.top = (containerPosition.top + treeControlControlsPosition.height) + 'px'; treeControl.style.left = containerPosition.left + 'px'; treeControl.style.height = (contentAreaHeight - treeControlControlsPosition.height) + 'px'; treeControl.style.maxHeight = contentAreaHeight + 'px'; if (this.resizeLeft !== undefined) { treeControl.style.width = (this.resizeLeft - containerPosition.left) + 'px'; } else { treeControl.style.width = this.resizeMinWidth + 'px'; } treeControl.style.minWidth = this.resizeMinWidth + 'px'; const treeControlPosition = p3xr.dom.getPosition(treeControl); if (!this.resizerEl) { this.decorateResizer(); } const resizerWidth = 5; if (this.resizerEl) { this.resizerEl = document.getElementById('p3xr-database-content-sizer')!; if (this.resizerEl) { this.resizerEl.addEventListener('mouseover', this.boundResizerMouseover); this.resizerEl.addEventListener('mouseout', this.boundResizerMouseout); this.resizerEl.style.top = containerPosition.top + 'px'; const resizerHeight = Math.max(contentAreaHeight - (bottomConsoleHeight > 0 ? 1 : 0), 0); this.resizerEl.style.height = resizerHeight + 'px'; this.resizerEl.style.left = (containerPosition.left + treeControlPosition.width) + 'px'; this.resizerEl.style.width = resizerWidth + 'px'; treeControlControls.style.width = (containerPosition.left + treeControlPosition.width) + 'px'; } } const content = document.getElementById('p3xr-database-content-container'); if (content) { content.style.top = containerPosition.top + 'px'; content.style.height = contentAreaHeight + 'px'; content.style.left = (containerPosition.left + treeControlPosition.width + resizerWidth) + 'px'; content.style.width = (containerPosition.width - treeControlPosition.width - resizerWidth) + 'px'; } treeControlControls.style.width = treeControlPosition.width + 'px'; } else { this.destroyResizer(); } if (hasDesktopConsole && bottomConsoleHeight > 0) { this.cmd.consoleEmbeddedResize$.next(); } } private getBottomConsoleHeight(containerHeight: number): number { if (this.bottomConsoleExpanded) { let expandedHeight = Math.max(Math.floor(containerHeight * 0.33), 220); expandedHeight = Math.min(expandedHeight, Math.max(containerHeight - 120, this.bottomConsoleCollapsedHeight)); return expandedHeight; } return this.bottomConsoleCollapsedHeight; } // --- Resizer drag --- private readonly boundResizerMouseover = () => { this.resizerMouseoverOn = true; this.updateResizerColor(); }; private readonly boundResizerMouseout = () => { this.resizerMouseoverOn = false; this.updateResizerColor(); }; private readonly boundResizeClick = (event: MouseEvent) => this.resizeClick(event); private readonly boundDocumentMousemove = (event: MouseEvent) => this.documentMousemove(event); private updateResizerColor(): void { this.resizerActive = this.resizeClicked || this.resizerMouseoverOn; } private resizeClick(event: MouseEvent): void { if (event.type === 'mousedown' && (event.target as HTMLElement).id !== 'p3xr-database-content-sizer') return; if (event.type === 'mousedown') { this.resizeClicked = true; document.documentElement.style.cursor = 'ew-resize'; document.body.classList.add('p3xr-not-selectable'); } else if (event.type === 'mouseup') { document.documentElement.style.cursor = 'auto'; this.resizeClicked = false; document.body.classList.remove('p3xr-not-selectable'); } if (!this.resizeClicked) { this.rawResize(); } event.stopPropagation(); this.updateResizerColor(); } private documentMousemove(event: MouseEvent): void { if (!this.resizeClicked || !this.containerEl) return; const containerPosition = p3xr.dom.getPosition(this.containerEl); if (event.clientX < containerPosition.left + this.resizeMinWidth || event.clientX > window.innerWidth - this.resizeMinWidth) { document.documentElement.style.cursor = 'not-allowed'; } else { document.documentElement.style.cursor = 'ew-resize'; if (this.resizerEl) { this.resizerEl.style.left = event.clientX + 'px'; } this.resizeLeft = event.clientX; this.rawResize(); } } private decorateResizer(): void { this.resizerEl = document.getElementById('p3xr-database-content-sizer') ?? undefined; if (!this.resizerEl) return; this.resizerEl.addEventListener('mouseover', this.boundResizerMouseover); this.resizerEl.addEventListener('mouseout', this.boundResizerMouseout); document.addEventListener('mousemove', this.boundDocumentMousemove); document.addEventListener('mousedown', this.boundResizeClick); document.addEventListener('mouseup', this.boundResizeClick); } private destroyResizer(): void { if (this.resizerEl) { this.resizerEl.removeEventListener('mouseover', this.boundResizerMouseover); this.resizerEl.removeEventListener('mouseout', this.boundResizerMouseout); this.resizerEl = undefined; } document.removeEventListener('mousedown', this.boundResizeClick); document.removeEventListener('mouseup', this.boundResizeClick); document.removeEventListener('mousemove', this.boundDocumentMousemove); } // --- Bottom console expand/collapse --- private onDocumentMouseDown(event: MouseEvent): void { const bottomConsolePanel = document.getElementById('p3xr-database-bottom-console-panel'); if (this.isXs || !bottomConsolePanel) return; if (bottomConsolePanel.contains(event.target as Node)) { // Toolbar action buttons/checkboxes: keep current state const actions = bottomConsolePanel.querySelector('.p3xr-console-toolbar-actions'); if (actions && actions.contains(event.target as Node)) return; // Console content, input, toolbar title: expand if (!this.bottomConsoleExpanded) { this.bottomConsoleExpanded = true; this.rawResize(); this.cmd.consoleEmbeddedResize$.next(); } return; } if (this.bottomConsoleExpanded) { this.bottomConsoleExpanded = false; this.rawResize(); this.cmd.consoleEmbeddedResize$.next(); } } // --- ResizeObserver for tree controls --- private async watchResizeObserver(): Promise { if (this.observedElement) { this.resizeObserver.unobserve(this.observedElement); } if (!p3xr.state?.connection) return; if (this.isXs) { this.rawResize(); return; } let elem: HTMLElement | null = null; while (elem === null) { elem = document.getElementById('p3xr-database-treecontrol-controls-container'); if (!elem) { await new Promise(resolve => setTimeout(resolve)); } } this.observedElement = elem; this.resizeObserver.observe(this.observedElement); } // --- State sync --- private syncFromGlobal(): void { this.hasConnection = p3xr?.state?.connection !== undefined; this.hasConnections = (p3xr?.state?.connections?.list?.length ?? 0) > 0; } } src/ng/pages/database/key/000077500000000000000000000000001517666434100157215ustar00rootroot00000000000000src/ng/pages/database/key/key-hash.component.html000066400000000000000000000036701517666434100223270ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.hashkey || 'Hash Key' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.key) {
{{ item.key }} {{ item.value }} @if (!isReadonly) { delete } table_chart content_copy @if (hasProOrEnterprise) { download } @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-hash.component.ts000066400000000000000000000105251517666434100220060ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { MainCommandService } from '../../../services/main-command.service'; import { KeyTypeBase } from './key-type-base'; import { KeyPaging } from './key-paging'; import { KeyPagerInlineComponent } from './key-pager-inline.component'; declare const p3xr: any; @Component({ selector: 'p3xr-key-hash', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-hash.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyHashComponent extends KeyTypeBase implements OnInit, OnChanges { paging = new KeyPaging(); pagedItems: Array<{ key: string; value: any }> = []; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void { this.updatePaging(); } ngOnChanges(changes: SimpleChanges): void { if (changes['p3xrValue']) this.updatePaging(); } updatePaging(): void { if (!this.p3xrValue) return; this.paging.figurePaging(Object.keys(this.p3xrValue).length); this.updatePagedItems(); } updatePagedItems(): void { if (!this.p3xrValue) { this.pagedItems = []; return; } const keys = Object.keys(this.p3xrValue); this.pagedItems = keys.slice(this.paging.startIndex, this.paging.endIndex) .map(k => ({ key: k, value: this.p3xrValue[k] })); } async addHash(event: Event): Promise { try { await this.keyNewOrSetDialog.show({ $event: event, type: 'append', model: { type: 'hash', key: this.p3xrKey } }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async deleteHashKey(hashKey: string, event: Event): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.deleteHashKey }); await this.socket.request({ action: 'key-hash-delete-field', payload: { key: this.p3xrKey, hashKey } }); this.common.toast(this.i18n.strings().status?.deletedHashKey); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async editValue(hashKey: string, value: any, event: Event): Promise { try { const editValue = typeof value === 'string' && value.length >= this.maxValueAsBuffer ? this.p3xrValueBuffer[hashKey] : value; await this.keyNewOrSetDialog.show({ $event: event, type: 'edit', model: { type: 'hash', key: this.p3xrKey, hashKey, value: editValue }, }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } copyItem(value: any): void { this.copy(value); } showJsonItem(value: any, event: Event): void { this.showJson(value, event); } downloadItem(hashKey: string): void { this.downloadBuffer(this.p3xrValueBuffer[hashKey], `${this.p3xrKey}-${hashKey}.bin`); } } src/ng/pages/database/key/key-json.component.html000066400000000000000000000076101517666434100223530ustar00rootroot00000000000000
@if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (!isReadonly && hasProOrEnterprise) { @if (isGtSm) { } @else { } }
@if (jsonObj !== undefined) { } @else {
{{ truncateDisplay(p3xrValue) }}
}
src/ng/pages/database/key/key-json.component.ts000066400000000000000000000106731517666434100220400ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, OnChanges, SimpleChanges, ChangeDetectorRef, ViewChild, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { MainCommandService } from '../../../services/main-command.service'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { JsonEditorDialogService } from '../../../dialogs/json-editor-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { JsonTreeComponent } from '../../../components/json-tree.component'; import { KeyTypeBase } from './key-type-base'; declare const p3xr: any; @Component({ selector: 'p3xr-key-json', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, JsonTreeComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-json.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyJsonComponent extends KeyTypeBase implements OnInit, OnDestroy, OnChanges { @ViewChild(JsonTreeComponent) jsonTree?: JsonTreeComponent; jsonObj: any; treeExpanded: boolean | 'recursive' = true; treeWrap = true; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(JsonEditorDialogService) private jsonEditorDialog: JsonEditorDialogService, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void { this.parseJson(); } ngOnChanges(changes: SimpleChanges): void { if (changes['p3xrValue']) { this.parseJson(); } } ngOnDestroy(): void { this.destroyBase(); } private parseJson(): void { try { this.jsonObj = JSON.parse(this.p3xrValue); } catch { this.jsonObj = undefined; } } expandAll(): void { this.jsonTree?.treeControl.expandAll(); } collapseAll(): void { this.jsonTree?.treeControl.collapseAll(); // Keep root expanded const root = this.jsonTree?.treeControl.dataNodes?.[0]; if (root) { this.jsonTree!.treeControl.expand(root); } } toggleWrap(): void { this.treeWrap = !this.treeWrap; } async copyValue(): Promise { await this.copy(this.p3xrValue); } async jsonEditor(): Promise { try { const result = await this.jsonEditorDialog.show({ value: this.p3xrValue, hideFormatSave: true }); const value = typeof result.obj === 'string' ? result.obj : JSON.stringify(result.obj); p3xr.ui.overlay.show(); await this.socket.request({ action: 'key-json-set', payload: { key: this.p3xrKey, path: '$', value: value, }, }); this.gtag('/key-json-set'); this.common.toast(this.strings?.status?.set || 'Saved'); this.refreshKey(); } catch (e) { if (e) { this.common.generalHandleError(e); } } finally { p3xr.ui.overlay.hide(); } } downloadJsonFile(): void { const blob = new Blob([this.p3xrValue], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${this.p3xrKey}.json`; a.click(); URL.revokeObjectURL(url); } } src/ng/pages/database/key/key-list.component.html000066400000000000000000000035331517666434100223550ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.index || 'Index' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ item.index }} {{ item.value }} @if (!isReadonly) { delete } table_chart content_copy @if (hasProOrEnterprise) { download } @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-list.component.ts000066400000000000000000000103521517666434100220340ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { MainCommandService } from '../../../services/main-command.service'; import { KeyTypeBase } from './key-type-base'; import { KeyPaging } from './key-paging'; import { KeyPagerInlineComponent } from './key-pager-inline.component'; declare const p3xr: any; @Component({ selector: 'p3xr-key-list', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-list.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyListComponent extends KeyTypeBase implements OnInit, OnChanges { paging = new KeyPaging(); pagedItems: Array<{ index: number; value: any }> = []; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void { this.updatePaging(); } ngOnChanges(c: SimpleChanges): void { if (c['p3xrValue']) this.updatePaging(); } updatePaging(): void { if (!this.p3xrValue) return; this.paging.figurePaging(this.p3xrValue.length); this.updatePagedItems(); } updatePagedItems(): void { if (!this.p3xrValue) { this.pagedItems = []; return; } this.pagedItems = this.p3xrValue.slice(this.paging.startIndex, this.paging.endIndex) .map((v: any, i: number) => ({ index: this.paging.startIndex + i, value: v })); } async appendValue(event: Event): Promise { try { await this.keyNewOrSetDialog.show({ $event: event, type: 'append', model: { type: 'list', key: this.p3xrKey } }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async deleteListElement(index: number, event: Event): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.deleteListElement }); await this.socket.request({ action: 'key-list-delete-index', payload: { key: this.p3xrKey, index } }); this.common.toast(this.i18n.strings().status?.deletedListElement); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async editValue(index: number, value: any, event: Event): Promise { try { const editValue = typeof value === 'string' && value.length >= this.maxValueAsBuffer ? this.p3xrValueBuffer[index] : value; await this.keyNewOrSetDialog.show({ $event: event, type: 'edit', model: { type: 'list', key: this.p3xrKey, index, value: editValue }, }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } copyItem(value: any): void { this.copy(value); } showJsonItem(value: any, event: Event): void { this.showJson(value, event); } downloadItem(index: number): void { this.downloadBuffer(this.p3xrValueBuffer[index]); } } src/ng/pages/database/key/key-pager-inline.component.ts000066400000000000000000000074211517666434100234360ustar00rootroot00000000000000import { Component, Inject, Input, Output, EventEmitter } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatTooltipModule } from '@angular/material/tooltip'; import { P3xrInputComponent } from '../../../components/p3xr-input.component'; import { I18nService } from '../../../services/i18n.service'; import { KeyPaging } from './key-paging'; @Component({ selector: 'p3xr-key-pager-inline', standalone: true, imports: [CommonModule, FormsModule, MatTooltipModule, P3xrInputComponent], template: ` @if (paging.pages > 1) {
/ {{ paging.pages }}
} `, styles: [` .p3xr-key-pager-inline { display: flex; align-items: center; justify-content: center; padding: 4px 0; } .p3xr-key-pager-btn { background: none; border: none; color: var(--p3xr-input-border-color, var(--p3xr-border-color)); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; height: 28px; width: 28px; margin: 0; padding: 0; } .p3xr-key-pager-btn:focus { outline: none; } .p3xr-key-pager-btn .material-icons { font-size: 24px; } :host ::ng-deep p3xr-ng-input.p3xr-key-pager-input { vertical-align: middle !important; width: 64px; margin: 0 4px; } .p3xr-key-pager-text { margin: 0 4px; color: var(--p3xr-input-color, inherit); } `], }) export class KeyPagerInlineComponent { @Input() paging!: KeyPaging; @Output() pageChanged = new EventEmitter(); constructor(@Inject(I18nService) private i18n: I18nService) {} get strings() { return this.i18n.strings(); } onPageChange(value: any): void { this.paging.page = value; this.paging.pageChange(); this.pageChanged.emit(); } } src/ng/pages/database/key/key-paging.ts000066400000000000000000000024621517666434100203300ustar00rootroot00000000000000/** * Shared pagination logic for key type renderers. * Replaces AngularJS p3xrKeyPaging factory. */ declare const p3xr: any; export class KeyPaging { page = 1; pages = 1; private zsetMode: boolean; constructor(options?: { zsetMode?: boolean }) { this.zsetMode = options?.zsetMode ?? false; } figurePaging(valueLength: number): void { const pageCount = p3xr?.settings?.keyPageCount ?? 50; const itemCount = this.zsetMode ? Math.ceil(valueLength / 2) : valueLength; this.pages = Math.max(Math.ceil(itemCount / pageCount), 1); this.page = 1; } get pageCount(): number { return p3xr?.settings?.keyPageCount ?? 50; } get startIndex(): number { return this.pageCount * (this.page - 1); } get endIndex(): number { return this.startIndex + this.pageCount; } pager(action: string): void { switch (action) { case 'first': this.page = 1; break; case 'prev': if (this.page > 1) this.page--; break; case 'next': if (this.page < this.pages) this.page++; break; case 'last': this.page = this.pages; break; } } pageChange(): void { if (this.page < 1) this.page = 1; if (this.page > this.pages) this.page = this.pages; } } src/ng/pages/database/key/key-set.component.html000066400000000000000000000031431517666434100221720ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ item.value }} @if (!isReadonly) { delete } table_chart content_copy @if (hasProOrEnterprise) { download } @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-set.component.ts000066400000000000000000000103601517666434100216530ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { MainCommandService } from '../../../services/main-command.service'; import { KeyTypeBase } from './key-type-base'; import { KeyPaging } from './key-paging'; import { KeyPagerInlineComponent } from './key-pager-inline.component'; declare const p3xr: any; @Component({ selector: 'p3xr-key-set', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-set.component.html', encapsulation: ViewEncapsulation.None, }) export class KeySetComponent extends KeyTypeBase implements OnInit, OnChanges { paging = new KeyPaging(); pagedItems: Array<{ index: number; value: any }> = []; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void { this.updatePaging(); } ngOnChanges(c: SimpleChanges): void { if (c['p3xrValue']) this.updatePaging(); } updatePaging(): void { if (!this.p3xrValue) return; this.paging.figurePaging(this.p3xrValue.length); this.updatePagedItems(); } updatePagedItems(): void { if (!this.p3xrValue) { this.pagedItems = []; return; } this.pagedItems = this.p3xrValue.slice(this.paging.startIndex, this.paging.endIndex) .map((v: any, i: number) => ({ index: this.paging.startIndex + i, value: v })); } async addSet(event: Event): Promise { try { await this.keyNewOrSetDialog.show({ $event: event, type: 'append', model: { type: 'set', key: this.p3xrKey } }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async deleteSetMember(index: number, event: Event): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.deleteSetMember }); await this.socket.request({ action: 'key-set-delete-member', payload: { key: this.p3xrKey, value: this.p3xrValueBuffer[index] } }); this.common.toast(this.i18n.strings().status?.deletedSetMember); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async editValue(index: number, value: any, event: Event): Promise { try { const editValue = typeof value === 'string' && value.length >= this.maxValueAsBuffer ? this.p3xrValueBuffer[index] : value; await this.keyNewOrSetDialog.show({ $event: event, type: 'edit', model: { type: 'set', key: this.p3xrKey, value: editValue }, }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } copyItem(value: any): void { this.copy(value); } showJsonItem(value: any, event: Event): void { this.showJson(value, event); } downloadItem(index: number): void { this.downloadBuffer(this.p3xrValueBuffer[index]); } } src/ng/pages/database/key/key-stream.component.html000066400000000000000000000037461517666434100227030ustar00rootroot00000000000000
{{ strings?.page?.key?.stream?.table?.timestamp || 'Timestamp ID' }} @if (!isReadonly) { }
@for (entry of pagedEntries; track entry.id) {
{{ entry.id }} {{ showTimestamp(entry.id) }} content_copy table_chart @if (!isReadonly) { delete }
}
src/ng/pages/database/key/key-stream.component.ts000066400000000000000000000203521517666434100223550ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation, effect } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { MainCommandService } from '../../../services/main-command.service'; import { KeyTypeBase } from './key-type-base'; import { KeyPaging } from './key-paging'; import { KeyPagerInlineComponent } from './key-pager-inline.component'; import { JsonTreeComponent } from '../../../components/json-tree.component'; declare const p3xr: any; const dayjs = require('dayjs'); @Component({ selector: 'p3xr-key-stream', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent, JsonTreeComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-stream.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyStreamComponent extends KeyTypeBase implements OnInit, OnChanges { paging = new KeyPaging(); pagedEntries: Array<{ id: string; fields: Array<[string, string]>; data: any; displayData: any; hasDuplicateFields: boolean }> = []; private allEntries: Array<{ id: string; fields: Array<[string, string]>; data: any; displayData: any; hasDuplicateFields: boolean }> = []; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); effect(() => { this.i18n.strings(); if (this.allEntries.length === 0) { return; } this.allEntries = this.allEntries.map((entry) => ({ ...entry, displayData: this.toDisplayData(entry.data, entry.hasDuplicateFields), })); this.updatePagedItems(); this.cdr.markForCheck(); }); } ngOnInit(): void { this.updatePaging(); } ngOnChanges(c: SimpleChanges): void { if (c['p3xrValue']) this.updatePaging(); } updatePaging(): void { if (!this.p3xrValue) return; this.allEntries = this.p3xrValue.map((entry: any) => { const id = entry[0]; const rawData = entry[1]; const fields: Array<[string, string]> = []; for (let i = 0; i < rawData.length; i += 2) { fields.push([rawData[i], rawData[i + 1]]); } const hasDuplicateFields = this.hasDuplicateFields(fields); const data = hasDuplicateFields ? this.fieldsToArray(fields) : this.fieldsToObject(fields); return { id, fields, data, displayData: this.toDisplayData(data, hasDuplicateFields), hasDuplicateFields, }; }); this.paging.figurePaging(this.allEntries.length); this.updatePagedItems(); } updatePagedItems(): void { this.pagedEntries = this.allEntries.slice(this.paging.startIndex, this.paging.endIndex); } showTimestamp(id: string): string { try { const ms = parseInt(id.slice(0, id.indexOf('-'))); const localeMap = p3xr?.settings?.language?.momentDateMap || {}; const lang = p3xr?.settings?.language?.current || 'en'; return dayjs(new Date(ms)).locale(localeMap[lang] || lang).format('L LTS'); } catch { return id; } } isJsonValue(value: string): boolean { if (!value || value.length < 2) return false; const first = value.charAt(0); if (first !== '{' && first !== '[') return false; try { JSON.parse(value); return true; } catch { return false; } } formatJsonValue(value: string): string { try { return JSON.stringify(JSON.parse(value), null, p3xr?.settings?.jsonFormat ?? 2); } catch { return value; } } private parseFieldValue(value: string): any { try { return JSON.parse(value); } catch { return value; } } private hasDuplicateFields(fields: Array<[string, string]>): boolean { const seen = new Set(); for (const [key] of fields) { if (seen.has(key)) { return true; } seen.add(key); } return false; } private fieldsToObject(fields: Array<[string, string]>): any { const obj: any = {}; for (const [key, value] of fields) { obj[key] = this.parseFieldValue(value); } return obj; } private fieldsToArray(fields: Array<[string, string]>): Array<{ field: string; value: any }> { return fields.map(([field, value]) => ({ field, value: this.parseFieldValue(value), })); } private toDisplayData(data: any, hasDuplicateFields: boolean): any { if (!hasDuplicateFields) { return data; } const fieldLabel = this.strings?.page?.key?.stream?.table?.field || 'Field'; const valueLabel = this.strings?.page?.key?.stream?.table?.value || 'Value'; return data.map((item: { field: string; value: any }) => ({ [fieldLabel]: item.field, [valueLabel]: item.value, })); } private entryToExport(entry: { id: string; fields: Array<[string, string]>; data: any; displayData: any; hasDuplicateFields: boolean }): any { if (entry.hasDuplicateFields) { return { id: entry.id, fields: entry.data, }; } return { id: entry.id, ...entry.data }; } async copyEntry(entry: { id: string; fields: Array<[string, string]>; data: any; displayData: any; hasDuplicateFields: boolean }): Promise { const obj = this.entryToExport(entry); await this.copy(JSON.stringify(obj, null, 2)); } async viewEntryJson(entry: { id: string; fields: Array<[string, string]>; data: any; displayData: any; hasDuplicateFields: boolean }, event?: Event): Promise { const obj = this.entryToExport(entry); await this.showJson(JSON.stringify(obj), event); } async viewFieldJson(value: string, event?: Event): Promise { await this.showJson(value, event); } copyField(value: any): void { this.copy(value); } async addStream(event: Event): Promise { try { await this.keyNewOrSetDialog.show({ $event: event, type: 'append', model: { type: 'stream', key: this.p3xrKey } }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async deleteStreamTimestamp(id: string, event: Event): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.deleteStreamTimestamp }); await this.socket.request({ action: 'key-stream-delete-timestamp', payload: { key: this.p3xrKey, streamTimestamp: id } }); this.common.toast(this.i18n.strings().status?.deletedStreamTimestamp || this.i18n.strings().status?.deletedKey || 'Deleted'); this.refreshKey(); } catch (e) { if (e) this.common.generalHandleError(e); } } } src/ng/pages/database/key/key-string.component.html000066400000000000000000000175611517666434100227160ustar00rootroot00000000000000 @if (!editable) {
@if (!isReadonly && hasProOrEnterprise) { @if (isGtSm) { } @else { } } @if (hasProOrEnterprise) { @if (isGtSm) { } @else { } } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (!isReadonly) { @if (isGtSm) { } @else { } } @if (hasProOrEnterprise) { @if (isGtSm) { } @else { } } @if (!isReadonly) { @if (isGtSm) { } @else { } }
} @if (editable) {
@if (!isReadonly) { {{ strings?.label?.validateJson || 'Validate JSON' }} } @if (isGtSm) { } @else { } @if (!isReadonly && hasProOrEnterprise) { @if (isGtSm) { } @else { } } @if (!isReadonly) { @if (isGtSm) { } @else { } }
}
@if (editable) { @if (p3xrValue && p3xrValue.toString() === '[object ArrayBuffer]') {
{{ strings?.label?.isBuffer?.({ maxValueAsBuffer: prettyBytes(maxValueAsBuffer) }) }} {{ bufferDisplay() }}
} @if (buffer) {
{{ strings?.label?.isBuffer?.({ maxValueAsBuffer: prettyBytes(maxValueAsBuffer) }) }} {{ bufferDisplay() }}
} @else { }
} @else {
{{ truncateDisplay(p3xrValue) }}
}
src/ng/pages/database/key/key-string.component.ts000066400000000000000000000160641517666434100223750ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { TextFieldModule } from '@angular/cdk/text-field'; import { BreakpointObserver } from '@angular/cdk/layout'; import { MainCommandService } from '../../../services/main-command.service'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { JsonEditorDialogService } from '../../../dialogs/json-editor-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { KeyTypeBase } from './key-type-base'; declare const p3xr: any; @Component({ selector: 'p3xr-key-string', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, MatSlideToggleModule, MatInputModule, MatFormFieldModule, TextFieldModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-string.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyStringComponent extends KeyTypeBase implements OnInit { editable = false; buffer = false; validateJson = false; originalValue: any; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(JsonEditorDialogService) private jsonEditorDialog: JsonEditorDialogService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void {} edit(): void { const value = this.p3xrValue; if (typeof value === 'string' && value.length >= this.maxValueAsBuffer) { this.buffer = true; this.originalValue = p3xr?.clone?.(this.p3xrValueBuffer) ?? this.p3xrValueBuffer; } else { this.buffer = false; this.originalValue = p3xr?.clone?.(this.p3xrValue) ?? this.p3xrValue; } this.editable = true; } cancelEdit(): void { if (this.buffer) { this.p3xrValueBuffer = this.originalValue; } else { this.p3xrValue = this.originalValue; } this.editable = false; this.buffer = false; } async save(): Promise { const valueToSave = this.buffer ? this.p3xrValueBuffer : this.p3xrValue; try { if (this.validateJson) { JSON.parse(valueToSave); } p3xr.ui.overlay.show({ message: this.strings?.intention?.save ?? 'Saving...' }); await this.socket.request({ action: 'key-set', payload: { type: this.p3xrResponse?.type, key: this.p3xrKey, value: valueToSave, }, }); this.gtag('/key-set'); this.editable = false; this.buffer = false; this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } finally { p3xr.ui.overlay.hide(); } } async setBufferUpload(): Promise { const input = document.createElement('input'); input.type = 'file'; input.onchange = async () => { const file = input.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onerror = (error) => { this.common.generalHandleError(error); }; reader.onload = async (loadEvent: any) => { const arrayBuffer = loadEvent.target.result; try { if (this.editable) { await this.common.confirm({ message: this.i18n.strings().confirm?.uploadBuffer }); if (this.buffer) { this.p3xrValueBuffer = arrayBuffer; } else { this.p3xrValue = arrayBuffer; } this.common.toast(this.i18n.strings().confirm?.uploadBufferDone); return; } await this.common.confirm({ message: this.i18n.strings().confirm?.uploadBuffer }); p3xr.ui.overlay.show(); await this.socket.request({ action: 'key-set', payload: { type: this.p3xrResponse?.type, value: arrayBuffer, key: this.p3xrKey, }, }); this.common.toast(this.i18n.strings().confirm?.uploadBufferDoneAndSave); this.gtag('/key-set'); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } finally { p3xr.ui.overlay.hide(); } }; reader.readAsArrayBuffer(file); }; input.click(); } async jsonViewer(event?: Event): Promise { await this.showJson(this.p3xrValue, event); } async jsonEditor(): Promise { try { const result = await this.jsonEditorDialog.show({ value: this.p3xrValue }); this.p3xrValue = result.obj; await this.save(); } catch { /* cancelled */ } } async formatJson(): Promise { try { this.p3xrValue = JSON.stringify(JSON.parse(this.p3xrValue), null, p3xr?.settings?.jsonFormat ?? 2); await this.save(); } catch { this.common.toast(this.strings?.label?.jsonViewNotParsable ?? 'Not valid JSON'); } } copyValue(): void { this.copy(this.p3xrValue); } downloadBufferFile(): void { this.downloadBuffer(this.p3xrValueBuffer); } bufferDisplay(): string { if (this.p3xrValueBuffer?.byteLength !== undefined) { return '(' + this.prettyBytes(this.p3xrValueBuffer.byteLength) + ')'; } return ''; } } src/ng/pages/database/key/key-type-base.ts000066400000000000000000000077561517666434100207670ustar00rootroot00000000000000import { Input, Directive, ChangeDetectorRef } from '@angular/core'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { MainCommandService } from '../../../services/main-command.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; declare const p3xr: any; /** * Shared base for all key type renderers. * Provides common inputs, dialog calls, clipboard, download, event broadcasting, * and responsive breakpoint (isGtSm for button text visibility). */ @Directive() export abstract class KeyTypeBase { @Input() p3xrResponse: any; @Input() p3xrValue: any; @Input() p3xrValueBuffer: any; @Input() p3xrKey: string = ''; /** >960px — show button text labels (matching AngularJS hide-xs hide-sm) */ isGtSm = window.innerWidth >= 960; protected readonly unsubFns: Array<() => void> = []; constructor( protected readonly i18n: I18nService, protected readonly socket: SocketService, protected readonly common: CommonService, protected readonly jsonViewDialog: JsonViewDialogService, protected readonly keyNewOrSetDialog: KeyNewOrSetDialogService, protected readonly breakpointObserver: BreakpointObserver, protected readonly cmd: MainCommandService, protected readonly cdr: ChangeDetectorRef, ) { const sub = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isGtSm = r.matches; this.cdr.markForCheck(); }); this.unsubFns.push(() => sub.unsubscribe()); } destroyBase(): void { this.unsubFns.forEach(fn => fn()); } get strings() { return this.i18n.strings(); } get isReadonly(): boolean { return p3xr?.state?.connection?.readonly === true; } get hasProOrEnterprise(): boolean { return p3xr?.state?.hasProOrEnterpriseJsonBinary === true; } get maxValueDisplay(): number { return p3xr?.settings?.maxValueDisplay ?? 1024; } get maxValueAsBuffer(): number { return p3xr?.settings?.maxValueAsBuffer ?? 1024; } async copy(value: any): Promise { await p3xr.clipboard({ value }); this.common.toast(this.strings?.status?.dataCopied || 'Copied'); } downloadBuffer(buffer: any, filename?: string): void { const blob = new Blob([buffer]); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename || `${this.p3xrKey}.bin`; a.click(); URL.revokeObjectURL(url); } async showJson(value: any, event?: Event): Promise { try { await this.jsonViewDialog.show({ value, $event: event }); } catch { /* cancelled */ } } protected refreshKey(): void { this.cmd.refreshKey$.next(); } protected gtag(page: string): void { try { if (typeof (window as any).gtag === 'function') { (window as any).gtag('config', p3xr?.settings?.googleAnalytics, { page_path: page }); } } catch { /* noop */ } } protected truncateDisplay(value: any): string { if (value == null) return ''; const str = String(value); // maxValueDisplay: -1 or 0 means show all, >0 means truncate at that length if (this.maxValueDisplay > 0 && str.length > this.maxValueDisplay) { return str.substring(0, this.maxValueDisplay) + '...'; } return str; } protected isBufferValue(value: any): boolean { return typeof value === 'object' && value !== null && value.byteLength !== undefined; } protected prettyBytes(length: number): string { return p3xr?.settings?.prettyBytes?.(length) ?? `${length} bytes`; } } src/ng/pages/database/key/key-types.scss000066400000000000000000000073211517666434100205530ustar00rootroot00000000000000// Shared styles for all key type renderers .p3xr-key-type-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; padding: 4px 8px; } .p3xr-key-type-content { padding: 8px 16px 24px; } .p3xr-key-type-textarea { width: 100%; font-family: monospace; font-size: 13px; background: var(--p3xr-input-bg); color: var(--p3xr-input-color); border: 1px solid var(--p3xr-fieldset-border); border-radius: 4px; padding: 8px; resize: vertical; } .p3xr-key-type-value { white-space: pre-wrap; word-break: break-all; padding: 8px; margin: 0; font-size: 13px; } .p3xr-key-type-display { padding: 8px; } // Full-width mat-form-field editor matching AngularJS md-input-container md-block .p3xr-key-type-editor { width: 100%; textarea { font-family: 'Roboto Mono', monospace; font-size: 13px; } } .p3xr-key-type-buffer-info { padding: 8px; opacity: 0.7; font-style: italic; } // Table layout for hash/list/set/zset/stream .p3xr-key-type-table { width: 100%; } .p3xr-key-type-header { display: flex; align-items: center; gap: 8px; padding: 8px 16px; font-weight: bold; // Themed header background matching AngularJS md-colors="{ background: 'primary-300' }" background-color: var(--p3xr-btn-primary-bg); color: var(--p3xr-btn-primary-color); border-bottom: 2px solid var(--p3xr-list-border); // Header icon button should contrast against the primary background .mat-mdc-icon-button { color: var(--p3xr-btn-primary-color) !important; } } .p3xr-key-type-row { display: flex; align-items: flex-start; gap: 8px; padding: 6px 16px; border-bottom: 1px solid var(--p3xr-list-border); &:hover { background-color: var(--p3xr-hover-bg); } // Odd row alternating background &:nth-child(odd) { background-color: var(--p3xr-list-odd-bg); &:hover { background-color: var(--p3xr-hover-bg); } } // Key column: single-line truncated .p3xr-key-col { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; user-select: text; } // Value column: multiline with scroll, matching AngularJS overflow:auto + max-height:200px .p3xr-value-col { overflow: auto; max-height: 200px; white-space: pre-wrap; word-break: break-all; user-select: text; } } .p3xr-key-type-row-actions { white-space: nowrap !important; mat-icon { cursor: pointer; font-size: 18px; width: 18px; height: 18px; margin: 0 2px; opacity: 0.7; &:hover { opacity: 1; } } // Themed icon colors matching AngularJS md-warn, md-accent, md-primary .icon-warn { color: var(--p3xr-btn-warn-bg); } .icon-accent { color: var(--p3xr-btn-accent-bg); } .icon-primary { color: var(--p3xr-btn-primary-bg); } } // Stream entry block layout .p3xr-key-stream-entry-block { border-bottom: 1px solid var(--p3xr-list-border); &:nth-child(odd) { background-color: var(--p3xr-list-odd-bg); } &:hover { background-color: var(--p3xr-hover-bg); } } .p3xr-key-stream-entry-header { display: flex; align-items: center; justify-content: space-between; padding: 6px 16px; font-size: 13px; } .p3xr-key-stream-timestamp { display: flex; align-items: center; gap: 12px; } .p3xr-key-stream-timestamp-human { opacity: 0.5; font-size: 12px; } .p3xr-key-stream-data { padding: 0 16px 8px 16px; overflow: auto; max-height: 300px; } src/ng/pages/database/key/key-zset.component.html000066400000000000000000000034271517666434100223710ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.score || 'Score' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ item.score }} {{ item.member }} @if (!isReadonly) { delete } table_chart content_copy @if (hasProOrEnterprise) { download } @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-zset.component.ts000066400000000000000000000111061517666434100220440ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; import { I18nService } from '../../../services/i18n.service'; import { SocketService } from '../../../services/socket.service'; import { CommonService } from '../../../services/common.service'; import { JsonViewDialogService } from '../../../dialogs/json-view-dialog.service'; import { KeyNewOrSetDialogService } from '../../../dialogs/key-new-or-set-dialog.service'; import { MainCommandService } from '../../../services/main-command.service'; import { KeyTypeBase } from './key-type-base'; import { KeyPaging } from './key-paging'; import { KeyPagerInlineComponent } from './key-pager-inline.component'; declare const p3xr: any; @Component({ selector: 'p3xr-key-zset', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-zset.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyZsetComponent extends KeyTypeBase implements OnInit, OnChanges { paging = new KeyPaging({ zsetMode: true }); pagedItems: Array<{ score: string; member: string; index: number }> = []; constructor( @Inject(I18nService) i18n: I18nService, @Inject(SocketService) socket: SocketService, @Inject(CommonService) common: CommonService, @Inject(JsonViewDialogService) jsonViewDialog: JsonViewDialogService, @Inject(KeyNewOrSetDialogService) keyNewOrSetDialog: KeyNewOrSetDialogService, @Inject(BreakpointObserver) breakpointObserver: BreakpointObserver, @Inject(MainCommandService) cmd: MainCommandService, @Inject(ChangeDetectorRef) cdr: ChangeDetectorRef, ) { super(i18n, socket, common, jsonViewDialog, keyNewOrSetDialog, breakpointObserver, cmd, cdr); } ngOnInit(): void { this.updatePaging(); } ngOnChanges(c: SimpleChanges): void { if (c['p3xrValue']) this.updatePaging(); } updatePaging(): void { if (!this.p3xrValue) return; this.paging.figurePaging(this.p3xrValue.length); this.updatePagedItems(); } updatePagedItems(): void { if (!this.p3xrValue) { this.pagedItems = []; return; } // Zset flat array: [member, score, member, score, ...] const items: Array<{ score: string; member: string; index: number }> = []; for (let i = 0; i < this.p3xrValue.length; i += 2) { items.push({ member: this.p3xrValue[i], score: this.p3xrValue[i + 1], index: i / 2 }); } this.pagedItems = items.slice(this.paging.startIndex, this.paging.endIndex); } async addZSet(event: Event): Promise { try { await this.keyNewOrSetDialog.show({ $event: event, type: 'append', model: { type: 'zset', key: this.p3xrKey } }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async deleteZSet(item: any, event: Event): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.deleteZSetMember }); await this.socket.request({ action: 'key-zset-delete-member', payload: { key: this.p3xrKey, value: this.p3xrValueBuffer[item.index * 2] }, }); this.common.toast(this.i18n.strings().status?.deletedZSetMember); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } async editValue(item: any, event: Event): Promise { try { const editValue = typeof item.member === 'string' && item.member.length >= this.maxValueAsBuffer ? this.p3xrValueBuffer[item.index * 2] : item.member; await this.keyNewOrSetDialog.show({ $event: event, type: 'edit', model: { type: 'zset', key: this.p3xrKey, value: editValue, score: item.score }, }); this.refreshKey(); } catch (e) { this.common.generalHandleError(e); } } copyItem(value: any): void { this.copy(value); } showJsonItem(value: any, event: Event): void { this.showJson(value, event); } downloadItem(index: number): void { this.downloadBuffer(this.p3xrValueBuffer[index * 2]); } } src/ng/pages/database/statistics.component.html000066400000000000000000000030421517666434100222110ustar00rootroot00000000000000 @if (hasDatabases && !isCluster) { @for (dbEntry of keyspaceDatabaseEntries; track dbEntry.key) {
@for (item of getKeyspaceItems(dbEntry.key); track item.key) {
{{ generateKey(item.key) }} {{ item.value }}
}
}
} @for (section of infoSections; track section.key) {
@for (item of section.items; track item.key) {
{{ generateKey(item.key) }} {{ formatValue(item.value) }}
}
}
src/ng/pages/database/statistics.component.scss000066400000000000000000000035131517666434100222230ustar00rootroot00000000000000// Sticky tab headers — stay visible when scrolling content. // The scroll container is #p3xr-database-content-container (position:fixed, overflow:auto). // sticky works relative to the nearest scrolling ancestor. p3xr-ng-main-statistics > :first-child > .mat-mdc-tab-header, p3xr-database-statistics > :first-child > .mat-mdc-tab-header { position: sticky !important; top: 0 !important; z-index: 2 !important; background-color: var(--p3xr-content-bg, #303030) !important; } .p3xr-statistics-list { padding: 8px 16px; } .p3xr-statistics-item { display: flex; align-items: baseline; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid rgba(0, 0, 0, 0.06); span { text-align: right; } } // Dark theme: lighter border body.p3xr-theme-dark .p3xr-statistics-item { border-bottom-color: rgba(255, 255, 255, 0.06); } // DB sub-tabs: primary background matching AngularJS md-tabs.md-primary // Uses the main theme's primary palette (--p3xr-btn-primary-bg) .p3xr-statistics-db-tabs .mat-mdc-tab-header { background-color: var(--p3xr-btn-primary-bg) !important; } .p3xr-statistics-db-tabs .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label { color: rgba(255, 255, 255, 0.7) !important; } .p3xr-statistics-db-tabs .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label { color: white !important; } .p3xr-statistics-db-tabs .mat-mdc-tab-header .mdc-tab-indicator__content--underline { border-color: white !important; } // Matrix: black text on bright green tab background body.p3xr-mat-theme-matrix .p3xr-statistics-db-tabs .mat-mdc-tab .mdc-tab__text-label { color: rgba(0, 0, 0, 0.87) !important; } body.p3xr-mat-theme-matrix .p3xr-statistics-db-tabs .mat-mdc-tab-header .mdc-tab-indicator__content--underline { border-color: rgba(0, 0, 0, 0.87) !important; } src/ng/pages/database/statistics.component.ts000066400000000000000000000133101517666434100216720ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation, effect } from '@angular/core'; import { MatTabsModule } from '@angular/material/tabs'; import { BreakpointObserver } from '@angular/cdk/layout'; declare const p3xr: any; import { I18nService } from '../../services/i18n.service'; import { MainCommandService } from '../../services/main-command.service'; require('./statistics.component.scss'); @Component({ selector: 'p3xr-database-statistics', standalone: true, imports: [MatTabsModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './statistics.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class StatisticsComponent implements OnInit, OnDestroy { maxHeight: number | string = 'auto'; hasDatabases = false; isCluster = false; // Parsed from p3xr.state.info (snapshot taken in ngOnInit) keyspaceDatabaseEntries: Array<{ key: string; value: any }> = []; keyspaceItems: Record> = {}; infoSections: Array<{ key: string; items: Array<{ key: string; value: any }> }> = []; private readonly unsubFns: Array<() => void> = []; private static readonly EXCLUDE = ['in', 'run', 'per']; private static readonly INCLUDE = ['sha1']; private static readonly REPLACE: Record = { perc: 'percent', sec: 'seconds' }; constructor( @Inject(BreakpointObserver) private readonly breakpointObserver: BreakpointObserver, @Inject(I18nService) readonly i18n: I18nService, @Inject(MainCommandService) private readonly cmd: MainCommandService, @Inject(ChangeDetectorRef) private readonly cdr: ChangeDetectorRef, ) { effect(() => { this.i18n.currentLang(); this.cdr.markForCheck(); }); } ngOnInit(): void { const state = p3xr?.state; const info = state?.info; // Check if tree needs refresh if (state?.redisChanged) { state.redisChanged = false; this.broadcastRefresh(); } // Parse info data const connection = state?.connection; this.isCluster = connection?.cluster === true; if (info) { const ksDbs = info.keyspaceDatabases ?? {}; this.hasDatabases = Object.keys(ksDbs).length > 0; this.keyspaceDatabaseEntries = Object.keys(ksDbs).map(k => ({ key: k, value: ksDbs[k] })); // Snapshot keyspace items per DB so the template doesn't read live data for (const dbEntry of this.keyspaceDatabaseEntries) { const ks = info?.keyspace?.['db' + dbEntry.key]; this.keyspaceItems[dbEntry.key] = ks ? Object.keys(ks).map(k => ({ key: k, value: ks[k] })) : []; } this.infoSections = Object.keys(info) .filter(k => k !== 'keyspace' && k !== 'keyspaceDatabases') .map(k => ({ key: k, items: Object.keys(info[k]).map(ik => ({ key: ik, value: info[k][ik] })), })); // Replace or add Modules section with full MODULE LIST data const modules = Array.isArray(state?.modules) ? state.modules : []; if (modules.length > 0) { const moduleItems = modules.map((m: any) => ({ key: m.name, value: `v${m.ver}`, })); const existingIdx = this.infoSections.findIndex(s => s.key.toLowerCase() === 'modules'); if (existingIdx >= 0) { this.infoSections[existingIdx].items = moduleItems; } else { this.infoSections.push({ key: 'modules', items: moduleItems }); } } } // Responsive height const sub = this.breakpointObserver.observe('(max-width: 599px)').subscribe(r => { this.recalcHeight(r.matches); this.cdr.markForCheck(); }); this.unsubFns.push(() => sub.unsubscribe()); } ngOnDestroy(): void { this.unsubFns.forEach(fn => fn()); } getKeyspaceItems(dbKey: string): Array<{ key: string; value: any }> { return this.keyspaceItems[dbKey] ?? []; } formatValue(value: any): string { if (value === null || value === undefined) return ''; if (typeof value === 'object') return JSON.stringify(value); return String(value); } generateKey(key: string): string { const strings = this.i18n.strings(); if (strings?.title?.hasOwnProperty(key)) { return strings.title[key]; } return key.split('_').map((instance, index) => { if (StatisticsComponent.REPLACE.hasOwnProperty(instance)) { instance = StatisticsComponent.REPLACE[instance]; } if (StatisticsComponent.INCLUDE.includes(instance) || (instance.length < 4 && !StatisticsComponent.EXCLUDE.includes(instance))) { return instance.toUpperCase(); } else if (index === 0) { return instance[0].toUpperCase() + instance.substring(1); } return instance; }).join(' '); } private recalcHeight(isXSmall: boolean): void { if (isXSmall) { this.maxHeight = 'auto'; } else { const container = document.getElementById('p3xr-database-content-container'); this.maxHeight = container ? container.offsetHeight - 50 : 'auto'; } } private broadcastRefresh(): void { this.cmd.treeRefresh$.next(); } } src/ng/pages/info.component.ts000066400000000000000000000167121517666434100167000ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatListModule } from '@angular/material/list'; import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { I18nService } from '../services/i18n.service'; import { ShortcutsService } from '../services/shortcuts.service'; import { SocketService } from '../services/socket.service'; import { P3xrAccordionComponent } from '../components/p3xr-accordion.component'; declare const p3xr: any; @Component({ selector: 'p3xr-info', standalone: true, imports: [ CommonModule, MatListModule, MatDividerModule, MatIconModule, P3xrAccordionComponent, ], template: ` @if (isElectron) {
@for (shortcut of shortcutsList; track shortcut.key) {
{{ shortcut.key }}
{{ shortcut.description }}
}

}
{{ strings().label?.version || 'Version' }}
{{ version }}
@if (isConnected) {
{{ strings().label?.redisVersion || 'Redis Version' }}
{{ redisVersion }}
} @if (isConnected && modules.length > 0) {
{{ strings().label?.modules || 'Modules' }}
{{ modules.join(', ') }}
}
{{ strings().title?.donate || 'Donate' }}
{{ strings().intention?.githubChangelog || 'Changelog' }}

@for (lang of languageList; track lang.code) {
{{ lang.code }}
{{ lang.name }}
}
`, styles: [` :host { display: block; padding-bottom: 64px; } `], }) export class InfoComponent implements OnInit, OnDestroy { strings; isElectron: boolean; shortcutsList: Array<{ key: string; description: string }> = []; get version(): string { return p3xr?.state?.version || p3xr?.pkg?.version || ''; } get isConnected(): boolean { return !!p3xr?.state?.connection; } get redisVersion(): string { return p3xr?.state?.info?.server?.redis_version || '-'; } get modules(): string[] { return (p3xr?.state?.modules || []).map((m: any) => m.name); } get languageList(): Array<{ code: string; name: string }> { const langObj = this.strings()?.language || {}; return Object.keys(langObj) .sort() .map(code => ({ code, name: langObj[code] })); } private unsubs: Array<() => void> = []; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(ShortcutsService) private shortcutsService: ShortcutsService, @Inject(SocketService) private socket: SocketService, ) { this.strings = this.i18n.strings; this.isElectron = this.shortcutsService.isEnabled(); this.shortcutsList = this.shortcutsService.getShortcutsWithDescriptions(); } ngOnInit(): void { const sub = this.socket.redisDisconnected$.subscribe(() => {}); this.unsubs.push(() => sub.unsubscribe()); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); } } src/ng/pages/monitoring/000077500000000000000000000000001517666434100155525ustar00rootroot00000000000000src/ng/pages/monitoring/monitoring.component.html000066400000000000000000000306121517666434100226300ustar00rootroot00000000000000@if (!current) {
hourglass_empty {{ strings().label?.loading || 'Loading...' }}
} @if (current) {
{{ strings().page?.monitor?.memory || 'Memory' }}
{{ current.memory.usedHuman }}
RSS
{{ current.memory.rssHuman }}
Peak
{{ current.memory.peakHuman }}
Fragmentation
{{ current.memory.fragRatio }}x
{{ strings().page?.monitor?.opsPerSec || 'Ops/sec' }}
{{ current.stats.opsPerSec }}
{{ strings().page?.monitor?.totalCommands || 'Total Commands' }}
{{ current.stats.totalCommands }}
{{ strings().page?.monitor?.clients || 'Clients' }}
{{ current.clients.connected }}
{{ strings().page?.monitor?.blocked || 'Blocked' }}
{{ current.clients.blocked }}
{{ strings().page?.monitor?.hitsMisses || 'Hit Rate' }}
{{ current.stats.hitRate }}%
Hits / Misses
{{ current.stats.hits }} / {{ current.stats.misses }}
{{ strings().page?.monitor?.networkIo || 'Network I/O' }}
{{ current.stats.inputKbps | number:'1.1-1' }} / {{ current.stats.outputKbps | number:'1.1-1' }} KB/s
{{ strings().page?.monitor?.expired || 'Expired' }}
{{ current.stats.expiredKeys }}
{{ strings().page?.monitor?.evicted || 'Evicted' }}
{{ current.stats.evictedKeys }}




@if (current.slowlog.length > 0) {
@for (entry of current.slowlog; track entry.id) {
{{ entry.duration }}µs {{ entry.command }}
}
}
@if (!autoRefreshClients) { }
@if (clientList.length === 0 && clientListLoaded) {
{{ strings().page?.monitor?.noClients || 'No clients' }}
} @if (clientList.length === 0 && !clientListLoaded) {
{{ strings().label?.loading || 'Loading...' }}
} @if (clientList.length > 0) { @for (client of clientList; track client.id) {
{{ client.addr }} @if (client.name) { ({{ client.name }}) } db{{ client.db }} · {{ client.cmd }} · {{ client.idle }}s @if (!isReadonly) { close }
}
}

@if (!autoRefreshTopKeys) { }
@if (topKeys.length === 0 && topKeysLoaded) {
{{ strings().page?.monitor?.noKeys || 'No keys' }}
} @if (topKeys.length === 0 && !topKeysLoaded) {
{{ strings().label?.loading || 'Loading...' }}
} @if (topKeys.length > 0) { @for (entry of topKeys; track entry.key; let i = $index) {
#{{ i + 1 }} {{ entry.key }}
{{ formatBytes(entry.bytes) }}
}
}
}
src/ng/pages/monitoring/monitoring.component.scss000066400000000000000000000034771517666434100226500ustar00rootroot00000000000000:host { display: block; padding-bottom: 64px; color: var(--mat-app-text-color, inherit); } .p3xr-monitoring-loading { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 64px; opacity: 0.5; font-size: 18px; } .p3xr-monitoring-server-info { opacity: 0.6; font-size: 12px; white-space: nowrap; } .p3xr-mono { font-family: 'Roboto Mono', monospace; } .p3xr-monitoring-sub { opacity: 0.5; font-size: 12px; margin-left: 8px; } .p3xr-monitoring-chart { width: 100%; min-height: 180px; overflow: hidden; .uplot { font-family: 'Roboto', sans-serif; } .u-legend { font-size: 12px; color: var(--mat-app-text-color, inherit); opacity: 0.8; } .u-legend .u-series td { padding: 1px 4px; } } .p3xr-monitoring-client-row { display: flex; align-items: center; width: 100%; gap: 8px; } .p3xr-monitoring-client-addr { font-size: 13px; font-weight: 700; min-width: 150px; } .p3xr-monitoring-client-name { opacity: 0.5; font-size: 12px; } .p3xr-monitoring-client-info { flex: 1; text-align: right; font-family: 'Roboto Mono', monospace; font-size: 12px; opacity: 0.6; } .p3xr-monitoring-client-kill { cursor: pointer; font-size: 18px !important; width: 18px !important; height: 18px !important; color: var(--p3xr-btn-warn-bg, #f44336); opacity: 0.7; flex-shrink: 0; &:hover { opacity: 1; } } .p3xr-monitoring-slowlog-row { display: flex; align-items: center; gap: 12px; width: 100%; } .p3xr-monitoring-slowlog-cmd { font-family: 'Roboto Mono', monospace; font-size: 13px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } src/ng/pages/monitoring/monitoring.component.ts000066400000000000000000000422071517666434100223150ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, ViewChild, AfterViewInit, NgZone } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatDividerModule } from '@angular/material/divider'; import { MatListModule } from '@angular/material/list'; import dayjs from 'dayjs'; import { I18nService } from '../../services/i18n.service'; import { SocketService } from '../../services/socket.service'; import { CommonService } from '../../services/common.service'; import { P3xrAccordionComponent } from '../../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../../components/p3xr-button.component'; declare const p3xr: any; require('./monitoring.component.scss'); interface MonitorSnapshot { timestamp: number; memory: { used: number; rss: number; peak: number; usedHuman: string; rssHuman: string; peakHuman: string; fragRatio: number }; stats: { opsPerSec: number; hits: number; misses: number; hitRate: number; inputKbps: number; outputKbps: number; totalCommands: number; expiredKeys: number; evictedKeys: number }; clients: { connected: number; blocked: number }; server: { version: string; uptime: number; mode: string }; keyspace: Record; slowlog: Array<{ id: number; timestamp: number; duration: number; command: string }>; } const MAX_HISTORY = 120; @Component({ selector: 'p3xr-monitoring', standalone: true, imports: [ CommonModule, MatIconModule, MatButtonModule, MatTooltipModule, MatDividerModule, MatListModule, P3xrAccordionComponent, P3xrButtonComponent, ], templateUrl: './monitoring.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) export class MonitoringComponent implements OnInit, OnDestroy, AfterViewInit { strings; current: MonitorSnapshot | null = null; history: MonitorSnapshot[] = []; paused = false; clientList: any[] = []; topKeys: any[] = []; isReadonly = false; autoRefreshClients = localStorage.getItem('p3xr-monitor-auto-clients') === 'true'; autoRefreshTopKeys = localStorage.getItem('p3xr-monitor-auto-topkeys') === 'true'; clientListLoaded = false; topKeysLoaded = false; @ViewChild('memoryChart') memoryChartRef!: ElementRef; @ViewChild('opsChart') opsChartRef!: ElementRef; @ViewChild('clientsChart') clientsChartRef!: ElementRef; @ViewChild('networkChart') networkChartRef!: ElementRef; private intervalId: any; private uPlot: any; private memoryPlot: any; private opsPlot: any; private clientsPlot: any; private networkPlot: any; private chartsInitialized = false; private resizeObserver: ResizeObserver | null = null; private themeObserver: MutationObserver | null = null; private unsubFns: Array<() => void> = []; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(SocketService) private socket: SocketService, @Inject(CommonService) private common: CommonService, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, @Inject(NgZone) private ngZone: NgZone, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.isReadonly = p3xr?.state?.connection?.readonly === true; this.fetchData(); this.loadClientList(); this.loadTopKeys(); // Reload all data when connection changes const sub = this.socket.stateChanged$.subscribe(() => { this.isReadonly = p3xr?.state?.connection?.readonly === true; this.history = []; this.chartsInitialized = false; this.memoryPlot?.destroy(); this.opsPlot?.destroy(); this.clientsPlot?.destroy(); this.networkPlot?.destroy(); this.fetchData(); this.loadClientList(); this.loadTopKeys(); }); this.unsubFns.push(() => sub.unsubscribe()); this.ngZone.runOutsideAngular(() => { this.intervalId = setInterval(() => { if (!this.paused) { this.fetchData(); if (this.autoRefreshClients) this.loadClientList(); if (this.autoRefreshTopKeys) this.loadTopKeys(); } }, 2000); // Reinit charts on theme or language change this.themeObserver = new MutationObserver(() => { if (this.chartsInitialized) { setTimeout(() => this.reinitCharts(), 100); } }); this.themeObserver.observe(document.body, { attributes: true, attributeFilter: ['class'] }); // Watch for language changes via i18n signal let prevLang = this.i18n.currentLang(); const langCheckInterval = setInterval(() => { const currentLang = this.i18n.currentLang(); if (currentLang !== prevLang) { prevLang = currentLang; if (this.chartsInitialized) { setTimeout(() => this.reinitCharts(), 100); } } }, 500); this.unsubFns.push(() => clearInterval(langCheckInterval)); }); } ngAfterViewInit(): void { // Delay chart init to ensure DOM has layout setTimeout(() => this.loadUPlot(), 500); } ngOnDestroy(): void { if (this.intervalId) clearInterval(this.intervalId); this.unsubFns.forEach(fn => fn()); this.themeObserver?.disconnect(); this.resizeObserver?.disconnect(); this.memoryPlot?.destroy(); this.opsPlot?.destroy(); this.clientsPlot?.destroy(); this.networkPlot?.destroy(); } serverInfoLabel(): string { if (!this.current) return ''; const s = this.current.server; const pause = this.paused ? (this.strings().intention?.resume || 'Resume') : (this.strings().intention?.pause || 'Pause'); return `Redis ${s.version} · ${s.mode} · ${this.uptimeFormatted} · ${pause}`; } toggleAutoRefreshClients(): void { this.autoRefreshClients = !this.autoRefreshClients; try { localStorage.setItem('p3xr-monitor-auto-clients', String(this.autoRefreshClients)); } catch {} } toggleAutoRefreshTopKeys(): void { this.autoRefreshTopKeys = !this.autoRefreshTopKeys; try { localStorage.setItem('p3xr-monitor-auto-topkeys', String(this.autoRefreshTopKeys)); } catch {} } async loadClientList(): Promise { try { const response = await this.socket.request({ action: 'client-list', payload: {} }); this.clientList = response.data; this.clientListLoaded = true; this.safeDetectChanges(); } catch { this.clientListLoaded = true; } } async killClient(id: string, event: Event): Promise { event.stopPropagation(); try { await this.common.confirm({ message: this.strings().page?.monitor?.confirmKillClient || 'Are you sure to kill this client?', }); await this.socket.request({ action: 'client-kill', payload: { id } }); this.common.toast({ message: this.strings().page?.monitor?.clientKilled || 'Client killed' }); await this.loadClientList(); } catch (e) { if (e !== undefined) this.common.generalHandleError(e); } } async loadTopKeys(): Promise { try { const response = await this.socket.request({ action: 'memory-top-keys', payload: { topN: 20 } }); this.topKeys = response.data; this.topKeysLoaded = true; this.safeDetectChanges(); } catch { this.topKeysLoaded = true; } } private safeDetectChanges(): void { this.ngZone.run(() => { const scrollContainer = document.getElementById('p3xr-database-content-container') || document.querySelector('.p3xr-layout-content'); const scrollTop = scrollContainer?.scrollTop ?? window.scrollY; try { this.cdr.detectChanges(); } catch { /* ignore late teardown */ } requestAnimationFrame(() => { if (scrollContainer) { scrollContainer.scrollTop = scrollTop; } else { window.scrollTo(0, scrollTop); } }); }); } formatBytes(bytes: number): string { if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; } togglePause(): void { this.paused = !this.paused; } get uptimeFormatted(): string { if (!this.current) return '-'; const s = this.current.server.uptime; const d = Math.floor(s / 86400); const h = Math.floor((s % 86400) / 3600); const m = Math.floor((s % 3600) / 60); return d > 0 ? `${d}d ${h}h ${m}m` : h > 0 ? `${h}h ${m}m` : `${m}m`; } private async fetchData(): Promise { try { const response = await this.socket.request({ action: 'monitor-info', payload: {}, }); const data: MonitorSnapshot = response.data; this.current = data; this.history.push(data); if (this.history.length > MAX_HISTORY) { this.history.shift(); } if (this.chartsInitialized) { this.updateCharts(); } else if (this.uPlot && this.history.length >= 2) { this.initCharts(); } this.safeDetectChanges(); } catch { /* next tick will retry */ } } private async loadUPlot(): Promise { const uPlotModule = await import('uplot'); this.uPlot = uPlotModule.default; // Import uPlot CSS inline if (!document.getElementById('uplot-css')) { const style = document.createElement('style'); style.id = 'uplot-css'; try { const cssModule = require('uplot/dist/uPlot.min.css'); style.textContent = typeof cssModule === 'string' ? cssModule : ''; } catch { // Fallback: minimal uPlot styles style.textContent = '.uplot { font-family: inherit; } .u-legend { display: flex; gap: 12px; padding: 4px 0; font-size: 12px; }'; } document.head.appendChild(style); } if (this.history.length >= 2) { this.initCharts(); } } private getChartColors() { const isDark = document.body.classList.contains('p3xr-theme-dark'); const style = getComputedStyle(document.body); const primary = style.getPropertyValue('--p3xr-btn-primary-bg').trim(); const accent = style.getPropertyValue('--p3xr-btn-accent-bg').trim(); const warn = style.getPropertyValue('--p3xr-btn-warn-bg').trim(); return { primary: primary || (isDark ? '#90caf9' : '#1976d2'), accent: accent || (isDark ? '#ce93d8' : '#9c27b0'), warn: warn || (isDark ? '#ef9a9a' : '#f44336'), text: isDark ? 'rgba(255,255,255,0.87)' : 'rgba(0,0,0,0.87)', grid: isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)', }; } private reinitCharts(): void { this.memoryPlot?.destroy(); this.opsPlot?.destroy(); this.clientsPlot?.destroy(); this.networkPlot?.destroy(); this.chartsInitialized = false; if (this.history.length >= 2) { this.initCharts(); } } private getChartWidth(el: HTMLDivElement | undefined): number { return el?.offsetWidth || 500; } private createOpts(width: number, seriesConfig: any[]): any { const colors = this.getChartColors(); return { width, height: 180, cursor: { show: true, drag: { x: false, y: false } }, legend: { show: true, live: false }, scales: { x: { time: true }, }, axes: [ { stroke: colors.text, grid: { stroke: colors.grid, width: 1 }, ticks: { stroke: colors.grid }, font: '11px Roboto', values: (_: any, ticks: number[]) => ticks.map(t => dayjs(t * 1000).format('HH:mm:ss')), }, { stroke: colors.text, grid: { stroke: colors.grid, width: 1 }, ticks: { stroke: colors.grid }, font: '11px Roboto Mono', size: 55, }, ], series: [ { label: this.strings().label?.time || 'Time', value: (_: any, rawValue: number) => rawValue ? dayjs(rawValue * 1000).format('HH:mm:ss') : '' }, ...seriesConfig, ], }; } private initCharts(): void { if (!this.uPlot || this.chartsInitialized) return; const colors = this.getChartColors(); const data = this.buildChartData(); const memEl = this.memoryChartRef?.nativeElement; const opsEl = this.opsChartRef?.nativeElement; const cliEl = this.clientsChartRef?.nativeElement; const netEl = this.networkChartRef?.nativeElement; if (!memEl || !opsEl || !cliEl || !netEl) return; const s = this.strings().page?.monitor || {}; this.memoryPlot = new this.uPlot( this.createOpts(this.getChartWidth(memEl), [ { label: s.memory || 'Memory', stroke: colors.primary, width: 2, fill: colors.primary + '15' }, { label: 'RSS', stroke: colors.accent, width: 2 }, ]), [data.timestamps, data.memUsed, data.memRss], memEl, ); this.opsPlot = new this.uPlot( this.createOpts(this.getChartWidth(opsEl), [ { label: s.opsPerSec || 'Ops/s', stroke: colors.primary, width: 2, fill: colors.primary + '20' }, ]), [data.timestamps, data.ops], opsEl, ); this.clientsPlot = new this.uPlot( this.createOpts(this.getChartWidth(cliEl), [ { label: s.clients || 'Connected', stroke: colors.primary, width: 2 }, { label: s.blocked || 'Blocked', stroke: colors.warn, width: 2 }, ]), [data.timestamps, data.connected, data.blocked], cliEl, ); this.networkPlot = new this.uPlot( this.createOpts(this.getChartWidth(netEl), [ { label: '↓ In', stroke: colors.primary, width: 2, fill: colors.primary + '15' }, { label: '↑ Out', stroke: colors.accent, width: 2 }, ]), [data.timestamps, data.netIn, data.netOut], netEl, ); this.chartsInitialized = true; // Auto-resize charts on container resize (window resize, accordion toggle) let resizeTimer: any; this.resizeObserver = new ResizeObserver(() => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { const mw = this.getChartWidth(memEl); const ow = this.getChartWidth(opsEl); const cw = this.getChartWidth(cliEl); const nw = this.getChartWidth(netEl); if (mw > 0) this.memoryPlot?.setSize({ width: mw, height: 180 }); if (ow > 0) this.opsPlot?.setSize({ width: ow, height: 180 }); if (cw > 0) this.clientsPlot?.setSize({ width: cw, height: 180 }); if (nw > 0) this.networkPlot?.setSize({ width: nw, height: 180 }); }, 50); }); this.resizeObserver.observe(memEl); this.resizeObserver.observe(opsEl); this.resizeObserver.observe(cliEl); this.resizeObserver.observe(netEl); } private buildChartData() { return { timestamps: this.history.map(h => h.timestamp / 1000), memUsed: this.history.map(h => h.memory.used / (1024 * 1024)), memRss: this.history.map(h => h.memory.rss / (1024 * 1024)), ops: this.history.map(h => h.stats.opsPerSec), connected: this.history.map(h => h.clients.connected), blocked: this.history.map(h => h.clients.blocked), netIn: this.history.map(h => h.stats.inputKbps), netOut: this.history.map(h => h.stats.outputKbps), }; } private updateCharts(): void { if (!this.chartsInitialized) return; const data = this.buildChartData(); this.memoryPlot?.setData([data.timestamps, data.memUsed, data.memRss]); this.opsPlot?.setData([data.timestamps, data.ops]); this.clientsPlot?.setData([data.timestamps, data.connected, data.blocked]); this.networkPlot?.setData([data.timestamps, data.netIn, data.netOut]); } } src/ng/pages/search/000077500000000000000000000000001517666434100146325ustar00rootroot00000000000000src/ng/pages/search/search.component.html000066400000000000000000000217131517666434100207720ustar00rootroot00000000000000
@if (indexes.length === 0) {
{{ strings().page?.search?.noIndex || 'No indexes found' }}
} @if (indexes.length > 0) { {{ strings().page?.search?.index || 'Index' }} @for (idx of indexes; track idx) { {{ idx }} } {{ strings().page?.search?.query || 'Query' }}
@if (isGtSm) { } @else { }
}
@if (searchDone && total === 0) {
{{ strings().label?.noResults || 'No results' }}
} @if (results.length > 0 || total > 0) {
@if (pages > 1) { {{ currentPage }} / {{ pages }} }
@for (doc of results; track doc._key) {
{{ doc._key }}
@for (field of getDocKeys(doc); track field) { {{ field }}: {{ doc[field] }} @if (!$last) { · } }
}
} @if (selectedIndex && indexInfo) {
@if (!isReadonly) { }
@if (indexInfo) { @for (key of getDocKeys(indexInfo); track key) {
{{ key }}
{{ indexInfo[key] | json }}
}
}
} @if (!isReadonly) {
{{ strings().page?.search?.indexName || 'Index Name' }} {{ strings().page?.search?.prefix || 'Key Prefix (optional)' }}
Schema
@for (field of newIndexFields; track $index; let i = $index) {
{{ strings().page?.search?.fieldName || 'Field Name' }}
{{ strings().label?.type || 'Type' }} TEXT NUMERIC TAG GEO VECTOR
}
@if (isGtSm) { } @else { }
}
src/ng/pages/search/search.component.scss000066400000000000000000000023101517666434100207710ustar00rootroot00000000000000:host { display: block; padding-bottom: 64px; color: var(--mat-app-text-color, inherit); } .md-block { width: 100%; } .p3xr-search-result-item { width: 100%; padding: 4px 0; } .p3xr-search-result-key { margin-bottom: 4px; } .p3xr-search-result-fields { display: flex; flex-wrap: wrap; gap: 4px 16px; } .p3xr-search-result-field { font-size: 13px; } .p3xr-search-field-name { font-weight: 600; opacity: 0.6; margin-right: 4px; } .p3xr-search-field-value { font-family: 'Roboto Mono', monospace; font-size: 12px; } .p3xr-search-schema-row { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; } .p3xr-search-schema-type-row { display: flex; align-items: center; gap: 8px; flex-shrink: 0; .mat-mdc-fab-base { margin-bottom: 20px; } } @media (max-width: 599px) { .p3xr-search-schema-row { flex-wrap: wrap; > mat-form-field { width: 100% !important; flex: 1 1 100% !important; } } .p3xr-search-schema-type-row { flex: 1; mat-form-field { flex: 1; width: auto !important; } } } src/ng/pages/search/search.component.ts000066400000000000000000000176461517666434100204660ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, NgZone, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatDividerModule } from '@angular/material/divider'; import { MatListModule } from '@angular/material/list'; import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field'; import { BreakpointObserver } from '@angular/cdk/layout'; import { MatInputModule } from '@angular/material/input'; import { I18nService } from '../../services/i18n.service'; import { SocketService } from '../../services/socket.service'; import { CommonService } from '../../services/common.service'; import { P3xrAccordionComponent } from '../../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../../components/p3xr-button.component'; declare const p3xr: any; require('./search.component.scss'); @Component({ selector: 'p3xr-search', standalone: true, imports: [ CommonModule, FormsModule, MatIconModule, MatButtonModule, MatTooltipModule, MatDividerModule, MatListModule, MatSelectModule, MatFormFieldModule, MatInputModule, P3xrAccordionComponent, P3xrButtonComponent, ], templateUrl: './search.component.html', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class SearchComponent implements OnInit, OnDestroy { strings; indexes: string[] = []; selectedIndex = ''; query = '*'; offset = 0; limit = 20; total = 0; results: any[] = []; indexInfo: any = null; searching = false; searchDone = false; isReadonly = false; isGtSm = true; // Index creation newIndexName = ''; newIndexPrefix = ''; newIndexFields: Array<{ name: string; type: string; sortable: boolean }> = [ { name: '', type: 'TEXT', sortable: false }, ]; private unsubs: Array<() => void> = []; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(SocketService) private socket: SocketService, @Inject(CommonService) private common: CommonService, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, @Inject(NgZone) private ngZone: NgZone, @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.isReadonly = p3xr?.state?.connection?.readonly === true; const sub960 = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isGtSm = r.matches; this.cdr.markForCheck(); }); this.unsubs.push(() => sub960.unsubscribe()); this.loadIndexes(); const sub = this.socket.stateChanged$.subscribe(() => { this.isReadonly = p3xr?.state?.connection?.readonly === true; this.loadIndexes(); }); this.unsubs.push(() => sub.unsubscribe()); } async searchAndRefreshInfo(): Promise { await Promise.all([ this.search(), this.loadIndexInfo(), ]); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); } get pages(): number { return Math.ceil(this.total / this.limit); } get currentPage(): number { return Math.floor(this.offset / this.limit) + 1; } async loadIndexes(): Promise { try { const response = await this.socket.request({ action: 'search-list', payload: {} }); this.indexes = response.data; if (this.indexes.length > 0 && !this.selectedIndex) { this.selectedIndex = this.indexes[0]; } this.cdr.markForCheck(); } catch { /* ignore */ } } async search(): Promise { if (!this.selectedIndex || !this.query) return; this.searching = true; this.cdr.markForCheck(); try { const response = await this.socket.request({ action: 'search-query', payload: { index: this.selectedIndex, query: this.query, offset: this.offset, limit: this.limit, }, }); this.total = response.data.total; this.results = response.data.docs; } catch (e) { this.common.generalHandleError(e); this.results = []; this.total = 0; } finally { this.searching = false; this.searchDone = true; this.cdr.markForCheck(); } } pageAction(action: string): void { switch (action) { case 'first': this.offset = 0; break; case 'prev': this.offset = Math.max(0, this.offset - this.limit); break; case 'next': this.offset = Math.min((this.pages - 1) * this.limit, this.offset + this.limit); break; case 'last': this.offset = (this.pages - 1) * this.limit; break; } this.search(); } async loadIndexInfo(): Promise { if (!this.selectedIndex) return; try { const response = await this.socket.request({ action: 'search-index-info', payload: { index: this.selectedIndex }, }); this.indexInfo = response.data; this.cdr.markForCheck(); } catch (e) { this.common.generalHandleError(e); } } async dropIndex(): Promise { if (!this.selectedIndex) return; try { await this.common.confirm({ message: this.strings().confirm?.dropIndex || 'Are you sure to drop this index?', }); await this.socket.request({ action: 'search-index-drop', payload: { index: this.selectedIndex }, }); this.common.toast({ message: this.strings().status?.indexDropped || 'Index dropped' }); this.selectedIndex = ''; this.results = []; this.total = 0; this.indexInfo = null; await this.loadIndexes(); } catch (e) { if (e !== undefined) this.common.generalHandleError(e); } } addField(): void { this.newIndexFields.push({ name: '', type: 'TEXT', sortable: false }); } async confirmRemoveField(index: number): Promise { try { const label = this.strings().intention?.delete || 'Delete'; await this.common.confirm({ message: label + '?' }); this.newIndexFields.splice(index, 1); } catch (e) { if (e !== undefined) this.common.generalHandleError(e); } } async createIndex(): Promise { if (!this.newIndexName.trim()) return; const schema = this.newIndexFields.filter(f => f.name.trim()); if (schema.length === 0) return; try { await this.socket.request({ action: 'search-index-create', payload: { name: this.newIndexName.trim(), prefix: this.newIndexPrefix.trim() || undefined, schema, }, }); this.common.toast({ message: this.strings().status?.indexCreated || 'Index created' }); this.newIndexName = ''; this.newIndexPrefix = ''; this.newIndexFields = [{ name: '', type: 'TEXT', sortable: false }]; await this.loadIndexes(); } catch (e) { this.common.generalHandleError(e); } } getDocKeys(doc: any): string[] { return Object.keys(doc).filter(k => k !== '_key'); } } src/ng/pages/settings.component.ts000066400000000000000000001462221517666434100176050ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatDividerModule } from '@angular/material/divider'; import { MatDialog } from '@angular/material/dialog'; import { BreakpointObserver } from '@angular/cdk/layout'; import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop'; import { I18nService } from '../services/i18n.service'; import { SettingsService } from '../services/settings.service'; import { CommonService } from '../services/common.service'; import { SocketService } from '../services/socket.service'; import { MainCommandService } from '../services/main-command.service'; import { ConnectionDialogService } from '../dialogs/connection-dialog.service'; import { createDialogPopupSettings } from '../dialogs/dialog-popup'; import { TreecontrolSettingsDialogService } from '../dialogs/treecontrol-settings-dialog.service'; import { P3xrAccordionComponent } from '../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../components/p3xr-button.component'; // import { DatePipe } from '../pipes/date.pipe'; declare const p3xr: any; /** * Settings page — Angular replacement for AngularJS p3xrSettings. * First complete Angular page migration. * * Contains: * - Connections list (add/edit/delete/connect/disconnect) * - License info panel * - Tree settings panel */ @Component({ selector: 'p3xr-ng-settings', standalone: true, imports: [ // DatePipe, MatToolbarModule, MatButtonModule, MatIconModule, MatListModule, MatTooltipModule, MatDividerModule, DragDropModule, P3xrAccordionComponent, P3xrButtonComponent, ], template: `
@if (!readonlyConnections) { }
@if (connectionsList.length === 0) {
{{ strings().intention?.noConnectionsInSettings || 'No connections' }}
} @if (connectionsList.length > 0) {
@if (groupModeEnabled) {
@for (group of groupedConnections; track group.name) {
{{ collapsedGroups.has(group.name) ? 'chevron_right' : 'expand_more' }} {{ getGroupDisplayName(group.name) }} ({{ group.connections.length }})
@if (!collapsedGroups.has(group.name)) {
@for (connection of group.connections; track connection.id; let last = $last) {
{{ connection.name }}
{{ connection.host }}:{{ connection.port }}
@for (entry of getConnectionClients(connection); track entry.key) { {{ strings().page?.overview?.connectedCount?.({ length: entry.clients }) }} }  
@if (currentConnectionId !== connection.id) { @if (isXs) { } @else { } } @if (currentConnectionId === connection.id) { @if (isXs) { } @else { } } @if (!readonlyConnections) { @if (isXs) { } @else { } @if (isXs) { } @else { } } @if (readonlyConnections) { @if (isXs) { } @else { } }
@if (!last) { } }
}
}
} @if (!groupModeEnabled) { @for (connection of connectionsList; track connection.id; let last = $last) {
{{ connection.name }}
{{ connection.host }}:{{ connection.port }}
@for (entry of getConnectionClients(connection); track entry.key) { {{ strings().page?.overview?.connectedCount?.({ length: entry.clients }) }} }  
@if (currentConnectionId !== connection.id) { @if (isXs) { } @else { } } @if (currentConnectionId === connection.id) { @if (isXs) { } @else { } } @if (!readonlyConnections) { @if (isXs) { } @else { } @if (isXs) { } @else { } } @if (readonlyConnections) { @if (isXs) { } @else { } }
@if (!last) { } } }
}

{{ strings().form?.treeSettings?.field?.treeSeparator }} {{ settings.redisTreeDivider() || strings().label?.treeSeparatorEmptyNote }}
{{ strings().form?.treeSettings?.field?.page }}{{ settings.pageCount() }}
{{ strings().form?.treeSettings?.error?.page }}
{{ strings().form?.treeSettings?.field?.keyPageCount }}{{ settings.keyPageCount() }}
{{ strings().form?.treeSettings?.error?.keyPageCount }}
{{ strings().form?.treeSettings?.maxValueDisplay }}{{ settings.maxValueDisplay() }}
{{ strings().form?.treeSettings?.maxValueDisplayInfo }}
{{ strings().form?.treeSettings?.maxKeys }}{{ settings.maxKeys() }}
{{ strings().form?.treeSettings?.maxKeysInfo }}
{{ strings().form?.treeSettings?.field?.keysSort }} {{ settings.keysSort() ? strings().label?.keysSort?.on : strings().label?.keysSort?.off }}
{{ strings().form?.treeSettings?.field?.searchMode }} {{ settings.searchClientSide() ? strings().form?.treeSettings?.label?.searchModeClient : strings().form?.treeSettings?.label?.searchModeServer }}
{{ strings().form?.treeSettings?.field?.searchModeStartsWith }} {{ settings.searchStartsWith() ? strings().form?.treeSettings?.label?.searchModeStartsWith : strings().form?.treeSettings?.label?.searchModeIncludes }}
{{ settings.jsonFormat() === 2 ? strings().form?.treeSettings?.label?.jsonFormatTwoSpace : strings().form?.treeSettings?.label?.jsonFormatFourSpace }}
{{ settings.animation() ? strings().form?.treeSettings?.label?.animation : strings().form?.treeSettings?.label?.noAnimation }}
`, styles: [` :host { display: block; color: var(--mat-app-text-color, inherit); } .p3xr-settings-hint { font-size: 12px; color: var(--mat-app-text-color, rgba(0, 0, 0, 0.54)); opacity: 0.7; } /* Wide screens: show button text, hide tooltip */ .hide-xs { display: inline; } .show-xs-tooltip { display: none; } /* Small screens: hide text, show icon-only square buttons */ @media (max-width: 599px) { .hide-xs { display: none !important; } /* Buttons become square icon buttons on mobile */ .p3xr-connection-item button { min-width: 40px !important; width: 40px !important; height: 40px !important; padding: 0 !important; margin: 2px !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; } .p3xr-connection-item button mat-icon, .p3xr-connection-item button i { margin: 0 !important; } } /* Connection items: match production md-list-item */ .p3xr-connection-item { display: flex; align-items: center; gap: 4px; padding: 8px 8px 8px 16px; min-height: 56px; box-sizing: border-box; } .p3xr-connection-info { flex: 1; min-width: 0; overflow: hidden; } .p3xr-connection-item button { flex-shrink: 0; } /* Drag and drop */ .p3xr-connection-item.cdk-drag-preview { box-sizing: border-box; border-radius: 4px; box-shadow: 0 5px 5px -3px rgba(0,0,0,0.2), 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12); background: var(--mat-app-background-color, #fff); } .p3xr-connection-item.cdk-drag-placeholder { opacity: 0.3; } .cdk-drop-list-dragging .p3xr-connection-item:not(.cdk-drag-placeholder) { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } .p3xr-connection-group-block.cdk-drag-preview { box-sizing: border-box; border-radius: 4px; box-shadow: 0 5px 5px -3px rgba(0,0,0,0.2), 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12); background: var(--mat-app-background-color, #fff); } .p3xr-connection-group-block.cdk-drag-placeholder { opacity: 0.3; } .p3xr-group-drop-list.cdk-drop-list-dragging .p3xr-connection-group-block:not(.cdk-drag-placeholder) { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } .p3xr-connection-group-header[cdkDragHandle] { cursor: grab; } /* Only tree settings rows are clickable/hoverable. License rows stay static like AngularJS. */ .p3xr-tree-settings-list mat-list-item { cursor: pointer; } .p3xr-tree-settings-list mat-list-item:hover { background-color: var(--p3xr-hover-bg); } /* Settings list: bold label (left), normal value (right) */ ::ng-deep .p3xr-tree-settings-list .mdc-list-item__primary-text { width: 100%; } ::ng-deep .p3xr-settings-label { font-weight: 500; } ::ng-deep .p3xr-settings-value { font-weight: 400; opacity: 0.8; } `], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SettingsComponent implements OnInit, OnDestroy { private static readonly UNGROUPED_GROUP_KEY = ''; strings; connectionsList: any[] = []; groupedConnections: Array<{ name: string; connections: any[] }> = []; collapsedGroups: Set; groupModeEnabled = false; private static readonly COLLAPSED_GROUPS_KEY = 'p3xr-collapsed-connection-groups'; private static readonly GROUP_MODE_KEY = 'p3xr-connection-group-mode'; readonlyConnections = false; currentConnectionId: string | undefined; license: any = {}; isXs = false; private electronUiStorage: Record | null = null; private readonly unsubs: Array<() => void> = []; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(SettingsService) public settings: SettingsService, @Inject(CommonService) private common: CommonService, @Inject(SocketService) private socket: SocketService, @Inject(MainCommandService) private cmd: MainCommandService, @Inject(ConnectionDialogService) private connectionDialog: ConnectionDialogService, @Inject(TreecontrolSettingsDialogService) private treeSettingsDialog: TreecontrolSettingsDialogService, @Inject(MatDialog) private dialog: MatDialog, @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; this.restoreGroupingState(); this.breakpointObserver.observe('(max-width: 599px)').subscribe(result => { this.isXs = result.matches; this.cdr.markForCheck(); }); } ngOnInit(): void { this.refreshState(); // Subscribe to socket events for reactive updates const sub1 = this.socket.connections$.subscribe(() => this.refreshState()); const sub2 = this.socket.configuration$.subscribe(() => this.refreshState()); const sub3 = this.socket.licenseUpdate$.subscribe(() => this.refreshState()); const sub4 = this.socket.stateChanged$.subscribe(() => this.refreshState()); const sub5 = this.socket.redisStatus$.subscribe(() => this.refreshState()); this.unsubs.push(() => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.unsubscribe(); sub5.unsubscribe(); }); } ngOnDestroy(): void { this.unsubs.forEach(fn => fn()); } private refreshState(): void { const state = p3xr.state; this.connectionsList = state.connections?.list || []; this.readonlyConnections = state.cfg?.readonlyConnections === true; this.currentConnectionId = state.connection?.id; this.license = state.license || {}; this.buildGroupedConnections(); this.cdr.detectChanges(); } toggleGroupMode(): void { this.groupModeEnabled = !this.groupModeEnabled; this.setPersistentItem(SettingsComponent.GROUP_MODE_KEY, String(this.groupModeEnabled)); } toggleGroup(name: string): void { if (this.collapsedGroups.has(name)) { this.collapsedGroups.delete(name); } else { this.collapsedGroups.add(name); } this.setPersistentItem(SettingsComponent.COLLAPSED_GROUPS_KEY, JSON.stringify([...this.collapsedGroups])); } private restoreGroupingState(): void { this.groupModeEnabled = this.getPersistentItem(SettingsComponent.GROUP_MODE_KEY) === 'true'; try { const stored = this.getPersistentItem(SettingsComponent.COLLAPSED_GROUPS_KEY); this.collapsedGroups = stored ? new Set(JSON.parse(stored).map((name: string) => this.normalizeCollapsedGroupName(name))) : new Set(); } catch { this.collapsedGroups = new Set(); } } private getPersistentItem(key: string): string | null { const value = this.getElectronUiStorage()[key]; if (typeof value === 'string') { return value; } try { return localStorage.getItem(key); } catch { return null; } } private setPersistentItem(key: string, value: string): void { try { localStorage.setItem(key, value); } catch { /* ignore */ } const storage = this.getElectronUiStorage(); storage[key] = value; this.electronUiStorage = storage; try { if (window.parent && window.parent !== window) { window.parent.postMessage({ type: 'p3x-ui-storage-set', key, value }, '*'); } } catch { /* ignore */ } } private getElectronUiStorage(): Record { if (this.electronUiStorage !== null) { return this.electronUiStorage; } // Read from p3xr.electronUiStorageBootstrap which was captured in main.js // BEFORE Angular's router stripped the query params. let storage: Record = {}; try { const bootstrap = p3xr?.electronUiStorageBootstrap; if (bootstrap && typeof bootstrap === 'object' && !Array.isArray(bootstrap)) { storage = this.normalizeElectronUiStorage(bootstrap); } } catch { storage = {}; } this.electronUiStorage = storage; return storage; } private normalizeElectronUiStorage(value: unknown): Record { if (!value || typeof value !== 'object' || Array.isArray(value)) { return {}; } return Object.entries(value).reduce((result: Record, [key, entryValue]) => { if (typeof entryValue === 'string') { result[key] = entryValue; } return result; }, {}); } getGroupDisplayName(name: string): string { return name === SettingsComponent.UNGROUPED_GROUP_KEY ? this.getUngroupedLabel() : name; } private getUngroupedLabel(): string { return this.strings().label?.ungrouped || 'Ungrouped'; } private normalizeCollapsedGroupName(name: unknown): string { if (typeof name !== 'string') { return ''; } return this.isLegacyUngroupedGroupName(name) ? SettingsComponent.UNGROUPED_GROUP_KEY : name; } private isLegacyUngroupedGroupName(name: string): boolean { return name === 'Ungrouped' || name === this.getUngroupedLabel(); } private buildGroupedConnections(): void { // Use a Map to preserve the order groups first appear in the connections list. // This respects the server-persisted order (including after drag reorder). const groups = new Map(); for (const conn of this.connectionsList) { const groupName = conn.group?.trim() || SettingsComponent.UNGROUPED_GROUP_KEY; if (!groups.has(groupName)) { groups.set(groupName, []); } groups.get(groupName)!.push(conn); } const result: Array<{ name: string; connections: any[] }> = []; for (const [name, connections] of groups) { result.push({ name, connections }); } this.groupedConnections = result; } // Predicates prevent items from entering the wrong drop list level groupDropPredicate = (drag: any) => drag.data && 'connections' in drag.data; connectionDropPredicate = (drag: any) => drag.data && !('connections' in drag.data); async dropGroup(event: CdkDragDrop): Promise { if (event.previousIndex === event.currentIndex) return; moveItemInArray(this.groupedConnections, event.previousIndex, event.currentIndex); // Rebuild flat list in new group order and persist const allIds: string[] = []; for (const group of this.groupedConnections) { for (const conn of group.connections) { allIds.push(conn.id); } } try { await this.socket.request({ action: 'connections-reorder', payload: { ids: allIds }, }); } catch (e) { this.common.generalHandleError(e); this.refreshState(); } } async dropConnection(event: CdkDragDrop, groupName: string): Promise { if (event.previousIndex === event.currentIndex) return; moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); // Persist the new order to the server try { const reorderedIds = event.container.data.map((c: any) => c.id); await this.socket.request({ action: 'connections-reorder', payload: { group: groupName || undefined, ids: reorderedIds }, }); } catch (e) { this.common.generalHandleError(e); this.refreshState(); } } // --- Connections --- connectionForm(type: string, model?: any): void { this.connectionDialog.show({ type: type as any, model, $event: undefined }); } async connect(connection: any): Promise { this.cmd.connectRequest$.next({ connection, disableState: true }); } async disconnect(): Promise { await this.cmd.disconnect(); this.refreshState(); } async deleteConnection(connection: any, $event: any): Promise { try { await this.common.confirm({ event: $event, message: this.strings().confirm?.deleteConnectionText || 'Delete this connection?', }); await this.socket.request({ action: 'connection-delete', payload: { id: connection.id }, }); this.common.toast(this.strings().status?.deleted || 'Deleted'); } catch (e) { if (e !== undefined) { this.common.generalHandleError(e); } } } getConnectionClients(connection: any): { key: string; clients: number }[] { const redisConnections = p3xr.state.redisConnections || {}; const results: { key: string; clients: number }[] = []; for (const key of Object.keys(redisConnections)) { if (redisConnections[key].connection?.name === connection.name) { results.push({ key, clients: redisConnections[key].clients?.length || 0 }); } } return results; } // --- License --- getLicense(): any { return this.license; } isLicenseEditable(): boolean { const l = this.license; if (typeof l.licenseEditable === 'boolean') return l.licenseEditable; if (typeof l.editableActive === 'boolean') return l.editableActive; if (typeof l.disabled === 'boolean') return !l.disabled; return true; } getEffectiveLicenseTier(): string { // All features are free — always return enterprise tier return 'enterprise'; } getLicenseEditableText(): string { return this.isLicenseEditable() ? (this.strings().label?.licenseEditableYes || 'Yes') : (this.strings().label?.licenseEditableNo || 'No'); } getLicenseStateText(): string { const l = this.license; if (l.hasLicenseKey !== true) return this.strings().label?.licenseStateNoLicense || 'No license'; if (l.valid === true && l.licenseStatus === 'active') return this.strings().label?.licenseStateActive || 'Active'; return this.strings().label?.licenseStateInactive || 'Inactive'; } getLicenseKeyText(): string { const l = this.license; if (l.hasLicenseKey !== true) return '-'; return typeof l.licenseKeyMasked === 'string' && l.licenseKeyMasked.length > 0 ? l.licenseKeyMasked : '****'; } getLicenseStatusText(): string { const status = typeof this.license.licenseStatus === 'string' ? this.license.licenseStatus : ''; if (!status) return '-'; const map = this.strings().licenseStatusValue; return map?.[status] || status; } getLicenseReasonText(): string { const reason = typeof this.license.reason === 'string' ? this.license.reason : ''; if (!reason) return '-'; const map = this.strings().licenseReason; return map?.[reason] || reason; } getLicenseMaxDevicesText(): string { const l = this.license; const max = typeof l.maxDevices === 'number' ? l.maxDevices : l.deviceLease?.maxDevices; if (typeof max !== 'number' || !Number.isFinite(max) || max <= 0) return '-'; return `${Math.floor(max)}`; } getLicenseActiveDevicesText(): string { const l = this.license; const active = typeof l.activeDevices === 'number' ? l.activeDevices : l.deviceLease?.activeDevices; if (typeof active !== 'number' || !Number.isFinite(active) || active < 0) return '-'; const max = typeof l.maxDevices === 'number' ? l.maxDevices : l.deviceLease?.maxDevices; if (typeof max === 'number' && Number.isFinite(max) && max > 0) return `${Math.floor(active)} / ${Math.floor(max)}`; return `${Math.floor(active)}`; } getLicenseFeaturesText(): string { const s = this.strings(); const l = this.license; const features: string[] = []; if (Array.isArray(l.features)) { for (const f of l.features) { if (typeof f === 'string' && f.length > 0) features.push(f); } } const tier = this.getEffectiveLicenseTier(); const derived: string[] = []; if (tier === 'pro' || tier === 'enterprise') { derived.push(s.label?.licenseFeatureSsh || 'SSH'); if (tier === 'enterprise') { derived.push(s.label?.licenseFeatureCluster || 'Cluster'); derived.push(s.label?.licenseFeatureSentinel || 'Sentinel'); } derived.push(s.label?.licenseFeatureReadonlyMode || 'Readonly'); derived.push(s.intention?.jsonViewEditor || 'JSON Editor'); derived.push(s.intention?.setBuffer || 'Buffer Upload'); derived.push(s.intention?.downloadBuffer || 'Buffer Download'); derived.push(s.label?.licenseFeatureReJSON || 'ReJSON'); } for (const d of derived) { if (d && !features.includes(d)) features.push(d); } return features.length === 0 ? (s.label?.licenseFeaturesEmpty || '-') : features.join(', '); } getLicenseTierPolicyTitle(): string { return `${this.strings().label?.licenseTierPolicyTitle || 'License Policy'}: ${this.getEffectiveLicenseTier()}`; } async setLicense($event: any): Promise { if (!this.isLicenseEditable()) { this.common.toast(this.strings().error?.license_readonly || 'License is read-only'); return; } try { const { PromptDialogComponent } = await import( /* webpackChunkName: "dialog-prompt" */ '../dialogs/prompt-dialog.component' ); const s = this.strings(); const dialogRef = this.dialog.open(PromptDialogComponent, createDialogPopupSettings({ panelClass: 'p3xr-license-dialog', data: { title: s.confirm?.license?.title || 'License', placeholder: s.confirm?.license?.placeholder || 'Enter license key', initialValue: '', okButton: s.intention?.license || 'Set License', cancelButton: s.intention?.cancel || 'Cancel', }, })); const licenseKey = await new Promise((resolve) => { dialogRef.afterClosed().subscribe(resolve); }); if (licenseKey === undefined) return; const response = await this.socket.request({ action: 'set-license', payload: { license: licenseKey }, }); this.common.toast( response.info !== 'ok' ? (this.strings().error?.[response.info] || response.info) : (this.strings().status?.licenseSaved || 'License saved') ); } catch (e) { if (e !== undefined) { const msg = (e as any)?.message; if (this.strings().error?.[msg]) { e = new Error(this.strings().error[msg]); } this.common.generalHandleError(e); } } } async showLicenseTierPolicy($event: any): Promise { await this.common.alert({ title: this.getLicenseTierPolicyTitle(), message: this.strings().label?.licenseTierPolicyText || '', panelClass: 'p3xr-license-tier-policy-dialog', autoFocus: false, }); } // --- Tree Settings --- openTreeSettings($event: any): void { this.treeSettingsDialog.show({ $event }); } } src/ng/pipes/000077500000000000000000000000001517666434100134065ustar00rootroot00000000000000src/ng/pipes/date.pipe.ts000066400000000000000000000026721517666434100156360ustar00rootroot00000000000000import { Pipe, PipeTransform, Inject } from '@angular/core'; import { I18nService } from '../services/i18n.service'; declare const p3xr: any; /** * Locale-aware date pipe backed by dayjs. * * Named presets: * {{ value | date:'date' }} — date only (ll) * {{ value | date:'datetime' }} — date + time (lll) ← default * {{ value | date:'timestamp' }} — date + time + s * * Raw dayjs format tokens also accepted (L, LL, LLL, LLLL, LT, LTS, …). * Returns '-' for falsy or invalid values. * Impure so Angular re-evaluates on language changes. */ @Pipe({ name: 'date', pure: false, standalone: true, }) export class DatePipe implements PipeTransform { constructor(@Inject(I18nService) private i18n: I18nService) {} transform(value: any, format: string = 'datetime'): string { const lang = this.i18n.currentLang(); if (!value) return '-'; const dayjs = (globalThis as any).dayjs || require('dayjs'); const localeMap = p3xr?.settings?.language?.momentDateMap || {}; dayjs.locale(localeMap[lang] || lang); const d = dayjs(value); if (!d.isValid()) return '-'; switch (format) { case 'date': return d.format('ll'); case 'datetime': return d.format('lll'); case 'timestamp': return d.format('ll') + ' ' + d.format('LTS'); default: return d.format(format); } } } src/ng/services/000077500000000000000000000000001517666434100141115ustar00rootroot00000000000000src/ng/services/common.service.ts000066400000000000000000000216501517666434100174140ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { Subject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatDialog } from '@angular/material/dialog'; import type { ConfirmDialogData } from '../components/confirm-dialog.component'; import { createDialogPopupSettings } from '../dialogs/dialog-popup'; import { I18nService } from './i18n.service'; import { RedisParserService } from './redis-parser.service'; import { RedisStateService } from './redis-state.service'; import { SettingsService } from './settings.service'; import { TreeBuilderService } from './tree-builder.service'; declare const p3xr: any; /** * Common service — Angular replacement for AngularJS p3xrCommon factory. * * Provides: * - toast(): notification via MatSnackBar (replaces $mdToast) * - confirm(): confirmation dialog via MatDialog (replaces $mdDialog.confirm()) * - alert(): alert dialog via MatDialog (replaces $mdDialog.alert()) * - generalHandleError(): centralized error handling with i18n code lookup * - loadRedisInfoResponse(): parses Redis info and populates state * * During hybrid mode, both this service and the AngularJS p3xrCommon factory coexist. * New Angular components use this service; existing AngularJS components keep using the factory. */ @Injectable({ providedIn: 'root' }) export class CommonService { readonly treeExpandAll$ = new Subject(); readonly treeCollapseAll$ = new Subject(); private lastResponse: any; constructor( @Inject(MatSnackBar) private snackBar: MatSnackBar, @Inject(MatDialog) private dialog: MatDialog, @Inject(I18nService) private i18n: I18nService, @Inject(RedisParserService) private redisParser: RedisParserService, @Inject(RedisStateService) private state: RedisStateService, @Inject(SettingsService) private settings: SettingsService, @Inject(TreeBuilderService) private treeBuilder: TreeBuilderService, ) {} /** * Show a toast notification. * Replaces AngularJS $mdToast. */ toast(options: string | { message: string; hideDelay?: number }): void { if (typeof options === 'string') { options = { message: options }; } const ref = this.snackBar.open(options.message, 'x', { duration: options.hideDelay || 5000, horizontalPosition: 'right', verticalPosition: 'bottom', }); ref.onAction().subscribe(() => ref.dismiss()); } /** * Show a confirmation dialog with OK and Cancel buttons. * Returns a Promise that resolves on OK and rejects on Cancel. * Replaces AngularJS $mdDialog.confirm(). */ async confirm(options: { message: string; title?: string; event?: any; disableCancel?: boolean; panelClass?: string | string[]; autoFocus?: boolean; }): Promise { const strings = this.i18n.strings(); const isAlert = options.hasOwnProperty('disableCancel') && options.disableCancel; const data: ConfirmDialogData = { title: options.title || (isAlert ? (strings.confirm?.info || 'Info') : (strings.confirm?.title || 'Confirm')), message: options.message, disableCancel: isAlert, okButton: isAlert ? (strings.intention?.ok || 'OK') : (strings.intention?.sure || 'Sure'), cancelButton: strings.intention?.cancel || 'Cancel', }; const { ConfirmDialogComponent } = await import( /* webpackChunkName: "dialog-confirm" */ '../components/confirm-dialog.component' ); const dialogRef = this.dialog.open(ConfirmDialogComponent, createDialogPopupSettings({ data, autoFocus: options.autoFocus ?? true, panelClass: options.panelClass, })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe((result) => { if (result) { resolve(); } else { reject(); } }); }); } /** * Show an alert dialog with only OK button. * Replaces AngularJS $mdDialog.alert(). */ async alert(options: string | { title?: string; message: string; panelClass?: string | string[]; autoFocus?: boolean; }): Promise { if (typeof options === 'string') { options = { message: options }; } try { await this.confirm({ title: options.title, message: options.message, disableCancel: true, panelClass: options.panelClass, autoFocus: options.autoFocus, }); } catch { // Alert always resolves — user dismissed the dialog } } /** * Show a prompt dialog with text input. * Replaces AngularJS $mdDialog.prompt(). * Returns the entered value, or throws if cancelled. */ async prompt(options: { title: string; placeholder: string; initialValue?: string; ok: string; cancel: string; }): Promise { const { PromptDialogComponent } = await import( /* webpackChunkName: "dialog-prompt" */ '../dialogs/prompt-dialog.component' ); const { createDialogPopupSettings } = await import('../dialogs/dialog-popup'); const dialogRef = this.dialog.open(PromptDialogComponent, createDialogPopupSettings({ data: { title: options.title, placeholder: options.placeholder, initialValue: options.initialValue ?? '', okButton: options.ok, cancelButton: options.cancel, }, })); return new Promise((resolve, reject) => { dialogRef.afterClosed().subscribe(result => { if (result !== undefined && result !== null) { resolve(result); } else { reject(); } }); }); } /** * Centralized error handling with i18n code lookup. * Returns true if data is OK, false if it was an error. * Replaces AngularJS p3xrCommon.generalHandleError(). */ generalHandleError(dataOrError: any): boolean { if (dataOrError === undefined) { return true; } if (!(dataOrError instanceof Error || dataOrError instanceof Object)) { dataOrError = new Error(String(dataOrError)); } if (dataOrError instanceof Error || dataOrError.status === 'error') { let error: any; if (dataOrError instanceof Error) { error = dataOrError; } else { error = dataOrError.error; } console.warn('generalHandleError'); console.error(error); // i18n code lookup const strings = this.i18n.strings(); const codes = strings.code || {}; if (typeof error === 'string' && codes.hasOwnProperty(error)) { error = new Error(codes[error]); } else if (error?.code && codes.hasOwnProperty(error.code)) { error.message = codes[error.code]; } else if (error?.message && codes.hasOwnProperty(error.message)) { error.message = codes[error.message]; } // Handle connection closed if (error?.message === 'Connection is closed.') { p3xr.state.connection = undefined; } this.alert({ title: strings.title?.error || 'Error', message: '
' + (error?.message || error) + '
', }); return false; } return true; } /** * Parse Redis INFO response and populate state. * Replaces AngularJS p3xrCommon.loadRedisInfoResponse(). */ async loadRedisInfoResponse(options: { response?: any } = {}): Promise { let response = options.response || this.lastResponse; this.lastResponse = response; if (!response) return; console.time('loadRedisInfoResponse'); const info = this.redisParser.info(response.info); const shouldSort = this.settings.keysSort() && response.keys.length <= this.settings.maxLightKeysCount; // Sort in Web Worker if needed const keys = shouldSort ? await this.treeBuilder.sortKeys(response.keys) : response.keys; // Update global p3xr.state if (p3xr?.state) { p3xr.state.info = info; p3xr.state.keysRaw = keys; p3xr.state.keysInfo = response.keysInfo; } // Update Angular signals this.state.info.set(info); this.state.keysRaw.set(keys); this.state.keysInfo.set(response.keysInfo); console.timeEnd('loadRedisInfoResponse'); } } src/ng/services/i18n.service.ts000066400000000000000000000120551517666434100167020ustar00rootroot00000000000000import { Injectable, signal, computed, effect } from '@angular/core'; declare const p3xr: any; const merge = require('lodash/merge'); /** * i18n service wrapping the existing custom translation system. * * The existing system uses function-valued translations (e.g. arrow functions * that accept params), which no standard i18n library supports. This service * wraps the existing p3xr.settings.language.translation object with Angular * signals for reactive language switching. * * Language changes are persisted to localStorage using the same key as the translation system. */ @Injectable({ providedIn: 'root' }) export class I18nService { private static readonly STORAGE_KEY = 'p3xr-language'; /** * Current language code signal. * Initialized from localStorage or browser detection, same as AngularJS boot.js. */ readonly currentLang = signal(this.detectInitialLanguage()); /** * Merged strings object: English fallback merged with current language. * Recomputes when currentLang changes. Supports function-valued translations. */ readonly strings = computed(() => { const translations = this.getTranslations(); const en = translations['en'] || {}; const current = translations[this.currentLang()] || {}; return merge({}, en, current); }); /** * List of missing translation keys in the current language (for development). */ readonly missingKeys = computed(() => { const translations = this.getTranslations(); const en = translations['en'] || {}; const current = translations[this.currentLang()] || {}; const missing: string[] = []; const isObject = (v: any) => v && typeof v === 'object' && !Array.isArray(v); const diffKeys = (base: any, target: any, path: string = '') => { Object.keys(base || {}).forEach((k) => { const nextPath = path ? `${path}.${k}` : k; if (!(target && Object.prototype.hasOwnProperty.call(target, k))) { missing.push(nextPath); } else if (isObject(base[k]) && isObject(target[k])) { diffKeys(base[k], target[k], nextPath); } }); }; try { diffKeys(en, current); } catch (e) { /* noop */ } return missing; }); constructor() { // Persist language changes to localStorage and sync with AngularJS effect(() => { const lang = this.currentLang(); this.setStorageItem(I18nService.STORAGE_KEY, lang); this.applyDocumentLanguage(lang); // Update dayjs locale try { const dayjs = require('dayjs'); const localeMap = p3xr?.settings?.language?.momentDateMap || { en: 'en', zn: 'zh-cn', ru: 'ru' }; dayjs.locale(localeMap[lang] || 'en'); } catch (e) { /* noop */ } // Log missing keys in development const missing = this.missingKeys(); if (missing.length > 0) { console.warn(`[i18n] Missing translation keys for '${lang}':`, missing); } }); } /** * Switch the active language. Lazily loads the translation chunk if not yet * cached, then triggers recomputation of the strings signal. */ setLanguage(lang: string): void { const nextLanguage = lang || 'en'; const loader: ((l: string) => Promise) | undefined = (p3xr as any)?.settings?.language?.loadTranslation; const doSwitch = () => { this.currentLang.set(nextLanguage); }; if (loader) { loader(nextLanguage).then(doSwitch, doSwitch); } else { doSwitch(); } } /** * Get available language codes. */ getAvailableLanguages(): string[] { return Object.keys(this.getTranslations()); } // --- Private helpers --- private getTranslations(): Record { return p3xr?.settings?.language?.translation || {}; } private detectInitialLanguage(): string { // Try localStorage first const storedLang = this.readStorageItem(I18nService.STORAGE_KEY); if (storedLang) return storedLang; // Auto-detect from browser (same logic as AngularJS boot.js) try { const navLang = (navigator.language || '').toLowerCase(); if (navLang.startsWith('zh')) return 'zn'; if (navLang.startsWith('ru')) return 'ru'; } catch (e) { /* noop */ } return 'en'; } private readStorageItem(name: string): string | null { try { return localStorage.getItem(name); } catch { return null; } } private setStorageItem(name: string, value: string): void { try { localStorage.setItem(name, value); } catch {} } private applyDocumentLanguage(lang: string): void { if (typeof document === 'undefined') { return; } document.documentElement.setAttribute('lang', lang === 'zn' ? 'zh' : lang); } } src/ng/services/main-command.service.ts000066400000000000000000000162371517666434100204710ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { Subject } from 'rxjs'; import { SocketService } from './socket.service'; import { CommonService } from './common.service'; import { RedisParserService } from './redis-parser.service'; import { RedisStateService } from './redis-state.service'; import { SettingsService } from './settings.service'; import { I18nService } from './i18n.service'; import { NavigationService } from './navigation.service'; declare const p3xr: any; /** * Main command service — encapsulates Redis operations previously in AngularJS p3xrMain controller. * * Provides: * - selectDatabase(): switch Redis DB index * - save(): persist Redis data to disk * - refresh(): reload keys and info from server * - statistics(): navigate to statistics and refresh * - currentDatabase getter/setter with localStorage persistence * - addKey(): broadcast new key event * * Used by main-home-header, main-treecontrol-controls, and the main page component. */ @Injectable({ providedIn: 'root' }) export class MainCommandService { readonly refreshKey$ = new Subject(); readonly keyNew$ = new Subject<{ event: Event; node?: any }>(); readonly keyDelete$ = new Subject<{ key: string; event: Event }>(); readonly keyRename$ = new Subject<{ key: string; event: Event }>(); readonly treeControlEnabled$ = new Subject(); readonly mainResizer$ = new Subject<{ drag: boolean }>(); readonly treeRefresh$ = new Subject(); readonly consoleEmbeddedResize$ = new Subject(); readonly consoleActivate$ = new Subject(); readonly consoleDeactivate$ = new Subject(); readonly connectRequest$ = new Subject<{ connection: any; disableState?: boolean }>(); readonly disconnectRequest$ = new Subject(); constructor( @Inject(SocketService) private readonly socket: SocketService, @Inject(CommonService) private readonly common: CommonService, @Inject(RedisParserService) private readonly redisParser: RedisParserService, @Inject(RedisStateService) private readonly state: RedisStateService, @Inject(SettingsService) private readonly settings: SettingsService, @Inject(I18nService) private readonly i18n: I18nService, @Inject(NavigationService) private readonly nav: NavigationService, ) {} get currentDatabase(): number { let db = p3xr.state?.currentDatabase; if (db === undefined) { db = this.readStorageItem(this.getStorageKey()); } if (db === undefined || db === null) { db = 0; } return Number(db); } set currentDatabase(value: number) { p3xr.state.currentDatabase = value; const storageKey = this.getStorageKey(); if (storageKey) { try { localStorage.setItem(storageKey, String(value)); } catch {} } } async selectDatabase(dbIndex: number): Promise { this.currentDatabase = dbIndex; this.socket.stateChanged$.next(); try { p3xr.state.page = 1; await this.socket.request({ action: 'console', payload: { command: `select ${dbIndex}` } }); const strings = this.i18n.strings(); this.common.toast({ message: strings.status?.dbChanged?.({ db: dbIndex }) ?? `Database changed to ${dbIndex}` }); await this.statistics(); } catch (e) { this.common.generalHandleError(e); } finally { this.socket.stateChanged$.next(); } } async save(): Promise { try { const response = await this.socket.request({ action: 'save' }); const info = this.redisParser.info(response.info); p3xr.state.info = info; this.state.info.set(info); const strings = this.i18n.strings(); this.common.toast({ message: strings.status?.savedRedis ?? 'Redis saved' }); } catch (e) { this.common.generalHandleError(e); } } async statistics(): Promise { try { this.navigateTo('database.statistics'); await this.refresh(); } catch (e) { this.common.generalHandleError(e); } } async refresh(options: { withoutParent?: boolean } = {}): Promise { const { withoutParent = false } = options; console.time('refresh'); try { const payload: any = {}; if (!p3xr.settings?.searchClientSide && typeof p3xr.state?.search === 'string' && p3xr.state.search.length > 0) { if (p3xr.settings?.searchStartsWith) { payload.match = p3xr.state.search + '*'; } else { payload.match = '*' + p3xr.state.search + '*'; } } const response = await this.socket.request({ action: 'refresh', payload }); p3xr.state.dbsize = response.dbsize; p3xr.state.redisChanged = true; this.state.dbsize.set(response.dbsize); await this.common.loadRedisInfoResponse({ response }); // Tell tree to rebuild with new keys this.treeRefresh$.next(); if (!withoutParent) { this.refreshKey$.next(); } } catch (e) { this.common.generalHandleError(e); } finally { console.timeEnd('refresh'); this.socket.stateChanged$.next(); } } addKey(options: { event: Event; node?: any }): void { const { event, node } = options; event.stopPropagation(); this.keyNew$.next({ event, node }); } async disconnect(): Promise { const conn = p3xr.state?.connection; const storageKey = p3xr.settings?.connectInfo?.storageKey; // Clear state + storage immediately for instant UI feedback if (storageKey) { try { localStorage.removeItem(storageKey); } catch {} } p3xr.state.connection = undefined; p3xr.state.redisConnections = {}; p3xr.state.monitor = false; this.state.connection.set(undefined); this.state.redisConnections.set({}); this.socket.stateChanged$.next(); try { await this.socket.request({ action: 'connection-disconnect', payload: { connectionId: conn?.id }, }); } catch { // Ignore — state already cleared } finally { this.nav.navigateTo('settings'); } } navigateTo(state: string, params?: any): void { this.nav.navigateTo(state, params); } // --- Private helpers --- private getStorageKey(): string { try { return p3xr.settings?.connection?.getStorageKeyCurrentDatabase?.(p3xr.state?.connection?.id) ?? ''; } catch { return ''; } } private readStorageItem(name: string): string | null { if (!name) return null; try { return localStorage.getItem(name); } catch { return null; } } } src/ng/services/navigation.service.ts000066400000000000000000000043611517666434100202630ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { Router } from '@angular/router'; /** * Centralized navigation service — replaces AngularJS UI-Router $state.go(). * * Maps the old UI-Router state names to Angular Router paths: * - 'settings' → /settings * - 'database.statistics' → /database/statistics * - 'database.key' → /database/key/:key * - 'socketio-error' → /socketio-error * * Legacy 'main.*' names are supported for backward compatibility. */ @Injectable({ providedIn: 'root' }) export class NavigationService { constructor(@Inject(Router) private readonly router: Router) {} /** * Navigate using state name. */ navigateTo(state: string, params?: any): void { switch (state) { case 'info': this.router.navigate(['/info']); break; case 'settings': this.router.navigate(['/settings']); break; case 'monitoring': this.router.navigate(['/monitoring']); break; case 'search': this.router.navigate(['/search']); break; case 'database.statistics': case 'main.statistics': this.router.navigate(['/database/statistics']); break; case 'database.key': case 'main.key': this.router.navigate(['/database/key', params?.key ?? '']); break; case 'socketio-error': this.router.navigate(['/socketio-error'], { state: { error: params?.error } }); break; default: console.warn(`[NavigationService] Unknown state: ${state}`); this.router.navigate(['/settings']); } } /** * Get the current route URL. */ get currentUrl(): string { return this.router.url; } /** * Get a route parameter (for key viewer). */ getParam(name: string): string | null { const url = this.router.url; if (name === 'key' && url.startsWith('/database/key/')) { return decodeURIComponent(url.substring('/database/key/'.length)); } return null; } } src/ng/services/redis-parser.service.ts000066400000000000000000000156111517666434100205240ustar00rootroot00000000000000import { Injectable } from '@angular/core'; declare const p3xr: any; /** * Angular service that mirrors the AngularJS p3xrRedisParser factory. * Pure logic — no AngularJS dependencies. During hybrid mode, both this * service and the AngularJS factory coexist. Future Angular components * inject this service; existing AngularJS components keep using the factory. */ @Injectable({ providedIn: 'root' }) export class RedisParserService { /** * Parses a key=value line into an object. * e.g. "keys=10,expires=5" → { keys: "10", expires: "5" } */ array(options: { line: string; divider?: string; fieldDivider?: string }): Record { const { line } = options; const divider = options.divider ?? ','; const fieldDivider = options.fieldDivider ?? '='; const rows = line.split(divider); const obj: Record = {}; for (const row of rows) { const rowLine = row.split(fieldDivider); const rowLineData = rowLine[1] ?? ''; obj[rowLine[0]] = rowLineData.trim(); } return obj; } /** * Parses Redis INFO command output into a nested object grouped by section. */ info(str: string): any { const lines = str.split('\n'); const obj: any = {}; let section: string | undefined; let currentSectionObj: any = {}; let hadSection = false; let pikaIndex = 0; for (const line of lines) { if (line.startsWith('#')) { if (hadSection) { continue; } hadSection = true; if (section !== undefined) { obj[section] = currentSectionObj; } section = line.substring(1).toLowerCase().trim(); currentSectionObj = {}; } else if (line.length > 2) { hadSection = false; if (line.includes(':')) { const lineArray = line.split(':'); const value = lineArray[1] ?? ''; currentSectionObj[lineArray[0]] = value.includes(',') ? this.array({ line: value.trim() }) : value.trim(); } else { // pika format const [key, ...rest] = line.split(/ (.+)/); const values = rest[0] ?? ''; const value = values .split(',') .map((item: string) => `${pikaIndex}-${item.trim()}`) .join(','); if (currentSectionObj.hasOwnProperty('db0')) { Object.assign( currentSectionObj['db0'], value.includes(',') ? this.array({ line: value.trim() }) : value.trim() ); } else { currentSectionObj['db0'] = value.includes(',') ? this.array({ line: value.trim() }) : value.trim(); } pikaIndex++; } } } if (section !== undefined && Object.keys(currentSectionObj).length > 0) { obj[section] = currentSectionObj; } obj.keyspaceDatabases = {}; if (obj.hasOwnProperty('keyspace')) { Object.keys(obj.keyspace).forEach((key) => { const dbIndex = parseInt(key.substring(2)); obj.keyspaceDatabases[dbIndex] = true; }); } return obj; } /** * Converts a flat list of Redis keys into a hierarchical tree structure. * Used by the tree control to display keys grouped by divider (default ':'). */ keysToTreeControl(options: { keys: string[]; divider?: string; keysInfo?: any; savedExpandedNodes?: any[]; }): { nodes: any[]; expandedNodes: any[] } { const { keys } = options; const divider = options.divider ?? p3xr?.settings?.redisTreeDivider ?? ':'; const keysInfo = options.keysInfo ?? p3xr?.state?.keysInfo ?? {}; const savedExpandedNodes = options.savedExpandedNodes ?? []; const mainNodes: any[] = []; const newExpandedNodes: any[] = []; const recursiveNodes = (splitKey: string[], level: number = 0, nodes: any[] = mainNodes) => { let foundNode: any = false; if (level + 1 < splitKey.length) { for (const node of nodes) { if (node.label === splitKey[level] && node.type === 'folder') { foundNode = node; } } } if (!foundNode) { const defaultFoundNode: any = { label: splitKey[level], key: splitKey.slice(0, level + 1).join(divider), children: [], childCount: 0, type: level + 1 === splitKey.length ? 'element' : 'folder', }; if (defaultFoundNode.type === 'element') { defaultFoundNode.keysInfo = keysInfo[defaultFoundNode.key]; } nodes.push(defaultFoundNode); foundNode = defaultFoundNode; for (const saveExpandedNode of savedExpandedNodes) { if (saveExpandedNode.key === foundNode.key) { newExpandedNodes.push(foundNode); } } } if (level + 1 < splitKey.length) { recursiveNodes(splitKey, level + 1, foundNode.children); } }; for (const key of keys) { const splitkey = divider === '' ? [key] : key.split(divider); recursiveNodes(splitkey); } const recursiveKeyCount = (node: any) => { node.childCount = node.children.filter((child: any) => child.type === 'element').length; for (const child of node.children) { recursiveKeyCount(child); if (child.type === 'folder') { node.childCount += child.childCount; } } }; for (const node of mainNodes) { recursiveKeyCount(node); } return { nodes: mainNodes, expandedNodes: newExpandedNodes }; } /** * Parses console command response into a display string. */ consoleParse(responseResult: any): string { if (typeof responseResult === 'object') { let result = ''; Object.keys(responseResult).forEach((key) => { if (result !== '') { result += '\n'; } result += responseResult[key]; }); return result; } else { return responseResult; } } } src/ng/services/redis-state.service.ts000066400000000000000000000114341517666434100203470ustar00rootroot00000000000000import { Injectable, Inject, signal, computed } from '@angular/core'; import { SettingsService } from './settings.service'; declare const p3xr: any; /** * Runtime state service using Angular signals. * * Reads from the global p3xr.state object and exposes it through signals * for reactive Angular components. */ @Injectable({ providedIn: 'root' }) export class RedisStateService { // --- Writable signals for runtime state --- readonly theme = signal(this.p3xrState?.theme); readonly connection = signal(this.p3xrState?.connection); readonly currentDatabase = signal(this.p3xrState?.currentDatabase); readonly databaseIndexes = signal(this.p3xrState?.databaseIndexes ?? [0]); readonly connections = signal(this.p3xrState?.connections ?? { list: [] }); readonly redisConnections = signal>(this.p3xrState?.redisConnections ?? {}); readonly keysRaw = signal(this.p3xrState?.keysRaw ?? []); readonly keysInfo = signal(this.p3xrState?.keysInfo); readonly search = signal(this.p3xrState?.search ?? ''); readonly page = signal(1); readonly info = signal(this.p3xrState?.info); readonly dbsize = signal(this.p3xrState?.dbsize); readonly redisChanged = signal(false); readonly failed = signal(false); readonly monitor = signal(false); readonly monitorPattern = signal('*'); readonly commands = signal([]); readonly cfg = signal(this.p3xrState?.cfg); readonly version = signal(this.p3xrState?.version); readonly donated = signal(this.p3xrState?.donated ?? false); readonly hasProOrEnterpriseJsonBinary = signal(this.p3xrState?.hasProOrEnterpriseJsonBinary ?? false); readonly license = signal(this.p3xrState?.license ?? { tier: 'free', valid: false, reason: 'LICENSE_MISSING', features: [], }); // --- Computed values --- readonly themeLayout = computed(() => { const t = this.theme(); return t ? t + 'Layout' : undefined; }); readonly themeCommon = computed(() => { const t = this.theme(); return t ? t + 'Common' : undefined; }); readonly filteredKeys = computed(() => { let keys = this.keysRaw().slice(); const search = this.search(); const settings = this.settings; // Apply client-side search filter if (settings.searchClientSide() && typeof search === 'string' && search.length > 0) { if (settings.searchStartsWith()) { keys = keys.filter((key) => key.startsWith(search)); } else { keys = keys.filter((key) => key.includes(search)); } } return keys; }); readonly paginatedKeys = computed(() => { const keys = this.filteredKeys(); const pageSize = this.settings.pageCount(); if (keys.length <= pageSize) { return keys; } const start = (this.page() - 1) * pageSize; return keys.slice(start, start + pageSize); }); readonly pages = computed(() => { return Math.ceil(this.filteredKeys().length / this.settings.pageCount()); }); constructor(@Inject(SettingsService) private settings: SettingsService) {} // --- Helper to access global p3xr.state during hybrid mode --- private get p3xrState(): any { return p3xr?.state; } /** * Syncs the signals from the global p3xr.state object. * Call this after AngularJS modifies p3xr.state (e.g. after a socket response) * to keep Angular components up-to-date during hybrid mode. */ syncFromGlobal(): void { const state = this.p3xrState; if (!state) return; this.theme.set(state.theme); this.connection.set(state.connection); this.currentDatabase.set(state.currentDatabase); this.databaseIndexes.set(state.databaseIndexes ?? [0]); this.connections.set(state.connections); this.redisConnections.set(state.redisConnections ?? {}); this.keysRaw.set(state.keysRaw ?? []); this.keysInfo.set(state.keysInfo); this.info.set(state.info); this.dbsize.set(state.dbsize); this.failed.set(state.failed ?? false); this.monitor.set(state.monitor ?? false); this.cfg.set(state.cfg); this.version.set(state.version); this.donated.set(state.donated ?? false); this.hasProOrEnterpriseJsonBinary.set(state.hasProOrEnterpriseJsonBinary ?? false); this.license.set(state.license); } /** * Resets connections to default state. */ resetConnections(): void { this.connections.set({ list: [] }); } } src/ng/services/settings.service.ts000066400000000000000000000104561517666434100177660ustar00rootroot00000000000000import { Injectable, signal, computed, effect } from '@angular/core'; declare const p3xr: any; /** * LocalStorage-backed settings service using Angular signals. * * Each setting is a WritableSignal that reads its initial value from * localStorage and persists changes back to localStorage. */ @Injectable({ providedIn: 'root' }) export class SettingsService { // --- LocalStorage-backed signals --- readonly redisTreeDivider = signal(this.getStorage('p3xr-main-treecontrol-divider', ':')); readonly jsonFormat = signal(this.getStorageInt('p3xr-json-format', 4)); readonly animation = signal(this.getStorageInt('p3xr-animation-settings', 0) === 1); readonly maxValueDisplay = signal(this.getStorageInt('p3xr-main-treecontrol-max-value-display', 1024)); readonly maxKeys = signal(this.clampMaxKeys(this.getStorageInt('p3xr-max-keys', 1000))); readonly keysSort = signal(this.getStorageBool('p3xr-main-treecontrol-key-sort', true)); readonly searchClientSide = signal(this.getStorageBool('p3xr-main-treecontrol-search-client-mode', false)); readonly searchStartsWith = signal(this.getStorageBool('p3xr-main-treecontrol-search-starts-with', false)); readonly pageCount = signal(this.getStorageInt('p3xr-main-treecontrol-page-size', 250)); readonly keyPageCount = signal(this.getStorageInt('p3xr-main-key-page-size', 5)); readonly language = signal(this.getStorage('p3xr-language', 'en')); // --- Computed values --- readonly maxKeysMax = 100000; readonly maxLightKeysCount = 110000; constructor() { // Persist signal changes back to localStorage effect(() => { this.setStorage('p3xr-main-treecontrol-divider', this.redisTreeDivider()); }); effect(() => { this.setStorage('p3xr-json-format', String(this.jsonFormat())); }); effect(() => { this.setStorage('p3xr-animation-settings', this.animation() ? '1' : '0'); }); effect(() => { this.applyAnimationClass(this.animation()); }); effect(() => { this.setStorage('p3xr-main-treecontrol-max-value-display', String(this.maxValueDisplay())); }); effect(() => { this.setStorage('p3xr-max-keys', String(this.maxKeys())); }); effect(() => { this.setStorage('p3xr-main-treecontrol-key-sort', String(this.keysSort())); }); effect(() => { this.setStorage('p3xr-main-treecontrol-search-client-mode', String(this.searchClientSide())); }); effect(() => { this.setStorage('p3xr-main-treecontrol-search-starts-with', String(this.searchStartsWith())); }); effect(() => { this.setStorage('p3xr-main-treecontrol-page-size', String(this.pageCount())); }); effect(() => { this.setStorage('p3xr-main-key-page-size', String(this.keyPageCount())); }); effect(() => { this.setStorage('p3xr-language', this.language()); }); } // --- Storage helpers --- private getStorage(name: string, defaultValue: string): string { try { const value = localStorage.getItem(name); return value !== null ? value : defaultValue; } catch { return defaultValue; } } private getStorageInt(name: string, defaultValue: number): number { const value = this.getStorage(name, ''); if (!value) return defaultValue; const parsed = parseInt(value, 10); return isNaN(parsed) ? defaultValue : parsed; } private getStorageBool(name: string, defaultValue: boolean): boolean { const value = this.getStorage(name, ''); if (!value) return defaultValue; if (value === 'true') return true; if (value === 'false') return false; return defaultValue; } private clampMaxKeys(value: number): number { if (isNaN(value) || value < 5 || value > this.maxKeysMax) { return 1000; } return value; } private setStorage(name: string, value: string): void { try { localStorage.setItem(name, value); } catch { /* ignore */ } } private applyAnimationClass(enabled: boolean): void { if (typeof document === 'undefined') { return; } document.body.classList.toggle('p3xr-animation', enabled); document.body.classList.toggle('p3xr-no-animation', !enabled); } } src/ng/services/shortcuts.service.ts000066400000000000000000000131751517666434100201650ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { I18nService } from './i18n.service'; import { NavigationService } from './navigation.service'; import { MainCommandService } from './main-command.service'; import { SocketService } from './socket.service'; import { CommonService } from './common.service'; import { CommandPaletteDialogService } from '../dialogs/command-palette-dialog.service'; declare const p3xr: any; export interface ShortcutDef { key: string; ctrlKey?: boolean; shiftKey?: boolean; altKey?: boolean; label: string; descriptionKey: string; action: () => void; } @Injectable({ providedIn: 'root' }) export class ShortcutsService { private shortcuts: ShortcutDef[] = []; private readonly isElectron: boolean; constructor( @Inject(I18nService) private i18n: I18nService, @Inject(NavigationService) private nav: NavigationService, @Inject(MainCommandService) private cmd: MainCommandService, @Inject(SocketService) private socket: SocketService, @Inject(CommonService) private common: CommonService, @Inject(CommandPaletteDialogService) private commandPalette: CommandPaletteDialogService, ) { this.isElectron = /electron/i.test(navigator.userAgent); if (this.isElectron) { this.initShortcuts(); } } private get isConnected(): boolean { return !!p3xr?.state?.connection; } private requireConnection(action: () => void): void { if (this.isConnected) { action(); } else { const strings = this.i18n.strings(); this.common.toast(strings?.label?.connectFirst || 'Connect to a Redis server first'); } } private requireConnectionAndHome(action: () => void): void { if (!this.isConnected) { const strings = this.i18n.strings(); this.common.toast(strings?.label?.connectFirst || 'Connect to a Redis server first'); return; } // Navigate to home if not already there if (!this.nav.currentUrl.startsWith('/database')) { this.nav.navigateTo('database.statistics'); setTimeout(() => action(), 300); } else { action(); } } private initShortcuts(): void { this.shortcuts = [ { key: 'r', ctrlKey: true, label: 'Ctrl+R', descriptionKey: 'shortcutRefresh', action: () => this.requireConnection(() => this.cmd.treeRefresh$.next()), }, { key: 'F5', label: 'F5', descriptionKey: 'shortcutRefresh', action: () => this.requireConnection(() => this.cmd.treeRefresh$.next()), }, { key: 'f', ctrlKey: true, label: 'Ctrl+F', descriptionKey: 'shortcutSearch', action: () => this.requireConnectionAndHome(() => { const el = document.querySelector('.p3xr-database-treecontrol-controls-search input'); if (el) { el.focus(); } }), }, { key: 'n', ctrlKey: true, label: 'Ctrl+N', descriptionKey: 'shortcutNewKey', action: () => this.requireConnectionAndHome(() => { this.cmd.keyNew$.next({ event: new Event('shortcut') }); }), }, { key: 'k', ctrlKey: true, label: 'Ctrl+K', descriptionKey: 'shortcutCommandPalette', action: () => this.commandPalette.show(), }, { key: 'd', ctrlKey: true, label: 'Ctrl+D', descriptionKey: 'shortcutDisconnect', action: () => this.requireConnection(() => this.cmd.disconnectRequest$.next()), }, ]; } isEnabled(): boolean { return this.isElectron; } getShortcuts(): ShortcutDef[] { return this.shortcuts; } getShortcutsWithDescriptions(): Array<{ key: string; description: string }> { const strings = this.i18n.strings(); return this.shortcuts .filter((s, i, arr) => arr.findIndex(x => x.descriptionKey === s.descriptionKey) === i) .map(s => ({ key: s.label, description: strings?.label?.[s.descriptionKey] || s.descriptionKey, })); } handleKeydown(event: KeyboardEvent): boolean { if (!this.isElectron) return false; const target = event.target as HTMLElement; const tag = target?.tagName?.toLowerCase(); if (tag === 'input' || tag === 'textarea' || target?.closest('.cm-editor')) { return false; } for (const shortcut of this.shortcuts) { const ctrlMatch = shortcut.ctrlKey ? event.ctrlKey || event.metaKey : !event.ctrlKey && !event.metaKey; const shiftMatch = shortcut.shiftKey ? event.shiftKey : !event.shiftKey; const altMatch = shortcut.altKey ? event.altKey : !event.altKey; const keyMatch = event.key.toLowerCase() === shortcut.key.toLowerCase() || event.key === shortcut.key; if (ctrlMatch && shiftMatch && altMatch && keyMatch) { event.preventDefault(); event.stopPropagation(); shortcut.action(); return true; } } return false; } } src/ng/services/socket.service.ts000066400000000000000000000273521517666434100174210ustar00rootroot00000000000000import { Injectable, Inject, ApplicationRef } from '@angular/core'; import { Subject } from 'rxjs'; declare const p3xr: any; declare const io: any; /** * Angular Socket.IO service — standalone, no AngularJS dependency. * All callbacks run inside Angular's zone for automatic change detection. */ @Injectable({ providedIn: 'root' }) export class SocketService { private ioClient: any; private reconnect = false; private licenseRefreshInterval: any; private connectErrorWas = false; readonly connections$ = new Subject(); readonly redisDisconnected$ = new Subject(); readonly redisStatus$ = new Subject(); readonly configuration$ = new Subject(); readonly licenseUpdate$ = new Subject(); readonly socketError$ = new Subject(); readonly stateChanged$ = new Subject(); constructor(@Inject(ApplicationRef) private appRef: ApplicationRef) { this.initConnection(); } tick(): void { setTimeout(() => { this.appRef.tick(); }); } private initConnection(): void { const ioOptions: any = { rejectUnauthorized: false, path: '/socket.io', secure: true, }; if ((globalThis as any).p3xrDevMode === true) { ioOptions.transports = ['websocket']; } this.ioClient = io.connect(p3xr.api.host, ioOptions); this.ioClient.on('connect', async () => { if (this.reconnect) { console.log('p3xr-socket RE-connected', this.ioClient.id); } else { console.log('p3xr-socket connected', this.ioClient.id); } this.reconnect = true; if (this.licenseRefreshInterval) { clearInterval(this.licenseRefreshInterval); } this.licenseRefreshInterval = setInterval(() => { this.refreshLicenseStatus(); }, 1000 * 60 * 60); await this.refreshLicenseStatus(); }); this.ioClient.on('disconnect', () => { if (this.licenseRefreshInterval) { clearInterval(this.licenseRefreshInterval); this.licenseRefreshInterval = undefined; } location.reload(); }); this.ioClient.on('info-interval', (data: any) => { this.applyLicenseData(data); this.tick(); }); this.ioClient.on('error', (error: any) => { this.handleSocketError(error); }); this.ioClient.on('connect_error', (error: any) => { this.handleSocketError(error); }); this.ioClient.on('connections', (data: any) => { if (data.status === 'error') { p3xr.connectionsReset(); this.tick(); return; } p3xr.state.connections = data.connections; this.connections$.next(data); this.tick(); }); this.ioClient.on('redis-disconnected', (data: any) => { if (p3xr.state.connection !== undefined && p3xr.state.connection.id === data.connectionId) { p3xr.state.monitor = false; p3xr.state.connection = undefined; if (data.status === 'error') { const msg = p3xr.strings?.status?.redisDisconnected?.(data) ?? 'Redis disconnected'; this.showToast(msg); } else if (data.status === 'code') { const codes = p3xr.strings?.code ?? {}; const msg = codes[data.code] ?? `unknown redis disconnect code: ${data.code}`; this.showToast(msg); } this.redisDisconnected$.next(data); this.tick(); this.request({ action: 'trigger-redis-disconnect', enableResponse: false }).catch(() => {}); } }); this.ioClient.on('redis-status', (data: any) => { p3xr.state.redisConnections = data.redisConnections; this.redisStatus$.next(data); this.tick(); }); let receivedVersion = false; this.ioClient.on('configuration', (data: any) => { p3xr.state.cfg = data; if (data.snapshot === true) { p3xr.state.version = 'SNAPSHOT'; } else { p3xr.state.version = 'v' + data.version; if (!receivedVersion) { receivedVersion = true; try { (window as any).gtag?.('config', p3xr.settings.googleAnalytics, { page_path: '/version/' + p3xr.state.version }); } catch { /* noop */ } } } this.configuration$.next(data); this.tick(); }); } // --- License --- private applyLicenseData(data: any = {}): void { const nextLicense: any = Object.assign({ licenseEditable: true, editableActive: true, disabled: false, hasLicenseKey: false, licenseKeyMasked: '', tier: 'free', valid: false, reason: 'LICENSE_MISSING', licenseStatus: 'inactive', maxDevices: null, activeDevices: null, deviceLease: null, daysLeft: null, features: [], }, (data.license && typeof data.license === 'object') ? data.license : {}); if (typeof data.hasLicenseKey === 'boolean') { nextLicense.hasLicenseKey = data.hasLicenseKey; } else { nextLicense.hasLicenseKey = nextLicense.hasLicenseKey === true; } if (typeof data.licenseEditable === 'boolean') { nextLicense.licenseEditable = data.licenseEditable; } else if (typeof data.editableActive === 'boolean') { nextLicense.licenseEditable = data.editableActive; } else if (typeof data.disabled === 'boolean') { nextLicense.licenseEditable = !data.disabled; } else if (typeof nextLicense.licenseEditable !== 'boolean') { nextLicense.licenseEditable = true; } nextLicense.editableActive = nextLicense.licenseEditable; nextLicense.disabled = !nextLicense.licenseEditable; if (typeof data.licenseKeyMasked === 'string') { nextLicense.licenseKeyMasked = data.licenseKeyMasked; } else if (typeof nextLicense.licenseKeyMasked !== 'string') { nextLicense.licenseKeyMasked = ''; } if (typeof data.tier === 'string' && data.tier.length > 0) { nextLicense.tier = data.tier; } if (!Array.isArray(nextLicense.features)) { nextLicense.features = []; } if (!nextLicense.deviceLease || typeof nextLicense.deviceLease !== 'object') { nextLicense.deviceLease = null; } if (typeof nextLicense.maxDevices !== 'number') { nextLicense.maxDevices = nextLicense.deviceLease?.maxDevices ?? null; } if (typeof nextLicense.activeDevices !== 'number') { nextLicense.activeDevices = nextLicense.deviceLease?.activeDevices ?? null; } const wasDonated = p3xr.state.donated === true; // All features are free — always enterprise const isDonated = true; const activeForFeatures = true; const hasProOrEnterpriseJsonBinary = true; p3xr.state.license = nextLicense; p3xr.state.donated = isDonated; // All features are free — always enterprise p3xr.state.hasProOrEnterpriseJsonBinary = true; // p3xr.state.hasProOrEnterpriseJsonBinary = hasProOrEnterpriseJsonBinary; if (p3xr.state.cfg && typeof data.readonlyConnections === 'boolean') { p3xr.state.cfg.readonlyConnections = data.readonlyConnections; } if (wasDonated !== isDonated) { try { if (!p3xr.isBot?.()) { (window as any).gtag?.('config', p3xr.settings.googleAnalytics, { page_path: isDonated ? '/donated' : '/free' }); } } catch { /* noop */ } } this.licenseUpdate$.next(nextLicense); } private async refreshLicenseStatus(): Promise { try { const data = await this.request({ action: 'license-status' }); this.applyLicenseData(data); } catch (e: any) { console.warn('license-status refresh failed', e.message); } } private handleSocketError(error: any): void { if (!this.connectErrorWas) { this.connectErrorWas = true; this.socketError$.next(error); } } private showToast(message: string): void { try { const snackBar = (globalThis as any).__p3xr_snackbar; if (snackBar) { const ref = snackBar.open(message, 'x', { duration: 5000, horizontalPosition: 'right', verticalPosition: 'bottom', }); ref.onAction().subscribe(() => ref.dismiss()); } } catch { /* noop */ } } // --- Request API --- request(options: { action: string; payload?: any; enableResponse?: boolean; }): Promise { if (!this.ioClient) { return Promise.reject(new Error('Socket.IO client unavailable')); } if (!options.payload) { options.payload = {}; } options.payload.maxKeys = parseInt(p3xr.settings?.maxKeys ?? '10000'); const enableResponse = options.enableResponse !== false; if (!enableResponse) { this.ioClient.emit('p3xr-request', options); return Promise.resolve(); } return new Promise((resolve, reject) => { const requestId = p3xr.nextId(); (options as any).requestId = requestId; const responseEvent = `p3xr-response-${requestId}`; let timeout: any; const response = (data: any) => { clearTimeout(timeout); this.ioClient.off(responseEvent); if (data?.status === 'ok') { if (data.license || data.licenseKey || data.donated || options.action === 'license-status') { this.applyLicenseData(data); } resolve(data); } else { let errMsg = 'Unknown error'; try { const err = data?.error; if (typeof err === 'string') { errMsg = err; } else if (err?.message) { errMsg = err.message; } else if (err !== undefined && err !== null) { errMsg = String(err); } } catch { /* noop */ } reject(new Error(errMsg)); } // Tick after await continuations settle (avoids NG0100 in dev mode) this.tick(); }; timeout = setTimeout(() => { this.ioClient.off(responseEvent, response); const msg = p3xr.strings?.label?.socketIoTimeout?.({ timeout: p3xr.settings.socket.timeout }) ?? `Socket.IO request timeout (${p3xr.settings.socket.timeout}ms)`; reject(new Error(msg)); this.tick(); }, p3xr.settings.socket.timeout); this.ioClient.on(responseEvent, response); this.ioClient.emit('p3xr-request', options); }); } getClient(): any { return this.ioClient; } } src/ng/services/theme.service.ts000066400000000000000000000163501517666434100172270ustar00rootroot00000000000000import { Injectable, signal, computed, effect } from '@angular/core'; declare const p3xr: any; /** * Theme management service using Angular signals. * * Manages theme selection, persistence (localStorage), dark/light classification, * and body class toggling. During hybrid mode, the AngularJS p3xrTheme provider * handles the AngularJS Material-specific parts ($mdThemingProvider, $mdColors, * dynamic CSS injection via jQuery). This service handles the framework-agnostic * parts that both Angular and AngularJS components need. * * After full migration (Phase 6), this service will also manage Angular Material * theming via Sass-compiled CSS class switching. * * Theme architecture: * - Each theme has 3 sub-themes: {Name}, {Name}Layout, {Name}Common * - Themes are classified as dark or light * - Current theme is persisted to localStorage key 'p3xr-theme' * - Body gets class 'p3xr-theme-dark' or 'p3xr-theme-light' * - document.documentElement gets data-color-scheme="dark"/"light" (for scrollbar styling) */ @Injectable({ providedIn: 'root' }) export class ThemeService { private static readonly STORAGE_KEY = 'p3xr-theme'; private static readonly AUTO_THEME = 'auto'; /** Theme classification: which themes are dark, which are light */ private static readonly DARK_THEMES = [ 'p3xrThemeDarkNeu', 'p3xrThemeDark', 'p3xrThemeDarkoBluo', 'p3xrThemeMatrix', ]; private static readonly LIGHT_THEMES = [ 'p3xrThemeLight', 'p3xrThemeEnterprise', 'p3xrThemeRedis', ]; /** All available theme names */ static readonly ALL_THEMES = [...ThemeService.DARK_THEMES, ...ThemeService.LIGHT_THEMES]; /** * Maps AngularJS theme names to Angular Material CSS class suffixes. * AngularJS: 'p3xrThemeDark' → Angular Material: 'p3xr-mat-theme-dark' */ private static readonly THEME_CSS_CLASS_MAP: Record = { 'p3xrThemeDark': 'p3xr-mat-theme-dark', 'p3xrThemeDarkNeu': 'p3xr-mat-theme-dark-neu', 'p3xrThemeDarkoBluo': 'p3xr-mat-theme-darko-bluo', 'p3xrThemeMatrix': 'p3xr-mat-theme-matrix', 'p3xrThemeLight': 'p3xr-mat-theme-light', 'p3xrThemeEnterprise': 'p3xr-mat-theme-enterprise', 'p3xrThemeRedis': 'p3xr-mat-theme-redis', }; /** Default theme based on system preference */ private static readonly DEFAULT_THEME = (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches) ? 'p3xrThemeDark' : 'p3xrThemeEnterprise'; // --- Signals --- /** Current theme name signal, persisted to localStorage */ readonly currentTheme: ReturnType>; /** Whether the current theme is a dark theme */ readonly isDark = computed(() => ThemeService.DARK_THEMES.includes(this.currentTheme())); /** Layout sub-theme name (e.g. 'p3xrThemeDarkLayout') */ readonly themeLayout = computed(() => this.currentTheme() + 'Layout'); /** Common sub-theme name (e.g. 'p3xrThemeDarkCommon') */ readonly themeCommon = computed(() => this.currentTheme() + 'Common'); /** Whether the current mode is auto (follows system) */ readonly isAuto: ReturnType>; constructor() { const initial = this.getInitialTheme(); const isAutoMode = initial === ThemeService.AUTO_THEME; this.isAuto = signal(isAutoMode); // If auto, resolve to system preference const resolvedTheme = isAutoMode ? ThemeService.getSystemTheme() : initial; this.currentTheme = signal(resolvedTheme); // Apply body classes and persist to localStorage on theme change effect(() => { const theme = this.currentTheme(); this.applyTheme(theme); }); // Listen for system dark/light mode changes if (typeof window !== 'undefined' && window.matchMedia) { window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { if (this.isAuto()) { this.currentTheme.set(e.matches ? 'p3xrThemeDark' : 'p3xrThemeEnterprise'); } }); } } private static getSystemTheme(): string { return (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches) ? 'p3xrThemeDark' : 'p3xrThemeEnterprise'; } /** * Switch to a different theme. */ setTheme(themeName: string): void { if (themeName === ThemeService.AUTO_THEME) { this.isAuto.set(true); const resolved = ThemeService.getSystemTheme(); this.currentTheme.set(resolved); return; } if (!ThemeService.ALL_THEMES.includes(themeName)) { console.warn(`[ThemeService] Unknown theme: ${themeName}`); return; } this.isAuto.set(false); this.currentTheme.set(themeName); } /** * Get theme display name from internal name. * e.g. 'p3xrThemeDark' → 'Dark' */ getDisplayName(themeName: string): string { return themeName.replace('p3xrTheme', ''); } /** * Generate the internal theme name from a raw display name. * e.g. 'Dark' → 'p3xrThemeDark' */ generateThemeName(rawName: string): string { return 'p3xrTheme' + rawName[0].toUpperCase() + rawName.substring(1); } // --- Private helpers --- private getInitialTheme(): string { const stored = this.readStorageItem(ThemeService.STORAGE_KEY); if (!stored) return ThemeService.AUTO_THEME; return stored; } private applyTheme(themeName: string): void { const dark = ThemeService.DARK_THEMES.includes(themeName); this.setStorageItem(ThemeService.STORAGE_KEY, this.isAuto() ? ThemeService.AUTO_THEME : themeName); if (typeof document !== 'undefined') { document.body.classList.remove('p3xr-theme-light', 'p3xr-theme-dark'); document.body.classList.add(dark ? 'p3xr-theme-dark' : 'p3xr-theme-light'); const allMatClasses = Object.values(ThemeService.THEME_CSS_CLASS_MAP); document.body.classList.remove(...allMatClasses); const matClass = ThemeService.THEME_CSS_CLASS_MAP[themeName]; if (matClass) { document.body.classList.add(matClass); } document.documentElement.style.display = 'none'; document.documentElement.setAttribute('data-color-scheme', dark ? 'dark' : 'light'); document.body.clientWidth; document.documentElement.style.display = ''; // Notify Electron shell (iframe parent) about theme change for scrollbar styling try { window.parent?.postMessage({ type: 'p3x-theme-change', dark: dark }, '*'); } catch (e) { /* not in iframe or cross-origin */ } } if (p3xr?.state) { p3xr.state.theme = themeName; } } private readStorageItem(name: string): string | null { try { return localStorage.getItem(name); } catch { return null; } } private setStorageItem(name: string, value: string): void { try { localStorage.setItem(name, value); } catch {} } } src/ng/services/tree-builder.service.ts000066400000000000000000000224651517666434100205140ustar00rootroot00000000000000import { Injectable } from '@angular/core'; /** * Offloads keysToTreeControl and key sorting to a Web Worker. * Falls back to main-thread execution if Workers are unavailable. */ @Injectable({ providedIn: 'root' }) export class TreeBuilderService { private worker: Worker | null = null; private nextRequestId = 0; private pendingResolves = new Map void>(); constructor() { this.initWorker(); } private initWorker(): void { try { const blob = new Blob([ `(${workerFn.toString()})()` ], { type: 'application/javascript' }); this.worker = new Worker(URL.createObjectURL(blob)); this.worker.onmessage = (e: MessageEvent) => { const { _requestId, ...result } = e.data; const resolve = this.pendingResolves.get(_requestId); if (resolve) { this.pendingResolves.delete(_requestId); resolve(result); } }; this.worker.onerror = () => { this.worker = null; }; } catch { this.worker = null; } } /** * Build tree from keys — runs in Web Worker. */ keysToTreeControl(options: { keys: string[]; divider: string; keysInfo: any; savedExpandedNodes?: any[]; }): Promise<{ nodes: any[]; expandedNodes: any[] }> { if (this.worker) { const id = ++this.nextRequestId; return new Promise((resolve) => { this.pendingResolves.set(id, resolve); this.worker!.postMessage({ _requestId: id, action: 'buildTree', keys: options.keys, divider: options.divider, keysInfo: options.keysInfo, savedExpandedNodes: options.savedExpandedNodes ?? [], }); }); } return Promise.resolve(buildTreeSync(options)); } /** * Sort keys with natural compare — runs in Web Worker. */ sortKeys(keys: string[]): Promise { if (this.worker) { const id = ++this.nextRequestId; return new Promise((resolve) => { this.pendingResolves.set(id, (result: any) => resolve(result.keys)); this.worker!.postMessage({ _requestId: id, action: 'sortKeys', keys, }); }); } return Promise.resolve(keys.sort(naturalCompare())); } } // ============================================================================ // Worker function — serialized into a Blob URL // ============================================================================ function workerFn() { const naturalCompare = () => { return (a: string, b: string) => { const regex = /(\d+)|(\D+)/g; const ax: any[] = [], bx: any[] = []; a.replace(regex, (_: any, $1: any, $2: any) => { ax.push([$1 || Infinity, $2 || '']); return ''; }); b.replace(regex, (_: any, $1: any, $2: any) => { bx.push([$1 || Infinity, $2 || '']); return ''; }); while (ax.length && bx.length) { const an = ax.shift()!; const bn = bx.shift()!; const nn = (parseFloat(an[0]) - parseFloat(bn[0])) || an[1].localeCompare(bn[1]); if (nn) return nn; } return ax.length - bx.length; }; }; const buildTree = (keys: string[], divider: string, keysInfo: any, savedExpandedNodes: any[]) => { const mainNodes: any[] = []; const newExpandedNodes: any[] = []; const saved = savedExpandedNodes || []; const recursiveNodes = (splitKey: string[], level = 0, nodes: any[] = mainNodes) => { let foundNode: any = false; if (level + 1 < splitKey.length) { for (let i = 0; i < nodes.length; i++) { if (nodes[i].label === splitKey[level] && nodes[i].type === 'folder') { foundNode = nodes[i]; break; } } } if (!foundNode) { const node: any = { label: splitKey[level], key: splitKey.slice(0, level + 1).join(divider), children: [], childCount: 0, type: level + 1 === splitKey.length ? 'element' : 'folder', }; if (node.type === 'element' && keysInfo) { node.keysInfo = keysInfo[node.key]; } nodes.push(node); foundNode = node; for (let j = 0; j < saved.length; j++) { if (saved[j].key === foundNode.key) { newExpandedNodes.push(foundNode); } } } if (level + 1 < splitKey.length) { recursiveNodes(splitKey, level + 1, foundNode.children); } }; for (let i = 0; i < keys.length; i++) { recursiveNodes(divider === '' ? [keys[i]] : keys[i].split(divider)); } const recursiveKeyCount = (node: any) => { node.childCount = 0; for (let i = 0; i < node.children.length; i++) { if (node.children[i].type === 'element') node.childCount++; } for (let i = 0; i < node.children.length; i++) { recursiveKeyCount(node.children[i]); if (node.children[i].type === 'folder') node.childCount += node.children[i].childCount; } }; for (let i = 0; i < mainNodes.length; i++) { recursiveKeyCount(mainNodes[i]); } return { nodes: mainNodes, expandedNodes: newExpandedNodes }; }; (self as any).onmessage = function (e: MessageEvent) { const data = e.data; const _requestId = data._requestId; if (data.action === 'sortKeys') { const sorted = data.keys.sort(naturalCompare()); (self as any).postMessage({ _requestId, keys: sorted }); } else if (data.action === 'buildTree') { const result = buildTree(data.keys, data.divider, data.keysInfo, data.savedExpandedNodes); (self as any).postMessage({ _requestId, ...result }); } }; } // ============================================================================ // Main-thread fallbacks // ============================================================================ function naturalCompare() { return (a: string, b: string) => { const regex = /(\d+)|(\D+)/g; const ax: any[] = [], bx: any[] = []; a.replace(regex, (_: any, $1: any, $2: any) => { ax.push([$1 || Infinity, $2 || '']); return ''; }); b.replace(regex, (_: any, $1: any, $2: any) => { bx.push([$1 || Infinity, $2 || '']); return ''; }); while (ax.length && bx.length) { const an = ax.shift()!; const bn = bx.shift()!; const nn = (parseFloat(an[0]) - parseFloat(bn[0])) || an[1].localeCompare(bn[1]); if (nn) return nn; } return ax.length - bx.length; }; } function buildTreeSync(options: { keys: string[]; divider: string; keysInfo: any; savedExpandedNodes?: any[]; }): { nodes: any[]; expandedNodes: any[] } { const { keys, divider, keysInfo } = options; const saved = options.savedExpandedNodes ?? []; const mainNodes: any[] = []; const newExpandedNodes: any[] = []; const recursiveNodes = (splitKey: string[], level = 0, nodes: any[] = mainNodes) => { let foundNode: any = false; if (level + 1 < splitKey.length) { for (const node of nodes) { if (node.label === splitKey[level] && node.type === 'folder') { foundNode = node; break; } } } if (!foundNode) { const node: any = { label: splitKey[level], key: splitKey.slice(0, level + 1).join(divider), children: [], childCount: 0, type: level + 1 === splitKey.length ? 'element' : 'folder', }; if (node.type === 'element' && keysInfo) { node.keysInfo = keysInfo[node.key]; } nodes.push(node); foundNode = node; for (const s of saved) { if (s.key === foundNode.key) newExpandedNodes.push(foundNode); } } if (level + 1 < splitKey.length) { recursiveNodes(splitKey, level + 1, foundNode.children); } }; for (const key of keys) { recursiveNodes(divider === '' ? [key] : key.split(divider)); } const recursiveKeyCount = (node: any) => { node.childCount = node.children.filter((c: any) => c.type === 'element').length; for (const child of node.children) { recursiveKeyCount(child); if (child.type === 'folder') node.childCount += child.childCount; } }; for (const node of mainNodes) { recursiveKeyCount(node); } return { nodes: mainNodes, expandedNodes: newExpandedNodes }; } src/ng/themes/000077500000000000000000000000001517666434100135535ustar00rootroot00000000000000src/ng/themes/_theme-custom.scss000066400000000000000000000375311517666434100172320ustar00rootroot00000000000000// Per-theme custom CSS properties // // Replaces the dynamic CSS injected via jQuery in p3xr-theme.js: // $('head').append('') // // Uses the Layout sub-theme for border/toolbar colors (matching AngularJS usage of themeLayout) // Uses the Main sub-theme for content-area colors // Uses the Common sub-theme for status/indicator colors @use '@angular/material' as mat; @use 'theme-definitions' as defs; // ============================================================================ // Shared dark/light mixins // ============================================================================ @mixin p3xr-dark-custom-props($layout-theme, $main-theme, $common-theme) { // Layout toolbar (primary default hue — header/footer) --p3xr-toolbar-bg: #{mat.get-theme-color($layout-theme, neutral-variant, 40)}; --p3xr-toolbar-color: #{mat.get-theme-color($layout-theme, neutral-variant, 90)}; --p3xr-toolbar-strong-bg: #{mat.get-theme-color($layout-theme, primary, 20)}; --p3xr-toolbar-strong-color: #{mat.get-theme-color($layout-theme, neutral, 98)}; // Accordion toolbar (primary hue-1 — content area section headers) --p3xr-accordion-bg: #{mat.get-theme-color($layout-theme, neutral-variant, 60)}; --p3xr-accordion-color: #{mat.get-theme-color($layout-theme, neutral-variant, 10)}; // Button colors from Main sub-theme: primary, accent(tertiary), warn(error) --p3xr-btn-primary-bg: #{mat.get-theme-color($main-theme, primary, 80)}; --p3xr-btn-primary-color: rgba(0, 0, 0, 0.87); --p3xr-btn-accent-bg: #{mat.get-theme-color($main-theme, tertiary, 80)}; --p3xr-btn-accent-color: rgba(0, 0, 0, 0.87); --p3xr-btn-warn-bg: #{mat.get-theme-color($main-theme, error, 80)}; --p3xr-btn-warn-color: rgba(0, 0, 0, 0.87); --p3xr-common-btn-primary-bg: #{mat.get-theme-color($common-theme, primary, 80)}; --p3xr-common-btn-primary-color: rgba(0, 0, 0, 0.87); --p3xr-plain-button-color: rgba(255, 255, 255, 0.87); --p3xr-hover-bg: rgba(255, 255, 255, 0.1); --p3xr-hover-bg-inverse: rgba(0, 0, 0, 0.1); --p3xr-border-color: #{mat.get-theme-color($layout-theme, primary, 50)}; --p3xr-input-border-color: #{mat.get-theme-color($layout-theme, primary, 50)}; --p3xr-content-border-color: rgba(255, 255, 255, 0.12); --p3xr-content-border-toolbar-color: rgba(255, 255, 255, 0.12); --p3xr-dialog-surface-bg: var(--p3xr-content-bg); --p3xr-toast-bg: #{mat.get-theme-color($common-theme, neutral, 10)}; --p3xr-toast-border: rgba(255, 255, 255, 0.5); --p3xr-toast-shadow: 0 0 10px rgba(0, 0, 0, 0.6); --p3xr-tree-branch-color: #{mat.get-theme-color($main-theme, tertiary, 80)}; --p3xr-tree-branch-shadow: 1px 1px 1px rgba(55, 29, 27, 0.5); --p3xr-list-odd-bg: rgba(255, 255, 255, 0.05); --p3xr-list-border: rgba(255, 255, 255, 0.05); --p3xr-autofill-bg: rgb(66, 66, 66, 0.9); --p3xr-autofill-color: white; --p3xr-input-bg: rgba(64, 64, 64, 1); --p3xr-input-color: white; --p3xr-fieldset-border: rgba(255, 255, 255, 0.25); --p3xr-selection-color: white; --p3xr-selection-bg: black; --p3xr-placeholder-color: rgba(255, 255, 255, 0.75); --p3xr-menu-selected-bg: rgba(255, 255, 255, 0.1); --p3xr-json-key-color: white; --p3xr-json-value-string: var(--p3xr-btn-accent-bg); --p3xr-json-value-number: var(--p3xr-btn-primary-bg); --p3xr-json-value-boolean: var(--p3xr-btn-warn-bg); --p3xr-json-value-null: rgba(255, 255, 255, 0.4); --p3xr-treecontrol-icon-color: rgba(255, 255, 255, 0.7); --p3xr-link-color: #82b1ff; --p3xr-common-warn-color: var(--p3xr-btn-warn-bg); } // Accordion/toolbar background colors matching AngularJS md-toolbar with Layout sub-theme // AngularJS used md-theme="themeLayout" + class="md-primary md-hue-1" // These are the exact colors from the AngularJS Material palette definitions @mixin p3xr-light-custom-props($layout-theme, $main-theme, $common-theme) { // Layout toolbar (primary default hue — header/footer) --p3xr-toolbar-bg: #{mat.get-theme-color($layout-theme, neutral-variant, 60)}; --p3xr-toolbar-color: #{mat.get-theme-color($layout-theme, neutral-variant, 10)}; --p3xr-toolbar-strong-bg: #{mat.get-theme-color($layout-theme, primary, 20)}; --p3xr-toolbar-strong-color: #{mat.get-theme-color($layout-theme, neutral, 98)}; // Accordion toolbar (primary hue-1 — content area section headers) --p3xr-accordion-bg: #{mat.get-theme-color($layout-theme, neutral-variant, 40)}; --p3xr-accordion-color: #{mat.get-theme-color($layout-theme, neutral-variant, 90)}; // Button colors from Main sub-theme: primary, accent(tertiary), warn(error) --p3xr-btn-primary-bg: #{mat.get-theme-color($main-theme, primary, 40)}; --p3xr-btn-primary-color: white; --p3xr-btn-accent-bg: #{mat.get-theme-color($main-theme, tertiary, 40)}; --p3xr-btn-accent-color: white; --p3xr-btn-warn-bg: #{mat.get-theme-color($main-theme, error, 40)}; --p3xr-btn-warn-color: white; --p3xr-common-btn-primary-bg: #{mat.get-theme-color($common-theme, primary, 40)}; --p3xr-common-btn-primary-color: white; --p3xr-plain-button-color: rgba(0, 0, 0, 0.87); --p3xr-hover-bg: rgba(0, 0, 0, 0.1); --p3xr-hover-bg-inverse: rgba(255, 255, 255, 0.1); --p3xr-border-color: #{mat.get-theme-color($layout-theme, primary, 50)}; --p3xr-input-border-color: #{mat.get-theme-color($layout-theme, primary, 50)}; --p3xr-content-border-color: transparent; --p3xr-content-border-toolbar-color: #{mat.get-theme-color($layout-theme, primary, 50)}; --p3xr-dialog-surface-bg: var(--p3xr-content-bg); --p3xr-toast-bg: auto; --p3xr-toast-border: auto; --p3xr-toast-shadow: none; --p3xr-tree-branch-color: #{mat.get-theme-color($main-theme, tertiary, 40)}; --p3xr-tree-branch-shadow: 1px 1px 0px rgba(55, 11, 0, 0.5); --p3xr-list-odd-bg: rgba(0, 0, 0, 0.04); --p3xr-list-border: rgba(0, 0, 0, 0.06); --p3xr-autofill-bg: rgba(255, 255, 255, 0.5); --p3xr-autofill-color: black; --p3xr-input-bg: white; --p3xr-input-color: black; --p3xr-fieldset-border: rgba(0, 0, 0, 0.5); --p3xr-selection-color: inherit; --p3xr-selection-bg: highlight; --p3xr-placeholder-color: inherit; --p3xr-menu-selected-bg: rgba(0, 0, 0, 0.1); --p3xr-json-key-color: black; --p3xr-json-value-string: var(--p3xr-btn-accent-bg); --p3xr-json-value-number: var(--p3xr-btn-primary-bg); --p3xr-json-value-boolean: var(--p3xr-btn-warn-bg); --p3xr-json-value-null: rgba(0, 0, 0, 0.4); --p3xr-treecontrol-icon-color: rgba(0, 0, 0, 0.87); --p3xr-link-color: #1a73e8; --p3xr-common-warn-color: var(--p3xr-btn-warn-bg); } // ============================================================================ // Per-theme CSS custom properties (using all 3 sub-themes) // ============================================================================ // ============================================================================ // Per-theme EXACT colors from AngularJS Material palette definitions // These override the mixin-generated M3 values with the production hex values // Source: angular-material/angular-material.js palette definitions // ============================================================================ body.p3xr-mat-theme-enterprise { @include p3xr-light-custom-props(defs.$p3xr-theme-enterprise-layout, defs.$p3xr-theme-enterprise, defs.$p3xr-theme-enterprise-common); // Enterprise: Layout primary=grey default:800, hue-1:500 --p3xr-toolbar-bg: #424242; // grey-800 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-toolbar-strong-bg: #212121; // grey-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #9e9e9e; // grey-500 (primary hue-1 — accordion headers) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-btn-primary-bg: #3f51b5; // indigo-500 --p3xr-btn-primary-color: white; --p3xr-btn-accent-bg: #1976d2; // blue-700 --p3xr-btn-accent-color: white; --p3xr-btn-warn-bg: #d32f2f; // red-700 --p3xr-btn-warn-color: white; --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: white; --p3xr-border-color: #424242; --p3xr-input-border-color: #9e9e9e; --p3xr-dialog-surface-bg: #ffffff; --p3xr-content-bg: #fafafa; // near-white (default light bg) --p3xr-body-bg: #e0e0e0; // grey-300 (body background) --p3xr-common-warn-color: #03a9f4; // light-blue-500 } body.p3xr-mat-theme-light { @include p3xr-light-custom-props(defs.$p3xr-theme-light-layout, defs.$p3xr-theme-light, defs.$p3xr-theme-light-common); // Light: Layout primary=blue-grey default:800, hue-1:200 --p3xr-toolbar-bg: #37474f; // blue-grey-800 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-toolbar-strong-bg: #263238; // blue-grey-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #b0bec5; // blue-grey-200 (primary hue-1 — accordion headers) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-btn-primary-bg: #673ab7; // deep-purple-500 --p3xr-btn-primary-color: white; --p3xr-btn-accent-bg: #9c27b0; // purple-500 --p3xr-btn-accent-color: white; --p3xr-btn-warn-bg: #d32f2f; // red-700 --p3xr-btn-warn-color: white; --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: white; --p3xr-border-color: #37474f; --p3xr-input-border-color: #b0bec5; --p3xr-dialog-surface-bg: #cfd8dc; // blue-grey-100 (legacy md-dialog paper) --p3xr-content-bg: #eceff1; // blue-grey-50 --p3xr-body-bg: #cfd8dc; // blue-grey-100 (body background) --p3xr-common-warn-color: #607d8b; // blue-grey-500 } body.p3xr-mat-theme-redis { @include p3xr-light-custom-props(defs.$p3xr-theme-redis-layout, defs.$p3xr-theme-redis, defs.$p3xr-theme-redis-common); // Redis: Layout primary=red default:800, hue-1:200 --p3xr-toolbar-bg: #c62828; // red-800 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #ef9a9a; // red-200 (primary hue-1 — accordion headers) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-toolbar-strong-bg: #b71c1c; // red-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-btn-primary-bg: #212121; // grey-900 --p3xr-btn-primary-color: rgba(255,255,255,0.87); --p3xr-btn-accent-bg: #757575; // grey-600 --p3xr-btn-accent-color: white; --p3xr-btn-warn-bg: #ffc107; // amber-500 --p3xr-btn-warn-color: white; --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: white; --p3xr-border-color: #c62828; --p3xr-input-border-color: #ef9a9a; --p3xr-dialog-surface-bg: #ffffff; --p3xr-content-bg: #fafafa; // near-white (default light bg) --p3xr-body-bg: #ffcdd2; // red-100 (body background) --p3xr-common-warn-color: #f44336; // red-500 } body.p3xr-mat-theme-dark { @include p3xr-dark-custom-props(defs.$p3xr-theme-dark-layout, defs.$p3xr-theme-dark, defs.$p3xr-theme-dark-common); // Dark: Layout primary=grey default:800, hue-1:500 --p3xr-toolbar-bg: #424242; // grey-800 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #9e9e9e; // grey-500 (primary hue-1 — accordion headers) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-toolbar-strong-bg: #212121; // grey-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-btn-primary-bg: #7986cb; // indigo-300 --p3xr-btn-primary-color: rgba(0,0,0,0.87); --p3xr-btn-accent-bg: #2196f3; // blue-500 --p3xr-btn-accent-color: rgba(0,0,0,0.87); --p3xr-btn-warn-bg: #ff9800; // orange-500 --p3xr-btn-warn-color: rgba(0,0,0,0.87); --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: rgba(0,0,0,0.87); --p3xr-border-color: #424242; --p3xr-input-border-color: #9e9e9e; --p3xr-dialog-surface-bg: #424242; // legacy dark md-dialog paper --p3xr-content-bg: #303030; // grey-A400 (dark mode md-content bg) --p3xr-body-bg: #212121; // grey-900 (body background) --p3xr-common-warn-color: #9fa8da; // indigo-200 } body.p3xr-mat-theme-dark-neu { @include p3xr-dark-custom-props(defs.$p3xr-theme-dark-neu-layout, defs.$p3xr-theme-dark-neu, defs.$p3xr-theme-dark-neu-common); // DarkNeu: Layout primary=blue-grey default:800, hue-1:300 --p3xr-toolbar-bg: #37474f; // blue-grey-800 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #90a4ae; // blue-grey-300 (primary hue-1 — accordion headers) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-toolbar-strong-bg: #263238; // blue-grey-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-btn-primary-bg: #00bcd4; // cyan-500 --p3xr-btn-primary-color: rgba(0,0,0,0.87); --p3xr-btn-accent-bg: #2196f3; // blue-500 --p3xr-btn-accent-color: rgba(0,0,0,0.87); --p3xr-btn-warn-bg: #ffeb3b; // yellow-500 --p3xr-btn-warn-color: rgba(0,0,0,0.87); --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: rgba(0,0,0,0.87); --p3xr-border-color: #37474f; --p3xr-input-border-color: #90a4ae; --p3xr-dialog-surface-bg: #424242; --p3xr-content-bg: #303030; // dark mode md-content bg --p3xr-body-bg: #263238; // blue-grey-900 (body background) --p3xr-common-warn-color: #2196f3; // blue-500 } body.p3xr-mat-theme-darko-bluo { @include p3xr-dark-custom-props(defs.$p3xr-theme-darko-bluo-layout, defs.$p3xr-theme-darko-bluo, defs.$p3xr-theme-darko-bluo-common); // DarkoBluo: Layout primary=indigo default:900, hue-1:500 --p3xr-toolbar-bg: #1a237e; // indigo-900 (primary default — header/footer) --p3xr-toolbar-color: rgba(255,255,255,0.87); --p3xr-accordion-bg: #3f51b5; // indigo-500 (primary hue-1 — accordion headers) --p3xr-accordion-color: white; --p3xr-toolbar-strong-bg: #1a237e; // indigo-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-btn-primary-bg: #7986cb; // indigo-300 --p3xr-btn-primary-color: rgba(0,0,0,0.87); --p3xr-btn-accent-bg: #2196f3; // blue-500 --p3xr-btn-accent-color: rgba(0,0,0,0.87); --p3xr-btn-warn-bg: #ff9800; // orange-500 --p3xr-btn-warn-color: rgba(0,0,0,0.87); --p3xr-common-btn-primary-bg: #4caf50; // green-500 --p3xr-common-btn-primary-color: rgba(0,0,0,0.87); --p3xr-border-color: #1a237e; --p3xr-input-border-color: #3f51b5; --p3xr-dialog-surface-bg: #424242; --p3xr-content-bg: #303030; // dark mode md-content bg --p3xr-body-bg: #283593; // indigo-800 (body background) --p3xr-common-warn-color: #03a9f4; // light-blue-500 } body.p3xr-mat-theme-matrix { @include p3xr-dark-custom-props(defs.$p3xr-theme-matrix-layout, defs.$p3xr-theme-matrix, defs.$p3xr-theme-matrix-common); // Matrix: Layout primary=light-green default:A400, hue-1:A400 --p3xr-toolbar-bg: #76ff03; // light-green-A400 (primary default — header/footer) --p3xr-toolbar-color: rgba(0,0,0,0.87); --p3xr-accordion-bg: #76ff03; // light-green-A400 (primary hue-1 — accordion headers, same) --p3xr-accordion-color: rgba(0,0,0,0.87); --p3xr-toolbar-strong-bg: #33691e; // light-green-900 --p3xr-toolbar-strong-color: rgba(255,255,255,0.87); --p3xr-btn-primary-bg: #76ff03; // light-green-A400 --p3xr-btn-primary-color: rgba(0,0,0,0.87); --p3xr-btn-accent-bg: #c6ff00; // lime-A400 --p3xr-btn-accent-color: rgba(0,0,0,0.87); --p3xr-btn-warn-bg: #00c853; // green-A700 --p3xr-btn-warn-color: rgba(0,0,0,0.87); --p3xr-common-btn-primary-bg: #76ff03; // light-green-A400 --p3xr-common-btn-primary-color: rgba(0,0,0,0.87); --p3xr-border-color: #76ff03; --p3xr-tree-branch-color: #76ff03; --p3xr-input-border-color: #76ff03; --p3xr-dialog-surface-bg: #424242; --p3xr-content-bg: #303030; // dark mode md-content bg --p3xr-body-bg: #1b5e20; // green-900 (body background) --p3xr-common-warn-color: #4caf50; // green-500 } src/ng/themes/_theme-definitions.scss000066400000000000000000000133361517666434100202300ustar00rootroot00000000000000// Angular Material theme definitions for P3X Redis UI // // Each AngularJS theme has 3 sub-themes (Layout, Main, Common) with different palettes. // M3 palette mapping from AngularJS M1: // grey → neutral (built into M3) | indigo → $azure-palette // blue → $blue-palette | blue-grey → $azure-palette // cyan → $cyan-palette | deep-purple → $violet-palette // purple → $magenta-palette | light-green → $chartreuse-palette // lime → $chartreuse-palette | green → $green-palette // orange → $orange-palette | red → $red-palette // yellow → $yellow-palette | amber → $orange-palette @use '@angular/material' as mat; // ============================================================================ // Light Theme // AngularJS: Layout=blue-grey, Main=deep-purple/purple/red, Common=green/grey/blue-grey // ============================================================================ $p3xr-theme-light-layout: mat.define-theme(( color: (theme-type: light, primary: mat.$azure-palette, tertiary: mat.$azure-palette) )); $p3xr-theme-light: mat.define-theme(( color: (theme-type: light, primary: mat.$violet-palette, tertiary: mat.$magenta-palette) )); $p3xr-theme-light-common: mat.define-theme(( color: (theme-type: light, primary: mat.$green-palette, tertiary: mat.$azure-palette) )); // ============================================================================ // Enterprise Theme (light) // AngularJS: Layout=grey, Main=indigo/blue-700/red-700, Common=green/grey/light-blue // ============================================================================ $p3xr-theme-enterprise-layout: mat.define-theme(( color: (theme-type: light, primary: mat.$azure-palette, tertiary: mat.$azure-palette) )); $p3xr-theme-enterprise: mat.define-theme(( color: (theme-type: light, primary: mat.$azure-palette, tertiary: mat.$blue-palette) )); $p3xr-theme-enterprise-common: mat.define-theme(( color: (theme-type: light, primary: mat.$green-palette, tertiary: mat.$blue-palette) )); // ============================================================================ // Redis Theme (light) // AngularJS: Layout=red-800/red background, Main=GREY-900/GREY-600/amber (neutral!), Common=green/grey/red // IMPORTANT: Main content uses GREY (neutral) — NOT red. Only toolbar is red. // ============================================================================ $p3xr-theme-redis-layout: mat.define-theme(( color: (theme-type: light, primary: mat.$red-palette, tertiary: mat.$red-palette) )); // Main uses neutral palette — closest to grey-900 primary in M3 $p3xr-theme-redis: mat.define-theme(( color: (theme-type: light, primary: mat.$rose-palette, tertiary: mat.$orange-palette) )); $p3xr-theme-redis-common: mat.define-theme(( color: (theme-type: light, primary: mat.$green-palette, tertiary: mat.$red-palette) )); // ============================================================================ // Dark Theme // AngularJS: Layout=grey-800 dark, Main=indigo-300/blue/ORANGE, Common=green/grey/indigo-200 dark // ============================================================================ $p3xr-theme-dark-layout: mat.define-theme(( color: (theme-type: dark, primary: mat.$azure-palette, tertiary: mat.$azure-palette) )); $p3xr-theme-dark: mat.define-theme(( color: (theme-type: dark, primary: mat.$azure-palette, tertiary: mat.$blue-palette) )); $p3xr-theme-dark-common: mat.define-theme(( color: (theme-type: dark, primary: mat.$green-palette, tertiary: mat.$azure-palette) )); // ============================================================================ // DarkNeu Theme // AngularJS: Layout=blue-grey-800 dark, Main=cyan/blue/yellow dark, Common=green/grey/blue dark // ============================================================================ $p3xr-theme-dark-neu-layout: mat.define-theme(( color: (theme-type: dark, primary: mat.$azure-palette, tertiary: mat.$azure-palette) )); $p3xr-theme-dark-neu: mat.define-theme(( color: (theme-type: dark, primary: mat.$cyan-palette, tertiary: mat.$blue-palette) )); $p3xr-theme-dark-neu-common: mat.define-theme(( color: (theme-type: dark, primary: mat.$green-palette, tertiary: mat.$blue-palette) )); // ============================================================================ // DarkoBluo Theme // AngularJS: Layout=indigo-900 dark, Main=indigo-300/BLUE/orange dark, Common=green/grey/light-blue dark // ============================================================================ $p3xr-theme-darko-bluo-layout: mat.define-theme(( color: (theme-type: dark, primary: mat.$violet-palette, tertiary: mat.$violet-palette) )); // DarkoBluo is more indigo/violet than Dark (which is more azure/blue) $p3xr-theme-darko-bluo: mat.define-theme(( color: (theme-type: dark, primary: mat.$violet-palette, tertiary: mat.$blue-palette) )); $p3xr-theme-darko-bluo-common: mat.define-theme(( color: (theme-type: dark, primary: mat.$green-palette, tertiary: mat.$blue-palette) )); // ============================================================================ // Matrix Theme // AngularJS: Layout=light-green-A400 dark, Main=light-green-A400/lime-A400/green-A700 dark, Common=light-green-A400 dark // ============================================================================ $p3xr-theme-matrix-layout: mat.define-theme(( color: (theme-type: dark, primary: mat.$chartreuse-palette, tertiary: mat.$chartreuse-palette) )); $p3xr-theme-matrix: mat.define-theme(( color: (theme-type: dark, primary: mat.$chartreuse-palette, tertiary: mat.$green-palette) )); $p3xr-theme-matrix-common: mat.define-theme(( color: (theme-type: dark, primary: mat.$chartreuse-palette, tertiary: mat.$green-palette) )); src/ng/themes/angular-material-themes.scss000066400000000000000000001504101517666434100211610ustar00rootroot00000000000000// P3X Redis UI — Angular Material Theme Application // // Each theme has 3 sub-themes matching the AngularJS architecture: // - Layout: toolbar, header, footer → scoped under .p3xr-mat-layout // - Main: content area → scoped under body.p3xr-mat-theme-{name} // - Common: status indicators → scoped under .p3xr-mat-common // // IMPORTANT: Dark themes come FIRST, light themes come LAST. // CSS ordering matters — when switching from dark to light, the light theme's // CSS variables must override the dark theme's. Since body.class selectors have // equal specificity, the LATER rule in the file wins. // // During hybrid mode, these only affect Angular (mat-*) components. // AngularJS (md-*) components continue using their own theme system. @use '@angular/material' as mat; @use 'theme-definitions' as defs; @use 'theme-custom'; // Angular Material core styles (typography, ripple, etc.) — applied once globally @include mat.core(); // ============================================================================ // Default theme (Enterprise — light) applied at root level // ============================================================================ :root { @include mat.all-component-themes(defs.$p3xr-theme-enterprise); } // Light theme M3 surface neutralization is at the END of the file (after all per-theme // blocks) so it wins the CSS cascade. See the body.p3xr-theme-light block at the bottom. // ============================================================================ // DARK THEMES FIRST (so light themes can override when switching) // ============================================================================ body.p3xr-mat-theme-dark { @include mat.all-component-colors(defs.$p3xr-theme-dark); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-dark-layout); @include mat.button-color(defs.$p3xr-theme-dark-layout); @include mat.icon-button-color(defs.$p3xr-theme-dark-layout); @include mat.menu-color(defs.$p3xr-theme-dark-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-dark-common); @include mat.icon-color(defs.$p3xr-theme-dark-common); } } body.p3xr-mat-theme-dark-neu { @include mat.all-component-colors(defs.$p3xr-theme-dark-neu); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-dark-neu-layout); @include mat.button-color(defs.$p3xr-theme-dark-neu-layout); @include mat.icon-button-color(defs.$p3xr-theme-dark-neu-layout); @include mat.menu-color(defs.$p3xr-theme-dark-neu-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-dark-neu-common); @include mat.icon-color(defs.$p3xr-theme-dark-neu-common); } } body.p3xr-mat-theme-darko-bluo { @include mat.all-component-colors(defs.$p3xr-theme-darko-bluo); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-darko-bluo-layout); @include mat.button-color(defs.$p3xr-theme-darko-bluo-layout); @include mat.icon-button-color(defs.$p3xr-theme-darko-bluo-layout); @include mat.menu-color(defs.$p3xr-theme-darko-bluo-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-darko-bluo-common); @include mat.icon-color(defs.$p3xr-theme-darko-bluo-common); } } body.p3xr-mat-theme-matrix { @include mat.all-component-colors(defs.$p3xr-theme-matrix); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-matrix-layout); @include mat.button-color(defs.$p3xr-theme-matrix-layout); @include mat.icon-button-color(defs.$p3xr-theme-matrix-layout); @include mat.menu-color(defs.$p3xr-theme-matrix-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-matrix-common); @include mat.icon-color(defs.$p3xr-theme-matrix-common); } } // ============================================================================ // LIGHT THEMES LAST (override dark theme CSS variables on switch) // ============================================================================ body.p3xr-mat-theme-light { @include mat.all-component-colors(defs.$p3xr-theme-light); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-light-layout); @include mat.button-color(defs.$p3xr-theme-light-layout); @include mat.icon-button-color(defs.$p3xr-theme-light-layout); @include mat.menu-color(defs.$p3xr-theme-light-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-light-common); @include mat.icon-color(defs.$p3xr-theme-light-common); } } body.p3xr-mat-theme-enterprise { @include mat.all-component-colors(defs.$p3xr-theme-enterprise); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-enterprise-layout); @include mat.button-color(defs.$p3xr-theme-enterprise-layout); @include mat.icon-button-color(defs.$p3xr-theme-enterprise-layout); @include mat.menu-color(defs.$p3xr-theme-enterprise-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-enterprise-common); @include mat.icon-color(defs.$p3xr-theme-enterprise-common); } } body.p3xr-mat-theme-redis { @include mat.all-component-colors(defs.$p3xr-theme-redis); .p3xr-mat-layout { @include mat.toolbar-color(defs.$p3xr-theme-redis-layout); @include mat.button-color(defs.$p3xr-theme-redis-layout); @include mat.icon-button-color(defs.$p3xr-theme-redis-layout); @include mat.menu-color(defs.$p3xr-theme-redis-layout); } .p3xr-mat-common { @include mat.button-color(defs.$p3xr-theme-redis-common); @include mat.icon-color(defs.$p3xr-theme-redis-common); } } // ============================================================================ // Shared app-level styles consuming CSS custom properties // ============================================================================ [data-p3xr-tree-key]:hover .p3xr-database-tree-node-label { background-color: var(--p3xr-hover-bg); } .p3xr-content-border { border-left: 1px solid var(--p3xr-content-border-color); border-right: 1px solid var(--p3xr-content-border-color); border-bottom: 1px solid var(--p3xr-content-border-color); } .p3xr-content-border-fixed { border-left: 1px solid var(--p3xr-border-color); border-right: 1px solid var(--p3xr-border-color); border-bottom: 1px solid var(--p3xr-border-color); } .p3xr-content-border-toolbar { border-left: 1px solid var(--p3xr-border-color); border-right: 1px solid var(--p3xr-border-color); border-top: 1px solid var(--p3xr-border-color); } .p3xr-list-key-odd-item { background-color: var(--p3xr-list-odd-bg); } .p3xr-list-key-item { border-bottom: 1px solid var(--p3xr-list-border); } input:-webkit-autofill, input:-webkit-autofill:focus { -webkit-box-shadow: 0 0 0 50px var(--p3xr-autofill-bg) inset !important; -webkit-text-fill-color: var(--p3xr-autofill-color) !important; } fieldset { border-color: var(--p3xr-fieldset-border); } .p3xr-md-menu-item-selected, .p3xr-mat-menu-item-selected { background-color: var(--p3xr-menu-selected-bg) !important; } .p3xr-language-highlighted { background-color: var(--mat-menu-item-hover-state-layer-color, rgba(0, 0, 0, 0.04)) !important; } .p3xr-connection-group-header { display: flex; align-items: center; gap: 8px; padding: 8px 16px; font-weight: 700; font-size: 13px; opacity: 0.8; background: var(--p3xr-list-odd-bg); border-bottom: 1px solid var(--p3xr-list-border); cursor: pointer; user-select: none; } .p3xr-connection-group-header:hover { opacity: 1; background: var(--p3xr-hover-bg); } .p3xr-language-menu { min-width: 320px !important; max-height: 400px !important; .mat-mdc-menu-content { padding-top: 0; } } .p3xr-language-search-container { padding: 8px 0; position: sticky; top: 0; z-index: 1; background: var(--mat-menu-container-color, var(--mat-app-surface)); } .p3xr-language-search-input { display: block; width: calc(100% - 20px); margin: 0 auto; padding: 8px; border: 2px solid var(--p3xr-input-border-color, var(--p3xr-border-color, rgba(0, 0, 0, 0.12))); border-radius: 4px; font-size: 14px; background: var(--p3xr-input-bg, transparent); color: var(--p3xr-input-color, inherit); outline: none; box-sizing: border-box; &:focus { border-width: 3px; border-color: var(--p3xr-input-border-color, var(--p3xr-border-color, #1976d2)); } &::placeholder { color: var(--mat-app-text-color, rgba(0, 0, 0, 0.38)); opacity: 0.5; } } .p3xr-command-palette-panel .mat-mdc-dialog-container .mdc-dialog__surface { padding: 0 !important; } json-tree .key { color: var(--p3xr-json-key-color); font-weight: bold; } // Global button color classes — uses correct Angular Material CSS variable names // mat-flat-button uses: background-color: var(--mat-button-filled-container-color, var(--mat-sys-primary)) .btn-primary { --mdc-filled-button-container-color: var(--p3xr-btn-primary-bg) !important; --mdc-filled-button-label-text-color: var(--p3xr-btn-primary-color) !important; --mdc-protected-button-container-color: var(--p3xr-btn-primary-bg) !important; --mdc-protected-button-label-text-color: var(--p3xr-btn-primary-color) !important; --mat-button-filled-container-color: var(--p3xr-btn-primary-bg) !important; --mat-button-filled-label-text-color: var(--p3xr-btn-primary-color) !important; --mat-button-protected-container-color: var(--p3xr-btn-primary-bg) !important; --mat-button-protected-label-text-color: var(--p3xr-btn-primary-color) !important; --mat-fab-container-color: var(--p3xr-btn-primary-bg) !important; --mat-fab-foreground-color: var(--p3xr-btn-primary-color) !important; --mat-fab-small-container-color: var(--p3xr-btn-primary-bg) !important; --mat-fab-small-foreground-color: var(--p3xr-btn-primary-color) !important; color: var(--p3xr-btn-primary-color) !important; } .btn-accent { --mdc-filled-button-container-color: var(--p3xr-btn-accent-bg) !important; --mdc-filled-button-label-text-color: var(--p3xr-btn-accent-color) !important; --mdc-protected-button-container-color: var(--p3xr-btn-accent-bg) !important; --mdc-protected-button-label-text-color: var(--p3xr-btn-accent-color) !important; --mat-button-filled-container-color: var(--p3xr-btn-accent-bg) !important; --mat-button-filled-label-text-color: var(--p3xr-btn-accent-color) !important; --mat-button-protected-container-color: var(--p3xr-btn-accent-bg) !important; --mat-button-protected-label-text-color: var(--p3xr-btn-accent-color) !important; --mat-fab-container-color: var(--p3xr-btn-accent-bg) !important; --mat-fab-foreground-color: var(--p3xr-btn-accent-color) !important; --mat-fab-small-container-color: var(--p3xr-btn-accent-bg) !important; --mat-fab-small-foreground-color: var(--p3xr-btn-accent-color) !important; color: var(--p3xr-btn-accent-color) !important; } .btn-warn { --mdc-filled-button-container-color: var(--p3xr-btn-warn-bg) !important; --mdc-filled-button-label-text-color: var(--p3xr-btn-warn-color) !important; --mdc-protected-button-container-color: var(--p3xr-btn-warn-bg) !important; --mdc-protected-button-label-text-color: var(--p3xr-btn-warn-color) !important; --mat-button-filled-container-color: var(--p3xr-btn-warn-bg) !important; --mat-button-filled-label-text-color: var(--p3xr-btn-warn-color) !important; --mat-button-protected-container-color: var(--p3xr-btn-warn-bg) !important; --mat-button-protected-label-text-color: var(--p3xr-btn-warn-color) !important; --mat-fab-container-color: var(--p3xr-btn-warn-bg) !important; --mat-fab-foreground-color: var(--p3xr-btn-warn-color) !important; --mat-fab-small-container-color: var(--p3xr-btn-warn-bg) !important; --mat-fab-small-foreground-color: var(--p3xr-btn-warn-color) !important; color: var(--p3xr-btn-warn-color) !important; } .btn-primary, .btn-primary .mdc-button__label, .btn-primary mat-icon, .btn-primary i { color: var(--p3xr-btn-primary-color) !important; } .btn-accent, .btn-accent .mdc-button__label, .btn-accent mat-icon, .btn-accent i { color: var(--p3xr-btn-accent-color) !important; } .btn-warn, .btn-warn .mdc-button__label, .btn-warn mat-icon, .btn-warn i { color: var(--p3xr-btn-warn-color) !important; } // ============================================================================ // Accordion content // ============================================================================ .p3xr-accordion-content { background-color: var(--p3xr-content-bg, #fafafa); color: var(--mat-app-text-color, inherit); overflow: visible; padding: 0; } // ============================================================================ // Buttons — match AngularJS Material md-button md-raised // Production: height 36px, padding 0 6px, border-radius 4px, uppercase // ============================================================================ // AngularJS md-button.md-raised: padding 0 6px, margin 6px 8px, min-width 88px, min-height 36px // AngularJS md-button.md-raised styling for content-area buttons. .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base):not(.mat-mdc-snack-bar-action) { text-transform: uppercase !important; letter-spacing: 0.089em !important; border-radius: 4px !important; padding: 0 6px !important; min-width: 88px !important; height: 36px !important; line-height: 36px !important; margin: 6px 8px !important; font-size: 14px !important; // Narrower gap between icon and text than Google M3 default gap: 3px !important; // Match toolbar header/footer letter-spacing letter-spacing: 0.1px !important; } // Dialog content action buttons: match footer button (p3xr-dialog-actions) padding. // Must beat global .mat-mdc-button-base:not():not() specificity (0,3,0). // Uses symmetric padding + justify-content:center so icons are centered in both // icon+text and icon-only states. // Wide: icon + text → asymmetric padding matching footer (10px left, 8px right) // Narrow: icon only → min-width 48px matching footer CANCEL, centered .p3xr-action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) { padding-left: 10px !important; padding-right: 8px !important; margin: 0 4px !important; min-width: 48px !important; letter-spacing: 0.01em !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; } .p3xr-action-btn.mat-mdc-button-base mat-icon, .p3xr-action-btn.mat-mdc-button-base .mat-icon, .p3xr-action-btn.mat-mdc-button-base i { margin-left: 0 !important; margin-right: 4px !important; } .p3xr-action-btn.mat-mdc-button-base .mdc-button__label { display: inline !important; gap: 0 !important; letter-spacing: inherit !important; } .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base):not(.mat-mdc-snack-bar-action) .mdc-button__label { display: inline-flex; align-items: center; gap: 8px; } .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base):not(.mat-mdc-snack-bar-action) .mdc-button__label > mat-icon, .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base):not(.mat-mdc-snack-bar-action) .mdc-button__label > i { flex-shrink: 0; } .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base):not(.mat-mdc-snack-bar-action) .mdc-button__ripple { border-radius: 4px !important; } // Normalize Font Awesome button icons to the same painted size as Material's 24px icons. // Font Awesome ships a visibly larger glyph inside the same 24px box, so normalize the // pseudo-element instead of only sizing the outer . .mat-mdc-button-base i.fa, .mat-mdc-button-base i.fas, .mat-mdc-button-base i.far, .mat-mdc-button-base i.fab { transform: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; width: 24px !important; height: 24px !important; line-height: 24px !important; font-size: 24px !important; margin-left: 0 !important; margin-right: 0 !important; } .mat-mdc-button-base i.fa::before, .mat-mdc-button-base i.fas::before, .mat-mdc-button-base i.far::before, .mat-mdc-button-base i.fab::before { display: block !important; font-size: 15px !important; line-height: 15px !important; transform: none !important; } // Settings page connection actions should match the original AngularJS md-button box model. .p3xr-connection-item .btn-primary, .p3xr-connection-item .btn-accent, .p3xr-connection-item .btn-warn { min-width: auto !important; padding-left: 8px !important; padding-right: 8px !important; letter-spacing: 0.01em !important; } .p3xr-connection-item .btn-primary .mdc-button__label, .p3xr-connection-item .btn-accent .mdc-button__label, .p3xr-connection-item .btn-warn .mdc-button__label { display: inline !important; gap: 0 !important; letter-spacing: inherit !important; } .p3xr-connection-item .btn-primary mat-icon, .p3xr-connection-item .btn-accent mat-icon, .p3xr-connection-item .btn-warn mat-icon { margin-left: 0 !important; margin-right: 0 !important; width: 24px !important; height: 24px !important; font-size: 24px !important; } .p3xr-connection-item .btn-primary:not([aria-label]) mat-icon, .p3xr-connection-item .btn-accent:not([aria-label]) mat-icon, .p3xr-connection-item .btn-warn:not([aria-label]) mat-icon, .p3xr-connection-item .btn-primary:not([aria-label]) i, .p3xr-connection-item .btn-accent:not([aria-label]) i, .p3xr-connection-item .btn-warn:not([aria-label]) i { margin-right: 3px !important; } // Standalone p3xr-ng-button should match the original AngularJS md-button: // min-width: 0, horizontal padding: 8px, theme-aware black/white foreground. p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) { min-width: 0 !important; padding-left: 8px !important; padding-right: 8px !important; color: var(--p3xr-plain-button-color) !important; } p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) mat-icon, p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) i, p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) .mdc-button__label { color: inherit !important; } // Accordion toolbar: buttons, icons, text use accordion color (md-primary hue-1, always dark-on-light) .p3xr-accordion-toolbar .p3xr-accordion-title, .p3xr-accordion-toolbar .p3xr-accordion-actions { color: var(--p3xr-accordion-color) !important; } .p3xr-accordion-toolbar .mat-mdc-icon-button, .p3xr-accordion-toolbar .mat-mdc-icon-button mat-icon, .p3xr-accordion-toolbar p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base), .p3xr-accordion-toolbar p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) .mdc-button__label, .p3xr-accordion-toolbar p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) mat-icon, .p3xr-accordion-toolbar p3xr-ng-button .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) i { color: var(--p3xr-accordion-color) !important; } .p3xr-accordion-toolbar .mat-mdc-button-base, .p3xr-accordion-toolbar .mat-mdc-icon-button, .p3xr-accordion-toolbar mat-icon, .p3xr-accordion-toolbar .mat-mdc-button-base .mdc-button__label { color: var(--p3xr-accordion-color) !important; } // Version/SNAPSHOT label overlaying the header toolbar — must match toolbar text color. // AngularJS used md-colors="{ color: 'background-A100' }" (white for most themes, grey-900 for Matrix). #p3xr-layout-header-version-donated, #p3xr-layout-header-version-free { color: var(--p3xr-toolbar-color) !important; } body.p3xr-mat-theme-matrix #p3xr-layout-header-version-donated, body.p3xr-mat-theme-matrix #p3xr-layout-header-version-free { color: #212121 !important; // grey-900 — AngularJS used getVersionColor() → 'grey-900' for Matrix } // Matrix: bright green toolbar needs dark hover (white is invisible on #76ff03) body.p3xr-mat-theme-matrix mat-toolbar.p3xr-mat-layout .mat-mdc-button-base:not(.mat-mdc-fab-base):hover { background-color: rgba(0, 0, 0, 0.1) !important; } // Matrix: darken dialog footer — bright #76ff03 is too intense as a footer bg body.p3xr-mat-theme-matrix .p3xr-dialog-actions { background-color: #0a2e0d !important; // near-black green } // Accordion toolbar: hue-1 color from Layout sub-theme (section headers in content area). // Uses mat-toolbar.class for higher specificity over mat.all-component-colors() output. mat-toolbar.p3xr-accordion-toolbar { background-color: var(--p3xr-accordion-bg) !important; color: var(--p3xr-accordion-color) !important; } // Force all children in accordion toolbar to inherit accordion color mat-toolbar.p3xr-accordion-toolbar * { color: inherit; } mat-toolbar.p3xr-accordion-toolbar .mat-mdc-select, mat-toolbar.p3xr-accordion-toolbar .mat-mdc-select-value, mat-toolbar.p3xr-accordion-toolbar .mat-mdc-select-arrow, mat-toolbar.p3xr-accordion-toolbar .mat-mdc-form-field, mat-toolbar.p3xr-accordion-toolbar .mdc-text-field, mat-toolbar.p3xr-accordion-toolbar .mat-mdc-floating-label, mat-toolbar.p3xr-accordion-toolbar mat-icon, mat-toolbar.p3xr-accordion-toolbar span, mat-toolbar.p3xr-accordion-toolbar a { color: var(--p3xr-accordion-color) !important; } // Layout toolbar: exact colors matching AngularJS md-toolbar with Layout sub-theme. // The mat.toolbar-color() mixin above applies M3 palette colors which approximate // but don't match the AngularJS Material M1 colors. These CSS custom properties // (defined per-theme in _theme-custom.scss) provide the exact hex values from the // original AngularJS palette definitions. mat-toolbar.p3xr-mat-layout { background-color: var(--p3xr-toolbar-bg) !important; color: var(--p3xr-toolbar-color) !important; // Match AngularJS Material md-toolbar font-size (M3 default is 22px) font-size: 20px !important; // Override Angular Material button letter-spacing CSS variables to match M1 (~0.1px) --mdc-text-button-label-text-tracking: 0.1px !important; --mdc-protected-button-label-text-tracking: 0.1px !important; --mat-toolbar-title-text-tracking: normal !important; // Lock toolbar to 48px at all breakpoints (AM default is 64px desktop / 56px mobile) --mat-toolbar-standard-height: 48px; --mat-toolbar-mobile-height: 48px; } // Header toolbar elevation: Material elevation 8dp #p3xr-layout-header-container mat-toolbar.p3xr-mat-layout { box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12) !important; } // Footer toolbar elevation: Material elevation 8dp (upward) #p3xr-layout-footer-container mat-toolbar.p3xr-mat-layout { box-shadow: 0px -5px 5px -3px rgba(0, 0, 0, 0.2), 0px -8px 10px 1px rgba(0, 0, 0, 0.14), 0px -3px 14px 2px rgba(0, 0, 0, 0.12) !important; } // Buttons inside layout toolbars: match AngularJS md-button styling. // Uses :not() pseudo-classes to beat the global .mat-mdc-button-base:not():not() // rule (specificity 0,3,0) that sets letter-spacing: 0.089em. mat-toolbar.p3xr-mat-layout .mat-mdc-button-base:not(.mat-mdc-fab-base) { color: inherit !important; letter-spacing: 0.1px !important; text-transform: uppercase !important; height: 36px !important; min-height: 36px !important; min-width: auto !important; // Narrower padding than production to save space in footer with many buttons padding: 0px 4px !important; margin: 0px 4px !important; // Center icon when button collapses to icon-only display: inline-flex !important; align-items: center !important; justify-content: center !important; // Hover: lighten on dark toolbar background (matches AngularJS md-button-dark-hover-fix). // Uses white alpha since toolbar bg is dark in most themes. // Matrix theme overrides below with dark hover for its bright green toolbar. &:hover { background-color: rgba(255, 255, 255, 0.15) !important; } } // All text-bearing children inside layout toolbar buttons mat-toolbar.p3xr-mat-layout .mat-mdc-button-base:not(.mat-mdc-fab-base) *, mat-toolbar.p3xr-mat-layout .mdc-button__label, mat-toolbar.p3xr-mat-layout span { color: inherit !important; letter-spacing: 0.1px !important; } // Uniform icon-to-text gap: zero out Angular Material's internal gaps, // then use explicit margin-right on icons for consistent 4px gap. mat-toolbar.p3xr-mat-layout .mat-mdc-button-base:not(.mat-mdc-fab-base) { gap: 0 !important; } mat-toolbar.p3xr-mat-layout .mat-mdc-button-base:not(.mat-mdc-fab-base) .mdc-button__label { gap: 0 !important; display: inline-flex !important; align-items: center !important; margin-left: 0 !important; } // Same margin-right on both icon types for uniform gap. // When icon is :last-child (no text label visible), margin is 0 for square icon-only buttons. mat-toolbar.p3xr-mat-layout mat-icon, mat-toolbar.p3xr-mat-layout i.fa, mat-toolbar.p3xr-mat-layout i.fas, mat-toolbar.p3xr-mat-layout i.fab { margin-right: 4px !important; margin-left: 0 !important; } mat-toolbar.p3xr-mat-layout mat-icon:last-child, mat-toolbar.p3xr-mat-layout i.fa:last-child, mat-toolbar.p3xr-mat-layout i.fas:last-child, mat-toolbar.p3xr-mat-layout i.fab:last-child { margin-right: 0 !important; } // All icons inside layout toolbars: uniform 24px matching AngularJS md-icon size mat-toolbar.p3xr-mat-layout mat-icon { font-size: 24px !important; width: 24px !important; height: 24px !important; color: inherit !important; } // FA icons in layout toolbars: 24px matching Material icons. // Must override the global .mat-mdc-button-base i.fa::before rule (specificity 0,2,1) // which forces FA glyphs to 15px — so we use .mat-mdc-button-base in our selector too. mat-toolbar.p3xr-mat-layout i.fa, mat-toolbar.p3xr-mat-layout i.fas, mat-toolbar.p3xr-mat-layout i.fab { font-size: 24px !important; line-height: 1 !important; vertical-align: middle !important; color: inherit !important; } mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.fa::before, mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.fas::before, mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.far::before, mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.fab::before { font-size: 24px !important; line-height: 24px !important; } // fa-power-off and fa-donate glyphs are visually larger than Material icons — scale down to match mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.fa-power-off::before, mat-toolbar.p3xr-mat-layout .mat-mdc-button-base i.fa-donate::before { font-size: 21px !important; line-height: 24px !important; } .p3xr-mat-layout-strong { background-color: var(--p3xr-toolbar-strong-bg) !important; color: var(--p3xr-toolbar-strong-color) !important; } .p3xr-mat-layout-strong .mat-mdc-icon-button, .p3xr-mat-layout-strong .mat-icon, .p3xr-mat-layout-strong .mdc-icon-button, .p3xr-mat-layout-strong .mdc-button__label { color: inherit !important; } .p3xr-mat-common .btn-primary { --mdc-filled-button-container-color: var(--p3xr-common-btn-primary-bg) !important; --mdc-filled-button-label-text-color: var(--p3xr-common-btn-primary-color) !important; --mdc-protected-button-container-color: var(--p3xr-common-btn-primary-bg) !important; --mdc-protected-button-label-text-color: var(--p3xr-common-btn-primary-color) !important; --mat-button-filled-container-color: var(--p3xr-common-btn-primary-bg) !important; --mat-button-filled-label-text-color: var(--p3xr-common-btn-primary-color) !important; --mat-button-protected-container-color: var(--p3xr-common-btn-primary-bg) !important; --mat-button-protected-label-text-color: var(--p3xr-common-btn-primary-color) !important; color: var(--p3xr-common-btn-primary-color) !important; } .p3xr-mat-common .btn-primary .mdc-button__label, .p3xr-mat-common .btn-primary mat-icon, .p3xr-mat-common .btn-primary i { color: inherit !important; } // Accordion toolbar icon buttons must keep the original AngularJS md-icon-button geometry: // square 40x40, 8px padding, no 88px min-width from the shared raised-button override. .p3xr-accordion-toolbar .mat-mdc-icon-button { min-width: 0 !important; width: 40px !important; height: 40px !important; padding: 8px !important; margin: 0 6px !important; line-height: 24px !important; border-radius: 50% !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; flex: 0 0 40px !important; } .p3xr-accordion-toolbar .mat-mdc-icon-button .mat-mdc-button-touch-target { width: 40px !important; height: 40px !important; } .p3xr-accordion-toolbar .mat-mdc-icon-button mat-icon { margin: 0 !important; } // Accordion toolbar button/icon styling — mirrors the layout toolbar rules above. // Ensures buttons, icons (Material + FA), and text match the layout footer appearance. mat-toolbar.p3xr-accordion-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) *, mat-toolbar.p3xr-accordion-toolbar .mdc-button__label, mat-toolbar.p3xr-accordion-toolbar span { color: inherit !important; letter-spacing: 0.1px !important; } mat-toolbar.p3xr-accordion-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) { gap: 0 !important; } mat-toolbar.p3xr-accordion-toolbar .mat-mdc-button-base:not(.mat-mdc-fab-base) .mdc-button__label { gap: 0 !important; display: inline-flex !important; align-items: center !important; margin-left: 0 !important; } mat-toolbar.p3xr-accordion-toolbar mat-icon, mat-toolbar.p3xr-accordion-toolbar i.fa, mat-toolbar.p3xr-accordion-toolbar i.fas, mat-toolbar.p3xr-accordion-toolbar i.fab { margin-right: 4px !important; margin-left: 0 !important; } mat-toolbar.p3xr-accordion-toolbar mat-icon:last-child, mat-toolbar.p3xr-accordion-toolbar i.fa:last-child, mat-toolbar.p3xr-accordion-toolbar i.fas:last-child, mat-toolbar.p3xr-accordion-toolbar i.fab:last-child { margin-right: 0 !important; } mat-toolbar.p3xr-accordion-toolbar mat-icon { font-size: 24px !important; width: 24px !important; height: 24px !important; color: inherit !important; } // FA icons in accordion toolbars: 24px matching Material icons. // Overrides the global .mat-mdc-button-base rule that forces ::before to 15px. mat-toolbar.p3xr-accordion-toolbar i.fa, mat-toolbar.p3xr-accordion-toolbar i.fas, mat-toolbar.p3xr-accordion-toolbar i.far, mat-toolbar.p3xr-accordion-toolbar i.fab { font-size: 24px !important; line-height: 1 !important; vertical-align: middle !important; color: inherit !important; } mat-toolbar.p3xr-accordion-toolbar i.fa::before, mat-toolbar.p3xr-accordion-toolbar i.fas::before, mat-toolbar.p3xr-accordion-toolbar i.far::before, mat-toolbar.p3xr-accordion-toolbar i.fab::before { font-size: 24px !important; line-height: 24px !important; } // Database select dropdown: wider panel, circle indicator, no selection checkmark .p3xr-database-db-select-container { min-width: 120px !important; } .p3xr-database-db-select-container .mat-mdc-option { color: var(--mat-app-text-color, inherit) !important; } .p3xr-database-db-select-container .mat-mdc-option .mat-pseudo-checkbox { display: none !important; } .p3xr-database-db-select-container .mat-mdc-option .p3xr-db-indicator { font-size: 18px !important; width: 18px !important; height: 18px !important; margin-right: 8px !important; vertical-align: middle; color: var(--mat-app-text-color, inherit) !important; } // ============================================================================ // mat-list — match production md-list // ============================================================================ .mat-mdc-list { padding-top: 0 !important; padding-bottom: 0 !important; } .mat-mdc-list-item .mdc-list-item__primary-text { font-weight: 400 !important; color: inherit !important; } .mat-mdc-list-item .p3xr-settings-label { font-weight: 500 !important; } // ============================================================================ // Hover — only on Redis settings accordion items (not connections/license) // Buttons inside list items keep their own bg on hover // ============================================================================ .mat-mdc-list-item .mat-mdc-button-base { position: relative; z-index: 1; } // ============================================================================ // Color inheritance fixes for hybrid mode // ============================================================================ .mat-mdc-card { color: var(--mat-app-text-color, inherit); } mat-toolbar { color: var(--mat-toolbar-container-text-color, inherit); } mat-dialog-container { color: var(--mat-app-text-color, inherit); } // Dialog layout: surface → container → component-host → form → toolbar+content+actions // The surface constrains the overall height. The content area scrolls. // Every level in the chain must be flex column with min-height:0 so flex shrinking works. .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-surface { border-radius: 4px !important; background-color: var(--p3xr-dialog-surface-bg, var(--p3xr-content-bg)) !important; box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12) !important; display: flex !important; flex-direction: column !important; max-height: 80vh !important; overflow: hidden !important; } .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-container { min-width: 0 !important; max-height: 80vh !important; display: flex !important; flex-direction: column !important; overflow: hidden !important; } .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host { display: flex !important; flex: 1 1 auto; flex-direction: column !important; min-height: 0 !important; overflow: hidden !important; } .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host > form { display: flex !important; flex: 1 1 auto; flex-direction: column !important; min-height: 0 !important; overflow: hidden !important; } // Toolbar stays fixed at top, actions at bottom, content scrolls in between .cdk-overlay-pane.p3xr-dialog-panel .p3xr-dialog-toolbar { flex: 0 0 auto; } .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host > .p3xr-dialog-content, .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host > form > .p3xr-dialog-content { flex: 1 1 auto; min-height: 0 !important; overflow-y: auto !important; overflow-x: hidden !important; } .cdk-overlay-pane.p3xr-dialog-panel .p3xr-dialog-actions { flex: 0 0 auto; } .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host > .p3xr-dialog-actions, .cdk-overlay-pane.p3xr-dialog-panel .mat-mdc-dialog-component-host > form > .p3xr-dialog-actions { flex: 0 0 auto; } // Snackbar dismiss button: constrain hover to a square (width = height) like an icon button .mat-mdc-snack-bar-container .mat-mdc-snack-bar-action .mdc-button { min-width: 0 !important; width: 12px !important; height: 12px !important; padding: 0 !important; display: flex !important; align-items: center !important; justify-content: center !important; } .mat-mdc-snack-bar-container .mat-mdc-snack-bar-action .mdc-button .mdc-button__ripple, .mat-mdc-snack-bar-container .mat-mdc-snack-bar-action .mdc-button .mat-mdc-button-touch-target { width: 12px !important; height: 12px !important; border-radius: 50% !important; } .cdk-overlay-backdrop.p3xr-dialog-backdrop { background-color: rgba(0, 0, 0, 0.48) !important; } html.cdk-global-scrollblock { overflow: hidden !important; } html.cdk-global-scrollblock body { overflow: hidden !important; } // TODO: HACK: Angular CDK's BlockScrollStrategy adds the class cdk-global-scrollblock to the // html element (see @angular/cdk overlay.css: .cdk-global-scrollblock { position: fixed; ... }). // That makes the html element position:fixed, which in turn affects the body's containing block. // When html is position:fixed the CDK overlay pane (position:absolute inside the // position:fixed overlay container) loses its correct containing-block relationship and // dialog content visually overflows the surface boundary (the "clipping" bug visible // in tests/screenshots/dialog-no-clipping-scrolled.png). // Setting the body to position:static cancels that side-effect and the dialog surface // overflow:hidden clips correctly again. // The trade-off is that body.style.top = -scrollY set by CDK has no effect on a static // element, so the page scroll position is not preserved while the dialog is open — which // is acceptable for this app. // Remove this override once you understand the root cause and can fix it properly. html.cdk-global-scrollblock > body { position: static !important; overflow: hidden !important; } body.p3xr-no-animation .cdk-overlay-pane.p3xr-dialog-panel, body.p3xr-no-animation .cdk-overlay-pane.p3xr-dialog-panel *, body.p3xr-no-animation .cdk-overlay-backdrop.p3xr-dialog-backdrop, .cdk-overlay-pane.p3xr-dialog-no-animation, .cdk-overlay-pane.p3xr-dialog-no-animation *, .cdk-overlay-backdrop.p3xr-dialog-backdrop-no-animation { animation: none !important; animation-duration: 0ms !important; transition: none !important; transition-duration: 0ms !important; } .p3xr-dialog-toolbar { box-sizing: border-box; display: flex !important; align-items: center !important; height: 48px !important; min-height: 48px !important; max-height: 48px !important; padding: 0 8px !important; } .p3xr-dialog-toolbar .mat-mdc-button-base { margin: 0 !important; } .p3xr-dialog-toolbar [mat-dialog-title] { margin: 0 !important; padding: 0 !important; } .p3xr-dialog-title { display: flex !important; align-items: center !important; flex: 1 1 auto; height: 100%; line-height: 28px !important; min-width: 0; margin: 0 !important; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .p3xr-dialog-toolbar .p3xr-dialog-title, .p3xr-dialog-toolbar [mat-dialog-title], .p3xr-dialog-toolbar .mat-mdc-dialog-title, .p3xr-dialog-toolbar .mdc-dialog__title { color: inherit !important; } .p3xr-dialog-title-with-icon { display: inline-flex; align-items: center; gap: 8px; } .p3xr-dialog-title-with-icon .mat-icon { margin: 0 !important; } .p3xr-dialog-content { display: block; padding: 16px !important; background-color: var(--p3xr-content-bg) !important; color: var(--mat-app-text-color, inherit); } // Links inside dialog content must contrast with the content background .p3xr-dialog-content .p3xr-timestring-link, .p3xr-dialog-content .p3xr-timestring-link .mdc-button__label { color: var(--mat-app-text-color, inherit) !important; } // Hint text in dark themes: white with opacity for readability body.p3xr-theme-dark .mat-mdc-form-field-hint { color: rgba(255, 255, 255, 0.7) !important; } // Settings page hint text — theme-aware .p3xr-settings-hint { font-size: 12px; color: rgba(0, 0, 0, 0.54); } body.p3xr-theme-dark .p3xr-settings-hint { color: rgba(255, 255, 255, 0.7); } .p3xr-dialog-content-mono { font-family: 'Roboto Mono', monospace; } .p3xr-dialog-actions { align-items: center !important; box-sizing: border-box; justify-content: flex-end !important; gap: 8px; padding: 8px !important; background-color: var(--p3xr-accordion-bg) !important; } .p3xr-dialog-actions .mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base), .p3xr-dialog-actions button.mat-mdc-button-base:not(.mat-mdc-icon-button):not(.mat-mdc-fab-base) { margin: 0 !important; min-width: 0 !important; padding-left: 10px !important; padding-right: 8px !important; letter-spacing: 0.01em !important; } .p3xr-dialog-actions .mat-mdc-button-base .mdc-button__label { display: inline !important; gap: 0 !important; letter-spacing: inherit !important; } .p3xr-dialog-actions .mat-mdc-button-base mat-icon, .p3xr-dialog-actions .mat-mdc-button-base .mat-icon, .p3xr-dialog-actions .mat-mdc-button-base i, .p3xr-dialog-actions .mat-mdc-button-base .mdc-button__label > mat-icon, .p3xr-dialog-actions .mat-mdc-button-base .mdc-button__label > .mat-icon, .p3xr-dialog-actions .mat-mdc-button-base .mdc-button__label > i { display: inline-flex !important; align-items: center !important; justify-content: center !important; margin-left: 0 !important; width: 24px !important; height: 24px !important; line-height: 24px !important; font-size: 24px !important; margin-right: 3px !important; } .cdk-overlay-pane.p3xr-license-dialog { width: 50vw !important; min-width: 0 !important; max-width: 50vw !important; } .cdk-overlay-pane.p3xr-license-tier-policy-dialog { width: 80vw !important; max-width: 80vw !important; } .cdk-overlay-pane.p3xr-license-dialog .mat-mdc-dialog-container, .cdk-overlay-pane.p3xr-license-dialog .mat-mdc-dialog-surface { min-width: 0 !important; } .cdk-overlay-pane.p3xr-connection-dialog-panel { width: 75vw !important; max-width: 75vw !important; max-height: 100vh !important; } .p3xr-connection-dialog-panel .mdc-label, .p3xr-connection-dialog-panel fieldset legend, .p3xr-connection-dialog-panel .mdc-floating-label { font-weight: 700 !important; } .p3xr-connection-dialog-panel .mat-mdc-form-field { display: block; } .p3xr-connection-dialog-panel .p3xr-md-input-container-no-bottom .mat-mdc-form-field-subscript-wrapper { display: none !important; } .p3xr-connection-dialog-panel .p3xr-md-input-container-bottom-info { font-size: 12px; margin-top: 0; } .cdk-overlay-pane.p3xr-tree-settings-dialog-panel { width: 75vw !important; max-width: 75vw !important; max-height: 100vh !important; --mat-form-field-container-height: 40px; --mat-form-field-container-vertical-padding: 8px; --mat-form-field-filled-with-label-container-padding-top: 16px; --mat-form-field-filled-with-label-container-padding-bottom: 4px; } .p3xr-connection-dialog-content, .p3xr-tree-settings-dialog-content { padding: 0 !important; background-color: var(--p3xr-content-bg) !important; overflow: auto !important; min-height: 0 !important; max-height: none !important; } .p3xr-tree-settings-dialog-content .p3xr-padding { padding-top: 26px; padding-bottom: 8px; } .p3xr-tree-settings-dialog-panel .mdc-label, .p3xr-tree-settings-dialog-panel fieldset legend, .p3xr-tree-settings-dialog-panel .mdc-floating-label { font-weight: 700 !important; } .p3xr-tree-settings-dialog-panel .mat-mdc-form-field { display: block; } .p3xr-tree-settings-dialog-panel .p3xr-md-input-container-no-bottom .mat-mdc-form-field-subscript-wrapper { display: none !important; } .p3xr-tree-settings-dialog-panel .p3xr-md-input-container-bottom-info { font-size: 12px; line-height: normal; margin-top: 0; } .p3xr-tree-settings-field-block { margin-bottom: 21px; } .p3xr-tree-settings-field-block-max-keys { margin-bottom: 16px; } .p3xr-tree-settings-toggle-block, .p3xr-tree-settings-reduced-functions { margin-bottom: 12px; } .p3xr-tree-settings-toggle-block { margin-bottom: 0; } .p3xr-tree-settings-toggle-block-keys-sort { margin-bottom: 18px; } .p3xr-tree-settings-toggle-block-search-client { margin-bottom: 19px; } .p3xr-tree-settings-reduced-functions-note, .p3xr-tree-settings-extra-info { margin-top: 8px; } .p3xr-tree-settings-message-error { color: var(--mat-sys-error, #f44336) !important; opacity: 1 !important; } .p3xr-tree-settings-toggle-block .mat-mdc-slide-toggle { display: block; margin: 0 !important; max-width: 100%; } .p3xr-tree-settings-toggle-block .mdc-form-field { display: inline-flex; align-items: center; max-width: 100%; white-space: normal !important; } .p3xr-tree-settings-toggle-block .mdc-label { white-space: normal !important; overflow-wrap: anywhere; } .p3xr-tree-settings-toggle-block-last { margin-bottom: 0; } .p3xr-connection-node-add, .p3xr-connection-node-actions { display: inline-flex; align-items: center; } .p3xr-connection-node-add .mat-mdc-mini-fab, .p3xr-connection-node-actions .mat-mdc-mini-fab { margin: 0 0 0 8px !important; } .p3xr-connection-node-actions .mat-mdc-mini-fab:first-child { margin-left: 0 !important; margin-right: 8px !important; } .p3xr-connection-inline-toggles { display: flex; flex-wrap: wrap; align-items: flex-start; column-gap: 16px; row-gap: 8px; } .p3xr-connection-inline-toggles .mat-mdc-slide-toggle { margin: 0 !important; max-width: 100%; } .p3xr-connection-inline-toggles .mdc-form-field { white-space: normal !important; } .p3xr-connection-inline-toggles .mdc-label { white-space: normal !important; overflow-wrap: anywhere; } .p3xr-connection-tls-toggles { margin-bottom: 12px; } .p3xr-connection-tls-fields { padding-top: 0; } .p3xr-connection-dialog-panel textarea.mat-mdc-input-element { min-height: 30px !important; resize: vertical; } @media (max-width: 959px) { .cdk-overlay-pane.fullscreen-dialog .mat-mdc-dialog-container, .cdk-overlay-pane.fullscreen-dialog .mat-mdc-dialog-surface { height: 100% !important; max-height: 100% !important; } .cdk-overlay-pane.fullscreen-dialog .mat-mdc-dialog-surface form { display: flex !important; flex-direction: column !important; min-height: 100% !important; height: 100% !important; } .cdk-overlay-pane.fullscreen-dialog .p3xr-dialog-content { flex: 1 1 auto; min-height: 0; overflow: auto !important; } .cdk-overlay-pane.fullscreen-dialog .p3xr-connection-dialog-content { max-height: none !important; } .cdk-overlay-pane.fullscreen-dialog .p3xr-dialog-actions { flex: 0 0 auto; margin-top: auto; } .cdk-overlay-pane.p3xr-connection-dialog-panel { width: 100vw !important; max-width: 100vw !important; height: 100vh !important; max-height: 100vh !important; } .cdk-overlay-pane.p3xr-connection-dialog-panel .mat-mdc-dialog-surface { border-radius: 0 !important; } .cdk-overlay-pane.p3xr-tree-settings-dialog-panel { width: 100vw !important; max-width: 100vw !important; height: 100vh !important; max-height: 100vh !important; } .cdk-overlay-pane.p3xr-tree-settings-dialog-panel .mat-mdc-dialog-surface { border-radius: 0 !important; } } p3xr-ng-settings .p3xr-settings-pair-row, p3xr-ng-settings .p3xr-license-features-row, p3xr-info .p3xr-settings-pair-row, p3xr-monitoring .p3xr-settings-pair-row, p3xr-search .p3xr-settings-pair-row { display: flex; width: 100%; gap: 16px; } p3xr-ng-settings .p3xr-settings-pair-row, p3xr-info .p3xr-settings-pair-row, p3xr-monitoring .p3xr-settings-pair-row, p3xr-search .p3xr-settings-pair-row { align-items: center; } p3xr-ng-settings .p3xr-settings-pair-row-valid, p3xr-ng-settings .p3xr-license-features-row { align-items: flex-start; } p3xr-ng-settings .p3xr-settings-row-label, p3xr-info .p3xr-settings-row-label, p3xr-monitoring .p3xr-settings-row-label, p3xr-search .p3xr-settings-row-label { flex: 1 1 auto; min-width: 0; font-weight: 700; } p3xr-ng-settings .p3xr-settings-row-value, p3xr-ng-settings .p3xr-license-features-text, p3xr-info .p3xr-settings-row-value, p3xr-monitoring .p3xr-settings-row-value, p3xr-search .p3xr-settings-row-value { flex: 0 1 60%; min-width: 0; text-align: right; white-space: normal; overflow-wrap: anywhere; word-break: break-word; } p3xr-ng-settings .p3xr-settings-wrap-text { white-space: normal; overflow-wrap: anywhere; word-break: break-word; } p3xr-ng-settings .p3xr-license-active-devices-item, p3xr-ng-settings .p3xr-license-features-item { height: auto !important; min-height: 48px; } p3xr-ng-settings .p3xr-license-active-devices-item .mat-mdc-list-item-unscoped-content, p3xr-ng-settings .p3xr-license-features-item .mat-mdc-list-item-unscoped-content { white-space: normal !important; } p3xr-ng-settings .p3xr-license-active-devices-content { width: 100%; padding-top: 4px; padding-bottom: 4px; } p3xr-ng-settings .p3xr-license-active-devices-note { white-space: normal !important; overflow-wrap: anywhere; word-break: break-word; opacity: 0.78; line-height: 1.35; font-size: 12px; } p3xr-ng-settings .p3xr-license-features-text { line-height: 1.4; padding-top: 4px; padding-bottom: 4px; } .p3xr-license-tier-policy-dialog .mat-mdc-dialog-title { font-size: 165%; line-height: 1.2; font-weight: 700; } .p3xr-license-tier-policy-dialog .mat-mdc-dialog-content h4 { font-size: 125%; line-height: 1.2; margin: 0 0 2px 0; font-weight: 700; } .p3xr-license-tier-policy-dialog .mat-mdc-dialog-content hr { opacity: 0.25; margin: 8px 0; } // ============================================================================ // Prevent horizontal scrollbar from body during hybrid mode // ============================================================================ body { overflow-x: hidden; } // ============================================================================ // Neutralize Angular Material primary-tinted surface colors for ALL light themes. // M3 tints surfaces with the primary palette (e.g. violet → purple inputs/selects). // The AngularJS Common sub-theme uses accentPalette('grey') for input backgrounds, // so all Angular Material surfaces must be neutral grey/white, not tinted. // Must come AFTER all per-theme mat.all-component-colors() blocks to win the cascade. // ============================================================================ body.p3xr-theme-light { // Surfaces: pure white (no primary tint) --mat-select-panel-background-color: #ffffff; --mat-dialog-container-color: #ffffff; --mat-menu-container-color: #ffffff; --mat-autocomplete-background-color: #ffffff; --mat-datepicker-calendar-container-background-color: #ffffff; --mat-card-outlined-container-color: #ffffff; --mat-table-background-color: #ffffff; --mat-paginator-container-background-color: #ffffff; // Form fields: neutral grey (matching AngularJS Common accent=grey) --mdc-filled-text-field-container-color: #f5f5f5; --mat-form-field-filled-container-color: #f5f5f5; // Options / selections --mat-option-selected-state-layer-color: rgba(0, 0, 0, 0.12); --mat-option-label-text-color: rgba(0, 0, 0, 0.87); } // Redis overrides p3xr-theme-light background — must come after body.p3xr-theme-light to win cascade body.p3xr-mat-theme-redis { --mat-app-background-color: #ffebee; // red-50 (lightest red) } // Same neutralization for dark themes — M3 tints dark surfaces with primary palette too. // All dark themes use Common accentPalette('grey') except Matrix (light-green), // but ALL should use neutral grey for input backgrounds. body.p3xr-theme-dark { // Surfaces: neutral dark grey (no primary tint) --mat-select-panel-background-color: #424242; --mat-dialog-container-color: #424242; --mat-menu-container-color: #424242; --mat-autocomplete-background-color: #424242; --mat-datepicker-calendar-container-background-color: #424242; --mat-card-outlined-container-color: #424242; --mat-table-background-color: #303030; --mat-paginator-container-background-color: #303030; // Form fields: neutral dark grey (matching AngularJS Common accent=grey) --mdc-filled-text-field-container-color: #404040; --mat-form-field-filled-container-color: #404040; // Options / selections --mat-option-selected-state-layer-color: rgba(255, 255, 255, 0.12); --mat-option-label-text-color: rgba(255, 255, 255, 0.87); } // ============================================================================ // Force AngularJS input/dialog backgrounds to neutral (matching Common accentPalette='grey'). // AngularJS Material's runtime $mdTheming CSS tints surfaces with the primary palette. // These overrides use high specificity to beat the runtime-generated theme CSS. // ============================================================================ body md-dialog, body md-dialog md-dialog-content, body md-dialog md-dialog-content md-content, body [md-theme] md-dialog, body [md-theme] md-dialog md-dialog-content { background-color: var(--p3xr-dialog-surface-bg) !important; } // All form controls: inputs, textareas, selects, switches, checkboxes body md-input-container, body md-input-container .md-input, body md-input-container input, body md-input-container textarea, body md-select, body md-select md-select-value, body md-switch, body md-checkbox, body md-radio-button, body [md-theme] md-input-container, body [md-theme] md-input-container .md-input, body [md-theme] md-input-container input, body [md-theme] md-input-container textarea, body [md-theme] md-select, body [md-theme] md-select md-select-value, body [md-theme] md-switch, body [md-theme] md-checkbox, body [md-theme] md-radio-button { background-color: transparent !important; } // Select dropdown panel and menu content body md-select-menu, body md-select-menu md-content, body md-option, body [md-theme] md-select-menu, body [md-theme] md-select-menu md-content { background-color: var(--p3xr-dialog-surface-bg) !important; } // Fieldset backgrounds inside dialogs (SSH section etc.) body md-dialog fieldset, body [md-theme] md-dialog fieldset { background-color: transparent !important; } // Tree node tooltip: shift 36px right (node label + action buttons) .p3xr-tree-node-tooltip { margin-left: 36px !important; } src/overlay/000077500000000000000000000000001517666434100133435ustar00rootroot00000000000000src/overlay/overlay.js000066400000000000000000000020641517666434100153640ustar00rootroot00000000000000let isShown = false p3xr.ui.overlay = new function () { const template = (options = {}) => { return `
${options.hasOwnProperty('message') ? "

" : ''} ${options.hasOwnProperty('message') ? options.message : ''}
` } this.show = (options = {}) => { this.hide() document.body.classList.add('p3xr-overlay-visible') document.body.insertAdjacentHTML('beforeend', template(options)) isShown = true } this.hide = () => { isShown = false document.body.classList.remove('p3xr-overlay-visible') const el = document.getElementById('p3xr-overlay') if (el) el.remove() } } const interceptEscapeKey = (event) => { if (event.key === 'Escape' && isShown === true) { event.stopPropagation(); event.preventDefault(); } }; document.addEventListener('keydown', interceptEscapeKey, true); src/overlay/overlay.scss000066400000000000000000000014611517666434100157230ustar00rootroot00000000000000#p3xr-overlay { font-size: 125%; // Move this declaration above the nested rule position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; text-align: center; /*Flexbox*/ display: flex; flex-direction: column; align-items: center; align-content: center; justify-content: center; background-color: rgba(0, 0, 0, 0.9); z-index: 99999; color: rgba(128, 128, 128, 0.5); i { font-size: 400% !important; } #p3xr-overlay-info { } } body.p3xr-overlay-visible { .cdk-overlay-container, .cdk-global-overlay-wrapper, .cdk-overlay-pane, .cdk-overlay-backdrop { z-index: 1 !important; opacity: 0 !important; visibility: hidden !important; pointer-events: none !important; } } src/public/000077500000000000000000000000001517666434100131405ustar00rootroot00000000000000src/public/images/000077500000000000000000000000001517666434100144055ustar00rootroot00000000000000src/public/images/256x256.png000066400000000000000000000303271517666434100160610ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs B(xtIME  ) Fm IDATxy]UsoURLd$-eAYQPA {m6QAVhʠЂaTBJԜJ%d$u|Pg^{bX,bX,bX,bX,bX,bX,bX,bX,bX,bX,@!7|4S ZVb-k,!EʜR}Zrp0}i&ZskZ`1[z#}6S$4F=ֈmk,&,}R .W)ϊ)9a X/;r눏ke>v#~__Kqz:}@_aZR$8WrOKɑˀO)O#).h / /n @xܒӵr>"`J ^xXڗ, vq&_x ՝՚"yzcDO\P.G.p%܎n k#}+NCb @$\?.[\ > Q9 5⁄=}-v8Xl+!gG䐐 uhEݣ=oci^49rv/}DE]OtOOU~]vY`nыRWjU@].WVq wJ)={G@odc#C)p׉clEe4snߧ:;zq:~mr>L*^Ez}?C/ҹ}kfg59'SWS  }qgcoTx<4:}xEzE T~gEٲcAg0:^X UYTk&>u%1&?0=΍'Ϡ޵[hL\ORwfKvZpHeE8F=pO~J#;֭wgϜI_,c<⥳?ZO|yss?uԬ/0Y+%߹s?/t>0ZJ?x&%Oz|+a#^^T \bjtOьi͏='m $`B](?*NZNDU*5xU8ɢPcż@Pg=1VqN%9fIԌudM jbenWqohCbČŔ)*_{UL{I̙]>"ETW'.Rw3ھՈ$!9frUh>CsB#XУ8Ƀk) Tw7w"Hkk\[yoS0{4̉xeW>;]IzёP p_ j^ ,)ץRuL=zM VDdx&׼JsP)3<$64 o}HM.n`o^xۅ ׹礗^_s`ZL2TvUflܹKsG,lIygov~2[>3n,080/dqI/Da jQG͒F\R:.u\5I5;z1-9|N*a?ڿ5Rӧ4$dwRl9! zV-hoabW^}K?Sb-%]?ƖN3Gaك$u2% e3uYT(AZό5|ӮSh Cj"qd\T shA}RtI͈οN)gDGf[ʧy8ET A8Bhi벸.oH'Tj:!FptIKF:tVY?@ٲb!P|B蕚)ɦ׀o5 c8aЧɷWV>gGAM+^R"_kZS8GhX+)e~j!us aH /TIQ^yto/XM(-%=4G0|[m~w0TM)Ɉet:;ݿgOA+Xpp戂ExM唲..㔲gZv.~{csbO0zB0UTЗIJ+A!UӒg< i*jz*ִ|Pu__FRz/O@+v1;1;(AXִδmXԤ/9#艂w^7܄;5ŔPQy~xOl$UPAа+bn$IYxd@IW[ 90fLusn( uu̾v5瞇ppyi^ykjC@ۧ*̷Iz^_њVLlm! 7ʩ%sOQ{GqJ@HlcZ,ROt2(u%XZuB7V]#փڻKbxeeTvէPSKDO߆6ʟ/7x_f$,,Nnݗ|ͺ%!1R9RwL}Qv1Ϛ]I3ګ>{zlr͘A{)63\E%I%( 15+-9shN7Gu4%GA{pw}R*1:CF*ƙ g<0J+jnMLs{N(G6ol Y@%~EE8EES?8Nû}mkeTWmgO#{BDӐpHU `IWfS:{=bpϠd\Υ9 '(W+5ZS*\)!+:rm a+JŠT9:ϡslk߈ᕕQ4s3g1e|Jͧx,J).[yo9KA#NkM%ҟ:4[Rm)IP98'q.gR2Sͣh,g8prRl(xSi}E0雵:}E(su J{<n~lѽ AW HD! $z.uCZܟ]`s79sޛ7ځ^k6Qy95%miI rf|n>o~h)iWuh2#:(<5^n_+:"=;7&Z3s,[.Ck27gHiRDZQ .;&ˎukv=vz`+s ~c֚v?Ht(s3^M`P-_ jǨt.y, xWi@jXHj3)n,xMdηocyiI"TB uCD"q'RTqfh5 _y?ا\6GԂ:j( ]F=<W@ C*Ǜn\q{Yp=(uԂ"4L[CQ G(+ZZޥK'nbo !(D1hX2g.~/2%'cMo#5vfK=i 7ذ1n[@[;zWP98S4\v9S.?GtWq͸v| Ƹ͝[/[{ 2Q*O.]r$Fx~'K>?0nנ\S$DgxkÆ73>gmMM!kĀlа8 5ԝw>~ƃ.57B&犩1hy3U9Ӟ}k @o/Z>2KE!h8T/i'ޓ&~=n~%\3.t+Ozy!1Ct4CŠas;/oڴ[ C%*=ƃ+8[<َ\5_-Ul2Bx?(CgWt]B)Ј{wT{. Џ)໤=4u' -q!{h:*/Fx _t GηWa?2yܗ'Y؋ pҋ&ĉ_y`b‰\а98J=b8g:nZ۟{(g'HM˼5  X}:*]A ˖ތ+pHl]:T:AU4+y~ fO@mV>J͐ ^8vO'mӰ]*cⶍ?E(hO7_*|P eAxa|XKWpj}DEIRr_KPyjJKdo4#5=ҧԻUc$fHi A+K8s7i.UNr5NWF(;x7!ug:%7 (+"*WPzPANA 3Z `Z檧܍%0Ed3 ~UHfJҿ+)EyqaKAie8ш<5Y/@\D}H toMc/5Su kͦdAW+^AQNR-iIk:םI܉1/DQ [R>}<֏J%{A+(w=fȩx]宠s$]MTeQWt~ ֠T>dXWG0+276ACq?^T9F:-瀛S3DiE̽=ƛ)ITNF\W61 (Jי3] ?jv*Y uC0@GSzd铚aaF¼c0{{+W$4%]7¥jC7{sC|EK84&\"q *ڮ8473wP۩jM[:iEАp(6,tG, A倔9*Q%RGZq'!s,5 EK3 GPySҚA*k;Id~P&RQ+11=AC+%TסT@#.JkFtpT#,u؞C[ءm N`J,|ienIT 7!P>n>S{_9Fr}A/s1)KZ%%jf^B@cw0E]E}dkk p+DuR3.s JGACCa{ 셈U,uyPiGȪcdE=Ӱ˗V2. kY&5[r^Кe~acaJx$Pxi:N#M8TffW4ɴV{{U~4h<*HbxE(3g+^P I*7P-14EjɈI|95 @o75-.>F SJ!3l!wPWZi|mXIDATLdyhIuNg %1Airj2ȱ{?uB@{hg~!?|"%G.nNιCqI`1=0K r Dƽ d]RG^7=$)Ÿ#_аgreltw~蕊>*1A+Y lB^$>۟²#/B| &eӒeJjQA?*Y3' "4u(6toFc4Feh:N>|AJ#% Eа vAUW@9)y;3ހ:OYuϡGi;bP)L[S!\#+,'i^ȼa F7vۚmd51S-iOД'O_*|P tM k-iŞҰ1峨+u߇;#0aVӰD+SWv&6En@i>Y737RZv \l8dy kx+%ْTj ؞ SbGfk:c*0 5߇ofXFIiݾzw=ĝU+:jhOˠ^g?隶%R1U\ze%LN϶lĔQ7 Ial^ v(#>`fpǂ|>|qhx'#y^9~XnviL(LL3#-![: 5O0jsAhHZU8FO\tN03Ҵfjog"fΦ2h5}R'U{ߙ|}.23)M$v|)nテ3K**A)3E$.ST}6Kh):4jI`z. r4&h8*=2GLNPk2O5QvtinSkݦupkОdL1h( jpE U JqPiJ34R3 #Ieɴ M:?GIٸ^ 2*]32hiw]JAIFkQך"Za6(m15Jt}PiG̨1d|а_j &28/JOac?ִW yrvtAV!̪VΘzQ2 ㊩}!MiZ؝ցv}(͜ Oca\U{ooZӒw(dsj=3$iE3I;&O w)٪$ ٢sq4iIAY,)mJ]|\˓ÄC mZ @zSi#w+Onlа0ԮM4Ye|Eyx`JNA=hHŚFޔ}ʦ%&ߕnq#[{`XOloPKk9w4 t%R3j䘂W4-BX0NP&w5('+qG%u/OaJk}E`xބ|7{@;5X.19h 6h}Ax \Ewf_ʏ]iS {vMM< /7W@"`D+.APR4Da:D9+|t&[ohgDKqcҥStQ{۬IA]K6P2[PU96Gb[(xmZ_b'9qܹN2K{: К^F4z.\j;|#So\[#N1ǔ&FFnpeGZWPp)6La{DHw/vj[}iӦ--KV9 XD4ܙikXd X]z#Bܫ7[v4Ã*P]AM5/_ZQ_T35~iV epY`Avݫ&`f +׶>RbS2YR5N`ZaV('&Z -OWT? K&+||L *Mg ʫv י i[HxJ(--O&7+ʦS3^05h8WJuxH(u94"[/"-CY{xP*74(7)2u?'j2aZC Vw .Ŏ2WpQ޶NK7mНXΤjr-ħZ`Q\ ǓAq|'dޘIAۄhi/W_t.2ps+55K2,:cRBsu/rkS<W k*.ԠhL8d h!~m_\B>H^s' Vlа.ӥ-l=78gp1)Ժ qJC[ZWw{m-BSͶ3MpՁIg< !VN_K 3zEʊb4,PrCx<֚[:/kaxBŋG뀏8zQ]H;ՏED +_z#ACTϥ5 *Mk:5*)+ϯ^ %q :As R-H xL*u --/Dqs =q k@kz2;;}ߡ } ۢ]FU kǹ82ܷFѰWtT=BnnnNxI4,wr:Z'5R1(#/++Wl[bDq :Ja8bBAj͐ HMqHBHߺnw!IHk0KBW &M Ou'1&),Xuk+2,q@ bu?c# ˸Lkct$O\~z;8 #>[n9:z ogG jg a-ʱ0njs4 CRUж ܾxqgiB{k<ӗd.#RX7ћ}ַ#b @ >9bÆWpX`͝[$Wj8ŽȤ)Ί.;ͧUmvt;͋ⲲR{o @\K,R~ 2E9DqPn#Ol5 Np"ķ]6[X04w+n5b|PjՊ օ up9PKk!aXÝMI$D뀹!3)?߸iSXxжhѹhW4$Nߺaݺ65/^k} ? j!Mxׯmnn_$Ҟwz0ݠGRU5j"8 GQڅ ~;šXru>o*p{o"q_gX`1[_|~ #n @>}hi釵1@PI9<[cp,Ccb{W src/scss/000077500000000000000000000000001517666434100126355ustar00rootroot00000000000000src/scss/index.scss000066400000000000000000000146171517666434100146520ustar00rootroot00000000000000@use 'vars' as v; @use '../main'; body { font-family: Roboto, 'Helvetica Neue', sans-serif; margin: 0; background-color: var(--p3xr-body-bg, #303030); color: var(--mat-app-text-color, rgba(255, 255, 255, 0.87)); } // Scrollbar theming — color-scheme tells the browser to use native dark/light scrollbars body.p3xr-theme-dark { color-scheme: dark; } body.p3xr-theme-light { color-scheme: light; } [data-color-scheme="dark"] { color-scheme: dark; } [data-color-scheme="light"] { color-scheme: light; } // Global link color — light blue in dark mode for visibility a { color: var(--p3xr-link-color, #1a73e8); } // Reset MDC typography letter-spacing to use Roboto's natural kerning :root { --mat-toolbar-title-text-tracking: normal; --mat-toolbar-title-text-letter-spacing: normal; --mdc-list-list-item-label-text-tracking: normal; --mdc-list-list-item-supporting-text-tracking: normal; --mdc-filled-button-label-text-tracking: normal; --mdc-text-button-label-text-tracking: normal; --mdc-outlined-button-label-text-tracking: normal; --mdc-tab-indicator-active-indicator-letter-spacing: normal; --mat-tab-header-label-text-tracking: normal; --mat-menu-item-label-text-tracking: normal; --mat-option-label-text-tracking: normal; --mat-select-trigger-text-tracking: normal; --mat-form-field-container-text-tracking: normal; } *, *::before, *::after { letter-spacing: normal !important; } // Allow MDC list item text to wrap and list items to grow in height .mat-mdc-list-item { height: auto !important; min-height: 48px; } .mdc-list-item__primary-text { white-space: normal !important; text-overflow: unset !important; overflow: visible !important; } #adsbygoogle-container { position: fixed; bottom: 55px; right: 10px; z-index: 3; } .md-button { border-radius: v.$border-radius; } md-toast { position: fixed !important; } .p3xr-connected-readonly-filler { height: 40px; } md-dialog.fullscreen-dialog { width: 75%; } md-dialog.p3xr-license-dialog { width: 50%; max-width: 50%; } md-dialog.p3xr-license-tier-policy-dialog { .md-title { font-size: 165%; line-height: 1.2; font-weight: 700; } .md-dialog-content-body h4 { font-size: 125%; line-height: 1.2; margin: 0 0 2px 0; font-weight: 700; } .md-dialog-content-body hr { opacity: 0.25; margin: 8px 0; } } @media (max-width:959px) { md-dialog.fullscreen-dialog { min-height: 100%; min-width: 100%; border-radius: 0; md-dialog-content { height: 100vh; md-content { height: 100%; } } } } button > md-icon { position: relative; top: -1px; } /* md-dialog md-dialog-actions { display: flex; flex-flow: row-reverse; justify-content: right; } md-dialog md-dialog-actions button { } */ .p3xr-animation { } .p3xr-theme-light { fieldset { border-color: rgba(0, 0, 0, 0.5); } } .p3xr-theme-dark { fieldset { border-color: rgba(255, 255, 255, 0.25); } ::selection { color: white; background: black; } ::-moz-selection { color: white; background: black; } } md-toolbar, .md-toolbar-tools { height: v.$toolbar-height !important; min-height: v.$toolbar-height !important; max-height: v.$toolbar-height !important; } body.p3xr-no-animation * { //transition: none; // weird fix transition: none !important; // md-backdrop.md-opaque.ng-enter fix md-backdrop.md-opaque.ng-enter { opacity: 0.48; } } #p3xr-redis-ui-bootstrap { height: 100vh; } .fa, .fas, .fab, far, .svg-inline--fa { transform: scale(1.5); margin-right: 5px !important; margin-left: 5px !important; } [ng-click] { cursor: pointer; } .md-button { min-width: auto; } .p3xr-md-input-container-no-bottom { margin-bottom: 0px; padding-bottom: 0px; } .p3xr-md-input-container-no-top { margin-top: 0px; padding-top: 0px; } .p3xr-md-input-container-bottom-info { font-size: 12px !important; color: rgba(0, 0, 0, 0.54) !important; } body.p3xr-theme-dark .p3xr-md-input-container-bottom-info { color: rgba(255, 255, 255, 0.7) !important; } .p3xr-typography-ellipsis { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .p3xr-theme-light { /* .p3xr-input { border-color: rgba(128, 128, 128, 0.5); } */ json-tree .key { color: black; font-weight: bold; } .p3xr-md-menu-item-selected { background-color: rgba(0, 0, 0, 0.1) !important; } } .p3xr-theme-dark { .p3xr-md-menu-item-selected { background-color: rgba(255, 255, 255, 0.1) !important; } json-tree .key { color: rgba(255, 255, 255, 0.6); font-weight: bold; } ::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: rgba(255, 255, 255, 0.75); } /* .p3xr-input { background-color: gray; color: white; border-color: rgba(200, 200, 200, 0.5); } */ } .p3xr-pre { font-family: 'Roboto Mono' !important; //font-weight: 500; font-size: 16px; line-height: 18px; overflow: hidden !important; //white-space: pre; white-space: pre-wrap; //word-wrap: break-word !important; //overflow-wrap: break-word !important; // white-space: pre-wrap; word-spacing: 0px; //white-space: text-wrap; } .p3xr-not-selectable { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .p3x-margin-height { margin-bottom: v.$layout-padding; } input { font-family: 'Roboto' !important; // font-weight: 500; } textarea { font-family: 'Roboto Mono' !important; } treecontrol { font-family: 'Roboto Mono' !important; font-weight: 500 !important; } md-input-container.p3xr-md-input-container-no-bottom div.md-errors-spacer { min-height: 0px; } .p3xr-roboto-monospace * { font-family: 'Roboto Mono' !important; font-weight: 500 !important; } .p3xr-padding { padding: 8px; } .md-tooltip { background-color: black !important; color: white !important; } .md-raised:focus { outline: -webkit-focus-ring-color auto 1px; } src/scss/vars.scss000066400000000000000000000001011517666434100144750ustar00rootroot00000000000000$toolbar-height: 48px; $layout-padding: 5px; $border-radius: 4px;src/strings/000077500000000000000000000000001517666434100133535ustar00rootroot00000000000000src/strings/ar/000077500000000000000000000000001517666434100137555ustar00rootroot00000000000000src/strings/ar/strings.js000066400000000000000000001047001517666434100160060ustar00rootroot00000000000000const strings = { error: { cleared_license: "رخصة مسح", invalid_license: "ترخيص غير صالح", license_max_devices_reached: "تم الوصول إلى الحد الأقصى لعدد مقاعد الجهاز", license_readonly: "لا يمكن تغيير الترخيص إلا من محطة الخادم.", server_error: "خطأ في الخادم، يرجى المحاولة مرة أخرى" }, title: { donate: "تبرع", jsonRecursive: "توسيع جميع الأوراق", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "يمكنك اختيار اتصال Redis للاتصال من القائمة السفلية اليسرى.", statistics: "الإحصائيات", error: "خطأ", connectingRedis: "الاتصال بـ Redis ...", socketioConnectError: "خطأ Socket.IO", db: "DB", server: "الخادم", clients: "العملاء", memory: "الذاكرة", persistence: "المثابرة", stats: "الإحصائيات", replication: "النسخ المتماثل", cpu: "CPU", cluster: "Cluster", modules: "الوحدات", errorstats: "إحصائيات الأخطاء", commandstats: "إحصائيات الأوامر", latencystats: "إحصائيات زمن الاستجابة", keysizes: "أحجام المفاتيح", threads: "الخيوط", }, confirm: { dropIndex: "هل أنت متأكد من حذف هذا الفهرس؟", uploadBuffer: "هل أنت متأكد من تحميل هذه البيانات الثنائية؟", uploadBufferDone: "يتم تحميل البيانات الثنائية", uploadBufferDoneAndSave: "يتم تحميل البيانات الثنائية وحفظها على الخادم", title: "تأكيد", alert: "تنبيه", info: "معلومات", deleteListItem: "هل أنت متأكد من حذف عنصر القائمة هذا؟", deleteHashKey: "هل أنت متأكد من حذف عنصر مفتاح التجزئة هذا؟", deleteStreamTimestamp: "هل أنت متأكد من حذف هذا الطابع الزمني للبث؟", deleteSetMember: "هل أنت متأكد من حذف هذا العضو في المجموعة؟", deleteZSetMember: "هل أنت متأكد من حذف عضو المجموعة الذي تم فرزه؟", deleteConnection: "تأكيد", deleteConnectionText: "هل أنت متأكد من حذف اتصال Redis هذا؟", deleteNode: "هل أنت متأكد من حذف عقدة Redis هذه؟", deleteAllKeys: opts => { return `احذف هذه الشجرة وكل مفاتيحها (${opts.key})؟`; }, socketioConnectError: "لا يمكن لـ Socket.IO الاتصال بالخادم، يمكنك إعادة التحميل ومحاولة حل خطأ الاتصال بنفسك، ولا يعرف العميل كيفية حل المشكلة بنفسه.", socketioAuthRequired: "مطلوب إذن Socket.IO. يرجى المصادقة باستخدام HTTP Basic Auth (اسم المستخدم/كلمة المرور) وإعادة التحميل.", deleteKey: "هل أنت متأكد من حذف هذا المفتاح؟", rename: { title: "هل أنت متأكد من إعادة تسمية هذا المفتاح؟", textContent: "يؤدي هذا الإجراء إلى إعادة تسمية المفتاح بشكل دائم.", placeholder: "مفتاح Redis (مطلوب)" }, ttl: { title: "هل أنت متأكد أنك تريد تغيير TTL لهذا المفتاح؟", textContent: "يؤدي تغيير TTL إلى تحديث مدة بقاء هذا المفتاح. اتركه فارغًا للاحتفاظ بهذا المفتاح إلى الأبد.", placeholder: "مفتاح Redis TTL (عدد صحيح أو فارغ)", placeholderPlaceholder: "فارغة تعني أنها ستستمر إلى الأبد؛ وإلا أدخل عددًا صحيحًا.", convertTextToTime: "تحويل النص إلى وقت", convertTextToTimePlaceholder: "على سبيل المثال. 1d سيكون 86400" }, license: { title: "تعيين الترخيص", textContent: "إذا كنت ترغب في استخدام الميزات المدفوعة، يرجى الاتصال بـ support@corifeus.com لطلب الترخيص. السعر هو Pro 400 HUF/شهر (1 يورو/شهر) أو 4000 HUF/سنة (10 يورو/سنة)، وEnterprise 1200 HUF/شهر (3 يورو/شهر) أو 12000 HUF/سنة (30 يورو/سنة). سنويا هو 10x شهريا. مع 27% VAT، يكون الإجمالي Pro 500 HUF/الشهر (1.27 يورو/الشهر) أو 5,100 HUF/السنة (12.70 يورو/السنة)، Enterprise 1,500 HUF/الشهر (3.81 يورو/الشهر) أو 15,200 HUF/سنة (38.10 يورو/سنة). يتطلب التحقق من الترخيص الوصول إلى الإنترنت. يتضمن الترخيص الافتراضي 5 مقاعد. إذا كنت بحاجة إلى المزيد من المقاعد، اتصل بنا على support@corifeus.com.", placeholder: "مفتاح الترخيص" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "نسخ", downloadBuffer: "تحميل ثنائي", setBuffer: "تحميل ثنائي", exportKeys: "تصدير المفاتيح", exportAllKeys: (opts) => `تصدير جميع المفاتيح (${opts.count})`, exportSearchResults: (opts) => `تصدير ${opts.count} نتيجة`, importKeys: "استيراد المفاتيح", saveWithFormatJson: "حفظ مع التنسيق", formatJson: "تنسيق جيسون", wrap: "التفاف", unwrap: "بسط", downloadJson: "تحميل JSON", pubsubMonitor: "شاشة PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "اللغة", ok: "حسنًا", addKey: "أضف إلى هذا المفتاح", addKeyRoot: "أضف مفتاح الجذر", reloadKey: "إعادة تحميل المفتاح", reload: "إعادة تحميل", close: "إغلاق", commands: "الأوامر", view: "عرض", statistics: "الإحصائيات", refresh: "تحديث", pause: "إيقاف مؤقت", resume: "استئناف", clear: "واضح", rename: "إعادة تسمية", main: "قاعدة البيانات", cancel: "إلغاء", theme: "الموضوع", github: "GitHub", githubRepo: "مستودع", githubRelease: "الإصدارات", githubChangelog: "سجل التغيير", info: "Info", settings: "الإعدادات", connect: "الاتصال", disconnect: "قطع الاتصال", overview: "نظرة عامة", console: "وحدة التحكم", noConnections: "لا يوجد اتصالات، قم بإضافة اتصال في قائمة الإعدادات.", noConnectionsInSettings: "لا توجد اتصالات، يمكنك إضافة اتصال جديد أعلاه.", connectionAdd: "اتصال جديد", addGroup: "إضافة مجموعة", extend: "تمديد", collapse: "طي", add: "أضف", edit: "تحرير", save: "حفظ", ttl: "قم بتعيين TTL", license: "تعيين الترخيص", delete: "حذف", remove: "إزالة", sure: "بالتأكيد", testConnection: "اتصال الاختبار", getKey: "جارٍ تحميل مفتاح Redis والبيانات المرتبطة به ...", jsonViewShow: "عرض JSON", jsonViewEditor: "تحرير JSON", quickConsole: "وحدة التحكم السريعة", }, label: { id: { nodeId: "معرف العقدة", id: "معرف الاتصال", info: "إذا كنت لا ترغب في تغيير خصائص: sshPassword، وsshPrivateKey، وpassword، وtlsCrt، وtlsKey، وtlsCa، فيرجى إدخال معرف الاتصال في تلك الخصائص للحفاظ على قيم الخاصية سليمة. إذا كنت تريد نفس المنطق في كلمة مرور العقدة، فأدخل معرف العقدة في كلمة مرور العقدة." }, secureFeature: "إذا رأيت قيمة تبدأ بـ P3X بنفس الشكل، فهذه ميزة آمنة. لتغيير الإعدادات، ما عليك سوى استبدال هذه الإعدادات بفارغة أو أي شيء آخر وسيتم حفظها. إذا لم تقم بتغيير الإعدادات، فسيتم الاحتفاظ بالإعدادات كما هي على الخادم.", ssh: { on: "SSH على", off: "إيقاف تشغيل SSH", sshHost: "المضيف SSH", sshPort: "منفذ SSH", sshUsername: "اسم المستخدم SSH", sshPassword: "كلمة المرور SSH", sshPrivateKey: "SSH المفتاح الخاص" }, isBuffer: opts => `[object ArrayBuffer] يعني أن القيمة عبارة عن بيانات ثنائية أو أن القيمة أكبر منها ${opts.maxValueAsBuffer}`, streamValue: `حقل الدفق والقيمة عبارة عن خط واحد. على سبيل المثال: الحقل 1 القيمة 1 "الحقل 2" "القيمة 2"`, streamTimestampId: `"*" يعني إنشاء تلقائي أو المواصفات كـ -`, unableToLoadKey: ({ key }) => { return `غير قادر على تحميل هذا المفتاح: ${key}. ممكن، تم حذف المفتاح. الخطأ الدقيق موجود في وحدة التحكم.`; }, bigJson: "يزيد حجم كائن JSON هذا عن 10 كيلو بايت، لذا تأكد من أنك تعرف ما تفعله، لأن بعض الوظائف قد تكون بطيئة في العرض.", addNode: "أضف عقدة", validateJson: "التحقق من صحة JSON", reducedFunction: `انخفاض الوظائف`, tooManyKeys: opts => { return `للحصول على الحد الأقصى الكامل للوظائف المسموح بها، إجمالي المفاتيح هو ${opts.maxLightKeysCount} العد. تحتوي قاعدة البيانات هذه على المفاتيح المسموح بها إجمالاً ${opts.count}. تم تعطيل فرز المفاتيح ومعلومات الشجرة الفاخرة الإضافية. يتم البحث فقط على الخادم بدلاً من بحث العميل.`; }, redisCommandNotFound: "لم يتم العثور على تطابق أمر Redis ...", treeKeyStore: `يتم تنفيذ الفرز (المقارنة الطبيعية) على العميل المعروف أيضًا باسم المتصفح، مما يعني أنه يفرض عقوبة على المجموعات الكبيرة الكبيرة، مثل أكثر من 10 آلاف مفتاح، وقد يضيف القليل من الوقت لعرض الصفحة. لا يوجد فرز للمفاتيح في Redis، فقط هكذا.`, socketIoTimeout: options => { return `انتهت مهلة Socket.IO لهذا الطلب (بحد أقصى ${options.timeout / 1000} ثواني)...`; }, resizerInfo: options => { return `الحد الأدنى لعرض اللوحة اليسرى أو اليمنى هو ${options.width}بكسل`; }, jsonViewNotParsable: "هذه القيمة غير قابلة للتحليل JSON ", ttlTitle: "اضبط TTL في ثوانٍ", passwordSecure: "قد تكون كلمة المرور فارغة، ولكنها ستظهر أحرفًا، وهذه ميزة أمنية.", tlsWithoutCert: "تمكين TLS بدون شهادة إضافية", tlsRejectUnauthorized: "رفض الشهادة غير المصرح بها", tlsSecure: "إذا رأيت تكوين TLS يبدأ بـ P3X أو تبدو جميع إعدادات TLS متشابهة، فهذه ميزة آمنة. لتغيير الإعدادات، ما عليك سوى استبدال هذه الإعدادات بفارغة أو أي شيء آخر وسيتم حفظها. إذا لم تقم بتغيير إعدادات TLS، فسيتم الاحتفاظ بالإعدادات كما هي على الخادم.", treeSeparatorEmpty: "إذا كان فاصل الشجرة فارغًا، فلن تحتوي الشجرة على عقد متداخلة، بل مجرد قائمة خالصة", treeSeparatorEmptyNote: "لا توجد عقد متداخلة، مجرد قائمة نقية", welcomeConsole: "مرحبًا بك في وحدة التحكم Redis", welcomeConsoleInfo: "تم تمكين سجل المؤشر لأعلى أو لأسفل", redisListIndexInfo: "فارغ للإلحاق، -1 للإلحاق به أو حفظه في الموضع الموضح.", console: "وحدة التحكم", connectiondAdd: "إضافة اتصال", connectiondEdit: "تحرير الاتصال", connectiondView: "عرض الاتصال", connections: "اتصالات", licenseInfo: "الترخيص", licenseEditable: "الترخيص قابل للتحرير", licenseEditableYes: "نعم", licenseEditableNo: "لا", licenseTerminalOnly: "لا يمكن تكوين الترخيص إلا من محطة الخادم.", licenseTierPolicyTitle: "سياسة الطبقة", licenseTierPolicyText: "

Free

core Redis واجهة المستخدم فقط؛ لا يوجد نفق SSH، لا يوجد وضع اتصال للقراءة فقط، لا يوجد Cluster/Sentinel، لا يوجد تحرير JSON/تحميل ثنائي/تنزيل ثنائي، لا ReJSON.
السعر: 0 HUF/شهر (0 يورو/شهر).

Pro

SSH النفق، وضع الاتصال للقراءة فقط (بما في ذلك --readonly-connections/-r)، تحرير JSON، تحميل ثنائي، تنزيل ثنائي، ReJSON.
السعر الأساسي: 400 HUF/شهر (1 يورو/شهر) أو 4000 HUF/سنة (10 يورو في السنة).
الإجمالي بنسبة 27% VAT: 500 HUF/شهر (1.27 يورو/شهر) أو 5,100 HUF/السنة (12.70 يورو/السنة).

Enterprise

SSH حفر الأنفاق، Cluster وSentinel، بالإضافة إلى تحرير JSON، تحميل ثنائي، تنزيل ثنائي، ReJSON؛ --readonly-connections/-r يعمل أيضًا.
السعر الأساسي: 1200 HUF/الشهر (3 يورو/الشهر) أو 12000 HUF/السنة (30 يورو في السنة).
الإجمالي بنسبة 27% VAT: 1,500 HUF/شهر (3.81 يورو/شهر) أو 15,200 HUF/سنة (38.10 يورو/سنة).

القاعدة السنوية

السعر السنوي هو 10 أضعاف الشهري السعر.

Seats

الترخيص الافتراضي يتضمن 5 مقاعد. إذا كنت بحاجة إلى المزيد من المقاعد، فاتصل بنا على support@corifeus.com.

الإصدار التجريبي

10 أيام مجانًا أي شخص لديه عنوان بريد إلكتروني حقيقي (بريد إلكتروني غير اختباري).

معلومات الفواتير في البريد الإلكتروني

الاسم، البريد الإلكتروني للفوترة، رمز البلد، الرمز البريدي، المدينة، العنوان، معرف VAT (اختياري).

Payment

PayPal متاح فقط في HUF (فورنت)؛ بعد إرسال الأموال @ https://paypal.me/corifeus سأرسل لك فاتورة. كافة المدفوعات غير قابلة للاسترداد. المجر).

Contact

إذا كنت تريد أن تقول مرحبًا أو لد��ك سؤال، فاتصل support@corifeus.com.

Language

يتم التواصل عبر البريد الإلكتروني الخاص بالفاتورة والترخيص باللغة الإنجليزية. عملة الفاتورة هي HUF.

Note

يتطلب التحقق من صحة الترخيص الوصول إلى الإنترنت.", licenseState: "الدولة", licenseStateActive: "نشط", licenseStateInactive: "غير نشط", licenseStateNoLicense: "لا يوجد ترخيص", licenseKeyMasked: "المفتاح المحفوظ", licenseTier: "الطبقة", licenseValid: "صالح", licenseStatus: "حالة الترخيص", licenseReason: "السبب", licenseCheckedAt: "تم التحقق في", licenseStartsAt: "يبدأ في", licenseExpiresAt: "تنتهي عند", licenseDaysLeft: "الأيام المتبقية", licenseMaxDevices: "أجهزة ماكس", licenseActiveDevices: "الأجهزة النشطة", licenseActiveDevicesInfo: "إذا لم يعد الجهاز مستخدمًا، فسيتم تحرير مقعده تلقائيًا بعد 75 دقيقة.", licenseCustomerEmail: "البريد الإلكتروني للعميل", licenseFeatures: "الميزات", licenseFeaturesEmpty: "لا توجد ميزات إضافية", licenseFeatureReadonlyMode: "وضع الاتصال للقراءة فقط", licenseFeatureReadonlyConnectionsFlag: "اتصالات للقراءة فقط (--readonly-connections/-r)", licenseFeatureSsh: "SSH نفق", licenseFeatureCluster: "اتصالات Cluster", licenseFeatureSentinel: "اتصالات Sentinel", licenseFeatureReJSON: "ReJSON (نوع البيانات JSON)", keysSort: { on: "تشغيل فرز المفاتيح", off: "فرز المفاتيح" }, cluster: { on: "Cluster على", off: "إيقاف تشغيل Cluster" }, sentinel: { on: "Sentinel على", off: "إيقاف تشغيل Sentinel", name: "اسم Sentinel" }, readonly: { on: "تشغيل للقراءة فقط", off: "إيقاف للقراءة فقط" }, proSshOnly: "SSH متاح في Pro أو Enterprise.", proReadonlyOnly: "يتوفر وضع الاتصال للقراءة فقط في Pro أو Enterprise.", enterpriseClusterSentinelOnly: "يتوفر Cluster وSentinel في المؤسسات فقط.", theme: { light: "ضوء", dark: "مؤسسة مظلمة", darkNeu: "الظلام", darkoBluo: "داركو بلو", enterprise: "المؤسسة", redis: "Redis", matrix: "مصفوفة" }, connected: opts => { return `متصل: ${opts.name}`; }, tree: "شجرة", askAuth: "اطلب الترخيص", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "الوحدات", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "قطع الاتصال", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "أوامر Redis", ungrouped: "بدون مجموعة", grouped: "Grouped", connectFirst: "اتصل بخادم Redis أولاً", searchLanguage: "بحث عن لغة...", exportProgress: "جارٍ تصدير المفاتيح...", importProgress: "جارٍ استيراد المفاتيح...", importPreview: "معاينة", importOverwrite: "الكتابة فوق", importSkip: "تخطي", importConflict: "إذا كان المفتاح موجودًا بالفعل:", noKeysToExport: "لا توجد مفاتيح للتصدير", time: "الوقت", loading: "جارٍ التحميل...", autoRefresh: "تلقائي", exportSearchHint: "تصدير المفاتيح المطابقة للبحث الحالي فقط", importSearchHint: "الاستيراد يطبق على قاعدة البيانات بالكامل وليس نتائج البحث فقط", importNoKeys: "لم يتم العثور على مفاتيح في الملف", }, status: { dataCopied: "البيانات موجودة في الحافظة", licenseSaved: "تم حفظ الترخيص", exportDone: "اكتمل التصدير", indexCreated: "تم إنشاء الفهرس", indexDropped: "تم حذف الفهرس", importDone: (opts) => `اكتمل الاستيراد: ${opts.created} تم إنشاؤه، ${opts.skipped} تم تخطيه، ${opts.errors} أخطاء`, nodeRemoved: "تمت إزالة العقدة", keyIsNotExisting: "ربما تم حذف هذا المفتاح أو انتهت صلاحيته.", keyCount: opts => { if (opts.keyCount === 0) { return "لا يوجد مفتاح"; } else if (opts.keyCount === 1) { return "1 مفتاح"; } else { return `${opts.keyCount} مفاتيح`; } }, treeExpandAll: "قم بتوسيع جميع أوراق الشجرة. قد تكون هذه العملية مكلفة وقد تستغرق وقتا طويلا..", noRedisKeys: "لا توجد مفاتيح في قاعدة البيانات هذه.", redisConnected: "تم توصيل Redis بنجاح", reloadingDataInfo: "إعادة تحميل معلومات بيانات Redis", added: "تمت الإضافة", saved: "تم التحديث", cancelled: "تم الإلغاء", deleted: "تم الحذف", savedRedis: "يتم حفظ بيانات Redis", redisDisconnected: opts => { return `حدث خطأ في الاتصال الحالي: ${opts.error.message}`; }, dbChanged: opts => { return `تم تعيين مؤشر db على ${opts.db}. `; }, treeDeleted: opts => { return `تم حذف مفتاح الشجرة (${opts.key}).`; }, deletedKey: opts => { return `تم حذف المفتاح (${opts.key}).`; }, renamedKey: "تمت إعادة تسمية هذا المفتاح", ttlChanged: "تم تغيير TTL لهذا المفتاح", notInteger: "هذا الإدخال ليس عددًا صحيحًا", persisted: "ويستمر هذا المفتاح إلى الأبد", set: "تم ضبط/إضافة المفتاح" }, code: { "delete-connection": "تم حذف هذا الاتصال، لذا تم قطع اتصالك بمثيل Redis هذا.", "save-connection": "تم تغيير هذا الاتصال، لذا تم قطع اتصالك بمثيل Redis هذا. يمكنك إعادة الاتصال.", "readonly-connections": "اتصالات إضافة/حفظ/حذف للقراءة فقط!", "readonly-connection-mode": "يتم قراءة هذا الاتصال فقط الوضع!", "list-out-of-bounds": "فهرس القائمة هذا خارج الحدود", "donation-ware-feature": "هذه الميزة موجودة في نسخة التبرع.", "feature-pro-readonly-required": "يتطلب وضع الاتصال للقراءة فقط ترخيص Pro أو Enterprise.", "feature-pro-ssh-required": "يتطلب الاتصال النفقي SSH ترخيص Pro أو Enterprise.", "feature-enterprise-cluster-sentinel-required": "يتطلب Cluster وSentinel ترخيصًا مؤسسيًا.", "feature-pro-json-binary-required": "يتطلب تحرير JSON وتحميل الملف الثنائي وتنزيل الملف الثنائي ترخيص Pro أو Enterprise.", "feature-pro-rejson-required": "يتطلب ReJSON (نوع البيانات JSON) ترخيص Pro أو Enterprise.", "invalid-json-value": "القيمة غير صالحة JSON.", "http_auth_required": "التفويض مطلوب: يرجى المصادقة باستخدام HTTP Basic Auth وإعادة التحميل.", "auto-connection-failed": "ممكن تم حذف الاتصال وفشل الاتصال التلقائي لهذا السبب.", invalid_console_command: "هذا الأمر لا يعمل عبر GUI." }, licenseReason: { LICENSE_VALID: "الترخيص ساري المفعول", LICENSE_INVALID: "الترخيص غير صالح", LICENSE_MISSING: "لم يتم تعيين مفتاح الترخيص", LICENSE_DISABLED: "تم تعطيل الترخيص في تكوين الخادم", LICENSE_NOT_FOUND: "لم يتم العثور على الترخيص", LICENSE_EXPIRED: "انتهت صلاحية الترخيص", LICENSE_CLEARED: "تم مسح مفتاح الترخيص", LICENSE_MAX_DEVICES_REACHED: "تم الوصول إلى الحد الأقصى لعدد مقاعد الجهاز", PRODUCT_MISMATCH: "منتج الترخيص غير متطابق" }, licenseStatusValue: { active: "نشط", deleted: "تم الحذف", all: "الكل", expired: "انتهت صلاحيتها", missing: "مفقود", inactive: "غير نشط" }, form: { error: { required: "مطلوب", port: "المنفذ بين 1-65535", invalid: "النموذج غير صالح" }, connection: { label: { name: "الاسم", group: "Group", host: "اسم المضيف", port: "ميناء", password: "كلمة المرور", username: "اسم المستخدم" } }, treeSettings: { maxValueDisplay: "الحد الأقصى لطول سلسلة عرض القيمة", maxValueDisplayInfo: "إذا تم التعيين على 0، قم بإظهار القيم الكاملة. إذا كان أكبر من 0، اقتطاع إلى هذا الطول. إذا -1: بالنسبة للسلاسل، قم بإخفاء القيمة حتى يتم التحرير؛ أما بالنسبة للأنواع الأخرى، أظهر المحتوى الكامل.", maxKeys: "الحد الأقصى لعدد المفاتيح", maxKeysInfo: "لكي لا يتعطل GUI، فإننا نحدد الحد الأقصى لعدد المفاتيح.", keyCount: () => { return `عدد المفاتيح: ${p3xr.state.keysRaw.length}`; }, label: { animation: "استخدم الرسوم المتحركة", noAnimation: "لا الرسوم المتحركة", jsonFormatTwoSpace: "قم بتنسيق JSON بمسافتين", jsonFormatFourSpace: "قم بتنسيق JSON بأربع مسافات", formName: "إعدادات Redis", searchModeClient: "وضع البحث عن العميل", searchModeServer: "وضع البحث عن الخادم", searchModeStartsWith: "البحث مع يبدأ مع الوضع", searchModeIncludes: "البحث يشمل الوضع" }, field: { treeSeparator: "فاصل الشجرة", treeSeparatorSelector: "محدد فاصل الشجرة", page: "عدد صفحات الشجرة", keyPageCount: "عدد الصفحات الرئيسية", keysSort: "فرز المفاتيح", searchMode: "وضع البحث", searchModeStartsWith: "يبدأ البحث بـ / يتضمن" }, error: { keyPageCount: "يجب أن يكون عدد الصفحات الرئيسية عددًا صحيحًا بين 5 - 100", page: "يجب أن يكون عدد الصفحات عددًا صحيحًا بين 10 - 5000", maxValueDisplay: "يجب أن تكون قيمة العرض القصوى عددًا صحيحًا بين -1 و32768", maxKeys: "يجب أن يكون الحد الأقصى لقيمة عدد المفاتيح عددًا صحيحًا بين 100 و100000" } }, key: { label: { formName: { add: "أضف مفتاح Redis جديد", edit: "تحرير مفتاح Redis", append: "أضف إلى مفتاح Redis الموجود" } }, field: { streamTimestamp: "الطابع الزمني", key: "مفتاح", type: "اكتب", index: "الفهرس", hashKey: "مفتاح التجزئة", score: "النتيجة", value: "القيمة" }, error: { streamTimestamp: "الطابع الزمني مطلوب، إما بتنسيق Redis أو *", key: "المفتاح هو، على الأقل، حرف واحد", hashKey: "يتكون مفتاح جدول التجزئة من حرف واحد على الأقل", score: "مطلوب النتيجة المحددة التي تم فرزها", value: "القيمة مطلوبة" } }, main: { label: { database: "DB" } } }, page: { search: { title: "بحث", index: "فهرس", query: "استعلام", results: "النتائج", noIndex: "لم يتم العثور على فهارس", createIndex: "إنشاء فهرس", dropIndex: "حذف فهرس", indexInfo: "معلومات الفهرس", indexName: "اسم الفهرس", prefix: "بادئة المفتاح (اختياري)", fieldName: "اسم الحقل", }, monitor: { title: "المراقبة", memory: "الذاكرة", opsPerSec: "عمليات/ثانية", clients: "العملاء", blocked: "محظور", hitsMisses: "معدل الإصابة", networkIo: "إدخال/إخراج الشبكة", slowLog: "السجل البطيء", totalCommands: "الإجمالي", expired: "منتهي الصلاحية", evicted: "مطرود", clientList: "قائمة العملاء", topKeys: "أكبر المفاتيح حسب الذاكرة", killClient: "إنهاء العميل", clientKilled: "تم إنهاء العميل", confirmKillClient: "هل أنت متأكد من إنهاء هذا العميل؟", noKeys: "لا توجد مفاتيح", noClients: "لا يوجد عملاء", }, overview: { noConnected: "لا يوجد اتصال بـ Redis.", overviewClients: "قم بإدراج المتصلين حسب عدد العملاء", connectedCount: opt => { if (opt.length === 1) { return "1 عميل"; } return `${opt.length} عملاء`; } }, key: { label: { key: "مفتاح", encoding: "الترميز", length: "الحجم", ttl: "TTL", ttlTitle: "الوقت للعيش", type: "اكتب", ttlNotExpire: "لا تنتهي صلاحيته", lengthString: "بايت", lengthItem: "العناصر", actions: "الإجراءات" }, list: { table: { index: "الفهرس", value: "القيمة" } }, hash: { table: { hashkey: "هاشكي", value: "القيمة" } }, set: { table: { value: "عضو" } }, zset: { table: { value: "عضو", score: "النتيجة" } }, stream: { table: { timestamp: "معرف الطابع الزمني", field: "الميدان", value: "القيمة" } } }, treeControls: { settings: "إعدادات الشجرة", expandAll: "قم بتوسيع الكل", collapseAll: "طي الكل", search: { search: "ابحث في المفاتيح", clear: "مسح البحث الحالي لتعيينه فارغا", placeholderClient: "البحث من جانب العميل", placeholderServer: "بحث جانب الخادم", info: "يعني البحث من جانب العميل أنه يطابق النص الموجود في إدخال البحث. يعني البحث من جانب الخادم أنه يشبه البحث في أنماط المفاتيح مثل *{search-text}*. بالنسبة لمجموعات البحث الكبيرة، من الأفضل استخدام البحث من جانب الخادم. بالنسبة لمجموعات البحث الأصغر، فمن الأفضل استخدام وضع البحث من جانب العميل." + ` إذا انتهى عدد المفاتيح ${p3xr.settings.maxLightKeysCount}، يمكنك البحث فقط على جانب الخادم.`, largeSetInfo: "في مجموعة كبيرة، يتم تعطيل البحث من جانب العميل. لذا، في الوقت الحالي، أصبح البحث من جانب الخادم فقط ممكنًا.", infoDetails: "لمعرفة كيفية عمل البحث، يرجى مراجعة الإعدادات" }, pager: { next: "التالي", prev: "السابق", first: "أولا", last: "الاخير" } } }, time: { loading: "جارٍ التحميل...", years: "سنوات", months: "أشهر", days: "أيام", year: "سنة", month: "شهر", day: "يوم" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/az/000077500000000000000000000000001517666434100137655ustar00rootroot00000000000000src/strings/az/strings.js000066400000000000000000000717661517666434100160350ustar00rootroot00000000000000const strings = { error: { cleared_license: "Təmizlənmiş lisenziya", invalid_license: "Etibarsız lisenziya", license_max_devices_reached: "Maksimum cihaz oturacaqlarına çatıldı", license_readonly: "Lisenziya yalnız server terminalından dəyişdirilə bilər.", server_error: "Server xətası, yenidən cəhd edin" }, title: { donate: "Bağışlayın", jsonRecursive: "Bütün yarpaqları genişləndirmək", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Siz sol alt menyudan qoşulmaq üçün Redis bağlantısını seçə bilərsiniz.", statistics: "Statistika", error: "Xəta", connectingRedis: "Redis-ə qoşulur...", socketioConnectError: "Socket.IO Xətası", db: "DB", server: "Server", clients: "Müştərilər", memory: "Yaddaş", persistence: "Əzmkarlıq", stats: "Statistika", replication: "Replikasiya", cpu: "CPU", cluster: "Cluster", modules: "Modullar", errorstats: "Xəta Statistikaları", commandstats: "Əmr Statistikaları", latencystats: "Gecikmə Statistikaları", keysizes: "Açar Ölçüləri", threads: "Mövzular", }, confirm: { dropIndex: "Bu indeksi silmək istədiyinizə əminsiniz?", uploadBuffer: "Bu ikili datanı yükləməyinizə əminsiniz?", uploadBufferDone: "İkili məlumatlar yüklənir", uploadBufferDoneAndSave: "Binar məlumatlar yüklənir və serverdə saxlanılır", title: "Təsdiq edin", alert: "Xəbərdarlıq", info: "Məlumat", deleteListItem: "Bu siyahı elementini siləcəyinizə əminsiniz?", deleteHashKey: "Bu heş açar elementini siləcəyinizə əminsiniz?", deleteStreamTimestamp: "Bu yayımın vaxt damğasını siləcəyinizə əminsiniz?", deleteSetMember: "Bu qrup üzvünü siləcəyinizə əminsiniz?", deleteZSetMember: "Bu çeşidlənmiş qrup üzvünü siləcəyinizə əminsiniz?", deleteConnection: "Təsdiq edin", deleteConnectionText: "Bu Redis bağlantısını siləcəyinizə əminsiniz?", deleteNode: "Bu Redis qovşağını siləcəyinizə əminsiniz?", deleteAllKeys: opts => { return `Bu ağacı və onun bütün açarlarını silin (${opts.key})?`; }, socketioConnectError: "Socket.IO serverə qoşula bilmir, siz yenidən yükləyə və qoşulma xətasını özünüz həll etməyə cəhd edə bilərsiniz, müştəri özü bunu necə həll edəcəyini bilmir.", socketioAuthRequired: "Socket.IO icazəsi tələb olunur. HTTP Basic Auth (istifadəçi adı/parol) ilə autentifikasiya edin və yenidən yükləyin.", deleteKey: "Bu açarı siləcəyinizə əminsiniz?", rename: { title: "Bu açarın adını dəyişəcəyinizə əminsiniz?", textContent: "Bu əməliyyat açarın adını həmişəlik dəyişdirir.", placeholder: "Redis açarı (tələb olunur)" }, ttl: { title: "Bu açarın TTL-ni dəyişmək istədiyinizə əminsiniz?", textContent: "TTL-nin dəyişdirilməsi bu açarın yaşamaq vaxtını yeniləyir. Bu açarı həmişəlik saxlamaq üçün boş buraxın.", placeholder: "Redis açarının TTL (tam və ya boş)", placeholderPlaceholder: "Boş o deməkdir ki, əbədi qalacaq; əks halda tam ədəd daxil edin.", convertTextToTime: "Mətni zamana çevirin", convertTextToTimePlaceholder: "Məs. 1d 86400 olacaq" }, license: { title: "Lisenziya təyin edin", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Lisenziya açarı" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopyalayın", downloadBuffer: "İkili faylı yükləyin", setBuffer: "İkili yükləyin", exportKeys: "Açarları ixrac et", exportAllKeys: (opts) => `Bütün ${opts.count} açarı ixrac et`, exportSearchResults: (opts) => `${opts.count} nəticəni ixrac et`, importKeys: "Açarları idxal et", saveWithFormatJson: "Formatla yadda saxlayın", formatJson: "Json formatı", wrap: "Sarın", unwrap: "Açın", downloadJson: "JSON yükləyin", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Dil", ok: "OK", addKey: "Bu açara əlavə edin", addKeyRoot: "Kök açarı əlavə edin", reloadKey: "Açarı yenidən yükləyin", reload: "Yenidən yükləyin", close: "Bağlayın", commands: "Əmrlər", view: "Baxın", statistics: "Statistika", refresh: "Yeniləyin", pause: "Pauza", resume: "Davam et", clear: "Təmiz", rename: "Adını dəyişdirin", main: "Verilənlər bazası", cancel: "Ləğv et", theme: "Mövzu", github: "GitHub", githubRepo: "Repozitoriya", githubRelease: "Buraxılışlar", githubChangelog: "Dəyişikliklər jurnalı", info: "Info", settings: "Parametrlər", connect: "Qoşun", disconnect: "Bağlantını kəsin", overview: "Ümumi baxış", console: "Konsol", noConnections: "Bağlantı yoxdur, parametrlər menyusunda əlaqə əlavə edin.", noConnectionsInSettings: "Bağlantı yoxdur, yuxarıda YENİ ƏLAQƏ əlavə edə bilərsiniz.", connectionAdd: "Yeni əlaqə", addGroup: "Qrup əlavə et", extend: "Uzatmaq", collapse: "Yıxılma", add: "Əlavə et", edit: "Redaktə et", save: "Saxla", ttl: "TTL təyin edin", license: "Lisenziya təyin edin", delete: "Sil", remove: "Sil", sure: "Əlbəttə", testConnection: "Test bağlantısı", getKey: "Redis açarı və əlaqəli data yüklənir...", jsonViewShow: "JSON göstərin", jsonViewEditor: "JSON redaktə edin", quickConsole: "Sürətli Konsol", }, label: { id: { nodeId: "Node ID", id: "Bağlantı ID", info: "Əgər aşağıdakıların xassələrini dəyişmək istəmirsinizsə: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, xassə d��yərlərinin toxunulmazlığını qorumaq üçün lütfən, əlaqənin identifikatorunu həmin xüsusiyyətlərə daxil edin. Əgər qovşaq parolunda eyni məntiqin olmasını istəyirsinizsə, onda node parolunda node ID-ni daxil edin." }, secureFeature: "P3X ilə başlayan dəyərin eyni göründüyünü görsəniz, bu təhlükəsiz xüsusiyyətdir. Parametrləri dəyişdirmək üçün sadəcə bu parametrləri boş və ya başqa bir şeylə əvəz edin və onlar yadda saxlanılacaq. Parametrləri dəyişdirməsəniz, parametrlər serverdə olduğu kimi saxlanılacaq.", ssh: { on: "SSH aktivdir", off: "SSH deaktivdir", sshHost: "SSH Host", sshPort: "SSH portu", sshUsername: "SSH istifadəçi adı", sshPassword: "SSH parol", sshPrivateKey: "SSH şəxsi açar" }, isBuffer: opts => `[object ArrayBuffer] dəyərin ikili məlumat olduğunu və ya dəyərin ondan böyük olduğunu bildirir ${opts.maxValueAsBuffer}`, streamValue: `Yayım sahəsi və dəyəri bir laynerdir. Məsələn: sahə1 dəyər1 "sahə 2" "dəyər 2"`, streamTimestampId: `'*' avtomatik yaradılan və ya - kimi spesifikasiya deməkdir`, unableToLoadKey: ({ key }) => { return `Bu açarı yükləmək mümkün deyil: ${key}. Mümkündür, açar silinib. Dəqiq səhv konsoldadır.`; }, bigJson: "Bu JSON obyekti 10 kb-dən çoxdur, ona görə də nə etdiyinizi bildiyinizə əmin olun, çünki bəzi funksiyalar ləngiyə bilər.", addNode: "Düyün əlavə edin", validateJson: "JSON-ni təsdiq edin", reducedFunction: `Azaldılmış funksionallıq`, tooManyKeys: opts => { return `Tam maksimum funksiyalar üçün icazə verilən düymələrin cəmidir ${opts.maxLightKeysCount} saymaq. Bu verilənlər bazasında cəmi icazə verilən açarlar var ${opts.count}. Açar çeşidləmə və əlavə bəzəkli ağac məlumatı deaktiv edilib. Axtarış müştəri axtarışı əvəzinə yalnız serverdə baş verir.`; }, redisCommandNotFound: "Redis komanda uyğunluğu tapılmadı...", treeKeyStore: `Çeşidləmə (təbii müqayisə) müştəri aka brauzerdə həyata keçirilir, yəni 10k-dan çox düymələr kimi böyük böyük dəstlər üçün cəzası var, səhifənin göstərilməsinə bir az vaxt əlavə edə bilər. Redis-də əsas çeşidləmə yoxdur, yalnız belədir.`, socketIoTimeout: options => { return `Socket.IO bu sorğu üçün vaxtı keçdi (maks ${options.timeout / 1000} saniyə)...`; }, resizerInfo: options => { return `Sol və ya sağ panelin minimum eni ${options.width}px`; }, jsonViewNotParsable: "Bu dəyər JSON parsable deyil ", ttlTitle: "TTL-ni saniyəyə təyin edin", passwordSecure: "Parol boş ola bilər, lakin yenə də simvolları göstərəcək, bu təhlükəsizlik xüsusiyyətidir.", tlsWithoutCert: "Əlavə sertifikat olmadan TLS-ni aktivləşdirin", tlsRejectUnauthorized: "İcazəsiz sertifikatı rədd edin", tlsSecure: "P3X ilə başlayan TLS konfiqurasiyasını görürsünüzsə və ya bütün TLS parametrləri eyni kimi görünürsə, bu, təhlükəsiz xüsusiyyətdir. Parametrləri dəyişdirmək üçün sadəcə bu parametrləri boş və ya başqa bir şeylə əvəz edin və onlar yadda saxlanılacaq. TLS parametrlərini dəyişdirməsəniz, parametrlər serverdə olduğu kimi saxlanılacaq.", treeSeparatorEmpty: "Ağac ayırıcı boşdursa, ağacın iç içə qovşaqları olmayacaq, sadəcə təmiz siyahı olacaq", treeSeparatorEmptyNote: "İçəri daxil edilmiş qovşaqlar yoxdur, sadəcə təmiz siyahıdır", welcomeConsole: "Redis Konsoluna xoş gəlmisiniz", welcomeConsoleInfo: "Kursor YUKARI və ya AŞAĞI tarix aktivləşdirilib", redisListIndexInfo: "Əlavə etmək üçün boş, yuxarıya əlavə etmək və ya göstərilən mövqeyə saxlamaq üçün -1.", console: "Konsol", connectiondAdd: "Bağlantı əlavə edin", connectiondEdit: "Bağlantını redaktə edin", connectiondView: "Bağlantıya baxın", connections: "Əlaqələr", licenseInfo: "Lisenziya", licenseEditable: "Lisenziya redaktə edilə bilər", licenseEditableYes: "Bəli", licenseEditableNo: "yox", licenseTerminalOnly: "Lisenziya yalnız server terminalından konfiqurasiya edilə bilər.", licenseTierPolicyTitle: "Səviyyə siyasəti", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "dövlət", licenseStateActive: "Aktiv", licenseStateInactive: "Qeyri-aktiv", licenseStateNoLicense: "Lisenziya yoxdur", licenseKeyMasked: "Yadda saxlanan açar", licenseTier: "Səviyyə", licenseValid: "Etibarlıdır", licenseStatus: "Lisenziya statusu", licenseReason: "Səbəb", licenseCheckedAt: "Yoxlanılıb", licenseStartsAt: "Başlayır", licenseExpiresAt: "Vaxtı bitir", licenseDaysLeft: "Günlər qalıb", licenseMaxDevices: "Maks cihazlar", licenseActiveDevices: "Aktiv cihazlar", licenseActiveDevicesInfo: "Əgər cihaz artıq istifadə edilmirsə, onun oturacağı 75 dəqiqədən sonra avtomatik olaraq buraxılır.", licenseCustomerEmail: "Müştəri e-poçtu", licenseFeatures: "Xüsusiyyətlər", licenseFeaturesEmpty: "Əlavə funksiyalar yoxdur", licenseFeatureReadonlyMode: "Yalnız oxumaq üçün əlaqə rejimi", licenseFeatureReadonlyConnectionsFlag: "Yalnız oxumaq üçün bağlantılar (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunel", licenseFeatureCluster: "Cluster əlaqələri", licenseFeatureSentinel: "Sentinel əlaqələri", licenseFeatureReJSON: "ReJSON (JSON məlumat növü)", keysSort: { on: "Açar çeşidlənməsi aktivdir", off: "Açarın çeşidlənməsi" }, cluster: { on: "Cluster aktivdir", off: "Cluster deaktivdir" }, sentinel: { on: "Sentinel aktivdir", off: "Sentinel deaktivdir", name: "Sentinel adı" }, readonly: { on: "Yalnız oxumaq aktivdir", off: "Yalnız oxumaq deaktivdir" }, proSshOnly: "SSH Pro və ya Enterprise-da mövcuddur.", proReadonlyOnly: "Yalnız oxumaq üçün əlaqə rejimi Pro və ya Enterprise-də mövcuddur.", enterpriseClusterSentinelOnly: "Cluster və Sentinel yalnız Enterprise-də mövcuddur.", theme: { light: "İşıq", dark: "Qaranlıq müəssisə", darkNeu: "Qaranlıq", darkoBluo: "Darko mavi", enterprise: "Müəssisə", redis: "Redis", matrix: "Matris" }, connected: opts => { return `Qoşuldu: ${opts.name}`; }, tree: "Ağac", askAuth: "İcazə tələb edin", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Modullar", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Bağlantını kəsin", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Əmrləri", ungrouped: "Qruplaşdırılmamış", grouped: "Grouped", connectFirst: "Əvvəlcə Redis serverinə qoşulun", searchLanguage: "Dil axtar...", exportProgress: "Açarlar ixrac edilir...", importProgress: "Açarlar idxal edilir...", importPreview: "Önizləmə", importOverwrite: "Üzərinə yaz", importSkip: "Keç", importConflict: "Açar artıq mövcuddursa:", noKeysToExport: "İxrac üçün açar yoxdur", time: "Vaxt", loading: "Yüklənir...", autoRefresh: "Avto", exportSearchHint: "Yalnız cari axtarışa uyğun açarlar ixrac edilir", importSearchHint: "İdxal bütün verilənlər bazasına tətbiq olunur, yalnız axtarış nəticələrinə deyil", importNoKeys: "Faylda açar tapılmadı", }, status: { dataCopied: "Məlumat mübadilə buferindədir", licenseSaved: "Lisenziya saxlandı", exportDone: "İxrac tamamlandı", indexCreated: "İndeks yaradıldı", indexDropped: "İndeks silindi", importDone: (opts) => `İdxal tamamlandı: ${opts.created} yaradıldı, ${opts.skipped} keçildi, ${opts.errors} xəta`, nodeRemoved: "Düyün silindi", keyIsNotExisting: "Bu açar silinmiş və ya vaxtı keçmiş ola bilərdi.", keyCount: opts => { if (opts.keyCount === 0) { return "Açar yoxdur"; } else if (opts.keyCount === 1) { return "1 açar"; } else { return `${opts.keyCount} açarlar`; } }, treeExpandAll: "Bütün ağac yarpaqlarını genişləndirin. Bu əməliyyat bahalı ola bilər və vaxt apara bilər...", noRedisKeys: "Bu verilənlər bazasında heç bir açar yoxdur.", redisConnected: "Redis uğurla qoşuldu", reloadingDataInfo: "Redis məlumatı yenidən yüklənir", added: "Əlavə edilib", saved: "Yenilənib", cancelled: "Ləğv edildi", deleted: "Silindi", savedRedis: "Redis məlumatı saxlanılır", redisDisconnected: opts => { return `Cari əlaqədə xəta baş verdi: ${opts.error.message}`; }, dbChanged: opts => { return `db indeksi təyin edildi ${opts.db}. `; }, treeDeleted: opts => { return `Ağac açarı silindi (${opts.key}).`; }, deletedKey: opts => { return `Açar silindi (${opts.key}).`; }, renamedKey: "Bu açarın adı dəyişdirilib", ttlChanged: "Bu açarın TTL d��yişdirildi", notInteger: "Bu daxiletmə tam ədəd deyil", persisted: "Bu açar əbədi olaraq qalır", set: "Açar quraşdırılıb/əlavə edilib" }, code: { "delete-connection": "Bu əlaqə silindi, ona görə də siz bu Redis nümunəsi ilə əlaqəni kəsdiniz.", "save-connection": "Bu əlaqə dəyişdirildi, ona görə də siz bu Redis nümunəsi ilə əlaqəni kəsdiniz. Yenidən qoşula bilərsiniz.", "readonly-connections": "Əlavə etmək/saxlamaq/silmək əlaqələri yalnız oxunur!", "readonly-connection-mode": "Bu əlaqə yalnız oxumaq rejimidir!", "list-out-of-bounds": "Bu siyahı indeksi həddən kənardır", "donation-ware-feature": "Bu xüsusiyyət ianə versiyasında mövcuddur.", "feature-pro-readonly-required": "Yalnız oxumaq üçün əlaqə rejimi Pro və ya Enterprise lisenziyası tələb edir.", "feature-pro-ssh-required": "SSH tunelləmə Pro və ya Enterprise lisenziyası tələb edir.", "feature-enterprise-cluster-sentinel-required": "Cluster və Sentinel Müəssisə lisenziyası tələb edir.", "feature-pro-json-binary-required": "JSON redaktə edin, ikili yükləyin və ikili faylı yükləyin Pro və ya Enterprise lisenziyası tələb olunur.", "feature-pro-rejson-required": "ReJSON (JSON məlumat növü) Pro və ya Enterprise lisenziyası tələb edir.", "invalid-json-value": "Dəyər etibarlı deyil JSON.", "http_auth_required": "Avtorizasiya tələb olunur: HTTP Basic Auth ilə autentifikasiya edin və yenidən yükləyin.", "auto-connection-failed": "Mümkündür ki, bu səbəbdən əlaqə silindi və avtomatik qoşulma uğursuz oldu.", invalid_console_command: "Bu əmr GUI vasitəsilə işləmir." }, licenseReason: { LICENSE_VALID: "Lisenziya etibarlıdır", LICENSE_INVALID: "Lisenziya etibarsızdır", LICENSE_MISSING: "Lisenziya açarı təyin edilməyib", LICENSE_DISABLED: "Lisenziya server konfiqurasiyasında deaktiv edilib", LICENSE_NOT_FOUND: "Lisenziya tapılmadı", LICENSE_EXPIRED: "Lisenziyanın müddəti bitib", LICENSE_CLEARED: "Lisenziya açarı təmizləndi", LICENSE_MAX_DEVICES_REACHED: "Maksimum cihaz oturacaqlarına çatıldı", PRODUCT_MISMATCH: "Lisenziya məhsulu uyğun gəlmir" }, licenseStatusValue: { active: "Aktiv", deleted: "Silindi", all: "Hamısı", expired: "İstifadə müddəti bitdi", missing: "İtkin", inactive: "Qeyri-aktiv" }, form: { error: { required: "Tələb olunur", port: "Liman 1-65535 arasındadır", invalid: "Forma etibarsızdır" }, connection: { label: { name: "ad", group: "Group", host: "Host adı", port: "liman", password: "parol", username: "İstifadəçi adı" } }, treeSettings: { maxValueDisplay: "Maksimum dəyər ekran uzunluğu", maxValueDisplayInfo: "0-a təyin edilərsə, tam dəyərləri göstərin. 0-dan böyükdürsə, bu uzunluğa qədər kəsin. Əgər -1: sətirlər üçün, redaktəyə qədər dəyəri gizlədin; digər növlər üçün tam məzmunu göstərin.", maxKeys: "Maksimum açar sayı", maxKeysInfo: "GUI qəzaya uğramaması üçün maksimum açar sayını məhdudlaşdırırıq.", keyCount: () => { return `Açarların sayı: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Animasiyadan istifadə edin", noAnimation: "Animasiya yoxdur", jsonFormatTwoSpace: "JSON-ni 2 boşluqla formatlayın", jsonFormatFourSpace: "JSON-ni 4 boşluqla formatlayın", formName: "Redis parametrləri", searchModeClient: "Müştəri axtarış rejimi", searchModeServer: "Server axtarış rejimi", searchModeStartsWith: "Axtarış rejimi ilə başlayır", searchModeIncludes: "Axtarış rejimi daxildir" }, field: { treeSeparator: "Ağac ayırıcı", treeSeparatorSelector: "Ağac ayırıcı seçici", page: "Ağac səhifələmə sayı", keyPageCount: "Açar səhifələmə sayı", keysSort: "Açarları sıralayın", searchMode: "Axtarış rejimi", searchModeStartsWith: "Axtarış / daxildir ilə başlayır" }, error: { keyPageCount: "Açar səhifələrin sayı 5 - 100 arasında tam ədəd olmalıdır", page: "Səhifə sayı 10 - 5000 arasında tam ədəd olmalıdır", maxValueDisplay: "Maksimum ekran dəyəri -1 və 32768 arasında tam ədəd olmalıdır", maxKeys: "Maksimum açar sayma dəyəri 100 ilə 100000 arasında tam ədəd olmalıdır" } }, key: { label: { formName: { add: "Yeni Redis açarı əlavə edin", edit: "Redis düyməsini redaktə edin", append: "Mövcud Redis açarına əlavə edin" } }, field: { streamTimestamp: "Vaxt möhürü", key: "Açar", type: "Növ", index: "indeks", hashKey: "Hash açarı", score: "Hesab", value: "Dəyər" }, error: { streamTimestamp: "Zaman damğası ya Redis formatında, ya da * kimi tələb olunur", key: "Əsas odur ki, ən azı bir simvol", hashKey: "Hash cədvəlinin açarı ən azı bir simvoldur", score: "Çeşidlənmiş xal tələb olunur", value: "Dəyər tələb olunur" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Axtarış", index: "İndeks", query: "Sorğu", results: "Nəticələr", noIndex: "İndeks tapılmadı", createIndex: "İndeks yarat", dropIndex: "İndeksi sil", indexInfo: "İndeks məlumatı", indexName: "İndeks adı", prefix: "Açar prefiksi (isteğe bağlı)", fieldName: "Sahə adı", }, monitor: { title: "Monitorinq", memory: "Yaddaş", opsPerSec: "Əməliyyat/san", clients: "Müştərilər", blocked: "Bloklanmış", hitsMisses: "İsabət dərəcəsi", networkIo: "Şəbəkə I/O", slowLog: "Yavaş jurnal", totalCommands: "Cəmi", expired: "Müddəti bitmiş", evicted: "Çıxarılmış", clientList: "Müştəri siyahısı", topKeys: "Yaddaşa görə ən böyük açarlar", killClient: "Müştərini öldür", clientKilled: "Müştəri öldürüldü", confirmKillClient: "Bu müştərini dayandırmaq istədiyinizə əminsiniz?", noKeys: "Açar yoxdur", noClients: "Müştəri yoxdur", }, overview: { noConnected: "Redis ilə əlaqə yoxdur.", overviewClients: "Müştərilərin sayına görə bağlı olanları sadalayın", connectedCount: opt => { if (opt.length === 1) { return "1 müştəri"; } return `${opt.length} müştərilər`; } }, key: { label: { key: "Açar", encoding: "Kodlaşdırma", length: "Ölçü", ttl: "TTL", ttlTitle: "Yaşamaq Zamanı", type: "Növ", ttlNotExpire: "müddəti bitmir", lengthString: "bayt", lengthItem: "maddələr", actions: "Fəaliyyətlər" }, list: { table: { index: "indeks", value: "Dəyər" } }, hash: { table: { hashkey: "Hashkey", value: "Dəyər" } }, set: { table: { value: "Üzv" } }, zset: { table: { value: "Üzv", score: "Hesab" } }, stream: { table: { timestamp: "Vaxt möhürü ID", field: "Sahə", value: "Dəyər" } } }, treeControls: { settings: "Ağac parametrləri", expandAll: "Hamısını genişləndirin", collapseAll: "Hamısını yığışdırın", search: { search: "Düymələrdə axtarın", clear: "Boş təyin etmək üçün cari axtarışı silin", placeholderClient: "Müştəri tərəfini axtarın", placeholderServer: "Axtarış server tərəfi", info: "Müştəri tərəfi axtarışı o deməkdir ki, axtarış girişindəki mətnə uyğun gəlir. Server tərəfində axtarış o deməkdir ki, bu, *{search-text}* kimi açar nümunələrində axtarışa bənzəyir. Böyük axtarış dəstləri üçün server tərəfində axtarışdan istifadə etmək daha yaxşıdır. Daha kiçik axtarış dəstləri üçün müştəri tərəfi axtarış rejimindən istifadə etmək daha yaxşıdır." + ` Əgər açarların sayı bitibsə ${p3xr.settings.maxLightKeysCount}, yalnız server tərəfində axtarış edə bilərsiniz.`, largeSetInfo: "Böyük dəstdə müştəri tərəfində axtarış deaktiv edilib. belə ki, hazırda yalnız server tərəfində axtarış mümkündür.", infoDetails: "Axtarışın necə işlədiyini öyrənmək üçün parametrləri yoxlayın" }, pager: { next: "Sonrakı", prev: "Əvvəlki", first: "Birinci", last: "Son" } } }, time: { loading: "Yüklənir...", years: "illər", months: "ay", days: "günlər", year: "il", month: "ay", day: "gün" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/be/000077500000000000000000000000001517666434100137415ustar00rootroot00000000000000src/strings/be/strings.js000066400000000000000000001145001517666434100157710ustar00rootroot00000000000000const strings = { error: { cleared_license: "Ачышчаная ліцэнзія", invalid_license: "Несапраўдная ліцэнзія", license_max_devices_reached: "Дасягнута максімальная колькасць месцаў для прылад", license_readonly: "Ліцэнзію можна змяніць толькі з тэрмінала сервера.", server_error: "Памылка сервера, паспрабуйце яшчэ раз" }, title: { donate: "Ахвяраваць", jsonRecursive: "Разгарнуўшы ўсе лісце", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Вы можаце выбраць злучэнне Redis для падлучэння з левага ніжняга меню.", statistics: "Статыстыка", error: "Памылка", connectingRedis: "Падключэнне да Redis...", socketioConnectError: "Памылка Socket.IO", db: "DB", server: "Сервер", clients: "Кліенты", memory: "Памяць", persistence: "Настойлівасць", stats: "Статыстыка", replication: "Рэплікацыя", cpu: "CPU", cluster: "Cluster", modules: "Модулі", errorstats: "Статыстыка памылак", commandstats: "Статыстыка каманд", latencystats: "Статыстыка затрымак", keysizes: "Памеры ключоў", threads: "Патокі", }, confirm: { dropIndex: "Вы ўпэўнены, што хочаце выдаліць гэты індэкс?", uploadBuffer: "Вы ўпэўненыя, што хочаце загрузіць гэтыя двайковыя дадзеныя?", uploadBufferDone: "Двайковыя дадзеныя загружаюцца", uploadBufferDoneAndSave: "Двайковыя дадзеныя загружаюцца і захоўваюцца на серверы", title: "Пацвердзіць", alert: "Абвестка", info: "Інфармацыя", deleteListItem: "Вы ўпэўнены, што хочаце выдаліць гэты элемент спісу?", deleteHashKey: "Вы ўпэўнены, што хочаце выдаліць гэты элемент хэш-ключа?", deleteStreamTimestamp: "Вы ўпэўнены, што хочаце выдаліць гэту метку часу?", deleteSetMember: "Вы ўпэўнены, што хочаце выдаліць гэты ўдзельнік?", deleteZSetMember: "Вы ўпэўнены, што хочаце выдаліць гэты адсартаваны элемент?", deleteConnection: "Пацвердзіць", deleteConnectionText: "Вы ўпэўнены, што хочаце выдаліць гэта злучэнне Redis?", deleteNode: "Вы ўпэўнены, што хочаце выдаліць гэты вузел Redis?", deleteAllKeys: opts => { return `Выдаліць гэта дрэва і ўсе яго ключы (${opts.key})?`; }, socketioConnectError: "Socket.IO не можа падключыцца да сервера, вы можаце перазагрузіць і паспрабаваць вырашыць памылку злучэння самастойна, кліент не ведае, як яе вырашыць.", socketioAuthRequired: "Патрабуецца аўтарызацыя Socket.IO. Прайдзіце аўтэнтыфікацыю з дапамогай HTTP Basic Auth (імя карыстальніка/пароль) і перазагрузіце.", deleteKey: "Вы ўпэўнены, што хочаце выдаліць гэты ключ?", rename: { title: "Вы ўпэўнены, што хочаце перайменаваць гэты ключ?", textContent: "Гэта дзеянне назаўсёды перайменуе ключ.", placeholder: "Ключ Redis (абавязковы)" }, ttl: { title: "Вы ўпэўнены, што хочаце змяніць TTL гэтага ключа?", textContent: "Змена TTL абнаўляе час жыцця гэтага ключа. Пакіньце пустым, каб захаваць гэты ключ назаўжды.", placeholder: "TTL ключа Redis (цэлы або пусты)", placeholderPlaceholder: "Пусты азначае, што ён захоўваецца вечна; інакш увядзіце цэлы лік.", convertTextToTime: "Пераўтварэнне тэксту ў час", convertTextToTimePlaceholder: "напр. 1d будзе 86400" }, license: { title: "Усталяваць ліцэнзію", textContent: "Калі вы хочаце выкарыстоўваць платныя функцыі, звяжыцеся з support@corifeus.com, каб запытаць ліцэнзію. Кошт Pro 400 HUF/месяц (1 еўра/месяц) або 4000 HUF/год (10 еўра/год), а Enterprise — 1200 HUF/месяц (3 еўра/месяц) або 12 000 HUF/год (30 €/год). Штогод - 10 разоў на месяц. З 27% VAT, агульны кошт складае Pro 500 HUF/месяц (1,27 €/месяц) або 5100 HUF/год (12,70 €/год), Enterprise 1500 HUF/месяц (3,81 €/месяц) або 15 200 HUF/год (38,10 €/год). Для праверкі ліцэнзіі неабходны доступ у Інтэрнэт. Ліцэнзія па змаўчанні ўключае 5 месцаў. Калі вам трэба больш месцаў, звяжыцеся з намі па адрасе support@corifeus.com.", placeholder: "Ліцэнзійны ключ" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Копія", downloadBuffer: "Спампаваць двайковы файл", setBuffer: "Загрузіць двайковы файл", exportKeys: "Экспарт ключоў", exportAllKeys: (opts) => `Экспарт усіх ${opts.count} ключоў`, exportSearchResults: (opts) => `Экспарт ${opts.count} вынікаў`, importKeys: "Імпарт ключоў", saveWithFormatJson: "Захаваць у фармаце", formatJson: "Фармат Json", wrap: "Абгарнуць", unwrap: "Разгарнуць", downloadJson: "Спампаваць JSON", pubsubMonitor: "Манітор PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "мова", ok: "добра", addKey: "Дадайце да гэтага ключа", addKeyRoot: "Дадайце каранёвы ключ", reloadKey: "Ключ перазагрузкі", reload: "Перазагрузіць", close: "Блізка", commands: "Каманды", view: "Выгляд", statistics: "Статыстыка", refresh: "Абнавіць", pause: "Паўза", resume: "Працягнуць", clear: "Ясна", rename: "Перайменаваць", main: "База дадзеных", cancel: "Адмяніць", theme: "Тэма", github: "GitHub", githubRepo: "Сховішча", githubRelease: "Рэлізы", githubChangelog: "Журнал змяненняў", info: "Info", settings: "Налады", connect: "Злучыцца", disconnect: "Адключыцца", overview: "Агляд", console: "Кансоль", noConnections: "Няма падключэнняў, дадайце падключэнне ў меню налад.", noConnectionsInSettings: "Няма падключэнняў, вы можаце дадаць НОВАЕ ПАДКЛЮЧЭННЕ вышэй.", connectionAdd: "Новае злучэнне", addGroup: "Дадаць групу", extend: "Пашырыць", collapse: "Згарнуць", add: "Дадаць", edit: "Рэдагаваць", save: "Захаваць", ttl: "Набор TTL", license: "Усталяваць ліцэнзію", delete: "Выдаліць", remove: "Выдаліць", sure: "Вядома", testConnection: "Тэставае злучэнне", getKey: "Загрузка ключа Redis і звязаных з ім даных...", jsonViewShow: "Дысплей JSON", jsonViewEditor: "Рэдагаваць JSON", quickConsole: "Хуткая кансоль", }, label: { id: { nodeId: "Ідэнтыфікатар вузла", id: "Ідэнтыфікатар злучэння", info: "Калі вы не хочаце змяняць уласцівасці: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, увядзіце ідэнтыфікатар злучэння ў гэтыя ўласцівасці, каб захаваць значэнні ўласцівасцей. Калі вы хочаце такую ​​ж логіку ў паролі вузла, увядзіце ідэнтыфікатар вузла ў паролі вузла." }, secureFeature: "Калі вы бачыце значэнне, якое пачынаецца з P3X і выглядае аднолькава, гэта бяспечная функцыя. Каб змяніць налады, проста заменіце гэтыя налады пустымі або іншымі, і яны будуць захаваны. Калі вы не зменіце налады, налады будуць захаваны ў тым выглядзе, у якім яны ёсць на серверы.", ssh: { on: "SSH ук��", off: "SSH выключаны", sshHost: "Хост SSH", sshPort: "Порт SSH", sshUsername: "SSH імя карыстальніка", sshPassword: "Пароль SSH", sshPrivateKey: "Закрыты ключ SSH" }, isBuffer: opts => `[object ArrayBuffer] азначае, што значэнне з'яўляецца двайковым даным або значэнне большае за ${opts.maxValueAsBuffer}`, streamValue: `Поле і значэнне патоку з'яўляюцца адзіным радком. Напрыклад: поле1 значэнне1 "поле 2" "значэнне 2"`, streamTimestampId: `«*» азначае аўтаматычнае стварэнне або спецыфікацыю як -`, unableToLoadKey: ({ key }) => { return `Немагчыма загрузіць гэты ключ: ${key}. Магчыма, ключ быў выдалены. Дакладная памылка знаходзіцца ў кансолі.`; }, bigJson: "Гэты аб'ект JSON мае больш за 10 кб, таму пераканайцеся, што вы ведаеце, што вы робіце, таму што некаторыя функцыі могуць павольна адлюстроўвацца.", addNode: "Дадаць вузел", validateJson: "Праверце JSON", reducedFunction: `Зніжэнне функцыянальнасці`, tooManyKeys: opts => { return `Для поўнай максімальнай колькасці дазволеных функцый агульная колькасць ключоў складае ${opts.maxLightKeysCount} разлічваць. У гэтай базе дадзеных больш за дазволеных ключоў ${opts.count}. Сартаванне па ключах і дадатковая мудрагелістая інфармацыя аб дрэве адключана. Пошук адбываецца толькі на серверы замест пошуку кліента.`; }, redisCommandNotFound: "Супадзенне каманды Redis не знойдзена ...", treeKeyStore: `Сартаванне (натуральнае параўнанне) выконваецца на кліенце, таксама вядомым як браўзер, што азначае, што ён мае штраф для вялікіх набораў, такіх як больш за 10 тысяч ключоў, гэта можа дадаць трохі часу для рэндэрынгу старонкі. У Redis няма сартавання ключоў, толькі вось так.`, socketIoTimeout: options => { return `Час чакання Socket.IO для гэтага запыту скончыўся (макс ${options.timeout / 1000} секунды)...`; }, resizerInfo: options => { return `Мінімальная шырыня левай або правай панэлі ${options.width}пікс`; }, jsonViewNotParsable: "Гэта значэнне не паддаецца аналізу JSON ", ttlTitle: "Усталюйце TTL за секунды", passwordSecure: "Пароль можа быць пустым, але ён будзе паказваць сімвалы, гэта функцыя бяспекі.", tlsWithoutCert: "Уключыць TLS без дадатковага сертыфіката", tlsRejectUnauthorized: "Адхіліць несанкцыянаваны сертыфікат", tlsSecure: "Калі вы бачыце канфігурацыю TLS, якая пачынаецца з P3X або ўсе налады TLS выглядаюць аднолькава, гэта бяспечная функцыя. Каб змяніць налады, проста заменіце гэтыя налады пустымі або іншымі, і яны будуць захаваны. Калі вы не зменіце налады TLS, налады будуць захаваны ў тым выглядзе, у якім яны ёсць на серверы.", treeSeparatorEmpty: "Калі падзельнік дрэва пусты, дрэва не будзе мець укладзеных вузлоў, толькі чысты спіс", treeSeparatorEmptyNote: "Няма ўкладзеных вузлоў, толькі чысты спіс", welcomeConsole: "Вітаем у кансолі Redis", welcomeConsoleInfo: "Гісторыя курсора УВЕРХ або ЎНІЗ уключана", redisListIndexInfo: "Пусты, каб дадаць, -1, каб дадаць або захаваць у паказанае месца.", console: "Кансоль", connectiondAdd: "Дадаць злучэнне", connectiondEdit: "Рэдагаваць злучэнне", connectiondView: "Прагляд злучэння", connections: "Сувязі", licenseInfo: "Ліцэнзія", licenseEditable: "Ліцэнзію можна рэдагаваць", licenseEditableYes: "так", licenseEditableNo: "няма", licenseTerminalOnly: "Ліцэнзію можна наладзіць толькі з тэрмінала сервера.", licenseTierPolicyTitle: "Палітыка ўзроўню", licenseTierPolicyText: "

Free

core Redis толькі карыстацкі інтэрфейс; ��яма тунэлявання SSH, няма рэжыму злучэння толькі для чытання, няма Cluster/Sentinel, няма Рэдагаваць JSON/Загрузіць двайковы файл/Спампаваць двайковы файл, няма ReJSON.
Цана: 0 HUF/месяц (€0/месяц).

Pro

SSH тунэляванне, рэжым злучэння толькі для чытання (уключаючы --readonly-connections/-r), Рэдагаваць JSON, Загрузіць двайковы файл, Спамп��ваць двайковы файл, ReJSON.
Базавая цана: 400 HUF/месяц (1 еўра/месяц) або 4000 HUF/год (10 €/год).
Усяго з 27% VAT: 500 HUF/месяц (1,27 €/месяц) або 5100 HUF/год (12,70 €/год).

Enterprise

SSH тунэляванне, Cluster і Sentinel, а таксама рэдагаваць JSON, загружаць двайковы файл, спампоўваць двайковы файл, ReJSON; --readonly-connections/-r таксама працуе.
Базавая цана: 1200 HUF/месяц (3 €/месяц) або 12 000 HUF/год (30 еўра/год).
Усяго з 27% VAT: 1500 HUF/месяц (3,81 еўра/месяц) або 15200 HUF/год (38,10 еўра/год).

Гадавы правіла

Гадавы кошт у 10 разоў большы за месяц цана.

Seats

Ліцэнзія па змаўчанні ўключае 5 месцаў. Калі вам патрэбна больш месцаў, звяжыцеся з намі па адрасе support@corifeus.com.

EПрабная версія для прадпрыемства

10 дзён бясплатна для тых, хто мае рэальны існуючы адрас электроннай пошты (нетэставая электронная пошта).

Інфармацыя аб аплаце ў электроннай пошце

Імя, адрас электроннай пошты для выстаўлення рахункаў, код краіны, паштовы індэкс, горад, адрас, VAT ID (неабавязкова).

Аплата

PayPal аплата даступная толькі ў HUF (форынт); пасля адпраўкі грошай @ https://paypal.me/corifeus я вышлю вам рахунак. Усе плацяжы вяртанню не падлягаюць.

VAT

VAT дадаецца да кошту (27% у Венгрыя).

Кантакт

Калі вы хочаце перадаць прывітанне ці ў вас ёсць пытанне, звяжыцеся support@corifeus.com.

Language

Рахунак-фактура і ліцэнзія па электроннай пошце на англійскай мове. Валюта рахунка-фактуры: HUF.

Note

Праверка ліцэнзіі патрабуе доступу ў Інтэрнэт.", licenseState: "Дзяржава", licenseStateActive: "Актыўны", licenseStateInactive: "Неактыўны", licenseStateNoLicense: "Няма ліцэнзіі", licenseKeyMasked: "Захаваны ключ", licenseTier: "Ярус", licenseValid: "Сапраўдны", licenseStatus: "Статус ліцэнзіі", licenseReason: "Прычына", licenseCheckedAt: "Праверана ў", licenseStartsAt: "Пачынаецца ў", licenseExpiresAt: "Тэрмін дзеяння заканчваецца ў", licenseDaysLeft: "Засталося дзён", licenseMaxDevices: "Макс прылад", licenseActiveDevices: "Актыўныя прылады", licenseActiveDevicesInfo: "Калі прылада больш не выкарыстоўваецца, яе сядзенне вызваляецца аўтаматычна праз 75 хвілін.", licenseCustomerEmail: "Электронная пошта кліента", licenseFeatures: "Асаблівасці", licenseFeaturesEmpty: "Ніякіх дадатковых функцый", licenseFeatureReadonlyMode: "Рэжым злучэння толькі для чытання", licenseFeatureReadonlyConnectionsFlag: "Злучэнні толькі для чытання (--readonly-connections/-r)", licenseFeatureSsh: "SSH тунэляванне", licenseFeatureCluster: "Злучэнні Cluster", licenseFeatureSentinel: "Злучэнні Sentinel", licenseFeatureReJSON: "ReJSON (тып даны�� JSON)", keysSort: { on: "Сартаванне ключоў уключана", off: "Сартаванне ключоў выключана" }, cluster: { on: "Cluster укл", off: "Cluster выключаны" }, sentinel: { on: "Sentinel укл", off: "Sentinel выключаны", name: "Назва Sentinel" }, readonly: { on: "Толькі для чытання ўключана", off: "Толькі чытанне выключана" }, proSshOnly: "SSH даступны ў версіях Pro або Enterprise.", proReadonlyOnly: "Рэжым падключэння толькі для чытання даступны ў Pro або Enterprise.", enterpriseClusterSentinelOnly: "Cluster і Sentinel даступныя толькі ў Enterprise.", theme: { light: "Святло", dark: "Цёмнае прадпрыемства", darkNeu: "Цёмны", darkoBluo: "Дарка Блуо", enterprise: "Прадпрыемства", redis: "Redis", matrix: "Матрыца" }, connected: opts => { return `Падключана: ${opts.name}`; }, tree: "Дрэва", askAuth: "Запытаць дазвол", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Модулі", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Адключыцца", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Каманды Redis", ungrouped: "Без групы", grouped: "Grouped", connectFirst: "Спачатку падключыцеся да сервера Redis", searchLanguage: "Шукаць мову...", exportProgress: "Экспарт ключоў...", importProgress: "Імпарт ключоў...", importPreview: "Папярэдні прагляд", importOverwrite: "Перазапісаць", importSkip: "Прапусціць", importConflict: "Калі ключ ужо існуе:", noKeysToExport: "Няма ключоў для экспарту", time: "Час", loading: "Загрузка...", autoRefresh: "Аўта", exportSearchHint: "Экспартуюцца толькі ключы, якія адпавядаюць бягучаму пошуку", importSearchHint: "Імпарт прымяняецца да ўсёй базы дадзеных, а не толькі да вынікаў пошуку", importNoKeys: "Ключы ў файле не знойдзены", }, status: { dataCopied: "Дадзеныя знаходзяцца ў буферы абмену", licenseSaved: "Ліцэнзія захавана", exportDone: "Экспарт завершаны", indexCreated: "Індэкс створаны", indexDropped: "Індэкс выдалены", importDone: (opts) => `Імпарт завершаны: ${opts.created} створана, ${opts.skipped} прапушчана, ${opts.errors} памылак`, nodeRemoved: "Вузел выдалены", keyIsNotExisting: "Гэты ключ мог быць выдалены або пратэрмінаваны.", keyCount: opts => { if (opts.keyCount === 0) { return "Няма ключа"; } else if (opts.keyCount === 1) { return "1 ключ"; } else { return `${opts.keyCount} ключы`; } }, treeExpandAll: "Разгарніце ўсе лісце дрэва. Гэтая аперацыя можа быць дарагой і можа заняць час ...", noRedisKeys: "У гэтай базе няма ключоў.", redisConnected: "Redis паспяхова падключыўся", reloadingDataInfo: "Перазагрузка даных Redis", added: "Дададзена", saved: "Абноўлены", cancelled: "Адменена", deleted: "Выдалены", savedRedis: "Даныя Redis захаваны", redisDisconnected: opts => { return `Бягучае злучэнне мела памылку: ${opts.error.message}`; }, dbChanged: opts => { return `Індэкс db усталяваны ў ${opts.db}. `; }, treeDeleted: opts => { return `Ключ дрэва быў выдалены (${opts.key}).`; }, deletedKey: opts => { return `Ключ быў выдалены (${opts.key}).`; }, renamedKey: "Гэты ключ быў перайменаваны", ttlChanged: "TTL гэтага ключа быў зменены", notInteger: "Гэты ўвод не з'яўляецца цэлым лікам", persisted: "Гэты ключ захоўваецца вечна", set: "Ключ усталяваны/дададзены" }, code: { "delete-connection": "Гэта злучэнне было выдалена, таму вы адключаны ад гэтага асобніка Redis.", "save-connection": "Гэта злучэнне было зменена, таму вы адключаны ад гэтага асобніка Redis. Вы можаце паўторна падключыцц��.", "readonly-connections": "Даданне/захаванне/выдаленне злучэнняў толькі для чытання!", "readonly-connection-mode": "Гэта злучэнне ў рэжыме толькі для чытання!", "list-out-of-bounds": "Гэты індэкс спісу па-за межамі", "donation-ware-feature": "Гэтая функцыя прысутнічае ў версіі для ахвяраванняў.", "feature-pro-readonly-required": "Рэжым злучэння толькі для чытання патрабуе ліцэнзіі Pro або Enterprise.", "feature-pro-ssh-required": "Тунэляванне SSH патрабуе ліцэнзіі Pro або Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster і Sentinel патрабуюць ліцэнзіі Enterprise.", "feature-pro-json-binary-required": "Рэдагаванне JSON, загрузка двайковага файла і загрузка двайковага файла патрабуюць ліцэнзіі Pro або Enterprise.", "feature-pro-rejson-required": "ReJSON (тып даных JSON) патрабуе ліцэнзіі Pro або Enterprise.", "invalid-json-value": "Значэнне несапраўднае JSON.", "http_auth_required": "Патрабуецца аўтарызацыя: прайдзіце аўтэнтыфікацыю з дапамогай HTTP Basic Auth і перазагрузіце.", "auto-connection-failed": "Магчыма, з-за гэтага злучэнне было выдалена і аўтаматычнае злучэнне не атрымалася.", invalid_console_command: "Гэтая каманда не працуе праз GUI." }, licenseReason: { LICENSE_VALID: "Ліцэнзія сапраўдная", LICENSE_INVALID: "Ліцэнзія несапраўдная", LICENSE_MISSING: "Ліцэнзійны ключ не ўсталяваны", LICENSE_DISABLED: "Ліцэнзія адключана ў канфігурацыі сервера", LICENSE_NOT_FOUND: "Ліцэнзія не знойдзена", LICENSE_EXPIRED: "Тэрмін дзеяння ліцэнзіі скончыўся", LICENSE_CLEARED: "Ліцэнзійны ключ ачышчаны", LICENSE_MAX_DEVICES_REACHED: "Дасягнута максімальная колькасць месцаў для прылад", PRODUCT_MISMATCH: "Ліцэнзійны прадукт не супадае" }, licenseStatusValue: { active: "Актыўны", deleted: "Выдалены", all: "Усе", expired: "Пратэрмінаваны", missing: "Прапаў без вестак", inactive: "Неактыўны" }, form: { error: { required: "абавязковы", port: "Порт знаходзіцца паміж 1-65535", invalid: "Форма несапраўдная" }, connection: { label: { name: "Імя", group: "Group", host: "Імя хаста", port: "Порт", password: "Пароль", username: "Імя карыстальніка" } }, treeSettings: { maxValueDisplay: "Максімальная даўжыня радка адлюстравання значэння", maxValueDisplayInfo: "Калі ўстаноўлена 0, паказваць поўныя значэнні. Калі больш за 0, скараціць да гэтай даўжыні. Калі -1: для радкоў, схаваць значэнне да рэдагавання; для іншых тыпаў, паказаць поўны кантэнт.", maxKeys: "Максімальная колькасць ключоў", maxKeysInfo: "Каб GUI не выходзіць з ладу, мы абмяжоўваем максімальную колькасць ключоў.", keyCount: () => { return `Колькасць клавіш: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Выкарыстоўвайце анімацыю", noAnimation: "Без анімацыі", jsonFormatTwoSpace: "Фармат JSON з 2 прабеламі", jsonFormatFourSpace: "Фармат JSON з 4 прабеламі", formName: "Налады Redis", searchModeClient: "Рэжым пошуку кліента", searchModeServer: "Рэжым пошуку сервера", searchModeStartsWith: "Пошук з пачынаецца з рэжыму", searchModeIncludes: "Пошук уключае рэжым" }, field: { treeSeparator: "Раздзяляльнік дрэў", treeSeparatorSelector: "Селектар падзельніка дрэва", page: "Колькасць старонак дрэва", keyPageCount: "Колькасць ключавых старонак", keysSort: "Сартуйце ключы", searchMode: "Рэжым пошуку", searchModeStartsWith: "Пошук пачынаецца з / уключае" }, error: { keyPageCount: "Колькасць ключавых старонак павінна быць цэлым лікам ад 5 да 100", page: "Колькасць старонак павінна быць цэлым лікам ад 10 да 5000", maxValueDisplay: "Максімальнае адлюстраванае значэнне павінна быць цэлым лікам ад -1 да 32768", maxKeys: "Максімальнае значэнне колькасці ключоў павінна быць цэлым лікам ад 100 да 100000" } }, key: { label: { formName: { add: "Дадайце новы ключ Redis", edit: "Рэдагаваць ключ Redis", append: "Дадаць да існуючага ключа Redis" } }, field: { streamTimestamp: "Метка часу", key: "ключ", type: "Тып", index: "Паказальнік", hashKey: "Хэш ключ", score: "Ацэнка", value: "Каштоўнасць" }, error: { streamTimestamp: "Патрабуецца пазнака часу ў фармаце Redis або ў выглядзе *", key: "Ключ - гэта хаця б адзін знак", hashKey: "Ключ хэш-табліцы складаецца як мінімум з аднаго сімвала", score: "Патрабуецца адсартаваны бал", value: "Значэнне абавязковае" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Пошук", index: "Індэкс", query: "Запыт", results: "Вынікі", noIndex: "Індэксы не знойдзены", createIndex: "Стварыць індэкс", dropIndex: "Выдаліць індэкс", indexInfo: "Інфа пра індэкс", indexName: "Назва індэкса", prefix: "Прэфікс ключа (неабавязкова)", fieldName: "Назва поля", }, monitor: { title: "Маніторынг", memory: "Памяць", opsPerSec: "Аперацый/с", clients: "Кліенты", blocked: "Заблакіравана", hitsMisses: "Каэфіцыент трапленняў", networkIo: "Сеткавы ўвод/вывад", slowLog: "Павольны журнал", totalCommands: "Усяго", expired: "Пратэрмінавана", evicted: "Выселена", clientList: "Спіс кліентаў", topKeys: "Найбуйнейшыя ключы", killClient: "Забіць кліента", clientKilled: "Кліент забіты", confirmKillClient: "Вы ўпэўнены, што хочаце спыніць гэтага кліента?", noKeys: "Няма ключоў", noClients: "Няма кліентаў", }, overview: { noConnected: "Няма сувязі з Redis.", overviewClients: "Пералічыце падлучаных па колькасці кліентаў", connectedCount: opt => { if (opt.length === 1) { return "1 кліент"; } return `${opt.length} кліентаў`; } }, key: { label: { key: "ключ", encoding: "Кадзіроўка", length: "Памер", ttl: "TTL", ttlTitle: "Час жыць", type: "Тып", ttlNotExpire: "не мінае", lengthString: "байт", lengthItem: "элементы", actions: "Дзеянні" }, list: { table: { index: "Паказальнік", value: "Каштоўнасць" } }, hash: { table: { hashkey: "Хэшкі", value: "Каштоўнасць" } }, set: { table: { value: "Член" } }, zset: { table: { value: "Член", score: "Ацэнка" } }, stream: { table: { timestamp: "Ідэнтыфікатар пазнакі часу", field: "Палявы", value: "Каштоўнасць" } } }, treeControls: { settings: "Налады дрэва", expandAll: "Разгарнуць усе", collapseAll: "Згарнуць усё", search: { search: "Пошук па ключах", clear: "Ачысціць бягучы пошук, каб зрабіць пустым", placeholderClient: "Пошук на баку кліента", placeholderServer: "Пошук на баку сервера", info: "Пошук на баку кліента азначае, што ён адпа��ядае тэксту ўводу пошуку. Пошук на баку сервера азначае, што ён падобны да пошуку ў шаблонах ключоў *{search-text}*. Для вялікіх пошукавых набораў лепш выкарыстоўваць пошук на серверы. Для меншых набораў пошуку лепш выкарыстоўваць рэжым пошуку на баку кліента." + ` Калі падлік ключоў скончыўся ${p3xr.settings.maxLightKeysCount}, вы можаце шукаць толькі на баку сервера.`, largeSetInfo: "У вялікім наборы пошук на баку кліента адключаны. таму зараз магчымы толькі пошук на серверы.", infoDetails: "Каб даведацца, як працуе пошук, праверце налады" }, pager: { next: "Далей", prev: "Папярэдні", first: "Першы", last: "Апошні" } } }, time: { loading: "Загрузка...", years: "гадоў", months: "месяцаў", days: "дзён", year: "год", month: "месяц", day: "дзень" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/bg/000077500000000000000000000000001517666434100137435ustar00rootroot00000000000000src/strings/bg/strings.js000066400000000000000000001145201517666434100157750ustar00rootroot00000000000000const strings = { error: { cleared_license: "Лицензът е изчистен", invalid_license: "Невалиден лиценз", license_max_devices_reached: "Достигнат е максималният брой устройства", license_readonly: "Лицензът може да бъде променен само от сървърния терминал.", server_error: "Грешка на сървъра, моля опитайте отново" }, title: { donate: "Дарение", jsonRecursive: "Разгъване на всички листа", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Можете да изберете Redis връзка от долното ляво меню.", statistics: "Статистика", error: "Грешка", connectingRedis: "Свързване с Redis ...", socketioConnectError: "Грешка на Socket.IO", db: "БД", server: "Сървър", clients: "Клиенти", memory: "Памет", persistence: "Устойчивост", stats: "Статистика", replication: "Репликация", cpu: "CPU", cluster: "Клъстер", modules: "Модули", errorstats: "Статистика за грешки", commandstats: "Статистика на командите", latencystats: "Статистика на закъсненията", keysizes: "Размери на ключовете", threads: "Нишки", }, confirm: { dropIndex: "Сигурни ли сте, че искате да изтриете този индекс?", uploadBuffer: "Сигурни ли сте, че искате да качите тези двоични данни?", uploadBufferDone: "Двоичните данни са качени", uploadBufferDoneAndSave: "Двоичните данни са качени и запазени на сървъра", title: "Потвърждение", alert: "Внимание", info: "Информация", deleteListItem: "Сигурни ли сте, че искате да изтриете този елемент от списъка?", deleteHashKey: "Сигурни ли сте, че искате да изтриете този хеш ключ?", deleteStreamTimestamp: "Сигурни ли сте, че искате да изтриете тази времева марка от потока?", deleteSetMember: "Сигурни ли сте, че искате да изтриете този член на множеството?", deleteZSetMember: "Сигурни ли сте, че искате да изтриете този член на подреденото множество?", deleteConnection: "Потвърждение", deleteConnectionText: "Сигурни ли сте, че искате да изтриете тази Redis връзка?", deleteNode: "Сигурни ли сте, че искате да изтриете този Redis възел?", deleteAllKeys: opts => { return `Изтриване на това дърво и всички негови ключове (${opts.key})?`; }, socketioConnectError: "Socket.IO не може да се свърже със сървъра, можете да презаредите и да опитате да разрешите грешката при свързването сами, клиентът не знае как да я разреши сам.", socketioAuthRequired: "Необходима е оторизация чрез Socket.IO. Моля, удостоверете се с HTTP Basic Auth (потребителско име/парола) и презаредете.", deleteKey: "Сигурни ли сте, че искате да изтриете този ключ?", rename: { title: "Сигурни ли сте, че искате да преименувате този ключ?", textContent: "Това действие преименува ключа окончателно.", placeholder: "Redis ключ (задължителен)" }, ttl: { title: "Сигурни ли сте, че искате да промените TTL на този ключ?", textContent: "Промяната на TTL обновява времето за живот на този ключ. Оставете празно, за да запазите ключа завинаги.", placeholder: "TTL на Redis ключа (цяло число или празно)", placeholderPlaceholder: "Празно означава, че се запазва завинаги; в противен случай въведете цяло число.", convertTextToTime: "Преобразуване на текст във време", convertTextToTimePlaceholder: "Напр. 1d ще бъде 86400" }, license: { title: "Задаване на лиценз", textContent: "Ако искате да използвате платени функции, моля свържете се с support@corifeus.com, за да заявите лиценз. Цените са Pro 400 HUF/месец (€1/месец) или 4,000 HUF/годишно (€10/годишно), и Enterprise 1,200 HUF/месец (€3/месец) или 12,000 HUF/годишно (€30/годишно). Годишната цена е 10 пъти месечната. С 27% ДДС общите суми са Pro 500 HUF/месец (€1.27/месец) или 5,100 HUF/годишно (€12.70/годишно), Enterprise 1,500 HUF/месец (€3.81/месец) или 15,200 HUF/годишно (€38.10/годишно). Валидирането на лиценза изисква достъп до интернет. Стандартният лиценз включва 5 места. Ако имате нужда от повече места, свържете се с нас на support@corifeus.com.", placeholder: "Лицензен ключ" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Копирай", downloadBuffer: "Изтегли двоичен файл", setBuffer: "Качи двоичен файл", exportKeys: "Експортиране на ключове", exportAllKeys: (opts) => `Експорт на всички ${opts.count} ключа`, exportSearchResults: (opts) => `Експорт на ${opts.count} резултата`, importKeys: "Импортиране на ключове", saveWithFormatJson: "Запази с форматиране", formatJson: "Форматирай Json", wrap: "Обвиване", unwrap: "Развиване", downloadJson: "Изтегли JSON", pubsubMonitor: "PubSub Монитор", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Език / Language", ok: "OK", addKey: "Добави към този ключ", addKeyRoot: "Добави основен ключ", reloadKey: "Презареди ключ", reload: "Презареди", close: "Затвори", commands: "Команди", view: "Изглед", statistics: "Статистика", refresh: "Обнови", pause: "Пауза", resume: "Продължи", clear: "Изчисти", rename: "Преименувай", main: "База данни", cancel: "Отказ", theme: "Тема", github: "GitHub", githubRepo: "Хранилище", githubRelease: "Издания", githubChangelog: "Списък с промени", info: "Info", settings: "Настройки", connect: "Свържи", disconnect: "Прекъсни", overview: "Преглед", console: "Конзола", noConnections: "Няма връзки, добавете връзка в менюто с настройки.", noConnectionsInSettings: "Няма връзки, можете да добавите НОВА ВРЪЗКА по-горе.", connectionAdd: "Нова връзка", addGroup: "Добави група", extend: "Разгъни", collapse: "Свий", add: "Добави", edit: "Редактирай", save: "Запази", ttl: "Задай TTL", license: "Задай лиценз", delete: "Изтрий", remove: "Премахни", sure: "Сигурен", testConnection: "Тестване на връзката", getKey: "Зареждане на Redis ключ и свързани данни ...", jsonViewShow: "Покажи JSON", jsonViewEditor: "Редактирай JSON", quickConsole: "Бърза конзола" }, label: { id: { nodeId: 'ID на възела', id: "ID на връзката", info: "Ако не искате да променяте свойствата: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, моля въведете ID на връзката в тези полета, за да запазите стойностите на свойствата. Ако искате същата логика за паролата на възела, въведете ID на възела в паролата на възела." }, secureFeature: 'Ако видите стойност, която започва с P3X и изглежда еднаква, това е защитна функция. За да промените настройките, просто заменете тези настройки с празни или нещо друго и те ще бъдат запазени. Ако не промените настройките, те ще бъдат запазени така, както са на сървъра.', ssh: { on: 'SSH включен', off: 'SSH изключен', sshHost: 'SSH Хост', sshPort: 'SSH Порт', sshUsername: 'SSH Потребителско име', sshPassword: 'SSH Парола', sshPrivateKey: 'SSH Частен ключ' }, isBuffer: opts => `[object ArrayBuffer] означава, че стойността е двоични данни или стойността е по-голяма от ${opts.maxValueAsBuffer}`, streamValue: `Полето и стойността на потока са на един ред. Напр.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' означава автоматично генериране или спецификация като -`, unableToLoadKey: ({ key }) => { return `Не може да се зареди този ключ: ${key}. Възможно е ключът да е изтрит. Точната грешка е в конзолата.`; }, bigJson: "Този JSON обект е над 10 кб, затова се уверете, че знаете какво правите, защото някои функции могат да се визуализират бавно.", addNode: "Добави възел", validateJson: "Валидирай JSON", reducedFunction: `Намалена функционалност`, tooManyKeys: opts => { return `За пълните максимални функции допустимият общ брой ключове е ${opts.maxLightKeysCount}. Тази база данни има повече от допустимия общ брой ключове ${opts.count}. Сортирането на ключовете и допълнителната информация за дървото са деактивирани. Търсенето се извършва само на сървъра, вместо на клиента.`; }, redisCommandNotFound: "Не е намерена съвпадаща Redis команда ...", treeKeyStore: `Сортирането (естествено сравнение) се изпълнява на клиента, т.е. браузъра, което означава, че има забавяне при големи набори от данни, като над 10 хил. ключа, може да добави малко време за визуализация на страницата. В Redis няма сортиране на ключове, само по този начин.`, socketIoTimeout: options => { return `Socket.IO изтече за тази заявка (макс. ${options.timeout / 1000} секунди) ...`; }, resizerInfo: options => { return `Минималната ширина на левия или десния панел е ${options.width}px`; }, jsonViewNotParsable: "Тази стойност не може да бъде обработена като JSON ", ttlTitle: "Задайте TTL в секунди", passwordSecure: "Паролата може да е празна, но все пак ще показва символи, това е защитна функция.", tlsWithoutCert: "Активиране на TLS без допълнителен сертификат", tlsRejectUnauthorized: "Отхвърляне на неоторизиран сертификат", tlsSecure: "Ако видите TLS конфигурация, която започва с P3X или всички TLS настройки изглеждат еднакви, това е защитна функция. За да промените настройките, просто заменете тези настройки с празни или нещо друго и те ще бъдат запазени. Ако не промените TLS настройките, те ще бъдат запазени така, както са на сървъра.", treeSeparatorEmpty: "Ако разделителят на дървото е празен, дървото няма да има вложени възли, а само обикновен списък", treeSeparatorEmptyNote: "Без вложени възли, само обикновен списък", welcomeConsole: "Добре дошли в Redis Конзолата", welcomeConsoleInfo: "Историята с курсора НАГОРЕ или НАДОЛУ е активирана", redisListIndexInfo: "Празно за добавяне накрая, -1 за добавяне в началото или запазете на показаната позиция.", console: "Конзола", connectiondAdd: "Добави връзка", connectiondEdit: "Редактирай връзка", connectiondView: "Преглед на връзка", connections: "Връзки", licenseInfo: "Лиценз", licenseEditable: "Лицензът е редактируем", licenseEditableYes: "Да", licenseEditableNo: "Не", licenseTerminalOnly: "Лицензът може да бъде конфигуриран само от сървърния терминал.", licenseTierPolicyTitle: "Политика на нивата", licenseTierPolicyText: "

Безплатен

Само основен Redis UI; без SSH тунелиране, без режим Readonly за връзки, без Cluster/Sentinel, без Редактиране на JSON/Качване на двоични файлове/Изтегляне на двоични файлове, без ReJSON.
Цена: 0 HUF/месец (€0/месец).

Pro

SSH тунелиране, режим Readonly за връзки (включително --readonly-connections/-r), Редактиране на JSON, Качване на двоични файлове, Изтегляне на двоични файлове, ReJSON.
Базова цена: 400 HUF/месец (€1/месец) или 4,000 HUF/годишно (€10/годишно).
Общо с 27% ДДС: 500 HUF/месец (€1.27/месец) или 5,100 HUF/годишно (€12.70/годишно).

Enterprise

SSH тунелиране, Cluster и Sentinel, плюс Редактиране на JSON, Качване на двоични файлове, Изтегляне на двоични файлове, ReJSON; --readonly-connections/-r също работи.
Базова цена: 1,200 HUF/месец (€3/месец) или 12,000 HUF/годишно (€30/годишно).
Общо с 27% ДДС: 1,500 HUF/месец (€3.81/месец) или 15,200 HUF/годишно (€38.10/годишно).

Годишно правило

Годишната цена е 10 пъти месечната цена.

Места

Стандартният лиценз включва 5 места. Ако имате нужда от повече места, свържете се с нас на support@corifeus.com.

Enterprise пробен период

10 дни безплатно за всеки с реален съществуващ имейл адрес (не тестов имейл).

Информация за фактуриране по имейл

Име, Имейл за фактуриране, Код на държавата, Пощенски код, Град, Адрес, ДДС номер (по избор).

Плащане

PayPal плащане е достъпно само в HUF (форинти); след изпращане на сумата @ https://paypal.me/corifeus ще ви изпратя фактура. Всички плащания са невъзвращаеми.

ДДС

ДДС се добавя към цената (27% в Унгария).

Контакт

Ако искате да се свържете с нас или имате въпрос, пишете на support@corifeus.com.

Език

Фактурата и лицензната имейл комуникация са на английски. Валутата на фактурата е HUF.

Забележка

Валидирането на лиценза изисква достъп до интернет.", licenseState: "Състояние", licenseStateActive: "Активен", licenseStateInactive: "Неактивен", licenseStateNoLicense: "Няма лиценз", licenseKeyMasked: "Запазен ключ", licenseTier: "Ниво", licenseValid: "Валиден", licenseStatus: "Статус на лиценза", licenseReason: "Причина", licenseCheckedAt: "Проверен на", licenseStartsAt: "Започва на", licenseExpiresAt: "Изтича на", licenseDaysLeft: "Оставащи дни", licenseMaxDevices: "Максимален брой устройства", licenseActiveDevices: "Активни устройства", licenseActiveDevicesInfo: "Ако устройство вече не се използва, мястото му се освобождава автоматично след 75 минути.", licenseCustomerEmail: "Имейл на клиента", licenseFeatures: "Функции", licenseFeaturesEmpty: "Няма допълнителни функции", licenseFeatureReadonlyMode: "Режим Readonly за връзка", licenseFeatureReadonlyConnectionsFlag: "Readonly връзки (--readonly-connections/-r)", licenseFeatureSsh: "SSH тунелиране", licenseFeatureCluster: "Клъстер връзки", licenseFeatureSentinel: "Sentinel връзки", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Сортиране на ключове включено", off: "Сортиране на ключове изключено" }, cluster: { on: "Клъстер включен", off: "Клъстер изключен" }, sentinel: { on: "Sentinel включен", off: "Sentinel изключен", name: "Sentinel име" }, readonly: { on: "Readonly включен", off: "Readonly изключен" }, proSshOnly: "SSH е достъпен в Pro или Enterprise.", proReadonlyOnly: "Режимът Readonly за връзки е достъпен в Pro или Enterprise.", enterpriseClusterSentinelOnly: "Cluster и Sentinel са достъпни само в Enterprise.", theme: { light: "Светла", dark: "Тъмна enterprise", darkNeu: "Тъмна", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Свързан: ${opts.name}`; }, tree: "Дърво", askAuth: "Заявка за оторизация", keyboardShortcuts: "Клавишни комбинации", about: "Относно", supportedLanguages: "Поддържани езици", version: "Версия", redisVersion: "Redis версия", modules: "Модули", shortcutRefresh: "Опресняване", shortcutSearch: "Фокус върху търсенето", shortcutNewKey: "Нов ключ", shortcutDisconnect: "Прекъсни", themeAuto: "Автоматично (система)", shortcutCommandPalette: "Палитра с команди", commandPalette: "Палитра с команди", noResults: "Няма резултати", redisCommandsReference: "Redis Команди", ungrouped: "Без група", grouped: "Групирани", connectFirst: "Първо се свържете с Redis сървър", searchLanguage: "Търсене на език...", exportProgress: "Експортиране на ключове...", importProgress: "Импортиране на ключове...", importPreview: "Преглед", importOverwrite: "Презаписване", importSkip: "Пропускане", importConflict: "Ако ключът вече съществува:", noKeysToExport: "Няма ключове за експортиране", time: "Време", loading: "Зареждане...", autoRefresh: "Авто", exportSearchHint: "Експортиране само на ключове, съвпадащи с текущото търсене", importSearchHint: "Импортът се прилага към цялата база данни, не само към резултатите от търсенето", importNoKeys: "Не са намерени ключове във файла", }, status: { dataCopied: "Данните са в клипборда", licenseSaved: "Лицензът е запазен", exportDone: "Експортът е завършен", indexCreated: "Индексът е създаден", indexDropped: "Индексът е изтрит", importDone: (opts) => `Импортът завършен: ${opts.created} създадени, ${opts.skipped} пропуснати, ${opts.errors} грешки`, nodeRemoved: "Възелът е премахнат", keyIsNotExisting: "Този ключ може да е бил изтрит или изтекъл.", keyCount: opts => { if (opts.keyCount === 0) { return "Няма ключове"; } else if (opts.keyCount === 1) { return "1 ключ"; } else { return `${opts.keyCount} ключа`; } }, treeExpandAll: "Разгъване на всички листа на дървото. Тази операция може да е ресурсоемка и да отнеме време ...", noRedisKeys: "Няма ключове в тази база данни.", redisConnected: "Redis е свързан успешно", reloadingDataInfo: "Презареждане на информацията за Redis данните", added: "Добавено", saved: "Обновено", cancelled: "Отменено", deleted: "Изтрито", savedRedis: "Redis данните са запазени", redisDisconnected: opts => { return `Текущата връзка имаше грешка: ${opts.error.message}`; }, dbChanged: opts => { return `Индексът на БД е зададен на ${opts.db}. `; }, treeDeleted: opts => { return `Ключът на дървото е изтрит (${opts.key}).`; }, deletedKey: opts => { return `Ключът е изтрит (${opts.key}).`; }, renamedKey: "Този ключ е преименуван", ttlChanged: "TTL на този ключ е променен", notInteger: "Този вход не е цяло число", persisted: "Този ключ е запазен завинаги", set: "Ключът е зададен/добавен" }, code: { "delete-connection": "Тази връзка е изтрита, затова сте прекъснати от тази Redis инстанция.", "save-connection": "Тази връзка е променена, затова сте прекъснати от тази Redis инстанция. Можете да се свържете отново.", "readonly-connections": "Връзките за добавяне/запазване/изтриване са само за четене!", "readonly-connection-mode": "Тази връзка е в режим само за четене!", "list-out-of-bounds": "Индексът на списъка е извън обхвата", "donation-ware-feature": "Тази функция е налична в платената версия.", "feature-pro-readonly-required": "Режимът Readonly за връзки изисква Pro или Enterprise лиценз.", "feature-pro-ssh-required": "SSH тунелирането изисква Pro или Enterprise лиценз.", "feature-enterprise-cluster-sentinel-required": "Cluster и Sentinel изискват Enterprise лиценз.", "feature-pro-json-binary-required": "Редактиране на JSON, Качване на двоични файлове и Изтегляне на двоични файлове изискват Pro или Enterprise лиценз.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Необходима е оторизация: моля, удостоверете се с HTTP Basic Auth и презаредете.", "auto-connection-failed": "Възможно е връзката да е била премахната и автоматичното свързване е неуспешно поради това.", invalid_console_command: "Тази команда не работи чрез GUI." }, licenseReason: { LICENSE_VALID: "Лицензът е валиден", LICENSE_INVALID: "Лицензът е невалиден", LICENSE_MISSING: "Не е зададен лицензен ключ", LICENSE_DISABLED: "Лицензът е деактивиран в конфигурацията на сървъра", LICENSE_NOT_FOUND: "Лицензът не е намерен", LICENSE_EXPIRED: "Лицензът е изтекъл", LICENSE_CLEARED: "Лицензният ключ е изчистен", LICENSE_MAX_DEVICES_REACHED: "Достигнат е максималният брой устройства", PRODUCT_MISMATCH: "Продуктът на лиценза не съвпада" }, licenseStatusValue: { active: "Активен", deleted: "Изтрит", all: "Всички", expired: "Изтекъл", missing: "Липсващ", inactive: "Неактивен" }, form: { error: { required: "Задължително", port: "Портът е между 1-65535", invalid: "Формулярът е невалиден" }, connection: { label: { name: "Име", group: "Група", host: "Хост", port: "Порт", password: "Парола", username: "Потребителско име" } }, treeSettings: { maxValueDisplay: "Максимална дължина на показвания текст", maxValueDisplayInfo: "Ако е зададено 0, показва пълните стойности. Ако е по-голямо от 0, съкращава до тази дължина. Ако е -1: за низове скрива стойността до редактиране; за други типове показва пълното съдържание.", maxKeys: "Максимален брой ключове", maxKeysInfo: "За да не се срине GUI, ограничаваме максималния брой ключове.", keyCount: () => { return `Брой ключове: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Използвай анимация", noAnimation: "Без анимация", jsonFormatTwoSpace: "Форматиране на JSON с 2 интервала", jsonFormatFourSpace: "Форматиране на JSON с 4 интервала", formName: "Redis настройки", searchModeClient: "Търсене от страната на клиента", searchModeServer: "Търсене от страната на сървъра", searchModeStartsWith: "Търсене с режим 'започва с'", searchModeIncludes: "Режим на търсене 'съдържа'" }, field: { treeSeparator: "Разделител на дървото", treeSeparatorSelector: "Селектор на разделител на дървото", page: "Брой страници на дървото", keyPageCount: "Брой ключове на страница", keysSort: "Сортиране на ключовете", searchMode: "Режим на търсене", searchModeStartsWith: "Търсене 'започва с' / 'съдържа'" }, error: { keyPageCount: "Броят ключове на страница трябва да е цяло число между 5 - 100", page: "Броят на страниците трябва да е цяло число между 10 - 5000", maxValueDisplay: "Максималната показвана стойност трябва да е цяло число между -1 и 32768", maxKeys: "Максималният брой ключове трябва да е цяло число между 100 и 100000" } }, key: { label: { formName: { add: "Добавяне на нов Redis ключ", edit: "Редактиране на Redis ключ", append: "Добавяне към съществуващ Redis ключ" } }, field: { streamTimestamp: "Времева марка", key: "Ключ", type: "Тип", index: "Индекс", hashKey: "Хеш ключ", score: "Резултат", value: "Стойност" }, error: { streamTimestamp: "Времевата марка е задължителна, във формат на Redis или като *", key: "Ключът е поне един символ", hashKey: "Хеш ключът е поне един символ", score: "Резултатът на подреденото множество е задължителен", value: "Стойността е задължителна" } }, main: { label: { database: "БД" } } }, page: { search: { title: "Търсене", index: "Индекс", query: "Заявка", results: "Резултати", noIndex: "Не са намерени индекси", createIndex: "Създай индекс", dropIndex: "Изтрий индекс", indexInfo: "Инфо за индекс", indexName: "Име на индекс", prefix: "Префикс на ключ (по избор)", fieldName: "Име на поле", }, monitor: { title: "Мониторинг", memory: "Памет", opsPerSec: "Операции/сек", clients: "Клиенти", blocked: "Блокирани", hitsMisses: "Процент попадения", networkIo: "Мрежов I/O", slowLog: "Бавен журнал", totalCommands: "Общо", expired: "Изтекли", evicted: "Изгонени", clientList: "Списък с клиенти", topKeys: "Най-големи ключове", killClient: "Убий клиент", clientKilled: "Клиентът е убит", confirmKillClient: "Сигурни ли сте, че искате да спрете този клиент?", noKeys: "Няма ключове", noClients: "Няма клиенти", }, overview: { noConnected: "Няма връзка с Redis.", overviewClients: "Списък на свързаните по брой клиенти", connectedCount: opt => { if (opt.length === 1) { return "1 клиент"; } return `${opt.length} клиента`; } }, key: { label: { key: "Ключ", encoding: "Кодиране", length: "Размер", ttl: "TTL", ttlTitle: "Време за живот", type: "Тип", ttlNotExpire: "не изтича", lengthString: "байта", lengthItem: "елемента", actions: "Действия" }, list: { table: { index: "Индекс", value: "Стойност" } }, hash: { table: { hashkey: "Хеш ключ", value: "Стойност" } }, set: { table: { value: "Член" } }, zset: { table: { value: "Член", score: "Резултат" } }, stream: { table: { timestamp: "ID на времева марка", field: "Поле", value: "Стойност" } } }, treeControls: { settings: "Настройки на дървото", expandAll: "Разгъни всичко", collapseAll: "Свий всичко", search: { search: "Търсене в ключовете", clear: "Изчисти текущото търсене", placeholderClient: "Търсене от страната на клиента", placeholderServer: "Търсене от страната на сървъра", info: "Търсенето от страната на клиента означава, че съвпада текстът във входното поле за търсене. Търсенето от страната на сървъра означава, че се търси в шаблоните на ключовете като *{текст-за-търсене}*. За големи набори от данни е по-добре да се използва търсене от страната на сървъра. За по-малки набори от данни е по-добре да се използва режим на търсене от страната на клиента." + ` Ако броят на ключовете е над ${p3xr.settings.maxLightKeysCount}, можете да търсите само от страната на сървъра.`, largeSetInfo: "При голям набор от данни търсенето от страната на клиента е деактивирано, така че в момента е възможно само търсене от страната на сървъра.", infoDetails: "За да разберете как работи търсенето, моля проверете настройките" }, pager: { next: "Следващ", prev: "Предишен", first: "Първи", last: "Последен" } } }, time: { loading: "Зареждане...", years: "години", months: "месеци", days: "дни", year: "година", month: "месец", day: "ден" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/bn/000077500000000000000000000000001517666434100137525ustar00rootroot00000000000000src/strings/bn/strings.js000066400000000000000000001275511517666434100160140ustar00rootroot00000000000000const strings = { error: { cleared_license: "ক্লিয়ার লাইসেন্স", invalid_license: "অবৈধ লাইসেন্স", license_max_devices_reached: "ডিভাইসের সর্বোচ্চ আসন পৌঁছেছে", license_readonly: "লাইসেন্স শুধুমাত্র সার্ভার টার্মিনাল থেকে পরিবর্তন করা যাবে.", server_error: "সার্ভার ত্রুটি, আবার চেষ্টা করুন" }, title: { donate: "দান করুন", jsonRecursive: "সব পাতা প্রসারিত", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "আপনি বাম নীচের মেনু থেকে সংযোগ করতে একটি Redis সংযোগ চয়ন করতে পারেন৷", statistics: "পরিসংখ্যান", error: "ত্রুটি", connectingRedis: "Redis ��র সাথে সংযুক্ত হচ্ছে...", socketioConnectError: "Socket.IO ত্রুটি৷", db: "DB", server: "সার্ভার", clients: "ক্লায়েন্টদের", memory: "স্মৃতি", persistence: "জেদ", stats: "পরিসংখ্যান", replication: "প্রতিলিপি", cpu: "CPU", cluster: "Cluster", modules: "মডিউল", errorstats: "ত্রুটির পরিসংখ্যান", commandstats: "কমান্ড পরিসংখ্যান", latencystats: "বিলম্ব পরিসংখ্যান", keysizes: "কী আকার", threads: "থ্রেড", }, confirm: { dropIndex: "আপনি কি এই ইনডেক্স মুছতে চান?", uploadBuffer: "আপনি কি এই বাইনারি ডেটা আপলোড করার বিষয়ে নিশ্চিত?", uploadBufferDone: "বাইনারি ডেটা আপলোড করা হয়", uploadBufferDoneAndSave: "বাইনারি ডেটা সার্ভারে আপলোড এবং সংরক্ষণ করা হয়", title: "নিশ্চিত করুন", alert: "সতর্কতা", info: "তথ্য", deleteListItem: "আপনি এই তালিকা আইটেম মুছে ফেলার বিষয়ে নিশ্চিত?", deleteHashKey: "আপনি এই হ্যাশ কী ��ইটেম মুছে ফেলার বিষয়ে নিশ্চিত?", deleteStreamTimestamp: "আপনি কি এই স্ট্রিম টাইমস্ট্যাম্প মুছে ফেলার বিষয়ে নিশ্চিত?", deleteSetMember: "আপনি এই সেট সদস্য মুছে ফেলার বিষয়ে নিশ্চিত?", deleteZSetMember: "আপনি এই সাজানো সেট সদস্য মুছে ফেলার বিষয়ে নিশ্চিত?", deleteConnection: "নিশ্চিত করুন", deleteConnectionText: "আপনি কি এই Redis সংযোগ মুছে ফেলার বিষয়ে নিশ্চিত?", deleteNode: "আপনি কি এই Redis নোড মুছে ফেলার বিষয়ে নিশ্চিত?", deleteAllKeys: opts => { return `এই গাছ এবং এর সমস্ত কীগুলি মুছুন (${opts.key})?`; }, socketioConnectError: "Socket.IO সার্ভারের সাথে সংযোগ করতে পারে না, আপনি পুনরায় লোড করতে পারেন এবং সংযোগ ত্রুটি নিজেই সমাধান করার চেষ্টা করতে পারেন, ক্লায়েন্ট নিজেই জানেন না কিভাবে এটি সমাধান করতে হয়।", socketioAuthRequired: "Socket.IO অনুমোদন প্রয়োজন৷ অনুগ্রহ করে HTTP Basic Auth (ব্যবহারকারীর নাম/পাসওয়ার্ড) দিয়ে প্রমাণীকরণ করুন এবং পুনরায় লোড করুন।", deleteKey: "আপনি এই কী মুছে ফেলার বিষয়ে নিশ্চিত?", rename: { title: "আপনি কি এই কীটির নাম পরিবর্তন করার বিষয়ে নিশ্চিত?", textContent: "এই ক্রিয়াটি স্থায়ীভাবে কীটির নাম পরিবর্তন করে।", placeholder: "Redis কী (প্রয়োজনীয়)" }, ttl: { title: "আপনি কি এই কীটির TTL পরিবর্তন করার বিষয়ে নিশ্চিত?", textContent: "TTL পরিবর্তন করা এই কীটির বেঁচে থাকার সময়কে আপডেট করে। চিরতরে এই কী রাখতে খালি ছেড়ে দিন।", placeholder: "Redis কী এর TTL (পূর্ণসংখ্যা বা খালি)", placeholderPlaceholder: "খালি মানে এটা চিরকাল টিকে থাকে; অন্যথায় একটি পূর্ণসংখ্যা লিখুন।", convertTextToTime: "পাঠ্যকে সময়ে রূপান্তর করুন", convertTextToTimePlaceholder: "যেমন 1d হবে 86400" }, license: { title: "লাইসেন্স সেট করু��", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "লাইসেন্স কী" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "কপি", downloadBuffer: "বাইনারি ডাউনলোড করুন", setBuffer: "বাইনারি আপলোড করুন", exportKeys: "কী রপ্তানি করুন", exportAllKeys: (opts) => `সমস্ত ${opts.count} কী রপ্তানি করুন`, exportSearchResults: (opts) => `${opts.count} ফলাফল রপ্তানি করুন`, importKeys: "কী আমদানি করুন", saveWithFormatJson: "বিন্যাস সঙ্গে সংরক্ষণ করুন", formatJson: "ফরম্যাট Json", wrap: "মোড়ানো", unwrap: "মোড়ক খুলুন", downloadJson: "JSON ডাউনলোড করুন", pubsubMonitor: "PubSub মনিটর", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "ভাষা", ok: "ঠিক আছে", addKey: "এই কী যোগ করুন", addKeyRoot: "একটি রুট কী যোগ করুন", reloadKey: "কী পুনরায় লোড করুন", reload: "পুনরায় লোড করুন", close: "বন্ধ", commands: "কমান্ড", view: "দেখুন", statistics: "পরিসংখ্যান", refresh: "রিফ্রেশ", pause: "বিরতি", resume: "পুনরায় শুরু", clear: "পরিষ্কার", rename: "না��� পরিবর্তন করুন", main: "ডাটাবেস", cancel: "বাতিল করুন", theme: "থিম", github: "GitHub", githubRepo: "ভান্ডার", githubRelease: "মুক্তি দেয়", githubChangelog: "চেঞ্জলগ", info: "Info", settings: "সেটিংস", connect: "সংযোগ করুন", disconnect: "সংযোগ বিচ্ছিন্ন করুন", overview: "ওভারভিউ", console: "কনসোল", noConnections: "কোনো সংযোগ নেই, সেটিংস মেনুতে একটি সংযোগ যোগ করুন।", noConnectionsInSettings: "কোনো সংযোগ নেই, আপনি উপরে একটি নতুন সংযোগ যোগ করতে পারেন৷", connectionAdd: "নতুন সংযোগ", addGroup: "গ্রুপ যোগ করুন", extend: "প্রসারিত করুন", collapse: "সঙ্কুচিত", add: "যোগ করুন", edit: "সম্পাদনা করুন", save: "সংরক্ষণ করুন", ttl: "TTL সেট করুন", license: "লাইসেন্স সেট করু��", delete: "মুছে দিন", remove: "সরান", sure: "নিশ্চিত", testConnection: "পরীক্ষা সংযোগ", getKey: "Redis কী এবং সংশ্লিষ্ট ডেটা লোড হচ্ছে...", jsonViewShow: "JSON প্রদর্শন করুন", jsonViewEditor: "JSON সম্পাদনা করুন", quickConsole: "দ্রুত কনসোল", }, label: { id: { nodeId: "নোড আইডি", id: "সংযোগ আইডি", info: "আপনি যদি এর বৈশিষ্ট্যগুলি পরিবর্তন করতে না চান: sshPassword, sshPrivateKey, পাসওয়ার্ড, tlsCrt, tlsKey, tlsCa, অনুগ্রহ করে সম্পত্তির মানগুলি অক্ষুণ্ণ রাখতে সেই বৈশিষ্ট্যগুলিতে সংযোগের আইডি লিখুন৷ আপনি যদি নোড পাসওয়ার্ডে একই যুক্তি চান তবে নোড পাসওয়ার্ডে নোড আইডি দিন।" }, secureFeature: "আপনি যদি P3X দিয়ে শুরু হয় এমন একটি মান দেখতে দেখতে একই রকম দেখতে পান তবে এটি একটি সুরক্ষিত বৈশিষ্ট্য। সেটিংস পরিবর্তন করতে, এই সেটিংসগুলিকে খালি বা অন্য কিছু দিয়ে প্রতিস্থাপন করুন এবং সেগুলি সংরক্ষণ করা হবে। আপনি যদি সেটিংস পরিবর্তন না করেন তবে সেটিংস সার্ভারে যেমন আছে তেমনই রাখা হবে।", ssh: { on: "SSH চালু", off: "SSH বন্ধ", sshHost: "SSH হোস্ট", sshPort: "SSH পোর্ট", sshUsername: "SSH ব্যবহারকারীর নাম", sshPassword: "SSH পাসওয়ার্ড", sshPrivateKey: "SSH ব্যক্তিগত কী" }, isBuffer: opts => `[object ArrayBuffer] মানে হল যে মানটি বাইনারি ডেটা বা মানটি এর চেয়ে বড় ${opts.maxValueAsBuffer}`, streamValue: `স্ট্রিম ক্ষেত্র এবং মান একটি একলাইনার। যেমন: ক্ষেত্র1 মান1 "ক্ষেত্র 2" "মান 2"`, streamTimestampId: `'*' মানে স্বয়ংক্রিয়ভাবে তৈরি বা - হিসাবে স্পেসিফিকেশন`, unableToLoadKey: ({ key }) => { return `এই কী লোড করতে অক্ষম: ${key}. সম্ভব, কী মুছে ফেলা হয়েছে. সঠিক ত্রুটিটি কনসোলে রয়েছে।`; }, bigJson: "এই JSON অবজেক্ট 10 kb ���র বেশি, তাই আপনি কি করছেন তা নিশ্চিত করুন, কারণ কিছু ফাংশন ধীর রেন্ডারিং হতে পারে।", addNode: "নোড যোগ করুন", validateJson: "JSON যাচাই করুন", reducedFunction: `কার্যকারিতা হ্রাস`, tooManyKeys: opts => { return `সম্পূর্ণ সর্বাধিক ফাংশনের জন্য অনুমোদিত কীগুলি মোট ${opts.maxLightKeysCount} গণনা এই ডাটাবেসে মোট অনুমোদিত কী আছে ${opts.count}. কী বাছাই এবং অতিরিক্ত অভিনব গাছের তথ্য নিষ্ক্রিয় করা হয়েছে। ক্লায়েন্ট অনুসন্ধানের পরিবর্তে সার্ভারে অনুসন্ধানটি ঘটছে।`; }, redisCommandNotFound: "কোন Redis কমান্ড মিল পাওয়া যায়নি...", treeKeyStore: `বাছাই করা (প্রাকৃতিক তুলনা) ক্লায়েন্ট ওরফে ব্রাউজারে কার্যকর করা হয়, যার মানে এটির জন্য বড় বড় সেটের জন্য একটি জরিমানা রয়েছে, যেমন 10k-এর বেশি কী, এটি পৃষ্ঠা রেন্ডারিংয়ে একটু সময় যোগ করতে পারে। Redis এ কোন কী বাছাই নেই, শুধুমাত্র এইরকম।`, socketIoTimeout: options => { return `এই অনুরোধে�� জন্য Socket.IO সময় শেষ হয়েছে (সর্বোচ্চ ${options.timeout / 1000} সেকেন্ড)...`; }, resizerInfo: options => { return `বাম বা ডান প্যানেলের ন্যূনতম প্রস্থ ${options.width}px`; }, jsonViewNotParsable: "এই মান JSON পার্সযোগ্য নয় ", ttlTitle: "সেকেন্ডের মধ্যে TTL সেট করুন", passwordSecure: "পাসওয়ার্ড খালি হতে পারে, কিন্তু তবুও এটি অক্ষর দেখাবে, এটি একটি নিরাপত্তা বৈশিষ্ট্য।", tlsWithoutCert: "অতিরিক্ত শংসাপত্র ছাড়াই TLS সক্ষম করুন৷", tlsRejectUnauthorized: "অননুমোদিত শংসাপত্র প্রত্যাখ্যান করুন", tlsSecure: "আপনি যদি একটি TLS কনফিগারেশন দেখতে পান যা একটি P3X দিয়ে শুরু হয় বা সমস্ত TLS সেটিংস একই রকম দেখায় তবে এটি একটি সুরক্ষিত বৈশিষ্ট্য৷ সেটিংস পরিবর্তন করতে, এই সেটিংসগুলিকে খালি বা অন্য কিছু দিয়ে প্রতিস্থ��পন করুন এবং সেগুলি সংরক্ষণ করা হবে। আপনি যদি TLS সেটিংস পরিবর্তন না করেন, সেটিংগুলি সার্ভারে থাকা অবস্থায় রাখা হবে৷", treeSeparatorEmpty: "গাছ বিভাজক খালি থাকলে, গাছের কোনো নেস্টেড নোড থাকবে না, শুধু একটি বিশুদ্ধ তালিকা", treeSeparatorEmptyNote: "কোনো ন���স্টেড নোড নেই, শুধু একটি বিশুদ্ধ তালিকা", welcomeConsole: "Redis কনসোলে স্বাগতম", welcomeConsoleInfo: "কার্সার UP বা ডাউন ইতিহাস সক্ষম করা হয়েছে", redisListIndexInfo: "যোগ করার জন্য খালি, -1 প্রিপেন্ড করতে বা দেখানো অবস্থানে সংরক্ষণ করতে।", console: "কনসোল", connectiondAdd: "সংযোগ যোগ করুন", connectiondEdit: "সংযোগ সম্পাদনা করুন", connectiondView: "সংযোগ দেখুন", connections: "সংযোগ", licenseInfo: "লাইসেন্স", licenseEditable: "লাইসেন্স সম্পাদনাযোগ্য", licenseEditableYes: "হ্যাঁ", licenseEditableNo: "না", licenseTerminalOnly: "লাইসেন্স শুধুমাত্র সার্ভার টার্মিনাল থেকে ���নফিগার করা যাবে.", licenseTierPolicyTitle: "স্তর নীতি", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "রাজ্য", licenseStateActive: "���ক্রিয়", licenseStateInactive: "নিষ্ক্রিয়", licenseStateNoLicense: "লাইসেন্স নেই", licenseKeyMasked: "সংরক্ষিত কী", licenseTier: "স্তর", licenseValid: "বৈধ", licenseStatus: "লাইসেন্সের অবস্থা", licenseReason: "কারণ", licenseCheckedAt: "চেক করা হয়েছে", licenseStartsAt: "এ শুরু হয়", licenseExpiresAt: "মেয়াদ শেষ হবে", licenseDaysLeft: "দিন বাকি", licenseMaxDevices: "সর্বোচ্চ ডিভাইস", licenseActiveDevices: "সক্রিয় ডিভাইস", licenseActiveDevicesInfo: "যদি একটি ডিভাইস আর ব্যবহার না করা হয়, তবে 75 মিনিটের পরে তার আসন স্বয়ংক্রিয়ভাবে ছেড়ে দেওয়া হয়।", licenseCustomerEmail: "গ্রাহক ইমেল", licenseFeatures: "বৈশিষ্ট্য", licenseFeaturesEmpty: "কোনো অতিরিক্ত বৈশিষ্ট্য নেই", licenseFeatureReadonlyMode: "শুধুমাত্র পাঠযোগ্য সংযোগ মোড", licenseFeatureReadonlyConnectionsFlag: "শুধুমাত্র পঠনযোগ্য সংযোগ (--readonly-connections/-r)", licenseFeatureSsh: "SSH টানেলিং", licenseFeatureCluster: "Cluster সংযোগ", licenseFeatureSentinel: "Sentinel সংযোগ", licenseFeatureReJSON: "ReJSON (JSON ডেটা টাইপ)", keysSort: { on: "কি বাছাই উপর", off: "কী বাছাই বন্ধ" }, cluster: { on: "Cluster চালু", off: "Cluster বন্ধ" }, sentinel: { on: "Sentinel চালু", off: "Sentinel বন্ধ", name: "Sentinel নাম" }, readonly: { on: "শুধুমাত্র পঠনযোগ্য", off: "শুধুমাত্র পঠন বন্ধ" }, proSshOnly: "SSH প্রো বা এন্টারপ্রাইজে উপলব্ধ।", proReadonlyOnly: "শুধুমাত্র পঠনযোগ্য সংযোগ মোড প্রো বা এন্টারপ্রাইজে উপলব্ধ।", enterpriseClusterSentinelOnly: "Cluster এবং Sentinel শুধুমাত্র এন্টারপ্রাইজে উপলব্ধ।", theme: { light: "আলো", dark: "অন্ধকার এন্টারপ্রাইজ", darkNeu: "অন্ধকার", darkoBluo: "ডার্কো ব্লু", enterprise: "এন্টারপ্রাইজ", redis: "Redis", matrix: "ম্যাট্রিক্স" }, connected: opts => { return `সংযুক্ত: ${opts.name}`; }, tree: "গাছ", askAuth: "অনুমোদনের জন্য জিজ্ঞাসা করুন", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "মডিউল", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "সংযোগ বিচ্ছিন্ন করুন", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis কমান্ড", ungrouped: "গ্রুপবিহীন", grouped: "Grouped", connectFirst: "প্রথমে একটি Redis সার্ভারে সংযোগ করুন", searchLanguage: "ভাষা অনুসন্ধান...", exportProgress: "কী রপ্তানি হচ্ছে...", importProgress: "কী আমদানি হচ্ছে...", importPreview: "পূর্বরূপ", importOverwrite: "ওভাররাইট", importSkip: "এড়িয়ে যান", importConflict: "কী ইতিমধ্যে বিদ্যমান থাকলে:", noKeysToExport: "রপ্তানির জন্য কোনো কী নেই", time: "সময়", loading: "লোড হচ্ছে...", autoRefresh: "স্বয়ংক্রিয়", exportSearchHint: "শুধুমাত্র বর্তমান অনুসন্ধানের সাথে মিলে যাওয়া কী রপ্তানি হচ্ছে", importSearchHint: "আমদানি সম্পূর্ণ ডাটাবেসে প্রযোজ্য, শুধু অনুসন্ধান ফলাফলে নয়", importNoKeys: "ফাইলে কোনো কী পাওয়া যায়নি", }, status: { dataCopied: "ডেটা ক্লিপবোর্ডে রয়েছে", licenseSaved: "লাইসেন্স সংরক্ষিত", exportDone: "রপ্তানি সম্পন্ন", indexCreated: "ইনডেক্স তৈরি হয়েছে", indexDropped: "ইনডেক্স মুছে ফেলা হয়েছে", importDone: (opts) => `আমদানি সম্পন্ন: ${opts.created} তৈরি, ${opts.skipped} এড়িয়ে গেছে, ${opts.errors} ত্রুটি`, nodeRemoved: "নোড সরানো হয়েছে", keyIsNotExisting: "এই কীটি মুছে ফেলা বা মেয়াদোত্তীর্ণ হতে পারে।", keyCount: opts => { if (opts.keyCount === 0) { return "কোন চাবি নেই"; } else if (opts.keyCount === 1) { return "1 কী"; } else { return `${opts.keyCount} চাবি`; } }, treeExpandAll: "সমস্ত গাছের পাতা প্রসারিত করুন। এই অপারেশন ব্যয়বহুল হতে পারে এবং সময় লাগতে পারে...", noRedisKeys: "এই ডাটাবেসে কোন কী নেই।", redisConnected: "Redis সফলভাবে সংযুক্ত হয়েছে৷", reloadingDataInfo: "Redis ডেটা তথ্য পুনরায় লোড করা হচ্ছে", added: "যোগ করা হয়েছে", saved: "আপডেট করা হয়েছে", cancelled: "বাতিল", deleted: "মুছে ফেলা হয়েছে", savedRedis: "Redis ডেটা সংরক্ষিত হয়", redisDisconnected: opts => { return `বর্তমান সংযোগে একটি ত্রুটি ছিল: ${opts.error.message}`; }, dbChanged: opts => { return `db সূচক সেট করা হয়েছে ${opts.db}. `; }, treeDeleted: opts => { return `গাছের কী মুছে ফেলা হয়েছে (${opts.key})`; }, deletedKey: opts => { return `কী মুছে ফেলা হয়েছে (${opts.key})`; }, renamedKey: "এই কীটির নাম পরিবর্তন করা হয়েছে", ttlChanged: "এই কীটির TTL পরিবর্তন করা হয়েছে৷", notInteger: "এই ���নপুট একটি পূর্ণসংখ্যা নয়", persisted: "এই কী চিরকাল স্থায়ী হয়", set: "কী সেট/যোগ করা হয়েছে" }, code: { "delete-connection": "এই সংযোগটি মুছে ফেলা হয়েছে, তাই আপনি এই Redis উদাহরণের সাথে সংযোগ বিচ্ছিন্ন করেছেন৷", "save-connection": "এই সংযোগটি পরিবর্তন করা হয়েছে, তাই আপনি এই Redis উদাহরণের সাথে সংযোগ বিচ্ছিন্ন করেছেন৷ আপনি আবার সংযোগ করতে পারেন.", "readonly-connections": "সংযোগ যোগ/সংরক্ষণ/মুছুন শুধুমাত্র পঠনযোগ্য!", "readonly-connection-mode": "এই সংযোগ শুধুমাত্র পঠন মোড!", "list-out-of-bounds": "এই তালিকা সূচক সীমার বাইরে", "donation-ware-feature": "এই বৈশিষ্ট্যটি অনুদান সংস্করণে উপস্থিত রয়েছে।", "feature-pro-readonly-required": "শুধুমাত্র পঠনযোগ্য সংযোগ মোডের জন্য প্রো বা এন্টারপ্রাইজ লাইসেন্স প্রয়োজন।", "feature-pro-ssh-required": "SSH টানেলিং প্রো বা এন্টারপ্রাইজ লাইসেন্স প্রয়োজন।", "feature-enterprise-cluster-sentinel-required": "Cluster এবং Sentinel এন্টারপ্রাইজ লাইসেন্স প্রয়োজন৷", "feature-pro-json-binary-required": "JSON সম্পাদনা করুন, বাইনারি আপলোড করুন এবং বাইনারি ডাউনলোড করুন প্রো বা এন্টারপ্রাইজ ল���ইসেন্স প্রয়োজন৷", "feature-pro-rejson-required": "ReJSON (JSON ডেটা টাইপ) প্রো বা এন্টারপ্রাইজ লাইসেন্স প্রয়োজন৷", "invalid-json-value": "মানটি বৈধ নয় JSON৷", "http_auth_required": "অনুমোদন প্রয়োজন: অনুগ্রহ করে HTTP Basic Auth দিয়ে প্রমাণীকরণ করুন এ��ং পুনরায় লোড করুন।", "auto-connection-failed": "সম্ভব, সংযোগ সরানো হয়েছে এবং স্বয়ংক্রিয় সংযোগ ব্যর্থ হয়েছে, এই কারণে।", invalid_console_command: "এই কমান্ডটি GUI এর মাধ্যমে কাজ করছে না।" }, licenseReason: { LICENSE_VALID: "লাইসেন্স বৈধ", LICENSE_INVALID: "লাইসেন্স অবৈধ", LICENSE_MISSING: "লাইসেন্স কী সেট করা নেই", LICENSE_DISABLED: "সার্ভার কনফিগারেশনে লাইসেন্স নিষ্ক্রিয় করা হয়েছে", LICENSE_NOT_FOUND: "লাইসেন্স পাওয়া যায়নি", LICENSE_EXPIRED: "লাইসেন্সের মেয়াদ শেষ", LICENSE_CLEARED: "লাইসেন্স কী সাফ করা হয়েছে", LICENSE_MAX_DEVICES_REACHED: "ডিভাইসের সর্বোচ্চ আসন পৌঁছেছে", PRODUCT_MISMATCH: "লাইসেন্স পণ্য মেলে না" }, licenseStatusValue: { active: "���ক্রিয়", deleted: "মুছে ফেলা হয়েছে", all: "সব", expired: "মেয়াদ শেষ", missing: "অনুপস্থিত", inactive: "নিষ্ক্রিয়" }, form: { error: { required: "প্রয়োজন", port: "বন্দরটি 1-65535 এর মধ্যে", invalid: "ফর্মটি অবৈধ৷" }, connection: { label: { name: "নাম", group: "Group", host: "হোস্টনাম", port: "বন্দর", password: "পাসওয়ার্ড", username: "ব্যবহারকারীর নাম" } }, treeSettings: { maxValueDisplay: "সর্বাধিক মান প্রদর্শন স্ট্রিং দৈর্ঘ্য", maxValueDisplayInfo: "0 তে সেট করা হলে, সম্পূর্ণ মান দেখান। 0-এর বেশি হলে, এই দৈর্ঘ্যে ছাঁটাই করুন। যদি -1: স্ট্রিংয়ের জন্য, সম্পাদনা না হওয়া পর্যন্ত মানটি লুকান; অন্যান্য ধরনের জন্য, সম্পূর্ণ বিষয়বস্তু দেখান।", maxKeys: "সর্বাধিক কী গণনা", maxKeysInfo: "যাতে GUI ক্র্যাশ না হয়, আমরা সর্বাধিক কী গণনা সীমিত করি।", keyCount: () => { return `কী সংখ্যা: ${p3xr.state.keysRaw.length}`; }, label: { animation: "অ্যানিমেশন ব্যবহার করুন", noAnimation: "অ্যানিমেশন নেই", jsonFormatTwoSpace: "2 স্পেস সহ JSON ফর্ম্যাট করুন", jsonFormatFourSpace: "4টি স্পেস সহ JSON ফরম্যাট করুন", formName: "Redis সেটিংস", searchModeClient: "ক্লায়েন্ট অনুসন্ধান মোড", searchModeServer: "সার্ভার অনুসন্ধান মোড", searchModeStartsWith: "মোড দিয়ে শুরু করে অনুসন্ধান করুন", searchModeIncludes: "অনুসন্ধান মোড অ���্তর্ভুক্ত" }, field: { treeSeparator: "গাছ বিভাজক", treeSeparatorSelector: "গাছ বিভাজক নির্বাচক", page: "ট্রি পেজিং গণনা", keyPageCount: "কী পেজিং গণনা", keysSort: "কীগুলি সাজান", searchMode: "অনুসন্ধান মোড", searchModeStartsWith: "অনুসন্ধান শুরু হয় / অন্তর্ভুক্ত করে" }, error: { keyPageCount: "মূল পৃষ্ঠার সংখ্যা অবশ্যই 5 - 100 এর মধ্যে একটি পূর্ণসংখ্যা হতে হবে", page: "পৃষ্ঠা সংখ্যা 10 - 5000 এর মধ্যে একটি পূর্ণসংখ্যা হতে হবে", maxValueDisplay: "সর্বোচ্চ প্রদর্শন মান অবশ্যই -1 এবং 32768 এর মধ্যে একটি পূর্ণসংখ্যা হতে হবে", maxKeys: "সর্বাধিক কী গণনা মান 100 এবং 100000 এর মধ্যে একটি পূর্ণসংখ্যা হতে হবে" } }, key: { label: { formName: { add: "নতুন Redis কী যোগ করুন", edit: "Redis কী সম্পাদনা করুন", append: "বিদ্যমান Redis কী যোগ করুন" } }, field: { streamTimestamp: "টাইমস্ট্যাম্প", key: "চাবি", type: "টাইপ", index: "সূচক", hashKey: "হ্যাশ কী", score: "স্কোর", value: "মান" }, error: { streamTimestamp: "টাইমস্ট্যাম্প প্রয়োজন, হয় Redis ফর্ম্যাট বা * হিসাবে", key: "মূল হল, অন্তত একটি অক্ষর", hashKey: "হ্যাশ টেবিল কী অন্তত একটি অক্ষর", score: "সাজানো সেট স্কোর প্রয়োজন", value: "মান প্রয়োজন" } }, main: { label: { database: "DB" } } }, page: { search: { title: "অনুসন্ধান", index: "ইনডেক্স", query: "কুয়েরি", results: "ফলাফল", noIndex: "কোনো ইনডেক্স পাওয়া যায়নি", createIndex: "ইনডেক্স তৈরি", dropIndex: "ইনডেক্স মুছুন", indexInfo: "ইনডেক্স তথ্য", indexName: "ইনডেক্স নাম", prefix: "কী প্রিফিক্স (ঐচ্ছিক)", fieldName: "ফিল্ডের নাম", }, monitor: { title: "মনিটরিং", memory: "মেমোরি", opsPerSec: "অপস/সেকেন্ড", clients: "ক্লায়েন্ট", blocked: "ব্লকড", hitsMisses: "হিট রেট", networkIo: "নেটওয়ার্ক I/O", slowLog: "স্লো লগ", totalCommands: "মোট", expired: "মেয়াদোত্তীর্ণ", evicted: "উচ্ছেদ", clientList: "ক্লায়েন্ট তালিকা", topKeys: "মেমোরি অনুযায়ী শীর্ষ কী", killClient: "ক্লায়েন্ট বন্ধ করুন", clientKilled: "ক্লায়েন্ট বন্ধ হয়েছে", confirmKillClient: "আপনি কি এই ক্লায়েন্ট বন্ধ করতে চান?", noKeys: "কোনো কী নেই", noClients: "কোনো ক্লায়েন্ট নেই", }, overview: { noConnected: "Redis এর সাথে কোন সংযোগ নেই।", overviewClients: "ক্লায়েন্ট গণনা দ্বারা সংযুক্ত তালিকা", connectedCount: opt => { if (opt.length === 1) { return "1 ক্লায়েন্ট"; } return `${opt.length} ক্লায়েন্ট`; } }, key: { label: { key: "চাবি", encoding: "এনকোডিং", length: "আকার", ttl: "TTL", ttlTitle: "টাইম টু লাইভ", type: "টাইপ", ttlNotExpire: "মেয়াদ শেষ হয় না", lengthString: "বাইট", lengthItem: "আইটেম", actions: "কর্ম" }, list: { table: { index: "সূচক", value: "মান" } }, hash: { table: { hashkey: "হ্যাশকি", value: "মান" } }, set: { table: { value: "সদস্য" } }, zset: { table: { value: "সদস্য", score: "স্কোর" } }, stream: { table: { timestamp: "টাইমস্ট্যাম্প আইডি", field: "মাঠ", value: "মান" } } }, treeControls: { settings: "গাছের সেটিংস", expandAll: "সব প্রসারিত", collapseAll: "সব সঙ্কুচিত করুন", search: { search: "কীগুলিতে অনুসন্ধান করুন", clear: "খালি সেট করতে বর্তমান অনুসন্ধান সাফ করুন", placeholderClient: "ক্লায়েন্ট সাইড অনুসন্ধান করুন", placeholderServer: "সার্ভার সাইড সার্চ করুন", info: "ক্লায়েন্ট সাইড সার্চ মানে, যে এটি সার্চ ইনপুটের লেখার সাথে মেলে। সার্ভার সাইড সার্চের মানে হল, এটি কী প্যাটার্নে *{search-text}* হিসাবে সার্চ করার মত। বড় সার্চ সেটের জন্য, সার্ভার সাইড সার্চিং ব্যবহার করা ভালো। ছোট অনুসন্ধান সেটের জন্য, ক্লায়েন্ট সাইড অনুসন্ধান মোড ব্যবহার করা ভাল।" + ` চাবি গণনা শেষ হলে ${p3xr.settings.maxLightKeysCount}, আপনি শুধুমাত্র সার্ভার সাইডে অনুসন্ধান করতে পারেন.`, largeSetInfo: "একটি বড় সেটে, ক্লায়েন্ট সাইড অনুসন্ধান অক্ষম করা হয়। তাই এই মুহূর্তে শুধুমাত্র সার্ভার সাইড সার্চ করা সম্ভব।", infoDetails: "অনুসন্ধান কিভাবে কাজ করে তা জানতে, অনুগ্রহ করে সেটিংস দেখুন" }, pager: { next: "পরবর্তী", prev: "আগের", first: "প্���থম", last: "শেষ" } } }, time: { loading: "লোড হচ্ছে...", years: "বছর", months: "মাস", days: "দিন", year: "বছর", month: "মাস", day: "দিন" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/bs/000077500000000000000000000000001517666434100137575ustar00rootroot00000000000000src/strings/bs/strings.js000066400000000000000000000671621517666434100160220ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licenca je obrisana", invalid_license: "Nevažeća licenca", license_max_devices_reached: "Dostignut maksimalan broj mjesta za uređaje", license_readonly: "Licenca se može promijeniti samo sa serverskog terminala.", server_error: "Greška servera, molimo pokušajte ponovo" }, title: { donate: "Doniraj", jsonRecursive: "Proširivanje svih listova", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Možete odabrati Redis konekciju iz donjeg lijevog menija.", statistics: "Statistika", error: "Greška", connectingRedis: "Povezivanje na Redis ...", socketioConnectError: "Socket.IO greška", db: "DB", server: "Server", clients: "Klijenti", memory: "Memorija", persistence: "Trajnost", stats: "Statistika", replication: "Replikacija", cpu: "CPU", cluster: "Klaster", modules: "Moduli", errorstats: "Statistike grešaka", commandstats: "Statistike naredbi", latencystats: "Statistike kašnjenja", keysizes: "Veličine ključeva", threads: "Niti", }, confirm: { dropIndex: "Jeste li sigurni da želite obrisati ovaj indeks?", uploadBuffer: "Jeste li sigurni da želite učitati ove binarne podatke?", uploadBufferDone: "Binarni podaci su učitani", uploadBufferDoneAndSave: "Binarni podaci su učitani i sačuvani na serveru", title: "Potvrdi", alert: "Upozorenje", info: "Informacija", deleteListItem: "Jeste li sigurni da želite obrisati ovu stavku liste?", deleteHashKey: "Jeste li sigurni da želite obrisati ovu hash ključ stavku?", deleteStreamTimestamp: "Jeste li sigurni da želite obrisati ovaj vremenski pečat streama?", deleteSetMember: "Jeste li sigurni da želite obrisati ovog člana skupa?", deleteZSetMember: "Jeste li sigurni da želite obrisati ovog člana sortiranog skupa?", deleteConnection: "Potvrdi", deleteConnectionText: "Jeste li sigurni da želite obrisati ovu Redis konekciju?", deleteNode: "Jeste li sigurni da želite obrisati ovaj Redis čvor?", deleteAllKeys: opts => { return `Obrisati ovo stablo i sve njegove ključeve (${opts.key})?`; }, socketioConnectError: "Socket.IO ne može se povezati sa serverom, možete ponovo učitati i pokušati riješiti grešku konekcije sami, klijent ne zna kako to riješiti sam.", socketioAuthRequired: "Socket.IO autorizacija je potrebna. Molimo autentificirajte se sa HTTP Basic Auth (korisničko ime/lozinka) i ponovo učitajte.", deleteKey: "Jeste li sigurni da želite obrisati ovaj ključ?", rename: { title: "Jeste li sigurni da želite preimenovati ovaj ključ?", textContent: "Ova radnja trajno preimenuje ključ.", placeholder: "Redis ključ (obavezno)" }, ttl: { title: "Jeste li sigurni da želite promijeniti TTL ovog ključa?", textContent: "Promjena TTL-a ažurira vrijeme života ovog ključa. Ostavite prazno da zadržite ovaj ključ zauvijek.", placeholder: "TTL Redis ključa (cijeli broj ili prazno)", placeholderPlaceholder: "Prazno znači da traje zauvijek; inače unesite cijeli broj.", convertTextToTime: "Pretvori tekst u vrijeme", convertTextToTimePlaceholder: "Npr. 1d će biti 86400" }, license: { title: "Postavi licencu", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20ac1/month) or 4,000 HUF/year (\u20ac10/year), and Enterprise 1,200 HUF/month (\u20ac3/month) or 12,000 HUF/year (\u20ac30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20ac1.27/month) or 5,100 HUF/year (\u20ac12.70/year), Enterprise 1,500 HUF/month (\u20ac3.81/month) or 15,200 HUF/year (\u20ac38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Ključ licence" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Bugarski / Bulgarian", cs: "Češki / Czech", de: "Njemački / German", el: "Grčki / Greek", en: "Engleski / English", es: "Španski / Spanish", fr: "Francuski / French", hu: "Mađarski / Hungarian", it: "Italijanski / Italian", ja: "Japanski / Japanese", nl: "Holandski / Dutch", pl: "Poljski / Polish", "pt-PT": "Portugalski / Portuguese", ro: "Rumunski / Romanian", ru: "Ruski / Russian", sk: "Slovački / Slovak", sr: "Srpski / Serbian", sv: "Švedski / Swedish", tr: "Turski / Turkish", uk: "Ukrajinski / Ukrainian", zn: "Kineski / Chinese", ar: "Arapski / Arabic", az: "Azerbejdžanski / Azerbaijani", be: "Bjeloruski / Belarusian", bn: "Bengalski / Bengali", da: "Danski / Danish", et: "Estonski / Estonian", fi: "Finski / Finnish", fil: "Filipinski / Filipino", he: "Hebrejski / Hebrew", hr: "Hrvatski / Croatian", hy: "Jermenski / Armenian", id: "Indonezijski / Indonesian", ka: "Gruzijski / Georgian", kk: "Kazaški / Kazakh", km: "Kmerski / Khmer", ko: "Korejski / Korean", ky: "Kirgiski / Kyrgyz", lt: "Litvanski / Lithuanian", mk: "Makedonski / Macedonian", ms: "Malajski / Malay", ne: "Nepalski / Nepali", no: "Norveški / Norwegian", "pt-BR": "Portugalski (Brazil) / Portuguese (Brazil)", sl: "Slovenački / Slovenian", tg: "Tadžički / Tajik", th: "Tajlandski / Thai", vi: "Vijetnamski / Vietnamese", "zh-HK": "Kineski (Hong Kong) / Chinese (Hong Kong)", "zh-TW": "Kineski (Tajvan) / Chinese (Taiwan)", sw: "Svahili / Swahili", si: "Sinhalski / Sinhala", ta: "Tamilski / Tamil", bs: "Bosanski / Bosnian" }, intention: { copy: "Kopiraj", downloadBuffer: "Preuzmi binarno", setBuffer: "Učitaj binarno", exportKeys: "Izvezi ključeve", exportAllKeys: (opts) => `Izvezi svih ${opts.count} ključeva`, exportSearchResults: (opts) => `Izvezi ${opts.count} rezultata`, importKeys: "Uvezi ključeve", saveWithFormatJson: "Sačuvaj sa formatom", formatJson: "Formatiraj Json", wrap: "Prelomi", unwrap: "Raspakuj", downloadJson: "Preuzmi JSON", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Jezik / Language", ok: "OK", addKey: "Dodaj u ovaj ključ", addKeyRoot: "Dodaj korijeni ključ", reloadKey: "Ponovo učitaj ključ", reload: "Ponovo učitaj", close: "Zatvori", commands: "Komande", view: "Pregled", statistics: "Statistika", refresh: "Osvježi", pause: "Pauza", resume: "Nastavi", clear: "Obriši", rename: "Preimenuj", main: "Baza podataka", cancel: "Otkaži", theme: "Tema", github: "GitHub", githubRepo: "Repozitorij", githubRelease: "Izdanja", githubChangelog: "Dnevnik promjena", info: "Info", settings: "Postavke", connect: "Poveži", disconnect: "Prekini vezu", overview: "Pregled", console: "Konzola", noConnections: "Nema konekcija, dodajte konekciju u meniju postavki.", noConnectionsInSettings: "Nema konekcija, možete dodati NOVU KONEKCIJU iznad.", connectionAdd: "Nova konekcija", addGroup: "Dodaj grupu", extend: "Proširi", collapse: "Skupi", add: "Dodaj", edit: "Uredi", save: "Sačuvaj", ttl: "Postavi TTL", license: "Postavi licencu", delete: "Obriši", remove: "Ukloni", sure: "Sigurno", testConnection: "Testiraj konekciju", getKey: "Učitavanje Redis ključa i povezanih podataka ...", jsonViewShow: "Prikaži JSON", jsonViewEditor: "Uredi JSON", quickConsole: "Brza konzola" }, label: { id: { nodeId: 'ID čvora', id: "ID konekcije", info: "Ako ne želite promijeniti svojstva: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, molimo unesite ID konekcije u ta svojstva kako biste zadržali vrijednosti svojstava. Ako želite istu logiku u lozinci čvora, unesite ID čvora u lozinku čvora." }, secureFeature: 'Ako vidite vrijednost koja počinje sa P3X i izgleda isto, to je sigurnosna funkcija. Da promijenite postavke, zamijenite ove postavke sa praznim ili nečim drugim i bit će sačuvane. Ako ne mijenjate postavke, postavke će ostati kakve jesu na serveru.', ssh: { on: 'SSH uključen', off: 'SSH isključen', sshHost: 'SSH host', sshPort: 'SSH port', sshUsername: 'SSH korisničko ime', sshPassword: 'SSH lozinka', sshPrivateKey: 'SSH privatni ključ' }, isBuffer: opts => `[object ArrayBuffer] znači da je vrijednost binarna ili da je vrijednost veća od ${opts.maxValueAsBuffer}`, streamValue: `Polje i vrijednost streama su u jednom redu. Npr.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' znači automatski generirano ili specifikacija kao -`, unableToLoadKey: ({ key }) => { return `Nije moguće učitati ovaj ključ: ${key}. Moguće je da je ključ obrisan. Tačna greška je u konzoli.`; }, bigJson: "Ovaj JSON objekat je preko 10 kb, pa provjerite da znate šta radite, jer neke funkcije mogu biti spore pri renderiranju.", addNode: "Dodaj čvor", validateJson: "Validiraj JSON", reducedFunction: `Smanjena funkcionalnost`, tooManyKeys: opts => { return `Za potpune maksimalne funkcije dozvoljeni ukupan broj ključeva je ${opts.maxLightKeysCount}. Ova baza podataka ima preko dozvoljenog ukupnog broja ključeva ${opts.count}. Sortiranje ključeva i dodatne informacije stabla su onemogućene. Pretraga se vrši samo na serveru umjesto na klijentu.`; }, redisCommandNotFound: "Nije pronađena odgovarajuća Redis komanda ...", treeKeyStore: `Sortiranje (prirodno poređenje) se izvršava na klijentu tj. pregledniku, što znači da ima kaznu za velike skupove, poput preko 10k ključeva, može dodati malo vremena renderiranju stranice. U Redisu nema sortiranja ključeva, samo ovako.`, socketIoTimeout: options => { return `Socket.IO je istekao za ovaj zahtjev (maks ${options.timeout / 1000} sekundi) ...`; }, resizerInfo: options => { return `Minimalna širina lijevog ili desnog panela je ${options.width}px`; }, jsonViewNotParsable: "Ova vrijednost se ne može parsirati kao JSON ", ttlTitle: "Postavi TTL u sekundama", passwordSecure: "Lozinka može biti prazna, ali će i dalje prikazivati znakove, ovo je sigurnosna funkcija.", tlsWithoutCert: "Omogući TLS bez dodatnog certifikata", tlsRejectUnauthorized: "Odbij neovlašteni certifikat", tlsSecure: "Ako vidite TLS konfiguraciju koja počinje sa P3X ili sve TLS postavke izgledaju isto, to je sigurnosna funkcija. Da promijenite postavke, zamijenite ove postavke sa praznim ili nečim drugim i bit će sačuvane. Ako ne mijenjate TLS postavke, postavke će ostati kakve jesu na serveru.", treeSeparatorEmpty: "Ako je separator stabla prazan, stablo neće imati ugniježđene čvorove, samo čistu listu", treeSeparatorEmptyNote: "Nema ugniježđenih čvorova, samo čista lista", welcomeConsole: "Dobrodošli u Redis konzolu", welcomeConsoleInfo: "Historija kursora GORE ili DOLJE je omogućena", redisListIndexInfo: "Prazno za dodavanje, -1 za dodavanje na početak ili sačuvaj na prikazanu poziciju.", console: "Konzola", connectiondAdd: "Dodaj konekciju", connectiondEdit: "Uredi konekciju", connectiondView: "Pregled konekcije", connections: "Konekcije", licenseInfo: "Licenca", licenseEditable: "Licenca se može uređivati", licenseEditableYes: "Da", licenseEditableNo: "Ne", licenseTerminalOnly: "Licenca se može konfigurisati samo sa serverskog terminala.", licenseTierPolicyTitle: "Politika nivoa", licenseTierPolicyText: "

Besplatno

samo osnovni Redis UI; bez SSH tuneliranja, bez načina rada samo za čitanje, bez Cluster/Sentinel, bez uređivanja JSON/učitavanja binarnog/preuzimanja binarnog, bez ReJSON.
Cijena: 0 HUF/mjesec (\u20ac0/mjesec).

Pro

SSH tuneliranje, način rada samo za čitanje (uključujući --readonly-connections/-r), uređivanje JSON, učitavanje binarnog, preuzimanje binarnog, ReJSON.
Osnovna cijena: 400 HUF/mjesec (\u20ac1/mjesec) ili 4.000 HUF/godišnje (\u20ac10/godišnje).
Ukupno sa 27% PDV-a: 500 HUF/mjesec (\u20ac1,27/mjesec) ili 5.100 HUF/godišnje (\u20ac12,70/godišnje).

Enterprise

SSH tuneliranje, Cluster i Sentinel, plus uređivanje JSON, učitavanje binarnog, preuzimanje binarnog, ReJSON; --readonly-connections/-r takođe radi.
Osnovna cijena: 1.200 HUF/mjesec (\u20ac3/mjesec) ili 12.000 HUF/godišnje (\u20ac30/godišnje).
Ukupno sa 27% PDV-a: 1.500 HUF/mjesec (\u20ac3,81/mjesec) ili 15.200 HUF/godišnje (\u20ac38,10/godišnje).

Godišnje pravilo

Godišnja cijena je 10x mjesečne cijene.

Mjesta

Podrazumijevana licenca uključuje 5 mjesta. Ako vam treba više mjesta, kontaktirajte nas na support@corifeus.com.

Enterprise probni period

10 dana besplatno za sve sa pravom postojećom email adresom (ne test email).

Informacije o naplati putem emaila

Ime, email za naplatu, kod zemlje, poštanski broj, grad, adresa, PDV ID (opciono).

Plaćanje

PayPal plaćanje dostupno samo u HUF (forint); nakon slanja novca @ https://paypal.me/corifeus poslat ću vam fakturu. Sva plaćanja su nepovratna.

PDV

PDV se dodaje na cijenu (27% u Mađarskoj).

Kontakt

Ako želite pozdraviti ili imate pitanje, kontaktirajte support@corifeus.com.

Jezik

Faktura i komunikacija putem emaila o licenci su na engleskom. Valuta fakture je HUF.

Napomena

Validacija licence zahtijeva pristup internetu.", licenseState: "Stanje", licenseStateActive: "Aktivna", licenseStateInactive: "Neaktivna", licenseStateNoLicense: "Nema licence", licenseKeyMasked: "Sačuvani ključ", licenseTier: "Nivo", licenseValid: "Važeća", licenseStatus: "Status licence", licenseReason: "Razlog", licenseCheckedAt: "Provjereno u", licenseStartsAt: "Počinje u", licenseExpiresAt: "Ističe u", licenseDaysLeft: "Preostalo dana", licenseMaxDevices: "Maksimalno uređaja", licenseActiveDevices: "Aktivni uređaji", licenseActiveDevicesInfo: "Ako se uređaj više ne koristi, njegovo mjesto se automatski oslobađa nakon 75 minuta.", licenseCustomerEmail: "Email korisnika", licenseFeatures: "Funkcije", licenseFeaturesEmpty: "Nema dodatnih funkcija", licenseFeatureReadonlyMode: "Način rada samo za čitanje", licenseFeatureReadonlyConnectionsFlag: "Konekcije samo za čitanje (--readonly-connections/-r)", licenseFeatureSsh: "SSH tuneliranje", licenseFeatureCluster: "Cluster konekcije", licenseFeatureSentinel: "Sentinel konekcije", licenseFeatureReJSON: "ReJSON (JSON tip podataka)", keysSort: { on: "Sortiranje ključeva uključeno", off: "Sortiranje ključeva isključeno" }, cluster: { on: "Cluster uključen", off: "Cluster isključen" }, sentinel: { on: "Sentinel uključen", off: "Sentinel isključen", name: "Sentinel ime" }, readonly: { on: "Samo za čitanje uključeno", off: "Samo za čitanje isključeno" }, proSshOnly: "SSH je dostupan u Pro ili Enterprise.", proReadonlyOnly: "Način rada samo za čitanje je dostupan u Pro ili Enterprise.", enterpriseClusterSentinelOnly: "Cluster i Sentinel su dostupni samo u Enterprise.", theme: { light: "Svijetla", dark: "Tamna enterprise", darkNeu: "Tamna", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Povezano: ${opts.name}`; }, tree: "Stablo", askAuth: "Zatraži autorizaciju", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduli", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Prekini vezu", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Naredbe", ungrouped: "Bez grupe", grouped: "Grouped", connectFirst: "Prvo se povežite na Redis server", searchLanguage: "Pretraži jezik...", exportProgress: "Izvoz ključeva...", importProgress: "Uvoz ključeva...", importPreview: "Pregled", importOverwrite: "Prepiši", importSkip: "Preskoči", importConflict: "Ako ključ već postoji:", noKeysToExport: "Nema ključeva za izvoz", time: "Vrijeme", loading: "Učitavanje...", autoRefresh: "Auto", exportSearchHint: "Izvoz samo ključeva koji odgovaraju trenutnom pretraživanju", importSearchHint: "Uvoz se primjenjuje na cijelu bazu podataka, ne samo na rezultate pretrage", importNoKeys: "Nisu pronađeni ključevi u datoteci", }, status: { dataCopied: "Podaci su u međuspremniku", licenseSaved: "Licenca je sačuvana", exportDone: "Izvoz završen", indexCreated: "Indeks kreiran", indexDropped: "Indeks obrisan", importDone: (opts) => `Uvoz završen: ${opts.created} kreirano, ${opts.skipped} preskočeno, ${opts.errors} grešaka`, nodeRemoved: "Čvor je uklonjen", keyIsNotExisting: "Ovaj ključ je mogao biti obrisan ili je istekao.", keyCount: opts => { if (opts.keyCount === 0) { return "Nema ključeva"; } else if (opts.keyCount === 1) { return "1 ključ"; } else { return `${opts.keyCount} ključeva`; } }, treeExpandAll: "Proširi sve listove stabla. Ova operacija može biti skupa i može potrajati ...", noRedisKeys: "Nema ključeva u ovoj bazi podataka.", redisConnected: "Redis uspješno povezan", reloadingDataInfo: "Ponovno učitavanje informacija o Redis podacima", added: "Dodano", saved: "Ažurirano", cancelled: "Otkazano", deleted: "Obrisano", savedRedis: "Redis podaci su sačuvani", redisDisconnected: opts => { return `Trenutna konekcija je imala grešku: ${opts.error.message}`; }, dbChanged: opts => { return `DB indeks je postavljen na ${opts.db}. `; }, treeDeleted: opts => { return `Ključ stabla je obrisan (${opts.key}).`; }, deletedKey: opts => { return `Ključ je obrisan (${opts.key}).`; }, renamedKey: "Ovaj ključ je preimenovan", ttlChanged: "TTL ovog ključa je promijenjen", notInteger: "Ovaj unos nije cijeli broj", persisted: "Ovaj ključ traje zauvijek", set: "Ključ je postavljen/dodan" }, code: { "delete-connection": "Ova konekcija je obrisana, pa ste odspojeni sa ove Redis instance.", "save-connection": "Ova konekcija je promijenjena, pa ste odspojeni sa ove Redis instance. Možete se ponovo povezati.", "readonly-connections": "Konekcije dodaj/sačuvaj/obriši su samo za čitanje!", "readonly-connection-mode": "Ova konekcija je u načinu rada samo za čitanje!", "list-out-of-bounds": "Ovaj indeks liste je izvan granica", "donation-ware-feature": "Ova funkcija je prisutna u verziji za donacije.", "feature-pro-readonly-required": "Način rada samo za čitanje zahtijeva Pro ili Enterprise licencu.", "feature-pro-ssh-required": "SSH tuneliranje zahtijeva Pro ili Enterprise licencu.", "feature-enterprise-cluster-sentinel-required": "Cluster i Sentinel zahtijevaju Enterprise licencu.", "feature-pro-json-binary-required": "Uređivanje JSON, učitavanje binarnog i preuzimanje binarnog zahtijevaju Pro ili Enterprise licencu.", "feature-pro-rejson-required": "ReJSON (JSON tip podataka) zahtijeva Pro ili Enterprise licencu.", "invalid-json-value": "Vrijednost nije validan JSON.", "http_auth_required": "Autorizacija je potrebna: molimo autentificirajte se sa HTTP Basic Auth i ponovo učitajte.", "auto-connection-failed": "Moguće je da je konekcija uklonjena i automatska konekcija je zbog toga neuspjela.", invalid_console_command: "Ova komanda ne radi putem GUI-ja." }, licenseReason: { LICENSE_VALID: "Licenca je važeća", LICENSE_INVALID: "Licenca je nevažeća", LICENSE_MISSING: "Ključ licence nije postavljen", LICENSE_DISABLED: "Licenca je onemogućena u konfiguraciji servera", LICENSE_NOT_FOUND: "Licenca nije pronađena", LICENSE_EXPIRED: "Licenca je istekla", LICENSE_CLEARED: "Ključ licence je obrisan", LICENSE_MAX_DEVICES_REACHED: "Dostignut maksimalan broj mjesta za uređaje", PRODUCT_MISMATCH: "Proizvod licence se ne podudara" }, licenseStatusValue: { active: "Aktivna", deleted: "Obrisana", all: "Sve", expired: "Istekla", missing: "Nedostaje", inactive: "Neaktivna" }, form: { error: { required: "Obavezno", port: "Port je između 1-65535", invalid: "Forma je nevažeća" }, connection: { label: { name: "Naziv", group: "Group", host: "Ime hosta", port: "Port", password: "Lozinka", username: "Korisničko ime" } }, treeSettings: { maxValueDisplay: "Maksimalna dužina prikaza vrijednosti", maxValueDisplayInfo: "Ako je postavljeno na 0, prikaži pune vrijednosti. Ako je veće od 0, skrati na ovu dužinu. Ako je -1: za stringove, sakrij vrijednost do uređivanja; za ostale tipove, prikaži puni sadržaj.", maxKeys: "Maksimalni broj ključeva", maxKeysInfo: "Da GUI ne padne, ograničavamo maksimalni broj ključeva.", keyCount: () => { return `Broj ključeva: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Koristi animaciju", noAnimation: "Bez animacije", jsonFormatTwoSpace: "Formatiraj JSON sa 2 razmaka", jsonFormatFourSpace: "Formatiraj JSON sa 4 razmaka", formName: "Redis postavke", searchModeClient: "Način pretrage na klijentu", searchModeServer: "Način pretrage na serveru", searchModeStartsWith: "Pretraga sa početkom", searchModeIncludes: "Pretraga sa uključivanjem" }, field: { treeSeparator: "Separator stabla", treeSeparatorSelector: "Selektor separatora stabla", page: "Broj stranica stabla", keyPageCount: "Broj stranica ključeva", keysSort: "Sortiraj ključeve", searchMode: "Način pretrage", searchModeStartsWith: "Pretraga počinje sa / uključuje" }, error: { keyPageCount: "Broj stranica ključeva mora biti cijeli broj između 5 - 100", page: "Broj stranica mora biti cijeli broj između 10 - 5000", maxValueDisplay: "Maksimalna vrijednost prikaza mora biti cijeli broj između -1 i 32768", maxKeys: "Maksimalna vrijednost broja ključeva mora biti cijeli broj između 100 i 100000" } }, key: { label: { formName: { add: "Dodaj novi Redis ključ", edit: "Uredi Redis ključ", append: "Dodaj u postojeći Redis ključ" } }, field: { streamTimestamp: "Vremenski pečat", key: "Ključ", type: "Tip", index: "Indeks", hashKey: "Hash ključ", score: "Rezultat", value: "Vrijednost" }, error: { streamTimestamp: "Vremenski pečat je obavezan, ili Redis format ili kao *", key: "Ključ mora imati barem jedan znak", hashKey: "Hash ključ mora imati barem jedan znak", score: "Rezultat sortiranog skupa je obavezan", value: "Vrijednost je obavezna" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Pretraga", index: "Indeks", query: "Upit", results: "Rezultati", noIndex: "Nisu pronađeni indeksi", createIndex: "Kreiraj indeks", dropIndex: "Obriši indeks", indexInfo: "Info o indeksu", indexName: "Naziv indeksa", prefix: "Prefiks ključa (opcionalno)", fieldName: "Naziv polja", }, monitor: { title: "Monitoring", memory: "Memorija", opsPerSec: "Operacija/sek", clients: "Klijenti", blocked: "Blokirani", hitsMisses: "Stopa pogodaka", networkIo: "Mrežni I/O", slowLog: "Spori log", totalCommands: "Ukupno", expired: "Isteklo", evicted: "Izbačeno", clientList: "Lista klijenata", topKeys: "Najveći ključevi po memoriji", killClient: "Ubij klijenta", clientKilled: "Klijent ubijen", confirmKillClient: "Jeste li sigurni da želite zaustaviti ovog klijenta?", noKeys: "Nema ključeva", noClients: "Nema klijenata", }, overview: { noConnected: "Nema konekcije na Redis.", overviewClients: "Listaj povezane po broju klijenata", connectedCount: opt => { if (opt.length === 1) { return "1 klijent"; } return `${opt.length} klijenata`; } }, key: { label: { key: "Ključ", encoding: "Kodiranje", length: "Veličina", ttl: "TTL", ttlTitle: "Vrijeme života", type: "Tip", ttlNotExpire: "ne ističe", lengthString: "bajtova", lengthItem: "stavki", actions: "Akcije" }, list: { table: { index: "Indeks", value: "Vrijednost" } }, hash: { table: { hashkey: "Hash ključ", value: "Vrijednost" } }, set: { table: { value: "Član" } }, zset: { table: { value: "Član", score: "Rezultat" } }, stream: { table: { timestamp: "ID vremenskog pečata", field: "Polje", value: "Vrijednost" } } }, treeControls: { settings: "Postavke stabla", expandAll: "Proširi sve", collapseAll: "Skupi sve", search: { search: "Pretraži ključeve", clear: "Obriši trenutnu pretragu za prazno", placeholderClient: "Pretraga na strani klijenta", placeholderServer: "Pretraga na strani servera", info: "Pretraga na strani klijenta znači da se podudara tekst u polju za pretragu. Pretraga na strani servera znači da pretražuje po obrascima ključeva kao *{search-text}*. Za velike skupove pretrage, bolje je koristiti pretragu na strani servera. Za manje skupove pretrage, bolje je koristiti način pretrage na strani klijenta." + ` Ako je broj ključeva preko ${p3xr.settings.maxLightKeysCount}, možete pretraživati samo na strani servera.`, largeSetInfo: "U velikom skupu, pretraga na strani klijenta je onemogućena. Trenutno je moguća samo pretraga na strani servera.", infoDetails: "Da saznate kako pretraga radi, molimo provjerite postavke" }, pager: { next: "Sljedeća", prev: "Prethodna", first: "Prva", last: "Zadnja" } } }, time: { loading: "Učitavanje...", years: "godina", months: "mjeseci", days: "dana", year: "godina", month: "mjesec", day: "dan" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/cs/000077500000000000000000000000001517666434100137605ustar00rootroot00000000000000src/strings/cs/strings.js000066400000000000000000000703271517666434100160200ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licence vymazána", invalid_license: "Neplatná licence", license_max_devices_reached: "Dosažen maximální počet zařízení", license_readonly: "Licenci lze změnit pouze ze serverového terminálu.", server_error: "Chyba serveru, zkuste to prosím znovu" }, title: { donate: "Přispět", jsonRecursive: "Rozbalení všech listů", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Můžete si vybrat Redis připojení z levého spodního menu.", statistics: "Statistiky", error: "Chyba", connectingRedis: "Připojování k Redis ...", socketioConnectError: "Chyba Socket.IO", db: "DB", server: "Server", clients: "Klienti", memory: "Paměť", persistence: "Perzistence", stats: "Statistiky", replication: "Replikace", cpu: "CPU", cluster: "Cluster", modules: "Moduly", errorstats: "Statistiky chyb", commandstats: "Statistiky příkazů", latencystats: "Statistiky latence", keysizes: "Velikosti klíčů", threads: "Vlákna", }, confirm: { dropIndex: "Opravdu chcete smazat tento index?", uploadBuffer: "Opravdu chcete nahrát tyto binární data?", uploadBufferDone: "Binární data byla nahrána", uploadBufferDoneAndSave: "Binární data byla nahrána a uložena na serveru", title: "Potvrzení", alert: "Upozornění", info: "Informace", deleteListItem: "Opravdu chcete smazat tuto položku seznamu?", deleteHashKey: "Opravdu chcete smazat tuto položku hash klíče?", deleteStreamTimestamp: "Opravdu chcete smazat tuto časovou značku streamu?", deleteSetMember: "Opravdu chcete smazat tohoto člena množiny?", deleteZSetMember: "Opravdu chcete smazat tohoto člena seřazené množiny?", deleteConnection: "Potvrzení", deleteConnectionText: "Opravdu chcete smazat toto Redis připojení?", deleteNode: "Opravdu chcete smazat tento Redis uzel?", deleteAllKeys: opts => { return `Smazat tento strom a všechny jeho klíče (${opts.key})?`; }, socketioConnectError: "Socket.IO se nemůže připojit k serveru, můžete stránku znovu načíst a pokusit se chybu připojení vyřešit sami, klient neví, jak ji vyřešit sám.", socketioAuthRequired: "Je vyžadována autorizace Socket.IO. Prosím ověřte se pomocí HTTP Basic Auth (uživatelské jméno/heslo) a znovu načtěte stránku.", deleteKey: "Opravdu chcete smazat tento klíč?", rename: { title: "Opravdu chcete přejmenovat tento klíč?", textContent: "Tato akce klíč trvale přejmenuje.", placeholder: "Redis klíč (povinný)" }, ttl: { title: "Opravdu chcete změnit TTL tohoto klíče?", textContent: "Změna TTL aktualizuje dobu životnosti tohoto klíče. Ponechte prázdné pro uchování klíče navždy.", placeholder: "TTL Redis klíče (celé číslo nebo prázdné)", placeholderPlaceholder: "Prázdné znamená, že se uchová navždy; jinak zadejte celé číslo.", convertTextToTime: "Převést text na čas", convertTextToTimePlaceholder: "Např. 1d bude 86400" }, license: { title: "Nastavit licenci", textContent: "Pokud chcete používat placené funkce, kontaktujte prosím support@corifeus.com a požádejte o licenci. Ceny jsou Pro 400 HUF/měsíc (€1/měsíc) nebo 4,000 HUF/rok (€10/rok) a Enterprise 1,200 HUF/měsíc (€3/měsíc) nebo 12,000 HUF/rok (€30/rok). Roční cena je 10x měsíční. S 27% DPH jsou celkové ceny Pro 500 HUF/měsíc (€1.27/měsíc) nebo 5,100 HUF/rok (€12.70/rok), Enterprise 1,500 HUF/měsíc (€3.81/měsíc) nebo 15,200 HUF/rok (€38.10/rok). Ověření licence vyžaduje přístup k internetu. Výchozí licence zahrnuje 5 míst. Pokud potřebujete více míst, kontaktujte nás na support@corifeus.com.", placeholder: "Licenční klíč" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopírovat", downloadBuffer: "Stáhnout binární soubor", setBuffer: "Nahrát binární soubor", exportKeys: "Exportovat klíče", exportAllKeys: (opts) => `Exportovat všech ${opts.count} klíčů`, exportSearchResults: (opts) => `Exportovat ${opts.count} výsledků`, importKeys: "Importovat klíče", saveWithFormatJson: "Uložit s formátováním", formatJson: "Formátovat Json", wrap: "Zalamovat", unwrap: "Nezalamovat", downloadJson: "Stáhnout JSON", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Jazyk / Language", ok: "OK", addKey: "Přidat k tomuto klíči", addKeyRoot: "Přidat kořenový klíč", reloadKey: "Znovu načíst klíč", reload: "Znovu načíst", close: "Zavřít", commands: "Příkazy", view: "Zobrazení", statistics: "Statistiky", refresh: "Obnovit", pause: "Pozastavit", resume: "Pokračovat", clear: "Vymazat", rename: "Přejmenovat", main: "Databáze", cancel: "Zrušit", theme: "Motiv", github: "GitHub", githubRepo: "Repozitář", githubRelease: "Vydání", githubChangelog: "Seznam změn", info: "Info", settings: "Nastavení", connect: "Připojit", disconnect: "Odpojit", overview: "Přehled", console: "Konzole", noConnections: "Žádná připojení, přidejte připojení v menu nastavení.", noConnectionsInSettings: "Žádná připojení, můžete přidat NOVÉ PŘIPOJENÍ výše.", connectionAdd: "Nové připojení", addGroup: "Přidat skupinu", extend: "Rozbalit", collapse: "Sbalit", add: "Přidat", edit: "Upravit", save: "Uložit", ttl: "Nastavit TTL", license: "Nastavit licenci", delete: "Smazat", remove: "Odebrat", sure: "Jistě", testConnection: "Otestovat připojení", getKey: "Načítání Redis klíče a přidružených dat ...", jsonViewShow: "Zobrazit JSON", jsonViewEditor: "Upravit JSON", quickConsole: "Rychlá konzole" }, label: { id: { nodeId: 'ID uzlu', id: "ID připojení", info: "Pokud nechcete měnit vlastnosti: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, zadejte prosím ID připojení do těchto vlastností, aby se hodnoty zachovaly. Pokud chcete stejnou logiku pro heslo uzlu, zadejte ID uzlu do hesla uzlu." }, secureFeature: 'Pokud vidíte hodnotu, která začíná na P3X a vypadá stejně, jedná se o bezpečnostní funkci. Chcete-li změnit nastavení, jednoduše nahraďte tato nastavení prázdnými nebo něčím jiným a budou uložena. Pokud nastavení nezměníte, zůstanou zachována tak, jak jsou na serveru.', ssh: { on: 'SSH zapnuto', off: 'SSH vypnuto', sshHost: 'SSH Hostitel', sshPort: 'SSH Port', sshUsername: 'SSH Uživatelské jméno', sshPassword: 'SSH Heslo', sshPrivateKey: 'SSH Soukromý klíč' }, isBuffer: opts => `[object ArrayBuffer] znamená, že hodnota jsou binární data nebo je hodnota větší než ${opts.maxValueAsBuffer}`, streamValue: `Pole a hodnota streamu jsou na jednom řádku. Např.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' znamená automatické generování nebo specifikace jako -`, unableToLoadKey: ({ key }) => { return `Nelze načíst tento klíč: ${key}. Je možné, že klíč byl smazán. Přesná chyba je v konzoli.`; }, bigJson: "Tento JSON objekt má více než 10 kb, ujistěte se, že víte, co děláte, protože některé funkce mohou být pomalé při vykreslování.", addNode: "Přidat uzel", validateJson: "Ověřit JSON", reducedFunction: `Omezená funkčnost`, tooManyKeys: opts => { return `Pro plné maximální funkce je povolený celkový počet klíčů ${opts.maxLightKeysCount}. Tato databáze má více než povolený celkový počet klíčů ${opts.count}. Řazení klíčů a dodatečné informace o stromě jsou vypnuty. Vyhledávání probíhá pouze na serveru místo na klientovi.`; }, redisCommandNotFound: "Nebyl nalezen žádný odpovídající Redis příkaz ...", treeKeyStore: `Řazení (přirozené porovnávání) se provádí na klientovi, tedy v prohlížeči, což znamená, že pro velké sady dat, jako je více než 10 tisíc klíčů, může přidat trochu času k vykreslení stránky. V Redis neexistuje řazení klíčů, pouze tímto způsobem.`, socketIoTimeout: options => { return `Socket.IO vypršel pro tento požadavek (max ${options.timeout / 1000} sekund) ...`; }, resizerInfo: options => { return `Minimální šířka levého nebo pravého panelu je ${options.width}px`; }, jsonViewNotParsable: "Tuto hodnotu nelze parsovat jako JSON ", ttlTitle: "Nastavte TTL v sekundách", passwordSecure: "Heslo může být prázdné, ale přesto bude zobrazovat znaky, to je bezpečnostní funkce.", tlsWithoutCert: "Povolit TLS bez dalšího certifikátu", tlsRejectUnauthorized: "Odmítnout neautorizovaný certifikát", tlsSecure: "Pokud vidíte konfiguraci TLS, která začíná na P3X nebo všechna nastavení TLS vypadají stejně, jedná se o bezpečnostní funkci. Chcete-li změnit nastavení, jednoduše je nahraďte prázdnými nebo něčím jiným a budou uložena. Pokud nastavení TLS nezměníte, zůstanou zachována tak, jak jsou na serveru.", treeSeparatorEmpty: "Pokud je oddělovač stromě prázdný, strom nebude mít vnořené uzly, pouze prostý seznam", treeSeparatorEmptyNote: "Žádné vnořené uzly, pouze prostý seznam", welcomeConsole: "Vítejte v Redis Konzoli", welcomeConsoleInfo: "Historie s kurzorem NAHORU nebo DOLŮ je povolena", redisListIndexInfo: "Prázdné pro připojení na konec, -1 pro vložení na začátek nebo uložte na zobrazenou pozici.", console: "Konzole", connectiondAdd: "Přidat připojení", connectiondEdit: "Upravit připojení", connectiondView: "Zobrazit připojení", connections: "Připojení", licenseInfo: "Licence", licenseEditable: "Licence upravitelná", licenseEditableYes: "Ano", licenseEditableNo: "Ne", licenseTerminalOnly: "Licenci lze konfigurovat pouze ze serverového terminálu.", licenseTierPolicyTitle: "Cenová politika", licenseTierPolicyText: "

Zdarma

Pouze základní Redis UI; bez SSH tunelování, bez režimu Readonly připojení, bez Cluster/Sentinel, bez Úpravy JSON/Nahrání binárních souborů/Stažení binárních souborů, bez ReJSON.
Cena: 0 HUF/měsíc (€0/měsíc).

Pro

SSH tunelování, režim Readonly připojení (včetně --readonly-connections/-r), Úprava JSON, Nahrání binárních souborů, Stažení binárních souborů, ReJSON.
Základní cena: 400 HUF/měsíc (€1/měsíc) nebo 4,000 HUF/rok (€10/rok).
Celkem s 27% DPH: 500 HUF/měsíc (€1.27/měsíc) nebo 5,100 HUF/rok (€12.70/rok).

Enterprise

SSH tunelování, Cluster a Sentinel, plus Úprava JSON, Nahrání binárních souborů, Stažení binárních souborů, ReJSON; --readonly-connections/-r také funguje.
Základní cena: 1,200 HUF/měsíc (€3/měsíc) nebo 12,000 HUF/rok (€30/rok).
Celkem s 27% DPH: 1,500 HUF/měsíc (€3.81/měsíc) nebo 15,200 HUF/rok (€38.10/rok).

Roční pravidlo

Roční cena je 10x měsíční cena.

Místa

Výchozí licence zahrnuje 5 míst. Pokud potřebujete více míst, kontaktujte nás na support@corifeus.com.

Enterprise zkušební verze

10 dní zdarma pro každého se skutečnou existující e-mailovou adresou (ne testovací e-mail).

Fakturační údaje e-mailem

Jméno, Fakturační e-mail, Kód země, PSČ, Město, Adresa, DIČ (volitelné).

Platba

PayPal platba je k dispozici pouze v HUF (forinty); po odeslání peněz @ https://paypal.me/corifeus vám zašlu fakturu. Všechny platby jsou nevratné.

DPH

K ceně se přidává DPH (27% v Maďarsku).

Kontakt

Pokud se chcete pozdravit nebo máte dotaz, kontaktujte support@corifeus.com.

Jazyk

Faktura a licenční e-mailová komunikace je v angličtině. Měna faktury je HUF.

Poznámka

Ověření licence vyžaduje přístup k internetu.", licenseState: "Stav", licenseStateActive: "Aktivní", licenseStateInactive: "Neaktivní", licenseStateNoLicense: "Žádná licence", licenseKeyMasked: "Uložený klíč", licenseTier: "Úroveň", licenseValid: "Platná", licenseStatus: "Stav licence", licenseReason: "Důvod", licenseCheckedAt: "Zkontrolováno", licenseStartsAt: "Začíná", licenseExpiresAt: "Vyprší", licenseDaysLeft: "Zbývající dny", licenseMaxDevices: "Maximální počet zařízení", licenseActiveDevices: "Aktivní zařízení", licenseActiveDevicesInfo: "Pokud se zařízení již nepoužívá, jeho místo se automaticky uvolní po 75 minutách.", licenseCustomerEmail: "E-mail zákazníka", licenseFeatures: "Funkce", licenseFeaturesEmpty: "Žádné další funkce", licenseFeatureReadonlyMode: "Režim Readonly připojení", licenseFeatureReadonlyConnectionsFlag: "Readonly připojení (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunelování", licenseFeatureCluster: "Cluster připojení", licenseFeatureSentinel: "Sentinel připojení", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Řazení klíčů zapnuto", off: "Řazení klíčů vypnuto" }, cluster: { on: "Cluster zapnut", off: "Cluster vypnut" }, sentinel: { on: "Sentinel zapnut", off: "Sentinel vypnut", name: "Sentinel název" }, readonly: { on: "Readonly zapnuto", off: "Readonly vypnuto" }, proSshOnly: "SSH je dostupné v Pro nebo Enterprise.", proReadonlyOnly: "Režim Readonly připojení je dostupný v Pro nebo Enterprise.", enterpriseClusterSentinelOnly: "Cluster a Sentinel jsou dostupné pouze v Enterprise.", theme: { light: "Světlý", dark: "Tmavý enterprise", darkNeu: "Tmavý", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Připojeno: ${opts.name}`; }, tree: "Strom", askAuth: "Žádost o autorizaci", keyboardShortcuts: "Klávesové zkratky", about: "O aplikaci", supportedLanguages: "Podporované jazyky", version: "Verze", redisVersion: "Verze Redis", modules: "Moduly", shortcutRefresh: "Obnovit", shortcutSearch: "Zaměřit vyhledávání", shortcutNewKey: "Nový klíč", shortcutDisconnect: "Odpojit", themeAuto: "Automaticky (systém)", shortcutCommandPalette: "Paleta příkazů", commandPalette: "Paleta příkazů", noResults: "Žádné výsledky", redisCommandsReference: "Redis Příkazy", ungrouped: "Bez skupiny", grouped: "Seskupené", connectFirst: "Nejprve se připojte k serveru Redis", searchLanguage: "Hledat jazyk...", exportProgress: "Exportování klíčů...", importProgress: "Importování klíčů...", importPreview: "Náhled", importOverwrite: "Přepsat", importSkip: "Přeskočit", importConflict: "Pokud klíč již existuje:", noKeysToExport: "Žádné klíče k exportu", time: "Čas", loading: "Načítání...", autoRefresh: "Auto", exportSearchHint: "Exportují se pouze klíče odpovídající aktuálnímu vyhledávání", importSearchHint: "Import se vztahuje na celou databázi, nejen na výsledky vyhledávání", importNoKeys: "V souboru nebyly nalezeny žádné klíče", }, status: { dataCopied: "Data jsou ve schránce", licenseSaved: "Licence uložena", exportDone: "Export dokončen", indexCreated: "Index vytvořen", indexDropped: "Index smazán", importDone: (opts) => `Import dokončen: ${opts.created} vytvořeno, ${opts.skipped} přeskočeno, ${opts.errors} chyb`, nodeRemoved: "Uzel odstraněn", keyIsNotExisting: "Tento klíč mohl být smazán nebo vypršel.", keyCount: opts => { if (opts.keyCount === 0) { return "Žádný klíč"; } else if (opts.keyCount === 1) { return "1 klíč"; } else { return `${opts.keyCount} klíčů`; } }, treeExpandAll: "Rozbalit všechny listy stromě. Tato operace může být náročná a zabrat čas ...", noRedisKeys: "V této databázi nejsou žádné klíče.", redisConnected: "Redis úspěšně připojen", reloadingDataInfo: "Znovu načítání informací o Redis datech", added: "Přidáno", saved: "Aktualizováno", cancelled: "Zrušeno", deleted: "Smazáno", savedRedis: "Redis data jsou uložena", redisDisconnected: opts => { return `Aktuální připojení mělo chybu: ${opts.error.message}`; }, dbChanged: opts => { return `Index DB nastaven na ${opts.db}. `; }, treeDeleted: opts => { return `Klíč stromě byl smazán (${opts.key}).`; }, deletedKey: opts => { return `Klíč byl smazán (${opts.key}).`; }, renamedKey: "Tento klíč byl přejmenován", ttlChanged: "TTL tohoto klíče bylo změněno", notInteger: "Tento vstup není celé číslo", persisted: "Tento klíč je uchován navždy", set: "Klíč je nastaven/přidán" }, code: { "delete-connection": "Toto připojení bylo smazáno, proto jste odpojeni od této Redis instance.", "save-connection": "Toto připojení bylo změněno, proto jste odpojeni od této Redis instance. Můžete se znovu připojit.", "readonly-connections": "Přidání/uložení/smazání připojení je pouze pro čtení!", "readonly-connection-mode": "Toto připojení je v režimu pouze pro čtení!", "list-out-of-bounds": "Index seznamu je mimo rozsah", "donation-ware-feature": "Tato funkce je dostupná v placené verzi.", "feature-pro-readonly-required": "Režim Readonly připojení vyžaduje licenci Pro nebo Enterprise.", "feature-pro-ssh-required": "SSH tunelování vyžaduje licenci Pro nebo Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster a Sentinel vyžadují licenci Enterprise.", "feature-pro-json-binary-required": "Úprava JSON, Nahrání binárních souborů a Stažení binárních souborů vyžadují licenci Pro nebo Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Je vyžadována autorizace: prosím ověřte se pomocí HTTP Basic Auth a znovu načtěte stránku.", "auto-connection-failed": "Je možné, že připojení bylo odstraněno a automatické připojení selhalo kvůli tomu.", invalid_console_command: "Tento příkaz nefunguje přes GUI." }, licenseReason: { LICENSE_VALID: "Licence je platná", LICENSE_INVALID: "Licence je neplatná", LICENSE_MISSING: "Licenční klíč není nastaven", LICENSE_DISABLED: "Licence je zakázána v konfiguraci serveru", LICENSE_NOT_FOUND: "Licence nebyla nalezena", LICENSE_EXPIRED: "Licence vypršela", LICENSE_CLEARED: "Licenční klíč byl vymazán", LICENSE_MAX_DEVICES_REACHED: "Dosažen maximální počet zařízení", PRODUCT_MISMATCH: "Produkt licence neodpovídá" }, licenseStatusValue: { active: "Aktivní", deleted: "Smazaná", all: "Vše", expired: "Vypršelá", missing: "Chybí", inactive: "Neaktivní" }, form: { error: { required: "Povinné", port: "Port je mezi 1-65535", invalid: "Formulář je neplatný" }, connection: { label: { name: "Název", group: "Skupina", host: "Hostitel", port: "Port", password: "Heslo", username: "Uživatelské jméno" } }, treeSettings: { maxValueDisplay: "Maximální délka zobrazovaného textu", maxValueDisplayInfo: "Pokud je nastaveno na 0, zobrazí úplné hodnoty. Pokud je větší než 0, zkrátí na tuto délku. Pokud je -1: pro řetězce skryje hodnotu do úpravy; pro ostatní typy zobrazí úplný obsah.", maxKeys: "Maximální počet klíčů", maxKeysInfo: "Aby GUI nespadlo, omezujeme maximální počet klíčů.", keyCount: () => { return `Počet klíčů: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Použít animaci", noAnimation: "Bez animace", jsonFormatTwoSpace: "Formátovat JSON se 2 mezerami", jsonFormatFourSpace: "Formátovat JSON se 4 mezerami", formName: "Redis nastavení", searchModeClient: "Režim vyhledávání na klientovi", searchModeServer: "Režim vyhledávání na serveru", searchModeStartsWith: "Vyhledávání v režimu 'začíná na'", searchModeIncludes: "Režim vyhledávání 'obsahuje'" }, field: { treeSeparator: "Oddělovač stromě", treeSeparatorSelector: "Selektor oddělovače stromě", page: "Počet stránek stromě", keyPageCount: "Počet klíčů na stránku", keysSort: "Seřadit klíče", searchMode: "Režim vyhledávání", searchModeStartsWith: "Vyhledávání 'začíná na' / 'obsahuje'" }, error: { keyPageCount: "Počet klíčů na stránku musí být celé číslo mezi 5 - 100", page: "Počet stránek musí být celé číslo mezi 10 - 5000", maxValueDisplay: "Maximální zobrazovaná hodnota musí být celé číslo mezi -1 a 32768", maxKeys: "Maximální počet klíčů musí být celé číslo mezi 100 a 100000" } }, key: { label: { formName: { add: "Přidat nový Redis klíč", edit: "Upravit Redis klíč", append: "Přidat k existujícímu Redis klíči" } }, field: { streamTimestamp: "Časová značka", key: "Klíč", type: "Typ", index: "Index", hashKey: "Hash klíč", score: "Skóre", value: "Hodnota" }, error: { streamTimestamp: "Časová značka je povinná, buď ve formátu Redis nebo jako *", key: "Klíč musí mít alespoň jeden znak", hashKey: "Hash klíč musí mít alespoň jeden znak", score: "Skóre seřazené množiny je povinné", value: "Hodnota je povinná" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Hledat", index: "Index", query: "Dotaz", results: "Výsledky", noIndex: "Žádné indexy", createIndex: "Vytvořit index", dropIndex: "Smazat index", indexInfo: "Info o indexu", indexName: "Název indexu", prefix: "Prefix klíče (volitelné)", fieldName: "Název pole", }, monitor: { title: "Monitorování", memory: "Paměť", opsPerSec: "Operací/s", clients: "Klienti", blocked: "Blokováno", hitsMisses: "Úspěšnost", networkIo: "Síťový I/O", slowLog: "Pomalý log", totalCommands: "Celkem", expired: "Vypršelo", evicted: "Vyřazeno", clientList: "Seznam klientů", topKeys: "Největší klíče podle paměti", killClient: "Zabít klienta", clientKilled: "Klient zabit", confirmKillClient: "Opravdu chcete ukončit tohoto klienta?", noKeys: "Žádné klíče", noClients: "Žádní klienti", }, overview: { noConnected: "Není připojení k Redis.", overviewClients: "Seznam připojených podle počtu klientů", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klientů`; } }, key: { label: { key: "Klíč", encoding: "Kódování", length: "Velikost", ttl: "TTL", ttlTitle: "Doba životnosti", type: "Typ", ttlNotExpire: "nevyprší", lengthString: "bajtů", lengthItem: "položek", actions: "Akce" }, list: { table: { index: "Index", value: "Hodnota" } }, hash: { table: { hashkey: "Hash klíč", value: "Hodnota" } }, set: { table: { value: "Člen" } }, zset: { table: { value: "Člen", score: "Skóre" } }, stream: { table: { timestamp: "ID časové značky", field: "Pole", value: "Hodnota" } } }, treeControls: { settings: "Nastavení stromě", expandAll: "Rozbalit vše", collapseAll: "Sbalit vše", search: { search: "Hledat v klíčích", clear: "Vymazat aktuální vyhledávání", placeholderClient: "Hledat na straně klienta", placeholderServer: "Hledat na straně serveru", info: "Hledání na straně klienta znamená, že odpovídá textu ve vyhledávacím poli. Hledání na straně serveru znamená, že vyhledává ve vzorcích klíčů jako *{hledaný-text}*. Pro velké sady dat je lepší použít vyhledávání na straně serveru. Pro menší sady dat je lepší použít režim vyhledávání na straně klienta." + ` Pokud je počet klíčů nad ${p3xr.settings.maxLightKeysCount}, můžete vyhledávat pouze na straně serveru.`, largeSetInfo: "Ve velké sadě dat je vyhledávání na straně klienta zakázáno, takže v tuto chvíli je možné pouze vyhledávání na straně serveru.", infoDetails: "Chcete-li zjistit, jak vyhledávání funguje, podívejte se do nastavení" }, pager: { next: "Další", prev: "Předchozí", first: "První", last: "Poslední" } } }, time: { loading: "Načítání...", years: "let", months: "měsíců", days: "dní", year: "rok", month: "měsíc", day: "den" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/da/000077500000000000000000000000001517666434100137375ustar00rootroot00000000000000src/strings/da/strings.js000066400000000000000000000663741517666434100160060ustar00rootroot00000000000000const strings = { error: { cleared_license: "Godkendt licens", invalid_license: "Ugyldig licens", license_max_devices_reached: "Det maksimale antal enhedspladser er nået", license_readonly: "Licens kan kun ændres fra serverterminalen.", server_error: "Serverfejl, prøv venligst igen" }, title: { donate: "Doner", jsonRecursive: "Udvidelse af alle blade", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Du kan vælge en Redis-forbindelse til at forbinde fra den nederste venstre menu.", statistics: "Statistik", error: "Fejl", connectingRedis: "Opretter forbindelse til Redis ...", socketioConnectError: "Socket.IO fejl", db: "DB", server: "Server", clients: "Kunder", memory: "Hukommelse", persistence: "Vedholdenhed", stats: "Statistik", replication: "Replikation", cpu: "CPU", cluster: "Cluster", modules: "Moduler", errorstats: "Fejlstatistik", commandstats: "Kommandostatistik", latencystats: "Latensstatistik", keysizes: "Nøglestørrelser", threads: "Tråde", }, confirm: { dropIndex: "Er du sikker på at du vil slette dette index?", uploadBuffer: "Er du sikker på at uploade disse binære data?", uploadBufferDone: "De binære data uploades", uploadBufferDoneAndSave: "De binære data uploades og gemmes på serveren", title: "Bekræft", alert: "Advarsel", info: "Info", deleteListItem: "Er du sikker på at slette dette listeelement?", deleteHashKey: "Er du sikker på at slette dette hash-nøgleelement?", deleteStreamTimestamp: "Er du sikker på at slette dette streamtidsstempel?", deleteSetMember: "Er du sikker på at slette dette sætmedlem?", deleteZSetMember: "Er du sikker på at slette dette sorterede sætmedlem?", deleteConnection: "Bekræft", deleteConnectionText: "Er du sikker på at slette denne Redis-forbindelse?", deleteNode: "Er du sikker på at slette denne Redis node?", deleteAllKeys: opts => { return `Slet dette træ og alle dets nøgler (${opts.key})?`; }, socketioConnectError: "Socket.IO kan ikke oprette forbindelse til serveren, du kan genindlæse og prøve at løse forbindelsesfejlen selv, klienten ved ikke, hvordan den selv skal løse det.", socketioAuthRequired: "Socket.IO-autorisation er påkrævet. Godkend venligst med HTTP Basic Auth (brugernavn/adgangskode) og genindlæs.", deleteKey: "Er du sikker på at du vil slette denne nøgle?", rename: { title: "Er du sikker på at omdøbe denne nøgle?", textContent: "Denne handling omdøber nøglen permanent.", placeholder: "Redis-nøglen (påkrævet)" }, ttl: { title: "Er du sikker på, at du vil ændre denne nøgles TTL?", textContent: "Ændring af TTL opdaterer denne nøgles time to live. Lad være tom for at beholde denne nøgle for evigt.", placeholder: "Redis-nøglens TTL (heltal eller tom)", placeholderPlaceholder: "Tom betyder, at den består for evigt; ellers skal du indtaste et heltal.", convertTextToTime: "Konverter tekst til tid", convertTextToTimePlaceholder: "F.eks. 1d vil være 86400" }, license: { title: "Indstil licens", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Licensnøgle" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiér", downloadBuffer: "Download binær", setBuffer: "Upload binær", exportKeys: "Eksportér nøgler", exportAllKeys: (opts) => `Eksportér alle ${opts.count} nøgler`, exportSearchResults: (opts) => `Eksportér ${opts.count} resultater`, importKeys: "Importér nøgler", saveWithFormatJson: "Gem med format", formatJson: "Formater Json", wrap: "Indpakning", unwrap: "Pak ud", downloadJson: "Download JSON", pubsubMonitor: "PubSub skærm", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Sprog", ok: "OK", addKey: "Tilføj til denne nøgle", addKeyRoot: "Tilføj en rodnøgle", reloadKey: "Genindlæs nøgle", reload: "Genindlæs", close: "Luk", commands: "Kommandoer", view: "Visning", statistics: "Statistik", refresh: "Opdater", pause: "Pause", resume: "Genoptag", clear: "Klar", rename: "Omdøb", main: "Database", cancel: "Annuller", theme: "Tema", github: "GitHub", githubRepo: "Depot", githubRelease: "Udgivelser", githubChangelog: "Ændringslog", info: "Info", settings: "Indstillinger", connect: "Forbind", disconnect: "Afbryd forbindelsen", overview: "Oversigt", console: "Konsol", noConnections: "Ingen forbindelser, tilføj en forbindelse i indstillingsmenuen.", noConnectionsInSettings: "Ingen forbindelser, du kan tilføje en NY FORBINDELSE ovenfor.", connectionAdd: "Ny forbindelse", addGroup: "Tilføj gruppe", extend: "Forlæng", collapse: "Kollaps", add: "Tilføj", edit: "Rediger", save: "Gem", ttl: "Indstil TTL", license: "Indstil licens", delete: "Slet", remove: "Fjern", sure: "Selvfølgelig", testConnection: "Test forbindelse", getKey: "Indlæser Redis nøgle og tilhørende data ...", jsonViewShow: "Vis JSON", jsonViewEditor: "Rediger JSON", quickConsole: "Hurtig konsol", }, label: { id: { nodeId: "Node ID", id: "Forbindelses-id", info: "Hvis du ikke ønsker at ændre egenskaberne for: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, skal du indtaste forbindelsens ID i disse egenskaber for at holde egenskabsværdierne intakte. Hvis du ønsker den samme logik i node-adgangskoden, skal du indtaste node-id'et i node-adgangskoden." }, secureFeature: "Hvis du ser en værdi, der starter med en P3X og ligner den samme, er det en sikker funktion. For at ændre indstillingerne skal du bare erstatte disse indstillinger med tomme eller noget andet, og de vil blive gemt. Hvis du ikke ændrer indstillingerne, bevares indstillingerne, som de er på serveren.", ssh: { on: "SSH tændt", off: "SSH slukket", sshHost: "SSH vært", sshPort: "SSH port", sshUsername: "SSH brugernavn", sshPassword: "SSH adgangskode", sshPrivateKey: "SSH privat nøgle" }, isBuffer: opts => `[object ArrayBuffer] betyder, at værdien er binære data, eller værdien er større end ${opts.maxValueAsBuffer}`, streamValue: `Stream felt og værdi er en oneliner. F.eks.: felt1 værdi1 "felt 2" "værdi 2"`, streamTimestampId: `'*' betyder automatisk genereret eller specifikationen som -`, unableToLoadKey: ({ key }) => { return `Kan ikke indlæse denne nøgle: ${key}. Muligt, nøglen blev slettet. Den nøjagtige fejl er i konsollen.`; }, bigJson: "Dette JSON objekt er over 10 kb, så sørg for, at du ved, hvad du laver, for nogle funktioner kan være langsom gengivelse.", addNode: "Tilføj node", validateJson: "Valider JSON", reducedFunction: `Reduceret funktionalitet`, tooManyKeys: opts => { return `For de fulde maksimalt tilladte funktioner er tasterne i alt ${opts.maxLightKeysCount} tælle. Denne database har over de tilladte nøgler i alt ${opts.count}. Nøglesorteringen og de ekstra fancy træoplysninger er deaktiveret. Søgningen foregår kun på serveren i stedet for klientsøgningen.`; }, redisCommandNotFound: "Ingen Redis kommando match fundet ...", treeKeyStore: `Sorteringen (naturlig sammenligning) udføres på klienten aka browseren, hvilket betyder, at den har en straf for store store sæt, som over 10k nøgler, det kan tilføje lidt tid til sidegengivelsen. Der er ingen nøglesortering i Redis, kun sådan.`, socketIoTimeout: options => { return `Socket.IO fik timeout for denne anmodning (maks ${options.timeout / 1000} sekunder)...`; }, resizerInfo: options => { return `Venstre eller højre panels minimumsbredde er ${options.width}px`; }, jsonViewNotParsable: "Denne værdi er ikke JSON parserbar ", ttlTitle: "Indstil TTL på få sekunder", passwordSecure: "Adgangskoden vil muligvis være tom, men den vil stadig vise tegn, dette er en sikkerhedsfunktion.", tlsWithoutCert: "Aktiver TLS uden yderligere certifikat", tlsRejectUnauthorized: "Afvis uautoriseret certifikat", tlsSecure: "Hvis du ser en TLS-konfiguration, der starter med en P3X, eller alle TLS-indstillingerne ligner ens, er det en sikker funktion. For at ændre indstillingerne skal du bare erstatte disse indstillinger med tomme eller noget andet, og de vil blive gemt. Hvis du ikke ændrer TLS-indstillingerne, bevares indstillingerne, som de er på serveren.", treeSeparatorEmpty: "Hvis træseparatoren er tom, vil træet ikke have nogen indlejrede noder, kun en ren liste", treeSeparatorEmptyNote: "Ingen indlejrede noder, kun en ren liste", welcomeConsole: "Velkommen til Redis-konsollen", welcomeConsoleInfo: "Markør OP- eller NED-historik er aktiveret", redisListIndexInfo: "Tom for at tilføje, -1 for at lægge foran eller gemme den til den viste position.", console: "Konsol", connectiondAdd: "Tilføj forbindelse", connectiondEdit: "Rediger forbindelse", connectiondView: "Se forbindelsen", connections: "Forbindelser", licenseInfo: "Licens", licenseEditable: "Licens kan redigeres", licenseEditableYes: "Ja", licenseEditableNo: "Nej", licenseTerminalOnly: "Licens kan kun konfigureres fra serverterminalen.", licenseTierPolicyTitle: "Tier politik", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "stat", licenseStateActive: "Aktiv", licenseStateInactive: "Inaktiv", licenseStateNoLicense: "Ingen licens", licenseKeyMasked: "Gemt nøgle", licenseTier: "Tier", licenseValid: "Gyldig", licenseStatus: "Licensstatus", licenseReason: "Årsag", licenseCheckedAt: "Tjekkede kl", licenseStartsAt: "Starter kl", licenseExpiresAt: "Udløber kl", licenseDaysLeft: "Dage tilbage", licenseMaxDevices: "Max enheder", licenseActiveDevices: "Aktive enheder", licenseActiveDevicesInfo: "Hvis en enhed ikke længere bruges, frigøres dens sæde automatisk efter 75 minutter.", licenseCustomerEmail: "Kundens e-mail", licenseFeatures: "Funktioner", licenseFeaturesEmpty: "Ingen ekstra funktioner", licenseFeatureReadonlyMode: "Skrivebeskyttet forbindelsestilstand", licenseFeatureReadonlyConnectionsFlag: "Skrivebeskyttede forbindelser (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Cluster forbindelser", licenseFeatureSentinel: "Sentinel forbindelser", licenseFeatureReJSON: "ReJSON (JSON datatype)", keysSort: { on: "Nøglesortering videre", off: "Nøgle sortering fra" }, cluster: { on: "Cluster tændt", off: "Cluster slukket" }, sentinel: { on: "Sentinel tændt", off: "Sentinel slukket", name: "Sentinel navn" }, readonly: { on: "Skrivebeskyttet videre", off: "Skrivebeskyttet fra" }, proSshOnly: "SSH er tilgængelig i Pro eller Enterprise.", proReadonlyOnly: "Skrivebeskyttet forbindelsestilstand er tilgængelig i Pro eller Enterprise.", enterpriseClusterSentinelOnly: "Cluster og Sentinel er kun tilgængelige i Enterprise.", theme: { light: "Lys", dark: "Mørk virksomhed", darkNeu: "Mørk", darkoBluo: "Mørk blå", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Tilsluttet: ${opts.name}`; }, tree: "Træ", askAuth: "Spørg om autorisation", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduler", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Afbryd forbindelsen", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Kommandoer", ungrouped: "Uden gruppe", grouped: "Grouped", connectFirst: "Forbind først til en Redis-server", searchLanguage: "Søg sprog...", exportProgress: "Eksporterer nøgler...", importProgress: "Importerer nøgler...", importPreview: "Forhåndsvisning", importOverwrite: "Overskriv", importSkip: "Spring over", importConflict: "Hvis nøglen allerede findes:", noKeysToExport: "Ingen nøgler at eksportere", time: "Tid", loading: "Indlæser...", autoRefresh: "Auto", exportSearchHint: "Eksporterer kun nøgler der matcher den aktuelle søgning", importSearchHint: "Import gælder for hele databasen, ikke kun søgeresultater", importNoKeys: "Ingen nøgler fundet i filen", }, status: { dataCopied: "Dataene er i udklipsholderen", licenseSaved: "Licensen er gemt", exportDone: "Eksport fuldført", indexCreated: "Index oprettet", indexDropped: "Index slettet", importDone: (opts) => `Import fuldført: ${opts.created} oprettet, ${opts.skipped} sprunget over, ${opts.errors} fejl`, nodeRemoved: "Node fjernet", keyIsNotExisting: "Denne nøgle kunne være blevet slettet eller udløbet.", keyCount: opts => { if (opts.keyCount === 0) { return "Ingen nøgle"; } else if (opts.keyCount === 1) { return "1 nøgle"; } else { return `${opts.keyCount} nøgler`; } }, treeExpandAll: "Udvid alle træblade. Denne operation kan være dyr og kan tage tid ...", noRedisKeys: "Der er ingen nøgler i denne database.", redisConnected: "Redis tilsluttet lykkedes", reloadingDataInfo: "Genindlæser Redis datainfo", added: "Tilføjet", saved: "Opdateret", cancelled: "Annulleret", deleted: "Slettet", savedRedis: "Redis data gemmes", redisDisconnected: opts => { return `Den aktuelle forbindelse havde en fejl: ${opts.error.message}`; }, dbChanged: opts => { return `db-indekset sat til ${opts.db}. `; }, treeDeleted: opts => { return `Trænøglen blev slettet (${opts.key}).`; }, deletedKey: opts => { return `Nøglen blev slettet (${opts.key}).`; }, renamedKey: "Denne nøgle er blevet omdøbt", ttlChanged: "Denne nøgles TTL er blevet ændret", notInteger: "Dette input er ikke et heltal", persisted: "Denne nøgle er vedvarende for evigt", set: "Nøglen indstilles/tilføjes" }, code: { "delete-connection": "Denne forbindelse blev slettet, så du er afbrudt til denne Redis-instans.", "save-connection": "Denne forbindelse blev ændret, så du er afbrudt til denne Redis-instans. Du kan oprette forbindelse igen.", "readonly-connections": "Forbindelser tilføje/gem/slet er skrivebeskyttet!", "readonly-connection-mode": "Denne forbindelse er skrivebeskyttet!", "list-out-of-bounds": "Dette listeindeks er uden for grænserne", "donation-ware-feature": "Denne funktion er til stede i donationsversionen.", "feature-pro-readonly-required": "Skrivebeskyttet forbindelsestilstand kræver Pro- eller Enterprise-licens.", "feature-pro-ssh-required": "SSH tunneling kræver Pro- eller Enterprise-licens.", "feature-enterprise-cluster-sentinel-required": "Cluster og Sentinel kræver Enterprise-licens.", "feature-pro-json-binary-required": "Rediger JSON, Upload binær og Download binær kræver Pro- eller Enterprise-licens.", "feature-pro-rejson-required": "ReJSON (JSON datatype) kræver Pro- eller Enterprise-licens.", "invalid-json-value": "Værdien er ikke gyldig JSON.", "http_auth_required": "Godkendelse påkrævet: godkend venligst med HTTP Basic Auth og genindlæs.", "auto-connection-failed": "Muligt, forbindelsen blev fjernet, og den automatiske forbindelse mislykkedes på grund af dette.", invalid_console_command: "Denne kommando virker ikke via GUI." }, licenseReason: { LICENSE_VALID: "Licensen er gyldig", LICENSE_INVALID: "Licensen er ugyldig", LICENSE_MISSING: "Der er ikke angivet nogen licensnøgle", LICENSE_DISABLED: "Licens er deaktiveret i serverkonfiguration", LICENSE_NOT_FOUND: "Licens blev ikke fundet", LICENSE_EXPIRED: "Licensen er udløbet", LICENSE_CLEARED: "Licensnøgle blev slettet", LICENSE_MAX_DEVICES_REACHED: "Det maksimale antal enhedspladser er nået", PRODUCT_MISMATCH: "Licensproduktet stemmer ikke overens" }, licenseStatusValue: { active: "Aktiv", deleted: "Slettet", all: "Alle", expired: "Udløbet", missing: "Mangler", inactive: "Inaktiv" }, form: { error: { required: "Påkrævet", port: "Porten er mellem 1-65535", invalid: "Formularen er ugyldig" }, connection: { label: { name: "Navn", group: "Group", host: "Værtsnavn", port: "Havn", password: "Adgangskode", username: "Brugernavn" } }, treeSettings: { maxValueDisplay: "Max værdi display streng længde", maxValueDisplayInfo: "Vis fulde værdier, hvis den er sat til 0. Hvis større end 0, afkortes til denne længde. Hvis -1: for strenge, skjul værdien indtil edit; for andre typer, vis det fulde indhold.", maxKeys: "Det maksimale nøgletal", maxKeysInfo: "For at GUI ikke går ned, begrænser vi det maksimale nøgletal.", keyCount: () => { return `Antal nøgler: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Brug animation", noAnimation: "Ingen animation", jsonFormatTwoSpace: "Formater JSON med 2 mellemrum", jsonFormatFourSpace: "Formater JSON med 4 mellemrum", formName: "Redis indstillinger", searchModeClient: "Klientsøgningstilstand", searchModeServer: "Server søgetilstand", searchModeStartsWith: "Søg med starter med tilstand", searchModeIncludes: "Søgning inkluderer tilstand" }, field: { treeSeparator: "Træudskiller", treeSeparatorSelector: "Træudskillervælger", page: "Antal træsøgninger", keyPageCount: "Antal nøglepersonsøgninger", keysSort: "Sorter nøglerne", searchMode: "Søgetilstand", searchModeStartsWith: "Søgning starter med / inkluderer" }, error: { keyPageCount: "Antallet af nøglesider skal være et heltal mellem 5 - 100", page: "Sideantallet skal være et heltal mellem 10 - 5000", maxValueDisplay: "Den maksimale visningsværdi skal være et heltal mellem -1 og 32768", maxKeys: "Den maksimale nøgletalsværdi skal være et heltal mellem 100 og 100.000" } }, key: { label: { formName: { add: "Tilføj ny Redis nøgle", edit: "Rediger Redis nøgle", append: "Tilføj til eksisterende Redis nøgle" } }, field: { streamTimestamp: "Tidsstempel", key: "Nøgle", type: "Type", index: "Indeks", hashKey: "Hash nøgle", score: "Score", value: "Værdi" }, error: { streamTimestamp: "Tidsstemplet er påkrævet, enten Redis-format eller som *", key: "Nøglen er mindst ét tegn", hashKey: "Hash-tabelnøglen er mindst ét tegn", score: "Den sorterede sætscore er påkrævet", value: "Værdien er påkrævet" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Søg", index: "Indeks", query: "Forespørgsel", results: "Resultater", noIndex: "Ingen indekser", createIndex: "Opret indeks", dropIndex: "Slet indeks", indexInfo: "Indeksinfo", indexName: "Indeksnavn", prefix: "Nøglepræfiks (valgfrit)", fieldName: "Feltnavn", }, monitor: { title: "Overvågning", memory: "Hukommelse", opsPerSec: "Ops/sek", clients: "Klienter", blocked: "Blokeret", hitsMisses: "Hitrate", networkIo: "Netværk I/O", slowLog: "Langsom log", totalCommands: "Total", expired: "Udløbet", evicted: "Fjernet", clientList: "Klientliste", topKeys: "Største nøgler efter hukommelse", killClient: "Afslut klient", clientKilled: "Klient afsluttet", confirmKillClient: "Er du sikker på at du vil afslutte denne klient?", noKeys: "Ingen nøgler", noClients: "Ingen klienter", }, overview: { noConnected: "Der er ingen forbindelse til Redis.", overviewClients: "List de tilsluttede efter antallet af klienter", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klienter`; } }, key: { label: { key: "Nøgle", encoding: "Kodning", length: "Størrelse", ttl: "TTL", ttlTitle: "Tid til at leve", type: "Type", ttlNotExpire: "udløber ikke", lengthString: "bytes", lengthItem: "genstande", actions: "Handlinger" }, list: { table: { index: "Indeks", value: "Værdi" } }, hash: { table: { hashkey: "Hashkey", value: "Værdi" } }, set: { table: { value: "Medlem" } }, zset: { table: { value: "Medlem", score: "Score" } }, stream: { table: { timestamp: "Tidsstempel-id", field: "Felt", value: "Værdi" } } }, treeControls: { settings: "Træindstillinger", expandAll: "Udvid alle", collapseAll: "Skjul alle sammen", search: { search: "Søg i tasterne", clear: "Ryd den aktuelle søgning for at angive tom", placeholderClient: "Søg på klientsiden", placeholderServer: "Søg på serversiden", info: "Klientsidens søgning betyder, at den matcher teksten i søgeinputtet. Søgning på serversiden betyder, det vil sige at søge i nøglemønstrene som *{søgetekst}*. For store søgesæt er det bedre at bruge søgning på serversiden. For mindre søgesæt er det bedre at bruge søgetilstand på klientsiden." + ` Hvis nøgletal er slut ${p3xr.settings.maxLightKeysCount}, du kan kun søge på serversiden.`, largeSetInfo: "I et stort sæt er søgning på klientsiden deaktiveret. så lige nu er kun søgning på serversiden mulig.", infoDetails: "For at finde ud af, hvordan søgningen fungerer, tjek venligst indstillingerne" }, pager: { next: "Næste", prev: "Forrige", first: "Først", last: "Sidst" } } }, time: { loading: "Indlæser...", years: "år", months: "måneder", days: "dage", year: "år", month: "måned", day: "dag" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/de/000077500000000000000000000000001517666434100137435ustar00rootroot00000000000000src/strings/de/strings.js000066400000000000000000000726761517666434100160140ustar00rootroot00000000000000const strings = { error: { cleared_license: "Lizenz gelöscht", invalid_license: "Ungültige Lizenz", license_max_devices_reached: "Maximale Anzahl der Geräteplätze erreicht", license_readonly: "Die Lizenz kann nur über das Server-Terminal geändert werden.", server_error: "Serverfehler, bitte versuchen Sie es erneut" }, title: { donate: "Spenden", jsonRecursive: "Alle Blätter aufklappen", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Sie können eine Redis-Verbindung aus dem unteren linken Menü auswählen.", statistics: "Statistiken", error: "Fehler", connectingRedis: "Verbindung zu Redis wird hergestellt ...", socketioConnectError: "Socket.IO Fehler", db: "DB", server: "Server", clients: "Clients", memory: "Speicher", persistence: "Persistenz", stats: "Statistiken", replication: "Replikation", cpu: "CPU", cluster: "Cluster", modules: "Module", errorstats: "Fehlerstatistiken", commandstats: "Befehlsstatistiken", latencystats: "Latenzstatistiken", keysizes: "Schlüsselgrößen", threads: "Threads", }, confirm: { dropIndex: "Sind Sie sicher, dass Sie diesen Index löschen möchten?", uploadBuffer: "Sind Sie sicher, dass Sie diese Binärdaten hochladen möchten?", uploadBufferDone: "Die Binärdaten wurden hochgeladen", uploadBufferDoneAndSave: "Die Binärdaten wurden hochgeladen und auf dem Server gespeichert", title: "Bestätigung", alert: "Warnung", info: "Info", deleteListItem: "Sind Sie sicher, dass Sie dieses Listenelement löschen möchten?", deleteHashKey: "Sind Sie sicher, dass Sie diesen Hash-Schlüssel löschen möchten?", deleteStreamTimestamp: "Sind Sie sicher, dass Sie diesen Stream-Zeitstempel löschen möchten?", deleteSetMember: "Sind Sie sicher, dass Sie dieses Set-Mitglied löschen möchten?", deleteZSetMember: "Sind Sie sicher, dass Sie dieses Mitglied der sortierten Menge löschen möchten?", deleteConnection: "Bestätigung", deleteConnectionText: "Sind Sie sicher, dass Sie diese Redis-Verbindung löschen möchten?", deleteNode: "Sind Sie sicher, dass Sie diesen Redis-Knoten löschen möchten?", deleteAllKeys: opts => { return `Diesen Baum und alle seine Schlüssel löschen (${opts.key})?`; }, socketioConnectError: "Socket.IO kann keine Verbindung zum Server herstellen. Sie können die Seite neu laden und versuchen, den Verbindungsfehler selbst zu beheben. Der Client weiß nicht, wie er ihn selbst lösen kann.", socketioAuthRequired: "Socket.IO-Autorisierung erforderlich. Bitte authentifizieren Sie sich mit HTTP Basic Auth (Benutzername/Passwort) und laden Sie die Seite neu.", deleteKey: "Sind Sie sicher, dass Sie diesen Schlüssel löschen möchten?", rename: { title: "Sind Sie sicher, dass Sie diesen Schlüssel umbenennen möchten?", textContent: "Diese Aktion benennt den Schlüssel dauerhaft um.", placeholder: "Der Redis-Schlüssel (erforderlich)" }, ttl: { title: "Sind Sie sicher, dass Sie die TTL dieses Schlüssels ändern möchten?", textContent: "Das Ändern der TTL aktualisiert die Lebensdauer dieses Schlüssels. Leer lassen, um den Schlüssel dauerhaft zu behalten.", placeholder: "Die TTL des Redis-Schlüssels (Ganzzahl oder leer)", placeholderPlaceholder: "Leer bedeutet, dass er dauerhaft gespeichert wird; andernfalls geben Sie eine Ganzzahl ein.", convertTextToTime: "Text in Zeit umwandeln", convertTextToTimePlaceholder: "Z.B. 1d wird 86400" }, license: { title: "Lizenz festlegen", textContent: "Wenn Sie kostenpflichtige Funktionen nutzen möchten, kontaktieren Sie bitte support@corifeus.com, um eine Lizenz anzufordern. Die Preise sind Pro 400 HUF/Monat (€1/Monat) oder 4,000 HUF/Jahr (€10/Jahr) und Enterprise 1,200 HUF/Monat (€3/Monat) oder 12,000 HUF/Jahr (€30/Jahr). Der Jahrespreis ist das 10-fache des Monatspreises. Mit 27% MwSt. betragen die Gesamtpreise Pro 500 HUF/Monat (€1.27/Monat) oder 5,100 HUF/Jahr (€12.70/Jahr), Enterprise 1,500 HUF/Monat (€3.81/Monat) oder 15,200 HUF/Jahr (€38.10/Jahr). Die Lizenzvalidierung erfordert Internetzugang. Die Standardlizenz umfasst 5 Plätze. Wenn Sie mehr Plätze benötigen, kontaktieren Sie uns unter support@corifeus.com.", placeholder: "Lizenzschlüssel" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopieren", downloadBuffer: "Binärdatei herunterladen", setBuffer: "Binärdatei hochladen", exportKeys: "Schlüssel exportieren", exportAllKeys: (opts) => `Alle ${opts.count} Schlüssel exportieren`, exportSearchResults: (opts) => `${opts.count} Ergebnisse exportieren`, importKeys: "Schlüssel importieren", saveWithFormatJson: "Mit Formatierung speichern", formatJson: "Json formatieren", wrap: "Umbrechen", unwrap: "Nicht umbrechen", downloadJson: "JSON herunterladen", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Sprache / Language", ok: "OK", addKey: "Zu diesem Schlüssel hinzufügen", addKeyRoot: "Stammschlüssel hinzufügen", reloadKey: "Schlüssel neu laden", reload: "Neu laden", close: "Schließen", commands: "Befehle", view: "Ansicht", statistics: "Statistiken", refresh: "Aktualisieren", pause: "Pause", resume: "Fortsetzen", clear: "Leeren", rename: "Umbenennen", main: "Datenbank", cancel: "Abbrechen", theme: "Design", github: "GitHub", githubRepo: "Repository", githubRelease: "Versionen", githubChangelog: "Änderungsprotokoll", info: "Info", settings: "Einstellungen", connect: "Verbinden", disconnect: "Trennen", overview: "Übersicht", console: "Konsole", noConnections: "Keine Verbindungen, fügen Sie eine Verbindung im Einstellungsmenü hinzu.", noConnectionsInSettings: "Keine Verbindungen, Sie können oben eine NEUE VERBINDUNG hinzufügen.", connectionAdd: "Neue Verbindung", addGroup: "Gruppe hinzufügen", extend: "Erweitern", collapse: "Zuklappen", add: "Hinzufügen", edit: "Bearbeiten", save: "Speichern", ttl: "TTL festlegen", license: "Lizenz festlegen", delete: "Löschen", remove: "Entfernen", sure: "Sicher", testConnection: "Verbindung testen", getKey: "Redis-Schlüssel und zugehörige Daten werden geladen ...", jsonViewShow: "JSON anzeigen", jsonViewEditor: "JSON bearbeiten", quickConsole: "Schnellkonsole" }, label: { id: { nodeId: 'Knoten-ID', id: "Verbindungs-ID", info: "Wenn Sie die Eigenschaften sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa nicht ändern möchten, geben Sie bitte die Verbindungs-ID in diesen Eigenschaften ein, um die Eigenschaftswerte beizubehalten. Wenn Sie die gleiche Logik für das Knotenpasswort möchten, geben Sie die Knoten-ID im Knotenpasswort ein." }, secureFeature: 'Wenn Sie einen Wert sehen, der mit P3X beginnt und gleich aussieht, handelt es sich um eine Sicherheitsfunktion. Um die Einstellungen zu ändern, ersetzen Sie diese Einstellungen einfach durch leere oder andere Werte und sie werden gespeichert. Wenn Sie die Einstellungen nicht ändern, werden sie so beibehalten, wie sie auf dem Server sind.', ssh: { on: 'SSH ein', off: 'SSH aus', sshHost: 'SSH Host', sshPort: 'SSH Port', sshUsername: 'SSH Benutzername', sshPassword: 'SSH Passwort', sshPrivateKey: 'SSH Privater Schlüssel' }, isBuffer: opts => `[object ArrayBuffer] bedeutet, dass der Wert Binärdaten sind oder der Wert größer als ${opts.maxValueAsBuffer} ist`, streamValue: `Stream-Feld und -Wert stehen in einer Zeile. Z.B.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' bedeutet automatisch generiert oder die Spezifikation als -`, unableToLoadKey: ({ key }) => { return `Dieser Schlüssel konnte nicht geladen werden: ${key}. Möglicherweise wurde der Schlüssel gelöscht. Der genaue Fehler ist in der Konsole.`; }, bigJson: "Dieses JSON-Objekt ist über 10 KB groß. Stellen Sie sicher, dass Sie wissen, was Sie tun, da einige Funktionen beim Rendern langsam sein können.", addNode: "Knoten hinzufügen", validateJson: "JSON validieren", reducedFunction: `Eingeschränkte Funktionalität`, tooManyKeys: opts => { return `Für die vollen maximalen Funktionen beträgt die erlaubte Gesamtanzahl der Schlüssel ${opts.maxLightKeysCount}. Diese Datenbank hat mehr als die erlaubte Gesamtanzahl der Schlüssel ${opts.count}. Die Schlüsselsortierung und die zusätzlichen Bauminformationen sind deaktiviert. Die Suche erfolgt nur auf dem Server statt auf dem Client.`; }, redisCommandNotFound: "Kein passender Redis-Befehl gefunden ...", treeKeyStore: `Die Sortierung (natürlicher Vergleich) wird auf dem Client, also dem Browser, ausgeführt, was bedeutet, dass bei großen Datensätzen mit mehr als 10.000 Schlüsseln etwas zusätzliche Zeit zum Rendern der Seite benötigt werden kann. In Redis gibt es keine Schlüsselsortierung, nur auf diese Weise.`, socketIoTimeout: options => { return `Socket.IO hat bei dieser Anfrage das Zeitlimit überschritten (max ${options.timeout / 1000} Sekunden) ...`; }, resizerInfo: options => { return `Die Mindestbreite des linken oder rechten Panels beträgt ${options.width}px`; }, jsonViewNotParsable: "Dieser Wert kann nicht als JSON geparst werden ", ttlTitle: "TTL in Sekunden festlegen", passwordSecure: "Das Passwort kann leer sein, zeigt aber dennoch Zeichen an. Dies ist eine Sicherheitsfunktion.", tlsWithoutCert: "TLS ohne zusätzliches Zertifikat aktivieren", tlsRejectUnauthorized: "Nicht autorisiertes Zertifikat ablehnen", tlsSecure: "Wenn Sie eine TLS-Konfiguration sehen, die mit P3X beginnt, oder alle TLS-Einstellungen gleich aussehen, handelt es sich um eine Sicherheitsfunktion. Um die Einstellungen zu ändern, ersetzen Sie diese Einstellungen einfach durch leere oder andere Werte und sie werden gespeichert. Wenn Sie die TLS-Einstellungen nicht ändern, werden sie so beibehalten, wie sie auf dem Server sind.", treeSeparatorEmpty: "Wenn der Baumtrenner leer ist, hat der Baum keine verschachtelten Knoten, nur eine einfache Liste", treeSeparatorEmptyNote: "Keine verschachtelten Knoten, nur eine einfache Liste", welcomeConsole: "Willkommen in der Redis-Konsole", welcomeConsoleInfo: "Verlauf mit Cursor HOCH oder RUNTER ist aktiviert", redisListIndexInfo: "Leer zum Anhängen, -1 zum Voranstellen oder an der angezeigten Position speichern.", console: "Konsole", connectiondAdd: "Verbindung hinzufügen", connectiondEdit: "Verbindung bearbeiten", connectiondView: "Verbindung anzeigen", connections: "Verbindungen", licenseInfo: "Lizenz", licenseEditable: "Lizenz bearbeitbar", licenseEditableYes: "Ja", licenseEditableNo: "Nein", licenseTerminalOnly: "Die Lizenz kann nur über das Server-Terminal konfiguriert werden.", licenseTierPolicyTitle: "Stufenrichtlinie", licenseTierPolicyText: "

Kostenlos

Nur grundlegende Redis UI; kein SSH-Tunneling, kein Readonly-Verbindungsmodus, kein Cluster/Sentinel, kein JSON bearbeiten/Binärdatei hochladen/Binärdatei herunterladen, kein ReJSON.
Preis: 0 HUF/Monat (€0/Monat).

Pro

SSH-Tunneling, Readonly-Verbindungsmodus (einschließlich --readonly-connections/-r), JSON bearbeiten, Binärdatei hochladen, Binärdatei herunterladen, ReJSON.
Grundpreis: 400 HUF/Monat (€1/Monat) oder 4,000 HUF/Jahr (€10/Jahr).
Gesamt mit 27% MwSt.: 500 HUF/Monat (€1.27/Monat) oder 5,100 HUF/Jahr (€12.70/Jahr).

Enterprise

SSH-Tunneling, Cluster und Sentinel, plus JSON bearbeiten, Binärdatei hochladen, Binärdatei herunterladen, ReJSON; --readonly-connections/-r funktioniert ebenfalls.
Grundpreis: 1,200 HUF/Monat (€3/Monat) oder 12,000 HUF/Jahr (€30/Jahr).
Gesamt mit 27% MwSt.: 1,500 HUF/Monat (€3.81/Monat) oder 15,200 HUF/Jahr (€38.10/Jahr).

Jahresregel

Der Jahrespreis ist das 10-fache des Monatspreises.

Plätze

Die Standardlizenz umfasst 5 Plätze. Wenn Sie mehr Plätze benötigen, kontaktieren Sie uns unter support@corifeus.com.

Enterprise-Testversion

10 Tage kostenlos für jeden mit einer echten E-Mail-Adresse (keine Test-E-Mail).

Rechnungsinformationen per E-Mail

Name, Rechnungs-E-Mail, Ländercode, Postleitzahl, Stadt, Adresse, USt-IdNr. (optional).

Zahlung

PayPal-Zahlung ist nur in HUF (Forint) verfügbar; nach Überweisung des Betrags @ https://paypal.me/corifeus sende ich Ihnen eine Rechnung. Alle Zahlungen sind nicht erstattungsfähig.

MwSt.

MwSt. wird zum Preis hinzugefügt (27% in Ungarn).

Kontakt

Wenn Sie Hallo sagen oder eine Frage haben möchten, kontaktieren Sie support@corifeus.com.

Sprache

Rechnungs- und Lizenz-E-Mail-Kommunikation ist auf Englisch. Die Rechnungswährung ist HUF.

Hinweis

Die Lizenzvalidierung erfordert Internetzugang.", licenseState: "Status", licenseStateActive: "Aktiv", licenseStateInactive: "Inaktiv", licenseStateNoLicense: "Keine Lizenz", licenseKeyMasked: "Gespeicherter Schlüssel", licenseTier: "Stufe", licenseValid: "Gültig", licenseStatus: "Lizenzstatus", licenseReason: "Grund", licenseCheckedAt: "Geprüft am", licenseStartsAt: "Beginnt am", licenseExpiresAt: "Läuft ab am", licenseDaysLeft: "Verbleibende Tage", licenseMaxDevices: "Maximale Geräteanzahl", licenseActiveDevices: "Aktive Geräte", licenseActiveDevicesInfo: "Wenn ein Gerät nicht mehr verwendet wird, wird sein Platz automatisch nach 75 Minuten freigegeben.", licenseCustomerEmail: "Kunden-E-Mail", licenseFeatures: "Funktionen", licenseFeaturesEmpty: "Keine zusätzlichen Funktionen", licenseFeatureReadonlyMode: "Readonly-Verbindungsmodus", licenseFeatureReadonlyConnectionsFlag: "Readonly-Verbindungen (--readonly-connections/-r)", licenseFeatureSsh: "SSH-Tunneling", licenseFeatureCluster: "Cluster-Verbindungen", licenseFeatureSentinel: "Sentinel-Verbindungen", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Schlüsselsortierung ein", off: "Schlüsselsortierung aus" }, cluster: { on: "Cluster ein", off: "Cluster aus" }, sentinel: { on: "Sentinel ein", off: "Sentinel aus", name: "Sentinel-Name" }, readonly: { on: "Readonly ein", off: "Readonly aus" }, proSshOnly: "SSH ist in Pro oder Enterprise verfügbar.", proReadonlyOnly: "Der Readonly-Verbindungsmodus ist in Pro oder Enterprise verfügbar.", enterpriseClusterSentinelOnly: "Cluster und Sentinel sind nur in Enterprise verfügbar.", theme: { light: "Hell", dark: "Dunkel Enterprise", darkNeu: "Dunkel", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Verbunden: ${opts.name}`; }, tree: "Baum", askAuth: "Autorisierung anfordern", keyboardShortcuts: "Tastenkürzel", about: "Über", supportedLanguages: "Unterstützte Sprachen", version: "Version", redisVersion: "Redis-Version", modules: "Module", shortcutRefresh: "Aktualisieren", shortcutSearch: "Suche fokussieren", shortcutNewKey: "Neuer Schlüssel", shortcutDisconnect: "Trennen", themeAuto: "Automatisch (System)", shortcutCommandPalette: "Befehlspalette", commandPalette: "Befehlspalette", noResults: "Keine Ergebnisse", redisCommandsReference: "Redis Befehle", ungrouped: "Ohne Gruppe", grouped: "Gruppiert", connectFirst: "Verbinden Sie sich zuerst mit einem Redis-Server", searchLanguage: "Sprache suchen...", exportProgress: "Schlüssel werden exportiert...", importProgress: "Schlüssel werden importiert...", importPreview: "Vorschau", importOverwrite: "Überschreiben", importSkip: "Überspringen", importConflict: "Wenn der Schlüssel bereits existiert:", noKeysToExport: "Keine Schlüssel zum Exportieren", time: "Zeit", loading: "Laden...", autoRefresh: "Auto", exportSearchHint: "Es werden nur Schlüssel exportiert, die der aktuellen Suche entsprechen", importSearchHint: "Import gilt für die gesamte Datenbank, nicht nur für Suchergebnisse", importNoKeys: "Keine Schlüssel in der Datei gefunden", }, status: { dataCopied: "Die Daten sind in der Zwischenablage", licenseSaved: "Lizenz gespeichert", exportDone: "Export abgeschlossen", indexCreated: "Index erstellt", indexDropped: "Index gelöscht", importDone: (opts) => `Import abgeschlossen: ${opts.created} erstellt, ${opts.skipped} übersprungen, ${opts.errors} Fehler`, nodeRemoved: "Knoten entfernt", keyIsNotExisting: "Dieser Schlüssel wurde möglicherweise gelöscht oder ist abgelaufen.", keyCount: opts => { if (opts.keyCount === 0) { return "Kein Schlüssel"; } else if (opts.keyCount === 1) { return "1 Schlüssel"; } else { return `${opts.keyCount} Schlüssel`; } }, treeExpandAll: "Alle Baumblätter aufklappen. Diese Operation kann aufwändig sein und Zeit in Anspruch nehmen ...", noRedisKeys: "Es gibt keine Schlüssel in dieser Datenbank.", redisConnected: "Redis erfolgreich verbunden", reloadingDataInfo: "Redis-Dateninformationen werden neu geladen", added: "Hinzugefügt", saved: "Aktualisiert", cancelled: "Abgebrochen", deleted: "Gelöscht", savedRedis: "Redis-Daten wurden gespeichert", redisDisconnected: opts => { return `Die aktuelle Verbindung hatte einen Fehler: ${opts.error.message}`; }, dbChanged: opts => { return `Der DB-Index wurde auf ${opts.db} gesetzt. `; }, treeDeleted: opts => { return `Der Baumschlüssel wurde gelöscht (${opts.key}).`; }, deletedKey: opts => { return `Der Schlüssel wurde gelöscht (${opts.key}).`; }, renamedKey: "Dieser Schlüssel wurde umbenannt", ttlChanged: "Die TTL dieses Schlüssels wurde geändert", notInteger: "Diese Eingabe ist keine Ganzzahl", persisted: "Dieser Schlüssel wird dauerhaft gespeichert", set: "Der Schlüssel ist gesetzt/hinzugefügt" }, code: { "delete-connection": "Diese Verbindung wurde gelöscht, daher sind Sie von dieser Redis-Instanz getrennt.", "save-connection": "Diese Verbindung wurde geändert, daher sind Sie von dieser Redis-Instanz getrennt. Sie können sich erneut verbinden.", "readonly-connections": "Verbindungen hinzufügen/speichern/löschen ist schreibgeschützt!", "readonly-connection-mode": "Diese Verbindung ist im schreibgeschützten Modus!", "list-out-of-bounds": "Dieser Listenindex liegt außerhalb des Bereichs", "donation-ware-feature": "Diese Funktion ist in der kostenpflichtigen Version verfügbar.", "feature-pro-readonly-required": "Der Readonly-Verbindungsmodus erfordert eine Pro- oder Enterprise-Lizenz.", "feature-pro-ssh-required": "SSH-Tunneling erfordert eine Pro- oder Enterprise-Lizenz.", "feature-enterprise-cluster-sentinel-required": "Cluster und Sentinel erfordern eine Enterprise-Lizenz.", "feature-pro-json-binary-required": "JSON bearbeiten, Binärdatei hochladen und Binärdatei herunterladen erfordern eine Pro- oder Enterprise-Lizenz.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorisierung erforderlich: Bitte authentifizieren Sie sich mit HTTP Basic Auth und laden Sie die Seite neu.", "auto-connection-failed": "Möglicherweise wurde die Verbindung entfernt und die automatische Verbindung ist deshalb fehlgeschlagen.", invalid_console_command: "Dieser Befehl funktioniert nicht über die GUI." }, licenseReason: { LICENSE_VALID: "Lizenz ist gültig", LICENSE_INVALID: "Lizenz ist ungültig", LICENSE_MISSING: "Kein Lizenzschlüssel festgelegt", LICENSE_DISABLED: "Lizenz ist in der Serverkonfiguration deaktiviert", LICENSE_NOT_FOUND: "Lizenz wurde nicht gefunden", LICENSE_EXPIRED: "Lizenz ist abgelaufen", LICENSE_CLEARED: "Lizenzschlüssel wurde gelöscht", LICENSE_MAX_DEVICES_REACHED: "Maximale Anzahl der Geräteplätze erreicht", PRODUCT_MISMATCH: "Lizenzprodukt stimmt nicht überein" }, licenseStatusValue: { active: "Aktiv", deleted: "Gelöscht", all: "Alle", expired: "Abgelaufen", missing: "Fehlend", inactive: "Inaktiv" }, form: { error: { required: "Erforderlich", port: "Der Port liegt zwischen 1-65535", invalid: "Das Formular ist ungültig" }, connection: { label: { name: "Name", group: "Gruppe", host: "Hostname", port: "Port", password: "Passwort", username: "Benutzername" } }, treeSettings: { maxValueDisplay: "Maximale Anzeigelänge des Wertes", maxValueDisplayInfo: "Bei 0 werden vollständige Werte angezeigt. Bei größer als 0 wird auf diese Länge gekürzt. Bei -1: Für Zeichenketten wird der Wert bis zur Bearbeitung ausgeblendet; für andere Typen wird der vollständige Inhalt angezeigt.", maxKeys: "Maximale Schlüsselanzahl", maxKeysInfo: "Damit die GUI nicht abstürzt, begrenzen wir die maximale Schlüsselanzahl.", keyCount: () => { return `Anzahl der Schlüssel: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Animation verwenden", noAnimation: "Keine Animation", jsonFormatTwoSpace: "JSON mit 2 Leerzeichen formatieren", jsonFormatFourSpace: "JSON mit 4 Leerzeichen formatieren", formName: "Redis-Einstellungen", searchModeClient: "Client-Suchmodus", searchModeServer: "Server-Suchmodus", searchModeStartsWith: "Suche mit Beginnt-mit-Modus", searchModeIncludes: "Enthält-Suchmodus" }, field: { treeSeparator: "Baumtrenner", treeSeparatorSelector: "Baumtrenner-Selektor", page: "Baum-Seitenanzahl", keyPageCount: "Schlüssel pro Seite", keysSort: "Schlüssel sortieren", searchMode: "Suchmodus", searchModeStartsWith: "Suche beginnt mit / enthält" }, error: { keyPageCount: "Die Schlüsselanzahl pro Seite muss eine Ganzzahl zwischen 5 - 100 sein", page: "Die Seitenanzahl muss eine Ganzzahl zwischen 10 - 5000 sein", maxValueDisplay: "Der maximale Anzeigewert muss eine Ganzzahl zwischen -1 und 32768 sein", maxKeys: "Die maximale Schlüsselanzahl muss eine Ganzzahl zwischen 100 und 100000 sein" } }, key: { label: { formName: { add: "Neuen Redis-Schlüssel hinzufügen", edit: "Redis-Schlüssel bearbeiten", append: "Zu bestehendem Redis-Schlüssel hinzufügen" } }, field: { streamTimestamp: "Zeitstempel", key: "Schlüssel", type: "Typ", index: "Index", hashKey: "Hash-Schlüssel", score: "Punktzahl", value: "Wert" }, error: { streamTimestamp: "Der Zeitstempel ist erforderlich, entweder im Redis-Format oder als *", key: "Der Schlüssel muss mindestens ein Zeichen lang sein", hashKey: "Der Hash-Schlüssel muss mindestens ein Zeichen lang sein", score: "Die Punktzahl der sortierten Menge ist erforderlich", value: "Der Wert ist erforderlich" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Suche", index: "Index", query: "Abfrage", results: "Ergebnisse", noIndex: "Keine Indizes gefunden", createIndex: "Index erstellen", dropIndex: "Index löschen", indexInfo: "Index-Info", indexName: "Indexname", prefix: "Schlüsselpräfix (optional)", fieldName: "Feldname", }, monitor: { title: "Überwachung", memory: "Speicher", opsPerSec: "Ops/Sek", clients: "Clients", blocked: "Blockiert", hitsMisses: "Trefferquote", networkIo: "Netzwerk I/O", slowLog: "Langsamer Log", totalCommands: "Gesamt", expired: "Abgelaufen", evicted: "Verdrängt", clientList: "Client-Liste", topKeys: "Größte Schlüssel nach Speicher", killClient: "Client beenden", clientKilled: "Client beendet", confirmKillClient: "Sind Sie sicher, dass Sie diesen Client beenden möchten?", noKeys: "Keine Schlüssel", noClients: "Keine Clients", }, overview: { noConnected: "Es besteht keine Verbindung zu Redis.", overviewClients: "Verbundene nach Anzahl der Clients auflisten", connectedCount: opt => { if (opt.length === 1) { return "1 Client"; } return `${opt.length} Clients`; } }, key: { label: { key: "Schlüssel", encoding: "Kodierung", length: "Größe", ttl: "TTL", ttlTitle: "Lebensdauer", type: "Typ", ttlNotExpire: "läuft nicht ab", lengthString: "Bytes", lengthItem: "Elemente", actions: "Aktionen" }, list: { table: { index: "Index", value: "Wert" } }, hash: { table: { hashkey: "Hash-Schlüssel", value: "Wert" } }, set: { table: { value: "Mitglied" } }, zset: { table: { value: "Mitglied", score: "Punktzahl" } }, stream: { table: { timestamp: "Zeitstempel-ID", field: "Feld", value: "Wert" } } }, treeControls: { settings: "Baumeinstellungen", expandAll: "Alle aufklappen", collapseAll: "Alle zuklappen", search: { search: "In Schlüsseln suchen", clear: "Aktuelle Suche leeren", placeholderClient: "Clientseitig suchen", placeholderServer: "Serverseitig suchen", info: "Die clientseitige Suche bedeutet, dass der Text im Suchfeld abgeglichen wird. Die serverseitige Suche bedeutet, dass in den Schlüsselmustern wie *{Suchtext}* gesucht wird. Für große Datensätze ist es besser, die serverseitige Suche zu verwenden. Für kleinere Datensätze ist es besser, den clientseitigen Suchmodus zu verwenden." + ` Wenn die Schlüsselanzahl über ${p3xr.settings.maxLightKeysCount} liegt, können Sie nur serverseitig suchen.`, largeSetInfo: "Bei einem großen Datensatz ist die clientseitige Suche deaktiviert, daher ist derzeit nur die serverseitige Suche möglich.", infoDetails: "Um herauszufinden, wie die Suche funktioniert, überprüfen Sie bitte die Einstellungen" }, pager: { next: "Nächste", prev: "Vorherige", first: "Erste", last: "Letzte" } } }, time: { loading: "Laden...", years: "Jahre", months: "Monate", days: "Tage", year: "Jahr", month: "Monat", day: "Tag" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/el/000077500000000000000000000000001517666434100137535ustar00rootroot00000000000000src/strings/el/strings.js000066400000000000000000001203421517666434100160040ustar00rootroot00000000000000const strings = { error: { cleared_license: "Η άδεια καθαρίστηκε", invalid_license: "Μη έγκυρη άδεια", license_max_devices_reached: "Επιτεύχθηκε ο μέγιστος αριθμός θέσεων συσκευών", license_readonly: "Η άδεια μπορεί να αλλάξει μόνο από το τερματικό του διακομιστή.", server_error: "Σφάλμα διακομιστή, παρακαλώ δοκιμάστε ξανά" }, title: { donate: "Δωρεά", jsonRecursive: "Ανάπτυξη όλων των κλαδιών", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Μπορείτε να επιλέξετε μια σύνδεση Redis από το κάτω αριστερό μενού.", statistics: "Στατιστικά", error: "Σφάλμα", connectingRedis: "Σύνδεση στο Redis ...", socketioConnectError: "Σφάλμα Socket.IO", db: "DB", server: "Διακομιστής", clients: "Πελάτες", memory: "Μνήμη", persistence: "Μονιμότητα", stats: "Στατιστικά", replication: "Αντιγραφή", cpu: "CPU", cluster: "Cluster", modules: "Ενότητες", errorstats: "Στατιστικά σφαλμάτων", commandstats: "Στατιστικά εντολών", latencystats: "Στατιστικά καθυστέρησης", keysizes: "Μεγέθη κλειδιών", threads: "Νήματα", }, confirm: { dropIndex: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το ευρετήριο;", uploadBuffer: "Είστε σίγουροι ότι θέλετε να ανεβάσετε αυτά τα δυαδικά δεδομένα;", uploadBufferDone: "Τα δυαδικά δεδομένα ανέβηκαν", uploadBufferDoneAndSave: "Τα δυαδικά δεδομένα ανέβηκαν και αποθηκεύτηκαν στον διακομιστή", title: "Επιβεβαίωση", alert: "Ειδοποίηση", info: "Πληροφορίες", deleteListItem: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το στοιχείο λίστας;", deleteHashKey: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το κλειδί hash;", deleteStreamTimestamp: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη χρονοσήμανση ροής;", deleteSetMember: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μέλος συνόλου;", deleteZSetMember: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μέλος ταξινομημένου συνόλου;", deleteConnection: "Επιβεβαίωση", deleteConnectionText: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη σύνδεση Redis;", deleteNode: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν τον κόμβο Redis;", deleteAllKeys: opts => { return `Διαγραφή αυτού του δέντρου και όλων των κλειδιών του (${opts.key});`; }, socketioConnectError: "Το Socket.IO δεν μπορεί να συνδεθεί στον διακομιστή, μπορείτε να κάνετε επαναφόρτωση και να προσπαθήσετε να επιλύσετε το σφάλμα σύνδεσης μόνοι σας, ο πελάτης δεν γνωρίζει πώς να το λύσει μόνος του.", socketioAuthRequired: "Απαιτείται εξουσιοδότηση Socket.IO. Παρακαλώ πιστοποιηθείτε με HTTP Basic Auth (όνομα χρήστη/κωδικό πρόσβασης) και κάντε επαναφόρτωση.", deleteKey: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το κλειδί;", rename: { title: "Είστε σίγουροι ότι θέλετε να μετονομάσετε αυτό το κλειδί;", textContent: "Αυτή η ενέργεια μετονομάζει το κλειδί μόνιμα.", placeholder: "Το κλειδί Redis (υποχρεωτικό)" }, ttl: { title: "Είστε σίγουροι ότι θέλετε να αλλάξετε το TTL αυτού του κλειδιού;", textContent: "Η αλλαγή του TTL ενημερώνει τον χρόνο ζωής αυτού του κλειδιού. Αφήστε κενό για να διατηρήσετε αυτό το κλειδί για πάντα.", placeholder: "Το TTL του κλειδιού Redis (ακέραιος ή κενό)", placeholderPlaceholder: "Κενό σημαίνει ότι παραμένει για πάντα· διαφορετικά εισάγετε έναν ακέραιο.", convertTextToTime: "Μετατροπή κειμένου σε χρόνο", convertTextToTimePlaceholder: "Π.χ. 1d θα γίνει 86400" }, license: { title: "Ορισμός άδειας", textContent: "Αν θέλετε να χρησιμοποιήσετε λειτουργίες επί πληρωμή, παρακαλώ επικοινωνήστε με support@corifeus.com για να ζητήσετε άδεια. Οι τιμές είναι Pro 400 HUF/μήνα (€1/μήνα) ή 4.000 HUF/έτος (€10/έτος) και Enterprise 1.200 HUF/μήνα (€3/μήνα) ή 12.000 HUF/έτος (€30/έτος). Η ετήσια τιμή είναι 10x η μηνιαία. Με 27% ΦΠΑ, τα σύνολα είναι Pro 500 HUF/μήνα (€1,27/μήνα) ή 5.100 HUF/έτος (€12,70/έτος), Enterprise 1.500 HUF/μήνα (€3,81/μήνα) ή 15.200 HUF/έτος (€38,10/έτος). Η επαλήθευση άδειας απαιτεί πρόσβαση στο διαδίκτυο. Η προεπιλεγμένη άδεια περιλαμβάνει 5 θέσεις. Αν χρειάζεστε περισσότερες θέσεις, επικοινωνήστε μαζί μας στο support@corifeus.com.", placeholder: "Κλειδί άδειας" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Αντιγραφή", downloadBuffer: "Λήψη δυαδικών", setBuffer: "Ανέβασμα δυαδικών", exportKeys: "Εξαγωγή κλειδιών", exportAllKeys: (opts) => `Εξαγωγή όλων των ${opts.count} κλειδιών`, exportSearchResults: (opts) => `Εξαγωγή ${opts.count} αποτελεσμάτων`, importKeys: "Εισαγωγή κλειδιών", saveWithFormatJson: "Αποθήκευση με μορφοποίηση", formatJson: "Μορφοποίηση Json", wrap: "Αναδίπλωση", unwrap: "Χωρίς αναδίπλωση", downloadJson: "Λήψη JSON", pubsubMonitor: "Παρακολούθηση PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Γλώσσα / Language", ok: "OK", addKey: "Προσθήκη σε αυτό το κλειδί", addKeyRoot: "Προσθήκη κλειδιού ρίζας", reloadKey: "Επαναφόρτωση κλειδιού", reload: "Επαναφόρτωση", close: "Κλείσιμο", commands: "Εντολές", view: "Προβολή", statistics: "Στατιστικά", refresh: "Ανανέωση", pause: "Παύση", resume: "Συνέχεια", clear: "Εκκαθάριση", rename: "Μετονομασία", main: "Βάση δεδομένων", cancel: "Ακύρωση", theme: "Θέμα", github: "GitHub", githubRepo: "Αποθετήριο", githubRelease: "Εκδόσεις", githubChangelog: "Ιστορικό αλλαγών", info: "Info", settings: "Ρυθμίσεις", connect: "Σύνδεση", disconnect: "Αποσύνδεση", overview: "Επισκόπηση", console: "Κονσόλα", noConnections: "Δεν υπάρχουν συνδέσεις, προσθέστε μια σύνδεση στο μενού ρυθμίσεων.", noConnectionsInSettings: "Δεν υπάρχουν συνδέσεις, μπορείτε να προσθέσετε ΝΕΑ ΣΥΝΔΕΣΗ παραπάνω.", connectionAdd: "Νέα σύνδεση", addGroup: "Προσθήκη ομάδας", extend: "Ανάπτυξη", collapse: "Σύμπτυξη", add: "Προσθήκη", edit: "Επεξεργασία", save: "Αποθήκευση", ttl: "Ορισμός TTL", license: "Ορισμός άδειας", delete: "Διαγραφή", remove: "Αφαίρεση", sure: "Σίγουρα", testConnection: "Δοκιμή σύνδεσης", getKey: "Φόρτωση κλειδιού Redis και σχετικών δεδομένων ...", jsonViewShow: "Εμφάνιση JSON", jsonViewEditor: "Επεξεργασία JSON", quickConsole: "Γρήγορη κονσόλα" }, label: { id: { nodeId: 'ID κόμβου', id: "ID σύνδεσης", info: "Αν δεν θέλετε να αλλάξετε τις ιδιότητες: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, παρακαλώ εισάγετε το ID της σύνδεσης σε αυτές τις ιδιότητες για να διατηρήσετε τις τιμές ανέπαφες. Αν θέλετε την ίδια λογική στον κωδικό πρόσβασης κόμβου, εισάγετε το ID κόμβου στον κωδικό πρόσβασης κόμβου." }, secureFeature: 'Αν βλέπετε μια τιμή που αρχίζει με P3X και μοιάζει η ίδια, πρόκειται για δυνατότητα ασφαλείας. Για να αλλάξετε τις ρυθμίσεις, απλά αντικαταστήστε αυτές τις ρυθμίσεις με κενό ή κάτι άλλο και θα αποθηκευτούν. Αν δεν αλλάξετε τις ρυθμίσεις, θα διατηρηθούν ως έχουν στον διακομιστή.', ssh: { on: 'SSH ενεργό', off: 'SSH ανενεργό', sshHost: 'SSH Host', sshPort: 'SSH θύρα', sshUsername: 'SSH όνομα χρήστη', sshPassword: 'SSH κωδικός πρόσβασης', sshPrivateKey: 'SSH ιδιωτικό κλειδί' }, isBuffer: opts => `[object ArrayBuffer] σημαίνει ότι η τιμή είναι δυαδικά δεδομένα ή η τιμή είναι μεγαλύτερη από ${opts.maxValueAsBuffer}`, streamValue: `Το πεδίο και η τιμή ροής είναι σε μία γραμμή. Π.χ.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' σημαίνει αυτόματη δημιουργία ή η προδιαγραφή ως -`, unableToLoadKey: ({ key }) => { return `Αδυναμία φόρτωσης αυτού του κλειδιού: ${key}. Πιθανόν, το κλειδί διαγράφηκε. Το ακριβές σφάλμα βρίσκεται στην κονσόλα.`; }, bigJson: "Αυτό το αντικείμενο JSON ξεπερνά τα 10 kb, οπότε βεβαιωθείτε ότι ξέρετε τι κάνετε, γιατί ορισμένες λειτουργίες μπορεί να αποδίδουν αργά.", addNode: "Προσθήκη κόμβου", validateJson: "Επικύρωση JSON", reducedFunction: `Μειωμένη λειτουργικότητα`, tooManyKeys: opts => { return `Για τις πλήρεις μέγιστες λειτουργίες, ο επιτρεπόμενος αριθμός κλειδιών είναι ${opts.maxLightKeysCount}. Αυτή η βάση δεδομένων έχει περισσότερα κλειδιά από τα επιτρεπόμενα: ${opts.count}. Η ταξινόμηση κλειδιών και οι πρόσθετες πληροφορίες δέντρου είναι απενεργοποιημένες. Η αναζήτηση γίνεται μόνο στον διακομιστή αντί στον πελάτη.`; }, redisCommandNotFound: "Δεν βρέθηκε αντιστοίχιση εντολής Redis ...", treeKeyStore: `Η ταξινόμηση (φυσική σύγκριση) εκτελείται στον πελάτη δηλαδή τον περιηγητή, πράγμα που σημαίνει ότι υπάρχει ποινή για μεγάλα σύνολα, όπως πάνω από 10k κλειδιά, μπορεί να προσθέσει λίγο χρόνο στην απόδοση της σελίδας. Δεν υπάρχει ταξινόμηση κλειδιών στο Redis, μόνο με αυτόν τον τρόπο.`, socketIoTimeout: options => { return `Το Socket.IO εξάντλησε τον χρόνο αναμονής για αυτό το αίτημα (μέγ. ${options.timeout / 1000} δευτερόλεπτα) ...`; }, resizerInfo: options => { return `Το ελάχιστο πλάτος αριστερού ή δεξιού πάνελ είναι ${options.width}px`; }, jsonViewNotParsable: "Αυτή η τιμή δεν μπορεί να αναλυθεί ως JSON ", ttlTitle: "Ορίστε το TTL σε δευτερόλεπτα", passwordSecure: "Ο κωδικός πρόσβασης μπορεί να είναι κενός, αλλά θα εμφανίζει χαρακτήρες, αυτή είναι μια δυνατότητα ασφαλείας.", tlsWithoutCert: "Ενεργοποίηση TLS χωρίς πρόσθετο πιστοποιητικό", tlsRejectUnauthorized: "Απόρριψη μη εξουσιοδοτημένου πιστοποιητικού", tlsSecure: "Αν βλέπετε μια ρύθμιση TLS που αρχίζει με P3X ή όλες οι ρυθμίσεις TLS μοιάζουν ίδιες, πρόκειται για δυνατότητα ασφαλείας. Για να αλλάξετε τις ρυθμίσεις, απλά αντικαταστήστε τες με κενό ή κάτι άλλο και θα αποθηκευτούν. Αν δεν αλλάξετε τις ρυθμίσεις TLS, θα διατηρηθούν ως έχουν στον διακομιστή.", treeSeparatorEmpty: "Αν ο διαχωριστής δέντρου είναι κενός, το δέντρο δεν θα έχει ένθετους κόμβους, μόνο μια απλή λίστα", treeSeparatorEmptyNote: "Χωρίς ένθετους κόμβους, μόνο μια απλή λίστα", welcomeConsole: "Καλώς ήλθατε στην κονσόλα Redis", welcomeConsoleInfo: "Το ιστορικό με τα βέλη ΠΑΝΩ ή ΚΑΤΩ είναι ενεργοποιημένο", redisListIndexInfo: "Κενό για προσάρτηση, -1 για εισαγωγή στην αρχή ή αποθηκεύστε στη θέση που εμφανίζεται.", console: "Κονσόλα", connectiondAdd: "Προσθήκη σύνδεσης", connectiondEdit: "Επεξεργασία σύνδεσης", connectiondView: "Προβολή σύνδεσης", connections: "Συνδέσεις", licenseInfo: "Άδεια", licenseEditable: "Επεξεργάσιμη άδεια", licenseEditableYes: "Ναι", licenseEditableNo: "Όχι", licenseTerminalOnly: "Η άδεια μπορεί να ρυθμιστεί μόνο από το τερματικό του διακομιστή.", licenseTierPolicyTitle: "Πολιτική επιπέδων", licenseTierPolicyText: "

Δωρεάν

μόνο βασικό Redis UI· χωρίς SSH tunneling, χωρίς λειτουργία σύνδεσης μόνο ανάγνωσης, χωρίς Cluster/Sentinel, χωρίς Επεξεργασία JSON/Ανέβασμα δυαδικών/Λήψη δυαδικών, χωρίς ReJSON.
Τιμή: 0 HUF/μήνα (€0/μήνα).

Pro

SSH tunneling, λειτουργία σύνδεσης μόνο ανάγνωσης (συμπεριλαμβανομένου --readonly-connections/-r), Επεξεργασία JSON, Ανέβασμα δυαδικών, Λήψη δυαδικών, ReJSON.
Βασική τιμή: 400 HUF/μήνα (€1/μήνα) ή 4.000 HUF/έτος (€10/έτος).
Σύνολο με 27% ΦΠΑ: 500 HUF/μήνα (€1,27/μήνα) ή 5.100 HUF/έτος (€12,70/έτος).

Enterprise

SSH tunneling, Cluster και Sentinel, καθώς και Επεξεργασία JSON, Ανέβασμα δυαδικών, Λήψη δυαδικών, ReJSON· --readonly-connections/-r λειτουργεί επίσης.
Βασική τιμή: 1.200 HUF/μήνα (€3/μήνα) ή 12.000 HUF/έτος (€30/έτος).
Σύνολο με 27% ΦΠΑ: 1.500 HUF/μήνα (€3,81/μήνα) ή 15.200 HUF/έτος (€38,10/έτος).

Ετήσιος κανόνας

Η ετήσια τιμή είναι 10x η μηνιαία τιμή.

Θέσεις

Η προεπιλεγμένη άδεια περιλαμβάνει 5 θέσεις. Αν χρειάζεστε περισσότερες θέσεις, επικοινωνήστε μαζί μας στο support@corifeus.com.

Δοκιμή Enterprise

10 ημέρες δωρεάν για οποιονδήποτε με πραγματικό υπάρχον email (μη δοκιμαστικό email).

Στοιχεία τιμολόγησης μέσω e-mail

Όνομα, Email τιμολόγησης, Κωδικός χώρας, Ταχυδρομικός κώδικας, Πόλη, Διεύθυνση, ΑΦΜ (προαιρετικά).

Πληρωμή

Η πληρωμή PayPal είναι διαθέσιμη μόνο σε HUF (φιορίνι)· μετά την αποστολή χρημάτων στο https://paypal.me/corifeus θα σας στείλω τιμολόγιο. Όλες οι πληρωμές δεν επιστρέφονται.

ΦΠΑ

Ο ΦΠΑ προστίθεται στην τιμή (27% στην Ουγγαρία).

Επικοινωνία

Αν θέλετε να πείτε γεια ή έχετε ερώτηση, επικοινωνήστε με support@corifeus.com.

Γλώσσα

Η επικοινωνία τιμολογίων και αδειών μέσω email γίνεται στα Αγγλικά. Το νόμισμα τιμολογίων είναι HUF.

Σημείωση

Η επαλήθευση άδειας απαιτεί πρόσβαση στο διαδίκτυο.", licenseState: "Κατάσταση", licenseStateActive: "Ενεργή", licenseStateInactive: "Ανενεργή", licenseStateNoLicense: "Χωρίς άδεια", licenseKeyMasked: "Αποθηκευμένο κλειδί", licenseTier: "Επίπεδο", licenseValid: "Έγκυρη", licenseStatus: "Κατάσταση άδειας", licenseReason: "Αιτία", licenseCheckedAt: "Ελέγχθηκε στις", licenseStartsAt: "Αρχίζει στις", licenseExpiresAt: "Λήγει στις", licenseDaysLeft: "Υπόλοιπες ημέρες", licenseMaxDevices: "Μέγιστες συσκευές", licenseActiveDevices: "Ενεργές συσκευές", licenseActiveDevicesInfo: "Αν μια συσκευή δεν χρησιμοποιείται πλέον, η θέση της απελευθερώνεται αυτόματα μετά από 75 λεπτά.", licenseCustomerEmail: "Email πελάτη", licenseFeatures: "Χαρακτηριστικά", licenseFeaturesEmpty: "Χωρίς επιπλέον χαρακτηριστικά", licenseFeatureReadonlyMode: "Λειτουργία σύνδεσης μόνο ανάγνωσης", licenseFeatureReadonlyConnectionsFlag: "Συνδέσεις μόνο ανάγνωσης (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Συνδέσεις Cluster", licenseFeatureSentinel: "Συνδέσεις Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Ταξινόμηση κλειδιών ενεργή", off: "Ταξινόμηση κλειδιών ανενεργή" }, cluster: { on: "Cluster ενεργό", off: "Cluster ανενεργό" }, sentinel: { on: "Sentinel ενεργό", off: "Sentinel ανενεργό", name: "Όνομα Sentinel" }, readonly: { on: "Μόνο ανάγνωση ενεργό", off: "Μόνο ανάγνωση ανενεργό" }, proSshOnly: "Το SSH είναι διαθέσιμο σε Pro ή Enterprise.", proReadonlyOnly: "Η λειτουργία σύνδεσης μόνο ανάγνωσης είναι διαθέσιμη σε Pro ή Enterprise.", enterpriseClusterSentinelOnly: "Τα Cluster και Sentinel είναι διαθέσιμα μόνο σε Enterprise.", theme: { light: "Φωτεινό", dark: "Σκοτεινό enterprise", darkNeu: "Σκοτεινό", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Συνδεδεμένο: ${opts.name}`; }, tree: "Δέντρο", askAuth: "Ζήτηση εξουσιοδότησης", keyboardShortcuts: "Συντομεύσεις πληκτρολογίου", about: "Σχετικά", supportedLanguages: "Υποστηριζόμενες γλώσσες", version: "Έκδοση", redisVersion: "Έκδοση Redis", modules: "Ενότητες", shortcutRefresh: "Ανανέωση", shortcutSearch: "Εστίαση αναζήτησης", shortcutNewKey: "Νέο κλειδί", shortcutDisconnect: "Αποσύνδεση", themeAuto: "Αυτόματο (σύστημα)", shortcutCommandPalette: "Παλέτα εντολών", commandPalette: "Παλέτα εντολών", noResults: "Κανένα αποτέλεσμα", redisCommandsReference: "Εντολές Redis", ungrouped: "Χωρίς ομάδα", grouped: "Ομαδοποιημένα", connectFirst: "Συνδεθείτε πρώτα σε έναν διακομιστή Redis", searchLanguage: "Αναζήτηση γλώσσας...", exportProgress: "Εξαγωγή κλειδιών...", importProgress: "Εισαγωγή κλειδιών...", importPreview: "Προεπισκόπηση", importOverwrite: "Αντικατάσταση", importSkip: "Παράλειψη", importConflict: "Αν το κλειδί υπάρχει ήδη:", noKeysToExport: "Δεν υπάρχουν κλειδιά για εξαγωγή", time: "Χρόνος", loading: "Φόρτωση...", autoRefresh: "Αυτόματο", exportSearchHint: "Εξαγωγή μόνο κλειδιών που ταιριάζουν με την τρέχουσα αναζήτηση", importSearchHint: "Η εισαγωγή εφαρμόζεται σε ολόκληρη τη βάση δεδομένων, όχι μόνο στα αποτελέσματα αναζήτησης", importNoKeys: "Δεν βρέθηκαν κλειδιά στο αρχείο", }, status: { dataCopied: "Τα δεδομένα βρίσκονται στο πρόχειρο", licenseSaved: "Η άδεια αποθηκεύτηκε", exportDone: "Η εξαγωγή ολοκληρώθηκε", indexCreated: "Ευρετήριο δημιουργήθηκε", indexDropped: "Ευρετήριο διαγράφηκε", importDone: (opts) => `Εισαγωγή ολοκληρώθηκε: ${opts.created} δημιουργήθηκαν, ${opts.skipped} παραλείφθηκαν, ${opts.errors} σφάλματα`, nodeRemoved: "Ο κόμβος αφαιρέθηκε", keyIsNotExisting: "Αυτό το κλειδί μπορεί να έχει διαγραφεί ή να έχει λήξει.", keyCount: opts => { if (opts.keyCount === 0) { return "Κανένα κλειδί"; } else if (opts.keyCount === 1) { return "1 κλειδί"; } else { return `${opts.keyCount} κλειδιά`; } }, treeExpandAll: "Ανάπτυξη όλων των κλαδιών δέντρου. Αυτή η λειτουργία μπορεί να είναι δαπανηρή και μπορεί να πάρει χρόνο ...", noRedisKeys: "Δεν υπάρχουν κλειδιά σε αυτή τη βάση δεδομένων.", redisConnected: "Επιτυχής σύνδεση στο Redis", reloadingDataInfo: "Επαναφόρτωση δεδομένων Redis", added: "Προστέθηκε", saved: "Ενημερώθηκε", cancelled: "Ακυρώθηκε", deleted: "Διαγράφηκε", savedRedis: "Τα δεδομένα Redis αποθηκεύτηκαν", redisDisconnected: opts => { return `Η τρέχουσα σύνδεση είχε σφάλμα: ${opts.error.message}`; }, dbChanged: opts => { return `Ο δείκτης βάσης δεδομένων ορίστηκε σε ${opts.db}. `; }, treeDeleted: opts => { return `Το κλειδί δέντρου διαγράφηκε (${opts.key}).`; }, deletedKey: opts => { return `Το κλειδί διαγράφηκε (${opts.key}).`; }, renamedKey: "Αυτό το κλειδί μετονομάστηκε", ttlChanged: "Το TTL αυτού του κλειδιού άλλαξε", notInteger: "Αυτή η είσοδος δεν είναι ακέραιος αριθμός", persisted: "Αυτό το κλειδί διατηρείται για πάντα", set: "Το κλειδί ορίστηκε/προστέθηκε" }, code: { "delete-connection": "Αυτή η σύνδεση διαγράφηκε, οπότε αποσυνδεθήκατε από αυτή την παρουσία Redis.", "save-connection": "Αυτή η σύνδεση άλλαξε, οπότε αποσυνδεθήκατε από αυτή την παρουσία Redis. Μπορείτε να επανασυνδεθείτε.", "readonly-connections": "Οι λειτουργίες προσθήκης/αποθήκευσης/διαγραφής συνδέσεων είναι μόνο για ανάγνωση!", "readonly-connection-mode": "Αυτή η σύνδεση είναι σε λειτουργία μόνο ανάγνωσης!", "list-out-of-bounds": "Αυτός ο δείκτης λίστας είναι εκτός ορίων", "donation-ware-feature": "Αυτή η δυνατότητα υπάρχει στην έκδοση δωρεάς.", "feature-pro-readonly-required": "Η λειτουργία σύνδεσης μόνο ανάγνωσης απαιτεί άδεια Pro ή Enterprise.", "feature-pro-ssh-required": "Το SSH tunneling απαιτεί άδεια Pro ή Enterprise.", "feature-enterprise-cluster-sentinel-required": "Τα Cluster και Sentinel απαιτούν άδεια Enterprise.", "feature-pro-json-binary-required": "Η Επεξεργασία JSON, το Ανέβασμα δυαδικών και η Λήψη δυαδικών απαιτούν άδεια Pro ή Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Απαιτείται εξουσιοδότηση: παρακαλώ πιστοποιηθείτε με HTTP Basic Auth και κάντε επαναφόρτωση.", "auto-connection-failed": "Πιθανόν, η σύνδεση αφαιρέθηκε και η αυτόματη σύνδεση απέτυχε εξαιτίας αυτού.", invalid_console_command: "Αυτή η εντολή δεν λειτουργεί μέσω του GUI." }, licenseReason: { LICENSE_VALID: "Η άδεια είναι έγκυρη", LICENSE_INVALID: "Η άδεια δεν είναι έγκυρη", LICENSE_MISSING: "Δεν έχει οριστεί κλειδί άδειας", LICENSE_DISABLED: "Η άδεια είναι απενεργοποιημένη στις ρυθμίσεις διακομιστή", LICENSE_NOT_FOUND: "Η άδεια δεν βρέθηκε", LICENSE_EXPIRED: "Η άδεια έχει λήξει", LICENSE_CLEARED: "Το κλειδί άδειας καθαρίστηκε", LICENSE_MAX_DEVICES_REACHED: "Επιτεύχθηκε ο μέγιστος αριθμός θέσεων συσκευών", PRODUCT_MISMATCH: "Το προϊόν της άδειας δεν αντιστοιχεί" }, licenseStatusValue: { active: "Ενεργή", deleted: "Διαγραμμένη", all: "Όλες", expired: "Ληγμένη", missing: "Απούσα", inactive: "Ανενεργή" }, form: { error: { required: "Υποχρεωτικό", port: "Η θύρα πρέπει να είναι μεταξύ 1-65535", invalid: "Η φόρμα δεν είναι έγκυρη" }, connection: { label: { name: "Όνομα", group: "Ομάδα", host: "Όνομα κεντρικού υπολογιστή", port: "Θύρα", password: "Κωδικός πρόσβασης", username: "Όνομα χρήστη" } }, treeSettings: { maxValueDisplay: "Μέγιστο μήκος εμφάνισης τιμής", maxValueDisplayInfo: "Αν οριστεί σε 0, εμφανίζονται πλήρεις τιμές. Αν είναι μεγαλύτερο του 0, περικόπτεται σε αυτό το μήκος. Αν -1: για συμβολοσειρές, η τιμή κρύβεται μέχρι την επεξεργασία· για άλλους τύπους, εμφανίζεται πλήρες περιεχόμενο.", maxKeys: "Μέγιστος αριθμός κλειδιών", maxKeysInfo: "Για να μην κρασάρει το GUI, περιορίζουμε τον μέγιστο αριθμό κλειδιών.", keyCount: () => { return `Αριθμός κλειδιών: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Χρήση κίνησης", noAnimation: "Χωρίς κίνηση", jsonFormatTwoSpace: "Μορφοποίηση JSON με 2 κενά", jsonFormatFourSpace: "Μορφοποίηση JSON με 4 κενά", formName: "Ρυθμίσεις Redis", searchModeClient: "Αναζήτηση στον πελάτη", searchModeServer: "Αναζήτηση στον διακομιστή", searchModeStartsWith: "Αναζήτηση με αρχίζει με", searchModeIncludes: "Αναζήτηση με περιέχει" }, field: { treeSeparator: "Διαχωριστής δέντρου", treeSeparatorSelector: "Επιλογέας διαχωριστή δέντρου", page: "Αριθμός σελιδοποίησης δέντρου", keyPageCount: "Αριθμός σελιδοποίησης κλειδιών", keysSort: "Ταξινόμηση κλειδιών", searchMode: "Λειτουργία αναζήτησης", searchModeStartsWith: "Αναζήτηση αρχίζει με / περιέχει" }, error: { keyPageCount: "Ο αριθμός σελιδοποίησης κλειδιών πρέπει να είναι ακέραιος μεταξύ 5 - 100", page: "Ο αριθμός σελιδοποίησης πρέπει να είναι ακέραιος μεταξύ 10 - 5000", maxValueDisplay: "Η μέγιστη τιμή εμφάνισης πρέπει να είναι ακέραιος μεταξύ -1 και 32768", maxKeys: "Η μέγιστη τιμή αριθμού κλειδιών πρέπει να είναι ακέραιος μεταξύ 100 και 100000" } }, key: { label: { formName: { add: "Προσθήκη νέου κλειδιού Redis", edit: "Επεξεργασία κλειδιού Redis", append: "Προσθήκη σε υπάρχον κλειδί Redis" } }, field: { streamTimestamp: "Χρονοσήμανση", key: "Κλειδί", type: "Τύπος", index: "Δείκτης", hashKey: "Κλειδί hash", score: "Βαθμολογία", value: "Τιμή" }, error: { streamTimestamp: "Η χρονοσήμανση είναι υποχρεωτική, είτε σε μορφή Redis είτε ως *", key: "Το κλειδί πρέπει να έχει τουλάχιστον έναν χαρακτήρα", hashKey: "Το κλειδί hash πρέπει να έχει τουλάχιστον έναν χαρακτήρα", score: "Η βαθμολογία ταξινομημένου συνόλου είναι υποχρεωτική", value: "Η τιμή είναι υποχρεωτική" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Αναζήτηση", index: "Ευρετήριο", query: "Ερώτημα", results: "Αποτελέσματα", noIndex: "Δεν βρέθηκαν ευρετήρια", createIndex: "Δημιουργία ευρετηρίου", dropIndex: "Διαγραφή ευρετηρίου", indexInfo: "Πληροφορίες ευρετηρίου", indexName: "Όνομα ευρετηρίου", prefix: "Πρόθεμα κλειδιού (προαιρετικό)", fieldName: "Όνομα πεδίου", }, monitor: { title: "Παρακολούθηση", memory: "Μνήμη", opsPerSec: "Λειτουργίες/δευτ", clients: "Πελάτες", blocked: "Αποκλεισμένοι", hitsMisses: "Ποσοστό επιτυχίας", networkIo: "Δίκτυο I/O", slowLog: "Αργό αρχείο", totalCommands: "Σύνολο", expired: "Ληγμένα", evicted: "Αποβληθέντα", clientList: "Λίστα πελατών", topKeys: "Μεγαλύτερα κλειδιά", killClient: "Τερματισμός πελάτη", clientKilled: "Ο πελάτης τερματίστηκε", confirmKillClient: "Είστε σίγουροι ότι θέλετε να τερματίσετε αυτόν τον πελάτη;", noKeys: "Χωρίς κλειδιά", noClients: "Χωρίς πελάτες", }, overview: { noConnected: "Δεν υπάρχει σύνδεση στο Redis.", overviewClients: "Λίστα συνδεδεμένων ανά αριθμό πελατών", connectedCount: opt => { if (opt.length === 1) { return "1 πελάτης"; } return `${opt.length} πελάτες`; } }, key: { label: { key: "Κλειδί", encoding: "Κωδικοποίηση", length: "Μέγεθος", ttl: "TTL", ttlTitle: "Χρόνος ζωής", type: "Τύπος", ttlNotExpire: "δεν λήγει", lengthString: "bytes", lengthItem: "στοιχεία", actions: "Ενέργειες" }, list: { table: { index: "Δείκτης", value: "Τιμή" } }, hash: { table: { hashkey: "Κλειδί hash", value: "Τιμή" } }, set: { table: { value: "Μέλος" } }, zset: { table: { value: "Μέλος", score: "Βαθμολογία" } }, stream: { table: { timestamp: "ID χρονοσήμανσης", field: "Πεδίο", value: "Τιμή" } } }, treeControls: { settings: "Ρυθμίσεις δέντρου", expandAll: "Ανάπτυξη όλων", collapseAll: "Σύμπτυξη όλων", search: { search: "Αναζήτηση στα κλειδιά", clear: "Εκκαθάριση τρέχουσας αναζήτησης", placeholderClient: "Αναζήτηση στον πελάτη", placeholderServer: "Αναζήτηση στον διακομιστή", info: "Η αναζήτηση στον πελάτη σημαίνει ότι αντιστοιχίζει το κείμενο στην είσοδο αναζήτησης. Η αναζήτηση στον διακομιστή σημαίνει ότι αναζητά στα μοτίβα κλειδιών ως *{κείμενο-αναζήτησης}*. Για μεγάλα σύνολα αναζήτησης, είναι καλύτερα να χρησιμοποιείτε αναζήτηση στον διακομιστή. Για μικρότερα σύνολα, είναι καλύτερα να χρησιμοποιείτε αναζήτηση στον πελάτη." + ` Αν ο αριθμός κλειδιών ξεπερνά τα ${p3xr.settings.maxLightKeysCount}, μπορείτε να αναζητήσετε μόνο στον διακομιστή.`, largeSetInfo: "Σε μεγάλο σύνολο, η αναζήτηση στον πελάτη είναι απενεργοποιημένη. Αυτή τη στιγμή είναι δυνατή μόνο η αναζήτηση στον διακομιστή.", infoDetails: "Για να μάθετε πώς λειτουργεί η αναζήτηση, ελέγξτε τις ρυθμίσεις" }, pager: { next: "Επόμενο", prev: "Προηγούμενο", first: "Πρώτο", last: "Τελευταίο" } } }, time: { loading: "Φόρτωση...", years: "χρόνια", months: "μήνες", days: "ημέρες", year: "χρόνος", month: "μήνας", day: "ημέρα" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/en/000077500000000000000000000000001517666434100137555ustar00rootroot00000000000000src/strings/en/strings.js000066400000000000000000000643351517666434100160170ustar00rootroot00000000000000const strings = { error: { cleared_license: "Cleared license", invalid_license: "Invalid license", license_max_devices_reached: "Maximum device seats reached", license_readonly: "License can only be changed from the server terminal.", server_error: "Server error, please try again" }, title: { donate: "Donate", jsonRecursive: "Expanding all leaves", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "You may choose a Redis connection to connect from the left bottom menu.", statistics: "Statistics", error: "Error", connectingRedis: "Connecting to Redis ...", socketioConnectError: "Socket.IO Error", db: "DB", server: "Server", clients: "Clients", memory: "Memory", persistence: "Persistence", stats: "Statistics", replication: "Replication", cpu: "CPU", cluster: "Cluster", modules: "Modules", errorstats: "Error Statistics", commandstats: "Command Statistics", latencystats: "Latency Statistics", keysizes: "Key Sizes", threads: "Threads", }, confirm: { dropIndex: "Are you sure to drop this index?", uploadBuffer: "Are you sure to upload this binary data?", uploadBufferDone: "The binary data is uploaded", uploadBufferDoneAndSave: "The binary data is uploaded and saved on the server", title: "Confirm", alert: "Alert", info: "Info", deleteListItem: "Are you sure to delete this list item?", deleteHashKey: "Are you sure to delete this hash key item?", deleteStreamTimestamp: "Are you sure to delete this stream timestamp?", deleteSetMember: "Are you sure to delete this set member?", deleteZSetMember: "Are you sure to delete this sorted set member?", deleteConnection: "Confirm", deleteConnectionText: "Are you sure to delete this Redis connection?", deleteNode: "Are you sure to delete this Redis node?", deleteAllKeys: opts => { return `Delete this tree and all it\'s keys (${opts.key})?`; }, socketioConnectError: "Socket.IO cannot connect to the server, you can reload and try resolve the connection error yourself, the client does not know how to solve it itself.", socketioAuthRequired: "Socket.IO authorization is required. Please authenticate with HTTP Basic Auth (username/password) and reload.", deleteKey: "Are you sure to delete this key?", rename: { title: "Are you sure to rename this key?", textContent: "This action renames the key permanently.", placeholder: "The Redis key (required)" }, ttl: { title: "Are you sure you want to change this key's TTL?", textContent: "Changing the TTL updates this key's time to live. Leave empty to keep this key forever.", placeholder: "The Redis key's TTL (integer or empty)", placeholderPlaceholder: "Empty means it persists forever; otherwise enter an integer.", convertTextToTime: "Convert text to time", convertTextToTimePlaceholder: "Eg. 1d will be 86400" }, license: { title: "Set license", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "License key" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copy", downloadBuffer: "Download binary", setBuffer: "Upload binary", exportKeys: "Export keys", exportAllKeys: (opts) => `Export all ${opts.count} keys`, exportSearchResults: (opts) => `Export ${opts.count} results`, importKeys: "Import keys", saveWithFormatJson: "Save with format", formatJson: "Format Json", wrap: "Wrap", unwrap: "Unwrap", downloadJson: "Download JSON", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Language", ok: "OK", addKey: "Add to this key", addKeyRoot: "Add a root key", reloadKey: "Reload key", reload: "Reload", close: "Close", commands: "Commands", view: "View", statistics: "Statistics", refresh: "Refresh", pause: "Pause", resume: "Resume", clear: "Clear", rename: "Rename", main: "Database", cancel: "Cancel", theme: "Theme", github: "GitHub", githubRepo: "Repository", githubRelease: "Releases", githubChangelog: "Changelog", info: "Info", settings: "Settings", connect: "Connect", disconnect: "Disconnect", overview: "Overview", console: "Console", noConnections: "No connections, add a connection in the settings menu.", noConnectionsInSettings: "No connections, you may add a NEW CONNECTION above.", connectionAdd: "New connection", addGroup: "Add Group", extend: "Extend", collapse: "Collapse", add: "Add", edit: "Edit", save: "Save", ttl: "Set TTL", license: "Set license", delete: "Delete", remove: "Remove", sure: "Sure", testConnection: "Test connection", getKey: "Loading Redis key and associated data ...", jsonViewShow: "Display JSON", jsonViewEditor: "Edit JSON", quickConsole: "Quick Console" }, label: { id: { nodeId: 'Node ID', id: "Connection ID", info: "If you do not wan't to change the properties of: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, please enter the ID of the connection in those propertes to keep the property values intact. If you want the same logic in the node password, then enter the node ID in the node password." }, secureFeature: 'If you see a value that starts with a P3X an look like the same, it is a secure feature. To change the settings, just replace these settings with empty or something else and they will be saved. If you do not change the settings, the settings will be kept as they are on the server.', ssh: { on: 'SSH on', off: 'SSH off', sshHost: 'SSH Host', sshPort: 'SSH port', sshUsername: 'SSH username', sshPassword: 'SSH password', sshPrivateKey: 'SSH private key' }, isBuffer: opts => `[object ArrayBuffer] means that the value is binary data or the value is bigger than ${opts.maxValueAsBuffer}`, streamValue: `Stream field and value is a oneliner. Eg.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' means auto generated or the specification as -`, unableToLoadKey: ({ key }) => { return `Unable to load this key: ${key}. Possible, the key was deleted. The exact error is in the console.`; }, bigJson: "This JSON object is over 10 kb, so make sure you know what you doing, because some functions can be slow rendering.", addNode: "Add node", validateJson: "Validate JSON", reducedFunction: `Reduced functionality`, tooManyKeys: opts => { return `For the full maximum functions allowed keys total is ${opts.maxLightKeysCount} count. This database has over the allowed keys in total ${opts.count}. The key sorting and the additional fancy tree information is disabled. The searching is happening only on the server instead the client search.`; }, redisCommandNotFound: "No Redis command match found ...", treeKeyStore: `The sorting (natural compare) is executed on the client aka the browser, which means it has a penalty for big large sets, like over 10k keys, it might add a little time to the page rendering. There is no key sorting in Redis, only like this.`, socketIoTimeout: options => { return `The Socket.IO timed out for this request (max ${options.timeout / 1000} seconds) ...`; }, resizerInfo: options => { return `Left or right panel minimum width is ${options.width}px`; }, jsonViewNotParsable: "This value is not JSON parsable ", ttlTitle: "Set the TTL in seconds", passwordSecure: "The password might will be empty, but still it will show characters, this is a security feature.", tlsWithoutCert: "Enable TLS without additional certificate", tlsRejectUnauthorized: "Reject unauthorized certificate", tlsSecure: "If you see a TLS configuration that starts with a P3X or all the TLS settings look like the same, it is a secure feature. To change the settings, just replace these settings with empty or something else and they will be saved. If you do not change the TLS settings, the settings will be kept as they are on the server.", treeSeparatorEmpty: "If the tree separator is empty, the tree wil have no nested nodes, just a pure list", treeSeparatorEmptyNote: "No nested nodes, just a pure list", welcomeConsole: "Welcome to the Redis Console", welcomeConsoleInfo: "Cursor UP or DOWN history is enabled", redisListIndexInfo: "Empty to append, -1 to prepend or save it to the position shown.", console: "Console", connectiondAdd: "Add connection", connectiondEdit: "Edit connection", connectiondView: "View connection", connections: "Connections", licenseInfo: "License", licenseEditable: "License editable", licenseEditableYes: "Yes", licenseEditableNo: "No", licenseTerminalOnly: "License can only be configured from the server terminal.", licenseTierPolicyTitle: "Tier policy", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "State", licenseStateActive: "Active", licenseStateInactive: "Inactive", licenseStateNoLicense: "No license", licenseKeyMasked: "Saved key", licenseTier: "Tier", licenseValid: "Valid", licenseStatus: "License status", licenseReason: "Reason", licenseCheckedAt: "Checked at", licenseStartsAt: "Starts at", licenseExpiresAt: "Expires at", licenseDaysLeft: "Days left", licenseMaxDevices: "Max devices", licenseActiveDevices: "Active devices", licenseActiveDevicesInfo: "If a device is no longer used, its seat is released automatically after 75 minutes.", licenseCustomerEmail: "Customer email", licenseFeatures: "Features", licenseFeaturesEmpty: "No extra features", licenseFeatureReadonlyMode: "Readonly connection mode", licenseFeatureReadonlyConnectionsFlag: "Readonly connections (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Cluster connections", licenseFeatureSentinel: "Sentinel connections", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Key sorting on", off: "Key sorting off" }, cluster: { on: "Cluster on", off: "Cluster off" }, sentinel: { on: "Sentinel on", off: "Sentinel off", name: "Sentinel name" }, readonly: { on: "Readonly on", off: "Readonly off" }, proSshOnly: "SSH is available in Pro or Enterprise.", proReadonlyOnly: "Readonly connection mode is available in Pro or Enterprise.", enterpriseClusterSentinelOnly: "Cluster and Sentinel are available in Enterprise only.", theme: { light: "Light", dark: "Dark enterprise", darkNeu: "Dark", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Connected: ${opts.name}`; }, tree: "Tree", askAuth: "Ask for authorization", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Modules", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Disconnect", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Commands", connectFirst: "Connect to a Redis server first", ungrouped: "Ungrouped", grouped: "Grouped", searchLanguage: "Search language...", exportProgress: "Exporting keys...", importProgress: "Importing keys...", importPreview: "Preview", importOverwrite: "Overwrite", importSkip: "Skip", importConflict: "If key already exists:", noKeysToExport: "No keys to export", type: "Type", time: "Time", loading: "Loading...", autoRefresh: "Auto", importNoKeys: "No keys found in file", exportSearchHint: "Exporting only keys matching current search", importSearchHint: "Import applies to the full database, not just search results", }, status: { dataCopied: "The data is in the clipboard", licenseSaved: "License saved", exportDone: "Export complete", indexCreated: "Index created", indexDropped: "Index dropped", importDone: (opts) => `Import complete: ${opts.created} created, ${opts.skipped} skipped, ${opts.errors} errors`, nodeRemoved: "Node removed", keyIsNotExisting: "This key could have been deleted or expired.", keyCount: opts => { if (opts.keyCount === 0) { return "No key"; } else if (opts.keyCount === 1) { return "1 key"; } else { return `${opts.keyCount} keys`; } }, treeExpandAll: "Expand all tree leaves. This operation can be expensive and may take time ...", noRedisKeys: "There are no keys in this database.", redisConnected: "Redis connected successful", reloadingDataInfo: "Reloading Redis data info", added: "Added", saved: "Updated", cancelled: "Cancelled", deleted: "Deleted", savedRedis: "Redis data is saved", redisDisconnected: opts => { return `The current connection had an error: ${opts.error.message}`; }, dbChanged: opts => { return `The db index set to ${opts.db}. `; }, treeDeleted: opts => { return `The tree key was deleted (${opts.key}).`; }, deletedKey: opts => { return `The key was deleted (${opts.key}).`; }, renamedKey: "This key has been renamed", ttlChanged: "This key's TTL has been changed", notInteger: "This input is not an integer", persisted: "This key is persisted forever", set: "The key is set/added" }, code: { "delete-connection": "This connection was deleted, so you are disconnected to this Redis instance.", "save-connection": "This connection was changed, so you are disconnected to this Redis instance. You may re-connect.", "readonly-connections": "Connections add/save/delete are readonly only!", "readonly-connection-mode": "This connection is read only mode!", "list-out-of-bounds": "This list index is out of bounds", "donation-ware-feature": "This feature is present in the donation version.", "feature-pro-readonly-required": "Readonly connection mode requires Pro or Enterprise license.", "feature-pro-ssh-required": "SSH tunneling requires Pro or Enterprise license.", "feature-enterprise-cluster-sentinel-required": "Cluster and Sentinel require Enterprise license.", "feature-pro-json-binary-required": "Edit JSON, Upload binary and Download binary require Pro or Enterprise license.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Authorization required: please authenticate with HTTP Basic Auth and reload.", "auto-connection-failed": "Possible, the connection was removed and the auto connection failed, because of this.", invalid_console_command: "This command is not working via the GUI." }, licenseReason: { LICENSE_VALID: "License is valid", LICENSE_INVALID: "License is invalid", LICENSE_MISSING: "No license key is set", LICENSE_DISABLED: "License is disabled in server config", LICENSE_NOT_FOUND: "License was not found", LICENSE_EXPIRED: "License is expired", LICENSE_CLEARED: "License key was cleared", LICENSE_MAX_DEVICES_REACHED: "Maximum device seats reached", PRODUCT_MISMATCH: "License product does not match" }, licenseStatusValue: { active: "Active", deleted: "Deleted", all: "All", expired: "Expired", missing: "Missing", inactive: "Inactive" }, form: { error: { required: "Required", port: "The port is between 1-65535", invalid: "The form is invalid" }, connection: { label: { name: "Name", group: "Group", host: "Hostname", port: "Port", password: "Password", username: "Username" } }, treeSettings: { maxValueDisplay: "Max value display string length", maxValueDisplayInfo: "If set to 0, show full values. If greater than 0, truncate to this length. If -1: for strings, hide the value until edit; for other types, show full content.", maxKeys: "The max key count", maxKeysInfo: "So that the GUI does not crash, we limit the max key count.", keyCount: () => { return `Number of keys: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Use animation", noAnimation: "No animation", jsonFormatTwoSpace: "Format JSON with 2 spaces", jsonFormatFourSpace: "Format JSON with 4 spaces", formName: "Redis settings", searchModeClient: "Client search mode", searchModeServer: "Server search mode", searchModeStartsWith: "Search with starts with mode", searchModeIncludes: "Search includes mode" }, field: { treeSeparator: "Tree separator", treeSeparatorSelector: "Tree separator selector", page: "Tree paging count", keyPageCount: "Key paging count", keysSort: "Sort the keys", searchMode: "Search mode", searchModeStartsWith: "Search starts with / includes" }, error: { keyPageCount: "The key page count must be an integer between 5 - 100", page: "The page count must be an integer between 10 - 5000", maxValueDisplay: "The maximum display value must be an integer between -1 and 32768", maxKeys: "The maximum key count value must be an integer between 100 and 100000" } }, key: { label: { formName: { add: "Add new Redis key", edit: "Edit Redis key", append: "Add to existing Redis key" } }, field: { streamTimestamp: "Timestamp", key: "Key", type: "Type", index: "Index", hashKey: "Hash key", score: "Score", value: "Value" }, error: { streamTimestamp: "The timestamp is required, either Redis format or as *", key: "The key is, at least, one character", hashKey: "The hash table key is at least one character", score: "The sorted set score is required", value: "The value is required" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Search", index: "Index", query: "Query", results: "Results", noIndex: "No indexes found", createIndex: "Create Index", dropIndex: "Drop Index", indexInfo: "Index Info", indexName: "Index Name", prefix: "Key Prefix (optional)", fieldName: "Field Name", }, monitor: { title: "Monitoring", memory: "Memory", opsPerSec: "Ops/sec", clients: "Clients", blocked: "Blocked", hitsMisses: "Hit Rate", networkIo: "Network I/O", slowLog: "Slow Log", totalCommands: "Total", expired: "Expired", evicted: "Evicted", clientList: "Client List", topKeys: "Top Keys by Memory", killClient: "Kill client", clientKilled: "Client killed", confirmKillClient: "Are you sure to kill this client?", noKeys: "No keys", noClients: "No clients", }, overview: { noConnected: "There is no connection to Redis.", overviewClients: "List the connected by the count of clients", connectedCount: opt => { if (opt.length === 1) { return "1 client"; } return `${opt.length} clients`; } }, key: { label: { key: "Key", encoding: "Encoding", length: "Size", ttl: "TTL", ttlTitle: "Time To Live", type: "Type", ttlNotExpire: "does not expire", lengthString: "bytes", lengthItem: "items", actions: "Actions" }, list: { table: { index: "Index", value: "Value" } }, hash: { table: { hashkey: "Hashkey", value: "Value" } }, set: { table: { value: "Member" } }, zset: { table: { value: "Member", score: "Score" } }, stream: { table: { timestamp: "Timestamp ID", field: "Field", value: "Value" } } }, treeControls: { settings: "Tree settings", expandAll: "Expand all", collapseAll: "Collapse all", search: { search: "Search in the keys", clear: "Clear current search to set empty", placeholderClient: "Search client side", placeholderServer: "Search server side", info: "The client side search means, that it matches the text in the search input. The server side search means, that is it like search in the keys patterns as *{search-text}*. For large search sets, it is better to use server side searching. For smaller search sets, it is better to use client side search mode." + ` If the keys count is over ${p3xr.settings.maxLightKeysCount}, you can only search on server side.`, largeSetInfo: "In a large set, client side searching is disabled. so right now only server side searching is possible.", infoDetails: "To find out how the search works, please check out the settings" }, pager: { next: "Next", prev: "Previous", first: "First", last: "Last" } } }, time: { years: "years", months: "months", days: "days", year: "year", month: "month", day: "day" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/es/000077500000000000000000000000001517666434100137625ustar00rootroot00000000000000src/strings/es/strings.js000066400000000000000000000713241517666434100160200ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licencia eliminada", invalid_license: "Licencia no válida", license_max_devices_reached: "Se alcanzó el número máximo de puestos de dispositivos", license_readonly: "La licencia solo puede cambiarse desde la terminal del servidor.", server_error: "Error del servidor, por favor inténtelo de nuevo" }, title: { donate: "Donar", jsonRecursive: "Expandiendo todas las hojas", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Puede elegir una conexión Redis desde el menú inferior izquierdo.", statistics: "Estadísticas", error: "Error", connectingRedis: "Conectando a Redis ...", socketioConnectError: "Error de Socket.IO", db: "DB", server: "Servidor", clients: "Clientes", memory: "Memoria", persistence: "Persistencia", stats: "Estadísticas", replication: "Replicación", cpu: "CPU", cluster: "Cluster", modules: "Módulos", errorstats: "Estadísticas de errores", commandstats: "Estadísticas de comandos", latencystats: "Estadísticas de latencia", keysizes: "Tamaños de claves", threads: "Hilos", }, confirm: { dropIndex: "¿Está seguro de eliminar este índice?", uploadBuffer: "¿Está seguro de que desea subir estos datos binarios?", uploadBufferDone: "Los datos binarios se han subido", uploadBufferDoneAndSave: "Los datos binarios se han subido y guardado en el servidor", title: "Confirmar", alert: "Alerta", info: "Información", deleteListItem: "¿Está seguro de que desea eliminar este elemento de la lista?", deleteHashKey: "¿Está seguro de que desea eliminar esta clave hash?", deleteStreamTimestamp: "¿Está seguro de que desea eliminar esta marca de tiempo del stream?", deleteSetMember: "¿Está seguro de que desea eliminar este miembro del conjunto?", deleteZSetMember: "¿Está seguro de que desea eliminar este miembro del conjunto ordenado?", deleteConnection: "Confirmar", deleteConnectionText: "¿Está seguro de que desea eliminar esta conexión Redis?", deleteNode: "¿Está seguro de que desea eliminar este nodo Redis?", deleteAllKeys: opts => { return `¿Eliminar este árbol y todas sus claves (${opts.key})?`; }, socketioConnectError: "Socket.IO no puede conectarse al servidor. Puede recargar e intentar resolver el error de conexión usted mismo, el cliente no sabe cómo resolverlo por sí solo.", socketioAuthRequired: "Se requiere autorización de Socket.IO. Por favor autentíquese con HTTP Basic Auth (usuario/contraseña) y recargue.", deleteKey: "¿Está seguro de que desea eliminar esta clave?", rename: { title: "¿Está seguro de que desea renombrar esta clave?", textContent: "Esta acción renombra la clave de forma permanente.", placeholder: "La clave Redis (obligatorio)" }, ttl: { title: "¿Está seguro de que desea cambiar el TTL de esta clave?", textContent: "Cambiar el TTL actualiza el tiempo de vida de esta clave. Deje vacío para mantener esta clave para siempre.", placeholder: "El TTL de la clave Redis (entero o vacío)", placeholderPlaceholder: "Vacío significa que persiste para siempre; de lo contrario ingrese un entero.", convertTextToTime: "Convertir texto a tiempo", convertTextToTimePlaceholder: "Ej. 1d será 86400" }, license: { title: "Establecer licencia", textContent: "Si desea utilizar funciones de pago, contacte con support@corifeus.com para solicitar una licencia. Los precios son Pro 400 HUF/mes (€1/mes) o 4.000 HUF/año (€10/año), y Enterprise 1.200 HUF/mes (€3/mes) o 12.000 HUF/año (€30/año). El precio anual es 10x el mensual. Con 27% IVA, los totales son Pro 500 HUF/mes (€1,27/mes) o 5.100 HUF/año (€12,70/año), Enterprise 1.500 HUF/mes (€3,81/mes) o 15.200 HUF/año (€38,10/año). La validación de licencia requiere acceso a Internet. La licencia predeterminada incluye 5 puestos. Si necesita más puestos, contáctenos en support@corifeus.com.", placeholder: "Clave de licencia" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copiar", downloadBuffer: "Descargar binario", setBuffer: "Subir binario", exportKeys: "Exportar claves", exportAllKeys: (opts) => `Exportar las ${opts.count} claves`, exportSearchResults: (opts) => `Exportar ${opts.count} resultados`, importKeys: "Importar claves", saveWithFormatJson: "Guardar con formato", formatJson: "Formatear Json", wrap: "Ajustar", unwrap: "No ajustar", downloadJson: "Descargar JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Idioma / Language", ok: "OK", addKey: "Agregar a esta clave", addKeyRoot: "Agregar una clave raíz", reloadKey: "Recargar clave", reload: "Recargar", close: "Cerrar", commands: "Comandos", view: "Ver", statistics: "Estadísticas", refresh: "Actualizar", pause: "Pausar", resume: "Reanudar", clear: "Limpiar", rename: "Renombrar", main: "Base de datos", cancel: "Cancelar", theme: "Tema", github: "GitHub", githubRepo: "Repositorio", githubRelease: "Versiones", githubChangelog: "Registro de cambios", info: "Info", settings: "Configuración", connect: "Conectar", disconnect: "Desconectar", overview: "Vista general", console: "Consola", noConnections: "No hay conexiones, agregue una conexión en el menú de configuración.", noConnectionsInSettings: "No hay conexiones, puede agregar una NUEVA CONEXIÓN arriba.", connectionAdd: "Nueva conexión", addGroup: "Añadir grupo", extend: "Expandir", collapse: "Colapsar", add: "Agregar", edit: "Editar", save: "Guardar", ttl: "Establecer TTL", license: "Establecer licencia", delete: "Eliminar", remove: "Quitar", sure: "Seguro", testConnection: "Probar conexión", getKey: "Cargando clave Redis y datos asociados ...", jsonViewShow: "Mostrar JSON", jsonViewEditor: "Editar JSON", quickConsole: "Consola rápida" }, label: { id: { nodeId: 'ID de nodo', id: "ID de conexión", info: "Si no desea cambiar las propiedades de: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, por favor ingrese el ID de la conexión en esas propiedades para mantener los valores intactos. Si desea la misma lógica en la contraseña del nodo, ingrese el ID del nodo en la contraseña del nodo." }, secureFeature: 'Si ve un valor que comienza con P3X y parece el mismo, es una característica de seguridad. Para cambiar la configuración, simplemente reemplace estos ajustes con vacío u otra cosa y se guardarán. Si no cambia la configuración, se mantendrá como está en el servidor.', ssh: { on: 'SSH activado', off: 'SSH desactivado', sshHost: 'SSH Host', sshPort: 'Puerto SSH', sshUsername: 'Nombre de usuario SSH', sshPassword: 'Contraseña SSH', sshPrivateKey: 'Clave privada SSH' }, isBuffer: opts => `[object ArrayBuffer] significa que el valor es datos binarios o el valor es mayor que ${opts.maxValueAsBuffer}`, streamValue: `El campo y valor del stream van en una línea. Ej.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' significa generado automáticamente o la especificación como -`, unableToLoadKey: ({ key }) => { return `No se pudo cargar esta clave: ${key}. Es posible que la clave haya sido eliminada. El error exacto está en la consola.`; }, bigJson: "Este objeto JSON supera los 10 kb, así que asegúrese de saber lo que está haciendo, porque algunas funciones pueden renderizar lentamente.", addNode: "Agregar nodo", validateJson: "Validar JSON", reducedFunction: `Funcionalidad reducida`, tooManyKeys: opts => { return `Para las funciones máximas completas, el total de claves permitidas es ${opts.maxLightKeysCount}. Esta base de datos tiene más claves de las permitidas: ${opts.count}. La ordenación de claves y la información adicional del árbol están deshabilitadas. La búsqueda se realiza solo en el servidor en lugar del cliente.`; }, redisCommandNotFound: "No se encontró coincidencia con el comando Redis ...", treeKeyStore: `La ordenación (comparación natural) se ejecuta en el cliente, es decir, el navegador, lo que significa que tiene una penalización para conjuntos grandes, como más de 10k claves, puede agregar un poco de tiempo al renderizado de la página. No hay ordenación de claves en Redis, solo de esta manera.`, socketIoTimeout: options => { return `Socket.IO agotó el tiempo de espera para esta solicitud (máx. ${options.timeout / 1000} segundos) ...`; }, resizerInfo: options => { return `El ancho mínimo del panel izquierdo o derecho es ${options.width}px`; }, jsonViewNotParsable: "Este valor no se puede analizar como JSON ", ttlTitle: "Establezca el TTL en segundos", passwordSecure: "La contraseña puede estar vacía, pero aún mostrará caracteres, esto es una característica de seguridad.", tlsWithoutCert: "Habilitar TLS sin certificado adicional", tlsRejectUnauthorized: "Rechazar certificado no autorizado", tlsSecure: "Si ve una configuración TLS que comienza con P3X o todas las configuraciones TLS se ven iguales, es una característica de seguridad. Para cambiar la configuración, simplemente reemplace estos ajustes con vacío u otra cosa y se guardarán. Si no cambia la configuración TLS, se mantendrá como está en el servidor.", treeSeparatorEmpty: "Si el separador del árbol está vacío, el árbol no tendrá nodos anidados, solo una lista simple", treeSeparatorEmptyNote: "Sin nodos anidados, solo una lista simple", welcomeConsole: "Bienvenido a la consola Redis", welcomeConsoleInfo: "El historial con cursor ARRIBA o ABAJO está habilitado", redisListIndexInfo: "Vacío para agregar al final, -1 para agregar al inicio o guardar en la posición mostrada.", console: "Consola", connectiondAdd: "Agregar conexión", connectiondEdit: "Editar conexión", connectiondView: "Ver conexión", connections: "Conexiones", licenseInfo: "Licencia", licenseEditable: "Licencia editable", licenseEditableYes: "Sí", licenseEditableNo: "No", licenseTerminalOnly: "La licencia solo puede configurarse desde la terminal del servidor.", licenseTierPolicyTitle: "Política de niveles", licenseTierPolicyText: "

Gratis

solo Redis UI básico; sin SSH tunneling, sin modo de conexión de solo lectura, sin Cluster/Sentinel, sin Editar JSON/Subir binario/Descargar binario, sin ReJSON.
Precio: 0 HUF/mes (€0/mes).

Pro

SSH tunneling, modo de conexión de solo lectura (incluyendo --readonly-connections/-r), Editar JSON, Subir binario, Descargar binario, ReJSON.
Precio base: 400 HUF/mes (€1/mes) o 4.000 HUF/año (€10/año).
Total con 27% IVA: 500 HUF/mes (€1,27/mes) o 5.100 HUF/año (€12,70/año).

Enterprise

SSH tunneling, Cluster y Sentinel, además de Editar JSON, Subir binario, Descargar binario, ReJSON; --readonly-connections/-r también funciona.
Precio base: 1.200 HUF/mes (€3/mes) o 12.000 HUF/año (€30/año).
Total con 27% IVA: 1.500 HUF/mes (€3,81/mes) o 15.200 HUF/año (€38,10/año).

Regla anual

El precio anual es 10x el precio mensual.

Puestos

La licencia predeterminada incluye 5 puestos. Si necesita más puestos, contáctenos en support@corifeus.com.

Prueba Enterprise

10 días gratis para cualquiera con un correo electrónico real existente (correo no de prueba).

Información de facturación por e-mail

Nombre, correo de facturación, código de país, código postal, ciudad, dirección, NIF (opcional).

Pago

El pago por PayPal está disponible solo en HUF (florín); después de enviar el dinero a https://paypal.me/corifeus le enviaré una factura. Todos los pagos no son reembolsables.

IVA

El IVA se agrega al precio (27% en Hungría).

Contacto

Si quiere saludar o tiene una pregunta, contacte con support@corifeus.com.

Idioma

La comunicación de facturas y licencias por correo es en inglés. La moneda de facturación es HUF.

Nota

La validación de licencia requiere acceso a Internet.", licenseState: "Estado", licenseStateActive: "Activa", licenseStateInactive: "Inactiva", licenseStateNoLicense: "Sin licencia", licenseKeyMasked: "Clave guardada", licenseTier: "Nivel", licenseValid: "Válida", licenseStatus: "Estado de licencia", licenseReason: "Razón", licenseCheckedAt: "Verificada el", licenseStartsAt: "Inicia el", licenseExpiresAt: "Expira el", licenseDaysLeft: "Días restantes", licenseMaxDevices: "Dispositivos máximos", licenseActiveDevices: "Dispositivos activos", licenseActiveDevicesInfo: "Si un dispositivo ya no se utiliza, su puesto se libera automáticamente después de 75 minutos.", licenseCustomerEmail: "Correo del cliente", licenseFeatures: "Características", licenseFeaturesEmpty: "Sin características adicionales", licenseFeatureReadonlyMode: "Modo de conexión de solo lectura", licenseFeatureReadonlyConnectionsFlag: "Conexiones de solo lectura (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Conexiones Cluster", licenseFeatureSentinel: "Conexiones Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Ordenación de claves activada", off: "Ordenación de claves desactivada" }, cluster: { on: "Cluster activado", off: "Cluster desactivado" }, sentinel: { on: "Sentinel activado", off: "Sentinel desactivado", name: "Nombre de Sentinel" }, readonly: { on: "Solo lectura activado", off: "Solo lectura desactivado" }, proSshOnly: "SSH está disponible en Pro o Enterprise.", proReadonlyOnly: "El modo de conexión de solo lectura está disponible en Pro o Enterprise.", enterpriseClusterSentinelOnly: "Cluster y Sentinel están disponibles solo en Enterprise.", theme: { light: "Claro", dark: "Oscuro enterprise", darkNeu: "Oscuro", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Conectado: ${opts.name}`; }, tree: "Árbol", askAuth: "Solicitar autorización", keyboardShortcuts: "Atajos de teclado", about: "Acerca de", supportedLanguages: "Idiomas compatibles", version: "Versión", redisVersion: "Versión de Redis", modules: "Módulos", shortcutRefresh: "Actualizar", shortcutSearch: "Enfocar búsqueda", shortcutNewKey: "Nueva clave", shortcutDisconnect: "Desconectar", themeAuto: "Automático (sistema)", shortcutCommandPalette: "Paleta de comandos", commandPalette: "Paleta de comandos", noResults: "Sin resultados", redisCommandsReference: "Comandos Redis", ungrouped: "Sin grupo", grouped: "Agrupados", connectFirst: "Conéctese primero a un servidor Redis", searchLanguage: "Buscar idioma...", exportProgress: "Exportando claves...", importProgress: "Importando claves...", importPreview: "Vista previa", importOverwrite: "Sobrescribir", importSkip: "Omitir", importConflict: "Si la clave ya existe:", noKeysToExport: "No hay claves para exportar", time: "Tiempo", loading: "Cargando...", autoRefresh: "Auto", exportSearchHint: "Exportando solo claves que coinciden con la búsqueda actual", importSearchHint: "La importación se aplica a toda la base de datos, no solo a los resultados de búsqueda", importNoKeys: "No se encontraron claves en el archivo", }, status: { dataCopied: "Los datos están en el portapapeles", licenseSaved: "Licencia guardada", exportDone: "Exportación completada", indexCreated: "Índice creado", indexDropped: "Índice eliminado", importDone: (opts) => `Importación completada: ${opts.created} creados, ${opts.skipped} omitidos, ${opts.errors} errores`, nodeRemoved: "Nodo eliminado", keyIsNotExisting: "Esta clave puede haber sido eliminada o haber expirado.", keyCount: opts => { if (opts.keyCount === 0) { return "Sin claves"; } else if (opts.keyCount === 1) { return "1 clave"; } else { return `${opts.keyCount} claves`; } }, treeExpandAll: "Expandir todas las hojas del árbol. Esta operación puede ser costosa y puede tomar tiempo ...", noRedisKeys: "No hay claves en esta base de datos.", redisConnected: "Conexión exitosa a Redis", reloadingDataInfo: "Recargando datos de Redis", added: "Agregado", saved: "Actualizado", cancelled: "Cancelado", deleted: "Eliminado", savedRedis: "Los datos de Redis se han guardado", redisDisconnected: opts => { return `La conexión actual tuvo un error: ${opts.error.message}`; }, dbChanged: opts => { return `El índice de base de datos se estableció en ${opts.db}. `; }, treeDeleted: opts => { return `La clave del árbol fue eliminada (${opts.key}).`; }, deletedKey: opts => { return `La clave fue eliminada (${opts.key}).`; }, renamedKey: "Esta clave ha sido renombrada", ttlChanged: "El TTL de esta clave ha sido cambiado", notInteger: "Esta entrada no es un número entero", persisted: "Esta clave se mantiene para siempre", set: "La clave ha sido establecida/agregada" }, code: { "delete-connection": "Esta conexión fue eliminada, por lo que se ha desconectado de esta instancia de Redis.", "save-connection": "Esta conexión fue modificada, por lo que se ha desconectado de esta instancia de Redis. Puede reconectarse.", "readonly-connections": "¡Las operaciones de agregar/guardar/eliminar conexiones son de solo lectura!", "readonly-connection-mode": "¡Esta conexión está en modo de solo lectura!", "list-out-of-bounds": "Este índice de lista está fuera de límites", "donation-ware-feature": "Esta función está presente en la versión de donación.", "feature-pro-readonly-required": "El modo de conexión de solo lectura requiere licencia Pro o Enterprise.", "feature-pro-ssh-required": "SSH tunneling requiere licencia Pro o Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster y Sentinel requieren licencia Enterprise.", "feature-pro-json-binary-required": "Editar JSON, Subir binario y Descargar binario requieren licencia Pro o Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorización requerida: por favor autentíquese con HTTP Basic Auth y recargue.", "auto-connection-failed": "Es posible que la conexión fue eliminada y la conexión automática falló por esta razón.", invalid_console_command: "Este comando no funciona a través del GUI." }, licenseReason: { LICENSE_VALID: "La licencia es válida", LICENSE_INVALID: "La licencia no es válida", LICENSE_MISSING: "No se ha establecido clave de licencia", LICENSE_DISABLED: "La licencia está deshabilitada en la configuración del servidor", LICENSE_NOT_FOUND: "La licencia no fue encontrada", LICENSE_EXPIRED: "La licencia ha expirado", LICENSE_CLEARED: "La clave de licencia fue eliminada", LICENSE_MAX_DEVICES_REACHED: "Se alcanzó el número máximo de puestos de dispositivos", PRODUCT_MISMATCH: "El producto de la licencia no coincide" }, licenseStatusValue: { active: "Activa", deleted: "Eliminada", all: "Todas", expired: "Expirada", missing: "Ausente", inactive: "Inactiva" }, form: { error: { required: "Obligatorio", port: "El puerto debe estar entre 1-65535", invalid: "El formulario no es válido" }, connection: { label: { name: "Nombre", group: "Grupo", host: "Nombre de host", port: "Puerto", password: "Contraseña", username: "Nombre de usuario" } }, treeSettings: { maxValueDisplay: "Longitud máxima de visualización de valor", maxValueDisplayInfo: "Si se establece en 0, muestra valores completos. Si es mayor que 0, trunca a esta longitud. Si -1: para cadenas, oculta el valor hasta editar; para otros tipos, muestra contenido completo.", maxKeys: "Número máximo de claves", maxKeysInfo: "Para que el GUI no se bloquee, limitamos el número máximo de claves.", keyCount: () => { return `Número de claves: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Usar animación", noAnimation: "Sin animación", jsonFormatTwoSpace: "Formatear JSON con 2 espacios", jsonFormatFourSpace: "Formatear JSON con 4 espacios", formName: "Configuración de Redis", searchModeClient: "Modo de búsqueda en cliente", searchModeServer: "Modo de búsqueda en servidor", searchModeStartsWith: "Buscar con modo empieza con", searchModeIncludes: "Modo de búsqueda incluye" }, field: { treeSeparator: "Separador del árbol", treeSeparatorSelector: "Selector de separador del árbol", page: "Número de paginación del árbol", keyPageCount: "Número de paginación de claves", keysSort: "Ordenar las claves", searchMode: "Modo de búsqueda", searchModeStartsWith: "Búsqueda empieza con / incluye" }, error: { keyPageCount: "El número de paginación de claves debe ser un entero entre 5 - 100", page: "El número de paginación debe ser un entero entre 10 - 5000", maxValueDisplay: "El valor máximo de visualización debe ser un entero entre -1 y 32768", maxKeys: "El número máximo de claves debe ser un entero entre 100 y 100000" } }, key: { label: { formName: { add: "Agregar nueva clave Redis", edit: "Editar clave Redis", append: "Agregar a clave Redis existente" } }, field: { streamTimestamp: "Marca de tiempo", key: "Clave", type: "Tipo", index: "Índice", hashKey: "Clave hash", score: "Puntuación", value: "Valor" }, error: { streamTimestamp: "La marca de tiempo es obligatoria, ya sea en formato Redis o como *", key: "La clave debe tener al menos un carácter", hashKey: "La clave hash debe tener al menos un carácter", score: "La puntuación del conjunto ordenado es obligatoria", value: "El valor es obligatorio" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Búsqueda", index: "Índice", query: "Consulta", results: "Resultados", noIndex: "No se encontraron índices", createIndex: "Crear índice", dropIndex: "Eliminar índice", indexInfo: "Info del índice", indexName: "Nombre del índice", prefix: "Prefijo de clave (opcional)", fieldName: "Nombre del campo", }, monitor: { title: "Monitoreo", memory: "Memoria", opsPerSec: "Ops/seg", clients: "Clientes", blocked: "Bloqueados", hitsMisses: "Tasa de aciertos", networkIo: "Red I/O", slowLog: "Log lento", totalCommands: "Total", expired: "Expirados", evicted: "Desalojados", clientList: "Lista de clientes", topKeys: "Claves más grandes por memoria", killClient: "Matar cliente", clientKilled: "Cliente terminado", confirmKillClient: "¿Está seguro de terminar este cliente?", noKeys: "Sin claves", noClients: "Sin clientes", }, overview: { noConnected: "No hay conexión a Redis.", overviewClients: "Lista de conectados por número de clientes", connectedCount: opt => { if (opt.length === 1) { return "1 cliente"; } return `${opt.length} clientes`; } }, key: { label: { key: "Clave", encoding: "Codificación", length: "Tamaño", ttl: "TTL", ttlTitle: "Tiempo de vida", type: "Tipo", ttlNotExpire: "no expira", lengthString: "bytes", lengthItem: "elementos", actions: "Acciones" }, list: { table: { index: "Índice", value: "Valor" } }, hash: { table: { hashkey: "Clave hash", value: "Valor" } }, set: { table: { value: "Miembro" } }, zset: { table: { value: "Miembro", score: "Puntuación" } }, stream: { table: { timestamp: "ID de marca de tiempo", field: "Campo", value: "Valor" } } }, treeControls: { settings: "Configuración del árbol", expandAll: "Expandir todo", collapseAll: "Colapsar todo", search: { search: "Buscar en las claves", clear: "Limpiar búsqueda actual", placeholderClient: "Buscar en el cliente", placeholderServer: "Buscar en el servidor", info: "La búsqueda del lado del cliente significa que coincide con el texto en la entrada de búsqueda. La búsqueda del lado del servidor significa que busca en los patrones de claves como *{texto-de-búsqueda}*. Para conjuntos de búsqueda grandes, es mejor usar la búsqueda del lado del servidor. Para conjuntos más pequeños, es mejor usar la búsqueda del lado del cliente." + ` Si el número de claves supera ${p3xr.settings.maxLightKeysCount}, solo puede buscar en el servidor.`, largeSetInfo: "En un conjunto grande, la búsqueda del lado del cliente está deshabilitada, así que ahora solo es posible la búsqueda del lado del servidor.", infoDetails: "Para descubrir cómo funciona la búsqueda, consulte la configuración" }, pager: { next: "Siguiente", prev: "Anterior", first: "Primero", last: "Último" } } }, time: { loading: "Cargando...", years: "años", months: "meses", days: "días", year: "año", month: "mes", day: "día" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/et/000077500000000000000000000000001517666434100137635ustar00rootroot00000000000000src/strings/et/strings.js000066400000000000000000000663421517666434100160250ustar00rootroot00000000000000const strings = { error: { cleared_license: "Puhastatud litsents", invalid_license: "Kehtetu litsents", license_max_devices_reached: "Seadmete maksimaalne istekohtade arv on täis", license_readonly: "Litsentsi saab muuta ainult serveriterminalist.", server_error: "Serveri viga, proovige uuesti" }, title: { donate: "Anneta", jsonRecursive: "Kõigi lehtede laiendamine", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Saate valida ühenduse loomiseks Redis ühenduse vasakpoolsest alumisest menüüst.", statistics: "Statistika", error: "Viga", connectingRedis: "Ühendamine seadmega Redis ...", socketioConnectError: "Socket.IO viga", db: "DB", server: "Server", clients: "Kliendid", memory: "Mälu", persistence: "Püsivus", stats: "Statistika", replication: "Replikatsioon", cpu: "CPU", cluster: "Cluster", modules: "Moodulid", errorstats: "Vigade statistika", commandstats: "Käskude statistika", latencystats: "Viivituse statistika", keysizes: "Võtmesuurused", threads: "Lõimed", }, confirm: { dropIndex: "Kas olete kindel, et soovite selle indeksi kustutada?", uploadBuffer: "Kas olete kindel, et laadite need binaarandmed üles?", uploadBufferDone: "Binaarandmed laaditakse üles", uploadBufferDoneAndSave: "Binaarandmed laaditakse üles ja salvestatakse serverisse", title: "Kinnita", alert: "Hoiatus", info: "Info", deleteListItem: "Kas olete kindel, et kustutate selle loendiüksuse?", deleteHashKey: "Kas olete kindel, et kustutate selle räsivõtme üksuse?", deleteStreamTimestamp: "Kas olete kindel, et kustutate selle voo ajatempli?", deleteSetMember: "Kas olete kindel, et kustutate selle komplekti liikme?", deleteZSetMember: "Kas olete kindel, et kustutate selle sorteeritud komplekti liikme?", deleteConnection: "Kinnita", deleteConnectionText: "Kas olete kindel, et kustutate selle Redis ühenduse?", deleteNode: "Kas olete kindel, et kustutate selle Redis sõlme?", deleteAllKeys: opts => { return `Kustuta see puu ja kõik selle võtmed (${opts.key})?`; }, socketioConnectError: "Socket.IO ei saa serveriga ühendust, saate uuesti laadida ja proovida ühenduse tõrke ise lahendada, klient ei tea, kuidas seda ise lahendada.", socketioAuthRequired: "Nõutav on Socket.IO autoriseerimine. Autentige koodiga HTTP Basic Auth (kasutajanimi/parool) ja laadige uuesti.", deleteKey: "Kas olete kindel, et kustutate selle võtme?", rename: { title: "Kas olete kindel, et nimetate selle võtme ümber?", textContent: "See toiming nimetab võtme jäädavalt ümber.", placeholder: "Võti Redis (nõutav)" }, ttl: { title: "Kas olete kindel, et soovite selle võtme TTL muuta?", textContent: "TTL muutmine värskendab selle võtme elamisaega. Selle võtme igaveseks säilitamiseks jätke tühjaks.", placeholder: "Võtme Redis TTL (täisarv või tühi)", placeholderPlaceholder: "Tühi tähendab, et see püsib igavesti; muul juhul sisestage täisarv.", convertTextToTime: "Teisendage tekst kellaajaks", convertTextToTimePlaceholder: "Nt. 1d on 86400" }, license: { title: "Määra litsents", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Litsentsi võti" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopeeri", downloadBuffer: "Laadige alla binaarfail", setBuffer: "Laadige üles binaarfail", exportKeys: "Ekspordi võtmed", exportAllKeys: (opts) => `Ekspordi kõik ${opts.count} võtit`, exportSearchResults: (opts) => `Ekspordi ${opts.count} tulemust`, importKeys: "Impordi võtmed", saveWithFormatJson: "Salvestage vorminguga", formatJson: "Vorming Json", wrap: "Mähi", unwrap: "Lahti pakkida", downloadJson: "Laadige alla JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Keel", ok: "OK", addKey: "Lisa sellele võtmele", addKeyRoot: "Lisa juurvõti", reloadKey: "Laadi võti uuesti", reload: "Laadi uuesti", close: "Sule", commands: "Käsud", view: "Vaade", statistics: "Statistika", refresh: "Värskenda", pause: "Peata", resume: "Jätka", clear: "Selge", rename: "Nimeta ümber", main: "Andmebaas", cancel: "Tühista", theme: "Teema", github: "GitHub", githubRepo: "Hoidla", githubRelease: "Väljaanded", githubChangelog: "Muudatuste logi", info: "Info", settings: "Seaded", connect: "Ühendage", disconnect: "Katkesta ühendus", overview: "Ülevaade", console: "konsool", noConnections: "Ühendusi pole, lisage ühendus seadete menüüs.", noConnectionsInSettings: "Ühendusi pole, võite ülal lisada UUE ÜHENDUSE.", connectionAdd: "Uus ühendus", addGroup: "Lisa rühm", extend: "Pikendada", collapse: "Ahenda", add: "Lisa", edit: "Muuda", save: "Salvesta", ttl: "Komplekt TTL", license: "Määra litsents", delete: "Kustuta", remove: "Eemalda", sure: "Muidugi", testConnection: "Katsetage ühendust", getKey: "Võtme Redis ja seotud andmete laadimine ...", jsonViewShow: "Ekraan JSON", jsonViewEditor: "Redigeerige JSON", quickConsole: "Kiirkonsool", }, label: { id: { nodeId: "Sõlme ID", id: "Ühenduse ID", info: "Kui te ei soovi muuta atribuute: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, sisestage atribuutide väärtuste muutmiseks nendesse atribuutidesse ühenduse ID. Kui soovid sõlme paroolis sama loogikat, siis sisesta sõlme paroolisse sõlme ID." }, secureFeature: "Kui näete väärtust, mis algab P3X-iga ja näeb välja sama, on see turvaline funktsioon. Seadete muutmiseks lihtsalt asenda need sätted tühjade või millegi muuga ja need salvestatakse. Kui te sätteid ei muuda, säilitatakse sätted serveris nii, nagu need on.", ssh: { on: "SSH sisse lülitatud", off: "SSH väljas", sshHost: "SSH Host", sshPort: "Port SSH", sshUsername: "SSH kasutajanimi", sshPassword: "SSH parool", sshPrivateKey: "SSH privaatvõti" }, isBuffer: opts => `[object ArrayBuffer] tähendab, et väärtus on binaarandmed või väärtus on suurem kui ${opts.maxValueAsBuffer}`, streamValue: `Voo väli ja väärtus on üksus. Nt: väli1 väärtus1 "väli 2" "väärtus 2"`, streamTimestampId: `„*” tähendab automaatselt genereeritud või spetsifikatsiooni kujul -`, unableToLoadKey: ({ key }) => { return `Seda võtit ei saa laadida: ${key}. Võimalik, võti kustutati. Täpne viga on konsoolis.`; }, bigJson: "See JSON objekt on üle 10 kb, seega veenduge, et teate, mida teete, sest mõned funktsioonid võivad olla aeglased.", addNode: "Lisa sõlm", validateJson: "Kinnitage JSON", reducedFunction: `Vähendatud funktsionaalsus`, tooManyKeys: opts => { return `Täielike funktsioonide jaoks on lubatud klahvide kogusumma ${opts.maxLightKeysCount} loendama. Selles andmebaasis on kokku üle lubatud võtmete ${opts.count}. Võtmete sortimine ja täiendav väljamõeldud puuteave on keelatud. Otsing toimub kliendiotsingu asemel ainult serveris.`; }, redisCommandNotFound: "Ühtegi vastet Redis ei leitud ...", treeKeyStore: `Sorteerimine (loomulik võrdlus) teostatakse kliendil ehk brauseris, mis tähendab, et suurte suurte komplektide puhul, nagu üle 10 000 võtme, on see trahv, mis võib lehe renderdamisele veidi aega lisada. Redis-s võtmete sorteerimine puudub, ainult niimoodi.`, socketIoTimeout: options => { return `Socket.IO aegus selle taotluse jaoks (max ${options.timeout / 1000} sekundit)...`; }, resizerInfo: options => { return `Vasaku või parema paneeli minimaalne laius on ${options.width}px`; }, jsonViewNotParsable: "See väärtus ei ole parseeritav JSON ", ttlTitle: "Seadistage TTL sekunditega", passwordSecure: "Parool võib olla tühi, kuid see näitab siiski märke, see on turvafunktsioon.", tlsWithoutCert: "Luba TLS ilma täiendava sertifikaadita", tlsRejectUnauthorized: "Keeldu volitamata sertifikaadist", tlsSecure: "Kui näete TLS-i konfiguratsiooni, mis algab P3X-iga või kõik TLS-i sätted näevad välja ühesugused, on see turvaline funktsioon. Seadete muutmiseks lihtsalt asenda need sätted tühjade või millegi muuga ja need salvestatakse. Kui te TLS-i sätteid ei muuda, säilitatakse sätted serveris nii, nagu need on.", treeSeparatorEmpty: "Kui puu eraldaja on tühi, pole puul pesastatud sõlme, vaid puhas loend", treeSeparatorEmptyNote: "Pole pesastatud sõlme, vaid puhas loend", welcomeConsole: "Tere tulemast Redis konsooli", welcomeConsoleInfo: "Kursori UP või DOWN ajalugu on lubatud", redisListIndexInfo: "Tühjendage lisamiseks, -1 lisamiseks või salvestamiseks näidatud kohta.", console: "konsool", connectiondAdd: "Lisage ühendus", connectiondEdit: "Redigeeri ühendust", connectiondView: "Vaata ühendust", connections: "Ühendused", licenseInfo: "Litsents", licenseEditable: "Litsentsi saab redigeerida", licenseEditableYes: "Jah", licenseEditableNo: "Ei", licenseTerminalOnly: "Litsentsi saab konfigureerida ainult serveriterminali kaudu.", licenseTierPolicyTitle: "Tasemepoliitika", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "osariik", licenseStateActive: "Aktiivne", licenseStateInactive: "Mitteaktiivne", licenseStateNoLicense: "Litsentsi pole", licenseKeyMasked: "Salvestatud võti", licenseTier: "Tase", licenseValid: "Kehtiv", licenseStatus: "Litsentsi olek", licenseReason: "Põhjus", licenseCheckedAt: "Kontrollitud kell", licenseStartsAt: "Algus kell", licenseExpiresAt: "Aegub kell", licenseDaysLeft: "Päevad jäänud", licenseMaxDevices: "Max seadmed", licenseActiveDevices: "Aktiivsed seadmed", licenseActiveDevicesInfo: "Kui seadet enam ei kasutata, vabastatakse selle iste automaatselt 75 minuti pärast.", licenseCustomerEmail: "Kliendi email", licenseFeatures: "Omadused", licenseFeaturesEmpty: "Ei mingeid lisafunktsioone", licenseFeatureReadonlyMode: "Kirjutuskaitstud ühenduse režiim", licenseFeatureReadonlyConnectionsFlag: "Kirjutuskaitstud ühendused (--readonly-connections/-r)", licenseFeatureSsh: "Tunneldamine SSH", licenseFeatureCluster: "Cluster ühendused", licenseFeatureSentinel: "Sentinel ühendused", licenseFeatureReJSON: "ReJSON (andmetüüp JSON)", keysSort: { on: "Võtmete sorteerimine sisse", off: "Võtmete sorteerimine ära" }, cluster: { on: "Cluster sisse lülitatud", off: "Cluster väljas" }, sentinel: { on: "Sentinel sisse lülitatud", off: "Sentinel väljas", name: "Sentinel nimi" }, readonly: { on: "Ainult lugemiseks edasi", off: "Readonly off" }, proSshOnly: "SSH on saadaval Pro või Enterprise versioonides.", proReadonlyOnly: "Kirjutuskaitstud ühendusrežiim on saadaval Pro või Enterprise puhul.", enterpriseClusterSentinelOnly: "Cluster ja Sentinel on saadaval ainult ettevõttes.", theme: { light: "Valgus", dark: "Tume ettevõtmine", darkNeu: "Tume", darkoBluo: "Tume bluo", enterprise: "Ettevõtlus", redis: "Redis", matrix: "Maatriks" }, connected: opts => { return `Ühendatud: ${opts.name}`; }, tree: "Puu", askAuth: "Küsi luba", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moodulid", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Katkesta ühendus", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Käsud", ungrouped: "Rühmitamata", grouped: "Grouped", connectFirst: "Ühenduge esmalt Redis serveriga", searchLanguage: "Otsi keelt...", exportProgress: "Võtmete eksportimine...", importProgress: "Võtmete importimine...", importPreview: "Eelvaade", importOverwrite: "Kirjuta üle", importSkip: "Jäta vahele", importConflict: "Kui võti on juba olemas:", noKeysToExport: "Pole võtmeid eksportimiseks", time: "Aeg", loading: "Laadimine...", autoRefresh: "Auto", exportSearchHint: "Eksporditakse ainult praegusele otsingule vastavad võtmed", importSearchHint: "Import kehtib kogu andmebaasile, mitte ainult otsingutulemustele", importNoKeys: "Failis ei leitud võtmeid", }, status: { dataCopied: "Andmed on lõikepuhvril", licenseSaved: "Litsents salvestatud", exportDone: "Eksport lõpetatud", indexCreated: "Indeks loodud", indexDropped: "Indeks kustutatud", importDone: (opts) => `Import lõpetatud: ${opts.created} loodud, ${opts.skipped} vahele jäetud, ${opts.errors} viga`, nodeRemoved: "Sõlm eemaldatud", keyIsNotExisting: "See võti võis olla kustutatud või aegunud.", keyCount: opts => { if (opts.keyCount === 0) { return "Võti puudub"; } else if (opts.keyCount === 1) { return "1 võti"; } else { return `${opts.keyCount} võtmed`; } }, treeExpandAll: "Laiendage kõiki puulehti. See operatsioon võib olla kulukas ja võib võtta aega...", noRedisKeys: "Selles andmebaasis pole võtmeid.", redisConnected: "Redis ühendamine õnnestus", reloadingDataInfo: "Redis andmete uuesti laadimine", added: "Lisatud", saved: "Uuendatud", cancelled: "Tühistatud", deleted: "Kustutatud", savedRedis: "Redis andmed salvestatakse", redisDisconnected: opts => { return `Praegusel ühendusel ilmnes viga: ${opts.error.message}`; }, dbChanged: opts => { return `db indeks on seatud väärtusele ${opts.db}. `; }, treeDeleted: opts => { return `Puu võti kustutati (${opts.key}).`; }, deletedKey: opts => { return `võti kustutati (${opts.key}).`; }, renamedKey: "See võti on ümber nimetatud", ttlChanged: "Selle võtme TTL on muudetud", notInteger: "See sisend ei ole täisarv", persisted: "See võti püsib igavesti", set: "Võti on seatud/lisatud" }, code: { "delete-connection": "See ühendus kustutati, nii et olete selle Redis eksemplariga katkestatud.", "save-connection": "Seda ühendust muudeti, nii et olete selle Redis eksemplariga katkestatud. Võite uuesti ühendada.", "readonly-connections": "Ühenduste lisamine/salvestamine/kustutamine on kirjutuskaitstud!", "readonly-connection-mode": "See ühendus on kirjutuskaitstud režiimis!", "list-out-of-bounds": "See loendi register on väljaspool piire", "donation-ware-feature": "See funktsioon on annetamise versioonis olemas.", "feature-pro-readonly-required": "Kirjutuskaitstud ühenduse režiim nõuab Pro või Enterprise litsentsi.", "feature-pro-ssh-required": "SSH tunnelimiseks on vaja Pro või Enterprise litsentsi.", "feature-enterprise-cluster-sentinel-required": "Cluster ja Sentinel nõuavad ettevõtte litsentsi.", "feature-pro-json-binary-required": "Redigeerige JSON, binaarfailide üleslaadimine ja kahendfaili allalaadimine nõuavad Pro või Enterprise litsentsi.", "feature-pro-rejson-required": "ReJSON (andmetüüp JSON) nõuab Pro või Enterprise litsentsi.", "invalid-json-value": "Väärtus ei kehti JSON.", "http_auth_required": "Nõutav autoriseerimine: autentige HTTP Basic Auth ja laadige uuesti.", "auto-connection-failed": "Võimalik, et ühendus eemaldati ja automaatne ühendus ebaõnnestus.", invalid_console_command: "See käsk ei tööta GUI kaudu." }, licenseReason: { LICENSE_VALID: "Litsents kehtib", LICENSE_INVALID: "Litsents on kehtetu", LICENSE_MISSING: "Litsentsivõtit pole määratud", LICENSE_DISABLED: "Litsents on serveri konfiguratsioonis keelatud", LICENSE_NOT_FOUND: "Litsentsi ei leitud", LICENSE_EXPIRED: "Litsents on aegunud", LICENSE_CLEARED: "Litsentsivõti kustutati", LICENSE_MAX_DEVICES_REACHED: "Seadmete maksimaalne istekohtade arv on täis", PRODUCT_MISMATCH: "Litsentsiga toode ei sobi" }, licenseStatusValue: { active: "Aktiivne", deleted: "Kustutatud", all: "Kõik", expired: "Aegunud", missing: "Kadunud", inactive: "Mitteaktiivne" }, form: { error: { required: "Nõutav", port: "Sadam on vahemikus 1-65535", invalid: "Vorm on kehtetu" }, connection: { label: { name: "Nimi", group: "Group", host: "Hostinimi", port: "Port", password: "Parool", username: "Kasutajanimi" } }, treeSettings: { maxValueDisplay: "Maksimaalse väärtuse kuvatava stringi pikkus", maxValueDisplayInfo: "Kui see on 0, kuvage täisväärtusi. Kui see on suurem kui 0, kärbige selle pikkuseni. Kui -1: stringide puhul peida väärtus kuni muutmiseni; muude tüüpide puhul kuva kogu sisu.", maxKeys: "Maksimaalne võtmete arv", maxKeysInfo: "Selleks, et GUI ei jookseks kokku, piirame maksimaalset võtmete arvu.", keyCount: () => { return `Võtmete arv: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Kasutage animatsiooni", noAnimation: "Animatsiooni pole", jsonFormatTwoSpace: "Vorming JSON 2 tühikuga", jsonFormatFourSpace: "Vorming JSON 4 tühikuga", formName: "Redis seaded", searchModeClient: "Kliendiotsingu režiim", searchModeServer: "Serveri otsingurežiim", searchModeStartsWith: "Otsimine algab režiimiga", searchModeIncludes: "Otsing sisaldab režiimi" }, field: { treeSeparator: "Puude eraldaja", treeSeparatorSelector: "Puude eraldaja valija", page: "Puu otsimise arv", keyPageCount: "Võtme otsimise arv", keysSort: "Sorteeri võtmed", searchMode: "Otsingurežiim", searchModeStartsWith: "Otsing algab tähega / hõlmab" }, error: { keyPageCount: "Võtmelehtede arv peab olema täisarv vahemikus 5–100", page: "Lehtede arv peab olema täisarv vahemikus 10–5000", maxValueDisplay: "Maksimaalne kuvatav väärtus peab olema täisarv vahemikus –1 kuni 32768", maxKeys: "Võtmete maksimaalne loendusväärtus peab olema täisarv vahemikus 100 kuni 100 000" } }, key: { label: { formName: { add: "Lisage uus võti Redis", edit: "Redigeerige võtit Redis", append: "Lisage olemasolevale võtmele Redis" } }, field: { streamTimestamp: "Ajatempel", key: "Võti", type: "Tüüp", index: "Indeks", hashKey: "Räsivõti", score: "Skoor", value: "Väärtus" }, error: { streamTimestamp: "Ajatempel on nõutav kas vormingus Redis või kujul *", key: "Võti on vähemalt üks märk", hashKey: "Räsitabeli võti koosneb vähemalt ühest tähemärgist", score: "Nõutav on sorteeritud komplekti punktisumma", value: "Väärtus on nõutav" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Otsing", index: "Indeks", query: "Päring", results: "Tulemused", noIndex: "Indekseid ei leitud", createIndex: "Loo indeks", dropIndex: "Kustuta indeks", indexInfo: "Indeksi info", indexName: "Indeksi nimi", prefix: "Võtme prefiks (valikuline)", fieldName: "Välja nimi", }, monitor: { title: "Seire", memory: "Mälu", opsPerSec: "Ops/sek", clients: "Kliendid", blocked: "Blokeeritud", hitsMisses: "Tabamuste määr", networkIo: "Võrgu I/O", slowLog: "Aeglane logi", totalCommands: "Kokku", expired: "Aegunud", evicted: "Välja tõstetud", clientList: "Klientide loend", topKeys: "Suurimad võtmed mälu järgi", killClient: "Tapa klient", clientKilled: "Klient tapetud", confirmKillClient: "Kas olete kindel, et soovite selle kliendi lõpetada?", noKeys: "Võtmeid pole", noClients: "Kliente pole", }, overview: { noConnected: "Seadmega Redis pole ühendust.", overviewClients: "Loetlege ühendatud klientide arvu järgi", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} kliendid`; } }, key: { label: { key: "Võti", encoding: "Kodeerimine", length: "Suurus", ttl: "TTL", ttlTitle: "Aeg Elada", type: "Tüüp", ttlNotExpire: "ei aegu", lengthString: "baiti", lengthItem: "esemed", actions: "Tegevused" }, list: { table: { index: "Indeks", value: "Väärtus" } }, hash: { table: { hashkey: "Hashkey", value: "Väärtus" } }, set: { table: { value: "liige" } }, zset: { table: { value: "liige", score: "Skoor" } }, stream: { table: { timestamp: "Ajatempli ID", field: "Väli", value: "Väärtus" } } }, treeControls: { settings: "Puu seaded", expandAll: "Laienda kõik", collapseAll: "Ahenda kõik", search: { search: "Otsige klahvidest", clear: "Tühjendamiseks tühjenda praegune otsing", placeholderClient: "Otsige kliendi poolelt", placeholderServer: "Otsi serveri poolelt", info: "Kliendipoolne otsing tähendab, et see vastab otsingusisendis olevale tekstile. Serveripoolne otsing tähendab, et see on nagu otsing võtmemustrites *{otsingutekst}*. Suurte otsingukomplektide puhul on parem kasutada serveripoolset otsingut. Väiksemate otsingukomplektide jaoks on parem kasutada kliendipoolset otsingurežiimi." + ` Kui klahvide arv on lõppenud ${p3xr.settings.maxLightKeysCount}, saate otsida ainult serveri poolel.`, largeSetInfo: "Suures komplektis on kliendipoolne otsing keelatud. nii et praegu on võimalik ainult serveripoolne otsing.", infoDetails: "Et teada saada, kuidas otsing töötab, vaadake palun seadeid" }, pager: { next: "Edasi", prev: "Eelmine", first: "Esiteks", last: "Viimane" } } }, time: { loading: "Laadimine...", years: "aastat", months: "kuud", days: "päevadel", year: "aastal", month: "kuu", day: "päeval" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/fi/000077500000000000000000000000001517666434100137515ustar00rootroot00000000000000src/strings/fi/strings.js000066400000000000000000000665731517666434100160210ustar00rootroot00000000000000const strings = { error: { cleared_license: "Täytetty lisenssi", invalid_license: "Virheellinen lisenssi", license_max_devices_reached: "Laitepaikkojen enimmäismäärä saavutettu", license_readonly: "Lisenssi voidaan vaihtaa vain palvelinpäätteestä.", server_error: "Palvelinvirhe, yritä uudelleen" }, title: { donate: "Lahjoita", jsonRecursive: "Kaikkien lehtien laajentaminen", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Voit valita yhdistettäväksi Redis-liitännän vasemmasta alavalikosta.", statistics: "Tilastot", error: "Virhe", connectingRedis: "Yhdistetään Redis...", socketioConnectError: "Socket.IO Virhe", db: "DB", server: "Palvelin", clients: "Asiakkaat", memory: "Muisti", persistence: "Pysyvyys", stats: "Tilastot", replication: "Replikointi", cpu: "CPU", cluster: "Cluster", modules: "Moduulit", errorstats: "Virhetilastot", commandstats: "Komentotilastot", latencystats: "Viiveтilastot", keysizes: "Avainkoot", threads: "Säikeet", }, confirm: { dropIndex: "Haluatko varmasti poistaa tämän indeksin?", uploadBuffer: "Oletko varma, että lähetät nämä binaaritiedot?", uploadBufferDone: "Binääritiedot ladataan", uploadBufferDoneAndSave: "Binääritiedot ladataan ja tallennetaan palvelimelle", title: "Vahvista", alert: "Varoitus", info: "Tietoja", deleteListItem: "Haluatko varmasti poistaa tämän luettelokohteen?", deleteHashKey: "Haluatko varmasti poistaa tämän hash-avainkohteen?", deleteStreamTimestamp: "Haluatko varmasti poistaa tämän striimin aikaleiman?", deleteSetMember: "Haluatko varmasti poistaa tämän sarjan jäsenen?", deleteZSetMember: "Haluatko varmasti poistaa tämän lajitellun joukon jäsenen?", deleteConnection: "Vahvista", deleteConnectionText: "Haluatko varmasti poistaa tämän Redis-yhteyden?", deleteNode: "Haluatko varmasti poistaa tämän Redis-solmun?", deleteAllKeys: opts => { return `Poista tämä puu ja kaikki sen avaimet (${opts.key})?`; }, socketioConnectError: "Socket.IO ei voi muodostaa yhteyttä palvelimeen, voit ladata uudelleen ja yrittää ratkaista yhteysvirheen itse, asiakas ei osaa ratkaista sitä itse.", socketioAuthRequired: "Socket.IO-valtuutus vaaditaan. Todennus komennolla HTTP Basic Auth (käyttäjänimi/salasana) ja lataa uudelleen.", deleteKey: "Haluatko varmasti poistaa tämän avaimen?", rename: { title: "Haluatko varmasti nimetä tämän avaimen uudelleen?", textContent: "Tämä toiminto nimeää avaimen pysyvästi uudelleen.", placeholder: "Avain Redis (pakollinen)" }, ttl: { title: "Haluatko varmasti vaihtaa tämän avaimen TTL?", textContent: "TTL:n vaihtaminen päivittää tämän avaimen ajan elää. Jätä tyhjäksi, jotta tämä avain säilyy ikuisesti.", placeholder: "Redis-avaimen TTL (kokonaisluku tai tyhjä)", placeholderPlaceholder: "Tyhjä tarkoittaa, että se säilyy ikuisesti; muussa tapauksessa syötä kokonaisluku.", convertTextToTime: "Muunna teksti aikaan", convertTextToTimePlaceholder: "Esim. 1d on 86400" }, license: { title: "Aseta lisenssi", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Lisenssiavain" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopioi", downloadBuffer: "Lataa binaari", setBuffer: "Lataa binaari", exportKeys: "Vie avaimet", exportAllKeys: (opts) => `Vie kaikki ${opts.count} avainta`, exportSearchResults: (opts) => `Vie ${opts.count} tulosta`, importKeys: "Tuo avaimet", saveWithFormatJson: "Tallenna muodossa", formatJson: "Muotoile Json", wrap: "Kääri", unwrap: "Avaa pakkaus", downloadJson: "Lataa JSON", pubsubMonitor: "PubSub näyttö", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Kieli", ok: "OK", addKey: "Lisää tähän avaimeen", addKeyRoot: "Lisää juuriavain", reloadKey: "Lataa avain uudelleen", reload: "Lataa uudelleen", close: "Sulje", commands: "komennot", view: "Näytä", statistics: "Tilastot", refresh: "Päivitä", pause: "Tauko", resume: "Jatka", clear: "Selkeä", rename: "Nimeä uudelleen", main: "Tietokanta", cancel: "Peruuta", theme: "Teema", github: "GitHub", githubRepo: "Arkisto", githubRelease: "Julkaisut", githubChangelog: "Muutosloki", info: "Info", settings: "Asetukset", connect: "Yhdistä", disconnect: "Katkaise yhteys", overview: "Yleiskatsaus", console: "konsoli", noConnections: "Ei yhteyksiä, lisää yhteys asetusvalikossa.", noConnectionsInSettings: "Ei yhteyksiä, voit lisätä UUDEN YHTEYDEN yllä.", connectionAdd: "Uusi yhteys", addGroup: "Lisää ryhmä", extend: "Laajenna", collapse: "Kutista", add: "Lisää", edit: "Muokkaa", save: "Tallenna", ttl: "Aseta TTL", license: "Aseta lisenssi", delete: "Poista", remove: "Poista", sure: "Toki", testConnection: "Testaa yhteys", getKey: "Ladataan Redis-avainta ja siihen liittyviä tietoja...", jsonViewShow: "Näyttö JSON", jsonViewEditor: "Muokkaa JSON", quickConsole: "Pikakonsoli", }, label: { id: { nodeId: "Solmun tunnus", id: "Yhteystunnus", info: "Jos et halua muuttaa seuraavia ominaisuuksia: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, kirjoita yhteyden tunnus näihin ominaisuuksiin, jotta ominaisuusarvot pysyvät ennallaan. Jos haluat saman logiikan solmun salasanaan, kirjoita solmun tunnus solmun salasanaan." }, secureFeature: "Jos näet arvon, joka alkaa P3X:llä ja näyttää samalta, se on turvallinen ominaisuus. Jos haluat muuttaa asetuksia, korvaa nämä asetukset tyhjällä tai jollain muulla, ja ne tallennetaan. Jos et muuta asetuksia, asetukset säilytetään sellaisina kuin ne ovat palvelimella.", ssh: { on: "SSH päällä", off: "SSH pois päältä", sshHost: "SSH Isäntä", sshPort: "SSH-portti", sshUsername: "SSH käyttäjätunnus", sshPassword: "SSH salasana", sshPrivateKey: "SSH yksityinen avain" }, isBuffer: opts => `[object ArrayBuffer] tarkoittaa, että arvo on binääritietoa tai arvo on suurempi kuin ${opts.maxValueAsBuffer}`, streamValue: `Stream-kenttä ja -arvo on yksiviivainen. Esim.: kenttä1 arvo1 "kenttä 2" "arvo 2"`, streamTimestampId: `'*' tarkoittaa automaattisesti luotua tai määritystä muodossa -`, unableToLoadKey: ({ key }) => { return `Tätä avainta ei voi ladata: ${key}. Mahdollista, avain poistettiin. Tarkka vika löytyy konsolista.`; }, bigJson: "Tämä JSON-objekti on yli 10 kt, joten varmista, että tiedät mitä teet, koska jotkut toiminnot voivat olla hidasta renderöityä.", addNode: "Lisää solmu", validateJson: "Vahvista JSON", reducedFunction: `Vähentynyt toiminnallisuus`, tooManyKeys: opts => { return `Täysi enimmäistoimintojen sallitut näppäimet yhteensä on ${opts.maxLightKeysCount} laskea. Tässä tietokannassa on yhteensä yli sallitut avaimet ${opts.count}. Avainten lajittelu ja ylimääräiset hienot puutiedot on poistettu käytöstä. Haku tapahtuu vain palvelimella asiakashaun sijaan.`; }, redisCommandNotFound: "Komentoa Redis ei löytynyt...", treeKeyStore: `Lajittelu (luonnollinen vertailu) suoritetaan asiakkaalla eli selaimella, mikä tarkoittaa, että sillä on sakko isoista suurista sarjoista, kuten yli 10 000 avaimista, se saattaa lisätä sivun renderöintiin hieman aikaa. Redis:ssä ei ole avainten lajittelua, vain näin.`, socketIoTimeout: options => { return `Socket.IO aikakatkaistiin tälle pyynnölle (max ${options.timeout / 1000} sekuntia)...`; }, resizerInfo: options => { return `Vasemman tai oikean paneelin vähimmäisleveys on ${options.width}px`; }, jsonViewNotParsable: "Tämä arvo ei ole JSON jäsennettävä ", ttlTitle: "Aseta TTL sekunneissa", passwordSecure: "Salasana saattaa olla tyhjä, mutta silti siinä näkyy merkkejä, tämä on suojausominaisuus.", tlsWithoutCert: "Ota TLS käyttöön ilman lisävarmennetta", tlsRejectUnauthorized: "Hylkää luvaton varmenne", tlsSecure: "Jos näet TLS-määrityksen, joka alkaa P3X:stä tai kaikki TLS-asetukset näyttävät samalta, se on suojattu ominaisuus. Jos haluat muuttaa asetuksia, korvaa nämä asetukset tyhjällä tai jollain muulla, ja ne tallennetaan. Jos et muuta TLS-asetuksia, asetukset säilyvät sellaisina kuin ne ovat palvelimella.", treeSeparatorEmpty: "Jos puun erotin on tyhjä, puussa ei ole sisäkkäisiä solmuja, vain puhdas luettelo", treeSeparatorEmptyNote: "Ei sisäkkäisiä solmuja, vain puhdas luettelo", welcomeConsole: "Tervetuloa Redis-konsoliin", welcomeConsoleInfo: "Kohdistimen YLÖS- tai ALAS-historia on käytössä", redisListIndexInfo: "Tyhjä lisätäksesi, -1 lisätäksesi tai tallentaaksesi sen näkyvään kohtaan.", console: "konsoli", connectiondAdd: "Lisää yhteys", connectiondEdit: "Muokkaa yhteyttä", connectiondView: "Näytä yhteys", connections: "Liitännät", licenseInfo: "Lisenssi", licenseEditable: "Lisenssi muokattavissa", licenseEditableYes: "Kyllä", licenseEditableNo: "Ei", licenseTerminalOnly: "Lisenssi voidaan määrittää vain palvelinpäätteestä.", licenseTierPolicyTitle: "Tasopolitiikka", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "osavaltio", licenseStateActive: "Aktiivinen", licenseStateInactive: "Ei-aktiivinen", licenseStateNoLicense: "Ei lisenssiä", licenseKeyMasked: "Avain tallennettu", licenseTier: "Taso", licenseValid: "Voimassa", licenseStatus: "Lisenssin tila", licenseReason: "Syy", licenseCheckedAt: "Tarkastettu klo", licenseStartsAt: "Alkaa klo", licenseExpiresAt: "Päättyy klo", licenseDaysLeft: "Päiviä jäljellä", licenseMaxDevices: "Max laitteet", licenseActiveDevices: "Aktiiviset laitteet", licenseActiveDevicesInfo: "Jos laitetta ei enää käytetä, sen istuin vapautuu automaattisesti 75 minuutin kuluttua.", licenseCustomerEmail: "Asiakkaan sähköposti", licenseFeatures: "Ominaisuudet", licenseFeaturesEmpty: "Ei lisäominaisuuksia", licenseFeatureReadonlyMode: "Vain luku -yhteystila", licenseFeatureReadonlyConnectionsFlag: "Vain luku -liitännät (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunnelointi", licenseFeatureCluster: "Cluster liitännät", licenseFeatureSentinel: "Sentinel liitännät", licenseFeatureReJSON: "ReJSON (JSON tietotyyppi)", keysSort: { on: "Avainten lajittelu päällä", off: "Avainten lajittelu pois" }, cluster: { on: "Cluster päällä", off: "Cluster pois päältä" }, sentinel: { on: "Sentinel päällä", off: "Sentinel pois päältä", name: "Sentinel nimi" }, readonly: { on: "Vain luku päällä", off: "Vain luku pois päältä" }, proSshOnly: "SSH on saatavilla Pro- tai Enterprise-versiossa.", proReadonlyOnly: "Vain luku -yhteystila on käytettävissä Prossa tai Enterprisessa.", enterpriseClusterSentinelOnly: "Cluster ja Sentinel ovat saatavilla vain Enterprisessa.", theme: { light: "Kevyt", dark: "Pimeä yritys", darkNeu: "Tumma", darkoBluo: "Tumma bluo", enterprise: "Yritys", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Yhdistetty: ${opts.name}`; }, tree: "puu", askAuth: "Pyydä lupa", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduulit", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Katkaise yhteys", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Komennot", ungrouped: "Ryhmittelemätön", grouped: "Grouped", connectFirst: "Yhdistä ensin Redis-palvelimeen", searchLanguage: "Hae kieltä...", exportProgress: "Viedään avaimia...", importProgress: "Tuodaan avaimia...", importPreview: "Esikatselu", importOverwrite: "Korvaa", importSkip: "Ohita", importConflict: "Jos avain on jo olemassa:", noKeysToExport: "Ei avaimia vietäväksi", time: "Aika", loading: "Ladataan...", autoRefresh: "Auto", exportSearchHint: "Viedään vain nykyistä hakua vastaavat avaimet", importSearchHint: "Tuonti koskee koko tietokantaa, ei vain hakutuloksia", importNoKeys: "Tiedostosta ei löytynyt avaimia", }, status: { dataCopied: "Tiedot ovat leikepöydällä", licenseSaved: "Lisenssi tallennettu", exportDone: "Vienti valmis", indexCreated: "Indeksi luotu", indexDropped: "Indeksi poistettu", importDone: (opts) => `Tuonti valmis: ${opts.created} luotu, ${opts.skipped} ohitettu, ${opts.errors} virhettä`, nodeRemoved: "Solmu poistettu", keyIsNotExisting: "Tämä avain on voitu poistaa tai vanhentunut.", keyCount: opts => { if (opts.keyCount === 0) { return "Ei avainta"; } else if (opts.keyCount === 1) { return "1 avain"; } else { return `${opts.keyCount} avaimet`; } }, treeExpandAll: "Laajenna kaikki puun lehdet. Tämä toimenpide voi olla kallis ja voi viedä aikaa...", noRedisKeys: "Tässä tietokannassa ei ole avaimia.", redisConnected: "Redis yhdistäminen onnistui", reloadingDataInfo: "Ladataan uudelleen Redis-tietoja", added: "Lisätty", saved: "Päivitetty", cancelled: "Peruutettu", deleted: "Poistettu", savedRedis: "Redis tiedot tallennetaan", redisDisconnected: opts => { return `Nykyisessä yhteydessä oli virhe: ${opts.error.message}`; }, dbChanged: opts => { return `db-indeksi on asetettu arvoon ${opts.db}. `; }, treeDeleted: opts => { return `Puuavain poistettiin (${opts.key}).`; }, deletedKey: opts => { return `avain poistettiin (${opts.key}).`; }, renamedKey: "Tämä avain on nimetty uudelleen", ttlChanged: "Tämän avaimen TTL on muutettu", notInteger: "Tämä syöte ei ole kokonaisluku", persisted: "Tämä avain säilyy ikuisesti", set: "Avain on asetettu/lisätty" }, code: { "delete-connection": "Tämä yhteys poistettiin, joten yhteys tähän Redis-esiintymään on katkaistu.", "save-connection": "Tätä yhteyttä on muutettu, joten yhteys tähän Redis-instanssiin on katkennut. Voit muodostaa yhteyden uudelleen.", "readonly-connections": "Lisää/tallenna/poista yhteydet ovat vain luku -tilassa!", "readonly-connection-mode": "Tämä yhteys on vain luku -tilassa!", "list-out-of-bounds": "Tämä luettelohakemisto on rajojen ulkopuolella", "donation-ware-feature": "Tämä ominaisuus on mukana lahjoitusversiossa.", "feature-pro-readonly-required": "Vain luku -yhteystila vaatii Pro- tai Enterprise-lisenssin.", "feature-pro-ssh-required": "SSH tunnelointi vaatii Pro- tai Enterprise-lisenssin.", "feature-enterprise-cluster-sentinel-required": "Cluster ja Sentinel vaativat Enterprise-lisenssin.", "feature-pro-json-binary-required": "Muokkaa JSON, lataa binaari ja lataa binaari vaatii Pro- tai Enterprise-lisenssin.", "feature-pro-rejson-required": "ReJSON (JSON-tietotyyppi) vaatii Pro- tai Enterprise-lisenssin.", "invalid-json-value": "Arvo ei ole kelvollinen JSON.", "http_auth_required": "Valtuutus vaaditaan: todenna HTTP Basic Auth ja lataa uudelleen.", "auto-connection-failed": "Mahdollisesti yhteys katkesi ja automaattinen yhteys epäonnistui tämän vuoksi.", invalid_console_command: "Tämä komento ei toimi GUI:n kautta." }, licenseReason: { LICENSE_VALID: "Lisenssi on voimassa", LICENSE_INVALID: "Lisenssi on virheellinen", LICENSE_MISSING: "Lisenssiavainta ei ole asetettu", LICENSE_DISABLED: "Lisenssi on poistettu käytöstä palvelimen asetuksissa", LICENSE_NOT_FOUND: "Lisenssiä ei löytynyt", LICENSE_EXPIRED: "Lisenssi on vanhentunut", LICENSE_CLEARED: "Lisenssiavain tyhjennettiin", LICENSE_MAX_DEVICES_REACHED: "Laitepaikkojen enimmäismäärä saavutettu", PRODUCT_MISMATCH: "Lisenssituote ei täsmää" }, licenseStatusValue: { active: "Aktiivinen", deleted: "Poistettu", all: "Kaikki", expired: "Vanhentunut", missing: "Puuttuu", inactive: "Ei-aktiivinen" }, form: { error: { required: "Pakollinen", port: "Portti on välillä 1-65535", invalid: "Lomake on virheellinen" }, connection: { label: { name: "Nimi", group: "Group", host: "Isäntänimi", port: "Portti", password: "Salasana", username: "Käyttäjätunnus" } }, treeSettings: { maxValueDisplay: "Näytön merkkijonon enimmäispituus", maxValueDisplayInfo: "Jos asetettu arvoon 0, näytä täydet arvot. Jos suurempi kuin 0, lyhennä tähän pituuteen. Jos -1: merkkijonoille, piilota arvo, kunnes muokkaa; muille tyypeille, näytä koko sisältö.", maxKeys: "Avainten enimmäismäärä", maxKeysInfo: "Jotta GUI ei kaatuisi, rajoitamme avainten enimmäismäärää.", keyCount: () => { return `Avainten määrä: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Käytä animaatiota", noAnimation: "Ei animaatiota", jsonFormatTwoSpace: "Muoto JSON, jossa on 2 välilyöntiä", jsonFormatFourSpace: "Muoto JSON, jossa on 4 välilyöntiä", formName: "Redis-asetukset", searchModeClient: "Asiakashakutila", searchModeServer: "Palvelimen hakutila", searchModeStartsWith: "Haku alkaa tilalla", searchModeIncludes: "Haku sisältää tilan" }, field: { treeSeparator: "Puiden erotin", treeSeparatorSelector: "Puiden erottimen valitsin", page: "Puun sivujen määrä", keyPageCount: "Avainten sivujen määrä", keysSort: "Lajittele avaimet", searchMode: "Hakutila", searchModeStartsWith: "Haku alkaa / sisältää" }, error: { keyPageCount: "Avainsivumäärän on oltava kokonaisluku väliltä 5–100", page: "Sivumäärän tulee olla kokonaisluku välillä 10 - 5000", maxValueDisplay: "Näytön enimmäisarvon on oltava kokonaisluku välillä -1 ja 32768", maxKeys: "Avainten enimmäismäärän arvon on oltava kokonaisluku välillä 100–100 000" } }, key: { label: { formName: { add: "Lisää uusi Redis-avain", edit: "Muokkaa avainta Redis", append: "Lisää olemassa olevaan Redis-avaimeen" } }, field: { streamTimestamp: "Aikaleima", key: "Avain", type: "Kirjoita", index: "Hakemisto", hashKey: "Hash-avain", score: "Pisteet", value: "Arvo" }, error: { streamTimestamp: "Aikaleima vaaditaan joko muodossa Redis tai muodossa *", key: "Avain on ainakin yksi merkki", hashKey: "Hajautustaulukon avain on vähintään yksi merkki", score: "Lajiteltu pistemäärä vaaditaan", value: "Arvo vaaditaan" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Haku", index: "Indeksi", query: "Kysely", results: "Tulokset", noIndex: "Indeksejä ei löytynyt", createIndex: "Luo indeksi", dropIndex: "Poista indeksi", indexInfo: "Indeksin tiedot", indexName: "Indeksin nimi", prefix: "Avaimen etuliite (valinnainen)", fieldName: "Kentän nimi", }, monitor: { title: "Seuranta", memory: "Muisti", opsPerSec: "Ops/sek", clients: "Asiakkaat", blocked: "Estetty", hitsMisses: "Osumisaste", networkIo: "Verkko I/O", slowLog: "Hidas loki", totalCommands: "Yhteensä", expired: "Vanhentuneet", evicted: "Häädetyt", clientList: "Asiakasluettelo", topKeys: "Suurimmat avaimet muistin mukaan", killClient: "Tapa asiakas", clientKilled: "Asiakas tapettu", confirmKillClient: "Haluatko varmasti lopettaa tämän asiakkaan?", noKeys: "Ei avaimia", noClients: "Ei asiakkaita", }, overview: { noConnected: "Ei yhteyttä laitteeseen Redis.", overviewClients: "Listaa yhdistetyt asiakkaiden lukumäärän mukaan", connectedCount: opt => { if (opt.length === 1) { return "1 asiakas"; } return `${opt.length} asiakkaita`; } }, key: { label: { key: "Avain", encoding: "Koodaus", length: "Koko", ttl: "TTL", ttlTitle: "Aika elää", type: "Kirjoita", ttlNotExpire: "ei vanhene", lengthString: "tavua", lengthItem: "kohteita", actions: "Toiminnot" }, list: { table: { index: "Hakemisto", value: "Arvo" } }, hash: { table: { hashkey: "Hashkey", value: "Arvo" } }, set: { table: { value: "jäsen" } }, zset: { table: { value: "jäsen", score: "Pisteet" } }, stream: { table: { timestamp: "Aikaleiman tunnus", field: "Kenttä", value: "Arvo" } } }, treeControls: { settings: "Puun asetukset", expandAll: "Laajenna kaikki", collapseAll: "Kutista kaikki", search: { search: "Etsi avaimista", clear: "Tyhjennä nykyinen haku tyhjäksi", placeholderClient: "Haku asiakkaan puolelta", placeholderServer: "Haku palvelimen puolelta", info: "Asiakaspuolen haku tarkoittaa, että se vastaa hakusyötteen tekstiä. Palvelinpuolen haku tarkoittaa, että se on kuin haku näppäinmalleissa *{search-text}*. Suurille hakusarjoille on parempi käyttää palvelinpuolen hakua. Pienemmille hakusarjoille on parempi käyttää asiakaspuolen hakutilaa." + ` Jos avainten määrä on ohi ${p3xr.settings.maxLightKeysCount}, voit etsiä vain palvelimen puolelta.`, largeSetInfo: "Suuressa joukossa asiakaspuolen haku on poistettu käytöstä. joten tällä hetkellä vain palvelinpuolen haku on mahdollista.", infoDetails: "Jos haluat tietää, miten haku toimii, tarkista asetukset" }, pager: { next: "Seuraavaksi", prev: "Edellinen", first: "Ensin", last: "Viimeinen" } } }, time: { loading: "Ladataan...", years: "vuotta", months: "kuukautta", days: "päivää", year: "vuosi", month: "kuukausi", day: "päivä" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/fil/000077500000000000000000000000001517666434100141255ustar00rootroot00000000000000src/strings/fil/strings.js000066400000000000000000000717761517666434100161760ustar00rootroot00000000000000const strings = { error: { cleared_license: "Na-clear ang lisensya", invalid_license: "Di-wastong lisensya", license_max_devices_reached: "Naabot na ang maximum na upuan ng device", license_readonly: "Maaari lamang baguhin ang lisensya mula sa terminal ng server.", server_error: "Error sa server, pakisubukang muli" }, title: { donate: "Mag-donate", jsonRecursive: "Pagpapalawak ng lahat ng mga dahon", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Maaari kang pumili ng Redis na koneksyon upang kumonekta mula sa kaliwang ibabang menu.", statistics: "Mga istatistika", error: "Error", connectingRedis: "Kumokonekta sa Redis ...", socketioConnectError: "Socket.IO Error", db: "DB", server: "Server", clients: "Mga kliyente", memory: "Alaala", persistence: "Pagtitiyaga", stats: "Mga istatistika", replication: "Pagtitiklop", cpu: "CPU", cluster: "Cluster", modules: "Mga Module", errorstats: "Estadistika ng Error", commandstats: "Estadistika ng Command", latencystats: "Estadistika ng Latency", keysizes: "Laki ng Susi", threads: "Mga Thread", }, confirm: { dropIndex: "Sigurado ka bang tanggalin ang index na ito?", uploadBuffer: "Sigurado ka bang ia-upload ang binary data na ito?", uploadBufferDone: "Ang binary data ay na-upload", uploadBufferDoneAndSave: "Ang binary data ay na-upload at nai-save sa server", title: "Kumpirmahin", alert: "Alerto", info: "Impormasyon", deleteListItem: "Sigurado ka bang tatanggalin ang item sa listahan na ito?", deleteHashKey: "Sigurado ka bang tatanggalin ang hash key item na ito?", deleteStreamTimestamp: "Sigurado ka bang tatanggalin ang timestamp ng stream na ito?", deleteSetMember: "Sigurado ka bang tatanggalin ang set member na ito?", deleteZSetMember: "Sigurado ka bang tatanggalin ang pinagsunod-sunod na miyembrong ito?", deleteConnection: "Kumpirmahin", deleteConnectionText: "Sigurado ka bang tatanggalin ang koneksyong Redis na ito?", deleteNode: "Sigurado ka bang tatanggalin ang Redis node na ito?", deleteAllKeys: opts => { return `Tanggalin ang punong ito at lahat ng susi nito (${opts.key})?`; }, socketioConnectError: "Ang Socket.IO ay hindi makakonekta sa server, maaari mong i-reload at subukang lutasin ang error sa koneksyon sa iyong sarili, hindi alam ng kliyente kung paano lutasin ito mismo.", socketioAuthRequired: "Kinakailangan ang pahintulot ng Socket.IO. Paki-authenticate gamit ang HTTP Basic Auth (username/password) at i-reload.", deleteKey: "Sigurado ka bang tatanggalin ang key na ito?", rename: { title: "Sigurado ka bang papalitan ang pangalan ng key na ito?", textContent: "Ang pagkilos na ito ay permanenteng pinapalitan ang pangalan ng susi.", placeholder: "Ang Redis key (kinakailangan)" }, ttl: { title: "Sigurado ka bang gusto mong baguhin ang TTL ng key na ito?", textContent: "Ang pagpapalit ng TTL ay nag-a-update sa oras ng key na ito upang mabuhay. Iwanang walang laman upang panatilihin ang susi na ito magpakailanman.", placeholder: "Ang Redis key ng TTL (integer o walang laman)", placeholderPlaceholder: "Ang walang laman ay nangangahulugan na ito ay nagpapatuloy magpakailanman; kung hindi, maglagay ng integer.", convertTextToTime: "I-convert ang teksto sa oras", convertTextToTimePlaceholder: "Hal. Ang 1d ay magiging 86400" }, license: { title: "Itakda ang lisensya", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20AC1/month) or 4,000 HUF/year (\u20AC10/year), and Enterprise 1,200 HUF/month (\u20AC3/month) or 12,000 HUF/year (\u20AC30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20AC1.27/month) or 5,100 HUF/year (\u20AC12.70/year), Enterprise 1,500 HUF/month (\u20AC3.81/month) or 15,200 HUF/year (\u20AC38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Susi ng lisensya" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopyahin", downloadBuffer: "I-download ang binary", setBuffer: "Mag-upload ng binary", exportKeys: "I-export ang mga key", exportAllKeys: (opts) => `I-export lahat ng ${opts.count} key`, exportSearchResults: (opts) => `I-export ${opts.count} resulta`, importKeys: "I-import ang mga key", saveWithFormatJson: "I-save gamit ang format", formatJson: "I-format si Json", wrap: "Balutin", unwrap: "I-unwrap", downloadJson: "I-download ang JSON", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Wika", ok: "OK", addKey: "Idagdag sa key na ito", addKeyRoot: "Magdagdag ng root key", reloadKey: "I-reload ang key", reload: "I-reload", close: "Isara", commands: "Mga utos", view: "Tingnan", statistics: "Mga istatistika", refresh: "I-refresh", pause: "I-pause", resume: "Ituloy", clear: "Maaliwalas", rename: "Palitan ang pangalan", main: "Database", cancel: "Kanselahin", theme: "Tema", github: "GitHub", githubRepo: "Imbakan", githubRelease: "Mga release", githubChangelog: "Changelog", info: "Info", settings: "Mga setting", connect: "Kumonekta", disconnect: "Idiskonekta", overview: "Pangkalahatang-ideya", console: "Console", noConnections: "Walang koneksyon, magdagdag ng koneksyon sa menu ng mga setting.", noConnectionsInSettings: "Walang koneksyon, maaari kang magdagdag ng BAGONG CONNECTION sa itaas.", connectionAdd: "Bagong koneksyon", addGroup: "Magdagdag ng grupo", extend: "Palawigin", collapse: "I-collapse", add: "Idagdag", edit: "I-edit", save: "I-save", ttl: "Itakda ang TTL", license: "Itakda ang lisensya", delete: "Tanggalin", remove: "Alisin", sure: "Oo naman", testConnection: "Subukan ang koneksyon", getKey: "Nilo-load ang Redis key at nauugnay na data ...", jsonViewShow: "Ipakita ang JSON", jsonViewEditor: "I-edit ang JSON", quickConsole: "Mabilis na Console", }, label: { id: { nodeId: "Node ID", id: "ID ng Koneksyon", info: "Kung ayaw mong baguhin ang mga katangian ng: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, mangyaring ilagay ang ID ng koneksyon sa mga property na iyon upang mapanatiling buo ang mga value ng property. Kung gusto mo ng parehong logic sa node password, pagkatapos ay ilagay ang node ID sa node password." }, secureFeature: "Kung makakita ka ng isang halaga na nagsisimula sa isang P3X na katulad ng hitsura, ito ay isang secure na tampok. Upang baguhin ang mga setting, palitan lamang ang mga setting na ito ng walang laman o iba pa at mase-save ang mga ito. Kung hindi mo babaguhin ang mga setting, ang mga setting ay pananatilihin habang ang mga ito ay nasa server.", ssh: { on: "Naka-on ang SSH", off: "Naka-off ang SSH", sshHost: "SSH Host", sshPort: "SSH port", sshUsername: "SSH username", sshPassword: "SSH password", sshPrivateKey: "SSH pribadong key" }, isBuffer: opts => `[object ArrayBuffer] ay nangangahulugan na ang halaga ay binary data o ang halaga ay mas malaki kaysa ${opts.maxValueAsBuffer}`, streamValue: `Ang field ng stream at value ay isang oneliner. Hal.: field1 value1 "field 2" "value 2"`, streamTimestampId: `Ang ibig sabihin ng '*' ay awtomatikong nabuo o ang detalye bilang -`, unableToLoadKey: ({ key }) => { return `Hindi ma-load ang key na ito: ${key}. Posible, ang susi ay tinanggal. Ang eksaktong error ay nasa console.`; }, bigJson: "Ang JSON object na ito ay higit sa 10 kb, kaya siguraduhing alam mo kung ano ang iyong ginagawa, dahil ang ilang mga function ay maaaring mabagal na pag-render.", addNode: "Magdagdag ng node", validateJson: "I-validate ang JSON", reducedFunction: `Nabawasan ang pag-andar`, tooManyKeys: opts => { return `Para sa buong maximum na mga function na pinapayagan ang kabuuang mga key ay ${opts.maxLightKeysCount} bilangin. Ang database na ito ay may higit sa pinapayagang mga key sa kabuuan ${opts.count}. Ang pag-uuri ng susi at ang karagdagang impormasyon ng magarbong puno ay hindi pinagana. Ang paghahanap ay nangyayari lamang sa server sa halip na ang paghahanap ng kliyente.`; }, redisCommandNotFound: "Walang nakitang Redis command match ...", treeKeyStore: `Ang pag-uuri (natural na paghahambing) ay isinasagawa sa kliyente aka browser, na nangangahulugang mayroon itong parusa para sa malalaking malalaking set, tulad ng higit sa 10k key, maaari itong magdagdag ng kaunting oras sa pag-render ng page. Walang key sorting sa Redis, ganito lang.`, socketIoTimeout: options => { return `Nag-time out ang Socket.IO para sa kahilingang ito (max ${options.timeout / 1000} segundo)...`; }, resizerInfo: options => { return `Kaliwa o kanang panel minimum na lapad ay ${options.width}px`; }, jsonViewNotParsable: "Ang value na ito ay hindi JSON parsable ", ttlTitle: "Itakda ang TTL sa ilang segundo", passwordSecure: "Maaaring walang laman ang password, ngunit magpapakita pa rin ito ng mga character, isa itong tampok na panseguridad.", tlsWithoutCert: "Paganahin ang TLS nang walang karagdagang certificate", tlsRejectUnauthorized: "Tanggihan ang hindi awtorisadong sertipiko", tlsSecure: "Kung makakita ka ng configuration ng TLS na nagsisimula sa isang P3X o lahat ng mga setting ng TLS ay mukhang pareho, isa itong secure na feature. Upang baguhin ang mga setting, palitan lamang ang mga setting na ito ng walang laman o iba pa at mase-save ang mga ito. Kung hindi mo babaguhin ang mga setting ng TLS, pananatilihin ang mga setting habang nasa server ang mga ito.", treeSeparatorEmpty: "Kung ang tree separator ay walang laman, ang puno ay walang nested node, isang purong listahan lamang", treeSeparatorEmptyNote: "Walang nested node, puro listahan lang", welcomeConsole: "Maligayang pagdating sa Redis Console", welcomeConsoleInfo: "Cursor UP o DOWN history ay pinagana", redisListIndexInfo: "Walang laman para idagdag, -1 para i-prepend o i-save ito sa ipinapakitang posisyon.", console: "Console", connectiondAdd: "Magdagdag ng koneksyon", connectiondEdit: "I-edit ang koneksyon", connectiondView: "Tingnan ang koneksyon", connections: "Mga koneksyon", licenseInfo: "Lisensya", licenseEditable: "Mae-edit ang lisensya", licenseEditableYes: "Oo", licenseEditableNo: "Hindi", licenseTerminalOnly: "Maaari lamang i-configure ang lisensya mula sa terminal ng server.", licenseTierPolicyTitle: "Patakaran sa antas", licenseTierPolicyText: "

Free

core Redis UI lang; walang SSH tunneling, walang Readonly connection mode, walang Cluster/Sentinel, walang Edit JSON/Upload binary/Download binary, no ReJSON.
Presyo: 0 HUF/buwan (€0/buwan) JSON, Mag-upload ng binary, Mag-download ng binary, ReJSON.
Base na presyo: 400 HUF/buwan (€1/buwan) o 9. (€10/taon).
Kabuuan na may 27% VAT: 500 HUF/buwan (€1.27,1 buwan0) o HUF/taon (€12.70/taon) Cluster at Sentinel, kasama ang Edit JSON, Mag-upload ng binary, Mag-download ng binary, ReJSON; Gumagana din ang --readonly-connections/-r.
Base na presyo: 1,200 HUF/buwan (€3/buwan) o 12,000 HUF/taon (€30/taon).
Kabuuan na may 27% VAT: 1,500 HUF/buwan (€3.81/buwan), o 3.81 €/buwan HUF/taon (€38.10/taon) presyo.

Seats

Default na lisensya ay may kasamang 5 upuan. Kung kailangan mo ng higit pang mga upuan, makipag-ugnayan sa amin sa support@corifeus.com.

support@corifeus.com.

XCenterprise trial OKZ0QP3X na araw na walang bayad para sa sinumang tunay na email address na may kasalukuyang email address para sa sinuman (hindi pagsubok na email).

Impormasyon sa pagsingil sa e-mail

Name, Billing e-mail, Country code, Postal code, Lungsod, Address, VAT (opsyonal). pagkatapos ipadala ang pera @ https://paypal.me/corifeus padadalhan kita ng invoice. Ang lahat ng mga pagbabayad ay hindi maibabalik.

VAT

VAT ay idinagdag sa presyo (27% Hungary).

Contact

Kung gusto mong mag-hi o may tanong, makipag-ugnayan support@corifeus.com.

Language

Invoice at lisensyang Ingles ang e-mail na Ingles. Ang currency ng invoice ay HUF.

Note

Ang pagpapatunay ng lisensya ay nangangailangan ng internet access.", licenseState: "Estado", licenseStateActive: "Aktibo", licenseStateInactive: "Hindi aktibo", licenseStateNoLicense: "Walang lisensya", licenseKeyMasked: "Naka-save na susi", licenseTier: "Tier", licenseValid: "Wasto", licenseStatus: "Katayuan ng lisensya", licenseReason: "Dahilan", licenseCheckedAt: "Sinuri sa", licenseStartsAt: "Nagsisimula sa", licenseExpiresAt: "Mag-e-expire sa", licenseDaysLeft: "Mga araw na natitira", licenseMaxDevices: "Max na device", licenseActiveDevices: "Mga aktibong device", licenseActiveDevicesInfo: "Kung ang isang aparato ay hindi na ginagamit, ang upuan nito ay awtomatikong ilalabas pagkatapos ng 75 minuto.", licenseCustomerEmail: "Email ng customer", licenseFeatures: "Mga tampok", licenseFeaturesEmpty: "Walang mga karagdagang tampok", licenseFeatureReadonlyMode: "Readonly na connection mode", licenseFeatureReadonlyConnectionsFlag: "Readonly na mga koneksyon (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Cluster na mga koneksyon", licenseFeatureSentinel: "Sentinel na mga koneksyon", licenseFeatureReJSON: "ReJSON (JSON uri ng data)", keysSort: { on: "Naka-on ang pag-uuri ng susi", off: "Pag-uuri ng susi" }, cluster: { on: "Naka-on ang Cluster", off: "Naka-off ang Cluster" }, sentinel: { on: "Naka-on ang Sentinel", off: "Naka-off ang Sentinel", name: "Sentinel pangalan" }, readonly: { on: "Readonly on", off: "Readonly off" }, proSshOnly: "Ang SSH ay available sa Pro o Enterprise.", proReadonlyOnly: "Readonly connection mode ay available sa Pro o Enterprise.", enterpriseClusterSentinelOnly: "Available lang sa Enterprise ang Cluster at Sentinel.", theme: { light: "Liwanag", dark: "Madilim na negosyo", darkNeu: "Madilim", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Nakakonekta: ${opts.name}`; }, tree: "Puno", askAuth: "Humingi ng pahintulot", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Mga Module", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Idiskonekta", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Mga Utos ng Redis", ungrouped: "Walang pangkat", grouped: "Grouped", connectFirst: "Kumonekta muna sa isang Redis server", searchLanguage: "Maghanap ng wika...", exportProgress: "Nag-e-export ng mga key...", importProgress: "Nag-i-import ng mga key...", importPreview: "Preview", importOverwrite: "I-overwrite", importSkip: "Laktawan", importConflict: "Kung ang key ay mayroon na:", noKeysToExport: "Walang key na ie-export", time: "Oras", loading: "Naglo-load...", autoRefresh: "Auto", exportSearchHint: "Nag-e-export lamang ng mga key na tumutugma sa kasalukuyang paghahanap", importSearchHint: "Ang import ay nalalapat sa buong database, hindi lamang sa mga resulta ng paghahanap", importNoKeys: "Walang nahanap na key sa file", }, status: { dataCopied: "Ang data ay nasa clipboard", licenseSaved: "Na-save ang lisensya", exportDone: "Kumpleto na ang export", indexCreated: "Index nilikha", indexDropped: "Index tinanggal", importDone: (opts) => `Kumpleto na ang import: ${opts.created} nilikha, ${opts.skipped} nilaktawan, ${opts.errors} mga error`, nodeRemoved: "Inalis ang node", keyIsNotExisting: "Maaaring natanggal o nag-expire ang key na ito.", keyCount: opts => { if (opts.keyCount === 0) { return "Walang susi"; } else if (opts.keyCount === 1) { return "1 susi"; } else { return `${opts.keyCount} mga susi`; } }, treeExpandAll: "Palawakin ang lahat ng mga dahon ng puno. Maaaring magastos ang operasyong ito at maaaring magtagal...", noRedisKeys: "Walang mga susi sa database na ito.", redisConnected: "Matagumpay na nakakonekta ang Redis", reloadingDataInfo: "Nire-reload ang impormasyon ng data ng Redis", added: "Idinagdag", saved: "Na-update", cancelled: "Kinansela", deleted: "Tinanggal", savedRedis: "Ang data ng Redis ay nai-save", redisDisconnected: opts => { return `Nagkaroon ng error ang kasalukuyang koneksyon: ${opts.error.message}`; }, dbChanged: opts => { return `Nakatakda ang db index sa ${opts.db}. `; }, treeDeleted: opts => { return `Ang tree key ay tinanggal (${opts.key}).`; }, deletedKey: opts => { return `Ang susi ay tinanggal (${opts.key}).`; }, renamedKey: "Ang susi na ito ay pinalitan ng pangalan", ttlChanged: "Ang TTL ng key na ito ay nabago", notInteger: "Ang input na ito ay hindi isang integer", persisted: "Ang susi na ito ay nananatili magpakailanman", set: "Ang susi ay itinakda/idinagdag" }, code: { "delete-connection": "Ang koneksyon na ito ay tinanggal, kaya ikaw ay nadiskonekta sa Redis instance na ito.", "save-connection": "Binago ang koneksyon na ito, kaya nadiskonekta ka sa Redis instance na ito. Maaari kang muling kumonekta.", "readonly-connections": "Ang mga koneksyon na idinaragdag/i-save/tanggal ay readonly lamang!", "readonly-connection-mode": "Read only mode ang koneksyon na ito!", "list-out-of-bounds": "Ang listahan ng index na ito ay wala sa hangganan", "donation-ware-feature": "Ang tampok na ito ay nasa bersyon ng donasyon.", "feature-pro-readonly-required": "Ang read-only na connection mode ay nangangailangan ng Pro o Enterprise na lisensya.", "feature-pro-ssh-required": "Ang SSH tunneling ay nangangailangan ng Pro o Enterprise na lisensya.", "feature-enterprise-cluster-sentinel-required": "Ang Cluster at Sentinel ay nangangailangan ng lisensya ng Enterprise.", "feature-pro-json-binary-required": "I-edit ang JSON, Mag-upload ng binary at Mag-download ng binary ay nangangailangan ng lisensya ng Pro o Enterprise.", "feature-pro-rejson-required": "Ang ReJSON (JSON uri ng data) ay nangangailangan ng Pro o Enterprise na lisensya.", "invalid-json-value": "Ang halaga ay hindi wasto JSON.", "http_auth_required": "Kinakailangan ang pahintulot: mangyaring patotohanan gamit ang HTTP Basic Auth at i-reload.", "auto-connection-failed": "Posible, naalis ang koneksyon at nabigo ang awtomatikong koneksyon, dahil dito.", invalid_console_command: "Hindi gumagana ang command na ito sa pamamagitan ng GUI." }, licenseReason: { LICENSE_VALID: "May bisa ang lisensya", LICENSE_INVALID: "Di-wasto ang lisensya", LICENSE_MISSING: "Walang nakatakdang susi ng lisensya", LICENSE_DISABLED: "Hindi pinagana ang lisensya sa config ng server", LICENSE_NOT_FOUND: "Hindi nakita ang lisensya", LICENSE_EXPIRED: "Nag-expire na ang lisensya", LICENSE_CLEARED: "Na-clear ang susi ng lisensya", LICENSE_MAX_DEVICES_REACHED: "Naabot na ang maximum na upuan ng device", PRODUCT_MISMATCH: "Ang produkto ng lisensya ay hindi tumutugma" }, licenseStatusValue: { active: "Aktibo", deleted: "Tinanggal", all: "Lahat", expired: "Nag-expire na", missing: "Nawawala", inactive: "Hindi aktibo" }, form: { error: { required: "Kinakailangan", port: "Ang port ay nasa pagitan ng 1-65535", invalid: "Ang form ay hindi wasto" }, connection: { label: { name: "Pangalan", group: "Group", host: "Hostname", port: "Port", password: "Password", username: "Username" } }, treeSettings: { maxValueDisplay: "Max value na haba ng string ng display", maxValueDisplayInfo: "Kung nakatakda sa 0, ipakita ang buong halaga. Kung mas malaki sa 0, putulin ang haba na ito. Kung -1: para sa mga string, itago ang halaga hanggang sa i-edit; para sa iba pang mga uri, ipakita ang buong nilalaman.", maxKeys: "Ang max na bilang ng susi", maxKeysInfo: "Para hindi mag-crash ang GUI, nililimitahan namin ang max key count.", keyCount: () => { return `Bilang ng mga susi: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Gumamit ng animation", noAnimation: "Walang animation", jsonFormatTwoSpace: "I-format ang JSON na may 2 espasyo", jsonFormatFourSpace: "I-format ang JSON na may 4 na espasyo", formName: "Mga setting ng Redis", searchModeClient: "Mode ng paghahanap ng kliyente", searchModeServer: "Mode ng paghahanap ng server", searchModeStartsWith: "Ang paghahanap ay nagsisimula sa mode", searchModeIncludes: "Kasama sa paghahanap ang mode" }, field: { treeSeparator: "Tagahiwalay ng puno", treeSeparatorSelector: "Tagapili ng tree separator", page: "Bilang ng paging ng puno", keyPageCount: "Bilang ng pangunahing paging", keysSort: "Pagbukud-bukurin ang mga susi", searchMode: "Mode ng paghahanap", searchModeStartsWith: "Nagsisimula ang paghahanap sa / kasama" }, error: { keyPageCount: "Ang pangunahing bilang ng pahina ay dapat na isang integer sa pagitan ng 5 - 100", page: "Ang bilang ng pahina ay dapat na isang integer sa pagitan ng 10 - 5000", maxValueDisplay: "Ang maximum na halaga ng display ay dapat na isang integer sa pagitan ng -1 at 32768", maxKeys: "Ang maximum na halaga ng bilang ng susi ay dapat na isang integer sa pagitan ng 100 at 100000" } }, key: { label: { formName: { add: "Magdagdag ng bagong Redis key", edit: "I-edit ang Redis key", append: "Idagdag sa kasalukuyang Redis key" } }, field: { streamTimestamp: "Timestamp", key: "Susi", type: "Uri", index: "Index", hashKey: "Hash key", score: "Puntos", value: "Halaga" }, error: { streamTimestamp: "Kinakailangan ang timestamp, alinman sa Redis na format o bilang *", key: "Ang susi ay, hindi bababa sa, isang karakter", hashKey: "Ang hash table key ay hindi bababa sa isang character", score: "Kinakailangan ang pinagsunod-sunod na marka", value: "Kinakailangan ang halaga" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Paghahanap", index: "Index", query: "Query", results: "Mga resulta", noIndex: "Walang nahanap na index", createIndex: "Lumikha ng index", dropIndex: "Tanggalin ang index", indexInfo: "Info ng index", indexName: "Pangalan ng index", prefix: "Key prefix (opsyonal)", fieldName: "Pangalan ng field", }, monitor: { title: "Monitoring", memory: "Memorya", opsPerSec: "Ops/seg", clients: "Mga kliyente", blocked: "Na-block", hitsMisses: "Hit Rate", networkIo: "Network I/O", slowLog: "Mabagal na log", totalCommands: "Kabuuan", expired: "Nag-expire", evicted: "Na-evict", clientList: "Listahan ng kliyente", topKeys: "Pinakamalaking key sa memorya", killClient: "Patayin ang kliyente", clientKilled: "Napatay ang kliyente", confirmKillClient: "Sigurado ka bang ihinto ang client na ito?", noKeys: "Walang key", noClients: "Walang client", }, overview: { noConnected: "Walang koneksyon sa Redis.", overviewClients: "Ilista ang konektado sa pamamagitan ng bilang ng mga kliyente", connectedCount: opt => { if (opt.length === 1) { return "1 kliyente"; } return `${opt.length} mga kliyente`; } }, key: { label: { key: "Susi", encoding: "Encoding", length: "Sukat", ttl: "TTL", ttlTitle: "Oras Para Mabuhay", type: "Uri", ttlNotExpire: "hindi mawawalan ng bisa", lengthString: "byte", lengthItem: "mga bagay", actions: "Mga aksyon" }, list: { table: { index: "Index", value: "Halaga" } }, hash: { table: { hashkey: "Hashkey", value: "Halaga" } }, set: { table: { value: "Miyembro" } }, zset: { table: { value: "Miyembro", score: "Puntos" } }, stream: { table: { timestamp: "Timestamp ID", field: "Patlang", value: "Halaga" } } }, treeControls: { settings: "Mga setting ng puno", expandAll: "Palawakin lahat", collapseAll: "I-collapse lahat", search: { search: "Maghanap sa mga susi", clear: "I-clear ang kasalukuyang paghahanap upang itakdang walang laman", placeholderClient: "Maghanap sa panig ng kliyente", placeholderServer: "Maghanap sa gilid ng server", info: "Ang ibig sabihin ng paghahanap sa panig ng kliyente, na tumutugma ito sa teksto sa input ng paghahanap. Ang ibig sabihin ng paghahanap sa gilid ng server, iyon ay tulad ng paghahanap sa mga pattern ng key bilang *{search-text}*. Para sa malalaking hanay ng paghahanap, mas mainam na gumamit ng paghahanap sa gilid ng server. Para sa mas maliliit na hanay ng paghahanap, mas mainam na gamitin ang client side search mode." + ` Kung ang bilang ng mga susi ay tapos na ${p3xr.settings.maxLightKeysCount}, maaari ka lamang maghanap sa gilid ng server.`, largeSetInfo: "Sa isang malaking hanay, hindi pinagana ang paghahanap sa panig ng kliyente. kaya sa ngayon tanging server side searching lang ang posible.", infoDetails: "Upang malaman kung paano gumagana ang paghahanap, pakitingnan ang mga setting" }, pager: { next: "Susunod", prev: "Nakaraang", first: "Una", last: "Huli" } } }, time: { loading: "Naglo-load...", years: "taon", months: "buwan", days: "araw", year: "taon", month: "buwan", day: "araw" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/fr/000077500000000000000000000000001517666434100137625ustar00rootroot00000000000000src/strings/fr/strings.js000066400000000000000000000727101517666434100160200ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licence effacée", invalid_license: "Licence non valide", license_max_devices_reached: "Nombre maximum de postes d'appareils atteint", license_readonly: "La licence ne peut être modifiée que depuis le terminal du serveur.", server_error: "Erreur du serveur, veuillez réessayer" }, title: { donate: "Don", jsonRecursive: "Expansion de toutes les feuilles", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Vous pouvez choisir une connexion Redis depuis le menu en bas à gauche.", statistics: "Statistiques", error: "Erreur", connectingRedis: "Connexion à Redis ...", socketioConnectError: "Erreur Socket.IO", db: "DB", server: "Serveur", clients: "Clients", memory: "Mémoire", persistence: "Persistance", stats: "Statistiques", replication: "Réplication", cpu: "CPU", cluster: "Cluster", modules: "Modules", errorstats: "Statistiques d'erreurs", commandstats: "Statistiques de commandes", latencystats: "Statistiques de latence", keysizes: "Tailles des clés", threads: "Fils d'exécution", }, confirm: { dropIndex: "Voulez-vous vraiment supprimer cet index ?", uploadBuffer: "Êtes-vous sûr de vouloir télécharger ces données binaires ?", uploadBufferDone: "Les données binaires ont été téléchargées", uploadBufferDoneAndSave: "Les données binaires ont été téléchargées et enregistrées sur le serveur", title: "Confirmer", alert: "Alerte", info: "Info", deleteListItem: "Êtes-vous sûr de vouloir supprimer cet élément de la liste ?", deleteHashKey: "Êtes-vous sûr de vouloir supprimer cette clé hash ?", deleteStreamTimestamp: "Êtes-vous sûr de vouloir supprimer cet horodatage du flux ?", deleteSetMember: "Êtes-vous sûr de vouloir supprimer ce membre de l'ensemble ?", deleteZSetMember: "Êtes-vous sûr de vouloir supprimer ce membre de l'ensemble trié ?", deleteConnection: "Confirmer", deleteConnectionText: "Êtes-vous sûr de vouloir supprimer cette connexion Redis ?", deleteNode: "Êtes-vous sûr de vouloir supprimer ce nœud Redis ?", deleteAllKeys: opts => { return `Supprimer cet arbre et toutes ses clés (${opts.key}) ?`; }, socketioConnectError: "Socket.IO ne peut pas se connecter au serveur. Vous pouvez recharger et essayer de résoudre l'erreur de connexion vous-même, le client ne sait pas comment la résoudre seul.", socketioAuthRequired: "Autorisation Socket.IO requise. Veuillez vous authentifier avec HTTP Basic Auth (nom d'utilisateur/mot de passe) et recharger.", deleteKey: "Êtes-vous sûr de vouloir supprimer cette clé ?", rename: { title: "Êtes-vous sûr de vouloir renommer cette clé ?", textContent: "Cette action renomme la clé de manière permanente.", placeholder: "La clé Redis (obligatoire)" }, ttl: { title: "Êtes-vous sûr de vouloir modifier le TTL de cette clé ?", textContent: "La modification du TTL met à jour la durée de vie de cette clé. Laissez vide pour conserver cette clé indéfiniment.", placeholder: "Le TTL de la clé Redis (entier ou vide)", placeholderPlaceholder: "Vide signifie qu'elle persiste indéfiniment ; sinon entrez un entier.", convertTextToTime: "Convertir le texte en temps", convertTextToTimePlaceholder: "Ex. 1d donnera 86400" }, license: { title: "Définir la licence", textContent: "Si vous souhaitez utiliser les fonctionnalités payantes, veuillez contacter support@corifeus.com pour demander une licence. Les tarifs sont Pro 400 HUF/mois (€1/mois) ou 4 000 HUF/an (€10/an), et Enterprise 1 200 HUF/mois (€3/mois) ou 12 000 HUF/an (€30/an). Le prix annuel est 10x le mensuel. Avec 27% TVA, les totaux sont Pro 500 HUF/mois (€1,27/mois) ou 5 100 HUF/an (€12,70/an), Enterprise 1 500 HUF/mois (€3,81/mois) ou 15 200 HUF/an (€38,10/an). La validation de licence nécessite un accès Internet. La licence par défaut comprend 5 postes. Si vous avez besoin de plus de postes, contactez-nous à support@corifeus.com.", placeholder: "Clé de licence" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copier", downloadBuffer: "Télécharger le binaire", setBuffer: "Télécharger le binaire", exportKeys: "Exporter les clés", exportAllKeys: (opts) => `Exporter les ${opts.count} clés`, exportSearchResults: (opts) => `Exporter ${opts.count} résultats`, importKeys: "Importer les clés", saveWithFormatJson: "Enregistrer avec formatage", formatJson: "Formater Json", wrap: "Retour à la ligne", unwrap: "Sans retour à la ligne", downloadJson: "Télécharger JSON", pubsubMonitor: "Moniteur PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Langue / Language", ok: "OK", addKey: "Ajouter à cette clé", addKeyRoot: "Ajouter une clé racine", reloadKey: "Recharger la clé", reload: "Recharger", close: "Fermer", commands: "Commandes", view: "Affichage", statistics: "Statistiques", refresh: "Actualiser", pause: "Pause", resume: "Reprendre", clear: "Effacer", rename: "Renommer", main: "Base de données", cancel: "Annuler", theme: "Thème", github: "GitHub", githubRepo: "Dépôt", githubRelease: "Versions", githubChangelog: "Journal des modifications", info: "Info", settings: "Paramètres", connect: "Connecter", disconnect: "Déconnecter", overview: "Vue d'ensemble", console: "Console", noConnections: "Aucune connexion, ajoutez une connexion dans le menu des paramètres.", noConnectionsInSettings: "Aucune connexion, vous pouvez ajouter une NOUVELLE CONNEXION ci-dessus.", connectionAdd: "Nouvelle connexion", addGroup: "Ajouter un groupe", extend: "Développer", collapse: "Réduire", add: "Ajouter", edit: "Modifier", save: "Enregistrer", ttl: "Définir le TTL", license: "Définir la licence", delete: "Supprimer", remove: "Retirer", sure: "Confirmer", testConnection: "Tester la connexion", getKey: "Chargement de la clé Redis et des données associées ...", jsonViewShow: "Afficher JSON", jsonViewEditor: "Modifier JSON", quickConsole: "Console rapide" }, label: { id: { nodeId: 'ID du nœud', id: "ID de connexion", info: "Si vous ne souhaitez pas modifier les propriétés : sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, veuillez entrer l'ID de la connexion dans ces propriétés pour conserver les valeurs intactes. Si vous souhaitez la même logique pour le mot de passe du nœud, entrez l'ID du nœud dans le mot de passe du nœud." }, secureFeature: 'Si vous voyez une valeur qui commence par P3X et qui semble identique, c\'est une fonctionnalité de sécurité. Pour modifier les paramètres, remplacez simplement ces paramètres par une valeur vide ou autre chose et ils seront enregistrés. Si vous ne modifiez pas les paramètres, ils seront conservés tels quels sur le serveur.', ssh: { on: 'SSH activé', off: 'SSH désactivé', sshHost: 'SSH Host', sshPort: 'Port SSH', sshUsername: 'Nom d\'utilisateur SSH', sshPassword: 'Mot de passe SSH', sshPrivateKey: 'Clé privée SSH' }, isBuffer: opts => `[object ArrayBuffer] signifie que la valeur est des données binaires ou que la valeur est supérieure à ${opts.maxValueAsBuffer}`, streamValue: `Le champ et la valeur du flux sont sur une seule ligne. Ex. : field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' signifie généré automatiquement ou la spécification en -`, unableToLoadKey: ({ key }) => { return `Impossible de charger cette clé : ${key}. Il est possible que la clé ait été supprimée. L'erreur exacte se trouve dans la console.`; }, bigJson: "Cet objet JSON dépasse 10 ko, assurez-vous donc de savoir ce que vous faites, car certaines fonctions peuvent rendre l'affichage lent.", addNode: "Ajouter un nœud", validateJson: "Valider JSON", reducedFunction: `Fonctionnalité réduite`, tooManyKeys: opts => { return `Pour les fonctions maximales complètes, le nombre total de clés autorisées est ${opts.maxLightKeysCount}. Cette base de données dépasse le nombre de clés autorisées : ${opts.count}. Le tri des clés et les informations supplémentaires de l'arbre sont désactivés. La recherche s'effectue uniquement côté serveur au lieu du client.`; }, redisCommandNotFound: "Aucune correspondance de commande Redis trouvée ...", treeKeyStore: `Le tri (comparaison naturelle) est exécuté côté client, c'est-à-dire le navigateur, ce qui signifie qu'il y a une pénalité pour les grands ensembles, comme plus de 10k clés, cela peut ajouter un peu de temps au rendu de la page. Il n'y a pas de tri des clés dans Redis, seulement de cette manière.`, socketIoTimeout: options => { return `Socket.IO a expiré pour cette requête (max ${options.timeout / 1000} secondes) ...`; }, resizerInfo: options => { return `La largeur minimale du panneau gauche ou droit est de ${options.width}px`; }, jsonViewNotParsable: "Cette valeur n'est pas analysable en JSON ", ttlTitle: "Définir le TTL en secondes", passwordSecure: "Le mot de passe peut être vide, mais il affichera quand même des caractères, c'est une fonctionnalité de sécurité.", tlsWithoutCert: "Activer TLS sans certificat supplémentaire", tlsRejectUnauthorized: "Rejeter le certificat non autorisé", tlsSecure: "Si vous voyez une configuration TLS qui commence par P3X ou si tous les paramètres TLS se ressemblent, c'est une fonctionnalité de sécurité. Pour modifier les paramètres, remplacez simplement ces paramètres par une valeur vide ou autre chose et ils seront enregistrés. Si vous ne modifiez pas les paramètres TLS, ils seront conservés tels quels sur le serveur.", treeSeparatorEmpty: "Si le séparateur d'arbre est vide, l'arbre n'aura pas de nœuds imbriqués, juste une liste simple", treeSeparatorEmptyNote: "Pas de nœuds imbriqués, juste une liste simple", welcomeConsole: "Bienvenue dans la console Redis", welcomeConsoleInfo: "L'historique avec les flèches HAUT ou BAS est activé", redisListIndexInfo: "Vide pour ajouter à la fin, -1 pour ajouter au début ou enregistrer à la position affichée.", console: "Console", connectiondAdd: "Ajouter une connexion", connectiondEdit: "Modifier une connexion", connectiondView: "Voir la connexion", connections: "Connexions", licenseInfo: "Licence", licenseEditable: "Licence modifiable", licenseEditableYes: "Oui", licenseEditableNo: "Non", licenseTerminalOnly: "La licence ne peut être configurée que depuis le terminal du serveur.", licenseTierPolicyTitle: "Politique des niveaux", licenseTierPolicyText: "

Gratuit

Redis UI de base uniquement ; pas de SSH tunneling, pas de mode connexion en lecture seule, pas de Cluster/Sentinel, pas de Modifier JSON/Télécharger binaire/Télécharger binaire, pas de ReJSON.
Prix : 0 HUF/mois (€0/mois).

Pro

SSH tunneling, mode connexion en lecture seule (y compris --readonly-connections/-r), Modifier JSON, Télécharger binaire, Télécharger binaire, ReJSON.
Prix de base : 400 HUF/mois (€1/mois) ou 4 000 HUF/an (€10/an).
Total avec 27% TVA : 500 HUF/mois (€1,27/mois) ou 5 100 HUF/an (€12,70/an).

Enterprise

SSH tunneling, Cluster et Sentinel, plus Modifier JSON, Télécharger binaire, Télécharger binaire, ReJSON ; --readonly-connections/-r fonctionne également.
Prix de base : 1 200 HUF/mois (€3/mois) ou 12 000 HUF/an (€30/an).
Total avec 27% TVA : 1 500 HUF/mois (€3,81/mois) ou 15 200 HUF/an (€38,10/an).

Règle annuelle

Le prix annuel est 10x le prix mensuel.

Postes

La licence par défaut comprend 5 postes. Si vous avez besoin de plus de postes, contactez-nous à support@corifeus.com.

Essai Enterprise

10 jours gratuits pour toute personne disposant d'une adresse e-mail réelle existante (e-mail non-test).

Informations de facturation par e-mail

Nom, e-mail de facturation, code pays, code postal, ville, adresse, numéro de TVA (facultatif).

Paiement

Le paiement PayPal n'est disponible qu'en HUF (forint) ; après l'envoi de l'argent à https://paypal.me/corifeus je vous enverrai une facture. Tous les paiements sont non remboursables.

TVA

La TVA est ajoutée au prix (27% en Hongrie).

Contact

Si vous souhaitez dire bonjour ou avez une question, contactez support@corifeus.com.

Langue

La communication des factures et licences par e-mail est en anglais. La devise de facturation est le HUF.

Note

La validation de licence nécessite un accès Internet.", licenseState: "État", licenseStateActive: "Active", licenseStateInactive: "Inactive", licenseStateNoLicense: "Pas de licence", licenseKeyMasked: "Clé enregistrée", licenseTier: "Niveau", licenseValid: "Valide", licenseStatus: "Statut de la licence", licenseReason: "Raison", licenseCheckedAt: "Vérifiée le", licenseStartsAt: "Débute le", licenseExpiresAt: "Expire le", licenseDaysLeft: "Jours restants", licenseMaxDevices: "Appareils maximum", licenseActiveDevices: "Appareils actifs", licenseActiveDevicesInfo: "Si un appareil n'est plus utilisé, son poste est libéré automatiquement après 75 minutes.", licenseCustomerEmail: "E-mail du client", licenseFeatures: "Fonctionnalités", licenseFeaturesEmpty: "Pas de fonctionnalités supplémentaires", licenseFeatureReadonlyMode: "Mode connexion en lecture seule", licenseFeatureReadonlyConnectionsFlag: "Connexions en lecture seule (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunneling", licenseFeatureCluster: "Connexions Cluster", licenseFeatureSentinel: "Connexions Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Tri des clés activé", off: "Tri des clés désactivé" }, cluster: { on: "Cluster activé", off: "Cluster désactivé" }, sentinel: { on: "Sentinel activé", off: "Sentinel désactivé", name: "Nom Sentinel" }, readonly: { on: "Lecture seule activée", off: "Lecture seule désactivée" }, proSshOnly: "SSH est disponible en Pro ou Enterprise.", proReadonlyOnly: "Le mode connexion en lecture seule est disponible en Pro ou Enterprise.", enterpriseClusterSentinelOnly: "Cluster et Sentinel sont disponibles uniquement en Enterprise.", theme: { light: "Clair", dark: "Sombre enterprise", darkNeu: "Sombre", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Connecté : ${opts.name}`; }, tree: "Arbre", askAuth: "Demander l'autorisation", keyboardShortcuts: "Raccourcis clavier", about: "À propos", supportedLanguages: "Langues prises en charge", version: "Version", redisVersion: "Version de Redis", modules: "Modules", shortcutRefresh: "Actualiser", shortcutSearch: "Cibler la recherche", shortcutNewKey: "Nouvelle clé", shortcutDisconnect: "Déconnecter", themeAuto: "Automatique (système)", shortcutCommandPalette: "Palette de commandes", commandPalette: "Palette de commandes", noResults: "Aucun résultat", redisCommandsReference: "Commandes Redis", ungrouped: "Sans groupe", grouped: "Groupés", connectFirst: "Connectez-vous d'abord à un serveur Redis", searchLanguage: "Rechercher une langue...", exportProgress: "Exportation des clés...", importProgress: "Importation des clés...", importPreview: "Aperçu", importOverwrite: "Écraser", importSkip: "Ignorer", importConflict: "Si la clé existe déjà :", noKeysToExport: "Aucune clé à exporter", time: "Temps", loading: "Chargement...", autoRefresh: "Auto", exportSearchHint: "Exportation uniquement des clés correspondant à la recherche en cours", importSearchHint: "L'importation s'applique à toute la base de données, pas seulement aux résultats de recherche", importNoKeys: "Aucune clé trouvée dans le fichier", }, status: { dataCopied: "Les données sont dans le presse-papiers", licenseSaved: "Licence enregistrée", exportDone: "Exportation terminée", indexCreated: "Index créé", indexDropped: "Index supprimé", importDone: (opts) => `Importation terminée : ${opts.created} créés, ${opts.skipped} ignorés, ${opts.errors} erreurs`, nodeRemoved: "Nœud supprimé", keyIsNotExisting: "Cette clé a peut-être été supprimée ou a expiré.", keyCount: opts => { if (opts.keyCount === 0) { return "Aucune clé"; } else if (opts.keyCount === 1) { return "1 clé"; } else { return `${opts.keyCount} clés`; } }, treeExpandAll: "Développer toutes les feuilles de l'arbre. Cette opération peut être coûteuse et prendre du temps ...", noRedisKeys: "Il n'y a aucune clé dans cette base de données.", redisConnected: "Connexion à Redis réussie", reloadingDataInfo: "Rechargement des données Redis", added: "Ajouté", saved: "Mis à jour", cancelled: "Annulé", deleted: "Supprimé", savedRedis: "Les données Redis sont enregistrées", redisDisconnected: opts => { return `La connexion actuelle a rencontré une erreur : ${opts.error.message}`; }, dbChanged: opts => { return `L'index de la base de données est défini à ${opts.db}. `; }, treeDeleted: opts => { return `La clé de l'arbre a été supprimée (${opts.key}).`; }, deletedKey: opts => { return `La clé a été supprimée (${opts.key}).`; }, renamedKey: "Cette clé a été renommée", ttlChanged: "Le TTL de cette clé a été modifié", notInteger: "Cette entrée n'est pas un nombre entier", persisted: "Cette clé est conservée indéfiniment", set: "La clé est définie/ajoutée" }, code: { "delete-connection": "Cette connexion a été supprimée, vous êtes donc déconnecté de cette instance Redis.", "save-connection": "Cette connexion a été modifiée, vous êtes donc déconnecté de cette instance Redis. Vous pouvez vous reconnecter.", "readonly-connections": "Les opérations d'ajout/enregistrement/suppression de connexions sont en lecture seule !", "readonly-connection-mode": "Cette connexion est en mode lecture seule !", "list-out-of-bounds": "Cet index de liste est hors limites", "donation-ware-feature": "Cette fonctionnalité est présente dans la version donation.", "feature-pro-readonly-required": "Le mode connexion en lecture seule nécessite une licence Pro ou Enterprise.", "feature-pro-ssh-required": "Le SSH tunneling nécessite une licence Pro ou Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster et Sentinel nécessitent une licence Enterprise.", "feature-pro-json-binary-required": "Modifier JSON, Télécharger binaire (upload) et Télécharger binaire (download) nécessitent une licence Pro ou Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorisation requise : veuillez vous authentifier avec HTTP Basic Auth et recharger.", "auto-connection-failed": "Il est possible que la connexion ait été supprimée et que la connexion automatique ait échoué à cause de cela.", invalid_console_command: "Cette commande ne fonctionne pas via le GUI." }, licenseReason: { LICENSE_VALID: "La licence est valide", LICENSE_INVALID: "La licence n'est pas valide", LICENSE_MISSING: "Aucune clé de licence n'est définie", LICENSE_DISABLED: "La licence est désactivée dans la configuration du serveur", LICENSE_NOT_FOUND: "La licence n'a pas été trouvée", LICENSE_EXPIRED: "La licence a expiré", LICENSE_CLEARED: "La clé de licence a été effacée", LICENSE_MAX_DEVICES_REACHED: "Nombre maximum de postes d'appareils atteint", PRODUCT_MISMATCH: "Le produit de la licence ne correspond pas" }, licenseStatusValue: { active: "Active", deleted: "Supprimée", all: "Toutes", expired: "Expirée", missing: "Manquante", inactive: "Inactive" }, form: { error: { required: "Obligatoire", port: "Le port doit être entre 1-65535", invalid: "Le formulaire n'est pas valide" }, connection: { label: { name: "Nom", group: "Groupe", host: "Nom d'hôte", port: "Port", password: "Mot de passe", username: "Nom d'utilisateur" } }, treeSettings: { maxValueDisplay: "Longueur maximale d'affichage de la valeur", maxValueDisplayInfo: "Si défini à 0, affiche les valeurs complètes. Si supérieur à 0, tronque à cette longueur. Si -1 : pour les chaînes, masque la valeur jusqu'à la modification ; pour les autres types, affiche le contenu complet.", maxKeys: "Nombre maximum de clés", maxKeysInfo: "Pour éviter que le GUI ne plante, nous limitons le nombre maximum de clés.", keyCount: () => { return `Nombre de clés : ${p3xr.state.keysRaw.length}`; }, label: { animation: "Utiliser l'animation", noAnimation: "Pas d'animation", jsonFormatTwoSpace: "Formater JSON avec 2 espaces", jsonFormatFourSpace: "Formater JSON avec 4 espaces", formName: "Paramètres Redis", searchModeClient: "Mode recherche côté client", searchModeServer: "Mode recherche côté serveur", searchModeStartsWith: "Recherche avec mode commence par", searchModeIncludes: "Mode recherche inclut" }, field: { treeSeparator: "Séparateur d'arbre", treeSeparatorSelector: "Sélecteur de séparateur d'arbre", page: "Nombre de pagination de l'arbre", keyPageCount: "Nombre de pagination des clés", keysSort: "Trier les clés", searchMode: "Mode de recherche", searchModeStartsWith: "Recherche commence par / inclut" }, error: { keyPageCount: "Le nombre de pagination des clés doit être un entier entre 5 - 100", page: "Le nombre de pagination doit être un entier entre 10 - 5000", maxValueDisplay: "La valeur maximale d'affichage doit être un entier entre -1 et 32768", maxKeys: "Le nombre maximum de clés doit être un entier entre 100 et 100000" } }, key: { label: { formName: { add: "Ajouter une nouvelle clé Redis", edit: "Modifier la clé Redis", append: "Ajouter à une clé Redis existante" } }, field: { streamTimestamp: "Horodatage", key: "Clé", type: "Type", index: "Index", hashKey: "Clé hash", score: "Score", value: "Valeur" }, error: { streamTimestamp: "L'horodatage est obligatoire, soit au format Redis soit en tant que *", key: "La clé doit comporter au moins un caractère", hashKey: "La clé hash doit comporter au moins un caractère", score: "Le score de l'ensemble trié est obligatoire", value: "La valeur est obligatoire" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Recherche", index: "Index", query: "Requête", results: "Résultats", noIndex: "Aucun index trouvé", createIndex: "Créer un index", dropIndex: "Supprimer l'index", indexInfo: "Info index", indexName: "Nom de l'index", prefix: "Préfixe de clé (optionnel)", fieldName: "Nom du champ", }, monitor: { title: "Surveillance", memory: "Mémoire", opsPerSec: "Ops/sec", clients: "Clients", blocked: "Bloqués", hitsMisses: "Taux de succès", networkIo: "Réseau I/O", slowLog: "Journal lent", totalCommands: "Total", expired: "Expirées", evicted: "Évincées", clientList: "Liste des clients", topKeys: "Plus grandes clés par mémoire", killClient: "Tuer le client", clientKilled: "Client tué", confirmKillClient: "Voulez-vous vraiment terminer ce client ?", noKeys: "Aucune clé", noClients: "Aucun client", }, overview: { noConnected: "Il n'y a pas de connexion à Redis.", overviewClients: "Liste des connectés par nombre de clients", connectedCount: opt => { if (opt.length === 1) { return "1 client"; } return `${opt.length} clients`; } }, key: { label: { key: "Clé", encoding: "Encodage", length: "Taille", ttl: "TTL", ttlTitle: "Durée de vie", type: "Type", ttlNotExpire: "n'expire pas", lengthString: "octets", lengthItem: "éléments", actions: "Actions" }, list: { table: { index: "Index", value: "Valeur" } }, hash: { table: { hashkey: "Clé hash", value: "Valeur" } }, set: { table: { value: "Membre" } }, zset: { table: { value: "Membre", score: "Score" } }, stream: { table: { timestamp: "ID d'horodatage", field: "Champ", value: "Valeur" } } }, treeControls: { settings: "Paramètres de l'arbre", expandAll: "Tout développer", collapseAll: "Tout réduire", search: { search: "Rechercher dans les clés", clear: "Effacer la recherche actuelle", placeholderClient: "Recherche côté client", placeholderServer: "Recherche côté serveur", info: "La recherche côté client signifie qu'elle correspond au texte dans le champ de recherche. La recherche côté serveur signifie qu'elle recherche dans les modèles de clés comme *{texte-de-recherche}*. Pour les grands ensembles de recherche, il est préférable d'utiliser la recherche côté serveur. Pour les ensembles plus petits, il est préférable d'utiliser la recherche côté client." + ` Si le nombre de clés dépasse ${p3xr.settings.maxLightKeysCount}, vous ne pouvez rechercher que côté serveur.`, largeSetInfo: "Dans un grand ensemble, la recherche côté client est désactivée, donc seule la recherche côté serveur est actuellement possible.", infoDetails: "Pour savoir comment la recherche fonctionne, veuillez consulter les paramètres" }, pager: { next: "Suivant", prev: "Précédent", first: "Premier", last: "Dernier" } } }, time: { loading: "Chargement...", years: "ans", months: "mois", days: "jours", year: "an", month: "mois", day: "jour" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/he/000077500000000000000000000000001517666434100137475ustar00rootroot00000000000000src/strings/he/strings.js000066400000000000000000000750311517666434100160040ustar00rootroot00000000000000const strings = { error: { cleared_license: "רישיון מאושר", invalid_license: "רישיון לא חוקי", license_max_devices_reached: "הושגה מקסימום מושבים במכשיר", license_readonly: "ניתן לשנות את הרישיון רק ממסוף השרת.", server_error: "שגיאת שרת, אנא נסה שוב" }, title: { donate: "לתרום", jsonRecursive: "הרחבת כל העלים", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "אתה יכול לבחור חיבור Redis לחיבור מהתפריט התחתון השמאלי.", statistics: "סטטיסטיקה", error: "שגיאה", connectingRedis: "מתחבר ל-Redis ...", socketioConnectError: "שגיאה Socket.IO", db: "DB", server: "שרת", clients: "לקוחות", memory: "זיכרון", persistence: "התמדה", stats: "סטטיסטיקה", replication: "שכפול", cpu: "CPU", cluster: "Cluster", modules: "מודולים", errorstats: "סטטיסטיקת שגיאות", commandstats: "סטטיסטיקת פקודות", latencystats: "סטטיסטיקת השהיה", keysizes: "גדלי מפתחות", threads: "תהליכונים", }, confirm: { dropIndex: "האם אתה בטוח שברצונך למחוק אינדקס זה?", uploadBuffer: "האם אתה בטוח שהעלית את הנתונים הבינאריים האלה?", uploadBufferDone: "הנתונים הבינאריים מועלים", uploadBufferDoneAndSave: "הנתונים הבינאריים מועלים ונשמרים בשרת", title: "אשר", alert: "התראה", info: "מידע", deleteListItem: "האם אתה בטוח שאתה מחק פריט זה ברשימה?", deleteHashKey: "האם אתה בטוח שתמחק את פריט מפתח ה-hash הזה?", deleteStreamTimestamp: "האם אתה בטוח שאתה מחק את חותמת הזמן של השידור הזה?", deleteSetMember: "האם אתה בטוח שתמחק את חבר הסט הזה?", deleteZSetMember: "האם אתה בטוח שתמחק את חבר הסט הממוין הזה?", deleteConnection: "אשר", deleteConnectionText: "האם אתה בטוח שמחקת חיבור Redis זה?", deleteNode: "האם אתה בטוח שתמחק את צומת Redis זה?", deleteAllKeys: opts => { return `מחק את העץ הזה ואת כל המפתחות שלו (${opts.key})?`; }, socketioConnectError: "Socket.IO לא יכול להתחבר לשרת, אתה יכול לטעון מחדש ולנסות לפתור את שגיאת החיבור בעצמך, הלקוח לא יודע איך לפתור אותה בעצמו.", socketioAuthRequired: "נדרש אישור Socket.IO. נא לאמת באמצעות HTTP Basic Auth (שם משתמש/סיסמה) וטען מחדש.", deleteKey: "האם אתה בטוח שמחקת מפתח זה?", rename: { title: "האם אתה בטוח לשנות את שם המפתח הזה?", textContent: "פעולה זו משנה את שם המפתח לצמיתות.", placeholder: "מפתח Redis (חובה)" }, ttl: { title: "האם אתה בטוח שברצונך לשנות את ה-TTL של מפתח זה?", textContent: "שינוי TTL מעדכן את הזמן של מפתח זה לחיות. השאר ריק כדי לשמור את המפתח הזה לנצח.", placeholder: "TTL של מפתח Redis (מספר שלם או ריק)", placeholderPlaceholder: "ריק פירושו שהוא נמשך לנצח; אחרת הזן מספר שלם.", convertTextToTime: "המרת טקסט לזמן", convertTextToTimePlaceholder: "למשל 1d יהיה 86400" }, license: { title: "הגדר רישיון", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "מפתח רישיון" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "העתק", downloadBuffer: "הורד בינארי", setBuffer: "העלה בינארי", exportKeys: "ייצוא מפתחות", exportAllKeys: (opts) => `ייצוא כל ${opts.count} המפתחות`, exportSearchResults: (opts) => `ייצוא ${opts.count} תוצאות`, importKeys: "ייבוא מפתחות", saveWithFormatJson: "שמור עם פורמט", formatJson: "פורמט Json", wrap: "לעטוף", unwrap: "פתח את העטיפה", downloadJson: "הורד את JSON", pubsubMonitor: "צג PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "שפה", ok: "בסדר", addKey: "הוסף למפתח הזה", addKeyRoot: "הוסף מפתח שורש", reloadKey: "טען מחדש מפתח", reload: "טען מחדש", close: "סגור", commands: "פקודות", view: "הצג", statistics: "סטטיסטיקה", refresh: "רענן", pause: "השהה", resume: "המשך", clear: "ברור", rename: "שנה שם", main: "מסד נתונים", cancel: "בטל", theme: "נושא", github: "GitHub", githubRepo: "מאגר", githubRelease: "משחרר", githubChangelog: "יומן שינויים", info: "Info", settings: "הגדרות", connect: "התחבר", disconnect: "התנתק", overview: "סקירה כללית", console: "קונסולה", noConnections: "אין חיבורים, הוסף חיבור בתפריט ההגדרות.", noConnectionsInSettings: "אין חיבורים, אתה יכול להוסיף חיבור חדש למעלה.", connectionAdd: "חיבור חדש", addGroup: "הוסף קבוצה", extend: "הארך", collapse: "התמוטט", add: "הוסף", edit: "ערוך", save: "שמור", ttl: "הגדר TTL", license: "הגדר רישיון", delete: "מחק", remove: "הסר", sure: "בטח", testConnection: "בדיקת חיבור", getKey: "טוען מפתח Redis ונתונים קשורים...", jsonViewShow: "הצג את JSON", jsonViewEditor: "ערוך את JSON", quickConsole: "קונסולה מהירה", }, label: { id: { nodeId: "מזהה צומת", id: "מזה�� חיבור", info: "אם אינך רוצה לשנות את המאפיינים של: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, אנא הזן את מזהה החיבור במאפיינים אלה כדי לשמור על ערכי הנכס ללא פגע. אם אתה רוצה את אותו היגיון בסיסמת הצומת, הזן את מזהה הצומת בסיסמת הצומת." }, secureFeature: "אם אתה רואה ערך שמתחיל ב-P3X במראה זהה, זוהי תכונה מאובטחת. כדי לשנות את ההגדרות, פשוט החליפו את ההגדרות הללו בריקות או במשהו אחר והן יישמרו. אם לא תשנה את ההגדרות, ההגדרות יישמרו כפי שהן בשרת.", ssh: { on: "SSH פועל", off: "SSH כבוי", sshHost: "מארח SSH", sshPort: "יציאת SSH", sshUsername: "שם משתמש SSH", sshPassword: "סיסמת SSH", sshPrivateKey: "מפתח פרטי SSH" }, isBuffer: opts => `[object ArrayBuffer] פירושו שהערך הוא נתונים בינאריים או שהערך גדול מ- ${opts.maxValueAsBuffer}`, streamValue: `השדה והערך של זרם הם oneliner. לדוגמה: שדה1 ערך1 "שדה 2" "ערך 2"`, streamTimestampId: `'*' פירושו ��נוצר אוטומטית או המפרט כ--`, unableToLoadKey: ({ key }) => { return `לא ניתן לטעון את המפתח הזה: ${key}. ייתכן, המפתח נמחק. השגיאה המדויקת נמצאת בקונסולה.`; }, bigJson: "��ובייקט JSON זה הוא מעל 10 קילובייט, אז ודא שאתה יודע מה אתה עושה, מכיוון שחלק מהפונקציות עשויות להיות עיבוד איטי.", addNode: "הוסף צומת", validateJson: "אמת את JSON", reducedFunction: `פונקציונליות מופחתת`, tooManyKeys: opts => { return `עבור כל הפונקציות המקסימליות המותרות המפתחות סך הכל הוא ${opts.maxLightKeysCount} לספור. למסד נתונים זה יש מעל המפתחות המותרים בסך הכל ${opts.count}. מיון המפתחות ומידע העץ המפואר הנוסף מושבתים. החיפוש מתרחש רק בשרת במקום חיפוש הלקוח.`; }, redisCommandNotFound: "לא נמצאה התאמת פקודה Redis ...", treeKeyStore: `המיון (השוואה טבעית) מבוצע על הלקוח הלא הוא הדפדפן, מה שאומר שיש לו עונש על קבוצות גדולות גדולות, כמו מעל 10,000 מפתחות, זה עשוי להוסיף מעט זמן לעיבוד העמוד. אין מיון מפתחות ב-Redis, רק ככה.`, socketIoTimeout: options => { return `הזמן הקצוב ל-Socket.IO תם לבקשה זו (מקסימום ${options.timeout / 1000} שניות)...`; }, resizerInfo: options => { return `הרוחב המינימלי של הלוח השמאלי או הימני הוא ${options.width}פיקסלים`; }, jsonViewNotParsable: "ערך זה אינו ניתן לניתוח JSON ", ttlTitle: "הגדר את ה-TTL בשניות", passwordSecure: "ייתכן שהסיסמה תהיה ריקה, אבל עדיין היא תציג תווים, זו תכונת אבטחה.", tlsWithoutCert: "אפשר TLS ללא אישור נוסף", tlsRejectUnauthorized: "דחה אישור לא מורשה", tlsSecure: "אם אתה רואה תצורת TLS שמתחילה ב-P3X או שכל הגדרות ה-TLS נראות זהות, זו תכונה מאובטחת. כדי לשנות את ההגדרות, פשוט החליפו את ההגדרות הללו בריקות או במשהו אחר והן יישמרו. אם לא תשנה את הגדרות ה-TLS, ההגדרות יישמרו כפי שהן בשרת.", treeSeparatorEmpty: "אם מפריד העצים ריק, לעץ לא יהיו צמתים מקוננים, רק רשימה טהורה", treeSeparatorEmptyNote: "אין צמתים מקוננים, רק רשימה טהורה", welcomeConsole: "ברוכים הבאים לקונסולת Redis", welcomeConsoleInfo: "היסטוריית הסמן למעלה או למטה מופעלת", redisListIndexInfo: "ריק כדי להוסיף, -1 כדי להוסיף או לשמור אותו במיקום המוצג.", console: "קונסולה", connectiondAdd: "הוסף חיבור", connectiondEdit: "ערוך חיבור", connectiondView: "צפה בחיבור", connections: "חיבורים", licenseInfo: "רישיון", licenseEditable: "רישיון ניתן לעריכה", licenseEditableYes: "כן", licenseEditableNo: "לא", licenseTerminalOnly: "ניתן להגדיר רישיון רק ממסוף השרת.", licenseTierPolicyTitle: "מדיניות שכבה", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "מדינה", licenseStateActive: "פעיל", licenseStateInactive: "לא פעיל", licenseStateNoLicense: "אין רישיון", licenseKeyMasked: "מפתח שמור", licenseTier: "שכבה", licenseValid: "תקף", licenseStatus: "מצב רישיון", licenseReason: "סיבה", licenseCheckedAt: "בדק ב", licenseStartsAt: "מתחיל ב", licenseExpiresAt: "יפוג בשעה", licenseDaysLeft: "נותרו ימים", licenseMaxDevices: "מקסימום מכשירים", licenseActiveDevices: "מכשירים פעילים", licenseActiveDevicesInfo: "אם מכשיר אינו בשימוש יותר, המושב שלו משתחרר אוטומטית לאחר 75 דקות.", licenseCustomerEmail: "מייל לקוח", licenseFeatures: "תכונות", licenseFeaturesEmpty: "אין תכונות נוספות", licenseFeatureReadonlyMode: "מצב חיבור לקריאה בלבד", licenseFeatureReadonlyConnectionsFlag: "חיבורים לקריאה בלבד (--readonly-connections/-r)", licenseFeatureSsh: "SSH מנהור", licenseFeatureCluster: "חיבורי Cluster", licenseFeatureSentinel: "חיבורי Sentinel", licenseFeatureReJSON: "ReJSON (סוג נתונים JSON)", keysSort: { on: "מיון מפתחות על", off: "מיון מפתחות" }, cluster: { on: "Cluster פועל", off: "Cluster כבוי" }, sentinel: { on: "Sentinel פועל", off: "Sentinel כבוי", name: "שם Sentinel" }, readonly: { on: "המשך לקריאה בלבד", off: "כבוי לקריאה בלבד" }, proSshOnly: "SSH זמין ב-Pro או Enterprise.", proReadonlyOnly: "מצב חיבור לקריאה בלבד זמין ב-Pro או Enterprise.", enterpriseClusterSentinelOnly: "Cluster ו-Sentinel זמינים ב-Enterprise בלבד.", theme: { light: "אור", dark: "מפעל אפל", darkNeu: "כהה", darkoBluo: "Darko bluo", enterprise: "ארגונים", redis: "Redis", matrix: "מטריקס" }, connected: opts => { return `מחובר: ${opts.name}`; }, tree: "עץ", askAuth: "בקשו אישור", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "מודולים", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "התנתק", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "פקודות Redis", ungrouped: "ללא קבוצה", grouped: "Grouped", connectFirst: "התחבר תחילה לשרת Redis", searchLanguage: "חיפוש שפה...", exportProgress: "מייצא מפתחות...", importProgress: "מייבא מפתחות...", importPreview: "תצוגה מקדימה", importOverwrite: "דריסה", importSkip: "דלג", importConflict: "אם המפתח כבר קיים:", noKeysToExport: "אין מפתחות לייצוא", time: "זמן", loading: "טוען...", autoRefresh: "אוטומטי", exportSearchHint: "מייצא רק מפתחות התואמים לחיפוש הנוכחי", importSearchHint: "הייבוא חל על כל מסד הנתונים, לא רק על תוצאות החיפוש", importNoKeys: "לא נמצאו מפתחות בקובץ", }, status: { dataCopied: "הנתונים נמצאים בלוח", licenseSaved: "הרישיון נשמר", exportDone: "הייצוא הושלם", indexCreated: "אינדקס נוצר", indexDropped: "אינדקס נמחק", importDone: (opts) => `ייבוא הושלם: ${opts.created} נוצרו, ${opts.skipped} דולגו, ${opts.errors} שגיאות`, nodeRemoved: "הצומת הוסר", keyIsNotExisting: "יכול להיות שהמפתח הזה נמחק או שפג תוקפו.", keyCount: opts => { if (opts.keyCount === 0) { return "אין מפתח"; } else if (opts.keyCount === 1) { return "מפתח 1"; } else { return `${opts.keyCount} מפתחות`; } }, treeExpandAll: "הרחב את כל עלי העץ. פעולה זו עשויה להיות יקרה ועשויה לקחת זמן...", noRedisKeys: "אין מפתחות במסד נתונים זה.", redisConnected: "Redis מחובר בהצלחה", reloadingDataInfo: "טוען מחדש את פרטי הנתונים של Redis", added: "נוסף", saved: "עודכן", cancelled: "בוטלה", deleted: "נמחק", savedRedis: "נתוני Redis נשמרים", redisDisconnected: opts => { return `בחיבור הנוכחי הייתה שגיאה: ${opts.error.message}`; }, dbChanged: opts => { return `��ינדקס db מוגדר ל ${opts.db}. `; }, treeDeleted: opts => { return `מפתח העץ נמחק (${opts.key}).`; }, deletedKey: opts => { return `המפתח נמחק (${opts.key}).`; }, renamedKey: "השם של מפתח זה שונה", ttlChanged: "ה-TTL של מפתח זה השתנה", notInteger: "קלט זה אינו מספר שלם", persisted: "מפתח זה נמשך לנצח", set: "המפתח מוגדר/נוסף" }, code: { "delete-connection": "חיבור זה נמחק, אז אתה מנותק למופע Redis זה.", "save-connection": "חיבור זה השתנה, אז אתה מנותק למופע Redis זה. אתה יכול להתחבר מחדש.", "readonly-connections": "הוספה/שמירה/מחיקה של חיבורים הם לקריאה בלבד!", "readonly-connection-mode": "חיבור זה הוא במצב קריאה בלבד!", "list-out-of-bounds": "אינדקס רשימה זה מחוץ לתחום", "donation-ware-feature": "תכונה זו קיימת בגרסת התרומה.", "feature-pro-readonly-required": "מצב חיבור לקריאה בלבד דורש רישיון Pro או Enterprise.", "feature-pro-ssh-required": "מנהור SSH דורש רישיון Pro או Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster ו-Sentinel דורשים רישיון Enterprise.", "feature-pro-json-binary-required": "ערוך JSON, העלה בינארי והורד בינארי דורשים רישיון Pro או Enterprise.", "feature-pro-rejson-required": "ReJSON (סוג נתונים JSON) דורש רישיון Pro או Enterprise.", "invalid-json-value": "הערך אינו חוקי JSON.", "http_auth_required": "נדרשת הרשאה: נא לאמת עם HTTP Basic Auth וטען מחדש.", "auto-connection-failed": "ייתכן, החיבור הוסר והחיבור האוטומטי נכשל, בגלל זה.", invalid_console_command: "פקודה זו אינה פועלת דרך ה-GUI." }, licenseReason: { LICENSE_VALID: "הרישיון תקף", LICENSE_INVALID: "הרישיון אינו חוקי", LICENSE_MISSING: "לא הוגדר מפתח רישיון", LICENSE_DISABLED: "הרישיון מושבת בתצורת השרת", LICENSE_NOT_FOUND: "הרישיון לא נמצא", LICENSE_EXPIRED: "פג תוקף הרישיון", LICENSE_CLEARED: "מפתח הרישיון נוקה", LICENSE_MAX_DEVICES_REACHED: "הושגה מקסימום מושבים במכשיר", PRODUCT_MISMATCH: "מוצר הרישיון אינו תואם" }, licenseStatusValue: { active: "פעיל", deleted: "נמחק", all: "הכל", expired: "פג תוקף", missing: "חסר", inactive: "לא פעיל" }, form: { error: { required: "חובה", port: "הנמל הוא בין 1-65535", invalid: "הטופס אינו חוקי" }, connection: { label: { name: "שם", group: "Group", host: "שם מארח", port: "נמל", password: "סיסמה", username: "שם משתמש" } }, treeSettings: { maxValueDisplay: "אורך מחרוזת תצוגת ערך מקסימלי", maxValueDisplayInfo: "אם מוגדר ל-0, הצג ערכים מלאים. אם הוא גדול מ-0, חתוך לאורך זה. אם -1: עבור מחרוזות, הסתר את הערך עד לעריכה; עבור סוגים אחרים, הצג תוכן מלא.", maxKeys: "ספירת המפתחות המקסימלית", maxKeysInfo: "כדי שה-GUI לא יקרוס, אנו מגבילים את ספירת המפתחות המקסימלית.", keyCount: () => { return `מספר מפתחות: ${p3xr.state.keysRaw.length}`; }, label: { animation: "השתמש באנימציה", noAnimation: "אין אנימציה", jsonFormatTwoSpace: "פורמט JSON עם 2 רווחים", jsonFormatFourSpace: "פורמט JSON עם 4 רווחים", formName: "הגדרות Redis", searchModeClient: "מצב חיפוש לקוח", searchModeServer: "מצב חיפוש שרת", searchModeStartsWith: "חיפוש עם מתחיל עם מצב", searchModeIncludes: "החיפוש כולל מצב" }, field: { treeSeparator: "מפריד עצים", treeSeparatorSelector: "בורר מפריד עצים", page: "ספירת דפי עצים", keyPageCount: "ספירת דפי מפתח", keysSort: "מיין את המפתחות", searchMode: "מצב חיפוש", searchModeStartsWith: "החיפוש מתחיל עם / כולל" }, error: { keyPageCount: "ספירת דפי המפתח חייבת להיות מספר שלם בין 5 - 100", page: "ספירת הדפים חייבת להיות מספר שלם בין 10 - 5000", maxValueDisplay: "ערך התצוגה המקסימלי חייב להיות מספר שלם בין -1 ל-32768", maxKeys: "ערך ספירת המפתח המקסימלי חייב להיות מספר שלם בין 100 ל-100000" } }, key: { label: { formName: { add: "הוסף מפתח Redis חדש", edit: "ערוך מפתח Redis", append: "הוסף למפתח Redis הקיים" } }, field: { streamTimestamp: "חותמת זמן", key: "מפתח", type: "הקלד", index: "אינדקס", hashKey: "מפתח Hash", score: "ציון", value: "ערך" }, error: { streamTimestamp: "חותמת הזמן נדרשת, בפורמט Redis או בתור *", key: "המפתח הוא, לפחות, תו אחד", hashKey: "מפתח טבלת הגיבוב הוא תו אחד לפחות", score: "נדרש ציון הסט הממוין", value: "הערך נדרש" } }, main: { label: { database: "DB" } } }, page: { search: { title: "חיפוש", index: "אינדקס", query: "שאילתה", results: "תוצאות", noIndex: "לא נמצאו אינדקסים", createIndex: "צור אינדקס", dropIndex: "מחק אינדקס", indexInfo: "מידע אינדקס", indexName: "שם האינדקס", prefix: "תחילית מפתח (אופציונלי)", fieldName: "שם השדה", }, monitor: { title: "ניטור", memory: "זיכרון", opsPerSec: "פעולות/שנייה", clients: "לקוחות", blocked: "חסומים", hitsMisses: "שיעור פגיעה", networkIo: "רשת I/O", slowLog: "יומן איטי", totalCommands: "סה\x22כ", expired: "פג תוקף", evicted: "פונו", clientList: "רשימת לקוחות", topKeys: "מפתחות גדולים לפי זיכרון", killClient: "סגור לקוח", clientKilled: "הלקוח נסגר", confirmKillClient: "האם אתה בטוח שברצונך לסגור לקוח זה?", noKeys: "אין מפתחות", noClients: "אין לקוחות", }, overview: { noConnected: "אין חי��ור ל-Redis.", overviewClients: "רשום את המחוברים לפי ספירת הלקוחות", connectedCount: opt => { if (opt.length === 1) { return "לקוח 1"; } return `${opt.length} לקוחות`; } }, key: { label: { key: "מפתח", encoding: "קידוד", length: "גודל", ttl: "TTL", ttlTitle: "זמן לחיות", type: "הקלד", ttlNotExpire: "לא יפוג", lengthString: "בתים", lengthItem: "פריטים", actions: "פעולות" }, list: { table: { index: "אינדקס", value: "ערך" } }, hash: { table: { hashkey: "חשקי", value: "ערך" } }, set: { table: { value: "חבר" } }, zset: { table: { value: "חבר", score: "ציון" } }, stream: { table: { timestamp: "מזהה חותמת זמן", field: "שדה", value: "ערך" } } }, treeControls: { settings: "הגדרות עץ", expandAll: "הרחב הכל", collapseAll: "כווץ הכל", search: { search: "חפש במפתחות", clear: "נקה את החיפוש הנוכחי כדי להגדיר ריק", placeholderClient: "חפש בצד הלקוח", placeholderServer: "חפש בצד השרת", info: "החיפוש בצד הלקוח אומר שהוא מתאים לטקסט בקלט החיפוש. פירוש החיפוש בצד השרת הוא, כלומר כמו חיפוש בתבניות המפתחות כמו *{חיפוש-טקסט}*. עבור מערכי חיפוש גדולים, עדיף להשתמש בחיפוש בצד השרת. עבור קבוצות חיפוש קטנות יותר, עדיף להשתמש במצב חיפוש בצד הלקוח." + ` אם ספירת המפתחות הסתיימה ${p3xr.settings.maxLightKeysCount}, אתה יכול לחפש רק בצד השרת.`, largeSetInfo: "בקבוצה גדולה, החיפוש בצד הלקוח מושבת. אז כרגע רק חיפוש בצד השרת אפשרי.", infoDetails: "כדי לגלות כיצד פועל החיפוש, אנא עיין בהגדרות" }, pager: { next: "הבא", prev: "הקודם", first: "ראשית", last: "אחרון" } } }, time: { loading: "טוען...", years: "שנים", months: "חודשים", days: "ימים", year: "שנה", month: "חודש", day: "יום" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/hr/000077500000000000000000000000001517666434100137645ustar00rootroot00000000000000src/strings/hr/strings.js000066400000000000000000000677471517666434100160400ustar00rootroot00000000000000const strings = { error: { cleared_license: "Očišćena licenca", invalid_license: "Nevažeća licenca", license_max_devices_reached: "Dosegnut je maksimalan broj mjesta na uređaju", license_readonly: "Licenca se može promijeniti samo s poslužiteljskog terminala.", server_error: "Pogreška poslužitelja, pokušajte ponovo" }, title: { donate: "Donirajte", jsonRecursive: "Širenje svih listova", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Možete odabrati Redis vezu za povezivanje s donjeg lijevog izbornika.", statistics: "Statistika", error: "Greška", connectingRedis: "Povezivanje na Redis ...", socketioConnectError: "Socket.IO Greška", db: "DB", server: "poslužitelj", clients: "Klijenti", memory: "Memorija", persistence: "Postojanost", stats: "Statistika", replication: "Replikacija", cpu: "CPU", cluster: "Cluster", modules: "Moduli", errorstats: "Statistike pogrešaka", commandstats: "Statistike naredbi", latencystats: "Statistike kašnjenja", keysizes: "Veličine ključeva", threads: "Niti", }, confirm: { dropIndex: "Jeste li sigurni da želite obrisati ovaj indeks?", uploadBuffer: "Jeste li sigurni da želite učitati ove binarne podatke?", uploadBufferDone: "Binarni podaci su učitani", uploadBufferDoneAndSave: "Binarni podaci se učitavaju i spremaju na poslužitelj", title: "Potvrdi", alert: "uzbuna", info: "Info", deleteListItem: "Jeste li sigurni da želite izbrisati ovu stavku popisa?", deleteHashKey: "Jeste li sigurni da želite izbrisati ovu stavku hash ključa?", deleteStreamTimestamp: "Jeste li sigurni da želite izbrisati ovu vremensku oznaku streama?", deleteSetMember: "Jeste li sigurni da želite izbrisati ovaj član skupa?", deleteZSetMember: "Jeste li sigurni da želite izbrisati ovaj sortirani član skupa?", deleteConnection: "Potvrdi", deleteConnectionText: "Jeste li sigurni da želite izbrisati ovu Redis vezu?", deleteNode: "Jeste li sigurni da želite izbrisati ovaj Redis čvor?", deleteAllKeys: opts => { return `Izbriši ovo stablo i sve njegove ključeve (${opts.key})?`; }, socketioConnectError: "Socket.IO se ne može spojiti na poslužitelj, možete ponovno učitati i pokušati sami riješiti pogrešku veze, klijent ne zna kako to sam riješiti.", socketioAuthRequired: "Potrebna je autorizacija Socket.IO. Provjerite autentičnost pomoću HTTP Basic Auth (korisničko ime/lozinka) i ponovno učitajte.", deleteKey: "Jeste li sigurni da želite izbrisati ovaj ključ?", rename: { title: "Jeste li sigurni da želite preimenovati ovaj ključ?", textContent: "Ova radnja trajno preimenuje ključ.", placeholder: "Ključ Redis (obavezno)" }, ttl: { title: "Jeste li sigurni da želite promijeniti TTL ovog ključa?", textContent: "Promjena TTL ažurira vrijeme života ovog ključa. Ostavite prazno kako biste zauvijek zadržali ovaj ključ.", placeholder: "Redis ključa TTL (cijeli ili prazan)", placeholderPlaceholder: "Prazan znači da traje zauvijek; inače unesite cijeli broj.", convertTextToTime: "Pretvori tekst u vrijeme", convertTextToTimePlaceholder: "Npr. 1d će biti 86400" }, license: { title: "Postavite licencu", textContent: "Ako želite koristiti značajke koje se plaćaju, kontaktirajte support@corifeus.com kako biste zatražili licencu. Cijene su Pro 400 HUF/mjesec (1€/mjesec) ili 4.000 HUF/godišnje (10€/godišnje), a Enterprise 1.200 HUF/mjesec (3€/mjesec) ili 12.000 HUF/godišnje (30€/godina). Godišnje je 10x mjesečno. Sa 27% VAT, ukupni iznosi su Pro 500 HUF/mjesec (1,27 €/mjesec) ili 5,100 HUF/godišnje (12,70 €/godišnje), Enterprise 1,500 HUF/mjesec (3,81€/mjesečno) ili 15.200 HUF/godišnje (38,10€/godišnje). Validacija licence zahtijeva pristup internetu. Zadana licenca uključuje 5 mjesta. Ako trebate više mjesta, kontaktirajte nas na support@corifeus.com.", placeholder: "Ključ licence" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiraj", downloadBuffer: "Preuzmite binarnu datoteku", setBuffer: "Učitaj binarno", exportKeys: "Izvezi ključeve", exportAllKeys: (opts) => `Izvezi svih ${opts.count} ključeva`, exportSearchResults: (opts) => `Izvezi ${opts.count} rezultata`, importKeys: "Uvezi ključeve", saveWithFormatJson: "Spremi s formatom", formatJson: "Format Json", wrap: "Zamotati", unwrap: "Odmotajte", downloadJson: "Preuzmite JSON", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Jezik", ok: "OK", addKey: "Dodaj ovom ključu", addKeyRoot: "Dodajte korijenski ključ", reloadKey: "Ključ za ponovno učitavanje", reload: "Ponovno učitaj", close: "Zatvori", commands: "Naredbe", view: "pogled", statistics: "Statistika", refresh: "Osvježi", pause: "Pauza", resume: "Nastavi", clear: "čisto", rename: "Preimenuj", main: "Baza podataka", cancel: "Odustani", theme: "Tema", github: "GitHub", githubRepo: "Spremište", githubRelease: "Izdanja", githubChangelog: "Dnevnik promjena", info: "Info", settings: "postavke", connect: "Poveži se", disconnect: "Prekini vezu", overview: "Pregled", console: "Konzola", noConnections: "Nema veza, dodajte vezu u izborniku postavki.", noConnectionsInSettings: "Nema veza, možete dodati NOVU VEZU iznad.", connectionAdd: "Nova veza", addGroup: "Dodaj grupu", extend: "Proširi", collapse: "Sažimanje", add: "Dodaj", edit: "Uredi", save: "spremiti", ttl: "Postavite TTL", license: "Postavite licencu", delete: "Izbriši", remove: "Ukloniti", sure: "naravno", testConnection: "Testirajte vezu", getKey: "Učitavanje ključa Redis i povezanih podataka ...", jsonViewShow: "Prikaz JSON", jsonViewEditor: "Uredi JSON", quickConsole: "Brza konzola", }, label: { id: { nodeId: "ID čvora", id: "ID veze", info: "Ako ne želite promijeniti svojstva: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, unesite ID veze u ta svojstva kako biste zadržali vrijednosti svojstava netaknutima. Ako želite istu logiku u zaporci čvora, tada unesite ID čvora u zaporku čvora." }, secureFeature: "Ako vidite vrijednost koja počinje s P3X i izgleda isto, to je sigurna značajka. Da biste promijenili postavke, samo zamijenite ove postavke praznim ili nečim drugim i one će biti spremljene. Ako ne promijenite postavke, postavke će se zadržati onakve kakve jesu na poslužitelju.", ssh: { on: "SSH uključen", off: "SSH isključeno", sshHost: "SSH Host", sshPort: "SSH priključak", sshUsername: "SSH korisničko ime", sshPassword: "SSH lozinka", sshPrivateKey: "SSH privatni ključ" }, isBuffer: opts => `[objekt ArrayBuffer] znači da je vrijednost binarni podatak ili je vrijednost veća od ${opts.maxValueAsBuffer}`, streamValue: `Polje i vrijednost toka su jednolinijski. Npr.: polje1 vrijednost1 "polje 2" "vrijednost 2"`, streamTimestampId: `'*' znači automatski generirano ili specifikaciju kao -`, unableToLoadKey: ({ key }) => { return `Nije moguće učitati ovaj ključ: ${key}. Moguće, ključ je izbrisan. Točna greška je u konzoli.`; }, bigJson: "Ovaj JSON objekt ima više od 10 kb, stoga budite sigurni da znate što radite, jer neke funkcije mogu sporo renderirati.", addNode: "Dodaj čvor", validateJson: "Potvrdite JSON", reducedFunction: `Smanjena funkcionalnost`, tooManyKeys: opts => { return `Za potpune maksimalne dopuštene funkcije ukupno je ${opts.maxLightKeysCount} brojati. Ova baza podataka ima više od ukupno dopuštenih ključeva ${opts.count}. Onemogućeno je razvrstavanje po ključu i dodatni otmjeni podaci o stablu. Pretraživanje se odvija samo na poslužitelju umjesto pretraživanja klijenta.`; }, redisCommandNotFound: "Nije pronađeno podudaranje naredbe Redis ...", treeKeyStore: `Razvrstavanje (prirodna usporedba) izvršava se na klijentu koji se zove preglednik, što znači da ima kaznu za velike velike skupove, poput preko 10 tisuća ključeva, što bi moglo dodati malo vremena renderiranju stranice. U Redis nema sortiranja ključeva, samo ovako.`, socketIoTimeout: options => { return `Isteklo je vrijeme Socket.IO za ovaj zahtjev (maks ${options.timeout / 1000} sekundi) ...`; }, resizerInfo: options => { return `Minimalna širina lijeve ili desne ploče je ${options.width}px`; }, jsonViewNotParsable: "Ova vrijednost nije JSON parsable ", ttlTitle: "Postavite TTL u sekundi", passwordSecure: "Lozinka može biti prazna, ali će i dalje prikazivati znakove, ovo je sigurnosna značajka.", tlsWithoutCert: "Omogućite TLS bez dodatnog certifikata", tlsRejectUnauthorized: "Odbaci neovlašteni certifikat", tlsSecure: "Ako vidite TLS konfiguraciju koja počinje s P3X ili sve TLS postavke izgledaju isto, to je sigurna značajka. Da biste promijenili postavke, samo zamijenite ove postavke praznim ili nečim drugim i one će biti spremljene. Ako ne promijenite TLS postavke, postavke će se zadržati onakve kakve jesu na poslužitelju.", treeSeparatorEmpty: "Ako je separator stabla prazan, stablo neće imati ugniježđene čvorove, samo čistu listu", treeSeparatorEmptyNote: "Nema ugniježđenih čvorova, samo čisti popis", welcomeConsole: "Dobrodošli na Redis konzolu", welcomeConsoleInfo: "Povijest kursora GORE ili DOLJE je omogućena", redisListIndexInfo: "Prazno za dodavanje, -1 za dodavanje ispred ili spremanje na prikazano mjesto.", console: "Konzola", connectiondAdd: "Dodaj vezu", connectiondEdit: "Uredi vezu", connectiondView: "Pregledajte vezu", connections: "Veze", licenseInfo: "Licenca", licenseEditable: "Licenca se može uređivati", licenseEditableYes: "da", licenseEditableNo: "br", licenseTerminalOnly: "Licenca se može konfigurirati samo s poslužiteljskog terminala.", licenseTierPolicyTitle: "Politika razine", licenseTierPolicyText: "

Free

core Redis samo korisničko sučelje; nema SSH tuneliranja, nema načina veze samo za čitanje, nema Cluster/Sentinel, nema Uređivanje JSON/Učitaj binarno/Preuzmi binarno, ne ReJSON.
Cijena: 0 HUF/mjesečno (0€/mjesec).

Pro

SSH tuneliranje, način veze samo za čitanje (uključujući --readonly-connections/-r), Uredi JSON, Upload binary, Download binary, ReJSON.
Osnovna cijena: 400 HUF/mjesec (1€/mjesec) ili 4.000 HUF/godišnje (10 €/godišnje).
Ukupno sa 27% VAT: 500 HUF/mjesečno (1,27 € mjesečno) ili 5100 HUF godišnje (12,70 €/godina).

Enterprise

SSH tuneliranje, Cluster i Sentinel, plus Uredi JSON, Prenesi binarno, Preuzmi binarno, ReJSON; --readonly-connections/-r također radi.
Osnovna cijena: 1.200 HUF/mjesec (3€/mjesec) ili 12.000 HUF/godišnje (30€/godina).
Ukupno sa 27% VAT: 1500 HUF/mjesec (3,81€/mjesec) ili 15.200 HUF/godišnje (38,10 €/godišnje).

Godišnje pravilo

Godišnja cijena je 10x mjesečna cijena.

Sjedala

Zadana licenca uključuje 5 sjedala. Ako trebate više mjesta, kontaktirajte nas na support@corifeus.com.

Eprobno razdoblje za poduzeća

10 dana besplatno za bilo koga sa stvarno postojećom e-adresom (netestna e-pošta).

Informacije o naplati u e-pošti

Ime, E-pošta za naplatu, Državni broj, Poštanski broj, Grad, Adresa, VAT ID (izborno).

Plaćanje

PayPal plaćanje je dostupno samo u HUF (forint); nakon slanja novca @ https://paypal.me/corifeus poslat ću vam fakturu. Sve uplate su nepovratne.

VAT

VAT dodaje se cijeni (27% u Mađarska).

Kontakt

Ako želite pozdraviti ili imate pitanje, kontaktirajte support@corifeus.com.

Language

Račun i licencna e-pošta komunikacija je na engleskom jeziku. Valuta fakture je HUF.

Note

Provjera valjanosti licence zahtijeva pristup internetu.", licenseState: "Država", licenseStateActive: "Aktivno", licenseStateInactive: "Neaktivan", licenseStateNoLicense: "Bez dozvole", licenseKeyMasked: "Spremljen ključ", licenseTier: "Razina", licenseValid: "Valjano", licenseStatus: "Status licence", licenseReason: "razum", licenseCheckedAt: "Provjereno u", licenseStartsAt: "Počinje u", licenseExpiresAt: "Istječe u", licenseDaysLeft: "Preostalo dana", licenseMaxDevices: "Max uređaja", licenseActiveDevices: "Aktivni uređaji", licenseActiveDevicesInfo: "Ako se uređaj više ne koristi, njegovo se sjedište automatski oslobađa nakon 75 minuta.", licenseCustomerEmail: "E-pošta kupca", licenseFeatures: "Značajke", licenseFeaturesEmpty: "Nema dodatnih značajki", licenseFeatureReadonlyMode: "Način veze samo za čitanje", licenseFeatureReadonlyConnectionsFlag: "Veze samo za čitanje (--readonly-connections/-r)", licenseFeatureSsh: "SSH tuneliranje", licenseFeatureCluster: "Cluster veze", licenseFeatureSentinel: "Sentinel veze", licenseFeatureReJSON: "ReJSON (tip podataka JSON)", keysSort: { on: "Razvrstavanje ključeva uključeno", off: "Razvrstavanje ključeva isključeno" }, cluster: { on: "Cluster uključen", off: "Cluster isključeno" }, sentinel: { on: "Sentinel uključen", off: "Sentinel isključeno", name: "Sentinel ime" }, readonly: { on: "Samo za čitanje uključeno", off: "Isključeno samo za čitanje" }, proSshOnly: "SSH dostupan je u verzijama Pro ili Enterprise.", proReadonlyOnly: "Način povezivanja samo za čitanje dostupan je u Pro ili Enterprise.", enterpriseClusterSentinelOnly: "Cluster i Sentinel dostupni su samo u Enterpriseu.", theme: { light: "svjetlo", dark: "Mračno poduzeće", darkNeu: "tamno", darkoBluo: "Darko bluo", enterprise: "Poduzeće", redis: "Redis", matrix: "Matrica" }, connected: opts => { return `Povezano: ${opts.name}`; }, tree: "Drvo", askAuth: "Zatražite autorizaciju", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduli", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Prekini vezu", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Naredbe", ungrouped: "Bez grupe", grouped: "Grouped", connectFirst: "Prvo se povežite na Redis poslužitelj", searchLanguage: "Pretraži jezik...", exportProgress: "Izvoz ključeva...", importProgress: "Uvoz ključeva...", importPreview: "Pregled", importOverwrite: "Prepiši", importSkip: "Preskoči", importConflict: "Ako ključ već postoji:", noKeysToExport: "Nema ključeva za izvoz", time: "Vrijeme", loading: "Učitavanje...", autoRefresh: "Auto", exportSearchHint: "Izvoz samo ključeva koji odgovaraju trenutnom pretraživanju", importSearchHint: "Uvoz se primjenjuje na cijelu bazu podataka, ne samo na rezultate pretrage", importNoKeys: "Nisu pronađeni ključevi u datoteci", }, status: { dataCopied: "Podaci su u međuspremniku", licenseSaved: "Licenca spremljena", exportDone: "Izvoz završen", indexCreated: "Indeks kreiran", indexDropped: "Indeks obrisan", importDone: (opts) => `Uvoz završen: ${opts.created} kreirano, ${opts.skipped} preskočeno, ${opts.errors} grešaka`, nodeRemoved: "Čvor uklonjen", keyIsNotExisting: "Ovaj je ključ mogao biti izbrisan ili istekao.", keyCount: opts => { if (opts.keyCount === 0) { return "Nema ključa"; } else if (opts.keyCount === 1) { return "1 ključ"; } else { return `${opts.keyCount} ključevi`; } }, treeExpandAll: "Proširite sve listove drveća. Ova operacija može biti skupa i može potrajati ...", noRedisKeys: "U ovoj bazi podataka nema ključeva.", redisConnected: "Redis uspješno povezan", reloadingDataInfo: "Ponovno učitavanje podataka Redis", added: "Dodano", saved: "Ažurirano", cancelled: "Otkazano", deleted: "Izbrisano", savedRedis: "Podaci Redis su spremljeni", redisDisconnected: opts => { return `Trenutna veza je imala pogrešku: ${opts.error.message}`; }, dbChanged: opts => { return `Indeks db postavljen na ${opts.db}. `; }, treeDeleted: opts => { return `Ključ stabla je izbrisan (${opts.key}).`; }, deletedKey: opts => { return `Ključ je izbrisan (${opts.key}).`; }, renamedKey: "Ovaj ključ je preimenovan", ttlChanged: "TTL ovog ključa je promijenjen", notInteger: "Ovaj unos nije cijeli broj", persisted: "Ovaj ključ ostaje zauvijek", set: "Ključ je postavljen/dodan" }, code: { "delete-connection": "Ova veza je izbrisana, tako da ste prekinuti s ovom Redis instancom.", "save-connection": "Ova je veza promijenjena, tako da ste prekinuti s ovom Redis instancom. Možete se ponovno povezati.", "readonly-connections": "Veze dodavanje/spremanje/brisanje su samo za čitanje!", "readonly-connection-mode": "Ova veza je samo za čitanje!", "list-out-of-bounds": "Ovaj indeks popisa je izvan granica", "donation-ware-feature": "Ova je značajka prisutna u verziji za donacije.", "feature-pro-readonly-required": "Način veze samo za čitanje zahtijeva Pro ili Enterprise licencu.", "feature-pro-ssh-required": "SSH tuneliranje zahtijeva Pro ili Enterprise licencu.", "feature-enterprise-cluster-sentinel-required": "Cluster i Sentinel zahtijevaju Enterprise licencu.", "feature-pro-json-binary-required": "Uredi JSON, Upload binary i Download binary zahtijevaju Pro ili Enterprise licencu.", "feature-pro-rejson-required": "ReJSON (tip podataka JSON) zahtijeva Pro ili Enterprise licencu.", "invalid-json-value": "Vrijednost nije važeća JSON.", "http_auth_required": "Potrebna autorizacija: provjerite autentičnost pomoću HTTP Basic Auth i ponovno učitajte.", "auto-connection-failed": "Moguće je da je zbog toga veza uklonjena i automatsko povezivanje nije uspjelo.", invalid_console_command: "Ova naredba ne radi putem GUI." }, licenseReason: { LICENSE_VALID: "Licenca je važeća", LICENSE_INVALID: "Licenca je nevažeća", LICENSE_MISSING: "Nije postavljen licencni ključ", LICENSE_DISABLED: "Licenca je onemogućena u konfiguraciji poslužitelja", LICENSE_NOT_FOUND: "Licenca nije pronađena", LICENSE_EXPIRED: "Licenca je istekla", LICENSE_CLEARED: "Ključ licence je izbrisan", LICENSE_MAX_DEVICES_REACHED: "Dosegnut je maksimalan broj mjesta na uređaju", PRODUCT_MISMATCH: "Licencni proizvod ne odgovara" }, licenseStatusValue: { active: "Aktivno", deleted: "Izbrisano", all: "sve", expired: "isteklo", missing: "Nedostaje", inactive: "Neaktivan" }, form: { error: { required: "Obavezno", port: "Luka je između 1-65535", invalid: "Obrazac je nevažeći" }, connection: { label: { name: "Ime", group: "Group", host: "Naziv hosta", port: "Luka", password: "Lozinka", username: "Korisničko ime" } }, treeSettings: { maxValueDisplay: "Maksimalna duljina niza za prikaz vrijednosti", maxValueDisplayInfo: "Ako je postavljeno na 0, prikaži pune vrijednosti. Ako je veći od 0, skrati na ovu duljinu. Ako je -1: za nizove, sakrijte vrijednost do uređivanja; za ostale vrste, prikaži puni sadržaj.", maxKeys: "Maksimalni broj ključeva", maxKeysInfo: "Kako se GUI ne bi srušio, ograničavamo maksimalan broj ključeva.", keyCount: () => { return `Broj tipki: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Koristite animaciju", noAnimation: "Nema animacije", jsonFormatTwoSpace: "Format JSON s 2 razmaka", jsonFormatFourSpace: "Format JSON s 4 razmaka", formName: "Redis postavke", searchModeClient: "Način pretraživanja klijenata", searchModeServer: "Način pretraživanja poslužitelja", searchModeStartsWith: "Pretraga s počinje s načinom", searchModeIncludes: "Pretraga uključuje način" }, field: { treeSeparator: "Razdjelnik stabala", treeSeparatorSelector: "Selektor separatora stabla", page: "Broj stranica stabla", keyPageCount: "Broj straničnih stranica", keysSort: "Razvrstaj ključeve", searchMode: "Način pretraživanja", searchModeStartsWith: "Pretraživanje počinje s / uključuje" }, error: { keyPageCount: "Broj ključnih stranica mora biti cijeli broj između 5 - 100", page: "Broj stranica mora biti cijeli broj između 10 - 5000", maxValueDisplay: "Maksimalna prikazana vrijednost mora biti cijeli broj između -1 i 32768", maxKeys: "Maksimalna vrijednost broja ključeva mora biti cijeli broj između 100 i 100 000" } }, key: { label: { formName: { add: "Dodajte novi ključ Redis", edit: "Uredi ključ Redis", append: "Dodajte postojećem ključu Redis" } }, field: { streamTimestamp: "Vremenska oznaka", key: "Ključ", type: "Vrsta", index: "Indeks", hashKey: "Hash ključ", score: "rezultat", value: "Vrijednost" }, error: { streamTimestamp: "Vremenska oznaka je obavezna, u formatu Redis ili kao *", key: "Ključ je, barem, jedan znak", hashKey: "Ključ hash tablice je najmanje jedan znak", score: "Potreban je poredani rezultat seta", value: "Vrijednost je obavezna" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Pretraga", index: "Indeks", query: "Upit", results: "Rezultati", noIndex: "Nisu pronađeni indeksi", createIndex: "Kreiraj indeks", dropIndex: "Obriši indeks", indexInfo: "Info o indeksu", indexName: "Naziv indeksa", prefix: "Prefiks ključa (opcionalno)", fieldName: "Naziv polja", }, monitor: { title: "Nadzor", memory: "Memorija", opsPerSec: "Operacija/sek", clients: "Klijenti", blocked: "Blokirani", hitsMisses: "Stopa pogodaka", networkIo: "Mrežni I/O", slowLog: "Spori log", totalCommands: "Ukupno", expired: "Isteklo", evicted: "Izbačeno", clientList: "Popis klijenata", topKeys: "Najveći ključevi po memoriji", killClient: "Ubij klijenta", clientKilled: "Klijent ubijen", confirmKillClient: "Jeste li sigurni da želite zaustaviti ovog klijenta?", noKeys: "Nema ključeva", noClients: "Nema klijenata", }, overview: { noConnected: "Ne postoji veza sa Redis.", overviewClients: "Navedite povezane prema broju klijenata", connectedCount: opt => { if (opt.length === 1) { return "1 klijent"; } return `${opt.length} klijentima`; } }, key: { label: { key: "Ključ", encoding: "Kodiranje", length: "Veličina", ttl: "TTL", ttlTitle: "Vrijeme za život", type: "Vrsta", ttlNotExpire: "ne ističe", lengthString: "bajtova", lengthItem: "stavke", actions: "Radnje" }, list: { table: { index: "Indeks", value: "Vrijednost" } }, hash: { table: { hashkey: "Hashkey", value: "Vrijednost" } }, set: { table: { value: "član" } }, zset: { table: { value: "član", score: "rezultat" } }, stream: { table: { timestamp: "ID vremenske oznake", field: "Polje", value: "Vrijednost" } } }, treeControls: { settings: "Postavke stabla", expandAll: "Proširi sve", collapseAll: "Sažmi sve", search: { search: "Traži u ključevima", clear: "Izbrišite trenutno pretraživanje da biste ga postavili praznim", placeholderClient: "Pretraži klijentsku stranu", placeholderServer: "Pretraživanje na strani poslužitelja", info: "Pretraživanje na strani klijenta znači da odgovara tekstu u unosu pretraživanja. Pretraživanje na strani poslužitelja znači da je to poput pretraživanja u uzorcima ključeva kao *{search-text}*. Za velike skupove pretraživanja bolje je koristiti pretraživanje na strani poslužitelja. Za manje skupove pretraživanja, bolje je koristiti način pretraživanja na strani klijenta." + ` Ako je brojanje ključeva gotovo ${p3xr.settings.maxLightKeysCount}, možete pretraživati samo na strani poslužitelja.`, largeSetInfo: "U velikom skupu, pretraživanje na strani klijenta je onemogućeno. tako da je trenutno moguće samo pretraživanje na strani poslužitelja.", infoDetails: "Da biste saznali kako pretraživanje radi, pogledajte postavke" }, pager: { next: "Dalje", prev: "Prethodno", first: "Prvo", last: "Zadnje" } } }, time: { loading: "Učitavanje...", years: "godina", months: "mjeseca", days: "dana", year: "godine", month: "mjesec", day: "dan" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/hu/000077500000000000000000000000001517666434100137675ustar00rootroot00000000000000src/strings/hu/strings.js000066400000000000000000000702501517666434100160220ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licenc törölve", invalid_license: "Érvénytelen licenc", license_max_devices_reached: "Maximális eszközhelyek elérve", license_readonly: "A licenc csak a szerver terminálból módosítható.", server_error: "Szerverhiba, kérjük próbálja újra" }, title: { donate: "Adományozás", jsonRecursive: "Összes ág kibontása", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Válasszon egy Redis kapcsolatot a bal alsó menüből.", statistics: "Statisztikák", error: "Hiba", connectingRedis: "Csatlakozás a Redis-hez ...", socketioConnectError: "Socket.IO Hiba", db: "DB", server: "Szerver", clients: "Kliensek", memory: "Memória", persistence: "Perzisztencia", stats: "Statisztikák", replication: "Replikáció", cpu: "CPU", cluster: "Klaszter", modules: "Modulok", errorstats: "Hiba statisztika", commandstats: "Parancs statisztika", latencystats: "Késleltetés statisztika", keysizes: "Kulcsméretek", threads: "Szálak", }, confirm: { dropIndex: "Biztosan törli ezt az indexet?", uploadBuffer: "Biztosan feltölti ezt a bináris adatot?", uploadBufferDone: "A bináris adat feltöltve", uploadBufferDoneAndSave: "A bináris adat feltöltve és mentve a szerveren", title: "Megerősítés", alert: "Figyelmeztetés", info: "Információ", deleteListItem: "Biztosan törli ezt a listaelemet?", deleteHashKey: "Biztosan törli ezt a hash kulcs elemet?", deleteStreamTimestamp: "Biztosan törli ezt a stream időbélyeget?", deleteSetMember: "Biztosan törli ezt a halmaz tagot?", deleteZSetMember: "Biztosan törli ezt a rendezett halmaz tagot?", deleteConnection: "Megerősítés", deleteConnectionText: "Biztosan törli ezt a Redis kapcsolatot?", deleteNode: "Biztosan törli ezt a Redis csomópontot?", deleteAllKeys: opts => { return `Törli ezt a fát és az összes kulcsát (${opts.key})?`; }, socketioConnectError: "A Socket.IO nem tud csatlakozni a szerverhez. Újratöltéssel megpróbálhatja megoldani a kapcsolódási hibát, a kliens nem tudja önállóan megoldani.", socketioAuthRequired: "Socket.IO hitelesítés szükséges. Kérjük, hitelesítsen HTTP Basic Auth (felhasználónév/jelszó) segítségével, majd töltse újra.", deleteKey: "Biztosan törli ezt a kulcsot?", rename: { title: "Biztosan átnevezi ezt a kulcsot?", textContent: "Ez a művelet véglegesen átnevezi a kulcsot.", placeholder: "A Redis kulcs (kötelező)" }, ttl: { title: "Biztosan módosítja ennek a kulcsnak a TTL értékét?", textContent: "A TTL módosítása frissíti a kulcs élettartamát. Hagyja üresen, ha a kulcsot örökre meg akarja tartani.", placeholder: "A Redis kulcs TTL-je (egész szám vagy üres)", placeholderPlaceholder: "Az üres azt jelenti, hogy örökre megmarad; egyébként adjon meg egy egész számot.", convertTextToTime: "Szöveg átalakítása idővé", convertTextToTimePlaceholder: "Pl. 1d = 86400" }, license: { title: "Licenc beállítása", textContent: "Ha fizetős funkciókat szeretne használni, kérjük lépjen kapcsolatba a support@corifeus.com címmel licenc igényléséhez. Az árak: Pro 400 HUF/hó (€1/hó) vagy 4,000 HUF/év (€10/év), Enterprise 1,200 HUF/hó (€3/hó) vagy 12,000 HUF/év (€30/év). Az éves ár a havi 10-szerese. 27% ÁFÁ-val a végösszegek: Pro 500 HUF/hó (€1.27/hó) vagy 5,100 HUF/év (€12.70/év), Enterprise 1,500 HUF/hó (€3.81/hó) vagy 15,200 HUF/év (€38.10/év). A licenc érvényesítéshez internetkapcsolat szükséges. Az alapértelmezett licenc 5 helyet tartalmaz. Ha több helyre van szüksége, lépjen kapcsolatba velünk a support@corifeus.com címen.", placeholder: "Licenckulcs" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Másolás", downloadBuffer: "Bináris letöltése", setBuffer: "Bináris feltöltése", exportKeys: "Kulcsok exportálása", exportAllKeys: (opts) => `Mind a ${opts.count} kulcs exportálása`, exportSearchResults: (opts) => `${opts.count} eredmény exportálása`, importKeys: "Kulcsok importálása", saveWithFormatJson: "Mentés formázással", formatJson: "JSON formázása", wrap: "Tördelés", unwrap: "Nem tördelés", downloadJson: "JSON letöltése", pubsubMonitor: "PubSub Monitor", language: "Nyelv / Language", ok: "OK", addKey: "Hozzáadás ehhez a kulcshoz", addKeyRoot: "Gyökér kulcs hozzáadása", reloadKey: "Kulcs újratöltése", reload: "Újratöltés", close: "Bezárás", commands: "Parancsok", view: "Nézet", statistics: "Statisztikák", refresh: "Frissítés", pause: "Szünet", resume: "Folytatás", clear: "Törlés", rename: "Átnevezés", main: "Adatbázis", cancel: "Mégse", theme: "Téma", github: "GitHub", githubRepo: "Tároló", githubRelease: "Kiadások", githubChangelog: "Változásnapló", info: "Info", settings: "Beállítások", connect: "Csatlakozás", disconnect: "Leválasztás", overview: "Áttekintés", console: "Konzol", noConnections: "Nincs kapcsolat, adjon hozzá egyet a beállítások menüben.", noConnectionsInSettings: "Nincs kapcsolat, hozzáadhat egy ÚJ KAPCSOLATOT fent.", connectionAdd: "Új kapcsolat", addGroup: "Csoport hozzáadása", extend: "Kibontás", collapse: "Összecsukás", add: "Hozzáadás", edit: "Szerkesztés", save: "Mentés", ttl: "TTL beállítása", license: "Licenc beállítása", delete: "Törlés", remove: "Eltávolítás", sure: "Biztos", testConnection: "Kapcsolat tesztelése", getKey: "Redis kulcs és kapcsolódó adatok betöltése ...", jsonViewShow: "JSON megjelenítése", jsonViewEditor: "JSON szerkesztése", quickConsole: "Gyors Konzol" }, label: { id: { nodeId: 'Csomópont ID', id: "Kapcsolat ID", info: "Ha nem szeretné módosítani a következő tulajdonságokat: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, kérjük adja meg a kapcsolat azonosítóját ezekben a tulajdonságokban az értékek megtartásához. Ha ugyanezt a logikát szeretné a csomópont jelszónál, akkor adja meg a csomópont azonosítóját a csomópont jelszóban." }, secureFeature: 'Ha olyan értéket lát, ami P3X-szel kezdődik és hasonlónak tűnik, az egy biztonsági funkció. A beállítások módosításához cserélje ki ezeket üresre vagy valami másra, és mentésre kerülnek. Ha nem módosítja a beállításokat, azok a szerveren maradnak.', ssh: { on: 'SSH be', off: 'SSH ki', sshHost: 'SSH hoszt', sshPort: 'SSH port', sshUsername: 'SSH felhasználónév', sshPassword: 'SSH jelszó', sshPrivateKey: 'SSH privát kulcs' }, isBuffer: opts => `[object ArrayBuffer] azt jelenti, hogy az érték bináris adat vagy az érték nagyobb, mint ${opts.maxValueAsBuffer}`, streamValue: `Stream mező és érték egysoros. Pl.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' automatikusan generált, vagy a specifikáció szerint -`, unableToLoadKey: ({ key }) => { return `Nem sikerült betölteni ezt a kulcsot: ${key}. Lehetséges, hogy a kulcs törölve lett. A pontos hiba a konzolban található.`; }, bigJson: "Ez a JSON objektum nagyobb mint 10 kb, ezért győződjön meg róla, hogy tudja mit csinál, mert egyes funkciók lassan renderelhetnek.", addNode: "Csomópont hozzáadása", validateJson: "JSON érvényesítése", reducedFunction: `Korlátozott funkcionalitás`, tooManyKeys: opts => { return `A teljes maximális funkciókhoz engedélyezett kulcsok összesen ${opts.maxLightKeysCount} darab. Ez az adatbázis meghaladja az engedélyezett kulcsok számát: összesen ${opts.count}. A kulcsrendezés és a további fa információk le vannak tiltva. A keresés csak a szerveren történik a kliens keresés helyett.`; }, redisCommandNotFound: "Nem található egyező Redis parancs ...", treeKeyStore: `A rendezés (természetes összehasonlítás) a kliensen, azaz a böngészőben történik, ami azt jelenti, hogy nagy adathalmazoknál, például 10k kulcs felett, büntetéssel jár, és egy kis időt adhat az oldal rendereléséhez. A Redis-ben nincs kulcsrendezés, csak így.`, socketIoTimeout: options => { return `A Socket.IO időtúllépés történt ennél a kérésnél (max ${options.timeout / 1000} másodperc) ...`; }, resizerInfo: options => { return `A bal vagy jobb panel minimális szélessége ${options.width}px`; }, jsonViewNotParsable: "Ez az érték nem JSON-ként értelmezhető ", ttlTitle: "TTL beállítása másodpercekben", passwordSecure: "A jelszó lehet üres, de mégis karaktereket fog mutatni, ez egy biztonsági funkció.", tlsWithoutCert: "TLS engedélyezése további tanúsítvány nélkül", tlsRejectUnauthorized: "Nem hitelesített tanúsítvány elutasítása", tlsSecure: "Ha olyan TLS konfigurációt lát, ami P3X-szel kezdődik, vagy az összes TLS beállítás hasonlónak tűnik, az egy biztonsági funkció. A beállítások módosításához cserélje ki üresre vagy valami másra, és mentésre kerülnek. Ha nem módosítja a TLS beállításokat, azok a szerveren maradnak.", treeSeparatorEmpty: "Ha a fa elválasztó üres, a fa nem tartalmaz beágyazott csomópontokat, csak egy egyszerű listát", treeSeparatorEmptyNote: "Nincs beágyazott csomópont, csak egyszerű lista", welcomeConsole: "Üdvözöljük a Redis Konzolban", welcomeConsoleInfo: "Kurzor FEL vagy LE előzménynavigáció engedélyezve", redisListIndexInfo: "Üres a hozzáfűzéshez, -1 az elejére beszúráshoz, vagy mentse a mutatott pozícióba.", console: "Konzol", connectiondAdd: "Kapcsolat hozzáadása", connectiondEdit: "Kapcsolat szerkesztése", connectiondView: "Kapcsolat megtekintése", connections: "Kapcsolatok", licenseInfo: "Licenc", licenseEditable: "Licenc szerkeszthető", licenseEditableYes: "Igen", licenseEditableNo: "Nem", licenseTerminalOnly: "A licenc csak a szerver terminálból konfigurálható.", licenseTierPolicyTitle: "Szintszabályzat", licenseTierPolicyText: "

Ingyenes

Csak alap Redis UI; nincs SSH alagút, nincs Csak olvasható kapcsolat mód, nincs Klaszter/Sentinel, nincs JSON szerkesztés/Bináris feltöltés/Bináris letöltés, nincs ReJSON.
Ár: 0 HUF/hó (€0/hó).

Pro

SSH alagút, Csak olvasható kapcsolat mód (beleértve --readonly-connections/-r), JSON szerkesztés, Bináris feltöltés, Bináris letöltés, ReJSON.
Alapár: 400 HUF/hó (€1/hó) vagy 4,000 HUF/év (€10/év).
Összesen 27% ÁFÁ-val: 500 HUF/hó (€1.27/hó) vagy 5,100 HUF/év (€12.70/év).

Enterprise

SSH alagút, Klaszter és Sentinel, valamint JSON szerkesztés, Bináris feltöltés, Bináris letöltés, ReJSON; --readonly-connections/-r szintén működik.
Alapár: 1,200 HUF/hó (€3/hó) vagy 12,000 HUF/év (€30/év).
Összesen 27% ÁFÁ-val: 1,500 HUF/hó (€3.81/hó) vagy 15,200 HUF/év (€38.10/év).

Éves szabály

Az éves ár a havi ár 10-szerese.

Helyek

Az alapértelmezett licenc 5 helyet tartalmaz. Ha több helyre van szüksége, lépjen kapcsolatba velünk a support@corifeus.com címen.

Enterprise próba

10 nap ingyenes próba bármely valós e-mail címmel (nem teszt e-mail).

Számlázási adatok e-mailben

Név, Számlázási e-mail, Országkód, Irányítószám, Város, Cím, Adószám (opcionális).

Fizetés

PayPal fizetés csak HUF-ban (forint) érhető el; a pénz elküldése után a https://paypal.me/corifeus címen küldök egy számlát. Minden fizetés visszatéríthetetlen.

ÁFA

Az ÁFA hozzáadódik az árhoz (27% Magyarországon).

Kapcsolat

Ha üdvözölni szeretne vagy kérdése van, írjon a support@corifeus.com címre.

Nyelv

A számla és a licenc e-mail kommunikáció angol nyelven történik. A számla pénzneme HUF.

Megjegyzés

A licenc érvényesítéshez internetkapcsolat szükséges.", licenseState: "Állapot", licenseStateActive: "Aktív", licenseStateInactive: "Inaktív", licenseStateNoLicense: "Nincs licenc", licenseKeyMasked: "Mentett kulcs", licenseTier: "Szint", licenseValid: "Érvényes", licenseStatus: "Licenc állapot", licenseReason: "Ok", licenseCheckedAt: "Ellenőrizve", licenseStartsAt: "Kezdődik", licenseExpiresAt: "Lejár", licenseDaysLeft: "Hátralévő napok", licenseMaxDevices: "Max eszközök", licenseActiveDevices: "Aktív eszközök", licenseActiveDevicesInfo: "Ha egy eszköz már nincs használatban, a helye automatikusan felszabadul 75 perc után.", licenseCustomerEmail: "Ügyfél e-mail", licenseFeatures: "Funkciók", licenseFeaturesEmpty: "Nincs extra funkció", licenseFeatureReadonlyMode: "Csak olvasható kapcsolat mód", licenseFeatureReadonlyConnectionsFlag: "Csak olvasható kapcsolatok (--readonly-connections/-r)", licenseFeatureSsh: "SSH alagút", licenseFeatureCluster: "Klaszter kapcsolatok", licenseFeatureSentinel: "Sentinel kapcsolatok", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Kulcsrendezés be", off: "Kulcsrendezés ki" }, cluster: { on: "Klaszter be", off: "Klaszter ki" }, sentinel: { on: "Sentinel be", off: "Sentinel ki", name: "Sentinel név" }, readonly: { on: "Csak olvasható be", off: "Csak olvasható ki" }, proSshOnly: "Az SSH a Pro vagy Enterprise verzióban érhető el.", proReadonlyOnly: "A csak olvasható kapcsolat mód a Pro vagy Enterprise verzióban érhető el.", enterpriseClusterSentinelOnly: "A Klaszter és Sentinel csak az Enterprise verzióban érhető el.", theme: { light: "Világos", dark: "Sötét enterprise", darkNeu: "Sötét", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Csatlakozva: ${opts.name}`; }, tree: "Fa", askAuth: "Hitelesítés kérése", keyboardShortcuts: "Billentyűparancsok", about: "Névjegy", supportedLanguages: "Támogatott nyelvek", version: "Verzió", redisVersion: "Redis verzió", modules: "Modulok", shortcutRefresh: "Frissítés", shortcutSearch: "Keresés fókuszálása", shortcutNewKey: "Új kulcs", shortcutDisconnect: "Leválasztás", themeAuto: "Automatikus (rendszer)", shortcutCommandPalette: "Parancspaletta", commandPalette: "Parancspaletta", noResults: "Nincs találat", redisCommandsReference: "Redis Parancsok", ungrouped: "Csoportosítatlan", grouped: "Csoportosított", connectFirst: "Először csatlakozzon egy Redis szerverhez", searchLanguage: "Nyelv keresése...", exportProgress: "Kulcsok exportálása...", importProgress: "Kulcsok importálása...", importPreview: "Előnézet", importOverwrite: "Felülírás", importSkip: "Kihagyás", importConflict: "Ha a kulcs már létezik:", noKeysToExport: "Nincs exportálandó kulcs", time: "Idő", loading: "Betöltés...", autoRefresh: "Auto", exportSearchHint: "Csak az aktuális keresésnek megfelelő kulcsok exportálása", importSearchHint: "Az importálás a teljes adatbázisra vonatkozik, nem csak a keresési eredményekre", importNoKeys: "Nem található kulcs a fájlban", }, status: { dataCopied: "Az adat a vágólapon van", licenseSaved: "Licenc mentve", exportDone: "Exportálás kész", indexCreated: "Index létrehozva", indexDropped: "Index törölve", importDone: (opts) => `Importálás kész: ${opts.created} létrehozva, ${opts.skipped} kihagyva, ${opts.errors} hiba`, nodeRemoved: "Csomópont eltávolítva", keyIsNotExisting: "Ez a kulcs törölve vagy lejárt lehetett.", keyCount: opts => { if (opts.keyCount === 0) { return "Nincs kulcs"; } else if (opts.keyCount === 1) { return "1 kulcs"; } else { return `${opts.keyCount} kulcs`; } }, treeExpandAll: "Összes fa ág kibontása. Ez a művelet költséges lehet és időbe telhet ...", noRedisKeys: "Nincsenek kulcsok ebben az adatbázisban.", redisConnected: "Redis sikeresen csatlakoztatva", reloadingDataInfo: "Redis adatinformáció újratöltése", added: "Hozzáadva", saved: "Frissítve", cancelled: "Megszakítva", deleted: "Törölve", savedRedis: "Redis adat mentve", redisDisconnected: opts => { return `A jelenlegi kapcsolatban hiba történt: ${opts.error.message}`; }, dbChanged: opts => { return `Az adatbázis index beállítva: ${opts.db}. `; }, treeDeleted: opts => { return `A fa kulcs törölve (${opts.key}).`; }, deletedKey: opts => { return `A kulcs törölve (${opts.key}).`; }, renamedKey: "Ez a kulcs átnevezve", ttlChanged: "Ennek a kulcsnak a TTL értéke módosult", notInteger: "Ez a bemenet nem egész szám", persisted: "Ez a kulcs örökre megmarad", set: "A kulcs beállítva/hozzáadva" }, code: { "delete-connection": "Ez a kapcsolat törölve lett, ezért leválasztásra került erről a Redis példányról.", "save-connection": "Ez a kapcsolat módosult, ezért leválasztásra került erről a Redis példányról. Újra csatlakozhat.", "readonly-connections": "A kapcsolatok hozzáadása/mentése/törlése csak olvasható!", "readonly-connection-mode": "Ez a kapcsolat csak olvasható módban van!", "list-out-of-bounds": "Ez a listaindex határon kívül van", "donation-ware-feature": "Ez a funkció az adományos verzióban érhető el.", "feature-pro-readonly-required": "A csak olvasható kapcsolat mód Pro vagy Enterprise licencet igényel.", "feature-pro-ssh-required": "Az SSH alagút Pro vagy Enterprise licencet igényel.", "feature-enterprise-cluster-sentinel-required": "A Klaszter és Sentinel Enterprise licencet igényel.", "feature-pro-json-binary-required": "A JSON szerkesztés, Bináris feltöltés és Bináris letöltés Pro vagy Enterprise licencet igényel.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Hitelesítés szükséges: kérjük hitelesítsen HTTP Basic Auth segítségével és töltse újra.", "auto-connection-failed": "Lehetséges, hogy a kapcsolat eltávolításra került és az automatikus csatlakozás emiatt sikertelen volt.", invalid_console_command: "Ez a parancs nem működik a GUI-n keresztül." }, licenseReason: { LICENSE_VALID: "A licenc érvényes", LICENSE_INVALID: "A licenc érvénytelen", LICENSE_MISSING: "Nincs licenckulcs beállítva", LICENSE_DISABLED: "A licenc le van tiltva a szerver konfigurációban", LICENSE_NOT_FOUND: "A licenc nem található", LICENSE_EXPIRED: "A licenc lejárt", LICENSE_CLEARED: "A licenckulcs törölve lett", LICENSE_MAX_DEVICES_REACHED: "Maximális eszközhelyek elérve", PRODUCT_MISMATCH: "A licenc termék nem egyezik" }, licenseStatusValue: { active: "Aktív", deleted: "Törölt", all: "Összes", expired: "Lejárt", missing: "Hiányzó", inactive: "Inaktív" }, form: { error: { required: "Kötelező", port: "A port 1-65535 között van", invalid: "Az űrlap érvénytelen" }, connection: { label: { name: "Név", group: "Csoport", host: "Hosznév", port: "Port", password: "Jelszó", username: "Felhasználónév" } }, treeSettings: { maxValueDisplay: "Maximális érték megjelenítési karakterhossz", maxValueDisplayInfo: "Ha 0, a teljes értéket mutatja. Ha nagyobb mint 0, erre a hosszra vágja. Ha -1: karakterláncoknál elrejti az értéket szerkesztésig; más típusoknál teljes tartalmat mutat.", maxKeys: "Maximális kulcsszám", maxKeysInfo: "Hogy a GUI ne fagyjon le, korlátozzuk a maximális kulcsszámot.", keyCount: () => { return `Kulcsok száma: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Animáció használata", noAnimation: "Nincs animáció", jsonFormatTwoSpace: "JSON formázása 2 szóközzel", jsonFormatFourSpace: "JSON formázása 4 szóközzel", formName: "Redis beállítások", searchModeClient: "Kliens keresési mód", searchModeServer: "Szerver keresési mód", searchModeStartsWith: "Keresés kezdődik-e móddal", searchModeIncludes: "Keresés tartalmazza móddal" }, field: { treeSeparator: "Fa elválasztó", treeSeparatorSelector: "Fa elválasztó választó", page: "Fa lapozási szám", keyPageCount: "Kulcs lapozási szám", keysSort: "Kulcsok rendezése", searchMode: "Keresési mód", searchModeStartsWith: "Keresés kezdődik-e / tartalmazza" }, error: { keyPageCount: "A kulcs lapozási szám 5 és 100 közötti egész szám kell legyen", page: "A lapozási szám 10 és 5000 közötti egész szám kell legyen", maxValueDisplay: "A maximális megjelenítési érték -1 és 32768 közötti egész szám kell legyen", maxKeys: "A maximális kulcsszám 100 és 100000 közötti egész szám kell legyen" } }, key: { label: { formName: { add: "Új Redis kulcs hozzáadása", edit: "Redis kulcs szerkesztése", append: "Hozzáadás meglévő Redis kulcshoz" } }, field: { streamTimestamp: "Időbélyeg", key: "Kulcs", type: "Típus", index: "Index", hashKey: "Hash kulcs", score: "Pontszám", value: "Érték" }, error: { streamTimestamp: "Az időbélyeg kötelező, Redis formátumban vagy *-ként", key: "A kulcs legalább egy karakter", hashKey: "A hash tábla kulcs legalább egy karakter", score: "A rendezett halmaz pontszám kötelező", value: "Az érték kötelező" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Keresés", index: "Index", query: "Lekérdezés", results: "Eredmények", noIndex: "Nem található index", createIndex: "Index létrehozása", dropIndex: "Index törlése", indexInfo: "Index info", indexName: "Index neve", prefix: "Kulcs előtag (opcionális)", fieldName: "Mező neve", }, monitor: { title: "Figyelés", memory: "Memória", opsPerSec: "Művelet/mp", clients: "Kliensek", blocked: "Blokkolt", hitsMisses: "Találati arány", networkIo: "Hálózat I/O", slowLog: "Lassú napló", totalCommands: "Összesen", expired: "Lejárt", evicted: "Kiszorított", clientList: "Klienslista", topKeys: "Legnagyobb kulcsok memória szerint", killClient: "Kliens leállítása", clientKilled: "Kliens leállítva", confirmKillClient: "Biztosan le szeretné állítani ezt a klienst?", noKeys: "Nincsenek kulcsok", noClients: "Nincsenek kliensek", }, overview: { noConnected: "Nincs Redis kapcsolat.", overviewClients: "Csatlakozott kliensek száma szerinti lista", connectedCount: opt => { if (opt.length === 1) { return "1 kliens"; } return `${opt.length} kliens`; } }, key: { label: { key: "Kulcs", encoding: "Kódolás", length: "Méret", ttl: "TTL", ttlTitle: "Élettartam", type: "Típus", ttlNotExpire: "nem jár le", lengthString: "bájt", lengthItem: "elem", actions: "Műveletek" }, list: { table: { index: "Index", value: "Érték" } }, hash: { table: { hashkey: "Hash kulcs", value: "Érték" } }, set: { table: { value: "Tag" } }, zset: { table: { value: "Tag", score: "Pontszám" } }, stream: { table: { timestamp: "Időbélyeg ID", field: "Mező", value: "Érték" } } }, treeControls: { settings: "Fa beállítások", expandAll: "Összes kibontása", collapseAll: "Összes összecsukása", search: { search: "Keresés a kulcsok között", clear: "Jelenlegi keresés törlése", placeholderClient: "Keresés kliens oldalon", placeholderServer: "Keresés szerver oldalon", info: "A kliens oldali keresés azt jelenti, hogy a keresőmezőben lévő szöveget egyezteti. A szerver oldali keresés azt jelenti, hogy a kulcsmintákban keres, mint *{keresett-szöveg}*. Nagy adathalmazoknál jobb a szerver oldali keresés. Kisebb halmazoknál jobb a kliens oldali keresés." + ` Ha a kulcsok száma meghaladja a ${p3xr.settings.maxLightKeysCount} értéket, csak szerver oldalon kereshet.`, largeSetInfo: "Nagy adathalmaz esetén a kliens oldali keresés le van tiltva, jelenleg csak szerver oldali keresés lehetséges.", infoDetails: "A keresés működésének megismeréséhez tekintse meg a beállításokat" }, pager: { next: "Következő", prev: "Előző", first: "Első", last: "Utolsó" } } }, time: { years: "év", months: "hónap", days: "nap", year: "év", month: "hónap", day: "nap" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/hy/000077500000000000000000000000001517666434100137735ustar00rootroot00000000000000src/strings/hy/strings.js000066400000000000000000001073171517666434100160330ustar00rootroot00000000000000const strings = { error: { cleared_license: "Մաքրված լիցենզիա", invalid_license: "Անվավեր լիցենզիա", license_max_devices_reached: "Սարքի նստատեղերի առավելագույն քանակը հասել է", license_readonly: "Լիցենզիան կարող է փոխվել միայն սերվերի տերմինալից:", server_error: "Սերվերի սխալ, խնդրում ենք կրկին փորձել" }, title: { donate: "Նվիրաբերել", jsonRecursive: "Ընդլայնելով բոլոր տերևները", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Դուք կարող եք ընտրել Redis կապ՝ ներքևի ձախ ցանկից միանալու համար:", statistics: "Վիճակագրություն", error: "Սխալ", connectingRedis: "Միացում Redis-ին...", socketioConnectError: "Socket.IO Սխալ", db: "DB", server: "Սերվեր", clients: "Հաճախորդներ", memory: "Հիշողություն", persistence: "Համառություն", stats: "Վիճակագրություն", replication: "Կրկնօրինակում", cpu: "CPU", cluster: "Cluster", modules: "Մoդուլներ", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "Vստah eq?", uploadBuffer: "Վստա՞հ եք վերբեռնելու այս երկուական տվյալները:", uploadBufferDone: "Երկուական տվյալները վերբեռնված են", uploadBufferDoneAndSave: "Երկուական տվյալները վերբեռնվում և պահվում են սերվերում", title: "Հաստատել", alert: "Զգուշացում", info: "Ինֆո", deleteListItem: "Վստա՞հ եք ջնջելու այս ցանկի տարրը:", deleteHashKey: "Վստա՞հ եք ջնջելու այս հեշ բանալի տարրը:", deleteStreamTimestamp: "Վստա՞հ եք ջնջելու այս հոսքի ժամանակի դրոշմը:", deleteSetMember: "Վստա՞հ եք ջնջելու այս խմբի անդամին:", deleteZSetMember: "Վստա՞հ եք ջնջելու այս տեսակավորված խմբի անդամին:", deleteConnection: "Հաստատել", deleteConnectionText: "Վստա՞հ եք ջնջելու այս Redis կապը:", deleteNode: "Վստա՞հ եք ջնջելու այս Redis հանգույցը:", deleteAllKeys: opts => { return `Ջնջել այս ծառը և դրա բոլոր բանալիները (${opts.key})?`; }, socketioConnectError: "Socket.IO-ը չի կարող միանալ սերվերին, կարող եք վերաբեռնել և փորձել ինքներդ լուծել կապի սխալը, հաճախորդը չգիտի, թե ինչպես լուծել այն:", socketioAuthRequired: "Socket.IO թույլտվություն է պահանջվում: Խնդրում ենք նույնականացնել HTTP Basic Auth-ով (օգտանուն/գաղտնաբառ) և վերաբեռնել:", deleteKey: "Վստա՞հ եք ջնջելու այս բանալին:", rename: { title: "Վստա՞հ եք վերանվանելու այս բանալին:", textContent: "Այս գործողությամբ բանալին ընդմիշտ վերանվանվում է:", placeholder: "Redis բանալի (պարտադիր)" }, ttl: { title: "Իսկապե՞ս ուզում եք փոխել այս բանալին TTL:", textContent: "TTL-ի փոփոխությունը թարմացնում է այս բանալին ապրելու ժամանակը: Դատարկ թողեք այս բանալին ընդմիշտ պահելու համար:", placeholder: "Redis բանալի TTL (ամբողջական կամ դատարկ)", placeholderPlaceholder: "Դատարկ նշանակում է, որ այն պահպանվում է ընդմիշտ. հակառակ դեպքում մուտքագրեք ամբողջ թիվ:", convertTextToTime: "Փոխարկել տեքստը ժամանակի", convertTextToTimePlaceholder: "Օրինակ. 1d-ը կլինի 86400" }, license: { title: "Սահմանել լիցենզիա", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Լիցենզիայի բանալի" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Պատճենել", downloadBuffer: "Ներբեռնեք երկուական", setBuffer: "Վերբեռնեք երկուական", exportKeys: "Արտահանել բանալիները", exportAllKeys: (opts) => `Արտahanել բdelays ${opts.count} delays`, exportSearchResults: (opts) => `Արdelays ${opts.count} delays`, importKeys: "Ներմուծել բանdelays", saveWithFormatJson: "Պահպանել ձևաչափով", formatJson: "Ձևաչափեք Json", wrap: "Փաթաթել", unwrap: "Փաթաթել", downloadJson: "Ներբեռնեք JSON", pubsubMonitor: "PubSub մոնիտոր", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Լեզու", ok: "Լավ", addKey: "Ավելացնել այս բանալին", addKeyRoot: "Ավելացնել արմատային բանալի", reloadKey: "Վերբեռնել բանալին", reload: "Վերբեռնել", close: "Փակել", commands: "Հրամաններ", view: "Դիտել", statistics: "Վիճակագրություն", refresh: "Թարմացնել", pause: "Դadar", resume: "Շarunakել", clear: "Պարզ", rename: "Վերանվանել", main: "Տdelays", cancel: "Չեղարկել", theme: "Թեմա", github: "GitHub", githubRepo: "Պահեստարան", githubRelease: "Թողարկումներ", githubChangelog: "Փոփոխություններ", info: "Info", settings: "Կարգավորումներ", connect: "Միացնել", disconnect: "Անջատել", overview: "Ընդհանուր ակնարկ", console: "Վահանակ", noConnections: "Կապ չկա, ավելացրեք կապ կարգավորումների ցանկում:", noConnectionsInSettings: "Կապ չկա, վերևում կարող եք ավելացնել ՆՈՐ ՄԻԱՑՈՒՄ:", connectionAdd: "Նոր կապ", addGroup: "Ավելացնել խումբ", extend: "Ընդլայնել", collapse: "Փլուզվել", add: "Ավելացնել", edit: "Խմբագրել", save: "Պահպանել", ttl: "Սահմանել TTL", license: "Սահմանել լիցենզիա", delete: "Ջնջել", remove: "Հեռացնել", sure: "Իհարկե", testConnection: "Փորձնական կապ", getKey: "Բեռնվում է Redis բանալի և հարակից տվյալները...", jsonViewShow: "Ցուցադրել JSON", jsonViewEditor: "Խմբագրել JSON", quickConsole: "Արագ կոնسول", }, label: { id: { nodeId: "Հանգույցի ID", id: "Միացման ID", info: "Եթե չեք ցանկանում փոխել sshPassword, sshPrivateKey, գաղտնաբառը, tlsCrt, tlsKey, tlsCa-ի հատկությունները, խնդրում ենք մուտքագրել կապի ID-ն այդ հատկություններում՝ գույքի արժեքները անփոփոխ պահելու համար: Եթե ​​ցանկանում եք նույն տրամաբանությունը հանգույցի գաղտնաբառում, ապա մուտքագրեք հանգույցի ID-ն հանգույցի գաղտնաբառում:" }, secureFeature: "Եթե տեսնում եք մի արժեք, որը սկսվում է P3X-ով և նման է նույն տեսքին, դա ապահով հատկություն է: Պարամետրերը փոխելու համար պարզապես փոխարինեք այս կարգավորումները դատարկ կամ այլ բանով, և դրանք կպահպանվեն: Եթե ​​դուք չեք փոխում կարգավորումները, կարգավորումները կպահվեն այնպես, ինչպես կան սերվերում:", ssh: { on: "SSH միացված է", off: "SSH անջատված է", sshHost: "SSH հյուրընկալող", sshPort: "SSH նավահանգիստ", sshUsername: "SSH օգտվողի անուն", sshPassword: "SSH գաղտնաբառը", sshPrivateKey: "SSH անձնական բանալի" }, isBuffer: opts => `[object ArrayBuffer] նշանակում է, որ արժեքը երկուական տվյալ է կամ արժեքը ավելի մեծ է, քան ${opts.maxValueAsBuffer}`, streamValue: `Հոսքի դաշտը և արժեքը մեկ գիծ է: Օրինակ՝ դաշտ1 արժեք1 «դաշտ 2» «արժեք 2»`, streamTimestampId: `«*» նշանակում է ավտոմատ գեներացված կամ բնութագրում որպես -`, unableToLoadKey: ({ key }) => { return `Հնարավոր չէ բեռնել այս բանալին. ${key}. Հնարավոր է, բանալին ջնջվել է: Ճշգրիտ սխալը գտնվում է վահանակում:`; }, bigJson: "Այս JSON օբյեկտը ավելի քան 10 կբ է, այնպես որ համոզվեք, որ գիտեք, թե ինչ եք անում, քանի որ որոշ գործառույթներ կարող են դանդաղ մատուցվել:", addNode: "Ավելացնել հանգույց", validateJson: "Վավերացնել JSON", reducedFunction: `Նվազեցված ֆունկցիոնալությունը`, tooManyKeys: opts => { return `Լրիվ առավելագույն գործառույթների համար թույլատրված ստեղները ընդհանուր է ${opts.maxLightKeysCount} հաշվել. Այս տվյալների բազան ընդհանուր առմամբ ունի ավելի քան թույլատրելի ստեղներ ${opts.count}. Բանալների տեսակավորումը և ծառերի լրացուցիչ երևակայական տեղեկությունները անջատված են: Որոնումը կատարվում է միայն սերվերի վրա՝ հաճախորդի որոնման փոխարեն:`; }, redisCommandNotFound: "Redis հրամանի համընկնում չի գտնվել…", treeKeyStore: `Տեսակավորումը (բնական համեմատությունը) իրականացվում է հաճախորդի վրա, որը կոչվում է բրաուզեր, ինչը նշանակում է, որ այն ունի տուգանք մեծ մեծ հավաքածուների համար, ինչպիսիք են ավելի քան 10 հազար ստեղները, այն կարող է մի փոքր ժամանակ ավելացնել էջի մատուցմանը: Redis-ում բանալիների տեսակավորում չկա, միայն այսպես.`, socketIoTimeout: options => { return `Socket.IO-ի ժամանակը սպա��վել է այս հարցման համար (առավել ${options.timeout / 1000} վայրկյան)...`; }, resizerInfo: options => { return `Ձախ կամ աջ վահանակի նվազագույն լայնությունը ${options.width}px`; }, jsonViewNotParsable: "Այս արժեքը JSON վերլուծելի չէ ", ttlTitle: "Սահմանեք TTL-ը վայրկյանների ընթացքում", passwordSecure: "Գաղտնաբառը կարող է դատարկ լինել, բայց այն դեռ ցույց կտա նիշեր, սա անվտանգության հատկանիշ է:", tlsWithoutCert: "Միացնել TLS-ն առանց լրացուցիչ վկայագրի", tlsRejectUnauthorized: "Մերժել չարտոնված վկայականը", tlsSecure: "Եթե տեսնում եք TLS կոնֆիգուրացիա, որը սկսվում է P3X-ով կամ բոլոր TLS կարգավորումները նույնն են թվում, դա ապահով հատկություն է: Պարամետրերը փոխելու համար պարզապես փոխարինեք այս կարգավորումները դատարկ կամ այլ բանով, և դրանք կպահպանվեն: Եթե ​​չ��ոխեք TLS-ի կարգավորումները, կարգավորումները կպահվեն այնպես, ինչպես կան սերվերում:", treeSeparatorEmpty: "Եթե ծառի բաժանարարը դատարկ է, ծառը չի ունենա բնադրված հանգույցներ, պարզապես մաքուր ցուցակ", treeSeparatorEmptyNote: "Ոչ մի տեղավորված հանգույցներ, պարզապես մաքուր ցուցակ", welcomeConsole: "Բարի գալուստ Redis վահանակ", welcomeConsoleInfo: "Կուրսորը UP կամ DOWN պատմությունը միացված է", redisListIndexInfo: "Դատարկ՝ ավելացնելու համար, -1՝ այն նախապես տեղադրելու կամ պահելու համար ցուցադրված դիրքում:", console: "Վահանակ", connectiondAdd: "Ավելացնել կապ", connectiondEdit: "Խմբագրել կապը", connectiondView: "Դիտել կապը", connections: "Միացումներ", licenseInfo: "Լիցենզիա", licenseEditable: "Լիցենզիա՝ խմբագրելի", licenseEditableYes: "Այո՛", licenseEditableNo: "Ոչ", licenseTerminalOnly: "Լիցենզիան կարող է կազմաձևվել միայն սերվերի տերմինալից:", licenseTierPolicyTitle: "Շրջանի քաղաքականություն", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "Պետություն", licenseStateActive: "Ակտիվ", licenseStateInactive: "Ոչ ակտիվ", licenseStateNoLicense: "Լիցենզիա չկա", licenseKeyMasked: "Պահված բանալին", licenseTier: "Շերտ", licenseValid: "Վավերական", licenseStatus: "Լիցենզիայի կարգավիճակը", licenseReason: "Պատճառը", licenseCheckedAt: "Ստուգվել է", licenseStartsAt: "Սկսվում է", licenseExpiresAt: "Ժամկետը լրանում է", licenseDaysLeft: "Մնացել են օրեր", licenseMaxDevices: "Առավելագույն սարքեր", licenseActiveDevices: "Ակտիվ սարքեր", licenseActiveDevicesInfo: "Եթե սարքն այլևս չի օգտագործվում, դրա նստատեղը ինքնաբերաբար ազատվում է 75 րոպե անց:", licenseCustomerEmail: "Հաճախորդի էլ", licenseFeatures: "Առանձնահատկություններ", licenseFeaturesEmpty: "Ոչ մի լրացուցիչ հնարավորություն", licenseFeatureReadonlyMode: "Միայն կարդալու միացման ռեժիմ", licenseFeatureReadonlyConnectionsFlag: "Միայն կարդալու միացումներ (--readonly-connections/-r)", licenseFeatureSsh: "SSH թունելավորում", licenseFeatureCluster: "Cluster միացումներ", licenseFeatureSentinel: "Sentinel միացումներ", licenseFeatureReJSON: "ReJSON (JSON տվյալների տեսակը)", keysSort: { on: "Բանալների տեսակավորումը միացված է", off: "Բանալին դասավորվում է" }, cluster: { on: "Cluster միացված է", off: "Cluster անջատված է" }, sentinel: { on: "Sentinel միացված է", off: "Sentinel անջատված է", name: "Sentinel անունը" }, readonly: { on: "Միայն կարդալու միացված է", off: "Միայն կարդալու անջատված է" }, proSshOnly: "SSH հասանելի է Pro կամ Enterprise-ում:", proReadonlyOnly: "Միայն կարդալու միացման ռեժիմը հասանելի է Pro կամ Enterprise-ում:", enterpriseClusterSentinelOnly: "Cluster և Sentinel հասանելի են միայն Enterprise-ում:", theme: { light: "Լույս", dark: "Մութ ձեռնարկություն", darkNeu: "Մութ", darkoBluo: "Դարկո բլյու", enterprise: "Ձեռնարկություն", redis: "Redis", matrix: "Մատրիցա" }, connected: opts => { return `Միացված է՝ ${opts.name}`; }, tree: "Ծառ", askAuth: "Խնդրեք թույլտվություն", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Մoդուլներ", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Անջատել", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Հրամաններ", ungrouped: "Չխմբավորված", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "Որոնել լեզու...", exportProgress: "Արތdelays բdelays...", importProgress: "Ners բdelay...", importPreview: "Նdelays", importOverwrite: "Delays", importSkip: "Delays", importConflict: "Delays delays:", noKeysToExport: "Delays delays", time: "Ժamanak", loading: "Bdelays...", autoRefresh: "Ավdelays", exportSearchHint: "Delays delays delays", importSearchHint: "Delays delays delays", importNoKeys: "Delays delays", }, status: { dataCopied: "Տվյալները սեղմատախտակում են", licenseSaved: "Լիցենզիան պահպանված է", exportDone: "Արdelays delays", indexCreated: "Index ստeghts", indexDropped: "Index ջnjved", importDone: (opts) => `Ներմուծումն delays: ${opts.created} edelays, ${opts.skipped} delays, ${opts.errors} delays`, nodeRemoved: "Հանգույցը հեռացվեց", keyIsNotExisting: "Այս բանալին կարող էր ջնջվել կամ ժամկետանց լինել:", keyCount: opts => { if (opts.keyCount === 0) { return "Բանալին չկա"; } else if (opts.keyCount === 1) { return "1 բանալի"; } else { return `${opts.keyCount} բանալիներ`; } }, treeExpandAll: "Ընդարձակեք բոլոր ծառերի տերևները: Այս վիրահատությունը կարող է թանկ լինել և կարող է ժամանակ պահանջել...", noRedisKeys: "Այս տվյալների բազայում բանալիներ չկան:", redisConnected: "Redis-ը հաջողությամբ միացավ", reloadingDataInfo: "Redis տվյալների վերաբեռնում", added: "Ավելացված է", saved: "Թարմացվել է", cancelled: "Չեղարկված է", deleted: "Ջնջված է", savedRedis: "Redis տվյալները պահպանված են", redisDisconnected: opts => { return `Ընթացիկ կապը սխա�� է ունեցել. ${opts.error.message}`; }, dbChanged: opts => { return `db ինդեքսը սահմանվել է ${opts.db}. `; }, treeDeleted: opts => { return `Ծառի բանալին ջնջվել է (${opts.key})`; }, deletedKey: opts => { return `Բանալին ջնջվել է (${opts.key})`; }, renamedKey: "Այս բանալին վերանվանվել է", ttlChanged: "Այս բանալին TTL փոխվել է", notInteger: "Այս մուտքագրումը ամբողջ թիվ չէ", persisted: "Այս բանալին ընդմիշտ պահպանվում է", set: "Բանալին դրված է/ավելացվել է" }, code: { "delete-connection": "Այս կապը ջնջվել է, ուստի դուք անջատված եք այս Redis օրինակից:", "save-connection": "Այս կապը փոխվել է, ուստի դուք անջատված եք այս Redis օրինակից: Դուք կարող եք նորից միանալ:", "readonly-connections": "Միացումներ ավելացնել/պահպանել/ջնջել միայն կարդալու են:", "readonly-connection-mode": "Այս կապը միայն կարդալու ռեժիմ է:", "list-out-of-bounds": "Ցուցակի այս ցուցանիշը սահմաններից դուրս է", "donation-ware-feature": "Այս հատկությունը առկա է նվիրատվության տարբերակում:", "feature-pro-readonly-required": "Միայն կարդալու միացման ռեժիմը պահանջում է Pro կամ Enterprise լիցենզիա:", "feature-pro-ssh-required": "SSH թունելավորման համար պահանջվում է Pro կամ Enterprise լիցենզիա:", "feature-enterprise-cluster-sentinel-required": "Cluster-ը և Sentinel-ը պահանջում են ձեռնարկության լիցենզիա:", "feature-pro-json-binary-required": "Խմբագրել JSON, վերբեռնել երկուական և ներբեռնել երկուականը պահանջում են Pro կամ Enterprise լիցենզիա:", "feature-pro-rejson-required": "ReJSON (JSON տվյալների տեսակը) պահանջում է Pro կամ Enterprise լիցենզիա:", "invalid-json-value": "Արժեքը վավեր չէ JSON:", "http_auth_required": "Պահանջվում է թույլտվություն. խնդրում ենք նույնականացնել HTTP Basic Auth-ով և վերաբեռնել:", "auto-connection-failed": "Հնարավոր է, որ կապը հեռացվել է, և ավտոմատ միացումը ձախողվել է, դրա պատճառով:", invalid_console_command: "Այս հրամանը չի աշխատում GUI-ի միջոցով:" }, licenseReason: { LICENSE_VALID: "Լիցենզիան ուժի մեջ է", LICENSE_INVALID: "Լիցենզիան անվավեր է", LICENSE_MISSING: "Լիցենզիայի բանալի սահմանված չէ", LICENSE_DISABLED: "Լիցենզիան անջատված է սերվերի կազմաձևում", LICENSE_NOT_FOUND: "Լիցենզիան չի գտնվել", LICENSE_EXPIRED: "Լիցենզիայի ժամկետը լրացել է", LICENSE_CLEARED: "Լիցենզիայի բանալին ջնջվել է", LICENSE_MAX_DEVICES_REACHED: "Սարքի նստատեղերի առավելագույն քանակը հասել է", PRODUCT_MISMATCH: "Լիցենզիայի արտադրանքը չի համընկնում" }, licenseStatusValue: { active: "Ակտիվ", deleted: "Ջնջված է", all: "Բոլորը", expired: "Ժամկետանց ժամկետանց", missing: "Անհայտ կորած", inactive: "Ոչ ակտիվ" }, form: { error: { required: "Պահանջվում է", port: "Նավահանգիստը գտնվում է 1-65535-ի միջև", invalid: "Ձևն անվավեր է" }, connection: { label: { name: "Անուն", group: "Group", host: "Հյուրընկալողի անունը", port: "Պորտ", password: "Գաղտնաբառ", username: "Օգտվողի անունը" } }, treeSettings: { maxValueDisplay: "Առավելագույն արժեքը ցուցադրվող տողի երկարությունը", maxValueDisplayInfo: "Եթե դրված է 0, ցույց տվեք ամբողջական արժեքները: Եթե ​​0-ից մեծ է, կրճատեք այս երկարությամբ: Եթե ​​-1՝ տողերի համար, թաքցրեք արժեքը մինչև խմբագրումը; այլ տեսակների համար ցուցադրեք ամբողջական բովանդակությունը:", maxKeys: "Բանալինների առավելագույն քանակը", maxKeysInfo: "Որպեսզի GUI-ը չխափանի, մենք սահմանափակում ենք բանալիների առավելագույն քանակը:", keyCount: () => { return `Բանալիների քանակը: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Օգտագործեք անիմացիա", noAnimation: "Ոչ մի անիմացիա", jsonFormatTwoSpace: "Ձևաչափեք JSON 2 բացատով", jsonFormatFourSpace: "Ձևաչափեք JSON 4 բացատով", formName: "Redis կարգավորումներ", searchModeClient: "Հաճախորդի որոնման ռեժիմ", searchModeServer: "Սերվերի որոնման ռեժիմ", searchModeStartsWith: "Որոնումը սկսվում է ռեժիմից", searchModeIncludes: "Որոնումը ներառում է ռեժիմ" }, field: { treeSeparator: "Ծառերի բաժանարար", treeSeparatorSelector: "Ծառի բաժանարար ընտրիչ", page: "Ծառի էջերի քանակը", keyPageCount: "Հիմնական էջերի քանակը", keysSort: "Տեսակավորել ստեղները", searchMode: "Որոնման ռեժիմ", searchModeStartsWith: "Որոնումը սկսվում է / ներառում է" }, error: { keyPageCount: "Հիմնական էջերի քանակը պետք է լինի ամբողջ թիվ 5-ից 100-ի միջև", page: "Էջերի քանակը պետք է լինի ամբողջ թիվ 10-ից 5000-ի միջև", maxValueDisplay: "Ցուցադրման առավելագույն արժեքը պետք է լինի ամբողջ թիվ -1-ից մինչև 32768", maxKeys: "Բանալների քանակի առավելագույն արժեքը պետք է լինի ամբողջ թիվ 100-ից 100000-ի միջև" } }, key: { label: { formName: { add: "Ավելացնել նոր Redis բանալի", edit: "Խմբագրել Redis ստեղնը", append: "Ավելացնել առկա Redis բանալիին" } }, field: { streamTimestamp: "Ժամացույց", key: "Բանալին", type: "Տեսակ", index: "Ցուցանիշ", hashKey: "Հեշ բանալի", score: "Միավոր", value: "Արժեք" }, error: { streamTimestamp: "Պահանջվում է ժամանակի դրոշմ՝ Redis ձևաչա��ով կամ որպես *", key: "Հիմնական բանը, առնվազն, մեկ կերպար է", hashKey: "Հեշ աղյուսակի ստեղնը առնվազն մեկ նիշ է", score: "Տեսակավորված հավաքածուի միավորը պարտադիր է", value: "Արժեքը պարտադիր է" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Որdelays", index: "Ինdelays", query: "Հdelays", results: "Ardelays", noIndex: "Indelays", createIndex: "Indelays", dropIndex: "Indelays", indexInfo: "Indelays", indexName: "Indelays", prefix: "Indelays", fieldName: "Indelays", }, monitor: { title: "Մոնdelays", memory: "Հdelays", opsPerSec: "Ops/վ", clients: "Հdelays", blocked: "Ardelays", hitsMisses: "Hdelays", networkIo: "Edelays I/O", slowLog: "Ddelays", totalCommands: "Edelays", expired: "Ldelays", evicted: "Hdelays", clientList: "Հdelays", topKeys: "Մdelays", killClient: "Sdelays", clientKilled: "Sdelays", confirmKillClient: "Vստah eq klientin?", noKeys: "Bndelays", noClients: "Kdelays", }, overview: { noConnected: "Redis-ի հետ կապ չկա:", overviewClients: "Թվարկե՛ք կապակցվածները՝ ըստ հաճախորդների թվի", connectedCount: opt => { if (opt.length === 1) { return "1 հաճախորդ"; } return `${opt.length} հաճախորդներ`; } }, key: { label: { key: "Բանալին", encoding: "Կոդավորում", length: "Չափը", ttl: "TTL", ttlTitle: "Ապրելու ժամանակ", type: "Տեսակ", ttlNotExpire: "չի սպառվում", lengthString: "բայթ", lengthItem: "իրեր", actions: "Գործողություններ" }, list: { table: { index: "Ցուցանիշ", value: "Արժեք" } }, hash: { table: { hashkey: "Հաշկի", value: "Արժեք" } }, set: { table: { value: "Անդամ" } }, zset: { table: { value: "Անդամ", score: "Միավոր" } }, stream: { table: { timestamp: "Ժամացույցի ID", field: "Դաշտ", value: "Արժեք" } } }, treeControls: { settings: "Ծառի կարգավորումները", expandAll: "Ընդլայնել բոլորը", collapseAll: "Փլուզել բոլորը", search: { search: "Որոնել ստեղների մեջ", clear: "Մաքրել ընթացիկ որոնումը դատարկ տեղադրելու համար", placeholderClient: "Որոնել հաճախորդի կողմը", placeholderServer: "Որոնել սերվերի կողմը", info: "Հաճախորդի կողմից որոնումը նշանակում է, որ այն համապատասխանում է որոնման մուտքագրման տեքստին: Սերվերի կողմից որոնումը նշանակում է, որ դա նման է ստեղների օրինաչափությունների որոնմանը որպես *{search-text}*: Մեծ որոնման խմբերի համար ավելի լավ է օգտագործել սերվերի կողմից որոնումը: Ավելի փոքր որոնման խմբերի համար ավելի լավ է օգտագործել հաճախորդի կողմից որոնման ռեժիմը:" + ` Եթե բանալիների հաշվարկն ավարտված է ${p3xr.settings.maxLightKeysCount}, կարող եք որոնել միայն սերվերի կողմից:`, largeSetInfo: "Մեծ հավաքածուում հաճախորդի կողմից որոնումն անջատված է: այնպես որ այս պահին հնարավոր է միայն սերվերի կողմից որոնում:", infoDetails: "Պարզելու համար, թե ինչպես է աշխատում որոնումը, խնդրում ենք ստուգել կարգավորումները" }, pager: { next: "Հաջորդը", prev: "Նախորդ", first: "Առաջին", last: "Վերջին" } } }, time: { loading: "Bdelays...", years: "տարիներ", months: "ամիսներ", days: "օրեր", year: "տարին", month: "ամիս", day: "օր" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/id/000077500000000000000000000000001517666434100137475ustar00rootroot00000000000000src/strings/id/strings.js000066400000000000000000000666641517666434100160200ustar00rootroot00000000000000const strings = { error: { cleared_license: "Lisensi yang sudah dibersihkan", invalid_license: "Lisensi tidak valid", license_max_devices_reached: "Kursi perangkat maksimum telah tercapai", license_readonly: "Lisensi hanya dapat diubah dari terminal server.", server_error: "Kesalahan server, silakan coba lagi" }, title: { donate: "Donasi", jsonRecursive: "Memperluas semua daun", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Anda dapat memilih koneksi Redis untuk dihubungkan dari menu kiri bawah.", statistics: "Statistik", error: "Kesalahan", connectingRedis: "Menghubungkan ke Redis ...", socketioConnectError: "Kesalahan Socket.IO", db: "DB", server: "pelayan", clients: "Klien", memory: "Memori", persistence: "Kegigihan", stats: "Statistik", replication: "Replikasi", cpu: "CPU", cluster: "Cluster", modules: "Modul", errorstats: "Statistik Kesalahan", commandstats: "Statistik Perintah", latencystats: "Statistik Latensi", keysizes: "Ukuran Kunci", threads: "Thread", }, confirm: { dropIndex: "Yakin ingin menghapus indeks ini?", uploadBuffer: "Apakah Anda yakin akan mengunggah data biner ini?", uploadBufferDone: "Data biner diunggah", uploadBufferDoneAndSave: "Data biner diunggah dan disimpan di server", title: "Konfirmasikan", alert: "Waspada", info: "Informasi", deleteListItem: "Apakah Anda yakin akan menghapus item daftar ini?", deleteHashKey: "Apakah Anda yakin akan menghapus item kunci hash ini?", deleteStreamTimestamp: "Apakah Anda yakin akan menghapus stempel waktu streaming ini?", deleteSetMember: "Apakah Anda yakin akan menghapus anggota kumpulan ini?", deleteZSetMember: "Apakah Anda yakin akan menghapus anggota kumpulan yang diurutkan ini?", deleteConnection: "Konfirmasikan", deleteConnectionText: "Apakah Anda yakin akan menghapus koneksi Redis ini?", deleteNode: "Apakah Anda yakin akan menghapus simpul Redis ini?", deleteAllKeys: opts => { return `Hapus pohon ini dan semua kuncinya (${opts.key})?`; }, socketioConnectError: "Socket.IO tidak dapat terhubung ke server, Anda dapat memuat ulang dan mencoba mengatasi sendiri kesalahan koneksi, klien tidak tahu cara menyelesaikannya sendiri.", socketioAuthRequired: "Diperlukan otorisasi Socket.IO. Harap autentikasi dengan HTTP Basic Auth (nama pengguna/kata sandi) dan muat ulang.", deleteKey: "Apakah Anda yakin akan menghapus kunci ini?", rename: { title: "Apakah Anda yakin akan mengganti nama kunci ini?", textContent: "Tindakan ini mengganti nama kunci secara permanen.", placeholder: "Kunci Redis (wajib)" }, ttl: { title: "Apakah Anda yakin ingin mengubah TTL kunci ini?", textContent: "Mengubah TTL akan memperbarui waktu aktif kunci ini. Biarkan kosong untuk menyimpan kunci ini selamanya.", placeholder: "Redis kunci TTL (integer atau kosong)", placeholderPlaceholder: "Kosong artinya tetap ada selamanya; jika tidak, masukkan bilangan bulat.", convertTextToTime: "Ubah teks menjadi waktu", convertTextToTimePlaceholder: "Misalnya. 1 hari akan menjadi 86400" }, license: { title: "Tetapkan lisensi", textContent: "Jika Anda ingin menggunakan fitur berbayar, silakan hubungi support@corifeus.com untuk meminta lisensi. Harganya adalah Pro 400 HUF/bulan (€1/bulan) atau 4.000 HUF/tahun (€10/tahun), dan Enterprise 1.200 HUF/bulan (€3/bulan) atau 12.000 HUF/tahun (€30/tahun). Tahunan adalah 10x bulanan. Dengan 27% VAT, totalnya adalah Pro 500 HUF/bulan (€1,27/bulan) atau 5.100 HUF/tahun (€12,70/tahun), Enterprise 1,500 HUF/bulan (€3,81/bulan) atau 15.200 HUF/tahun (€38,10/tahun). Validasi lisensi memerlukan akses internet. Lisensi default mencakup 5 kursi. Jika Anda membutuhkan lebih banyak kursi, hubungi kami di support@corifeus.com.", placeholder: "Kunci lisensi" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Salin", downloadBuffer: "Unduh biner", setBuffer: "Unggah biner", exportKeys: "Ekspor kunci", exportAllKeys: (opts) => `Ekspor semua ${opts.count} kunci`, exportSearchResults: (opts) => `Ekspor ${opts.count} hasil`, importKeys: "Impor kunci", saveWithFormatJson: "Simpan dengan format", formatJson: "Format JSON", wrap: "Bungkus", unwrap: "Buka bungkusnya", downloadJson: "Unduh JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Bahasa", ok: "Oke", addKey: "Tambahkan ke kunci ini", addKeyRoot: "Tambahkan kunci root", reloadKey: "Muat ulang kunci", reload: "Muat ulang", close: "Tutup", commands: "Perintah", view: "Lihat", statistics: "Statistik", refresh: "Segarkan", pause: "Jeda", resume: "Lanjutkan", clear: "Jelas", rename: "Ganti nama", main: "Basis data", cancel: "Batalkan", theme: "Tema", github: "GitHub", githubRepo: "Gudang", githubRelease: "Rilis", githubChangelog: "log perubahan", info: "Info", settings: "Pengaturan", connect: "Hubungkan", disconnect: "Putuskan sambungan", overview: "Ikhtisar", console: "Konsol", noConnections: "Tidak ada koneksi, tambahkan koneksi di menu pengaturan.", noConnectionsInSettings: "Tidak ada koneksi, Anda dapat menambahkan KONEKSI BARU di atas.", connectionAdd: "Koneksi baru", addGroup: "Tambah grup", extend: "Perpanjang", collapse: "Runtuh", add: "Tambahkan", edit: "Sunting", save: "Simpan", ttl: "Setel TTL", license: "Tetapkan lisensi", delete: "Hapus", remove: "Hapus", sure: "Tentu", testConnection: "Uji koneksi", getKey: "Memuat kunci Redis dan data terkait ...", jsonViewShow: "Tampilkan JSON", jsonViewEditor: "Sunting JSON", quickConsole: "Konsol Cepat", }, label: { id: { nodeId: "ID simpul", id: "ID Koneksi", info: "Jika Anda tidak ingin mengubah properti: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, silakan masukkan ID koneksi di properti tersebut agar nilai properti tetap utuh. Jika ingin logika yang sama pada kata sandi simpul, maka masukkan ID simpul pada kata sandi simpul." }, secureFeature: "Jika Anda melihat nilai yang dimulai dengan P3X dan terlihat sama, itu adalah fitur aman. Untuk mengubah pengaturan, cukup ganti pengaturan ini dengan yang kosong atau yang lain dan pengaturan itu akan disimpan. Jika Anda tidak mengubah pengaturan, pengaturan akan tetap seperti yang ada di server.", ssh: { on: "SSH aktif", off: "SSH mati", sshHost: "Tuan rumah SSH", sshPort: "Pelabuhan SSH", sshUsername: "Nama pengguna SSH", sshPassword: "Kata sandi SSH", sshPrivateKey: "Kunci pribadi SSH" }, isBuffer: opts => `[object ArrayBuffer] artinya nilainya adalah data biner atau nilainya lebih besar dari ${opts.maxValueAsBuffer}`, streamValue: `Bidang dan nilai aliran bersifat oneliner. Misalnya: bidang1 nilai1 "bidang 2" "nilai 2"`, streamTimestampId: `'*' berarti dibuat secara otomatis atau spesifikasinya sebagai -`, unableToLoadKey: ({ key }) => { return `Tidak dapat memuat kunci ini: ${key}. Kemungkinan, kuncinya telah dihapus. Kesalahan sebenarnya ada di konsol.`; }, bigJson: "Objek JSON ini berukuran lebih dari 10 kb, jadi pastikan Anda mengetahui apa yang Anda lakukan, karena beberapa fungsi dapat memperlambat rendering.", addNode: "Tambahkan simpul", validateJson: "Validasi JSON", reducedFunction: `Fungsionalitas berkurang`, tooManyKeys: opts => { return `Untuk fungsi maksimal penuh, total tombol yang diperbolehkan adalah ${opts.maxLightKeysCount} menghitung. Basis data ini memiliki total lebih dari kunci yang diizinkan ${opts.count}. Penyortiran kunci dan informasi pohon mewah tambahan dinonaktifkan. Pencarian hanya terjadi di server, bukan pencarian klien.`; }, redisCommandNotFound: "Tidak ditemukan kecocokan perintah Redis ...", treeKeyStore: `Penyortiran (perbandingan alami) dijalankan pada klien alias browser, yang berarti memiliki penalti untuk kumpulan besar, seperti lebih dari 10 ribu kunci, mungkin menambah sedikit waktu pada rendering halaman. Tidak ada penyortiran kunci di Redis, hanya seperti ini.`, socketIoTimeout: options => { return `Waktu Socket.IO habis untuk permintaan ini (maks ${options.timeout / 1000} detik) ...`; }, resizerInfo: options => { return `Lebar minimum panel kiri atau kanan adalah ${options.width}piksel`; }, jsonViewNotParsable: "Nilai ini tidak dapat diurai JSON ", ttlTitle: "Atur TTL dalam hitungan detik", passwordSecure: "Kata sandinya mungkin kosong, tetapi tetap menampilkan karakter, ini adalah fitur keamanan.", tlsWithoutCert: "Aktifkan TLS tanpa sertifikat tambahan", tlsRejectUnauthorized: "Tolak sertifikat yang tidak sah", tlsSecure: "Jika Anda melihat konfigurasi TLS yang dimulai dengan P3X atau semua pengaturan TLS terlihat sama, itu adalah fitur aman. Untuk mengubah pengaturan, cukup ganti pengaturan ini dengan yang kosong atau yang lain dan pengaturan itu akan disimpan. Jika Anda tidak mengubah pengaturan TLS, pengaturan akan tetap seperti yang ada di server.", treeSeparatorEmpty: "Jika pemisah pohon kosong, pohon tidak akan memiliki simpul bersarang, hanya daftar murni", treeSeparatorEmptyNote: "Tidak ada node bersarang, hanya daftar murni", welcomeConsole: "Selamat datang di Konsol Redis", welcomeConsoleInfo: "Riwayat kursor ATAS atau BAWAH diaktifkan", redisListIndexInfo: "Kosong untuk menambahkan, -1 untuk menambahkan atau menyimpannya ke posisi yang ditunjukkan.", console: "Konsol", connectiondAdd: "Tambahkan koneksi", connectiondEdit: "Sunting koneksi", connectiondView: "Lihat koneksi", connections: "Koneksi", licenseInfo: "Lisensi", licenseEditable: "Lisensi dapat diedit", licenseEditableYes: "Ya", licenseEditableNo: "Tidak", licenseTerminalOnly: "Lisensi hanya dapat dikonfigurasi dari terminal server.", licenseTierPolicyTitle: "Kebijakan tingkat", licenseTierPolicyText: "

Gratis

core Redis UI saja; tidak ada terowongan SSH, tidak ada mode koneksi Readonly, tidak ada Cluster/Sentinel, tidak ada Edit JSON/Unggah biner/Unduh biner, tidak ada ReJSON.
Harga: 0 HUF/bulan (€0/bulan).

Pro

SSH tunneling, mode koneksi Readonly (termasuk --readonly-connections/-r), Edit JSON, Unggah biner, Unduh biner, ReJSON.
Harga dasar: 400 HUF/bulan (€1/bulan) atau 4.000 HUF/tahun (€10/tahun).
Total dengan 27% VAT: 500 HUF/bulan (€1,27/bulan) atau 5.100 HUF/tahun (€12,70/tahun) Cluster dan Sentinel, ditambah Edit JSON, Unggah biner, Unduh biner, ReJSON; --readonly-connections/-r juga berfungsi.
Harga dasar: 1.200 HUF/bulan (€3/bulan) atau 12.000 HUF/tahun (€30/tahun).
Total dengan 27% VAT: 1.500 HUF/bulan (€3,81/bulan) atau 15.200 HUF/tahun (€38,10/tahun).

Aturan tahunan

Harga tahunan adalah 10x bulanan price.

Seats

Lisensi default mencakup 5 kursi. Jika Anda memerlukan lebih banyak kursi, hubungi kami di support@corifeus.com.

Uji coba perusahaan

10 hari gratis bagi siapa pun yang memiliki alamat email asli (email non-tes).

Info penagihan dalam email

Nama, Email penagihan, Kode negara, Kode pos, Kota, Alamat, VAT ID (opsional).

Pembayaran

PayPal pembayaran hanya tersedia di HUF (forint); setelah mengirimkan uang @ https://paypal.me/corifeus saya akan mengirimkan invoice kepada Anda. Semua pembayaran tidak dapat dikembalikan.

VAT

VAT ditambahkan ke harga (27% dalam Hongaria).

Kontak

Jika Anda ingin menyapa atau memiliki pertanyaan, hubungi support@corifeus.com.

Bahasa

Komunikasi email faktur dan lisensi dalam bahasa Inggris. Mata uang faktur adalah HUF.

Note

Validasi lisensi memerlukan akses internet.", licenseState: "Negara", licenseStateActive: "Aktif", licenseStateInactive: "Tidak aktif", licenseStateNoLicense: "Tidak ada lisensi", licenseKeyMasked: "Kunci tersimpan", licenseTier: "Tingkat", licenseValid: "Sah", licenseStatus: "Status lisensi", licenseReason: "Alasan", licenseCheckedAt: "Diperiksa di", licenseStartsAt: "Dimulai pada", licenseExpiresAt: "Berakhir pada", licenseDaysLeft: "Tinggal beberapa hari lagi", licenseMaxDevices: "Perangkat maksimal", licenseActiveDevices: "Perangkat aktif", licenseActiveDevicesInfo: "Jika perangkat tidak digunakan lagi, dudukannya akan dilepas secara otomatis setelah 75 menit.", licenseCustomerEmail: "Email pelanggan", licenseFeatures: "Fitur", licenseFeaturesEmpty: "Tidak ada fitur tambahan", licenseFeatureReadonlyMode: "Mode koneksi hanya baca", licenseFeatureReadonlyConnectionsFlag: "Koneksi hanya baca (--readonly-connections/-r)", licenseFeatureSsh: "Penerowongan SSH", licenseFeatureCluster: "Koneksi Cluster", licenseFeatureSentinel: "Koneksi Sentinel", licenseFeatureReJSON: "ReJSON (tipe data JSON)", keysSort: { on: "Penyortiran kunci aktif", off: "Penyortiran kunci" }, cluster: { on: "Cluster aktif", off: "Cluster mati" }, sentinel: { on: "Sentinel aktif", off: "Sentinel mati", name: "Nama Sentinel" }, readonly: { on: "Hanya baca aktif", off: "Hanya baca mati" }, proSshOnly: "SSH tersedia dalam Pro atau Perusahaan.", proReadonlyOnly: "Mode koneksi hanya baca tersedia di Pro atau Perusahaan.", enterpriseClusterSentinelOnly: "Cluster dan Sentinel hanya tersedia di Perusahaan.", theme: { light: "Ringan", dark: "Perusahaan gelap", darkNeu: "Gelap", darkoBluo: "Gelap biru", enterprise: "Perusahaan", redis: "Redis", matrix: "Matriks" }, connected: opts => { return `Terhubung: ${opts.name}`; }, tree: "Pohon", askAuth: "Minta otorisasi", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Modul", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Putuskan sambungan", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Perintah Redis", ungrouped: "Tanpa grup", grouped: "Grouped", connectFirst: "Hubungkan ke server Redis terlebih dahulu", searchLanguage: "Cari bahasa...", exportProgress: "Mengekspor kunci...", importProgress: "Mengimpor kunci...", importPreview: "Pratinjau", importOverwrite: "Timpa", importSkip: "Lewati", importConflict: "Jika kunci sudah ada:", noKeysToExport: "Tidak ada kunci untuk diekspor", time: "Waktu", loading: "Memuat...", autoRefresh: "Otomatis", exportSearchHint: "Mengekspor hanya kunci yang cocok dengan pencarian saat ini", importSearchHint: "Impor berlaku untuk seluruh database, bukan hanya hasil pencarian", importNoKeys: "Tidak ditemukan kunci dalam file", }, status: { dataCopied: "Datanya ada di clipboard", licenseSaved: "Lisensi disimpan", exportDone: "Ekspor selesai", indexCreated: "Indeks dibuat", indexDropped: "Indeks dihapus", importDone: (opts) => `Impor selesai: ${opts.created} dibuat, ${opts.skipped} dilewati, ${opts.errors} kesalahan`, nodeRemoved: "Node dihapus", keyIsNotExisting: "Kunci ini mungkin telah dihapus atau kedaluwarsa.", keyCount: opts => { if (opts.keyCount === 0) { return "Tidak ada kunci"; } else if (opts.keyCount === 1) { return "1 kunci"; } else { return `${opts.keyCount} kunci`; } }, treeExpandAll: "Perluas semua daun pohon. Operasi ini bisa mahal dan mungkin memerlukan waktu ...", noRedisKeys: "Tidak ada kunci dalam database ini.", redisConnected: "Redis terhubung berhasil", reloadingDataInfo: "Memuat ulang info data Redis", added: "Ditambahkan", saved: "Diperbarui", cancelled: "Dibatalkan", deleted: "Dihapus", savedRedis: "Data Redis disimpan", redisDisconnected: opts => { return `Koneksi saat ini mengalami kesalahan: ${opts.error.message}`; }, dbChanged: opts => { return `Indeks db disetel ke ${opts.db}. `; }, treeDeleted: opts => { return `Kunci pohon telah dihapus (${opts.key}).`; }, deletedKey: opts => { return `Kuncinya telah dihapus (${opts.key}).`; }, renamedKey: "Kunci ini telah diganti namanya", ttlChanged: "TTL kunci ini telah diubah", notInteger: "Masukan ini bukan bilangan bulat", persisted: "Kunci ini disimpan selamanya", set: "Kuncinya disetel/ditambahkan" }, code: { "delete-connection": "Sambungan ini telah dihapus, jadi sambungan Anda terputus ke instans Redis ini.", "save-connection": "Koneksi ini telah diubah, jadi Anda terputus ke instance Redis ini. Anda dapat menyambung kembali.", "readonly-connections": "Koneksi tambah/simpan/hapus hanya dapat dibaca!", "readonly-connection-mode": "Koneksi ini adalah mode hanya baca!", "list-out-of-bounds": "Indeks daftar ini di luar batas", "donation-ware-feature": "Fitur ini hadir pada versi donasi.", "feature-pro-readonly-required": "Mode koneksi hanya baca memerlukan lisensi Pro atau Perusahaan.", "feature-pro-ssh-required": "Penerowongan SSH memerlukan lisensi Pro atau Perusahaan.", "feature-enterprise-cluster-sentinel-required": "Cluster dan Sentinel memerlukan lisensi Perusahaan.", "feature-pro-json-binary-required": "Edit JSON, Unggah biner dan Unduh biner memerlukan lisensi Pro atau Perusahaan.", "feature-pro-rejson-required": "ReJSON (tipe data JSON) memerlukan lisensi Pro atau Perusahaan.", "invalid-json-value": "Nilai JSON tidak valid.", "http_auth_required": "Diperlukan otorisasi: harap autentikasi dengan HTTP Basic Auth dan muat ulang.", "auto-connection-failed": "Kemungkinan, koneksi terputus dan koneksi otomatis gagal, karena hal ini.", invalid_console_command: "Perintah ini tidak berfungsi melalui GUI." }, licenseReason: { LICENSE_VALID: "Lisensi valid", LICENSE_INVALID: "Lisensi tidak valid", LICENSE_MISSING: "Tidak ada kunci lisensi yang disetel", LICENSE_DISABLED: "Lisensi dinonaktifkan di konfigurasi server", LICENSE_NOT_FOUND: "Lisensi tidak ditemukan", LICENSE_EXPIRED: "Lisensi sudah habis masa berlakunya", LICENSE_CLEARED: "Kunci lisensi telah dihapus", LICENSE_MAX_DEVICES_REACHED: "Kursi perangkat maksimum telah tercapai", PRODUCT_MISMATCH: "Produk lisensi tidak cocok" }, licenseStatusValue: { active: "Aktif", deleted: "Dihapus", all: "Semua", expired: "Kedaluwarsa", missing: "Hilang", inactive: "Tidak aktif" }, form: { error: { required: "Diperlukan", port: "Portnya antara 1-65535", invalid: "Formulirnya tidak valid" }, connection: { label: { name: "Nama", group: "Group", host: "Nama host", port: "Pelabuhan", password: "Kata sandi", username: "Nama pengguna" } }, treeSettings: { maxValueDisplay: "Panjang string tampilan nilai maksimal", maxValueDisplayInfo: "Jika disetel ke 0, tampilkan nilai penuh. Jika lebih besar dari 0, potong sepanjang ini. Jika -1: untuk string, sembunyikan nilainya hingga diedit; untuk tipe lainnya, tampilkan konten lengkap.", maxKeys: "Jumlah kunci maksimal", maxKeysInfo: "Agar GUI tidak crash, kami membatasi jumlah kunci maksimal.", keyCount: () => { return `Jumlah kunci: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Gunakan animasi", noAnimation: "Tidak ada animasi", jsonFormatTwoSpace: "Format JSON dengan 2 spasi", jsonFormatFourSpace: "Format JSON dengan 4 spasi", formName: "Pengaturan Redis", searchModeClient: "Mode pencarian klien", searchModeServer: "Modus pencarian server", searchModeStartsWith: "Pencarian dengan dimulai dengan mode", searchModeIncludes: "Pencarian mencakup mode" }, field: { treeSeparator: "Pemisah pohon", treeSeparatorSelector: "Pemilih pemisah pohon", page: "Jumlah halaman pohon", keyPageCount: "Jumlah halaman kunci", keysSort: "Urutkan kuncinya", searchMode: "Modus pencarian", searchModeStartsWith: "Pencarian dimulai dengan / termasuk" }, error: { keyPageCount: "Jumlah halaman kunci harus berupa bilangan bulat antara 5 - 100", page: "Jumlah halaman harus berupa bilangan bulat antara 10 - 5000", maxValueDisplay: "Nilai tampilan maksimum harus berupa bilangan bulat antara -1 dan 32768", maxKeys: "Nilai jumlah kunci maksimum harus berupa bilangan bulat antara 100 dan 100.000" } }, key: { label: { formName: { add: "Tambahkan kunci Redis baru", edit: "Edit kunci Redis", append: "Tambahkan ke kunci Redis yang ada" } }, field: { streamTimestamp: "Stempel waktu", key: "Kunci", type: "Ketik", index: "Indeks", hashKey: "Kunci hash", score: "Skor", value: "Nilai" }, error: { streamTimestamp: "Stempel waktu diperlukan, baik format Redis atau sebagai *", key: "Kuncinya adalah, setidaknya, satu karakter", hashKey: "Kunci tabel hash setidaknya terdiri dari satu karakter", score: "Skor set yang diurutkan diperlukan", value: "Nilainya diperlukan" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Cari", index: "Indeks", query: "Kueri", results: "Hasil", noIndex: "Tidak ada indeks", createIndex: "Buat indeks", dropIndex: "Hapus indeks", indexInfo: "Info indeks", indexName: "Nama indeks", prefix: "Prefiks kunci (opsional)", fieldName: "Nama field", }, monitor: { title: "Pemantauan", memory: "Memori", opsPerSec: "Ops/detik", clients: "Klien", blocked: "Diblokir", hitsMisses: "Tingkat hit", networkIo: "Jaringan I/O", slowLog: "Log lambat", totalCommands: "Total", expired: "Kedaluwarsa", evicted: "Dikeluarkan", clientList: "Daftar klien", topKeys: "Kunci terbesar berdasarkan memori", killClient: "Matikan klien", clientKilled: "Klien dimatikan", confirmKillClient: "Yakin ingin menghentikan klien ini?", noKeys: "Tidak ada kunci", noClients: "Tidak ada klien", }, overview: { noConnected: "Tidak ada koneksi ke Redis.", overviewClients: "Buat daftar yang terhubung berdasarkan jumlah klien", connectedCount: opt => { if (opt.length === 1) { return "1 klien"; } return `${opt.length} klien`; } }, key: { label: { key: "Kunci", encoding: "Pengkodean", length: "Ukuran", ttl: "TTL", ttlTitle: "Saatnya Hidup", type: "Ketik", ttlNotExpire: "tidak kedaluwarsa", lengthString: "byte", lengthItem: "item", actions: "Tindakan" }, list: { table: { index: "Indeks", value: "Nilai" } }, hash: { table: { hashkey: "kunci hash", value: "Nilai" } }, set: { table: { value: "Anggota" } }, zset: { table: { value: "Anggota", score: "Skor" } }, stream: { table: { timestamp: "ID stempel waktu", field: "Bidang", value: "Nilai" } } }, treeControls: { settings: "Pengaturan pohon", expandAll: "Perluas semuanya", collapseAll: "Ciutkan semuanya", search: { search: "Cari di kunci", clear: "Hapus pencarian saat ini untuk mengosongkannya", placeholderClient: "Cari sisi klien", placeholderServer: "Sisi server pencarian", info: "Pencarian sisi klien berarti cocok dengan teks dalam input pencarian. Maksudnya pencarian sisi server, seperti pencarian dalam pola kunci sebagai *{teks-pencarian}*. Untuk kumpulan pencarian yang besar, lebih baik menggunakan pencarian sisi server. Untuk kumpulan pencarian yang lebih kecil, lebih baik menggunakan mode pencarian sisi klien." + ` Jika penghitungan kunci sudah selesai ${p3xr.settings.maxLightKeysCount}, Anda hanya dapat mencari di sisi server.`, largeSetInfo: "Dalam kumpulan besar, pencarian sisi klien dinonaktifkan. jadi saat ini hanya pencarian sisi server yang dimungkinkan.", infoDetails: "Untuk mengetahui cara kerja pencarian, silakan periksa pengaturannya" }, pager: { next: "Selanjutnya", prev: "Sebelumnya", first: "Pertama", last: "Terakhir" } } }, time: { loading: "Memuat...", years: "tahun", months: "bulan", days: "hari", year: "tahun", month: "bulan", day: "hari" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/it/000077500000000000000000000000001517666434100137675ustar00rootroot00000000000000src/strings/it/strings.js000066400000000000000000000701631517666434100160250ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licenza cancellata", invalid_license: "Licenza non valida", license_max_devices_reached: "Numero massimo di dispositivi raggiunto", license_readonly: "La licenza può essere modificata solo dal terminale del server.", server_error: "Errore del server, riprova" }, title: { donate: "Dona", jsonRecursive: "Espansione di tutte le foglie", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Puoi scegliere una connessione Redis dal menu in basso a sinistra.", statistics: "Statistiche", error: "Errore", connectingRedis: "Connessione a Redis ...", socketioConnectError: "Errore Socket.IO", db: "DB", server: "Server", clients: "Client", memory: "Memoria", persistence: "Persistenza", stats: "Statistiche", replication: "Replica", cpu: "CPU", cluster: "Cluster", modules: "Moduli", errorstats: "Statistiche errori", commandstats: "Statistiche comandi", latencystats: "Statistiche latenza", keysizes: "Dimensioni chiavi", threads: "Thread", }, confirm: { dropIndex: "Sei sicuro di voler eliminare questo indice?", uploadBuffer: "Sei sicuro di voler caricare questi dati binari?", uploadBufferDone: "I dati binari sono stati caricati", uploadBufferDoneAndSave: "I dati binari sono stati caricati e salvati sul server", title: "Conferma", alert: "Avviso", info: "Info", deleteListItem: "Sei sicuro di voler eliminare questo elemento della lista?", deleteHashKey: "Sei sicuro di voler eliminare questo elemento della chiave hash?", deleteStreamTimestamp: "Sei sicuro di voler eliminare questo timestamp dello stream?", deleteSetMember: "Sei sicuro di voler eliminare questo membro del set?", deleteZSetMember: "Sei sicuro di voler eliminare questo membro del set ordinato?", deleteConnection: "Conferma", deleteConnectionText: "Sei sicuro di voler eliminare questa connessione Redis?", deleteNode: "Sei sicuro di voler eliminare questo nodo Redis?", deleteAllKeys: opts => { return `Eliminare questo albero e tutte le sue chiavi (${opts.key})?`; }, socketioConnectError: "Socket.IO non riesce a connettersi al server. Puoi ricaricare e provare a risolvere l'errore di connessione, il client non sa come risolverlo da solo.", socketioAuthRequired: "Autorizzazione Socket.IO richiesta. Autenticati con HTTP Basic Auth (nome utente/password) e ricarica.", deleteKey: "Sei sicuro di voler eliminare questa chiave?", rename: { title: "Sei sicuro di voler rinominare questa chiave?", textContent: "Questa azione rinomina la chiave in modo permanente.", placeholder: "La chiave Redis (obbligatoria)" }, ttl: { title: "Sei sicuro di voler modificare il TTL di questa chiave?", textContent: "La modifica del TTL aggiorna il tempo di vita di questa chiave. Lascia vuoto per mantenere questa chiave per sempre.", placeholder: "Il TTL della chiave Redis (intero o vuoto)", placeholderPlaceholder: "Vuoto significa che persiste per sempre; altrimenti inserisci un intero.", convertTextToTime: "Converti testo in tempo", convertTextToTimePlaceholder: "Es. 1d sarà 86400" }, license: { title: "Imposta licenza", textContent: "Se vuoi utilizzare le funzionalità a pagamento, contatta support@corifeus.com per richiedere una licenza. I prezzi sono Pro 400 HUF/mese (€1/mese) o 4,000 HUF/anno (€10/anno), ed Enterprise 1,200 HUF/mese (€3/mese) o 12,000 HUF/anno (€30/anno). L'annuale è 10 volte il mensile. Con il 27% di IVA, i totali sono Pro 500 HUF/mese (€1.27/mese) o 5,100 HUF/anno (€12.70/anno), Enterprise 1,500 HUF/mese (€3.81/mese) o 15,200 HUF/anno (€38.10/anno). La validazione della licenza richiede accesso a Internet. La licenza predefinita include 5 postazioni. Se hai bisogno di più postazioni, contattaci a support@corifeus.com.", placeholder: "Chiave di licenza" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copia", downloadBuffer: "Scarica binario", setBuffer: "Carica binario", exportKeys: "Esporta chiavi", exportAllKeys: (opts) => `Esporta tutte le ${opts.count} chiavi`, exportSearchResults: (opts) => `Esporta ${opts.count} risultati`, importKeys: "Importa chiavi", saveWithFormatJson: "Salva con formato", formatJson: "Formatta JSON", wrap: "A capo", unwrap: "Non a capo", downloadJson: "Scarica JSON", pubsubMonitor: "PubSub Monitor", language: "Lingua / Language", ok: "OK", addKey: "Aggiungi a questa chiave", addKeyRoot: "Aggiungi una chiave radice", reloadKey: "Ricarica chiave", reload: "Ricarica", close: "Chiudi", commands: "Comandi", view: "Visualizza", statistics: "Statistiche", refresh: "Aggiorna", pause: "Pausa", resume: "Riprendi", clear: "Cancella", rename: "Rinomina", main: "Database", cancel: "Annulla", theme: "Tema", github: "GitHub", githubRepo: "Repository", githubRelease: "Release", githubChangelog: "Changelog", info: "Info", settings: "Impostazioni", connect: "Connetti", disconnect: "Disconnetti", overview: "Panoramica", console: "Console", noConnections: "Nessuna connessione, aggiungi una connessione nel menu impostazioni.", noConnectionsInSettings: "Nessuna connessione, puoi aggiungere una NUOVA CONNESSIONE sopra.", connectionAdd: "Nuova connessione", addGroup: "Aggiungi gruppo", extend: "Espandi", collapse: "Comprimi", add: "Aggiungi", edit: "Modifica", save: "Salva", ttl: "Imposta TTL", license: "Imposta licenza", delete: "Elimina", remove: "Rimuovi", sure: "Sicuro", testConnection: "Testa connessione", getKey: "Caricamento chiave Redis e dati associati ...", jsonViewShow: "Visualizza JSON", jsonViewEditor: "Modifica JSON", quickConsole: "Console Rapida" }, label: { id: { nodeId: 'ID Nodo', id: "ID Connessione", info: "Se non vuoi modificare le proprietà di: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, inserisci l'ID della connessione in quelle proprietà per mantenere i valori intatti. Se vuoi la stessa logica per la password del nodo, inserisci l'ID del nodo nella password del nodo." }, secureFeature: 'Se vedi un valore che inizia con P3X e sembra uguale, è una funzionalità di sicurezza. Per modificare le impostazioni, sostituisci queste impostazioni con vuoto o qualcos\'altro e verranno salvate. Se non modifichi le impostazioni, rimarranno come sono sul server.', ssh: { on: 'SSH attivo', off: 'SSH disattivo', sshHost: 'Host SSH', sshPort: 'Porta SSH', sshUsername: 'Nome utente SSH', sshPassword: 'Password SSH', sshPrivateKey: 'Chiave privata SSH' }, isBuffer: opts => `[object ArrayBuffer] significa che il valore è un dato binario o il valore è maggiore di ${opts.maxValueAsBuffer}`, streamValue: `Il campo e il valore dello stream sono su una riga. Es.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' significa generato automaticamente o la specifica come -`, unableToLoadKey: ({ key }) => { return `Impossibile caricare questa chiave: ${key}. Possibile che la chiave sia stata eliminata. L'errore esatto è nella console.`; }, bigJson: "Questo oggetto JSON è superiore a 10 kb, assicurati di sapere cosa stai facendo, perché alcune funzioni possono essere lente nel rendering.", addNode: "Aggiungi nodo", validateJson: "Valida JSON", reducedFunction: `Funzionalità ridotta`, tooManyKeys: opts => { return `Per le funzioni massime complete, il totale di chiavi consentite è ${opts.maxLightKeysCount}. Questo database supera il totale di chiavi consentite: ${opts.count}. L'ordinamento delle chiavi e le informazioni aggiuntive dell'albero sono disabilitate. La ricerca avviene solo sul server invece che sul client.`; }, redisCommandNotFound: "Nessun comando Redis corrispondente trovato ...", treeKeyStore: `L'ordinamento (confronto naturale) viene eseguito sul client, cioè il browser, il che significa che per grandi set, come oltre 10k chiavi, potrebbe aggiungere un po' di tempo al rendering della pagina. Non esiste un ordinamento delle chiavi in Redis, solo così.`, socketIoTimeout: options => { return `Socket.IO ha raggiunto il timeout per questa richiesta (max ${options.timeout / 1000} secondi) ...`; }, resizerInfo: options => { return `La larghezza minima del pannello sinistro o destro è ${options.width}px`; }, jsonViewNotParsable: "Questo valore non è analizzabile come JSON ", ttlTitle: "Imposta il TTL in secondi", passwordSecure: "La password potrebbe essere vuota, ma mostrerà comunque dei caratteri, questa è una funzionalità di sicurezza.", tlsWithoutCert: "Abilita TLS senza certificato aggiuntivo", tlsRejectUnauthorized: "Rifiuta certificato non autorizzato", tlsSecure: "Se vedi una configurazione TLS che inizia con P3X o tutte le impostazioni TLS sembrano uguali, è una funzionalità di sicurezza. Per modificare le impostazioni, sostituiscile con vuoto o qualcos'altro e verranno salvate. Se non modifichi le impostazioni TLS, rimarranno come sono sul server.", treeSeparatorEmpty: "Se il separatore dell'albero è vuoto, l'albero non avrà nodi annidati, solo una lista semplice", treeSeparatorEmptyNote: "Nessun nodo annidato, solo una lista semplice", welcomeConsole: "Benvenuto nella Console Redis", welcomeConsoleInfo: "La cronologia con cursore SU o GIÙ è abilitata", redisListIndexInfo: "Vuoto per aggiungere in coda, -1 per aggiungere in testa o salva nella posizione mostrata.", console: "Console", connectiondAdd: "Aggiungi connessione", connectiondEdit: "Modifica connessione", connectiondView: "Visualizza connessione", connections: "Connessioni", licenseInfo: "Licenza", licenseEditable: "Licenza modificabile", licenseEditableYes: "Sì", licenseEditableNo: "No", licenseTerminalOnly: "La licenza può essere configurata solo dal terminale del server.", licenseTierPolicyTitle: "Politica dei livelli", licenseTierPolicyText: "

Gratuito

Solo Redis UI di base; nessun tunnel SSH, nessuna modalità connessione di sola lettura, nessun Cluster/Sentinel, nessuna modifica JSON/Caricamento binario/Download binario, nessun ReJSON.
Prezzo: 0 HUF/mese (€0/mese).

Pro

Tunnel SSH, Modalità connessione di sola lettura (incluso --readonly-connections/-r), Modifica JSON, Caricamento binario, Download binario, ReJSON.
Prezzo base: 400 HUF/mese (€1/mese) o 4,000 HUF/anno (€10/anno).
Totale con 27% IVA: 500 HUF/mese (€1.27/mese) o 5,100 HUF/anno (€12.70/anno).

Enterprise

Tunnel SSH, Cluster e Sentinel, più Modifica JSON, Caricamento binario, Download binario, ReJSON; --readonly-connections/-r funziona anche.
Prezzo base: 1,200 HUF/mese (€3/mese) o 12,000 HUF/anno (€30/anno).
Totale con 27% IVA: 1,500 HUF/mese (€3.81/mese) o 15,200 HUF/anno (€38.10/anno).

Regola annuale

Il prezzo annuale è 10 volte il prezzo mensile.

Postazioni

La licenza predefinita include 5 postazioni. Se hai bisogno di più postazioni, contattaci a support@corifeus.com.

Prova Enterprise

10 giorni gratuiti per chiunque con un indirizzo email reale esistente (non email di test).

Dati di fatturazione via e-mail

Nome, E-mail di fatturazione, Codice paese, Codice postale, Città, Indirizzo, Partita IVA (opzionale).

Pagamento

Il pagamento PayPal è disponibile solo in HUF (fiorino); dopo aver inviato il denaro a https://paypal.me/corifeus ti invierò una fattura. Tutti i pagamenti non sono rimborsabili.

IVA

L'IVA viene aggiunta al prezzo (27% in Ungheria).

Contatto

Se vuoi salutare o hai una domanda, contatta support@corifeus.com.

Lingua

La fattura e la comunicazione e-mail della licenza sono in inglese. La valuta della fattura è HUF.

Nota

La validazione della licenza richiede accesso a Internet.", licenseState: "Stato", licenseStateActive: "Attivo", licenseStateInactive: "Inattivo", licenseStateNoLicense: "Nessuna licenza", licenseKeyMasked: "Chiave salvata", licenseTier: "Livello", licenseValid: "Valida", licenseStatus: "Stato della licenza", licenseReason: "Motivo", licenseCheckedAt: "Verificata il", licenseStartsAt: "Inizia il", licenseExpiresAt: "Scade il", licenseDaysLeft: "Giorni rimanenti", licenseMaxDevices: "Dispositivi massimi", licenseActiveDevices: "Dispositivi attivi", licenseActiveDevicesInfo: "Se un dispositivo non è più in uso, la sua postazione viene rilasciata automaticamente dopo 75 minuti.", licenseCustomerEmail: "Email del cliente", licenseFeatures: "Funzionalità", licenseFeaturesEmpty: "Nessuna funzionalità extra", licenseFeatureReadonlyMode: "Modalità connessione di sola lettura", licenseFeatureReadonlyConnectionsFlag: "Connessioni di sola lettura (--readonly-connections/-r)", licenseFeatureSsh: "Tunnel SSH", licenseFeatureCluster: "Connessioni Cluster", licenseFeatureSentinel: "Connessioni Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Ordinamento chiavi attivo", off: "Ordinamento chiavi disattivo" }, cluster: { on: "Cluster attivo", off: "Cluster disattivo" }, sentinel: { on: "Sentinel attivo", off: "Sentinel disattivo", name: "Nome Sentinel" }, readonly: { on: "Sola lettura attiva", off: "Sola lettura disattiva" }, proSshOnly: "SSH è disponibile in Pro o Enterprise.", proReadonlyOnly: "La modalità connessione di sola lettura è disponibile in Pro o Enterprise.", enterpriseClusterSentinelOnly: "Cluster e Sentinel sono disponibili solo in Enterprise.", theme: { light: "Chiaro", dark: "Scuro enterprise", darkNeu: "Scuro", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Connesso: ${opts.name}`; }, tree: "Albero", askAuth: "Richiedi autorizzazione", keyboardShortcuts: "Scorciatoie da tastiera", about: "Informazioni", supportedLanguages: "Lingue supportate", version: "Versione", redisVersion: "Versione di Redis", modules: "Moduli", shortcutRefresh: "Aggiorna", shortcutSearch: "Metti a fuoco la ricerca", shortcutNewKey: "Nuova chiave", shortcutDisconnect: "Disconnetti", themeAuto: "Automatico (sistema)", shortcutCommandPalette: "Tavolozza comandi", commandPalette: "Tavolozza comandi", noResults: "Nessun risultato", redisCommandsReference: "Comandi Redis", ungrouped: "Senza gruppo", grouped: "Raggruppati", connectFirst: "Connettiti prima a un server Redis", searchLanguage: "Cerca lingua...", exportProgress: "Esportazione chiavi...", importProgress: "Importazione chiavi...", importPreview: "Anteprima", importOverwrite: "Sovrascrivi", importSkip: "Salta", importConflict: "Se la chiave esiste già:", noKeysToExport: "Nessuna chiave da esportare", time: "Tempo", loading: "Caricamento...", autoRefresh: "Auto", exportSearchHint: "Esportazione solo delle chiavi corrispondenti alla ricerca corrente", importSearchHint: "L'importazione si applica all'intero database, non solo ai risultati della ricerca", importNoKeys: "Nessuna chiave trovata nel file", }, status: { dataCopied: "I dati sono negli appunti", licenseSaved: "Licenza salvata", exportDone: "Esportazione completata", indexCreated: "Indice creato", indexDropped: "Indice eliminato", importDone: (opts) => `Importazione completata: ${opts.created} creati, ${opts.skipped} saltati, ${opts.errors} errori`, nodeRemoved: "Nodo rimosso", keyIsNotExisting: "Questa chiave potrebbe essere stata eliminata o scaduta.", keyCount: opts => { if (opts.keyCount === 0) { return "Nessuna chiave"; } else if (opts.keyCount === 1) { return "1 chiave"; } else { return `${opts.keyCount} chiavi`; } }, treeExpandAll: "Espandi tutte le foglie dell'albero. Questa operazione può essere costosa e richiedere tempo ...", noRedisKeys: "Non ci sono chiavi in questo database.", redisConnected: "Redis connesso con successo", reloadingDataInfo: "Ricaricamento informazioni dati Redis", added: "Aggiunto", saved: "Aggiornato", cancelled: "Annullato", deleted: "Eliminato", savedRedis: "Dati Redis salvati", redisDisconnected: opts => { return `La connessione corrente ha avuto un errore: ${opts.error.message}`; }, dbChanged: opts => { return `L'indice del database impostato a ${opts.db}. `; }, treeDeleted: opts => { return `La chiave dell'albero è stata eliminata (${opts.key}).`; }, deletedKey: opts => { return `La chiave è stata eliminata (${opts.key}).`; }, renamedKey: "Questa chiave è stata rinominata", ttlChanged: "Il TTL di questa chiave è stato modificato", notInteger: "Questo input non è un intero", persisted: "Questa chiave è persistente per sempre", set: "La chiave è impostata/aggiunta" }, code: { "delete-connection": "Questa connessione è stata eliminata, quindi sei disconnesso da questa istanza Redis.", "save-connection": "Questa connessione è stata modificata, quindi sei disconnesso da questa istanza Redis. Puoi riconnetterti.", "readonly-connections": "L'aggiunta/salvataggio/eliminazione delle connessioni è in sola lettura!", "readonly-connection-mode": "Questa connessione è in modalità sola lettura!", "list-out-of-bounds": "Questo indice della lista è fuori dai limiti", "donation-ware-feature": "Questa funzionalità è presente nella versione donazione.", "feature-pro-readonly-required": "La modalità connessione di sola lettura richiede una licenza Pro o Enterprise.", "feature-pro-ssh-required": "Il tunnel SSH richiede una licenza Pro o Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster e Sentinel richiedono una licenza Enterprise.", "feature-pro-json-binary-required": "Modifica JSON, Caricamento binario e Download binario richiedono una licenza Pro o Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorizzazione richiesta: autenticati con HTTP Basic Auth e ricarica.", "auto-connection-failed": "Possibile che la connessione sia stata rimossa e la connessione automatica sia fallita per questo motivo.", invalid_console_command: "Questo comando non funziona tramite la GUI." }, licenseReason: { LICENSE_VALID: "La licenza è valida", LICENSE_INVALID: "La licenza non è valida", LICENSE_MISSING: "Nessuna chiave di licenza impostata", LICENSE_DISABLED: "La licenza è disabilitata nella configurazione del server", LICENSE_NOT_FOUND: "Licenza non trovata", LICENSE_EXPIRED: "La licenza è scaduta", LICENSE_CLEARED: "La chiave di licenza è stata cancellata", LICENSE_MAX_DEVICES_REACHED: "Numero massimo di dispositivi raggiunto", PRODUCT_MISMATCH: "Il prodotto della licenza non corrisponde" }, licenseStatusValue: { active: "Attivo", deleted: "Eliminato", all: "Tutti", expired: "Scaduto", missing: "Mancante", inactive: "Inattivo" }, form: { error: { required: "Obbligatorio", port: "La porta è tra 1-65535", invalid: "Il modulo non è valido" }, connection: { label: { name: "Nome", group: "Gruppo", host: "Nome host", port: "Porta", password: "Password", username: "Nome utente" } }, treeSettings: { maxValueDisplay: "Lunghezza massima stringa di visualizzazione valore", maxValueDisplayInfo: "Se impostato a 0, mostra i valori completi. Se maggiore di 0, tronca a questa lunghezza. Se -1: per le stringhe, nasconde il valore fino alla modifica; per gli altri tipi, mostra il contenuto completo.", maxKeys: "Numero massimo di chiavi", maxKeysInfo: "Per evitare che la GUI si blocchi, limitiamo il numero massimo di chiavi.", keyCount: () => { return `Numero di chiavi: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Usa animazione", noAnimation: "Nessuna animazione", jsonFormatTwoSpace: "Formatta JSON con 2 spazi", jsonFormatFourSpace: "Formatta JSON con 4 spazi", formName: "Impostazioni Redis", searchModeClient: "Modalità ricerca client", searchModeServer: "Modalità ricerca server", searchModeStartsWith: "Ricerca con modalità inizia con", searchModeIncludes: "Ricerca con modalità contiene" }, field: { treeSeparator: "Separatore albero", treeSeparatorSelector: "Selettore separatore albero", page: "Conteggio paginazione albero", keyPageCount: "Conteggio paginazione chiavi", keysSort: "Ordina le chiavi", searchMode: "Modalità di ricerca", searchModeStartsWith: "Ricerca inizia con / contiene" }, error: { keyPageCount: "Il conteggio paginazione chiavi deve essere un intero tra 5 e 100", page: "Il conteggio paginazione deve essere un intero tra 10 e 5000", maxValueDisplay: "Il valore massimo di visualizzazione deve essere un intero tra -1 e 32768", maxKeys: "Il valore massimo del conteggio chiavi deve essere un intero tra 100 e 100000" } }, key: { label: { formName: { add: "Aggiungi nuova chiave Redis", edit: "Modifica chiave Redis", append: "Aggiungi a chiave Redis esistente" } }, field: { streamTimestamp: "Timestamp", key: "Chiave", type: "Tipo", index: "Indice", hashKey: "Chiave hash", score: "Punteggio", value: "Valore" }, error: { streamTimestamp: "Il timestamp è obbligatorio, in formato Redis o come *", key: "La chiave deve essere almeno un carattere", hashKey: "La chiave della tabella hash deve essere almeno un carattere", score: "Il punteggio del set ordinato è obbligatorio", value: "Il valore è obbligatorio" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Ricerca", index: "Indice", query: "Query", results: "Risultati", noIndex: "Nessun indice trovato", createIndex: "Crea indice", dropIndex: "Elimina indice", indexInfo: "Info indice", indexName: "Nome indice", prefix: "Prefisso chiave (opzionale)", fieldName: "Nome campo", }, monitor: { title: "Monitoraggio", memory: "Memoria", opsPerSec: "Ops/sec", clients: "Client", blocked: "Bloccati", hitsMisses: "Tasso di successo", networkIo: "Rete I/O", slowLog: "Log lento", totalCommands: "Totale", expired: "Scadute", evicted: "Sfrattate", clientList: "Lista client", topKeys: "Chiavi più grandi per memoria", killClient: "Termina client", clientKilled: "Client terminato", confirmKillClient: "Sei sicuro di voler terminare questo client?", noKeys: "Nessuna chiave", noClients: "Nessun client", }, overview: { noConnected: "Non c'è nessuna connessione a Redis.", overviewClients: "Elenca i connessi per numero di client", connectedCount: opt => { if (opt.length === 1) { return "1 client"; } return `${opt.length} client`; } }, key: { label: { key: "Chiave", encoding: "Codifica", length: "Dimensione", ttl: "TTL", ttlTitle: "Tempo di vita", type: "Tipo", ttlNotExpire: "non scade", lengthString: "byte", lengthItem: "elementi", actions: "Azioni" }, list: { table: { index: "Indice", value: "Valore" } }, hash: { table: { hashkey: "Chiave hash", value: "Valore" } }, set: { table: { value: "Membro" } }, zset: { table: { value: "Membro", score: "Punteggio" } }, stream: { table: { timestamp: "ID Timestamp", field: "Campo", value: "Valore" } } }, treeControls: { settings: "Impostazioni albero", expandAll: "Espandi tutto", collapseAll: "Comprimi tutto", search: { search: "Cerca nelle chiavi", clear: "Cancella la ricerca corrente", placeholderClient: "Ricerca lato client", placeholderServer: "Ricerca lato server", info: "La ricerca lato client significa che corrisponde al testo nell'input di ricerca. La ricerca lato server significa che cerca nei pattern delle chiavi come *{testo-di-ricerca}*. Per grandi set di ricerca, è meglio usare la ricerca lato server. Per set più piccoli, è meglio usare la ricerca lato client." + ` Se il conteggio delle chiavi supera ${p3xr.settings.maxLightKeysCount}, puoi cercare solo lato server.`, largeSetInfo: "In un set grande, la ricerca lato client è disabilitata, quindi al momento è possibile solo la ricerca lato server.", infoDetails: "Per scoprire come funziona la ricerca, consulta le impostazioni" }, pager: { next: "Successivo", prev: "Precedente", first: "Primo", last: "Ultimo" } } }, time: { loading: "Caricamento...", years: "anni", months: "mesi", days: "giorni", year: "anno", month: "mese", day: "giorno" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ja/000077500000000000000000000000001517666434100137455ustar00rootroot00000000000000src/strings/ja/strings.js000066400000000000000000000761541517666434100160110ustar00rootroot00000000000000const strings = { error: { cleared_license: "ライセンスがクリアされました", invalid_license: "無効なライセンス", license_max_devices_reached: "最大デバイス数に達しました", license_readonly: "ライセンスはサーバーターミナルからのみ変更できます。", server_error: "サーバーエラー、もう一度お試しください" }, title: { donate: "寄付", jsonRecursive: "すべてのリーフを展開中", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "左下のメニューからRedis接続を選択してください。", statistics: "統計", error: "エラー", connectingRedis: "Redisに接続中 ...", socketioConnectError: "Socket.IO エラー", db: "DB", server: "サーバー", clients: "クライアント", memory: "メモリ", persistence: "永続化", stats: "統計", replication: "レプリケーション", cpu: "CPU", cluster: "クラスター", modules: "モジュール", errorstats: "エラー統計", commandstats: "コマンド統計", latencystats: "レイテンシ統計", keysizes: "キーサイズ", threads: "スレッド", }, confirm: { dropIndex: "このインデックスを削除しますか?", uploadBuffer: "このバイナリデータをアップロードしてもよろしいですか?", uploadBufferDone: "バイナリデータがアップロードされました", uploadBufferDoneAndSave: "バイナリデータがアップロードされ、サーバーに保存されました", title: "確認", alert: "警告", info: "情報", deleteListItem: "このリスト項目を削除してもよろしいですか?", deleteHashKey: "このハッシュキー項目を削除してもよろしいですか?", deleteStreamTimestamp: "このストリームタイムスタンプを削除してもよろしいですか?", deleteSetMember: "このセットメンバーを削除してもよろしいですか?", deleteZSetMember: "このソート済みセットメンバーを削除してもよろしいですか?", deleteConnection: "確認", deleteConnectionText: "このRedis接続を削除してもよろしいですか?", deleteNode: "このRedisノードを削除してもよろしいですか?", deleteAllKeys: opts => { return `このツリーとすべてのキーを削除しますか (${opts.key})?`; }, socketioConnectError: "Socket.IOがサーバーに接続できません。再読み込みして接続エラーの解決を試みることができますが、クライアント側では自動的に解決できません。", socketioAuthRequired: "Socket.IO認証が必要です。HTTP Basic Auth(ユーザー名/パスワード)で認証し、再読み込みしてください。", deleteKey: "このキーを削除してもよろしいですか?", rename: { title: "このキーの名前を変更してもよろしいですか?", textContent: "この操作はキーの名前を恒久的に変更します。", placeholder: "Redisキー(必須)" }, ttl: { title: "このキーのTTLを変更してもよろしいですか?", textContent: "TTLの変更はこのキーの有効期限を更新します。キーを永続的に保持するには空のままにしてください。", placeholder: "RedisキーのTTL(整数または空)", placeholderPlaceholder: "空の場合は永続的に保持されます。それ以外の場合は整数を入力してください。", convertTextToTime: "テキストを時間に変換", convertTextToTimePlaceholder: "例:1dは86400になります" }, license: { title: "ライセンスの設定", textContent: "有料機能を使用したい場合は、support@corifeus.comに連絡してライセンスをリクエストしてください。価格はPro 400 HUF/月(€1/月)または4,000 HUF/年(€10/年)、Enterprise 1,200 HUF/月(€3/月)または12,000 HUF/年(€30/年)です。年間は月額の10倍です。27%のVATを含む合計はPro 500 HUF/月(€1.27/月)または5,100 HUF/年(€12.70/年)、Enterprise 1,500 HUF/月(€3.81/月)または15,200 HUF/年(€38.10/年)です。ライセンスの検証にはインターネットアクセスが必要です。デフォルトライセンスには5シートが含まれます。追加のシートが必要な場合は、support@corifeus.comまでお問い合わせください。", placeholder: "ライセンスキー" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "コピー", downloadBuffer: "バイナリをダウンロード", setBuffer: "バイナリをアップロード", exportKeys: "キーをエクスポート", exportAllKeys: (opts) => `全 ${opts.count} キーをエクスポート`, exportSearchResults: (opts) => `${opts.count} 件の結果をエクスポート`, importKeys: "キーをインポート", saveWithFormatJson: "フォーマット付きで保存", formatJson: "JSONをフォーマット", wrap: "折り返し", unwrap: "折り返しなし", downloadJson: "JSONダウンロード", pubsubMonitor: "PubSub Monitor", language: "言語 / Language", ok: "OK", addKey: "このキーに追加", addKeyRoot: "ルートキーを追加", reloadKey: "キーを再読み込み", reload: "再読み込み", close: "閉じる", commands: "コマンド", view: "表示", statistics: "統計", refresh: "更新", pause: "一時停止", resume: "再開", clear: "クリア", rename: "名前変更", main: "データベース", cancel: "キャンセル", theme: "テーマ", github: "GitHub", githubRepo: "リポジトリ", githubRelease: "リリース", githubChangelog: "変更履歴", info: "Info", settings: "設定", connect: "接続", disconnect: "切断", overview: "概要", console: "コンソール", noConnections: "接続がありません。設定メニューで接続を追加してください。", noConnectionsInSettings: "接続がありません。上の「新しい接続」から追加できます。", connectionAdd: "新しい接続", addGroup: "グループを追加", extend: "展開", collapse: "折りたたむ", add: "追加", edit: "編集", save: "保存", ttl: "TTLを設定", license: "ライセンスを設定", delete: "削除", remove: "除去", sure: "確認", testConnection: "接続テスト", getKey: "Redisキーと関連データを読み込み中 ...", jsonViewShow: "JSONを表示", jsonViewEditor: "JSONを編集", quickConsole: "クイックコンソール" }, label: { id: { nodeId: 'ノードID', id: "接続ID", info: "sshPassword、sshPrivateKey、password、tlsCrt、tlsKey、tlsCaのプロパティを変更したくない場合は、それらのプロパティに接続IDを入力して値を維持してください。ノードパスワードでも同じロジックを使用する場合は、ノードパスワードにノードIDを入力してください。" }, secureFeature: 'P3Xで始まる同じように見える値がある場合、それはセキュリティ機能です。設定を変更するには、これらの設定を空または他の値に置き換えると保存されます。設定を変更しない場合、サーバー上のまま維持されます。', ssh: { on: 'SSH オン', off: 'SSH オフ', sshHost: 'SSHホスト', sshPort: 'SSHポート', sshUsername: 'SSHユーザー名', sshPassword: 'SSHパスワード', sshPrivateKey: 'SSH秘密鍵' }, isBuffer: opts => `[object ArrayBuffer]は値がバイナリデータであるか、値が${opts.maxValueAsBuffer}より大きいことを意味します`, streamValue: `ストリームのフィールドと値は1行です。例:field1 value1 "field 2" "value 2"`, streamTimestampId: `'*'は自動生成を意味するか、仕様に従い<ミリ秒時間>-<シーケンス番号>`, unableToLoadKey: ({ key }) => { return `このキーを読み込めません: ${key}。キーが削除された可能性があります。正確なエラーはコンソールにあります。`; }, bigJson: "このJSONオブジェクトは10kbを超えています。一部の機能のレンダリングが遅くなる可能性があるため、操作内容を理解した上で行ってください。", addNode: "ノードを追加", validateJson: "JSONを検証", reducedFunction: `機能制限`, tooManyKeys: opts => { return `フル機能で許可されるキーの合計は${opts.maxLightKeysCount}個です。このデータベースは許可されたキーの合計${opts.count}を超えています。キーのソートと追加のツリー情報は無効になっています。検索はクライアント検索の代わりにサーバー側でのみ行われます。`; }, redisCommandNotFound: "一致するRedisコマンドが見つかりません ...", treeKeyStore: `ソート(自然比較)はクライアント、つまりブラウザで実行されます。これは10k以上のキーのような大きなデータセットの場合、ページレンダリングに少し時間がかかる可能性があることを意味します。Redisにはキーソートはなく、この方法のみです。`, socketIoTimeout: options => { return `このリクエストでSocket.IOがタイムアウトしました(最大${options.timeout / 1000}秒)...`; }, resizerInfo: options => { return `左または右パネルの最小幅は${options.width}pxです`; }, jsonViewNotParsable: "この値はJSONとして解析できません ", ttlTitle: "TTLを秒単位で設定", passwordSecure: "パスワードが空でも文字が表示される場合がありますが、これはセキュリティ機能です。", tlsWithoutCert: "追加の証明書なしでTLSを有効にする", tlsRejectUnauthorized: "未承認の証明書を拒否する", tlsSecure: "P3Xで始まるTLS設定や、すべてのTLS設定が同じように見える場合、それはセキュリティ機能です。設定を変更するには、空または他の値に置き換えると保存されます。TLS設定を変更しない場合、サーバー上のまま維持されます。", treeSeparatorEmpty: "ツリー区切りが空の場合、ツリーにはネストされたノードはなく、単純なリストのみになります", treeSeparatorEmptyNote: "ネストされたノードはなく、単純なリストのみ", welcomeConsole: "Redisコンソールへようこそ", welcomeConsoleInfo: "カーソル上下キーによる履歴機能が有効です", redisListIndexInfo: "空で末尾に追加、-1で先頭に追加、または表示されている位置に保存します。", console: "コンソール", connectiondAdd: "接続を追加", connectiondEdit: "接続を編集", connectiondView: "接続を表示", connections: "接続", licenseInfo: "ライセンス", licenseEditable: "ライセンス編集可能", licenseEditableYes: "はい", licenseEditableNo: "いいえ", licenseTerminalOnly: "ライセンスはサーバーターミナルからのみ設定できます。", licenseTierPolicyTitle: "ティアポリシー", licenseTierPolicyText: "

無料

基本Redis UIのみ。SSHトンネリング、読み取り専用接続モード、Cluster/Sentinel、JSON編集/バイナリアップロード/バイナリダウンロード/ReJSONはありません。
価格:0 HUF/月(€0/月)。

Pro

SSHトンネリング、読み取り専用接続モード(--readonly-connections/-rを含む)、JSON編集、バイナリアップロード、バイナリダウンロード、ReJSON。
基本価格:400 HUF/月(€1/月)または4,000 HUF/年(€10/年)。
27% VAT込み合計:500 HUF/月(€1.27/月)または5,100 HUF/年(€12.70/年)。

Enterprise

SSHトンネリング、ClusterとSentinel、JSON編集、バイナリアップロード、バイナリダウンロード、ReJSON。--readonly-connections/-rも対応。
基本価格:1,200 HUF/月(€3/月)または12,000 HUF/年(€30/年)。
27% VAT込み合計:1,500 HUF/月(€3.81/月)または15,200 HUF/年(€38.10/年)。

年間ルール

年間価格は月額の10倍です。

シート

デフォルトライセンスには5シートが含まれます。追加のシートが必要な場合は、support@corifeus.comまでお問い合わせください。

Enterpriseトライアル

実在するメールアドレス(テスト用メール以外)をお持ちの方は10日間無料。

請求情報(メール)

名前、請求用メール、国コード、郵便番号、市区町村、住所、VAT ID(任意)。

支払い

PayPal支払いはHUF(フォリント)のみ対応。https://paypal.me/corifeusに送金後、請求書をお送りします。すべての支払いは返金不可です。

VAT

VATが価格に追加されます(ハンガリーでは27%)。

お問い合わせ

ご挨拶やご質問がある場合は、support@corifeus.comまでご連絡ください。

言語

請求書とライセンスのメール通信は英語です。請求書の通貨はHUFです。

注意

ライセンスの検証にはインターネットアクセスが必要です。", licenseState: "状態", licenseStateActive: "有効", licenseStateInactive: "無効", licenseStateNoLicense: "ライセンスなし", licenseKeyMasked: "保存済みキー", licenseTier: "ティア", licenseValid: "有効", licenseStatus: "ライセンス状態", licenseReason: "理由", licenseCheckedAt: "確認日時", licenseStartsAt: "開始日", licenseExpiresAt: "有効期限", licenseDaysLeft: "残り日数", licenseMaxDevices: "最大デバイス数", licenseActiveDevices: "アクティブデバイス", licenseActiveDevicesInfo: "デバイスが使用されなくなった場合、そのシートは75分後に自動的に解放されます。", licenseCustomerEmail: "顧客メール", licenseFeatures: "機能", licenseFeaturesEmpty: "追加機能なし", licenseFeatureReadonlyMode: "読み取り専用接続モード", licenseFeatureReadonlyConnectionsFlag: "読み取り専用接続 (--readonly-connections/-r)", licenseFeatureSsh: "SSHトンネリング", licenseFeatureCluster: "クラスター接続", licenseFeatureSentinel: "Sentinel接続", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "キーソート オン", off: "キーソート オフ" }, cluster: { on: "クラスター オン", off: "クラスター オフ" }, sentinel: { on: "Sentinel オン", off: "Sentinel オフ", name: "Sentinel名" }, readonly: { on: "読み取り専用 オン", off: "読み取り専用 オフ" }, proSshOnly: "SSHはProまたはEnterpriseで利用可能です。", proReadonlyOnly: "読み取り専用接続モードはProまたはEnterpriseで利用可能です。", enterpriseClusterSentinelOnly: "ClusterとSentinelはEnterpriseでのみ利用可能です。", theme: { light: "ライト", dark: "ダーク enterprise", darkNeu: "ダーク", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `接続済み: ${opts.name}`; }, tree: "ツリー", askAuth: "認証を要求", keyboardShortcuts: "キーボードショートカット", about: "バージョン情報", supportedLanguages: "対応言語", version: "バージョン", redisVersion: "Redisバージョン", modules: "モジュール", shortcutRefresh: "更新", shortcutSearch: "検索にフォーカス", shortcutNewKey: "新しいキー", shortcutDisconnect: "切断", themeAuto: "自動(システム)", shortcutCommandPalette: "コマンドパレット", commandPalette: "コマンドパレット", noResults: "結果なし", redisCommandsReference: "Redis コマンド", ungrouped: "未分類", grouped: "グループ化", connectFirst: "まずRedisサーバーに接続してください", searchLanguage: "言語を検索...", exportProgress: "キーをエクスポート中...", importProgress: "キーをインポート中...", importPreview: "プレビュー", importOverwrite: "上書き", importSkip: "スキップ", importConflict: "キーが既に存在する場合:", noKeysToExport: "エクスポートするキーがありません", time: "時間", loading: "読み込み中...", autoRefresh: "自動", exportSearchHint: "現在の検索に一致するキーのみをエクスポート", importSearchHint: "インポートは検索結果だけでなくデータベース全体に適用されます", importNoKeys: "ファイルにキーが見つかりません", }, status: { dataCopied: "データがクリップボードにコピーされました", licenseSaved: "ライセンスが保存されました", exportDone: "エクスポート完了", indexCreated: "インデックス作成完了", indexDropped: "インデックス削除完了", importDone: (opts) => `インポート完了: ${opts.created} 作成、${opts.skipped} スキップ、${opts.errors} エラー`, nodeRemoved: "ノードが削除されました", keyIsNotExisting: "このキーは削除済みまたは有効期限切れの可能性があります。", keyCount: opts => { if (opts.keyCount === 0) { return "キーなし"; } else if (opts.keyCount === 1) { return "1 キー"; } else { return `${opts.keyCount} キー`; } }, treeExpandAll: "すべてのツリーリーフを展開します。この操作は負荷が高く、時間がかかる場合があります ...", noRedisKeys: "このデータベースにはキーがありません。", redisConnected: "Redisの接続に成功しました", reloadingDataInfo: "Redisデータ情報を再読み込み中", added: "追加済み", saved: "更新済み", cancelled: "キャンセル済み", deleted: "削除済み", savedRedis: "Redisデータが保存されました", redisDisconnected: opts => { return `現在の接続でエラーが発生しました: ${opts.error.message}`; }, dbChanged: opts => { return `データベースインデックスが${opts.db}に設定されました。 `; }, treeDeleted: opts => { return `ツリーキーが削除されました (${opts.key})。`; }, deletedKey: opts => { return `キーが削除されました (${opts.key})。`; }, renamedKey: "このキーの名前が変更されました", ttlChanged: "このキーのTTLが変更されました", notInteger: "この入力は整数ではありません", persisted: "このキーは永続的に保持されます", set: "キーが設定/追加されました" }, code: { "delete-connection": "この接続は削除されたため、このRedisインスタンスから切断されました。", "save-connection": "この接続は変更されたため、このRedisインスタンスから切断されました。再接続できます。", "readonly-connections": "接続の追加/保存/削除は読み取り専用です!", "readonly-connection-mode": "この接続は読み取り専用モードです!", "list-out-of-bounds": "このリストインデックスは範囲外です", "donation-ware-feature": "この機能は寄付版で利用可能です。", "feature-pro-readonly-required": "読み取り専用接続モードにはProまたはEnterpriseライセンスが必要です。", "feature-pro-ssh-required": "SSHトンネリングにはProまたはEnterpriseライセンスが必要です。", "feature-enterprise-cluster-sentinel-required": "ClusterとSentinelにはEnterpriseライセンスが必要です。", "feature-pro-json-binary-required": "JSON編集、バイナリアップロード、バイナリダウンロードにはProまたはEnterpriseライセンスが必要です。", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "認証が必要です。HTTP Basic Authで認証し、再読み込みしてください。", "auto-connection-failed": "接続が削除された可能性があり、そのため自動接続に失敗しました。", invalid_console_command: "このコマンドはGUIでは動作しません。" }, licenseReason: { LICENSE_VALID: "ライセンスは有効です", LICENSE_INVALID: "ライセンスは無効です", LICENSE_MISSING: "ライセンスキーが設定されていません", LICENSE_DISABLED: "サーバー設定でライセンスが無効になっています", LICENSE_NOT_FOUND: "ライセンスが見つかりません", LICENSE_EXPIRED: "ライセンスの有効期限が切れています", LICENSE_CLEARED: "ライセンスキーがクリアされました", LICENSE_MAX_DEVICES_REACHED: "最大デバイス数に達しました", PRODUCT_MISMATCH: "ライセンス製品が一致しません" }, licenseStatusValue: { active: "有効", deleted: "削除済み", all: "すべて", expired: "期限切れ", missing: "未設定", inactive: "無効" }, form: { error: { required: "必須", port: "ポートは1-65535の範囲です", invalid: "フォームが無効です" }, connection: { label: { name: "名前", group: "グループ", host: "ホスト名", port: "ポート", password: "パスワード", username: "ユーザー名" } }, treeSettings: { maxValueDisplay: "値表示の最大文字列長", maxValueDisplayInfo: "0の場合、完全な値を表示します。0より大きい場合、この長さに切り詰めます。-1の場合:文字列は編集するまで値を非表示にし、その他の型は完全なコンテンツを表示します。", maxKeys: "最大キー数", maxKeysInfo: "GUIがクラッシュしないように、最大キー数を制限しています。", keyCount: () => { return `キー数: ${p3xr.state.keysRaw.length}`; }, label: { animation: "アニメーションを使用", noAnimation: "アニメーションなし", jsonFormatTwoSpace: "2スペースでJSONをフォーマット", jsonFormatFourSpace: "4スペースでJSONをフォーマット", formName: "Redis設定", searchModeClient: "クライアント検索モード", searchModeServer: "サーバー検索モード", searchModeStartsWith: "前方一致検索モード", searchModeIncludes: "部分一致検索モード" }, field: { treeSeparator: "ツリー区切り文字", treeSeparatorSelector: "ツリー区切り文字セレクター", page: "ツリーページング数", keyPageCount: "キーページング数", keysSort: "キーをソート", searchMode: "検索モード", searchModeStartsWith: "前方一致 / 部分一致検索" }, error: { keyPageCount: "キーページング数は5から100の整数である必要があります", page: "ページング数は10から5000の整数である必要があります", maxValueDisplay: "最大表示値は-1から32768の整数である必要があります", maxKeys: "最大キー数は100から100000の整数である必要があります" } }, key: { label: { formName: { add: "新しいRedisキーを追加", edit: "Redisキーを編集", append: "既存のRedisキーに追加" } }, field: { streamTimestamp: "タイムスタンプ", key: "キー", type: "タイプ", index: "インデックス", hashKey: "ハッシュキー", score: "スコア", value: "値" }, error: { streamTimestamp: "タイムスタンプは必須です。Redis形式または*として入力してください", key: "キーは少なくとも1文字必要です", hashKey: "ハッシュテーブルキーは少なくとも1文字必要です", score: "ソート済みセットのスコアは必須です", value: "値は必須です" } }, main: { label: { database: "DB" } } }, page: { search: { title: "検索", index: "インデックス", query: "クエリ", results: "結果", noIndex: "インデックスが見つかりません", createIndex: "インデックス作成", dropIndex: "インデックス削除", indexInfo: "インデックス情報", indexName: "インデックス名", prefix: "キープレフィックス(任意)", fieldName: "フィールド名", }, monitor: { title: "モニタリング", memory: "メモリ", opsPerSec: "操作/秒", clients: "クライアント", blocked: "ブロック", hitsMisses: "ヒット率", networkIo: "ネットワーク I/O", slowLog: "スローログ", totalCommands: "合計", expired: "期限切れ", evicted: "追い出し", clientList: "クライアント一覧", topKeys: "メモリ使用量トップキー", killClient: "クライアント切断", clientKilled: "クライアントを切断しました", confirmKillClient: "このクライアントを切断しますか?", noKeys: "キーがありません", noClients: "クライアントがありません", }, overview: { noConnected: "Redisへの接続がありません。", overviewClients: "クライアント数で接続一覧を表示", connectedCount: opt => { if (opt.length === 1) { return "1 クライアント"; } return `${opt.length} クライアント`; } }, key: { label: { key: "キー", encoding: "エンコーディング", length: "サイズ", ttl: "TTL", ttlTitle: "有効期限", type: "タイプ", ttlNotExpire: "期限なし", lengthString: "バイト", lengthItem: "アイテム", actions: "操作" }, list: { table: { index: "インデックス", value: "値" } }, hash: { table: { hashkey: "ハッシュキー", value: "値" } }, set: { table: { value: "メンバー" } }, zset: { table: { value: "メンバー", score: "スコア" } }, stream: { table: { timestamp: "タイムスタンプID", field: "フィールド", value: "値" } } }, treeControls: { settings: "ツリー設定", expandAll: "すべて展開", collapseAll: "すべて折りたたむ", search: { search: "キー内を検索", clear: "現在の検索をクリア", placeholderClient: "クライアント側で検索", placeholderServer: "サーバー側で検索", info: "クライアント側検索は、検索入力のテキストに一致します。サーバー側検索は、*{検索テキスト}*のようなキーパターンで検索します。大きな検索セットではサーバー側検索が適しています。小さな検索セットではクライアント側検索が適しています。" + ` キー数が${p3xr.settings.maxLightKeysCount}を超える場合、サーバー側でのみ検索できます。`, largeSetInfo: "大きなデータセットでは、クライアント側検索は無効になっており、現在サーバー側検索のみ可能です。", infoDetails: "検索の仕組みについては、設定を確認してください" }, pager: { next: "次へ", prev: "前へ", first: "最初", last: "最後" } } }, time: { loading: "読み込み中...", years: "年", months: "ヶ月", days: "日", year: "年", month: "ヶ月", day: "日" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ka/000077500000000000000000000000001517666434100137465ustar00rootroot00000000000000src/strings/ka/strings.js000066400000000000000000001332221517666434100160000ustar00rootroot00000000000000const strings = { error: { cleared_license: "გასუფთავებული ლიცენზია", invalid_license: "არასწორი ლიცენზია", license_max_devices_reached: "მიღწეულია მოწყობილობის ადგილების მაქსიმალური რაოდენობა", license_readonly: "ლიცენზიის შეცვლა შესაძლებელია მხოლოდ სერვერის ტერმინალიდან.", server_error: "სერვერის შეცდომა, გთხოვთ სცადოთ ხელახლა" }, title: { donate: "შემოწირულობა", jsonRecursive: "ყველა ფოთლის გაფართოება", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "თქვენ შეგიძლიათ აირჩიოთ Redis კავშირი ქვედა მარცხენა მენიუდან დასაკავშირებლად.", statistics: "სტატისტიკა", error: "შეცდომა", connectingRedis: "დაკავშირება Redis-თან ...", socketioConnectError: "Socket.IO შეცდომა", db: "DB", server: "სერვერი", clients: "კლიენტები", memory: "მეხსიერება", persistence: "გამძლეობა", stats: "სტატისტიკა", replication: "რეპლიკაცია", cpu: "CPU", cluster: "Cluster", modules: "მოდულები", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "დარწმუნebuli ხართ?", uploadBuffer: "დარწმუნებული ხართ, რომ ატვირთავთ ამ ორობით მონაცემს?", uploadBufferDone: "ორობითი მონაცემები ატვირთულია", uploadBufferDoneAndSave: "ბინარული მონაცემები აიტვირთება და ინახება სერვერზე", title: "დაადასტურეთ", alert: "გაფრთხილება", info: "ინფორმაცია", deleteListItem: "დარწმუნებული ხართ, რომ წაშლით ამ სიის ერთეულს?", deleteHashKey: "დარწმუნებული ხართ, რომ წაშლით ამ ჰეშის გასაღების ერთეულს?", deleteStreamTimestamp: "დარწმუნებული ხართ, რომ წაშლით ამ ნაკადის დროის ნიშანს?", deleteSetMember: "დარწმუნებული ხართ, რომ წაშლით ამ ნ���კრების წევრს?", deleteZSetMember: "დარწმუნებული ხართ, რომ წაშლით ამ დალაგებული ნაკრების წევრს?", deleteConnection: "დაადასტურეთ", deleteConnectionText: "დარწმუნებული ხართ, რომ წაშალეთ ეს Redis კავშირი?", deleteNode: "დარწმუნებული ხართ, რომ წაშლით ამ Redis კვანძს?", deleteAllKeys: opts => { return `წაშალე ეს ხე და მისი ყველა გასაღები (${opts.key})?`; }, socketioConnectError: "Socket.IO ვერ დაუკავშირდება სერვერს, შეგიძლიათ გადატვირთოთ და თავად სცადოთ კავშირის შეცდომის მოგვარება, კლიენტმა არ იცის როგორ მოაგვაროს იგი.", socketioAuthRequired: "საჭიროა Socket.IO ავტორიზაცია. გთხოვთ, გადაამოწმოთ ავტორიზაცია HTTP Basic Auth (მომხმარებლის სახელი/პაროლი) და გადატვირთეთ.", deleteKey: "დარწმუნებული ხართ, რომ წაშალეთ ეს გასაღები?", rename: { title: "დარწმუნებული ხართ, რომ გადაარქმევთ ამ გასაღებს?", textContent: "ეს მოქმედება კლავს სამუდამოდ გადარქმევს.", placeholder: "Redis გასაღები (აუცილებელია)" }, ttl: { title: "დარწმუნებული ხართ, რომ გსურთ შეცვალოთ ამ გასაღების TTL?", textContent: "TTL-ის შეცვლა განაახლებს ამ გასაღების სიცოცხლის ხანგრძლივობას. დატოვეთ ცარიელი, რომ ეს გასაღები სამუდამოდ შეინახოთ.", placeholder: "Redis გასაღების TTL (მთელი ან ცარიელი)", placeholderPlaceholder: "ცარიელი ნიშნავს, რომ ის სამუდამოდ გრძელდება; წინააღმდეგ შემთხვევაში შეიყვანეთ მთელი რიცხვი.", convertTextToTime: "ტექსტის დროში გადაყვანა", convertTextToTimePlaceholder: "მაგ. 1d იქნება 86400" }, license: { title: "ლიცენზიის დაყენება", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "ლიცენზიის გასაღები" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "კოპირება", downloadBuffer: "ჩამოტვირთეთ ორობითი", setBuffer: "ატვირთეთ ორობითი", exportKeys: "გასაღებების ექსპორტი", exportAllKeys: (opts) => `ყველა ${opts.count} გასაღების ექსპორტი`, exportSearchResults: (opts) => `${opts.count} შედეგის ექსპორტი`, importKeys: "გასაღებების იმპორტი", saveWithFormatJson: "შეინახეთ ფორმატით", formatJson: "ფორმატი Json", wrap: "შეფუთვა", unwrap: "გაშალეთ", downloadJson: "ჩამოტვირთეთ JSON", pubsubMonitor: "PubSub მონიტორი", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "ენა", ok: "OK", addKey: "დაამატეთ ამ გასაღებს", addKeyRoot: "დაამატეთ root გასაღები", reloadKey: "გადატვირთეთ გასაღები", reload: "გა��ატვირთვა", close: "დახურვა", commands: "ბრძანებები", view: "ხედი", statistics: "სტატისტიკა", refresh: "განაახლეთ", pause: "პაუზა", resume: "გაგრძელება", clear: "წმინდა", rename: "გადარქმევა", main: "მონაცემთა ბაზა", cancel: "გაუქმება", theme: "თემა", github: "GitHub", githubRepo: "საცავი", githubRelease: "რელიზები", githubChangelog: "ცვლილებების ჟურნალი", info: "Info", settings: "პარამეტრები", connect: "დაკავშირება", disconnect: "გათიშვა", overview: "მიმოხილვა", console: "კონსოლი", noConnections: "კავშირები არ არის, დაამატეთ კავშირი პარამეტრების მენიუში.", noConnectionsInSettings: "კავშირები არ არის, ზემოთ შეგიძლიათ დაამატოთ ახალი კავშირი.", connectionAdd: "ახალი კავშირი", addGroup: "ჯგუფის დამატება", extend: "გააგრძელე", collapse: "კოლაფსი", add: "დამატება", edit: "რედაქტირება", save: "შენახვა", ttl: "დააყენეთ TTL", license: "ლიცენზიის დაყენება", delete: "წაშლა", remove: "ამოღება", sure: "რა თქმა უნდა", testConnection: "ტესტი კავშირი", getKey: "იტვირთება Redis გასაღები და მასთან დაკავშირებული მონაცემები...", jsonViewShow: "ეკრანი JSON", jsonViewEditor: "JSON რედაქტირება", quickConsole: "სწრაფი კონსოლი", }, label: { id: { nodeId: "კვანძის ID", id: "კავშირის ID", info: "თუ არ გსურთ შეცვალოთ თვისებები: sshPassword, sshPrivateKey, პაროლი, tlsCrt, tlsKey, tlsCa, გთხოვთ, შეიყვანოთ კავშირის ID ამ თვისებებში, რათა შეინარჩუნოთ ქონების მნიშვნელობები ხელუხლებელი. თუ გსურთ იგივე ლოგიკა კვანძის პაროლში, მაშინ შეიყვანეთ კვანძის ID კვანძის პაროლში." }, secureFeature: "თუ ხედავთ მნიშვნელობას, რომელიც იწყება P3X-ით, იგივე გამოიყურება, ეს უსაფრთხო ფუნქციაა. პარამეტრების შესაცვლელად, უბრალოდ შეცვალეთ ეს პარამეტრები ცარიელი ან ს��ვა რამით და ისინი შეინახება. თუ არ შეცვლით პარამეტრებს, პარამეტრები შენარჩუნდება როგორც სერვერზეა.", ssh: { on: "SSH ჩართულია", off: "SSH გამორთულია", sshHost: "SSH ჰოსტი", sshPort: "SSH პორტი", sshUsername: "SSH მომხმარებლის სახელი", sshPassword: "SSH პაროლი", sshPrivateKey: "SSH პირადი გასაღები" }, isBuffer: opts => `[object ArrayBuffer] ნიშნავს, რომ მნიშვნელობა არის ორობითი მონაცემები ან მნიშვნელობა უფრო დიდია ${opts.maxValueAsBuffer}`, streamValue: `ნაკადის ველი და მნიშვნელობა არის ერთი ხაზი. მაგ.: field1 value1 "ველი 2" "მნიშვნელობა 2"`, streamTimestampId: `'*' ნიშნავს ავტომატურად გენერირებულს ან სპეციფიკაციას, როგორც -`, unableToLoadKey: ({ key }) => { return `ამ გასაღების ჩატვირთვა შეუძლებელია: ${key}. შესაძლებელია, გასაღები წაიშალა. ზუსტი შეცდომა კონსოლშია.`; }, bigJson: "ეს JSON ობიექტი 10 კბ-ზე მეტია, ამიტომ დარწმუნდით, რომ იცით რას აკეთებთ, რადგან ზოგიერთი ფუნქცია შეიძლება იყოს ნელი რენდერით.", addNode: "კვანძის დამატება", validateJson: "დაადასტურეთ JSON", reducedFunction: `შემცირებული ფუნქციონირება`, tooManyKeys: opts => { return `სრული მაქსიმალური ფუნქციებისთვის ნებადართული კლავიშები არის ${opts.maxLightKeysCount} ითვლიან. ამ მონაცემთა ბაზას აქვს ნებადართული გასაღებები მთლიანობაში ${opts.count}. გასაღების დახარისხება და დამატებითი ლამაზი ხის ინფორმაცია გამორთულია. ძებნა ხდება მხოლოდ სერვერზე, კლიენტის ძიების ნაცვლად.`; }, redisCommandNotFound: "Redis ბრძანების შესატყვისი ვერ მოიძებნა ...", treeKeyStore: `დახარისხება (ბუნებრივი შედარება) შესრულებულია კლიენტზე, ანუ ბრაუზერზე, რაც ნიშნავს, რომ მას აქვს ჯარიმა დიდი დიდი ნაკრებისთვის, როგორიცაა 10 ათასზე მეტი კლავიატურა, შესაძლოა ცოტა დრო დაამატოს გვერდის რენდერს. Redis-ში არ არის გასაღების დახარისხება, მხოლოდ ასე.`, socketIoTimeout: options => { return `Socket.IO ამ მოთხოვნის დრო ამოიწურა (მაქს ${options.timeout / 1000} წამი)...`; }, resizerInfo: options => { return `მარცხენა ან მარჯვენა პანელის მინიმალური სიგანეა ${options.width}px`; }, jsonViewNotParsable: "ეს მნიშვნელობა არ არის JSON გასაანალიზებელი ", ttlTitle: "დააყენეთ TTL წამებში", passwordSecure: "პაროლი შეიძლება ცარიელი იყოს, მაგრამ მაინც აჩვენებს სიმბოლოებს, ეს უსაფრთხოების ფუნქციაა.", tlsWithoutCert: "ჩართეთ TLS დამატებითი სერტიფიკატის გარეშე", tlsRejectUnauthorized: "უარი თქვით არასანქცირებულ სერტიფიკატზე", tlsSecure: "თუ ხედავთ TLS კონფიგურაციას, რომელიც იწყება P3X-ით ან ყველა TLS პარამეტრი ერთნაირად გამოიყურება, ეს უსაფრთხო ფუნქციაა. პარამეტრების შესაცვლელად, უბრალოდ შეცვალეთ ეს პარამეტრები ცარიელი ან სხვა რამით და ისინი შეინახება. თუ არ შეცვლით TLS პარამეტრებს, პარამეტრები შენარჩუნდება როგორც სერვერზეა.", treeSeparatorEmpty: "თუ ხეების გამყოფი ცარიელია, ხეს არ ექნება ჩადგმული კვანძები, მხოლოდ სუფთა სია", treeSeparatorEmptyNote: "არ არის ჩადგმული კვანძები, მხოლოდ სუფთა სია", welcomeConsole: "კეთილი იყოს თქვენი მობრძანება Redis კონსოლში", welcomeConsoleInfo: "კურსორის UP ან DOWN ისტორია ჩართულია", redisListIndexInfo: "ცარიელი დასამატებლად, -1 დასამაგრებლად ან შესანახად ნაჩვენები პოზიციაზე.", console: "კონსოლი", connectiondAdd: "კავშირის დამატება", connectiondEdit: "კავშირის რედაქტირება", connectiondView: "კავშირის ნახვა", connections: "კავშირები", licenseInfo: "ლიცენზია", licenseEditable: "ლიცენზიის რედაქტირებადი", licenseEditableYes: "დიახ", licenseEditableNo: "არა", licenseTerminalOnly: "ლიცენზიის კონფიგურაცია შესაძლებელია მხოლოდ სერვერის ტერმინალიდან.", licenseTierPolicyTitle: "დონის პოლიტიკა", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "სახელ���წიფო", licenseStateActive: "აქტიური", licenseStateInactive: "არააქტიური", licenseStateNoLicense: "არანაირი ლიცენზია", licenseKeyMasked: "შენახული გასაღები", licenseTier: "იარუსი", licenseValid: "მოქმედებს", licenseStatus: "ლიცენზიის სტატუსი", licenseReason: "მიზეზი", licenseCheckedAt: "შემოწმებულია", licenseStartsAt: "იწყება", licenseExpiresAt: "ვადა იწურება", licenseDaysLeft: "დარჩენილია დღეები", licenseMaxDevices: "მაქსიმალური მოწყობილობები", licenseActiveDevices: "აქტიური მოწყობილობები", licenseActiveDevicesInfo: "თუ მოწყობილობა აღარ გამოიყენება, მისი სავარძელი ავტომატურად იხსნება 75 წუთის შემდეგ.", licenseCustomerEmail: "მომხმარებლის ელ.წერილი", licenseFeatures: "მახასიათებლები", licenseFeaturesEmpty: "არანაირი დამატებითი ფუნქციები", licenseFeatureReadonlyMode: "მხ��ლოდ წაკითხვის კავშირის რეჟიმი", licenseFeatureReadonlyConnectionsFlag: "მხოლოდ წაკითხვადი კავშირები (--readonly-connections/-r)", licenseFeatureSsh: "SSH გვირაბი", licenseFeatureCluster: "Cluster კავშირები", licenseFeatureSentinel: "Sentinel კავშირები", licenseFeatureReJSON: "ReJSON (JSON მონაცემთა ტიპი)", keysSort: { on: "გასაღების დახარისხება ჩართულია", off: "გასაღების დახარისხება" }, cluster: { on: "Cluster ჩართულია", off: "Cluster გამორთულია" }, sentinel: { on: "Sentinel ჩართულია", off: "Sentinel გამორთულია", name: "Sentinel სახელი" }, readonly: { on: "მხოლოდ წაკითხვაზე", off: "მხოლოდ წასაკითხად გამორთულია" }, proSshOnly: "SSH ხელმისაწვდომია Pro ან Enterprise-ში.", proReadonlyOnly: "მხოლოდ წაკითხვის კავშირის რეჟიმი ხელმისაწვდომია Pro ან Enterprise-ში.", enterpriseClusterSentinelOnly: "Cluster და Sentinel ხელმისაწვდომია მხოლოდ Enterprise-ში.", theme: { light: "სინათლე", dark: "ბნელი საწარმო", darkNeu: "ბნელი", darkoBluo: "დარკო ბლუო", enterprise: "საწარმო", redis: "Redis", matrix: "მატრ��ცა" }, connected: opts => { return `დაკავშირებულია: ${opts.name}`; }, tree: "ხე", askAuth: "მოითხოვეთ ავტორიზაცია", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "მოდულები", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "გათიშვა", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis ბრძანebebi", ungrouped: "ჯგუფის გარეშე", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "ენის ძიება...", exportProgress: "გასაღebebis ექსპორტი...", importProgress: "გასაღebebis იმპორტი...", importPreview: "წინასწარი ნახვა", importOverwrite: "გადაწერა", importSkip: "გამოტოვება", importConflict: "თუ გასაღები უკვე არსებobs:", noKeysToExport: "არ არის გასაღebebi ექსპორტისთვის", time: "დრო", loading: "იტvirtheba...", autoRefresh: "ავტო", exportSearchHint: "ექსპორტი მხოლოდ მიმდინარე ძიებას შესაბამისი გასაღebebis", importSearchHint: "იმპორტი ვრცeldeba მთელ მონაცემთა ბაზაზე", importNoKeys: "ფაილში გასაღebebi ვერ მოიძებna", }, status: { dataCopied: "მონაცემები ბუფერშია", licenseSaved: "ლიცენზია შენახულია", exportDone: "ექსპორტი დასრულda", indexCreated: "ინდექსი შეიქმნა", indexDropped: "ინდექსი წაიშალა", importDone: (opts) => `იმპორტი დასრულda: ${opts.created} შეიქმნა, ${opts.skipped} გამოტოვda, ${opts.errors} შეცdomna`, nodeRemoved: "კვანძი ამოღებულია", keyIsNotExisting: "ეს გასაღები შეიძლება წაშლილი ან ვადაგასული ყოფილიყო.", keyCount: opts => { if (opts.keyCount === 0) { return "გასაღები არ არის"; } else if (opts.keyCount === 1) { return "1 გასაღები"; } else { return `${opts.keyCount} გასაღებები`; } }, treeExpandAll: "გააფართოვეთ ყველა ხის ფოთოლი. ეს ოპერაცია შეიძლება იყოს ძვირი და შეიძლება დრო დასჭირდეს ...", noRedisKeys: "ამ მონაცემთა ბაზაში გასაღებები არ არის.", redisConnected: "Redis დაკავშირებულია წარმატებით", reloadingDataInfo: "მიმდინარეობს Redis მონაცემთა ინფორმაციის გადატვირთვა", added: "დამატებულია", saved: "განახლებულია", cancelled: "გაუქმდა", deleted: "წაშლილია", savedRedis: "Redis მონაცემები შენახულია", redisDisconnected: opts => { return `მიმდინარე კავშირს ჰქონდა შეცდომა: ${opts.error.message}`; }, dbChanged: opts => { return `db ინდექსი დაყენებულია ${opts.db}. `; }, treeDeleted: opts => { return `ხის გასაღები წაი��ალა (${opts.key}).`; }, deletedKey: opts => { return `გასაღები წაიშალა (${opts.key}).`; }, renamedKey: "ამ გასაღებს დაარქვეს სახელი", ttlChanged: "ამ გასაღების TTL შეიცვალა", notInteger: "ეს შეყვანა არ არის მთელი რიცხვი", persisted: "ეს გასაღები სამუდამოდ რჩება", set: "გასაღები დაყენებულია/დამატებულია" }, code: { "delete-connection": "ეს კავშირი წაიშალა, ასე რომ თქვენ გათიშული ხართ ამ Redis ეგზემპლართან.", "save-connection": "ეს კავშირი შეიცვალა, ასე რომ თქვენ გათიშული ხართ ამ Redis ეგზემპლართან. შეგიძლიათ ხელახლა დაუკავშირდეთ.", "readonly-connections": "კავშირების დამატება/შენახვა/წაშლა მხოლოდ წაკი���ხულია!", "readonly-connection-mode": "ეს კავშირი მხოლოდ წაკითხვის რეჟიმშია!", "list-out-of-bounds": "ეს სიის ინდექსი საზღვრებს გარეთაა", "donation-ware-feature": "ეს ფუნქცია წარმოდგენილია შემოწირულობის ვერსიაში.", "feature-pro-readonly-required": "მხოლოდ წაკითხული კავშირის რეჟიმი მოითხოვს Pro ან Enterprise ლიცენზიას.", "feature-pro-ssh-required": "SSH გვირაბისთვის საჭიროა Pro ან Enterprise ლიცენზია.", "feature-enterprise-cluster-sentinel-required": "Cluster და Sentinel საჭიროებენ Enterprise ლიცენზიას.", "feature-pro-json-binary-required": "JSON-ის რედაქტირება, ბინარის ატვირთვა და ორობითი ჩამოტვირთვა მოითხოვს Pro ან Enterprise ლიცენზიას.", "feature-pro-rejson-required": "ReJSON (JSON მონაცემთა ტიპი) მოითხოვს Pro ან Enterprise ლიცენზიას.", "invalid-json-value": "მნიშვნელობა არ არის სწორი JSON.", "http_auth_required": "საჭიროა ავტორიზაცია: გთხოვთ, გადაამოწმოთ ავთენტიფიკაცია HTTP Basic Auth-ით და გადატვირთეთ.", "auto-connection-failed": "შესაძლებელია, კავშირი წაიშალა და ავტომატური კავშირი ვერ მოხერხდა ამის გამო.", invalid_console_command: "ეს ბრძანება არ მუშაობს GUI-ით." }, licenseReason: { LICENSE_VALID: "ლიცენზია მოქმედებს", LICENSE_INVALID: "ლიცენზია არასწორია", LICENSE_MISSING: "ლიცენზიის გასაღები არ არის დაყენებული", LICENSE_DISABLED: "ლიცენზია გამორთულია სერვერის კონფიგურაციაში", LICENSE_NOT_FOUND: "ლიცენზია ვერ მოიძებნა", LICENSE_EXPIRED: "ლიცენზიას ვადა გაუვიდა", LICENSE_CLEARED: "ლიცენზიის გასაღები გასუფთავდა", LICENSE_MAX_DEVICES_REACHED: "მიღწეულია მოწყობილობის ადგილების მაქსიმალური რაოდენობა", PRODUCT_MISMATCH: "სალიცენზიო პროდუქტი არ ემთხვევა" }, licenseStatusValue: { active: "აქტიური", deleted: "წაშლილია", all: "ყველა", expired: "ვადა გაუვიდა", missing: "დაკარგული", inactive: "არააქტიური" }, form: { error: { required: "საჭირო", port: "პორტი არის 1-65535 შორის", invalid: "ფორმა არასწორია" }, connection: { label: { name: "სახელი", group: "Group", host: "მასპინძლის სახელი", port: "პორტი", password: "პაროლი", username: "მომხმარებლის სახელი" } }, treeSettings: { maxValueDisplay: "მაქსიმალური მნიშვნელობის ჩვენების სტრიქონის სიგრძე", maxValueDisplayInfo: "თუ დაყენებულია 0-ზე, აჩვენეთ სრული მნიშვნელობები. თუ 0-ზე მეტია, შეკვეცეთ ამ სიგრძეზე. თუ -1: სტრიქონებისთვის დამალეთ მნიშვნელობა რედაქტირებამდე; სხვა ტიპებისთვის, სრული შინაარსის ჩვენება.", maxKeys: "გასაღების მაქსიმალური რაოდენობა", maxKeysInfo: "იმისათვის, რომ GUI არ დაირღვეს, ჩვენ ვზღუდავთ გასაღების მაქსიმალურ რაოდენობას.", keyCount: () => { return `გასაღებების რაოდენობა: ${p3xr.state.keysRaw.length}`; }, label: { animation: "გამოიყენეთ ანიმაცია", noAnimation: "არავითარი ანიმაცია", jsonFormatTwoSpace: "ფორმატირება JSON 2 ინტერვალით", jsonFormatFourSpace: "ფორმატირება JSON 4 ინტერვალით", formName: "Redis პარამეტრები", searchModeClient: "კლიენტის ძიების რეჟიმი", searchModeServer: "სერვერის ძიების რეჟიმი", searchModeStartsWith: "ძებნა იწყება რეჟიმით", searchModeIncludes: "ძებნა მოიცავს რეჟიმს" }, field: { treeSeparator: "ხეების გამყოფი", treeSeparatorSelector: "ხეების გამყოფის სელექტორი", page: "ხეების პეიჯინგის რაოდენობა", keyPageCount: "საკვანძო პეიჯინგის რაოდენობა", keysSort: "დაალაგეთ გასაღებები", searchMode: "ძიების რეჟიმი", searchModeStartsWith: "ძებნა იწყება / მოიცავს" }, error: { keyPageCount: "საკვანძო გვერდების რაოდენობა უნდა იყოს მთელი რიცხვი 5-დან 100-მდე", page: "გვერდების რაოდენობა უნდა იყოს მთელი რიცხვი 10-დან 5000-მდე", maxValueDisplay: "მაქსიმალური ჩვენების მნიშვნელობა უნდა იყოს მთელი რიცხვი -1-დან 32768-მდე", maxKeys: "გასაღების დათვლის მაქსიმალური მნიშვნელობა უნდა იყოს მთელი რიცხვი 100-დან 100000-მდე" } }, key: { label: { formName: { add: "დაამატეთ ახალი Redis გასაღები", edit: "Redis კლავიშის რედაქტირება", append: "დაამატეთ არსებულ Redis გასაღებს" } }, field: { streamTimestamp: "დროის შტამპი", key: "გასაღები", type: "ტიპი", index: "ინდექსი", hashKey: "ჰეშის გასაღები", score: "ქულა", value: "��ირებულება" }, error: { streamTimestamp: "დროის ანაბეჭდი საჭიროა, ან Redis ფორმატში ან როგორც *", key: "მთავარი მაინც ერთი პერსონაჟია", hashKey: "ჰეშის ცხრილის გასაღები არის მინიმუმ ერთი სიმბოლო", score: "საჭიროა დალაგებული ნაკრების ქულა", value: "ღირებულება აუცილებელია" } }, main: { label: { database: "DB" } } }, page: { search: { title: "ძიeba", index: "ინdelays", query: "მoთxovna", results: "შედეgebi", noIndex: "ინdelays", createIndex: "ინdelays", dropIndex: "ინdelays", indexInfo: "ინdelays", indexName: "ინdelays", prefix: "ინdelays", fieldName: "ინdelays", }, monitor: { title: "მონიტორინგი", memory: "მეხსიერება", opsPerSec: "ოპერაცია/წმ", clients: "კლიენტები", blocked: "დაბლოკილი", hitsMisses: "მოხვედრის სიხშირე", networkIo: "ქსელი I/O", slowLog: "ნელი ჟურნალი", totalCommands: "სულ", expired: "ვადაგასული", evicted: "გამოძevebuli", clientList: "კლიენტების სია", topKeys: "უდიდესი გასაღebebi", killClient: "კლიენტის გაchერeba", clientKilled: "კლიენტი გაchერda", confirmKillClient: "დარწმუნebuli ხართ კლიენტის შეჩerebashi?", noKeys: "გასაღebebi არ არის", noClients: "კლიენტebi არ არის", }, overview: { noConnected: "არ არის კავშირი Redis-თან.", overviewClients: "ჩამოთვალეთ დაკავშირებული კლიენტები��� რაოდენობის მიხედვით", connectedCount: opt => { if (opt.length === 1) { return "1 კლიენტი"; } return `${opt.length} კლიენტებს`; } }, key: { label: { key: "გასაღები", encoding: "კოდირება", length: "ზომა", ttl: "TTL", ttlTitle: "დროა ვიცხოვროთ", type: "ტიპი", ttlNotExpire: "არ იწურება", lengthString: "ბაიტები", lengthItem: "ნივთები", actions: "მოქმედებები" }, list: { table: { index: "ინდექსი", value: "��ირებულება" } }, hash: { table: { hashkey: "ჰეშკი", value: "��ირებულება" } }, set: { table: { value: "წევრი" } }, zset: { table: { value: "წევრი", score: "ქულა" } }, stream: { table: { timestamp: "დროის ანაბეჭდის ID", field: "ველი", value: "��ირებულება" } } }, treeControls: { settings: "ხის პარამეტრები", expandAll: "გააფართოვეთ ყველა", collapseAll: "ყველა ჩაშალე", search: { search: "ძიება გასაღებებში", clear: "წაშალეთ მიმდინარე ძიება ცარიელის დასაყენებლად", placeholderClient: "მოძებნეთ კლიენტის მხარე", placeholderServer: "მოძებნეთ სერვერის მხარე", info: "კლიენტის მხრიდან ძიება ნიშნავს, რომ იგი ემთხვევა საძიებო შეყვანის ტექსტს. სერვერის მხრიდან ძიება ნიშნავს, რომ ეს არის კლავიშების შაბლონებში ძიება, როგორც *{search-text}*. დიდი საძიებო ნაკრებისთვის, უმჯობესია გამოიყენოთ სერვერის მხრიდან ძებნა. მცირე საძიებო ნაკრებისთვის უმჯობესია გამოიყენოთ კლიენტის მხარის ძიების რეჟიმი." + ` თუ გასაღებების რაოდენობა დასრულდა ${p3xr.settings.maxLightKeysCount}, შეგიძლიათ მოძებნოთ მხოლოდ სერვერის მხარეს.`, largeSetInfo: "დიდ კომპლექტში კლიენტის მხრიდან ძებნა გამორთულია. ასე რომ, ახლა შესაძლებელია მხოლოდ სერვერის მხრიდან ძებნა.", infoDetails: "იმის გასარკვევად, თუ როგორ მუშაობს ძებნა, გთხოვთ, გადახედოთ პარამეტრებს" }, pager: { next: "შემდეგი", prev: "წინა", first: "პირველი", last: "ბოლო" } } }, time: { loading: "იტvirtheba...", years: "წლები", months: "თვეების", days: "დღეები", year: "წელიწადი", month: "თვე", day: "დღე" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/kk/000077500000000000000000000000001517666434100137605ustar00rootroot00000000000000src/strings/kk/strings.js000066400000000000000000001074361517666434100160220ustar00rootroot00000000000000const strings = { error: { cleared_license: "Тазартылған лицензия", invalid_license: "Жарамсыз лицензия", license_max_devices_reached: "Құрылғыдағы максималды орындарға жетті", license_readonly: "Лицензияны тек сервер терминалынан өзгертуге болады.", server_error: "Сервер қатесі, әрекетті қайталаңыз" }, title: { donate: "Садақа беру", jsonRecursive: "Барлық жапырақтарды кеңейту", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Төменгі сол жақ мәзірден қосылу үшін Redis қосылымын таңдауға болады.", statistics: "Статистика", error: "Қате", connectingRedis: "Redis қосылуда ...", socketioConnectError: "Socket.IO қ��тесі", db: "DB", server: "Сервер", clients: "Клиенттер", memory: "Жад", persistence: "Табандылық", stats: "Статистика", replication: "Репликация", cpu: "CPU", cluster: "Cluster", modules: "Модульдер", errorstats: "Қate статistикасы", commandstats: "Команда статistикасы", latencystats: "Кідіріс статistикасы", keysizes: "Кілт өлшемдері", threads: "Ағындар", }, confirm: { dropIndex: "Бұл индексті жоюға сенімдісіз бе?", uploadBuffer: "Бұл екілік деректерді жүктеп салуға сенімдісіз бе?", uploadBufferDone: "Екілік деректер жүктеледі", uploadBufferDoneAndSave: "Екілік деректер серверде жүктеледі және сақталады", title: "Растау", alert: "Ескерту", info: "Ақпарат", deleteListItem: "Бұл тізім элементін жоюға сенімдісіз бе?", deleteHashKey: "Осы хэш кілтін жоюға сенімдісіз бе?", deleteStreamTimestamp: "Бұл трансляция уақыт белгісін шынымен жою керек пе?", deleteSetMember: "Осы жиын мүшесін шынымен жою керек пе?", deleteZSetMember: "Осы сұрыпталған жиын мүшесін шынымен жою керек пе?", deleteConnection: "Растау", deleteConnectionText: "Осы Redis қосылымын жойғыңыз келетініне сенімдісіз бе?", deleteNode: "Осы Redis түйінін жоюға сенімдісіз бе?", deleteAllKeys: opts => { return `Осы ағашты және оның барлық кілттерін жойыңыз (${opts.key})?`; }, socketioConnectError: "Socket.IO серверге қосыла алмайды, сіз қайта жүктеп, қосылым қатесін өзіңіз шеше аласыз, клиент оны қалай шешу керектігін білмейді.", socketioAuthRequired: "Socket.IO авторизациясы қажет. HTTP Basic Auth (пайдаланушы аты/құпия сөз) көмегімен аутентификациядан өтіп, қайта жүктеңіз.", deleteKey: "Бұл кілтті шынымен жоясыз ба?", rename: { title: "Бұл кілттің атын өзгерту керек пе?", textContent: "Бұл әрекет кілттің атын біржола өзгертеді.", placeholder: "Redis кілті (міндетті)" }, ttl: { title: "Осы кілттің TTL өзгерткіңіз келетініне сенімдісіз бе?", textContent: "TTL өзгерту бұл кілттің өмір сүру уақытын жаңартады. Бұл кілтті мәңгі сақтау үшін бос қалдырыңыз.", placeholder: "Redis кілтінің TTL (бүтін немесе бос)", placeholderPlaceholder: "Бос бұл мәңгілік сақталады дегенді білдіреді; әйтпесе бүтін санды енгізіңіз.", convertTextToTime: "Мәтінді уақытқа түрлендіру", convertTextToTimePlaceholder: "Мысалы. 1d 86400 болады" }, license: { title: "Лицензияны орнату", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Лицензия кілті" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Көшір��", downloadBuffer: "Екілік файлды жүктеп алыңыз", setBuffer: "Екілік файлды жүктеп салу", exportKeys: "Кілттерді экспорттау", exportAllKeys: (opts) => `Барлық ${opts.count} кілтті экспорттау`, exportSearchResults: (opts) => `${opts.count} нәтижені экспорттау`, importKeys: "Кілттерді импорттау", saveWithFormatJson: "Пішіммен сақтау", formatJson: "Json пішімі", wrap: "Орау", unwrap: "Орамды ашу", downloadJson: "JSON жүктеп алыңыз", pubsubMonitor: "PubSub Монитор", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Тіл", ok: "Жарайды", addKey: "Осы кілтке қосыңыз", addKeyRoot: "Түбірлік кілтті қосыңыз", reloadKey: "Қайта жүктеу кілті", reload: "Қайта жүктеңіз", close: "Жабу", commands: "Командалар", view: "Көру", statistics: "Статистика", refresh: "Жаңарту", pause: "Үзіліс", resume: "Жалғастыру", clear: "Таза", rename: "Атын өзгерту", main: "Дерекқор", cancel: "Болдырмау", theme: "Тақырып", github: "GitHub", githubRepo: "Репозиторий", githubRelease: "Шығарылымдар", githubChangelog: "Өзгеріс журналы", info: "Info", settings: "Параметрлер", connect: "Қосылу", disconnect: "Ажырату", overview: "Шолу", console: "Консоль", noConnections: "Қосылымд��р жоқ, қосылымды параметрлер мәзірінде қосыңыз.", noConnectionsInSettings: "Қосылымдар жоқ, жоғарыдан ЖАҢА ҚОСЫЛЫМ қосуға болады.", connectionAdd: "Жаңа байланыс", addGroup: "Топ қосу", extend: "Ұзарту", collapse: "Жыйрату", add: "қосу", edit: "Өңдеу", save: "Сақтау", ttl: "TTL орнатыңыз", license: "Лицензияны орнату", delete: "Жою", remove: "Жою", sure: "Әрине", testConnection: "Сынақ қосылымы", getKey: "Redis кілті мен байланысты деректер жүктелуде ...", jsonViewShow: "JSON дисплейі", jsonViewEditor: "JSON өңдеу", quickConsole: "Жылдам консоль", }, label: { id: { nodeId: "Түйін идентификаторы", id: "Қосылым идентификаторы", info: "Мыналардың сипаттарын өзгерткіңіз келмесе: sshPassword, sshPrivateKey, құпия сөз, tlsCrt, tlsKey, tlsCa, сипат мәндерін өзгеріссіз сақтау үшін осы сипаттарға қосылым идентификаторын енгізіңіз. Түйін құпия сөзінде бірдей логиканы қаласаңыз, түйін құпия сөзіне түйін идентификаторын енгізіңіз." }, secureFeature: "P3X-тен басталатын мәнді көрсеңіз, ұқсайды, ол қауіпсіз мүмкіндік болып табылады. Параметрлерді өзгерту үшін бұл параметрлерді бос немесе басқа нәрсемен ауыстырыңыз, сонда олар сақталады. Параметрлерді өзгертпесеңіз, параметрлер сервердегідей сақталады.", ssh: { on: "SSH қосулы", off: "SSH өшірулі", sshHost: "SSH Хост", sshPort: "SSH порты", sshUsername: "SSH пайдаланушы аты", sshPassword: "SSH құпия сөз", sshPrivateKey: "SSH жеке кілт" }, isBuffer: opts => `[object ArrayBuffer] мәннің екілік деректер екенін немесе мәннің одан үлкен екенін білдіреді ${opts.maxValueAsBuffer}`, streamValue: `Ағын өрісі мен мәні - бір сызық. Мысалы: өріс1 мән1 "өріс 2" "2 мән"`, streamTimestampId: `'*' автоматты түрде жасалған немесе - ретінде сипаттаманы білдіреді`, unableToLoadKey: ({ key }) => { return `Бұл кілтті жүктеу мүмкін емес: ${key}. Мүмкін, кілт жойылған. Нақты қате консольде.`; }, bigJson: "Бұл JSON нысаны 10 кб-тан жоғары, сондықт��н не істеп жатқаныңызды білетініңізге көз жеткізіңіз, себебі кейбір функциялар баяу көрсетуі мүмкін.", addNode: "Түйін қосу", validateJson: "JSON растау", reducedFunction: `Қысқартылған функционалдылық`, tooManyKeys: opts => { return `Толық максималды функциялар үшін рұқсат етілген пернелердің жалпы саны ${opts.maxLightKeysCount} санау. Бұл дерекқорда жалпы рұқсат етілген кілттер бар ${opts.count}. Кілттерді сұрыптау және қосымша сәнді ағаш ақпараты өшірілген. Іздеу клиентті іздеудің орнына серверде ғана орындалады.`; }, redisCommandNotFound: "Redis пәрмен сәйкестігі табылмады ...", treeKeyStore: `Сұрыптау (табиғи салыстыру) кли��нтте, яғни браузерде орындалады, яғни 10 мыңнан астам кілттер сияқты үлкен үлкен жиынтықтар үшін айыппұл бар дегенді білдіреді, ол бетті көрсетуге аз уақыт қосуы мүмкін. Redis ішінде кілт сұрыптау жоқ, тек осылай.`, socketIoTimeout: options => { return `Socket.IO осы сұрау үшін уақыт бітті (макс ${options.timeout / 1000} секунд)...`; }, resizerInfo: options => { return `Сол немесе оң панельдің ең төменгі ені ${options.width}px`; }, jsonViewNotParsable: "Бұл мән JSON талдауға жатпайды ", ttlTitle: "TTL секундтарда орнатыңыз", passwordSecure: "Құпия сөз бос болуы мүмкін, бірақ ол әлі де таңбаларды көрсетеді, бұл қауіпсіздік мүмкіндігі.", tlsWithoutCert: "Қосымша сертификатсыз TLS қосыңыз", tlsRejectUnauthorized: "Рұқсат етілмеген сертификаттан бас тарту", tlsSecure: "P3X-тен басталатын TLS конфигурациясын көрсеңіз немесе барлық TLS параметрлері бірдей көрінсе, бұл қауіпсіз мүмкіндік болып табылады. Параметрлерді өзгерту үшін бұл параметрлерді бос немесе басқа нәрсемен ауыстырыңыз, сонда олар сақталады. TLS параметрлерін өзгертпесеңіз, параметрлер сервердегідей сақталады.", treeSeparatorEmpty: "Ағаш бөлгіш бос болса, ағаштың кірістірілген түйіндері болмайды, тек таза тізім болады", treeSeparatorEmptyNote: "Кірістірілген түйіндер жоқ, тек таза тізім", welcomeConsole: "Redis консоліне қош келдіңіз", welcomeConsoleInfo: "Жүгіргіні ЖОҒАРЫ немесе ТӨМЕН журналы қосулы", redisListIndexInfo: "Қосу үшін бос, алдына қо�� немесе оны көрсетілген орынға сақтау үшін -1.", console: "Консоль", connectiondAdd: "Қосылым қосыңыз", connectiondEdit: "Қосылымды өңдеу", connectiondView: "Қосылымды көру", connections: "Қосылымдар", licenseInfo: "Лицензия", licenseEditable: "Лицензия өңделеді", licenseEditableYes: "Иә", licenseEditableNo: "Жоқ", licenseTerminalOnly: "Лицензияны тек сервер терминалынан конфигурациялауға болады.", licenseTierPolicyTitle: "Деңгейлік саясат", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "Мемлекет", licenseStateActive: "Белсенді", licenseStateInactive: "Белсенді емес", licenseStateNoLicense: "Лицензия жоқ", licenseKeyMasked: "Сақталған кілт", licenseTier: "Деңгей", licenseValid: "Жарамды", licenseStatus: "Лицензия күйі", licenseReason: "Себеп", licenseCheckedAt: "Тексерілді", licenseStartsAt: "басталады", licenseExpiresAt: "Мерзімі аяқталады", licenseDaysLeft: "Күндер қалды", licenseMaxDevices: "Максималды құрылғылар", licenseActiveDevices: "Белсенді құрылғылар", licenseActiveDevicesInfo: "Құрылғы бұдан былай пайдаланылмаса, оның орны 75 минуттан кейін автоматты түрде босатылады.", licenseCustomerEmail: "Тұтынушының электрондық поштасы", licenseFeatures: "Ерекшеліктер", licenseFeaturesEmpty: "Қосымша мүмкіндіктер жоқ", licenseFeatureReadonlyMode: "Тек оқуға арналған қосылым режимі", licenseFeatureReadonlyConnectionsFlag: "Тек оқуға арналған қосылымдар (--readonly-connections/-r)", licenseFeatureSsh: "SSH туннельдеу", licenseFeatureCluster: "Cluster қосылымдары", licenseFeatureSentinel: "Sentinel қосылымдары", licenseFeatureReJSON: "ReJSON (JSON деректер түрі)", keysSort: { on: "Кілтті сұрыптау қосулы", off: "Кілтті сұрыптау" }, cluster: { on: "Cluster қосулы", off: "Cluster өшірулі" }, sentinel: { on: "Sentinel қосулы", off: "Sentinel өшірулі", name: "Sentinel атауы" }, readonly: { on: "Тек оқуға арналған", off: "Тек оқу үшін өшірулі" }, proSshOnly: "SSH Pro немесе Enterprise нұсқаларында қол жетімді.", proReadonlyOnly: "Тек оқуға арналған қосылым режимі Pro немесе Enterprise жүйесінде қолжетімді.", enterpriseClusterSentinelOnly: "Cluster және Sentinel тек Enterprise жүйесінде қолжетімді.", theme: { light: "Жарық", dark: "Қараңғы кәсіпорын", darkNeu: "Қараңғы", darkoBluo: "Darko blue", enterprise: "Кәсіпорын", redis: "Redis", matrix: "Матрица" }, connected: opts => { return `Қосылды: ${opts.name}`; }, tree: "Ағаш", askAuth: "Рұқсат сұраңыз", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Модульдер", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Ажырату", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Командалары", ungrouped: "Топсыз", grouped: "Grouped", connectFirst: "Алдымен Redis серверіне қосылыңыз", searchLanguage: "Тілді іздеу...", exportProgress: "Кілттер экспортталуда...", importProgress: "Кілттер импортталуда...", importPreview: "Алдын ала қарау", importOverwrite: "Қайта жазу", importSkip: "Өткізіп жіберу", importConflict: "Кілт бұрыннан бар болса:", noKeysToExport: "Экспорттайтын кілттер жоқ", time: "Уақыт", loading: "Жүктелуде...", autoRefresh: "Авто", exportSearchHint: "Тек ағымдағы іздеуге сәйкес кілттер экспортталады", importSearchHint: "Импорт іздеу нәтижелеріне ғана емес, бүкіл дерекқорға қолданылады", importNoKeys: "Файлдан кілттер табылмады", }, status: { dataCopied: "Деректер алмасу буферінде", licenseSaved: "Лицензия сақталды", exportDone: "Экспорт аяқталды", indexCreated: "Индекс жасалды", indexDropped: "Индекс жойылды", importDone: (opts) => `Импорт аяқталды: ${opts.created} жасалды, ${opts.skipped} өткізілді, ${opts.errors} қате`, nodeRemoved: "Түйін жойылды", keyIsNotExisting: "Бұл кілт жойылған немесе мерзімі өткен болуы мүмкін.", keyCount: opts => { if (opts.keyCount === 0) { return "Кілт жоқ"; } else if (opts.keyCount === 1) { return "1 кілт"; } else { return `${opts.keyCount} пернелер`; } }, treeExpandAll: "Барлық ағаш жапырақтарын кеңейтіңіз. Бұл операция қымбат болуы мүмкін және уақыт алуы мүмкін ...", noRedisKeys: "Бұл дерекқорда кілттер жоқ.", redisConnected: "Redis сәтті қосылды", reloadingDataInfo: "Redis деректер ақпараты қайта жүктелуде", added: "Қосылды", saved: "Жаңартылған", cancelled: "Бас тартылды", deleted: "Жойылды", savedRedis: "Redis деректері сақталады", redisDisconnected: opts => { return `Ағымдағы қосылымда қате болды: ${opts.error.message}`; }, dbChanged: opts => { return `db индексі орнатылды ${opts.db}. `; }, treeDeleted: opts => { return `Ағаш кілті жойылды (${opts.key}).`; }, deletedKey: opts => { return `Кілт жойылды (${opts.key}).`; }, renamedKey: "Бұл кілттің атауы өзгертілді", ttlChanged: "Бұл кілттің TTL өзгертілді", notInteger: "Бұл кіріс бүтін сан емес", persisted: "Бұл кілт мәңгі сақталады", set: "Кілт орнатылған/қосылған" }, code: { "delete-connection": "Бұл қосылым жойылды, сондықтан сіз осы Redis данасына ажыратылдыңыз.", "save-connection": "Бұл қосылым өзгертілді, сондықтан сіз осы Redis данасына ажыратылдыңыз. Сіз қайта қосыла аласыз.", "readonly-connections": "Қосылымдар қосу/сақтау/жою тек оқуға арналған!", "readonly-connection-mode": "Бұл қосылым тек оқуға арналған режим!", "list-out-of-bounds": "Бұл тізім индексі шектен тыс", "donation-ware-feature": "Бұл мүмкіндік қайырымдылық нұсқасында бар.", "feature-pro-readonly-required": "Тек оқуға арналған қосылым режимі Pro немесе Enterprise лицензиясын қажет етеді.", "feature-pro-ssh-required": "SSH туннельдеу үшін Pro немесе Enterprise лицензиясы қажет.", "feature-enterprise-cluster-sentinel-required": "Cluster және Sentinel Кәсіпорын лицензиясын қажет етеді.", "feature-pro-json-binary-required": "JSON өңдеу, екілік жүктеу және екілік жүктеу Pro немесе Enterprise лицензиясын қажет етеді.", "feature-pro-rejson-required": "ReJSON (JSON деректер түрі) Pro немесе Enterprise лицензиясын қажет етеді.", "invalid-json-value": "Мән жарамсыз JSON.", "http_auth_required": "Авторизация қажет: HTTP Basic Auth көмегімен аутентификациядан өтіп, қайта жүктеңіз.", "auto-connection-failed": "Мүмкін, осыған байланысты қосылым жойылды және автоматты қосылым сәтсіз аяқталды.", invalid_console_command: "Бұл пәрмен GUI арқылы жұмыс істемейді." }, licenseReason: { LICENSE_VALID: "Лицензия жарамды", LICENSE_INVALID: "Лицензия жарамсыз", LICENSE_MISSING: "Ешқандай лицензия кілті орнатылмаған", LICENSE_DISABLED: "Лицензия сервер конфигурациясында өшірілген", LICENSE_NOT_FOUND: "Лицензия табылмады", LICENSE_EXPIRED: "Лицензияның мерзімі аяқталды", LICENSE_CLEARED: "Лицензия кілті тазартылды", LICENSE_MAX_DEVICES_REACHED: "Құрылғыдағы максималды орындарға жетті", PRODUCT_MISMATCH: "Лицензия өнімі сәйкес келмейді" }, licenseStatusValue: { active: "Белсенді", deleted: "Жойылды", all: "Барлығы", expired: "Мерзімі бітті", missing: "Жоқ", inactive: "Белсенді емес" }, form: { error: { required: "Міндетті", port: "Порт 1-65535 аралығында", invalid: "Пішін жарамсыз" }, connection: { label: { name: "Аты", group: "Group", host: "Хост атауы", port: "Порт", password: "Құпия сөз", username: "Пайдаланушы аты" } }, treeSettings: { maxValueDisplay: "Максималды мәнді көрсету жолының ұзындығы", maxValueDisplayInfo: "0 мәніне орнатылса, толық мәндерді көрсетіңіз. 0-ден үлкен болса, осы ұзындыққа дейін қысқартыңыз. Егер -1: жолдар үшін өңдеуге дейін мәнді жасырыңыз; басқа түрлер үшін толық мазмұнды көрсетіңіз.", maxKeys: "Максималды кілттер саны", maxKeysInfo: "GUI бұзылып қалмауы үшін біз кілттердің максималды санын шектейміз.", keyCount: () => { return `Кілттер саны: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Анимацияны қолданыңыз", noAnimation: "Анимация жоқ", jsonFormatTwoSpace: "JSON пішімі 2 бос орынмен", jsonFormatFourSpace: "JSON пішімі 4 бос орынмен", formName: "Redis параметрлері", searchModeClient: "Клиент іздеу режимі", searchModeServer: "Серверді іздеу режимі", searchModeStartsWith: "Режиммен басталатын іздеу", searchModeIncludes: "Іздеу режимін қамтиды" }, field: { treeSeparator: "Ағаш бөлгіш", treeSeparatorSelector: "Ағаш бөлгіш селекторы", page: "Ағаш пейджинг саны", keyPageCount: "Негізгі пейджинг саны", keysSort: "Кілттерді сұрыптаңыз", searchMode: "Іздеу режимі", searchModeStartsWith: "Іздеу / қамтиды" }, error: { keyPageCount: "Негізгі беттер саны 5 - 100 аралығындағы бүтін сан болуы керек", page: "Бет саны 10 - 5000 аралығындағы бүтін сан болуы керек", maxValueDisplay: "Ең үлкен дисплей мәні -1 мен 32768 арасындағы бүтін сан болуы керек", maxKeys: "Кілттерді санаудың ең үлкен мәні 100 мен 100000 арасындағы бүтін сан болуы керек" } }, key: { label: { formName: { add: "Жаңа Redis кілтін қосыңыз", edit: "Redis пернесін өңдеу", append: "Бар Redis кілтіне қосыңыз" } }, field: { streamTimestamp: "Уақыт белгісі", key: "Кілт", type: "Түр", index: "Индекс", hashKey: "Хэш кілті", score: "Ұпай", value: "Мән" }, error: { streamTimestamp: "Уақыт белгісі қажет, Redis пішімі немесе * ретінде", key: "Ең бастысы, кем дегенде бір таңба", hashKey: "Хэш кестесінің кілті кемінде бір таңбадан тұрады", score: "Сұрыпталған жиынтық ұпай қажет", value: "Мән қажет" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Іздеу", index: "Индекс", query: "Сұраныс", results: "Нәтижелер", noIndex: "Индекстер табылмады", createIndex: "Индекс жасау", dropIndex: "Индексті жою", indexInfo: "Индекс ақпараты", indexName: "Индекс атауы", prefix: "Кілт префиксі (міндетті емес)", fieldName: "Өріс атауы", }, monitor: { title: "Мониторинг", memory: "Жады", opsPerSec: "Операция/сек", clients: "Клиенттер", blocked: "Бұғатталған", hitsMisses: "Тиімділік", networkIo: "Желі I/O", slowLog: "Баяу журнал", totalCommands: "Барлығы", expired: "Мерзімі біткен", evicted: "Шығарылған", clientList: "Клиенттер тізімі", topKeys: "Жады бойынша ең үлкен кілттер", killClient: "Клиентті тоқтату", clientKilled: "Клиент тоқтатылды", confirmKillClient: "Бұл клиентті тоқтатуға сенімдісіз бе?", noKeys: "Кілттер жоқ", noClients: "Клиенттер жоқ", }, overview: { noConnected: "Redis қосылымы жоқ.", overviewClients: "Клиенттер саны бойынша қосылғандарды тізімдеңіз", connectedCount: opt => { if (opt.length === 1) { return "1 клиент"; } return `${opt.length} клиенттер`; } }, key: { label: { key: "Кілт", encoding: "Кодтау", length: "Өлшем", ttl: "TTL", ttlTitle: "Өмір сүру уақыты", type: "Түр", ttlNotExpire: "мерзімі бітпейді", lengthString: "байт", lengthItem: "заттар", actions: "Әрекеттер" }, list: { table: { index: "Индекс", value: "Мән" } }, hash: { table: { hashkey: "Хэшкей", value: "Мән" } }, set: { table: { value: "мүше" } }, zset: { table: { value: "мүше", score: "Ұпай" } }, stream: { table: { timestamp: "Уақыт белгісінің идентификаторы", field: "Өріс", value: "Мән" } } }, treeControls: { settings: "Ағаш параметрлері", expandAll: "Барлығын кеңейту", collapseAll: "Барлығын жинаңыз", search: { search: "Пернелерден іздеңіз", clear: "Бос орнату үшін ағымдағы іздеуді өшіріңіз", placeholderClient: "Клиент жағынан іздеу", placeholderServer: "Сервер жағынан іздеу", info: "Клиенттік іздеу оның іздеу кірісіндегі мәтінге сәйкес келетінін б��лдіреді. Сервер жағынан іздеу дегеніміз, бұл *{search-text}* сияқты пернелер үлгілеріндегі іздеу сияқты. Үлкен іздеу жиындары үшін серверлік іздеуді қолданған дұрыс. Кішірек іздеу жиындары үшін клиенттік іздеу режимін қолданған дұрыс." + ` Егер кілттерді санау аяқталса ${p3xr.settings.maxLightKeysCount}, тек сервер жағынан іздеуге болады.`, largeSetInfo: "Үлкен жиынтықта клиенттік іздеу өшірілген. сондықтан дәл қазір тек сервер жағынан іздеу мүмкін.", infoDetails: "Іздеу қалай жұмыс істейтінін білу үшін параметрлерді тексеріңіз" }, pager: { next: "Келесі", prev: "Алдыңғы", first: "Бірінші", last: "Соңғы" } } }, time: { loading: "Жүктелуде...", years: "жылдар", months: "айлар", days: "күндер", year: "жыл", month: "ай", day: "күні" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/km/000077500000000000000000000000001517666434100137625ustar00rootroot00000000000000src/strings/km/strings.js000066400000000000000000001332371517666434100160220ustar00rootroot00000000000000const strings = { error: { cleared_license: "បាន​លុប​អាជ្ញាប័ណ្ណ", invalid_license: "អាជ្ញាប័ណ្ណមិនត្រឹមត្រូវ", license_max_devices_reached: "បានដល់កៅអីឧបករណ៍អតិបរមា", license_readonly: "អាជ្ញាប័ណ្ណអាចត្រូវបានផ្លាស់ប្តូរតែពីស្ថានីយម៉ាស៊ីនមេប៉ុណ្ណោះ។", server_error: "កំហុសម៉ាស៊ីនមេ សូមព្យាយាមម្តងទៀត" }, title: { donate: "បរិច្ចាគ", jsonRecursive: "ពង្រីកស្លឹកទាំងអស់។", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "អ្នកអាចជ្រើសរើសការភ្ជាប់ Redis ដើម្បីភ្ជាប់ពីម៉ឺនុយខាងក្រោមខាងឆ្វេង។", statistics: "ស្ថិតិ", error: "កំហុស", connectingRedis: "កំពុងភ្ជាប់ទៅ Redis...", socketioConnectError: "កំហុស Socket.IO", db: "DB", server: "ម៉ាស៊ីនមេ", clients: "អតិថិជន", memory: "ការចងចាំ", persistence: "ការតស៊ូ", stats: "ស្ថិតិ", replication: "ការចម្លង", cpu: "CPU", cluster: "Cluster", modules: "modules", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "តើអ្នកពិតជាចង់លុបសន្ទស្សន៍នេះមែនទេ?", uploadBuffer: "តើអ្នកប្រាកដក្នុងការបង្ហោះទិន្នន័យគោលពីរនេះទេ?", uploadBufferDone: "ទិន្នន័យគោលពីរត្រូវបានផ្ទុកឡើង", uploadBufferDoneAndSave: "ទិន្នន័យគោលពីរត្រូវបានផ្ទុកឡើង និងរក្សាទុកនៅលើម៉ាស៊ីនមេ", title: "បញ្ជាក់", alert: "ដាស់តឿន", info: "ព័ត៌មាន", deleteListItem: "តើអ្នកប្រាកដក្នុងការលុបធាតុក្នុងបញ្ជីនេះទេ?", deleteHashKey: "តើ​អ្នក​ប្រាកដ​ក្នុង​ចិត្ត​លុប​ធាតុ​សោ​សញ្ញា​នេះ​ឬ?", deleteStreamTimestamp: "តើ​អ្នក​ប្រាកដ​ក្នុង​ចិត្ត​លុប​ត្រា​ពេល​វេលា​នៃ​ការ​ផ្សាយ​នេះ?", deleteSetMember: "តើអ្នកប្រាកដក្នុងការលុបសមាជិកឈុតនេះទេ?", deleteZSetMember: "តើអ្នកប្រាកដក្នុងការលុបសមាជិកដែលបានតម្រៀបនេះទេ?", deleteConnection: "បញ្ជាក់", deleteConnectionText: "តើអ្នកប្រាកដក្នុងការលុបការតភ្ជាប់ Redis នេះទេ?", deleteNode: "តើអ្នកប្រាកដក្នុងការលុបថ្នាំង Redis នេះទេ?", deleteAllKeys: opts => { return `លុបមែកធាងនេះ និងសោទាំងអស់របស់វា (${opts.key})?`; }, socketioConnectError: "Socket.IO មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេបានទេ អ្នកអាចផ្ទុកឡើងវិញ ហើយព្យាយាមដោះស្រាយកំហុសក្នុងការតភ្ជាប់ដោយខ្លួនឯង អតិថិជនមិនដឹងពីរបៀបដោះស្រាយវាដោយខ្លួនឯងទេ។", socketioAuthRequired: "ការអនុញ្ញាត Socket.IO ត្រូវបានទាមទារ។ សូមផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវជាមួយ HTTP Basic Auth (ឈ្មោះអ្នកប្រើប្រាស់/ពាក្យសម្ងាត់) ហើយផ្ទុកឡើង���ិញ។", deleteKey: "តើអ្នកប្រាកដក្នុងការលុបសោនេះទេ?", rename: { title: "តើអ្នកប្រាកដក្នុងការប្តូរឈ្មោះសោនេះទេ?", textContent: "សកម្មភាពនេះប្តូរឈ្មោះសោជាអចិន្ត្រៃយ៍។", placeholder: "គ្រាប់ចុច Redis (ទាមទារ)" }, ttl: { title: "តើអ្នកប្រាកដថាចង់ផ្លាស់ប្តូរ TTL របស់សោនេះទេ?", textContent: "ការផ្លាស់ប្តូរ TTL ធ្វើបច្ចុប្បន្នភាពពេលវេលារបស់សោនេះដើម្បីរស់នៅ។ ទុក​ទទេ​ដើម្បី​រក្សា​សោ​នេះ​ជា​រៀង​រហូត។", placeholder: "Redis របស់ TTL (ចំនួនគត់ ឬទទេ)", placeholderPlaceholder: "ទទេមានន័យថាវាបន្តជារៀងរហូត; បើមិនដូច្នេះទេ បញ្ចូលចំនួនគត់។", convertTextToTime: "បំលែងអត្ថបទទៅជាពេលវេលា", convertTextToTimePlaceholder: "ឧ. 1d នឹងមាន 86400" }, license: { title: "កំណត់អាជ្ញាប័ណ្ណ", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "លេខកូដអាជ្ញាប័ណ្ណ" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "ចម្លង", downloadBuffer: "ទាញយកប្រព័ន្ធគោលពីរ", setBuffer: "បង្ហោះប្រព័ន្ធគោលពីរ", exportKeys: "នាំចេញសោ", exportAllKeys: (opts) => `នាំចេញសោទាំង ${opts.count}`, exportSearchResults: (opts) => `នាំចេញ ${opts.count} លទ្ធផល`, importKeys: "នាំចូលសោ", saveWithFormatJson: "រក្សាទុកជាមួយទម្រង់", formatJson: "ទម្រង់ Json", wrap: "រុំ", unwrap: "ដោះរុំ", downloadJson: "ទាញយក JSON", pubsubMonitor: "ម៉ូនីទ័រ PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "ភាសា", ok: "យល់ព្រម", addKey: "បន្ថែមទៅគន្លឹះនេះ។", addKeyRoot: "បន្ថែមសោជា root", reloadKey: "ផ្ទុកគ្រាប់ចុចឡើងវិញ", reload: "ផ្ទុកឡើងវិញ", close: "បិទ", commands: "ពាក្យបញ្ជា", view: "មើល", statistics: "ស្ថិតិ", refresh: "ធ្វើឱ្យស្រស់", pause: "ផ្អាក", resume: "បន្ត", clear: "ច្បាស់", rename: "ប្តូរឈ្មោះ", main: "មូលដ្ឋានទិន្នន័យ", cancel: "��ោះបង់", theme: "ប្រធានបទ", github: "GitHub", githubRepo: "ឃ្លាំង", githubRelease: "ការចេញផ្សាយ", githubChangelog: "កំណត់ហេតុផ្លាស់ប្តូរ", info: "Info", settings: "ការកំណត់", connect: "ភ្ជាប់", disconnect: "ផ្តាច់", overview: "ទិដ្ឋភាពទូទៅ", console: "កុងសូល។", noConnections: "មិនមានការតភ្ជាប់ទេ បន្ថែមការតភ្ជាប់នៅក្នុងម៉ឺនុយការកំណត់។", noConnectionsInSettings: "មិនមានការតភ្ជាប់ទេ អ្នកអាចបន្ថែមការភ្ជាប់ថ្មីខាងលើ។", connectionAdd: "ការតភ្ជាប់ថ្មី។", addGroup: "បន្ថែមក្រុម", extend: "ពង្រីក", collapse: "ដួលរលំ", add: "បន្ថែម", edit: "កែសម្រួល", save: "រក្សាទុក", ttl: "កំណត់ TTL", license: "កំណត់អាជ្ញាប័ណ្ណ", delete: "លុប", remove: "ដកចេញ", sure: "ប្រាកដ", testConnection: "ការភ្ជាប់សាកល្បង", getKey: "កំពុងផ្ទុកគ្រាប់ចុច Redis និងទិន្នន័យដែលពាក់ព័ន្ធ...", jsonViewShow: "បង្ហាញ JSON", jsonViewEditor: "កែសម្រួល JSON", quickConsole: "កុងសូលរហ័ស", }, label: { id: { nodeId: "លេខសម្គាល់ថ្នាំង", id: "លេខសម្គាល់ការតភ្ជាប់", info: "ប្រសិនបើអ្នកមិនចង់ផ្លាស់ប្តូរលក្ខណសម្បត្តិរបស់៖ sshPassword, sshPrivateKey, ពាក្យសម្ងាត់, tlsCrt, tlsKey, tlsCa សូមបញ្ចូលលេខសម្គាល់នៃការតភ្ជាប់នៅក្នុង propertes ទាំងនោះ ដើម្បីរក្សាតម្លៃទ្រព្យសម្បត្តិនៅដដែល។ ប្រសិនបើអ្នកចង់បានតក្កវិជ្ជាដូចគ្នានៅក្នុងពាក្យសម្ងាត់ថ្នាំង បន្ទាប់មកបញ្ចូលល���ខសម្គាល់ថ្នាំងក្នុងពាក្យសម្ងាត់ថ្នាំង។" }, secureFeature: "ប្រសិនបើអ្នកឃើញតម្លៃដែលចាប់ផ្តើមដោយ P3X មើលទៅដូចគ្នា វាគឺជាមុខងារសុវត្ថិភាព។ ដើម្បីផ្លាស់ប្តូរការកំណត់ គ្រាន់តែជំនួសការកំណត់ទាំងនេះដោយទទេ ឬអ្វីផ្សេងទៀត ហើយពួកវានឹងត្រូវបានរក្សាទុក។ ប្រសិនបើអ្នកមិនផ្លាស់ប្តូរការកំណត់ទេ ការកំណត់នឹងត្រូវបានរក្សាទុកដូចដែលពួកវាស្ថិតនៅលើម៉ាស៊ីនមេ។", ssh: { on: "SSH បើក", off: "បិទ SSH", sshHost: "ម៉ាស៊ីន SSH", sshPort: "ច្រក SSH", sshUsername: "ឈ្មោះអ្នកប្រើ SSH", sshPassword: "ពាក្យសម្ងាត់ SSH", sshPrivateKey: "សោឯកជន SSH" }, isBuffer: opts => `[object ArrayBuffer] មានន័យថាតម្លៃគឺជាទិន្នន័យគោលពីរ ឬតម្លៃធំជាង ${opts.maxValueAsBuffer}`, streamValue: `វាលស្ទ្រីម និងតម្លៃគឺជាបន្ទាត់តែមួយ។ ឧ.៖ field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' មាន​ន័យ​ថា​បង្កើត​ដោយ​ស្វ័យ​ប្រវត្តិ ឬ​ការ​បញ្ជាក់​ជា -`, unableToLoadKey: ({ key }) => { return `មិនអាចផ្ទុកសោនេះបានទេ៖ ${key}. អាចទៅរួច សោត្រូវបានលុប។ កំហុសពិតប្រាកដគឺនៅក្នុងកុងសូល។`; }, bigJson: "វត្ថុ JSON នេះមានលើសពី 10 kb ដូច្នេះត្រូវប្រាកដថាអ្នកដឹងពីអ្វីដែលអ្នកកំពុងធ្វើ ពីព្រោះមុខងារមួយចំនួនអាចបង្ហាញយឺត។", addNode: "បន្ថែមថ្នាំង", validateJson: "ធ្វើឱ្យមានសុពលភាព JSON", reducedFunction: `មុខងារកាត់បន្ថយ`, tooManyKeys: opts => { return `សម្រាប់មុខងារអតិបរមាពេញលេញ គ្រាប់ចុចដែលអនុញ្ញាតសរុបគឺ ${opts.maxLightKeysCount} រាប់។ មូលដ្ឋានទិន្នន័យនេះមានលើសពីសោដែលបានអនុញ្ញាតសរុប ${opts.count}. ការតម្រៀបគន្លឹះ និងព័ត៌មានអំពីមែកធាងពុម្ពអក្សរក្បូរក្បាច់បន្ថែមត្រូវបានបិទ។ ការស្វែងរកគឺកើតឡើងតែនៅលើម៉ាស៊ីនមេ ជំនួសឱ្យការស្វែងរកអតិថិជន។`; }, redisCommandNotFound: "រកមិនឃើញពាក្យបញ្ជា Redis ទេ...", treeKeyStore: `ការតម្រៀប (ការប្រៀបធៀបធម្មជាតិ) ត្រូវបានប្រតិបត្តិនៅលើម៉ាស៊ីនភ្ញៀវ aka កម្មវិធីរុករក ដែលមានន័យថាវាមានការផាកពិន័យសម្រាប់ឈុតធំ ៗ ដូចជាគ្រាប់ចុចលើសពី 10k វាអាចបន្ថែមពេលវេលាតិចតួចក្នុងការបង្ហាញទំព័រ។ មិនមានការតម្រៀបគន្លឹះនៅក្នុង Redis ទេ មានតែដូចនេះប៉ុណ្ណោះ។`, socketIoTimeout: options => { return `Socket.IO អស់ពេលសម្រាប់សំណើនេះ (អតិបរមា ${options.timeout / 1000} វិនាទី)...`; }, resizerInfo: options => { return `ទទឹងអប្បបរមាបន្ទះខាងឆ្វេងឬស្តាំគឺ ${options.width}ភីច`; }, jsonViewNotParsable: "តម្លៃនេះមិនអាចញែក JSON បានទេ។ ", ttlTitle: "កំណត់ TTL ជាវិនាទី", passwordSecure: "ពាក្យ​សម្ងាត់​អាច​នឹង​ទទេ ប៉ុន្តែ​នៅ​តែ​វា​នឹង​បង្ហាញ​តួអក្សរ នេះ​ជា​មុខងារ​សុវត្ថិភាព។", tlsWithoutCert: "បើកដំណើរការ TLS ដោយ��្មានវិញ្ញាបនបត្របន្ថែម", tlsRejectUnauthorized: "បដិសេធវិញ្ញាបនបត្រដែលគ្មានការអនុញ្ញាត", tlsSecure: "ប្រសិនបើអ្នកឃើញការកំណត់រចនាសម្ព័ន្ធ TLS ដែលចាប់ផ្តើមដោយ P3X ឬការកំណត់ TLS ទាំងអស់មើលទៅដូចគ្នា វាគឺជាមុខងារសុវត្ថិភាព។ ដើម្បីផ្លាស់ប្តូរការកំណត់ គ្រាន់តែជំនួសការកំណត់ទាំងនេះដោយទទេ ឬអ្វីផ្សេងទៀត ហើយពួកវានឹងត្រូវបានរក្សាទុក។ ប្រសិនបើអ្នកមិនផ្លាស់ប្តូរការកំណត់ TLS ទេ ការកំណត់នឹងត្រូវបានរក្សាទុកដូចដែលពួកវាស្ថិតនៅលើម៉ាស៊ីនមេ។", treeSeparatorEmpty: "ប្រសិនបើធាតុបំបែកមែកធាងគឺទទេ មែកធាងនឹងមិនមានថ្នាំងដែលជាប់គាំងទេ គ្រាន់តែជាបញ្ជីសុទ្ធប៉ុណ្ណោះ។", treeSeparatorEmptyNote: "គ្មាន​ថ្នាំង​ដែល​ជាប់​គ្នា​ទេ គ្រាន់​តែ​ជា​បញ្ជី​សុទ្ធ", welcomeConsole: "សូមស្វាគមន៍មកកាន់កុងសូល Redis", welcomeConsoleInfo: "ប្រវត្តិទស្សន៍ទ្រនិចឡើងលើ ឬចុះក្រោមត្រូវបានបើក", redisListIndexInfo: "ទទេ​ដើម្បី​បន្ថែម -1 ដើម្បី​បន្ថែម ឬ​រក្សាទុក​វា​ទៅ​ទីតាំង​ដែល​បាន​បង្ហាញ។", console: "កុងសូល។", connectiondAdd: "បន្ថែមការតភ្ជាប់", connectiondEdit: "កែសម្រួលការតភ្ជាប់", connectiondView: "មើលការតភ្ជាប់", connections: "ការតភ្ជាប់", licenseInfo: "អាជ្ញាប័ណ្ណ", licenseEditable: "អាជ្ញាប័ណ្ណអាចកែសម្រួលបាន។", licenseEditableYes: "បាទ", licenseEditableNo: "ទេ", licenseTerminalOnly: "អាជ្ញាប័ណ្ណអាចត្រូវបានកំណត់រចនាសម្ព័ន្ធតែពីស្ថានីយម៉ាស៊ីនមេប៉ុណ្ណោះ។", licenseTierPolicyTitle: "គោលនយោបាយថ្នាក់", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "រដ្ឋ", licenseStateActive: "សកម្ម", licenseStateInactive: "អសកម្ម", licenseStateNoLicense: "គ្មានអាជ្ញាប័ណ្ណ", licenseKeyMasked: "កូនសោដែលបានរក្សាទុក", licenseTier: "ថ្នាក់", licenseValid: "មានសុពលភាព", licenseStatus: "ស្ថានភាពអាជ្ញាប័ណ្ណ", licenseReason: "ហេតុផល", licenseCheckedAt: "បានពិនិត្យនៅ", licenseStartsAt: "ចាប់ផ្តើមនៅ", licenseExpiresAt: "ផុតកំណត់នៅ", licenseDaysLeft: "ថ្ងៃនៅសល់", licenseMaxDevices: "ឧបករណ៍អតិបរមា", licenseActiveDevices: "ឧបករណ៍សកម្ម", licenseActiveDevicesInfo: "ប្រសិនបើឧបករណ៍មិនត្រូវបានប្រើទៀតទេ កៅអីរបស់វាត្រូវបានបញ្ចេញដោយស្វ័យប្រវត្តិបន្ទាប់ពី 75 នាទី។", licenseCustomerEmail: "អ៊ីមែលអតិថិជន", licenseFeatures: "លក្ខណៈពិសេស", licenseFeaturesEmpty: "មិនមានមុខងារបន្ថែមទេ។", licenseFeatureReadonlyMode: "របៀបភ្ជាប់បានតែអានប៉ុណ្ណោះ។", licenseFeatureReadonlyConnectionsFlag: "ការតភ្ជាប់បានតែអាន (--readonly-connections/-r)", licenseFeatureSsh: "SSH ផ្លូវរូងក្រោមដី", licenseFeatureCluster: "ការតភ្ជាប់ Cluster", licenseFeatureSentinel: "ការតភ្ជាប់ Sentinel", licenseFeatureReJSON: "ReJSON (ប្រភ��ទទិន្នន័យ JSON)", keysSort: { on: "ការតម្រៀបគ្រាប់ចុចបើក", off: "ការតម្រៀបគ្រាប់ចុចបិទ" }, cluster: { on: "Cluster បើក", off: "បិទ Cluster" }, sentinel: { on: "Sentinel បើក", off: "បិទ Sentinel", name: "ឈ្មោះ Sentinel" }, readonly: { on: "បានតែអានប៉ុណ្ណោះ។", off: "បិទការអានតែប៉ុណ្ណោះ" }, proSshOnly: "SSH មាននៅក្នុង Pro ឬ Enterprise។", proReadonlyOnly: "របៀប​តភ្ជាប់​តែ​អាន​ប៉ុណ្ណោះ​គឺ​មាន​នៅ​ក្នុង Pro ឬ Enterprise។", enterpriseClusterSentinelOnly: "Cluster និង Sentinel មាននៅក្នុងសហគ្រាសតែប៉ុណ្ណោះ។", theme: { light: "ពន្លឺ", dark: "សហគ្រាសងងឹត", darkNeu: "ងងឹត", darkoBluo: "ដាកូប៊្លូ", enterprise: "សហគ្រាស", redis: "Redis", matrix: "ម៉ាទ្រីស" }, connected: opts => { return `បានភ្ជាប់៖ ${opts.name}`; }, tree: "ដើមឈើ", askAuth: "សុំការអនុញ្ញាត", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "modules", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "ផ្តាច់", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis ពាក្យបញ្ជា", ungrouped: "គ្មានក្រុម", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "ស្វែងរកភាសា...", exportProgress: "កំពុងនាំចេញសោ...", importProgress: "កំពុងនាំចូលសោ...", importPreview: "មើលជាមុន", importOverwrite: "សរសេរជំនួស", importSkip: "រំលង", importConflict: "ប្រសិនបើសោមានរួចហើយ:", noKeysToExport: "គ្មានសោដើម្បីនាំចេញ", time: "ពេលវេលា", loading: "កំពុងផ្ទុក...", autoRefresh: "ស្វ័យប្រវត្តិ", exportSearchHint: "នាំចេញតែសោដែលផ្គូផ្គងនឹងការស្វែងរកបច្ចុប្បន្ន", importSearchHint: "ការនាំចូលអនុវត្តចំពោះមូលដ្ឋានទិន្នន័យទាំងមូល មិនមែនតែលទ្ធផលស្វែងរកទេ", importNoKeys: "រកមិនឃើញសោក្នុងឯកសារ", }, status: { dataCopied: "ទិន្នន័យគឺនៅក្នុងក្ដារតម្បៀតខ្ទាស់", licenseSaved: "បានរក្សាទុកអាជ្ញាប័ណ្ណ", exportDone: "ការនាំចេញបានបញ្ចប់", indexCreated: "បង្កើតសន្ទស្សន៍រួចរាល់", indexDropped: "លុបសន្ទស្សន៍រួចរាល់", importDone: (opts) => `ការនាំចូលបានបញ្ចប់: ${opts.created} បង្កើត, ${opts.skipped} រំលង, ${opts.errors} កំហុស`, nodeRemoved: "ថ្នាំងត្រូវបានដកចេញ", keyIsNotExisting: "សោនេះអាចត្រូវបានលុប ឬផុតកំណត់។", keyCount: opts => { if (opts.keyCount === 0) { return "គ្មានសោ"; } else if (opts.keyCount === 1) { return "កូនសោ 1"; } else { return `${opts.keyCount} សោ`; } }, treeExpandAll: "ពង្រីកស្លឹកឈើទាំងអស់។ ប្រតិបត្តិការនេះអាចមានតម្លៃថ្លៃ ហើយអាចចំណាយពេល...", noRedisKeys: "មិនមានសោនៅក្នុងមូលដ្ឋានទិន្នន័យនេះទេ។", redisConnected: "ការតភ្ជាប់ Redis បានជោគជ័យ", reloadingDataInfo: "កំពុងផ្ទុកព័ត៌មានទិន្នន័យ Redis ឡើងវិញ", added: "បន្ថែម", saved: "បានធ្វើបច្ចុប្បន្នភាព", cancelled: "បានលុបចោល", deleted: "បានលុប", savedRedis: "ទិន្នន័យ Redis ត្រូវបានរក្សាទុក", redisDisconnected: opts => { return `ការតភ្ជាប់បច្ចុប្បន្នមានកំហុស៖ ${opts.error.message}`; }, dbChanged: opts => { return `សន្ទស្សន៍ db ត្រូវបានកំណត់ទៅ ${opts.db}. `; }, treeDeleted: opts => { return `សោមែកធាងត្រូវបានលុប (${opts.key})`; }, deletedKey: opts => { return `សោត្រូវបានលុប (${opts.key})`; }, renamedKey: "សោនេះត្រូវបានប្តូរឈ្មោះ", ttlChanged: "TTL របស់សោនេះត្រូវបានផ្លាស់ប្តូរ", notInteger: "ការបញ្ចូលនេះមិនមែនជាចំនួនគត់ទេ។", persisted: "គន្លឹះ​នេះ​ស្ថិត​នៅ​ជា​រៀង​រហូត", set: "គ្រាប់ចុចត្រូវបានកំណត់ / បន្ថែម" }, code: { "delete-connection": "ការ​តភ្ជាប់​នេះ​ត្រូវ​បាន​លុប ដូច្នេះ​អ្នក​ត្រូវ​បាន​ផ្ដាច់​ទៅ​នឹង​ឧទាហរណ៍ Redis នេះ។", "save-connection": "ការ​តភ្ជាប់​នេះ​ត្រូវ​បាន​ផ្លាស់​ប្តូ​រ ដូច្នេះ​អ្នក​ត្រូវ​បាន​ផ្ដាច់​ទៅ​នឹង​ឧទាហរណ៍ Redis នេះ។ អ្នកអាចភ្ជាប់ឡើងវិញបាន។", "readonly-connections": "ការតភ្ជាប់បន្ថែម / រក្សាទុក / លុបគឺបានតែអាន!", "readonly-connection-mode": "ការតភ្ជាប់នេះគ្រាន់តែជារបៀបអានប៉ុណ្ណោះ!", "list-out-of-bounds": "លិបិក្រមបញ្ជីនេះគឺហួសព្រំដែន", "donation-ware-feature": "មុខងារនេះមាននៅក្នុងកំណែបរិច្ចាគ។", "feature-pro-readonly-required": "របៀបភ្ជាប់បានតែអានប៉ុណ្ណោះ ទាមទារអាជ្ញាប័ណ្ណ Pro ឬសហគ្រាស។", "feature-pro-ssh-required": "SSH ផ្លូវរូងក្រោមដីទាមទារអាជ្ញាប័ណ្ណ Pro ឬសហគ្រាស។", "feature-enterprise-cluster-sentinel-required": "Cluster និង Sentinel ទាមទារអាជ្ញាប័ណ្ណសហគ្រាស។", "feature-pro-json-binary-required": "កែសម្រួល JSON បង្ហោះប្រព័ន្ធគោលពីរ និងទាញយកប្រព័ន្ធគោលពីរ ទាមទារអាជ្ញាប័ណ្ណ Pro ឬសហគ្រាស។", "feature-pro-rejson-required": "ReJSON (ប្រភេទទិន្នន័យ JSON) ទាមទារអាជ្ញាប័ណ្ណ Pro ឬសហគ្រាស។", "invalid-json-value": "តម្លៃមិនត្រឹមត្រូវ JSON ។", "http_auth_required": "តម្រូវឱ្យមានការអនុញ្ញាត៖ សូមផ្ទៀងផ្ទាត់ជាមួយ HTTP Basic Auth ហើយផ្ទុកឡើងវិញ។", "auto-connection-failed": "អាចធ្វើទៅបាន ការតភ្ជាប់ត្រូវបានដកចេញ ហើយការភ្ជាប់ដោយស្វ័យប្រវត្តិបានបរាជ័យ ដោយសារបញ្ហានេះ។", invalid_console_command: "ពាក្យបញ្ជានេះមិនដំណើរការតាមរយៈ GUI ទេ។" }, licenseReason: { LICENSE_VALID: "អាជ្ញាប័ណ្ណមានសុពលភាព", LICENSE_INVALID: "អាជ្ញាប័ណ្ណមិនត្រឹមត្រូវទេ��", LICENSE_MISSING: "គ្មាន​លេខ​កូដ​អាជ្ញាប័ណ្ណ​ត្រូវ​បាន​កំណត់", LICENSE_DISABLED: "អាជ្ញាប័ណ្ណត្រូវបានបិទនៅក្នុងការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនមេ", LICENSE_NOT_FOUND: "រកមិនឃើញអាជ្ញាប័ណ្ណទេ។", LICENSE_EXPIRED: "អាជ្ញាប័ណ្ណផុតកំណត់ហើយ។", LICENSE_CLEARED: "សោអាជ្ញាប័ណ្ណត្រូវបានសម្អាត", LICENSE_MAX_DEVICES_REACHED: "បានដល់កៅអីឧបករណ៍អតិបរមា", PRODUCT_MISMATCH: "ផលិតផលអាជ្ញាប័ណ្ណមិនត្រូវគ្នាទេ។" }, licenseStatusValue: { active: "សកម្ម", deleted: "បានលុប", all: "ទាំងអស់។", expired: "��ុតកំណត់", missing: "បាត់", inactive: "អសកម្ម" }, form: { error: { required: "ទាមទារ", port: "ច្រកស្ថិតនៅចន្លោះ 1-65535", invalid: "ទម្រង់​នេះ​មិន​ត្រឹមត្រូវ។" }, connection: { label: { name: "ឈ្មោះ", group: "Group", host: "ឈ្មោះម៉ាស៊ីន", port: "ច្រក", password: "ពាក្យសម្ងាត់", username: "ឈ្មោះអ្នកប្រើប្រាស់" } }, treeSettings: { maxValueDisplay: "តម្លៃអតិបរមាបង្ហាញប្រវែងខ្សែអក្សរ", maxValueDisplayInfo: "ប្រសិនបើកំណត់ទៅ 0 បង្ហាញតម្លៃពេញ។ ប្រសិនបើធំជាង 0 កាត់ឱ្យខ្លីទៅប្រវែងនេះ។ ប្រសិនបើ -1: សម្រាប់ខ្សែអក្សរ លាក់តម្លៃរហូតដល់កែសម្រួល។ សម្រាប់ប្រភេទផ្សេងទៀត បង្ហាញខ្លឹ��សារពេញលេញ។", maxKeys: "ចំនួនគន្លឹះអតិបរមា", maxKeysInfo: "ដូច្នេះ GUI មិនគាំង យើងកំណត់ចំនួនគ្រាប់ចុចអតិបរមា។", keyCount: () => { return `ចំនួនសោ៖ ${p3xr.state.keysRaw.length}`; }, label: { animation: "ប្រើ���លនា", noAnimation: "គ្មានចលនា", jsonFormatTwoSpace: "ធ្វើទ្រង់ទ្រាយ JSON ដែលមាន 2 ដកឃ្លា", jsonFormatFourSpace: "ធ្វើទ្រង់ទ្រាយ JSON ដែលមាន 4 ដកឃ្លា", formName: "ការកំណត់ Redis", searchModeClient: "របៀបស្វែងរកអតិថិជន", searchModeServer: "របៀបស្វែងរកម៉ាស៊ីនមេ", searchModeStartsWith: "ស្វែងរកដោយចាប់ផ្តើមដោយរបៀប", searchModeIncludes: "ការស្វែងរករួមមានរបៀប" }, field: { treeSeparator: "អ្នកបំបែកដើមឈើ", treeSeparatorSelector: "ឧបករណ៍ជ្រើសរើសសញ្ញាបំបែកដើមឈើ", page: "ការរាប់ចំនួនដើមឈើ", keyPageCount: "ចំនួនទំព័រសំខាន់ៗ", keysSort: "តម្រៀបសោ", searchMode: "របៀបស្វែងរក", searchModeStartsWith: "ការស្វែងរកចាប់ផ្តើមដោយ / រួមបញ្ចូល" }, error: { keyPageCount: "ចំនួនទំព័រគន្លឹះត្រូវតែជាចំនួនគត់ចន្លោះពី 5 ទៅ 100", page: "ចំនួនទំព័រត្រូវតែជាចំនួនគត់ចន្លោះពី 10 ទៅ 5000", maxValueDisplay: "តម្លៃបង្ហាញអតិបរមាត្រូវតែជាចំនួនគត់រវាង -1 និង 32768", maxKeys: "តម្លៃរាប់គ្រាប់ចុចអតិបរមាត្រូវតែជាចំនួនគត់ចន្លោះពី 100 ទៅ 100000" } }, key: { label: { formName: { add: "បន្ថែមគ្រាប់ចុច Redis ថ្មី។", edit: "កែសម្រួលគ្រាប់ចុច Redis", append: "បន្ថែមទៅគ្រាប់ចុច Redis ដែលមានស្រាប់" } }, field: { streamTimestamp: "ត្រាពេលវេលា", key: "សោ", type: "ប្រភេទ", index: "សន្ទស្សន៍", hashKey: "គ្រាប់ចុចហាស", score: "ពិន្ទុ", value: "តម្លៃ" }, error: { streamTimestamp: "ត្រាពេលវេលាត្រូវបានទាមទារ ទាំងទម្រង់ Redis ឬជា *", key: "គន្លឹះគឺយ៉ាងហោចណាស់តួអក្សរមួយ។", hashKey: "គ្រាប់ចុចតារាង hash គឺយ៉ាងហោចណាស់មួយតួអក្សរ", score: "ពិន្ទុដែលបានតម្រៀបត្រូវបានទាមទារ", value: "តម្លៃត្រូវបានទាមទារ" } }, main: { label: { database: "DB" } } }, page: { search: { title: "ស្វែងរក", index: "សន្ទស្សន៍", query: "សំណួរ", results: "លទ្ធផល", noIndex: "រកមិនឃើញសន្ទស្សន៍", createIndex: "បង្កើតសន្ទស្សន៍", dropIndex: "លុបសន្ទស្សន៍", indexInfo: "ព័ត៌មានសន្ទស្សន៍", indexName: "ឈ្មោះសន្ទស្សន៍", prefix: "បុព្វបទសោ (ជាជម្រើស)", fieldName: "ឈ្មោះវាល", }, monitor: { title: "ការត្រួតពិនិត្យ", memory: "អង្គចងចាំ", opsPerSec: "ប្រតិបត្តិការ/វិ", clients: "អតិថិជន", blocked: "បានរារាំង", hitsMisses: "អត្រាបម្រើ", networkIo: "បណ្តាញ I/O", slowLog: "កំណត់ហេតុយឺត", totalCommands: "សរុប", expired: "ផុតកំណត់", evicted: "បណ្តេញចេញ", clientList: "បញ្ជីអតិថិជន", topKeys: "សោធំបំផុតតាមអង្គចងចាំ", killClient: "បិទអតិថិជន", clientKilled: "អតិថិជនត្រូវបានបិទ", confirmKillClient: "តើអ្នកពិតជាចង់បិទអតិថិជននេះមែនទេ?", noKeys: "គ្មានសោ", noClients: "គ្មានអតិថិជន", }, overview: { noConnected: "មិនមានទំនាក់ទំនងជាមួយ Redis ទេ។", overviewClients: "រាយបញ្ជីទំនាក់ទំនងដោយចំនួនអតិថិជន", connectedCount: opt => { if (opt.length === 1) { return "អតិថិជន 1 នាក់។"; } return `${opt.length} អតិថិជន`; } }, key: { label: { key: "សោ", encoding: "ការអ៊ិនកូដ", length: "ទំហំ", ttl: "TTL", ttlTitle: "ពេលវេលាដើម្បីរស់នៅ", type: "ប្រភេទ", ttlNotExpire: "មិនផុតកំណត់ទេ។", lengthString: "បៃ", lengthItem: "ធាតុ", actions: "សកម្មភាព" }, list: { table: { index: "សន្ទស្សន៍", value: "តម្លៃ" } }, hash: { table: { hashkey: "ហាស់ឃី", value: "តម្លៃ" } }, set: { table: { value: "សមាជិក" } }, zset: { table: { value: "សមាជិក", score: "ពិន្ទុ" } }, stream: { table: { timestamp: "លេខសម្គាល់ពេលវេលា", field: "វាល", value: "តម្លៃ" } } }, treeControls: { settings: "ការកំណត់ដើមឈើ", expandAll: "ពង្រីកទាំងអស់។", collapseAll: "ដួលរលំទាំងអស់។", search: { search: "ស្វែងរកក្នុងសោ", clear: "សម្អាតការស្វែងរកបច្ចុប្បន្នដើម្បីកំណត់ទទេ", placeholderClient: "ស្វែងរកផ្នែកអតិថិជន", placeholderServer: "ស្វែងរកផ្នែកខាងម៉ាស៊ីនមេ", info: "ការស្វែងរកភាគីអតិថិជនមានន័យថា វាត្រូវគ្នានឹងអត្ថបទនៅក្នុងការបញ្ចូលការស្វែងរក។ ការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេមានន័យថា វាដូចជាការស្វែងរកក្នុងទម្រង់សោជា *{search-text}*។ សម្រាប់សំណុំស្វែងរកធំ វាជាការប្រសើរក្នុងការប្រើការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេ។ សម្រាប់​សំណុំ​ការ​ស្វែងរក​តូច​ជាង​នេះ វា​ជា​ការ​ប្រសើរ​ក្នុង​ការ​ប្រើ​របៀប​ស���វែងរក​ខាង​អតិថិជន។" + ` ប្រសិនបើចំនួនសោត្រូវបានបញ្ចប់ ${p3xr.settings.maxLightKeysCount}អ្នកអាចស្វែងរកតែនៅផ្នែកខាងម៉ាស៊ីនមេប៉ុណ្ណោះ។`, largeSetInfo: "នៅក្នុងសំណុំធំ ការស្វែងរកភាគីអតិថិជនត្រូវបានបិទ។ ដូច្នេះឥឡូវនេះមានតែការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេប៉ុណ្ណោះដែលអាចធ្វើទៅបាន។", infoDetails: "ដើម្បីស្វែងយល់ពីរបៀបដែលការស្វែងរកដំណើរការ សូមពិនិត្យមើលការកំណត់" }, pager: { next: "បន្ទាប់", prev: "មុន", first: "ទីមួយ", last: "ចុងក្រោយ" } } }, time: { loading: "កំពុងផ្ទុក...", years: "ឆ្នាំ", months: "ខែ", days: "ថ្ងៃ", year: "ឆ្នាំ", month: "ខែ", day: "ថ្ងៃ" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ko/000077500000000000000000000000001517666434100137645ustar00rootroot00000000000000src/strings/ko/strings.js000066400000000000000000000725711517666434100160270ustar00rootroot00000000000000const strings = { error: { cleared_license: "허가증 취득", invalid_license: "유효하지 않은 라이센스", license_max_devices_reached: "최대 장치 좌석에 도달했습니다.", license_readonly: "라이센스 변경은 서버 단말기에서만 가능합니다.", server_error: "서버 오류입니다. 다시 시도해 주세요." }, title: { donate: "기부", jsonRecursive: "모든 잎 확장", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "왼쪽 하단 메뉴에서 Redis 연결을 선택하여 연결할 수 있습니다.", statistics: "통계", error: "오류", connectingRedis: "Redis에 연결하는 중...", socketioConnectError: "Socket.IO 오류", db: "DB", server: "서버", clients: "클라이언트", memory: "메모리", persistence: "지속성", stats: "통계", replication: "복제", cpu: "CPU", cluster: "Cluster", modules: "모듈", errorstats: "오류 통계", commandstats: "명령 통계", latencystats: "지연 통계", keysizes: "키 크기", threads: "스레드", }, confirm: { dropIndex: "이 인덱스를 삭제하시겠습니까?", uploadBuffer: "이 바이너��� 데이터를 업로드하시겠습니까?", uploadBufferDone: "바이너리 데이터가 업로드되었습니다.", uploadBufferDoneAndSave: "바이너리 데이터가 서버에 업로드되어 저장됩니다.", title: "확인", alert: "경고", info: "정보", deleteListItem: "이 목록 항목을 삭제하시겠습니까?", deleteHashKey: "이 해시 키 항목을 삭제하시겠습니까?", deleteStreamTimestamp: "이 스트림 타임스탬프를 삭제하시겠습니까?", deleteSetMember: "이 세트 구성원을 삭제하시겠습니까?", deleteZSetMember: "이 정렬된 집합 구성원을 삭제하시겠습니까?", deleteConnection: "확인", deleteConnectionText: "이 Redis 연결을 삭제하시겠습니까?", deleteNode: "이 Redis 노드를 삭제하시겠습니까?", deleteAllKeys: opts => { return `이 트리와 모든 키를 삭제합니다(${opts.key})?`; }, socketioConnectError: "Socket.IO는 서버에 연결할 수 없습니다. 다시 로드하여 연결 오류를 직접 해결할 수 있습니다. 클라이언트는 자체적으로 문제를 해결하는 방법을 모릅니다.", socketioAuthRequired: "Socket.IO 인증이 필요합니다. HTTP Basic Auth(사용자 이름/비밀번호)로 인증하고 다시 로드하세요.", deleteKey: "이 키를 삭제하시겠습니까?", rename: { title: "이 키의 이름을 바꾸시겠습니까?", textContent: "이 작업을 수행하면 키 이름이 영구적으로 변경됩니다.", placeholder: "Redis 키(필수)" }, ttl: { title: "이 키의 TTL를 변경하시겠습니까?", textContent: "TTL를 변경하면 이 키의 수명이 업데이트됩니다. 이 키를 영원히 보관하려면 비워 두세요.", placeholder: "Redis 키의 TTL(정수 또는 비어 있음)", placeholderPlaceholder: "비어 있다는 것은 그것이 영원히 지속된다는 것을 의미합니다. 그렇지 않으면 정수를 입력하십시오.", convertTextToTime: "텍스트를 시간으로 변환", convertTextToTimePlaceholder: "예. 1d는 86400이 됩니다." }, license: { title: "라이센스 설정", textContent: "유료 기능을 사용하려면 support@corifeus.com에 문의하여 라이선스를 요청하세요. 가격은 Pro 400 HUF/월(€1/월) 또는 4,000 HUF/년(€10/년), Enterprise 1,200 HUF/월(€3/월) 또는 12,000 HUF/년입니다. (€30/년). 연간은 월 10배입니다. 27% VAT를 사용하면 총 금액은 Pro 500 HUF/월(€1.27/월) 또는 5,100 HUF/년(€12.70/년), Enterprise 1,500 HUF/월(€3.81/월) 또는 15,200 HUF/년(€38.10/년). 라이센스 검증에는 인터넷 접속이 필요합니다. 기본 라이센스에는 5개의 시트가 포함됩니다. 더 많은 좌석이 필요한 경우 support@corifeus.com로 문의하세요.", placeholder: "라이센스 키" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "복사", downloadBuffer: "바이너리 다운로드", setBuffer: "바이너리 업로드", exportKeys: "키 내보내기", exportAllKeys: (opts) => `전체 ${opts.count} 키 내보내기`, exportSearchResults: (opts) => `${opts.count} 결과 내보내기`, importKeys: "키 가져오기", saveWithFormatJson: "형식으로 저장", formatJson: "JSON 형식", wrap: "랩", unwrap: "포장 풀기", downloadJson: "JSON 다운로드", pubsubMonitor: "PubSub 모니터", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "언어", ok: "알았어", addKey: "이 키에 추가", addKeyRoot: "루트 키 추가", reloadKey: "키 새로고침", reload: "새로고침", close: "닫기", commands: "명령", view: "보기", statistics: "통계", refresh: "새로고침", pause: "일시정지", resume: "재개", clear: "지우기", rename: "이름 바꾸기", main: "데이터베이스", cancel: "취소", theme: "테마", github: "GitHub", githubRepo: "저장소", githubRelease: "릴리스", githubChangelog: "변경 내역", info: "Info", settings: "설정", connect: "연결하다", disconnect: "연결 끊기", overview: "개요", console: "콘솔", noConnections: "연결이 없습니다. 설정 메뉴에서 연결을 추가하세요.", noConnectionsInSettings: "연결이 없습니다. 위에서 새 연결을 추가할 수 있습니다.", connectionAdd: "새로운 연결", addGroup: "그룹 추가", extend: "연장", collapse: "접기", add: "추가", edit: "편집", save: "저장", ttl: "TTL 설정", license: "라이센스 설정", delete: "삭제", remove: "제거", sure: "물론이죠", testConnection: "테스트 연결", getKey: "Redis 키 및 관련 데이터 로드 중...", jsonViewShow: "JSON 표시", jsonViewEditor: "JSON 편집", quickConsole: "빠른 콘솔", }, label: { id: { nodeId: "노드 ID", id: "연결 ID", info: "sshPassword, sshPrivateKey, 비밀번호, tlsCrt, tlsKey, tlsCa 속성을 변경하지 않으려면 해당 속성에 연결 ID를 입력하여 속성 값을 그대로 유지하세요. 노드 비밀번호에 동일한 논리를 적용하려면 노드 비밀번호에 노드 ID를 입력하세요." }, secureFeature: "P3X로 시작하는 값이 동일하게 보이면 이는 보안 기능입니다. 설정을 변경하려면 해당 설정을 ��어 있거나 다른 것으로 바꾸면 저장됩니다. 설정을 변경하지 않으면 설정이 서버에 있는 그대로 유지됩니다.", ssh: { on: "SSH 켜짐", off: "SSH 꺼짐", sshHost: "SSH 호스트", sshPort: "SSH 포트", sshUsername: "SSH 사용자 이름", sshPassword: "SSH 비밀번호", sshPrivateKey: "SSH 개인 키" }, isBuffer: opts => `[객체 ArrayBuffer]는 값이 이진 데이터이거나 값이 다음보다 크다는 것을 의미합니다. ${opts.maxValueAsBuffer}`, streamValue: `스트림 필드와 값은 하나의 라이너입니다. 예: 필드1 값1 "필드 2" "값 2"`, streamTimestampId: `'*'는 자동 생성 또는 -로 지정됨을 의미합니다.`, unableToLoadKey: ({ key }) => { return `이 키를 로드할 수 없습니다: ${key}. 가능합니다. 키가 삭제되었습니다. 정확한 오류는 콘솔에 ���습니다.`; }, bigJson: "이 JSON 개체는 10kb를 초과하므로 일부 기능은 렌더링 속도가 느려질 수 있으므로 수행 중인 작업을 알고 있는지 확인하세요.", addNode: "노드 추가", validateJson: "JSON 검증", reducedFunction: `기능 감소`, tooManyKeys: opts => { return `전체 최대 기능에 대해 허용되는 키의 총계는 다음과 같습니다. ${opts.maxLightKeysCount} 카운트. 이 데이터베이스에는 허용된 총 키가 초과되었습니다. ${opts.count}. 키 정렬 및 추가 팬��� 트리 정보가 비활성화됩니다. 검색은 클라이언트 검색 대신 서버에서만 발생합니다.`; }, redisCommandNotFound: "일치하는 Redis 명령이 없습니다...", treeKeyStore: `정렬(자연 비교)은 클라이언트(일명 브라우저)에서 실행됩니다. 즉, 10,000개가 넘는 키와 같은 대규모 세트에 대한 페널티가 있으며 페이지 렌더링에 약간의 시간이 추가될 수 있습니다. Redis에는 이와 같은 키 정렬이 없습니다.`, socketIoTimeout: options => { return `이 요청에 대한 Socket.IO 시간이 초과되었습니다(최대 ${options.timeout / 1000} 초) ...`; }, resizerInfo: options => { return `왼쪽 또는 오른쪽 패널의 최소 너비는 다음과 같습니다. ${options.width}px`; }, jsonViewNotParsable: "이 값은 JSON 구문 분��이 불가능합니다. ", ttlTitle: "초 단위로 TTL 설정", passwordSecure: "비밀번호는 비어 있을 수 있지만 여전히 문자가 표시됩니다. 이는 보안 기능입니다.", tlsWithoutCert: "추가 인증서 없이 TLS 활성화", tlsRejectUnauthorized: "승인되지 않은 인증서 거부", tlsSecure: "P3X로 시작하는 TLS 구성이 보이거나 모든 TLS 설정이 동일해 보이는 경우 이는 보안 기능입니다. 설정을 변경하려면 해당 설정을 비어 있거나 다른 것으로 바꾸면 저장됩니다. TLS 설정을 변경하지 않으면 설정이 서버에 있는 그대로 유지됩니다.", treeSeparatorEmpty: "트리 구분 기호가 비어 있으면 트리에는 중첩 노드가 없고 순수 목록만 있습니다.", treeSeparatorEmptyNote: "중첩된 노드가 없고 순수한 목록만 있음", welcomeConsole: "Redis 콘솔에 오신 것을 환영합니다.", welcomeConsoleInfo: "커서 UP 또는 DOWN 기록이 활성화되었습니다.", redisListIndexInfo: "추가하려면 비우고, 표시된 위치에 앞에 추가하거나 저장하려면 -1입니다.", console: "콘솔", connectiondAdd: "연결 추가", connectiondEdit: "연결 수정", connectiondView: "연결 보기", connections: "연결", licenseInfo: "라이센스", licenseEditable: "라이센스 편집 가능", licenseEditableYes: "예", licenseEditableNo: "아니요", licenseTerminalOnly: "라이센스는 서버 터미널에서만 구성할 수 있습니다.", licenseTierPolicyTitle: "등급 정책", licenseTierPolicyText: "

Free

core Redis UI 전용; SSH 터널링 없음, 읽기 전용 연결 모드 없음, Cluster/Sentinel, 없음 JSON 편집/바이너리 업로드/바이너리 다운로드, 없음 ReJSON.
가격: 0 HUF/월 (€0/월).

Pro

SSH 터널링, 읽기 전용 연결 모드(--readonly-connections/-r 포함), 편집 JSON, 바이너리 업로드, 바이너리 다운로드, ReJSON.
기본 가격: 400 HUF/월(€1/월) 또는 4,000 HUF/년 (€10/년).
총액 27% VAT: 500 HUF/월(€1.27/월) 또는 5,100 HUF/년 (€12.70/년).

Enterprise

SSH 터널링, Cluster 및 Sentinel, JSON 편집, 바이너리 업로드, 바이너리 다운로드, ReJSON; --readonly-connections/-r도 작동합니다.
기본 가격: 1,200 HUF/월(€3/월) 또는 12,000 HUF/년 (€30/년).
총액 27% VAT: 1,500 HUF/월(€3.81/월) 또는 15,200 HUF/년 (€38.10/년).

연간 규칙

연간 가격은 월별 10배입니다. 가격.

Seats

기본 라이센스에는 시트 5개가 포함되어 있습니다. 더 많은 좌석이 필요한 경우 support@corifeus.com.

Enterprise 평가판

누구나 10일 무료로 문의하세요. 실제 기존 이메일 주소(비테스트 이메일) 사용.

이메일의 청구 정보

이름, 청구 이메일, 국가 코드, 우편번호, 도시, 주소, VAT ID (선택 사항).

Payment

PayPal 결제는 HUF(포린트)에서만 가능합니다. @https://paypal.me/corifeus 돈을 보낸 후 청구서를 보내드리겠습니다. 모든 결제 금액은 환불되지 않습니다.

VAT

VAT가 가격에 추가됩니다(27% 헝가리).

Contact

안녕하고 싶거나 질문이 있는 경우 문의하세요. support@corifeus.com.

Language

청구서 및 라이센스 이메일 통신은 영어로 되어 있습니다. 송장 통화는 HUF.

Note

입니다. 라이센스 확인에는 인터넷 액세스가 필요합니다.", licenseState: "상태", licenseStateActive: "활성", licenseStateInactive: "비활성", licenseStateNoLicense: "라이센스 없음", licenseKeyMasked: "저장된 키", licenseTier: "계층", licenseValid: "유효", licenseStatus: "라이센스 상태", licenseReason: "이유", licenseCheckedAt: "확인 시간", licenseStartsAt: "시작 시간", licenseExpiresAt: "만료 시간:", licenseDaysLeft: "남은 일수", licenseMaxDevices: "최대 장치", licenseActiveDevices: "활성 장치", licenseActiveDevicesInfo: "장치를 더 이상 사용하지 않으면 75분 후에 좌석이 자동으로 해제됩니다.", licenseCustomerEmail: "고객 이메일", licenseFeatures: "특징", licenseFeaturesEmpty: "추가 기능 없음", licenseFeatureReadonlyMode: "읽기 전용 연결 모드", licenseFeatureReadonlyConnectionsFlag: "읽기 전용 연결(--readonly-connections/-r)", licenseFeatureSsh: "SSH 터널링", licenseFeatureCluster: "Cluster 연결", licenseFeatureSentinel: "Sentinel 연결", licenseFeatureReJSON: "ReJSON(JSON 데이터 유형)", keysSort: { on: "키 정렬 켜짐", off: "키 정렬 꺼짐" }, cluster: { on: "Cluster 켜짐", off: "Cluster 꺼짐" }, sentinel: { on: "Sentinel 켜짐", off: "Sentinel 꺼짐", name: "Sentinel 이름" }, readonly: { on: "읽기 전용", off: "읽기 전용 꺼짐" }, proSshOnly: "SSH는 Pro 또는 Enterprise에서 사용할 수 있습니다.", proReadonlyOnly: "읽기 전용 연결 모드는 Pro 또는 Enterprise에서 사용할 수 있습니다.", enterpriseClusterSentinelOnly: "Cluster 및 Sentinel는 Enterprise에서만 사용할 수 있습니다.", theme: { light: "빛", dark: "어둠의 기업", darkNeu: "어둠", darkoBluo: "다르코 블루오", enterprise: "기업", redis: "Redis", matrix: "매트릭스" }, connected: opts => { return `연결됨: ${opts.name}`; }, tree: "나무", askAuth: "승인을 요청하세요", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "모듈", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "연결 끊기", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis 명령어", ungrouped: "그룹 없음", grouped: "Grouped", connectFirst: "먼저 Redis 서버에 연결하세요", searchLanguage: "언어 검색...", exportProgress: "키 내보내는 중...", importProgress: "키 가져오는 중...", importPreview: "미리보기", importOverwrite: "덮어쓰기", importSkip: "건너뛰기", importConflict: "키가 이미 있는 경우:", noKeysToExport: "내보낼 키가 없습니다", time: "시간", loading: "로딩 중...", autoRefresh: "자동", exportSearchHint: "현재 검색과 일치하는 키만 내보내기", importSearchHint: "가져오기는 검색 결과뿐만 아니라 전체 데이터베이스에 적용됩니다", importNoKeys: "파일에서 키를 찾을 수 없습니다", }, status: { dataCopied: "데이터가 클립보드에 있습니다.", licenseSaved: "라이선스가 저장되었습니다", exportDone: "내보내기 완료", indexCreated: "인덱스 생성됨", indexDropped: "인덱스 삭제됨", importDone: (opts) => `가져오기 완료: ${opts.created} 생성, ${opts.skipped} 건너뜀, ${opts.errors} 오류`, nodeRemoved: "노드가 제거되었습니다.", keyIsNotExisting: "이 키는 삭제되었거나 만료되었을 수 있습니다.", keyCount: opts => { if (opts.keyCount === 0) { return "열쇠 없음"; } else if (opts.keyCount === 1) { return "키 1개"; } else { return `${opts.keyCount} 열쇠`; } }, treeExpandAll: "모든 나무 잎을 확장하십시오. 이 작업은 비용이 많이 들고 시간이 걸릴 수 있습니다.", noRedisKeys: "이 데이터베이스에는 키가 없습니다.", redisConnected: "Redis 연결 성공", reloadingDataInfo: "Redis 데이터 정보를 다시 로드하는 중", added: "추가됨", saved: "업데이트됨", cancelled: "취소됨", deleted: "삭제됨", savedRedis: "Redis 데이터가 저장되었습니다", redisDisconnected: opts => { return `현재 연결에 오류가 있습니다: ${opts.error.message}`; }, dbChanged: opts => { return `db 인덱스는 다음으로 설정됩니다. ${opts.db}. `; }, treeDeleted: opts => { return `트리 키가 삭제되었습니다(${opts.key}).`; }, deletedKey: opts => { return `키가 삭제되었습니다(${opts.key}).`; }, renamedKey: "이 키의 이름이 변경되었습니다.", ttlChanged: "이 키의 TTL가 변경되었습니다.", notInteger: "이 입력은 정수가 아닙니다.", persisted: "이 키는 영원히 유지됩니다.", set: "���가 설정/추가되었습니다." }, code: { "delete-connection": "이 연결이 삭제되어 이 Redis 인스턴스에 대한 연결이 끊어졌습니다.", "save-connection": "이 연결이 변경되어 이 Redis 인스턴스에 대한 연결이 끊어졌습니다. 다시 연결하실 수 있습니다.", "readonly-connections": "연결 추가/저장/삭제는 읽기 전용입니다!", "readonly-connection-mode": "이 연결은 읽기 전용 모드입니다!", "list-out-of-bounds": "이 목록 색인은 범위를 벗어났습니다.", "donation-ware-feature": "이 기능은 기부 버전에 있습니다.", "feature-pro-readonly-required": "읽기 전용 연결 모드에는 Pro 또는 Enterprise 라이선스가 필요합니다.", "feature-pro-ssh-required": "SSH 터널링에는 Pro 또는 Enterprise 라이센스가 필요합니다.", "feature-enterprise-cluster-sentinel-required": "Cluster 및 Sentinel에는 Enterprise 라이선스가 필요합니다.", "feature-pro-json-binary-required": "JSON 편집, 바이너리 업로드 및 바이너리 다운로드에는 Pro 또는 Enterprise 라이센스가 필요합니다.", "feature-pro-rejson-required": "ReJSON(JSON 데이터 유형)에는 Pro 또는 Enterprise 라이선스가 필요합니다.", "invalid-json-value": "값이 유효한 JSON가 아닙니다.", "http_auth_required": "승인 필요: HTTP Basic Auth로 인증하고 다시 로드하세요.", "auto-connection-failed": "이로 인해 연결이 제거되고 자동 연결이 실패했을 수도 있습니다.", invalid_console_command: "이 명령은 GUI를 통해 작동하지 않습니다." }, licenseReason: { LICENSE_VALID: "라이센스가 유효합니다", LICENSE_INVALID: "라이센스가 유효하지 않습니다", LICENSE_MISSING: "라이센스 키가 설정되지 않았습니다", LICENSE_DISABLED: "서버 구성에서 라이선스가 비활성화되었습니다.", LICENSE_NOT_FOUND: "라이센스를 찾을 수 없습니다", LICENSE_EXPIRED: "라이센스가 만료되었습니다", LICENSE_CLEARED: "라이센스 키가 삭제되었습니다", LICENSE_MAX_DEVICES_REACHED: "최대 장치 좌석에 도달했습니다.", PRODUCT_MISMATCH: "라이센스 제품이 일치하지 않습니다" }, licenseStatusValue: { active: "활성", deleted: "삭제됨", all: "모두", expired: "만료됨", missing: "누락", inactive: "비활성" }, form: { error: { required: "필수", port: "포트는 1-65535 사이입니다.", invalid: "양식이 잘못되었습니다." }, connection: { label: { name: "이름", group: "Group", host: "호스트 이름", port: "항구", password: "비밀번호", username: "사용자 이름" } }, treeSettings: { maxValueDisplay: "최대값 표시 문자열 길이", maxValueDisplayInfo: "0으로 설정하면 전체 값이 표시됩니다. 0보다 크면 이 길이로 자릅니다. -1인 경우: 문자열의 경우 편집할 때까지 값을 숨깁니다. 다른 유형의 경우 전체 콘텐츠를 표시하세요.", maxKeys: "최대 키 수", maxKeysInfo: "GUI가 충돌하지 않도록 최대 키 수를 제한합니다.", keyCount: () => { return `키 수: ${p3xr.state.keysRaw.length}`; }, label: { animation: "애니메이션 사용", noAnimation: "애니메이션 없음", jsonFormatTwoSpace: "공백 2개로 JSON 형식을 지정하세요.", jsonFormatFourSpace: "공백 4개로 JSON 형식을 지정하세요.", formName: "Redis 설정", searchModeClient: "클라이언트 검색 모드", searchModeServer: "서버 검색 모드", searchModeStartsWith: "모드로 시작으로 검색", searchModeIncludes: "검색 포함 모드" }, field: { treeSeparator: "트리 구분 기호", treeSeparatorSelector: "트리 구분자 선택기", page: "트리 페이징 수", keyPageCount: "키 페이징 횟수", keysSort: "키 정렬", searchMode: "검색 모드", searchModeStartsWith: "검색 시작 / 포함" }, error: { keyPageCount: "주요 페이지 수는 5~100 사이의 정수여야 합니다.", page: "페이지 수는 10 - 5000 사이의 정수여야 합니다.", maxValueDisplay: "최대 표시 값은 -1에서 32768 사이의 정수여야 합니다.", maxKeys: "최대 키 개수 값은 100에서 100000 사이의 정수여야 합니다." } }, key: { label: { formName: { add: "새로운 Redis 키 추가", edit: "Redis 키 편집", append: "기존 Redis 키에 추가" } }, field: { streamTimestamp: "타임스탬프", key: "열쇠", type: "유형", index: "색인", hashKey: "해시 키", score: "점수", value: "가치" }, error: { streamTimestamp: "Redis 형식 또는 * 형식의 타임스탬프가 필요합니다.", key: "키는 1자 이상입니다.", hashKey: "해시 테이블 키는 1자 이상입니다.", score: "정렬된 세트 스코어가 필요합니다.", value: "값은 필수입니다." } }, main: { label: { database: "DB" } } }, page: { search: { title: "검색", index: "인덱스", query: "쿼리", results: "결과", noIndex: "인덱스 없음", createIndex: "인덱스 생성", dropIndex: "인덱스 삭제", indexInfo: "인덱스 정보", indexName: "인덱스 이름", prefix: "키 접두사 (선택)", fieldName: "필드 이름", }, monitor: { title: "모니터링", memory: "메모리", opsPerSec: "초당 작업", clients: "클라이언트", blocked: "차단됨", hitsMisses: "적중률", networkIo: "네트워크 I/O", slowLog: "슬로우 로그", totalCommands: "전체", expired: "만료됨", evicted: "제거됨", clientList: "클라이언트 목록", topKeys: "메모리 기준 상위 키", killClient: "클라이언트 종료", clientKilled: "클라이언트가 종료되었습니다", confirmKillClient: "이 클라이언트를 종료하시겠습니까?", noKeys: "키 없음", noClients: "클라이언트 없음", }, overview: { noConnected: "Redis에 연결되어 있지 않습니다.", overviewClients: "클라이언트 수에 따라 연결된 목록을 나열합니다.", connectedCount: opt => { if (opt.length === 1) { return "클라이언트 1명"; } return `${opt.length} 클라이언트`; } }, key: { label: { key: "열쇠", encoding: "인코딩", length: "크기", ttl: "TTL", ttlTitle: "생존 시간", type: "유형", ttlNotExpire: "만료되지 않습니다", lengthString: "바이트", lengthItem: "아이템", actions: "���업" }, list: { table: { index: "색인", value: "가치" } }, hash: { table: { hashkey: "해시키", value: "가치" } }, set: { table: { value: "회원" } }, zset: { table: { value: "회원", score: "점수" } }, stream: { table: { timestamp: "타임스탬프 ID", field: "필드", value: "가치" } } }, treeControls: { settings: "트리 설정", expandAll: "모두 펼치기", collapseAll: "모두 접기", search: { search: "키에서 검색", clear: "비워두려면 현재 검색을 삭제하세요.", placeholderClient: "클라이언트 측 검색", placeholderServer: "검색 서버 측", info: "클라이언트 측 검색은 검색 입력의 텍스트와 일치함을 의미합니다. 서버 측 검색은 *{search-text}*와 같은 키 패턴 검색과 유사함을 의미합니다. 대규모 검색 세트의 경우 서버 측 검색을 사용하는 것이 좋습니다. 더 작은 검색 세트의 경우 클라이언트측 검색 모드를 사용하는 것이 좋습니다." + ` 열쇠 개수가 초과된 경우 ${p3xr.settings.maxLightKeysCount}, 서버 측에서만 검색할 수 있습니다.`, largeSetInfo: "대규모 세트에서는 클라이언트 측 검색이 비활성화됩니다. 그래서 지금은 서버 측 검색만 가능합니다.", infoDetails: "검색이 어떻게 작동하는지 알아보려면 설정을 확인하세요." }, pager: { next: "다음", prev: "이전", first: "첫 번째", last: "마지막" } } }, time: { loading: "로딩 중...", years: "년", months: "개월", days: "일", year: "년", month: "달", day: "일" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ky/000077500000000000000000000000001517666434100137765ustar00rootroot00000000000000src/strings/ky/strings.js000066400000000000000000001100521517666434100160240ustar00rootroot00000000000000const strings = { error: { cleared_license: "Тазаланган лицензия", invalid_license: "Жараксыз лицензия", license_max_devices_reached: "Түзмөктүн максималдуу орундарына жетти", license_readonly: "Лицензияны сервер терминалынан гана өзгөртүүгө болот.", server_error: "Сервер катасы, кайталап к��рүңүз" }, title: { donate: "Кайрымдуулук кылуу", jsonRecursive: "Бардык жалбырактарды кеңейтүү", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Төмөнкү сол менюдан туташуу үчүн Redis байланышын тандасаңыз болот.", statistics: "Статистика", error: "Ката", connectingRedis: "Redis менен туташууда ...", socketioConnectError: "Socket.IO катасы", db: "DB", server: "Server", clients: "Кардарлар", memory: "Эстутум", persistence: "Туруктуулук", stats: "Статистика", replication: "Репликация", cpu: "CPU", cluster: "Cluster", modules: "Модулдар", errorstats: "Ката статistикасы", commandstats: "Команда статistикасы", latencystats: "Кечigүү статistикасы", keysizes: "Ачкыч өлчөмдөрү", threads: "Жиптер", }, confirm: { dropIndex: "Бул индексти жоюуга ишенесизби?", uploadBuffer: "Бул экилик берилиштерди жүктөйсүзбү?", uploadBufferDone: "бинардык маалыматтар жүктөлүп берилди", uploadBufferDoneAndSave: "бинардык маалыматтар жүктөлөт жана серверде сакталат", title: "ырастоо", alert: "Alert", info: "Маалымат", deleteListItem: "Бул тизмени чын эле жок кыласызбы?", deleteHashKey: "Бул хэш ачкычты чын эле жок кыласызбы?", deleteStreamTimestamp: "Бул агымдын убакыт белгисин чын эле жок кыласызбы?", deleteSetMember: "Бул топтомдун мүчөсүн чын эле жок кыласы��бы?", deleteZSetMember: "Бул иреттелген топтом мүчөсүн чын эле жок кыласызбы?", deleteConnection: "ырастоо", deleteConnectionText: "Бул Redis байланышын чын эле жок кыласызбы?", deleteNode: "Бул Redis түйүнүн чын эле жок кыласызбы?", deleteAllKeys: opts => { return `Бул даракты жана анын бардык ачкычтарын жок кылыңыз (${opts.key})?`; }, socketioConnectError: "Socket.IO серверге туташа албайт, сиз кайра жүктөп, байланыш катасын өзүңүз чечип көрүңүз, кардар аны кантип чечүүнү билбейт.", socketioAuthRequired: "Socket.IO авторизациясы талап кылынат. Сураныч, HTTP Basic Auth (колдонуучунун аты/сырсөз) менен аныктыгын текшерип, кайра жүктөңүз.", deleteKey: "Бул ачкычты чын эле жок кыласызбы?", rename: { title: "Бул ачкычтын атын чын эле өзгөртөсүзбү?", textContent: "Бул аракет ачкычтын атын биротоло өзгөртөт.", placeholder: "Redis ачкычы (талап кылынат)" }, ttl: { title: "Чын эле бул ачкычтын TTL өзгөрткүңүз келеби?", textContent: "TTL өзгөртүү бул ачкычтын жашоо убактысын жаңыртат. Бул ачкычты түбөлүккө сактоо үчүн бош калтырыңыз.", placeholder: "Redis ачкычынын TTL (бүтүн же бош)", placeholderPlaceholder: "бош дегенди билдирет, ал түбөлүккө сакталат; антпесе бүтүн санды киргизиңиз.", convertTextToTime: "Текстти убакытка айландыруу", convertTextToTimePlaceholder: "Мис. 1d 86400 болот" }, license: { title: "Лицензия коюу", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Лицензия ачкычы" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Көч��рмө", downloadBuffer: "экилик жүктөө", setBuffer: "экилик жүктөө", exportKeys: "Ачкычтарды экспорттоо", exportAllKeys: (opts) => `Бардык ${opts.count} ачкычты экспорттоо`, exportSearchResults: (opts) => `${opts.count} натыйжаны экспорттоо`, importKeys: "Ачкычтарды импорттоо", saveWithFormatJson: "Формат менен сактоо", formatJson: "Json форматы", wrap: "Ороо", unwrap: "Оракты ачуу", downloadJson: "JSON жүктөп алыңыз", pubsubMonitor: "PubSub Монитор", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Тил", ok: "макул", addKey: "Бул ачкычка кошуу", addKeyRoot: "Тамыр ачкычын кошуңуз", reloadKey: "Ачкычты кайра жүктөө", reload: "Кайра жүктөө", close: "Жабуу", commands: "Командалар", view: "Көрүү", statistics: "Статистика", refresh: "Жаңылоо", pause: "Тыным", resume: "Улантуу", clear: "Таза", rename: "Атын өзгөртүү", main: "Маалымат базасы", cancel: "Жокко чыгаруу", theme: "Тема", github: "GitHub", githubRepo: "Репозиторий", githubRelease: "Релиздер", githubChangelog: "Changelog", info: "Info", settings: "Орнотуулар", connect: "Туташуу", disconnect: "Ажыратуу", overview: "Обзор", console: "Консол", noConnections: "Туташуулар жок, жөндөөлөр менюсуна туташууну кошуңуз.", noConnectionsInSettings: "Туташуулар жок, жогорудагы ЖАҢЫ БАЙЛАНЫШ кошсоңуз болот.", connectionAdd: "Жаңы байланыш", addGroup: "Топ кошуу", extend: "Узартуу", collapse: "Жыйыштыруу", add: "кошуу", edit: "Түзөтүү", save: "Сактоо", ttl: "TTL орнотуңуз", license: "Лицензия коюу", delete: "Жок кылуу", remove: "Алып салуу", sure: "Албетте", testConnection: "Сыноо байланышы", getKey: "Redis ачкычы жана ага байланыштуу дайындар жүктөлүүдө ...", jsonViewShow: "JSON көрсөтүү", jsonViewEditor: "JSON түзөтүү", quickConsole: "Ыкчам консол", }, label: { id: { nodeId: "Түйүн ID", id: "Туташуу ID", info: "Эгерде сиз төмөнкүлөрдүн касиеттерин өзгөртүүнү каалабасаңыз: sshPassword, sshPrivateKey, сырсөз, tlsCrt, tlsKey, tlsCa, касиеттин баалуулуктарын сактап калуу үчүн ошол пропорцияларга байланыштын идентификаторун киргизиңиз. Түйүндүн сырсөзүндө ошол эле логиканы кааласаңыз, түйүн сырсөзүнө түйүн идентификаторун киргизиңиз." }, secureFeature: "Эгер сиз P3X менен башталган бир маанини көрсөңүз, анда бул коопсуз функция. Орнотууларды өзгөртүү үчүн, жөн гана бул жөндөөлөрдү бош же башка нерсе менен алмаштырыңыз жана алар сакталат. Эгер сиз орнотууларды өзгөртпөсөңүз, орнотуулар сервердегидей сакталып калат.", ssh: { on: "SSH күйүк", off: "SSH өчүк", sshHost: "SSH Хост", sshPort: "SSH порту", sshUsername: "SSH колдонуучунун аты", sshPassword: "SSH сырсөз", sshPrivateKey: "SSH купуя ачкычы" }, isBuffer: opts => `[object ArrayBuffer] мааниси экилик маалымат экенин же маани андан чоң экенин билдирет ${opts.maxValueAsBuffer}`, streamValue: `Агым талаасы жана мааниси oneliner болуп саналат. Мис.: талаа1 мааниси1 "талаа 2" "маани 2"`, streamTimestampId: `'*' автоматтык түрдө түзүлгөн же - катары спецификацияны билдирет`, unableToLoadKey: ({ key }) => { return `Бул ачкыч жүктөлбөй жатат: ${key}. Мүмкүн, ачкыч өчүрүлгөн. Так ката консолдо.`; }, bigJson: "Бул JSON объектиси 10 кбтан ашат, андыктан эмне кылып жатканыңызды билип алыңыз, анткени кээ бир функциялар жай рендеринг болушу мүмкүн.", addNode: "Түйүн кошуу", validateJson: "JSON текшерүү", reducedFunction: `Кыскартылган функция`, tooManyKeys: opts => { return `Толук максималдуу функциялар үчүн уруксат берилген баскычтардын бардыгы болуп саналат ${opts.maxLightKeysCount} сана. Бул маалымат базасында жалпысынан уруксат берилген ачкычтар бар ${opts.count}. Ачкычтарды сорттоо жана кошумча кооз дарак маалыматы өчүрүлгөн. Кардар издөөнүн ордуна издөө серверде гана жүрүп жатат.`; }, redisCommandNotFound: "Redis буйрук дал келген жок ...", treeKeyStore: `Сорттоо (табигый салыштыруу) кардар, башкача айтканда, браузерде аткарылат, демек, чоң чоң топтомдор үчүн жаза бар, мисалы 10 миңден ашык баскычтар, ал баракты көрсөтүүгө бир аз убакыт кошуп коюшу мүмкүн. Redis ичинде ачкыч сорттоо жок, болгону ушул сыяктуу.`, socketIoTimeout: options => { return `Socket.IO бул сурам үчүн убакыт бүттү (макс ${options.timeout / 1000} секунд)...`; }, resizerInfo: options => { return `Сол же оң панелдин минималдуу туурасы ${options.width}px`; }, jsonViewNotParsable: "Бул маани JSON талдоо эмес ", ttlTitle: "TTL секунданын ичинде орнотуңуз", passwordSecure: "Сырсөз бош болушу мүмкүн, бирок ал дагы эле белгилерди көрсөтөт, бул коопсуздук өзгөчөлүгү.", tlsWithoutCert: "TLSти кошумча сертификатсыз иштетүү", tlsRejectUnauthorized: "Уруксатсыз сертификатты четке кагуу", tlsSecure: "Эгер сиз P3X менен ��ашталган TLS конфигурациясын көрсөңүз же бардык TLS жөндөөлөрү окшош болсо, бул коопсуз функция. Орнотууларды өзгөртүү үчүн, жөн гана бул жөндөөлөрдү бош же башка нерсе менен алмаштырыңыз жана алар сакталат. TLS жөндөөлөрүн өзгөртпөсөңүз, орнотуулар сервердегидей сакталып калат.", treeSeparatorEmpty: "Эгерде дарак бөлгүч бош болсо, анда дарактын эч кандай түйүндөрү болбойт, болгону таза тизме", treeSeparatorEmptyNote: "Уюшкан түйүндөр жок, жөн гана тизме", welcomeConsole: "Redis консолуна кош келиңиз", welcomeConsoleInfo: "Курсор ЖОГОРУ же ТӨМӨН тарых иштетилген", redisListIndexInfo: "Коштоо үчүн бош, -1 алдына коюу же көрсөтүлгөн орунга сактоо үчүн.", console: "Консол", connectiondAdd: "Туташуу кошуу", connectiondEdit: "Туташууну түзөтүү", connectiondView: "Байланышты көрүү", connections: "Байланыштар", licenseInfo: "Лицензия", licenseEditable: "Лицензия түзөтүлөт", licenseEditableYes: "Ооба", licenseEditableNo: "жок", licenseTerminalOnly: "Лицензияны сервер терминалынан гана конфигурациялоого болот.", licenseTierPolicyTitle: "Деңгээл саясаты", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "Мамлекет", licenseStateActive: "Активдүү", licenseStateInactive: "Жигерсиз", licenseStateNoLicense: "Лицензия жок", licenseKeyMasked: "Сакталган ачкыч", licenseTier: "Деңгээл", licenseValid: "Жарактуу", licenseStatus: "Лицензия статусу", licenseReason: "Себеп", licenseCheckedAt: "текшерилди", licenseStartsAt: "башталат", licenseExpiresAt: "Мөөнөтү бүтөт", licenseDaysLeft: "Күндөр калды", licenseMaxDevices: "Максималдуу түзмөктөр", licenseActiveDevices: "Активдүү түзмөктөр", licenseActiveDevicesInfo: "Эгер аппарат колдонулбай калса, анын отургучу 75 мүнөттөн кийин автоматтык түрдө бошотулат.", licenseCustomerEmail: "Кардардын электрондук почтасы", licenseFeatures: "Өзгөчөлүктөрү", licenseFeaturesEmpty: "Эч кандай кошумча функциялар", licenseFeatureReadonlyMode: "окуу үчүн гана туташуу режими", licenseFeatureReadonlyConnectionsFlag: "Окуу үчүн гана туташуулар (--readonly-connections/-r)", licenseFeatureSsh: "SSH туннелдер", licenseFeatureCluster: "Cluster байланыштары", licenseFeatureSentinel: "Sentinel байланыштары", licenseFeatureReJSON: "ReJSON (JSON маалымат түрү)", keysSort: { on: "Ачкычтарды иреттөө күйүк", off: "Ачкычты сорттоо" }, cluster: { on: "Cluster күйүк", off: "Cluster өчүк" }, sentinel: { on: "Sentinel күйүк", off: "Sentinel өчүк", name: "Sentinel аты" }, readonly: { on: "Окуу үчүн гана", off: "Окуу үчүн гана өчүрүү" }, proSshOnly: "SSH Pro же Ишканада жеткиликтүү.", proReadonlyOnly: "Окуу үчүн гана туташуу режими Pro же Ишканада жеткиликтүү.", enterpriseClusterSentinelOnly: "Cluster жана Sentinel Ишканада гана жеткиликтүү.", theme: { light: "Жарык", dark: "��араңгы ишкана", darkNeu: "Караңгы", darkoBluo: "Darko blue", enterprise: "Enterprise", redis: "Redis", matrix: "Матрица" }, connected: opts => { return `Туташкан: ${opts.name}`; }, tree: "Дарак", askAuth: "Авторизация сураңыз", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Модулдар", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Ажыратуу", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Буйруктары", ungrouped: "Топсуз", grouped: "Grouped", connectFirst: "Алгач Redis серверине туташыңыз", searchLanguage: "Тилди издөө...", exportProgress: "Ачкычтар экспортолууда...", importProgress: "Ачкычтар импортолууда...", importPreview: "Алдын ала көрүү", importOverwrite: "Кайра жазуу", importSkip: "Өткөрүп жиберүү", importConflict: "Ачкыч мурунтан бар болсо:", noKeysToExport: "Экспорттоо үчүн ачкычтар жок", time: "Убакыт", loading: "Жүктөлүүдө...", autoRefresh: "Авто", exportSearchHint: "Учурдагы издөөгө дал келген ачкычтар гана экспортолот", importSearchHint: "Импорт издөө натыйжаларына эмес, бүт маалымат базасына колдонулат", importNoKeys: "Файлдан ачкычтар табылган жок", }, status: { dataCopied: "Маалымат алмашуу буферинде", licenseSaved: "Лицензия сакталды", exportDone: "Экспорт аякталды", indexCreated: "Индекс түзүлдү", indexDropped: "Индекс жоюлду", importDone: (opts) => `Импорт аякталды: ${opts.created} түзүлдү, ${opts.skipped} өткөрүлдү, ${opts.errors} ката`, nodeRemoved: "Түйүн алынып салынды", keyIsNotExisting: "Бул ачкыч жок кылынган же мөөнөтү бүткөн болушу мүмкүн.", keyCount: opts => { if (opts.keyCount === 0) { return "Ачкыч жок"; } else if (opts.keyCount === 1) { return "1 ачкыч"; } else { return `${opts.keyCount} ачкычтар`; } }, treeExpandAll: "Бардык дарак жалбырактарын кеңейтүү. Бул операция кымбат болушу мүмкүн жана убакыт талап кылынышы мүмкүн ...", noRedisKeys: "Бул маалымат базасында ачкычтар жок.", redisConnected: "Redis ийгиликтүү туташты", reloadingDataInfo: "Redis маалыматы кайра жүктөлүүдө", added: "Кошулган", saved: "Жаңыртылган", cancelled: "Жокко чыгарылды", deleted: "Жок кылынды", savedRedis: "Redis маалыматтар сакталды", redisDisconnected: opts => { return `Учурдагы туташууда ката кетти: ${opts.error.message}`; }, dbChanged: opts => { return `db ин��екси коюлган ${opts.db}. `; }, treeDeleted: opts => { return `Дарактын ачкычы жок кылынды (${opts.key}).`; }, deletedKey: opts => { return `Ачкыч өчүрүлдү (${opts.key}).`; }, renamedKey: "Бул ачкычтын аталышы өзгөртүлдү", ttlChanged: "Бул ачкычтын TTL өзгөртүлдү", notInteger: "Бул киргизүү бүтүн сан эмес", persisted: "Бул ачкыч түбөлүккө сакталат", set: "Ачкыч коюлган/кошулган" }, code: { "delete-connection": "Бул туташуу өчүрүлдү, андыктан сиз бул Redis инстанциясына ажыратылдыңыз.", "save-connection": "Бул туташуу өзгөртүлдү, андыктан сиз бул Redis инстанциясынан ажыратылдыңыз. Сиз кайра туташа аласыз.", "readonly-connections": "Туташууларды кошуу/сактоо/жок кылуу окуу үчүн гана!", "readonly-connection-mode": "Бул байланыш окуу гана режими!", "list-out-of-bounds": "Бул тизме индекси чектен чыккан", "donation-ware-feature": "Бул өзгөчөлүк кайрымдуулук версиясында бар.", "feature-pro-readonly-required": "Окуу үчүн гана туташуу режими Pro же Enterprise лицензиясын талап кылат.", "feature-pro-ssh-required": "SSH туннелдөө үчүн Pro же Enterprise лицензиясы талап кылынат.", "feature-enterprise-cluster-sentinel-required": "Cluster жана Sentinel Enterprise лицензиясын талап кылат.", "feature-pro-json-binary-required": "JSON түзөтүү, экилик жүктөө жана экилик жүктөө Pro же Enterprise лицензиясын талап кылат.", "feature-pro-rejson-required": "ReJSON (JSON маалымат түрү) Pro же Enterprise лицензиясын талап кылат.", "invalid-json-value": "Маани жарактуу эмес JSON.", "http_auth_required": "Авторизация талап кылынат: HTTP Basic Auth менен аныктыгын текшерип, кайра жүктөңүз.", "auto-connection-failed": "Мүмкүн, туташуу өчүрүлүп, автоматтык туташуу ишке ашпай калды, ушундан улам.", invalid_console_command: "Бул буйрук GUI аркылуу иштебейт." }, licenseReason: { LICENSE_VALID: "Лицензия жарактуу", LICENSE_INVALID: "Лицензия жараксыз", LICENSE_MISSING: "Лицензия ачкычы коюлган эмес", LICENSE_DISABLED: "Лицензия сервер конфигурациясында өчүрүлгөн", LICENSE_NOT_FOUND: "Лицензия табылган жок", LICENSE_EXPIRED: "Лицензиянын мөөнөтү бүттү", LICENSE_CLEARED: "Лицензия ачкычы тазаланды", LICENSE_MAX_DEVICES_REACHED: "Түзмөктүн максималдуу орундарына жетти", PRODUCT_MISMATCH: "Лицензия продукт дал келбейт" }, licenseStatusValue: { active: "Активдүү", deleted: "Жок кылынды", all: "Баары", expired: "Мөөнөтү бүттү", missing: "Жок", inactive: "Жигерсиз" }, form: { error: { required: "Талап кылынат", port: "Порт 1-65535 ортосунда", invalid: "Форма жараксыз" }, connection: { label: { name: "аты", group: "Group", host: "Хост аты", port: "Порт", password: "Сырсөз", username: "Колдонуучунун аты" } }, treeSettings: { maxValueDisplay: "Максималдуу маани дисплей сап узундугу", maxValueDisplayInfo: "0 деп коюлса, толук маанилерди көрсөтүңүз. 0ден чоң болсо, бул узундукка чейин кыскартыңыз. Эгерде -1: саптар үчүн, өзгөртүүгө чейин маанини жашырыңыз; башка түрлөрү үчүн, толук мазмунду көрсөтүү.", maxKeys: "Максималдуу ачкыч саны", maxKeysInfo: "GUI бузулуп калбашы үчүн, биз ачкычтардын максималдуу санын чектейбиз.", keyCount: () => { return `Ачкычтардын саны: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Анимацияны колдонуңуз", noAnimation: "Анимация жок", jsonFormatTwoSpace: "JSON форматын 2 боштук менен түзүңүз", jsonFormatFourSpace: "4 боштук менен JSON форматтаңыз", formName: "Redis орнотуулары", searchModeClient: "Кардар издөө режими", searchModeServer: "Сервер издөө режими", searchModeStartsWith: "Издөө режими менен башталат", searchModeIncludes: "Издөө режимин камтыйт" }, field: { treeSeparator: "Дарак бөлгүч", treeSeparatorSelector: "Дарак бөлгүч тандагыч", page: "Дарак пейджинг саны", keyPageCount: "Ачкыч пейджинг саны", keysSort: "Ачкычтарды иреттөө", searchMode: "Издөө режими", searchModeStartsWith: "Издөө / камтыйт менен башталат" }, error: { keyPageCount: "Негизги беттердин саны 5 - 100 ортосундагы бүтүн сан болушу керек", page: "Барактардын саны 10 - 5000 ортосундагы бүтүн сан болушу керек", maxValueDisplay: "Дисплейдин максималдуу мааниси -1 менен 32768 ортосундагы бүтүн сан болушу керек", maxKeys: "Ачкыч санынын максималдуу мааниси 100 менен 100000 ортосундагы бүтүн сан болушу керек" } }, key: { label: { formName: { add: "Жаңы Redis ачкычын кошуңуз", edit: "Redis ачкычын түзөтүңүз", append: "Учурдагы Redis ачкычына кошуу" } }, field: { streamTimestamp: "Убакыт белгиси", key: "ачкыч", type: "Түр", index: "Индекс", hashKey: "Хеш ачкычы", score: "Упай", value: "Нарк" }, error: { streamTimestamp: "Redis форматында же * катары убакыт белгиси талап кылынат", key: "Негизгиси, жок эле дегенде, бир каарман", hashKey: "Хэш таблицанын ачкычы жок дегенде бир белгиден турат", score: "Сорттолгон упай талап кылынат", value: "Маани талап кылынат" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Издөө", index: "Индекс", query: "Суроо", results: "Натыйжалар", noIndex: "Индекстер табылган жок", createIndex: "Индекс түзүү", dropIndex: "Индексти жоюу", indexInfo: "Индекс маалыматы", indexName: "Индекс аты", prefix: "Ачкыч префикси (милдеттүү эмес)", fieldName: "Талаа аты", }, monitor: { title: "Мониторинг", memory: "Эстутум", opsPerSec: "Операция/сек", clients: "Кардарлар", blocked: "Бөгөттөлгөн", hitsMisses: "Жетишкендик", networkIo: "Тармак I/O", slowLog: "Жай журнал", totalCommands: "Бардыгы", expired: "Мөөнөтү бүткөн", evicted: "Чыгарылган", clientList: "Кардарлар тизмеси", topKeys: "Эстутум боюнча чоң ачкычтар", killClient: "Кардарды токтотуу", clientKilled: "Кардар токтотулду", confirmKillClient: "Бул кардарды токтотууга ишенесизби?", noKeys: "Ачкычтар жок", noClients: "Кардарлар жок", }, overview: { noConnected: "Redis менен байланыш жок.", overviewClients: "Кардарлардын саны боюнча туташкандарды тизмектеңиз", connectedCount: opt => { if (opt.length === 1) { return "1 кардар"; } return `${opt.length} кардарлар`; } }, key: { label: { key: "ачкыч", encoding: "Коддоо", length: "Өлчөмү", ttl: "TTL", ttlTitle: "Жашоо убактысы", type: "Түр", ttlNotExpire: "мөөнөтү бүтпөйт", lengthString: "байт", lengthItem: "буюмдар", actions: "Аракеттер" }, list: { table: { index: "Индекс", value: "Нарк" } }, hash: { table: { hashkey: "Hashkey", value: "Нарк" } }, set: { table: { value: "мүчө" } }, zset: { table: { value: "мүчө", score: "Упай" } }, stream: { table: { timestamp: "Убакыт белгиси", field: "Талаа", value: "Нарк" } } }, treeControls: { settings: "Дарак орнотуулары", expandAll: "Баарын кеңейтүү", collapseAll: "Баарын жыйноо", search: { search: "Ачкычтардан издеңиз", clear: "Бош коюу үчүн учурдагы издөөнү тазалаңыз", placeholderClient: "Кардар тарабынан издөө", placeholderServer: "Издөө сервер тарабы", info: "Кардар тарабынан издөө дегенди билдирет, ал издөө киргизүүдөгү тек��тке дал келет. Сервер тарабында издөө, бул *{search-text}* сыяктуу баскычтардын үлгүлөрүндөгү издөө сыяктуу. Чоң издөө топтомдору үчүн сервердик издөөнү колдонуу жакшы. Кичинекей издөө топтомдору үчүн кардар тарабынан издөө режимин колдонуу жакшы." + ` Эгер ачкычтарды эсептөө бүтсө ${p3xr.settings.maxLightKeysCount}, сиз сервер тараптан гана издей аласыз.`, largeSetInfo: "Чоң топтомдо кардар тарабынан издөө өчүрүлгөн. ошондуктан азыр сервер тараптан издөө гана мүмкүн.", infoDetails: "Издөө кандай иштээрин билүү үчүн, жөндөөлөрдү текшериңиз" }, pager: { next: "Кийинки", prev: "Мурунку", first: "Биринчи", last: "Акыркы" } } }, time: { loading: "Жүктөлүүдө...", years: "жыл", months: "айлар", days: "күн", year: "жыл", month: "ай", day: "күн" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/lt/000077500000000000000000000000001517666434100137725ustar00rootroot00000000000000src/strings/lt/strings.js000066400000000000000000000700571517666434100160320ustar00rootroot00000000000000const strings = { error: { cleared_license: "Išvalyta licencija", invalid_license: "Neteisinga licencija", license_max_devices_reached: "Pasiektas maksimalus įrenginio vietų skaičius", license_readonly: "Licenciją galima pakeisti tik iš serverio terminalo.", server_error: "Serverio klaida, bandykite dar kartą" }, title: { donate: "Paaukoti", jsonRecursive: "Išplečiant visus lapus", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Kairiajame apatiniame meniu galite pasirinkti Redis jungtį.", statistics: "Statistika", error: "Klaida", connectingRedis: "Jungiamasi prie Redis...", socketioConnectError: "Socket.IO klaida", db: "DB", server: "Serveris", clients: "Klientai", memory: "Atmintis", persistence: "Patvarumas", stats: "Statistika", replication: "Replikacija", cpu: "CPU", cluster: "Cluster", modules: "Moduliai", errorstats: "Klaidų statistika", commandstats: "Komandų statistika", latencystats: "Vėlinimo statistika", keysizes: "Raktų dydžiai", threads: "Gijos", }, confirm: { dropIndex: "Ar tikrai norite ištrinti šį indeksą?", uploadBuffer: "Ar tikrai įkelsite šiuos dvejetainius duomenis?", uploadBufferDone: "Dvejetainiai duomenys įkeliami", uploadBufferDoneAndSave: "Dvejetainiai duomenys įkeliami ir išsaugomi serveryje", title: "Patvirtinti", alert: "Įspėjimas", info: "Informacija", deleteListItem: "Ar tikrai ištrinsite šį sąrašo elementą?", deleteHashKey: "Ar tikrai ištrinsite šį maišos rakto elementą?", deleteStreamTimestamp: "Ar tikrai ištrinsite šią srauto laiko žymą?", deleteSetMember: "Ar tikrai ištrinsite šį rinkinio narį?", deleteZSetMember: "Ar tikrai ištrinsite šį surūšiuoto rinkinio narį?", deleteConnection: "Patvirtinti", deleteConnectionText: "Ar tikrai ištrinsite šį Redis ryšį?", deleteNode: "Ar tikrai ištrinsite šį Redis mazgą?", deleteAllKeys: opts => { return `Ištrinti šį medį ir visus jo raktus (${opts.key})?`; }, socketioConnectError: "Socket.IO negali prisijungti prie serverio, galite perkrauti ir patys bandyti išspręsti ryšio klaidą, klientas pats nežino, kaip ją išspręsti.", socketioAuthRequired: "Reikalingas Socket.IO leidimas. Autentifikuokite naudodami HTTP Basic Auth (naudotojo vardą / slaptažodį) ir įkelkite iš naujo.", deleteKey: "Ar tikrai ištrinsite šį raktą?", rename: { title: "Ar tikrai pervardysite šį raktą?", textContent: "Šis veiksmas visam laikui pervadina raktą.", placeholder: "Raktas Redis (būtinas)" }, ttl: { title: "Ar tikrai norite pakeisti šio rakto TTL?", textContent: "Pakeitus TTL atnaujinamas šio rakto gyvavimo laikas. Palikite tuščią, kad šis raktas liktų amžinai.", placeholder: "Redis rakto TTL (sveikasis skaičius arba tuščias)", placeholderPlaceholder: "Tuščia reiškia, kad ji išlieka amžinai; kitu atveju įveskite sveikąjį skaičių.", convertTextToTime: "Konvertuoti tekstą į laiką", convertTextToTimePlaceholder: "Pvz. 1d bus 86400" }, license: { title: "Nustatyti licenciją", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Licencijos raktas" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopijuoti", downloadBuffer: "Parsisiųsti dvejetainį", setBuffer: "Įkelti dvejetainį failą", exportKeys: "Eksportuoti raktus", exportAllKeys: (opts) => `Eksportuoti visus ${opts.count} raktus`, exportSearchResults: (opts) => `Eksportuoti ${opts.count} rezultatų`, importKeys: "Importuoti raktus", saveWithFormatJson: "Išsaugoti naudojant formatą", formatJson: "Json formatas", wrap: "Apvyniokite", unwrap: "Išvynioti", downloadJson: "Atsisiųskite JSON", pubsubMonitor: "PubSub monitorius", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Kalba", ok: "Gerai", addKey: "Pridėti prie šio rakto", addKeyRoot: "Pridėkite šakninį raktą", reloadKey: "Iš naujo įkelti raktą", reload: "Įkelti iš naujo", close: "Uždaryti", commands: "Komandos", view: "Žiūrėti", statistics: "Statistika", refresh: "Atnaujinti", pause: "Pristabdyti", resume: "Tęsti", clear: "Aišku", rename: "Pervardyti", main: "Duomenų bazė", cancel: "Atšaukti", theme: "Tema", github: "GitHub", githubRepo: "Saugykla", githubRelease: "Išleidimai", githubChangelog: "Pakeitimų žurnalas", info: "Info", settings: "Nustatymai", connect: "Prisijunkite", disconnect: "Atsijungti", overview: "Apžvalga", console: "konsolė", noConnections: "Nėra ryšių, pridėkite ryšį nustatymų meniu.", noConnectionsInSettings: "Nėra jokių ryšių, aukščiau galite pridėti NAUJĄ RYŠĮ.", connectionAdd: "Naujas ryšys", addGroup: "Pridėti grupę", extend: "Prailginti", collapse: "Sutraukti", add: "Pridėti", edit: "Redaguoti", save: "Išsaugoti", ttl: "Nustatyti TTL", license: "Nustatyti licenciją", delete: "Ištrinti", remove: "Pašalinti", sure: "Žinoma", testConnection: "Bandomasis ryšys", getKey: "Įkeliamas Redis raktas ir susiję duomenys...", jsonViewShow: "Ekranas JSON", jsonViewEditor: "Redaguoti JSON", quickConsole: "Greitoji konsolė", }, label: { id: { nodeId: "Mazgo ID", id: "Ryšio ID", info: "Jei nenorite keisti ypatybių: sshPassword, sshPrivateKey, slaptažodžio, tlsCrt, tlsKey, tlsCa, įveskite ryšio ID šiose ypatybėse, kad ypatybių reikšmės liktų nepakitusios. Jei norite, kad mazgo slaptažodis būtų tokia pati, tada įveskite mazgo ID į mazgo slaptažodį." }, secureFeature: "Jei matote reikšmę, kuri prasideda P3X ir atrodo taip pat, tai yra saugi funkcija. Norėdami pakeisti nustatymus, tiesiog pakeiskite ��iuos nustatymus tuščiais ar kažkuo kitu ir jie bus išsaugoti. Jei nustatymų nepakeisite, nustatymai išliks tokie, kokie yra serveryje.", ssh: { on: "SSH įjungta", off: "SSH išjungtas", sshHost: "SSH Pagrindinis kompiuteris", sshPort: "SSH prievadas", sshUsername: "SSH vartotojo vardas", sshPassword: "SSH slaptažodis", sshPrivateKey: "SSH privatus raktas" }, isBuffer: opts => `[object ArrayBuffer] reiškia, kad reikšmė yra dvejetainiai duomenys arba reikšmė yra didesnė nei ${opts.maxValueAsBuffer}`, streamValue: `Srauto laukas ir vertė yra vienareikšmė. Pvz.: 1 laukas 1 vertė "2 laukas" "2 reikšmė"`, streamTimestampId: `„*“ reiškia automatiškai sugeneruotą arba specifikaciją kaip -`, unableToLoadKey: ({ key }) => { return `Nepavyko įkelti šio rakto: ${key}. Galimas dalykas, raktas buvo ištrintas. Tiksli klaida yra konsolėje.`; }, bigJson: "Šis JSON objektas yra didesnis nei 10 kb, todėl įsitikinkite, kad žinote, ką darote, nes kai kurios funkcijos gali būti lėtos.", addNode: "Pridėti mazgą", validateJson: "Patvirtinkite JSON", reducedFunction: `Sumažintas funkcionalumas`, tooManyKeys: opts => { return `Visoms maksimalioms funkcijoms leidžiamų klavišų suma yra ${opts.maxLightKeysCount} skaičiuoti. Šioje duomenų bazėje iš viso yra daugiau nei leidžiami raktai ${opts.count}. Raktų rūšiavimas ir papildoma išgalvota medžio informacija išjungta. Paieška vyksta tik serveryje, o ne kliento paieška.`; }, redisCommandNotFound: "Nerasta komandų Redis atitikmenų...", treeKeyStore: `Rūšiavimas (natūralus palyginimas) vykdomas kliente, dar žinomame kaip naršyklė, o tai reiškia, kad už didelius didelius rinkinius, pvz., daugiau nei 10 000 raktų, taikoma bauda, tai gali pridėti šiek tiek laiko puslapio atvaizdavimui. Redis raktų rūšiavimo nėra, tik taip.`, socketIoTimeout: options => { return `Baigėsi šios užklausos Socket.IO skirtasis laikas (maks ${options.timeout / 1000} sekundės)...`; }, resizerInfo: options => { return `Minimalus kairiojo arba dešiniojo skydelio plotis yra ${options.width}px`; }, jsonViewNotParsable: "Šios reikšmės JSON negalima analizuoti ", ttlTitle: "Nustatykite TTL per kelias sekundes", passwordSecure: "Slaptažodis gali būti tuščias, bet vis tiek bus rodomi simboliai, tai yra saugos funkcija.", tlsWithoutCert: "Įgalinti TLS be papildomo sertifikato", tlsRejectUnauthorized: "Atmesti neteisėtą sertifikatą", tlsSecure: "Jei matote TLS konfigūraciją, kuri prasideda P3X arba visi TLS nustatymai atrodo taip pat, tai yra saugi funkcija. Norėdami pakeisti nustatymus, tiesiog pakeiskite ��iuos nustatymus tuščiais ar kažkuo kitu ir jie bus išsaugoti. Jei nepakeisite TLS nustatymų, nustatymai išliks tokie, kokie yra serveryje.", treeSeparatorEmpty: "Jei medžio separatorius tuščias, medis neturės įdėtų mazgų, tik gryną sąrašą", treeSeparatorEmptyNote: "Nėra įdėtų mazgų, tik grynas sąrašas", welcomeConsole: "Sveiki atvykę į Redis konsolę", welcomeConsoleInfo: "Žymeklio AUKŠTYN arba ŽEMYN istorija įjungta", redisListIndexInfo: "Tuščia, kad pridėtumėte, -1, kad pridėtumėte arba išsaugotumėte rodomoje pozicijoje.", console: "konsolė", connectiondAdd: "Pridėti ryšį", connectiondEdit: "Redaguoti ryšį", connectiondView: "Žiūrėti ryšį", connections: "Jungtys", licenseInfo: "Licencija", licenseEditable: "Licencija redaguojama", licenseEditableYes: "Taip", licenseEditableNo: "Nr", licenseTerminalOnly: "Licenciją galima konfigūruoti tik iš serverio terminalo.", licenseTierPolicyTitle: "Pakopų politika", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "valstybė", licenseStateActive: "Aktyvus", licenseStateInactive: "Neaktyvus", licenseStateNoLicense: "Licencijos nėra", licenseKeyMasked: "Išsaugotas raktas", licenseTier: "Pakopa", licenseValid: "Galioja", licenseStatus: "Licencijos būsena", licenseReason: "Priežastis", licenseCheckedAt: "Patikrintas adresu", licenseStartsAt: "Prasideda val", licenseExpiresAt: "Galiojimas baigiasi val", licenseDaysLeft: "Liko dienos", licenseMaxDevices: "Max įrenginiai", licenseActiveDevices: "Aktyvūs įrenginiai", licenseActiveDevicesInfo: "Jei prietaisas nebenaudojamas, jo sėdynė automatiškai atleidžiama po 75 minučių.", licenseCustomerEmail: "Kliento el", licenseFeatures: "Savybės", licenseFeaturesEmpty: "Jokių papildomų funkcijų", licenseFeatureReadonlyMode: "Tik skaitymo ryšio režimas", licenseFeatureReadonlyConnectionsFlag: "Tik skaitymo jungtys (--readonly-connections/-r)", licenseFeatureSsh: "SSH tuneliavimas", licenseFeatureCluster: "Cluster jungtys", licenseFeatureSentinel: "Sentinel jungtys", licenseFeatureReJSON: "ReJSON (duomenų tipas JSON)", keysSort: { on: "Raktų rūšiavimas įjungtas", off: "Raktų rūšiavimas" }, cluster: { on: "Cluster įjungta", off: "Cluster išjungtas" }, sentinel: { on: "Sentinel įjungta", off: "Sentinel išjungtas", name: "Sentinel pavadinimas" }, readonly: { on: "Tik skaityti", off: "Tik skaitymui išjungtas" }, proSshOnly: "„SSH“ yra „Pro“ arba „Enterprise“.", proReadonlyOnly: "Tik skaitymo ryšio režimas galimas „Pro“ arba „Enterprise“.", enterpriseClusterSentinelOnly: "Cluster ir Sentinel pasiekiami tik įmonėje.", theme: { light: "Šviesa", dark: "Tamsi įmonė", darkNeu: "Tamsus", darkoBluo: "Darko mėlyna", enterprise: "Įmonė", redis: "Redis", matrix: "Matrica" }, connected: opts => { return `Prisijungta: ${opts.name}`; }, tree: "Medis", askAuth: "Paprašykite leidimo", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduliai", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Atsijungti", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Komandos", ungrouped: "Be grupės", grouped: "Grouped", connectFirst: "Pirmiausia prisijunkite prie Redis serverio", searchLanguage: "Ieškoti kalbos...", exportProgress: "Eksportuojami raktai...", importProgress: "Importuojami raktai...", importPreview: "Peržiūra", importOverwrite: "Perrašyti", importSkip: "Praleisti", importConflict: "Jei raktas jau egzistuoja:", noKeysToExport: "Nėra raktų eksportavimui", time: "Laikas", loading: "Kraunama...", autoRefresh: "Auto", exportSearchHint: "Eksportuojami tik raktai, atitinkantys dabartinę paiešką", importSearchHint: "Importas taikomas visai duomenų bazei, ne tik paieškos rezultatams", importNoKeys: "Faile nerasta raktų", }, status: { dataCopied: "Duomenys yra iškarpinėje", licenseSaved: "Licencija išsaugota", exportDone: "Eksportas baigtas", indexCreated: "Indeksas sukurtas", indexDropped: "Indeksas ištrintas", importDone: (opts) => `Importas baigtas: ${opts.created} sukurta, ${opts.skipped} praleista, ${opts.errors} klaidų`, nodeRemoved: "Mazgas pašalintas", keyIsNotExisting: "Šis raktas galėjo būti ištrintas arba pasibaigęs.", keyCount: opts => { if (opts.keyCount === 0) { return "Nėra rakto"; } else if (opts.keyCount === 1) { return "1 raktas"; } else { return `${opts.keyCount} raktus`; } }, treeExpandAll: "Išskleiskite visus medžių lapus. Ši operacija gali būti brangi ir užtrukti...", noRedisKeys: "Šioje duomenų bazėje nėra raktų.", redisConnected: "Redis sėkmingai prijungtas", reloadingDataInfo: "Iš naujo įkeliama Redis duomenų informacija", added: "Pridėta", saved: "Atnaujinta", cancelled: "Atšaukta", deleted: "Ištrinta", savedRedis: "Redis duomenys išsaugomi", redisDisconnected: opts => { return `Dabartiniame ryšyje įvyko klaida: ${opts.error.message}`; }, dbChanged: opts => { return `Db indeksas nustatytas į ${opts.db}. `; }, treeDeleted: opts => { return `Medžio raktas buvo ištrintas (${opts.key}).`; }, deletedKey: opts => { return `Raktas buvo ištrintas (${opts.key}).`; }, renamedKey: "Šis raktas buvo pervadintas", ttlChanged: "Šio rakto TTL buvo pakeistas", notInteger: "Ši įvestis nėra sveikasis skaičius", persisted: "Šis raktas išlieka amžinai", set: "Raktas nustatytas/pridėtas" }, code: { "delete-connection": "Šis ryšys buvo ištrintas, todėl esate atjungtas nuo šio Redis egzemplioriaus.", "save-connection": "Šis ryšys buvo pakeistas, todėl esate atjungtas nuo šio Redis egzemplioriaus. Galite prisijungti iš naujo.", "readonly-connections": "Ryšiai pridėti / išsaugoti / ištrinti yra tik skaitomi!", "readonly-connection-mode": "Šis ryšys yra tik skaitymo režimas!", "list-out-of-bounds": "Šis sąrašo indeksas viršija ribas", "donation-ware-feature": "Ši funkcija yra donorystės versijoje.", "feature-pro-readonly-required": "Tik skaitymo ryšio režimui reikalinga Pro arba Enterprise licencija.", "feature-pro-ssh-required": "SSH tuneliavimui reikalinga Pro arba Enterprise licencija.", "feature-enterprise-cluster-sentinel-required": "Cluster ir Sentinel reikalinga įmonės licencija.", "feature-pro-json-binary-required": "Redaguoti JSON, įkelti dvejetainį ir atsisiųsti dvejetainį failą reikalauja Pro arba Enterprise licencijos.", "feature-pro-rejson-required": "ReJSON (duomenų tipas JSON) reikalinga Pro arba Enterprise licencija.", "invalid-json-value": "Vertė neteisinga JSON.", "http_auth_required": "Reikalingas įgaliojimas: patvirtinkite tapatybę naudodami HTTP Basic Auth ir įkelkite iš naujo.", "auto-connection-failed": "Gali būti, kad ryšys buvo pašalintas ir dėl to nepavyko prisijungti.", invalid_console_command: "Ši komanda neveikia naudojant GUI." }, licenseReason: { LICENSE_VALID: "Licencija galioja", LICENSE_INVALID: "Licencija negalioja", LICENSE_MISSING: "Licencijos raktas nenustatytas", LICENSE_DISABLED: "Licencija išjungta serverio konfigūracijoje", LICENSE_NOT_FOUND: "Licencija nerasta", LICENSE_EXPIRED: "Licencija pasibaigė", LICENSE_CLEARED: "Licencijos raktas buvo išvalytas", LICENSE_MAX_DEVICES_REACHED: "Pasiektas maksimalus įrenginio vietų skaičius", PRODUCT_MISMATCH: "Licencijuotas produktas neatitinka" }, licenseStatusValue: { active: "Aktyvus", deleted: "Ištrinta", all: "Visi", expired: "Baigėsi galiojimo laikas", missing: "Trūksta", inactive: "Neaktyvus" }, form: { error: { required: "Reikalingas", port: "Uostas yra tarp 1-65535", invalid: "Forma neteisinga" }, connection: { label: { name: "Vardas", group: "Group", host: "Pagrindinio kompiuterio pavadinimas", port: "Uostas", password: "Slaptažodis", username: "Vartotojo vardas" } }, treeSettings: { maxValueDisplay: "Maksimalios vertės rodymo eilutės ilgis", maxValueDisplayInfo: "Jei nustatyta į 0, rodyti visas vertes. Jei didesnis nei 0, sutrumpinkite iki šio ilgio. Jei -1: eilutėms, slėpkite reikšmę iki redagavimo; kitiems tipams rodyti visą turinį.", maxKeys: "Maksimalus raktų skaičius", maxKeysInfo: "Kad GUI nesudužtų, apribojame maksimalų raktų skaičių.", keyCount: () => { return `Raktų skaičius: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Naudokite animaciją", noAnimation: "Nėra animacijos", jsonFormatTwoSpace: "Formatas JSON su 2 tarpais", jsonFormatFourSpace: "Formatas JSON su 4 tarpais", formName: "Redis nustatymai", searchModeClient: "Kliento paieškos režimas", searchModeServer: "Serverio paieškos režimas", searchModeStartsWith: "Paieška prasideda nuo režimo", searchModeIncludes: "Paieška apima režimą" }, field: { treeSeparator: "Medžių separatorius", treeSeparatorSelector: "Medžių separatoriaus parinkiklis", page: "Medžių puslapių skaičius", keyPageCount: "Raktų puslapių skaičius", keysSort: "Rūšiuoti raktus", searchMode: "Paieškos režimas", searchModeStartsWith: "Paieška prasideda nuo / apima" }, error: { keyPageCount: "Pagrindinis puslapių skaičius turi būti sveikasis skaičius nuo 5 iki 100", page: "Puslapių skaičius turi būti sveikasis skaičius nuo 10 iki 5000", maxValueDisplay: "Didžiausia rodoma reikšmė turi būti sveikasis skaičius nuo –1 iki 32768", maxKeys: "Didžiausia raktų skaičiaus vertė turi būti sveikasis skaičius nuo 100 iki 100 000" } }, key: { label: { formName: { add: "Pridėkite naują Redis raktą", edit: "Redaguoti Redis raktą", append: "Pridėti prie esamo Redis rakto" } }, field: { streamTimestamp: "Laiko žyma", key: "Raktas", type: "Tipas", index: "Rodyklė", hashKey: "Maišos raktas", score: "Rezultatas", value: "Vertė" }, error: { streamTimestamp: "Būtina nurodyti laiko žymą Redis formatu arba kaip *", key: "Svarbiausia yra bent vienas simbolis", hashKey: "Maišos lentelės raktą sudaro bent vienas simbolis", score: "Reikalingas surūšiuotas rinkinio balas", value: "Reikšmė būtina" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Paieška", index: "Indeksas", query: "Užklausa", results: "Rezultatai", noIndex: "Indeksų nerasta", createIndex: "Sukurti indeksą", dropIndex: "Ištrinti indeksą", indexInfo: "Indekso info", indexName: "Indekso pavadinimas", prefix: "Rakto prefiksas (neprivaloma)", fieldName: "Lauko pavadinimas", }, monitor: { title: "Stebėjimas", memory: "Atmintis", opsPerSec: "Operacijų/s", clients: "Klientai", blocked: "Užblokuota", hitsMisses: "Pataikymo rodiklis", networkIo: "Tinklas I/O", slowLog: "Lėtas žurnalas", totalCommands: "Viso", expired: "Pasibaigę", evicted: "Pašalinti", clientList: "Klientų sąrašas", topKeys: "Didžiausi raktai pagal atmintį", killClient: "Nutraukti klientą", clientKilled: "Klientas nutrauktas", confirmKillClient: "Ar tikrai norite nutraukti šį klientą?", noKeys: "Nėra raktų", noClients: "Nėra klientų", }, overview: { noConnected: "Nėra ryšio su Redis.", overviewClients: "Išvardykite sujungtus pagal klientų skaičių", connectedCount: opt => { if (opt.length === 1) { return "1 klientas"; } return `${opt.length} klientų`; } }, key: { label: { key: "Raktas", encoding: "Kodavimas", length: "Dydis", ttl: "TTL", ttlTitle: "Laikas gyventi", type: "Tipas", ttlNotExpire: "nesibaigia", lengthString: "baitų", lengthItem: "daiktų", actions: "Veiksmai" }, list: { table: { index: "Rodyklė", value: "Vertė" } }, hash: { table: { hashkey: "Hashkey", value: "Vertė" } }, set: { table: { value: "narys" } }, zset: { table: { value: "narys", score: "Rezultatas" } }, stream: { table: { timestamp: "Laiko žymos ID", field: "Laukas", value: "Vertė" } } }, treeControls: { settings: "Medžio nustatymai", expandAll: "Išskleisti viską", collapseAll: "Sutraukti viską", search: { search: "Ieškokite raktuose", clear: "Išvalykite dabartinę paiešką, kad nustatytumėte tuščią", placeholderClient: "Ieškokite kliento pusėje", placeholderServer: "Ieškoti serverio pusėje", info: "Kliento pusės paieška reiškia, kad ji atitinka tekstą paieškos įvestyje. Serverio pusės paieška reiškia, kad tai yra kaip paieška raktų šablonuose kaip *{search-text}*. Dideliems paieškos rinkiniams geriau naudoti paiešką serverio pusėje. Mažesniems paieškos rinkiniams geriau naudoti kliento pusės paieškos režimą." + ` Jei klavišų skaičiavimas baigėsi ${p3xr.settings.maxLightKeysCount}, galite ieškoti tik serverio pusėje.`, largeSetInfo: "Dideliame rinkinyje kliento pusės paieška išjungta. taigi šiuo metu galima tik paieška serverio pusėje.", infoDetails: "Norėdami sužinoti, kaip veikia paieška, peržiūrėkite nustatymus" }, pager: { next: "Kitas", prev: "Ankstesnis", first: "Pirma", last: "Paskutinis" } } }, time: { loading: "Kraunama...", years: "metų", months: "mėnesių", days: "dienų", year: "metų", month: "mėnuo", day: "dieną" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/mk/000077500000000000000000000000001517666434100137625ustar00rootroot00000000000000src/strings/mk/strings.js000066400000000000000000001122241517666434100160130ustar00rootroot00000000000000const strings = { error: { cleared_license: "Исчистена лиценца", invalid_license: "Неважечка лиценца", license_max_devices_reached: "Достигнати се максимални места на уредот", license_readonly: "Лиценцата може да се смени само од терминалот на серверот.", server_error: "Грешка на серверот, обидете се повторно" }, title: { donate: "Донирајте", jsonRecursive: "Проширување на сите лисја", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Може да изберете Redis конекција за поврзување од левото долно мени.", statistics: "Статистика", error: "Грешка", connectingRedis: "Се поврзува со Redis ...", socketioConnectError: "Socket.IO Грешка", db: "DB", server: "Сервер", clients: "Клиенти", memory: "Меморија", persistence: "Упорност", stats: "Статистика", replication: "Репликација", cpu: "CPU", cluster: "Cluster", modules: "Модuli", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "Дали сте сигурни дека сакате да го избришете овој индекс?", uploadBuffer: "Дали сте сигурни дека ќе ги поставите овие бинарни податоци?", uploadBufferDone: "Бинарните податоци се поставени", uploadBufferDoneAndSave: "Бинарните податоци се поставуваат и се зачувуваат на серверот", title: "Потврди", alert: "Предупредување", info: "Инфо", deleteListItem: "Дали сте сигурни дека ќе ја избришете оваа ставка од списокот?", deleteHashKey: "Дали сте сигурни дека ќе ја избришете оваа хаш-клучна ставка?", deleteStreamTimestamp: "Дали сигурно ќе го избришете овој временски печат за пренос?", deleteSetMember: "Дали сте сигурни дека ќе го избришете овој член на сет?", deleteZSetMember: "Дали сте сигурни дека ќе го избришете овој подреден сет член?", deleteConnection: "Потврди", deleteConnectionText: "Дали сте сигурни дека ќе ја избришете оваа врска Redis?", deleteNode: "Дали сте сигурни дека ќе го избришете овој Redis јазол?", deleteAllKeys: opts => { return `Избришете го ова дрво и сите негови клучеви (${opts.key})?`; }, socketioConnectError: "Socket.IO не може да се поврзе со серверот, можете повторно да вчитате и да се обидете сами да ја решите грешката во врската, клиентот не знае како сам да ја реши.", socketioAuthRequired: "Потребна е овластување Socket.IO. Ве молиме проверете ја автентичноста со HTTP Basic Auth (корисничко име/лозинка) и вчитајте повторно.", deleteKey: "Дали сигурно ќе го избришете овој клуч?", rename: { title: "Дали сигурно ќе го преименувате овој клуч?", textContent: "Оваа акција трајно го преименува клучот.", placeholder: "Копчето Redis (задолжително)" }, ttl: { title: "Дали сте сигурни дека сакате да го промените TTL на овој клуч?", textContent: "Промената на TTL го ажурира времето на живеење на овој клуч. Оставете празен за да го задржите овој клуч засекогаш.", placeholder: "TTL на клучот Redis (цел број или празен)", placeholderPlaceholder: "Празно значи дека опстојува засекогаш; во спротивно внесете цел број.", convertTextToTime: "Претворете го текстот во време", convertTextToTimePlaceholder: "На пр. 1d ќе биде 86400" }, license: { title: "Поставете лиценца", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Лиценца клуч" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Копирај", downloadBuffer: "Преземете бинарно", setBuffer: "Поставете бинарно", exportKeys: "Извези клучеви", exportAllKeys: (opts) => `Извези ги сите ${opts.count} клучеви`, exportSearchResults: (opts) => `Извези ${opts.count} резултати`, importKeys: "Увези клучеви", saveWithFormatJson: "Зач��вај со формат", formatJson: "Форматирајте Json", wrap: "Завиткајте", unwrap: "Одвиткајте", downloadJson: "Преземете го JSON", pubsubMonitor: "PubSub Монитор", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Јазик", ok: "Во ред", addKey: "Додај на овој клуч", addKeyRoot: "Додадете root клуч", reloadKey: "Вчитај повторно клуч", reload: "Вчитај повторно", close: "Затвори", commands: "Наредби", view: "Прикажи", statistics: "Статистика", refresh: "Освежи", pause: "Пауза", resume: "Продолжи", clear: "Јасно", rename: "Преименувај", main: "База на податоци", cancel: "Откажи", theme: "Тема", github: "GitHub", githubRepo: "Репозиториум", githubRelease: "Изданија", githubChangelog: "Промена", info: "Info", settings: "Поставки", connect: "Поврзете се", disconnect: "Исклучете се", overview: "Преглед", console: "Конзола", noConnections: "Нема врски, додајте врска во менито за поставки.", noConnectionsInSettings: "Нема врски, можете да додадете НОВА ВРСКА погоре.", connectionAdd: "Нова врска", addGroup: "Додади група", extend: "Прошири", collapse: "Колапс", add: "Додадете", edit: "Уреди", save: "Зачувај", ttl: "Поставете TTL", license: "Поставете лиценца", delete: "Избриши", remove: "Отстрани", sure: "Секако", testConnection: "Тест за поврзување", getKey: "Се вчитува клучот Redis и поврзаните податоци ...", jsonViewShow: "Приказ JSON", jsonViewEditor: "Уреди JSON", quickConsole: "Брза конзола", }, label: { id: { nodeId: "ИД на јазол", id: "ID за поврзување", info: "Ако не сакате да ги промените својствата на: sshPassword, sshPrivateKey, лозинка, tlsCrt, tlsKey, tlsCa, ве молиме внесете го ID на врската во тие својства за да ги задржите вредностите на својствата непроменети. Ако ја сакате истата логика во лозинката на јазолот, тогаш внесете го ID на јазолот во лозинката на јазолот." }, secureFeature: "Ако видите вредност што започнува со P3X и изгледа исто, тоа е безбедна карактеристика. За да ги промените поставките, само заменете ги со празни или нешто друго и тие ќе бидат зачувани. Ако не ги промените поставките, поставките ќе се задржат како што се на серверот.", ssh: { on: "SSH вклучен", off: "SSH исклучено", sshHost: "SSH Домаќин", sshPort: "SSH порта", sshUsername: "Корисничко име SSH", sshPassword: "SSH лозинка", sshPrivateKey: "SSH приватен клуч" }, isBuffer: opts => `[object ArrayBuffer] значи дека вредноста е бинарен податок или вредноста е поголема од ${opts.maxValueAsBuffer}`, streamValue: `Полето и вредноста за стриминг се единечни линии. На пр.: поле 1 вредност1 "поле 2" "вредност 2"`, streamTimestampId: `„*“ значи автоматско генерирање или спецификација како -`, unableToLoadKey: ({ key }) => { return `Не може да се вчита овој клуч: ${key}. Можно е, клучот е избришан. Точната грешка е во конзолата.`; }, bigJson: "Овој објект JSON е над 10 kb, затоа погрижете се да знаете што правите, бидејќи некои функции може да бидат бавно рендерирање.", addNode: "Додадете јазол", validateJson: "Потврдете го JSON", reducedFunction: `Намалена функционалност`, tooManyKeys: opts => { return `За целосните максимални функции дозволените копчиња вкупно е ${opts.maxLightKeysCount} брои. Оваа база на податоци има вкупно над дозволените клучеви ${opts.count}. Сортирањето на копчињата и дополнителните фенси информации за дрвото се оневозможени. Пребарувањето се случува само на серверот наместо пребарувањето на клиентот.`; }, redisCommandNotFound: "Не е пронајдено совпаѓање на командата Redis ...", treeKeyStore: `Сортирањето (природно споредување) се извршува на клиентот или прелистувачот, што значи дека има казна за големи големи комплети, како клучеви од над 10 илјади, може да додаде малку време на прикажувањето на страницата. Нема сортирање на клучеви во Redis, само вака.`, socketIoTimeout: options => { return `Времето на Socket.IO истече за ова барање (макс ${options.timeout / 1000} секунди) ...`; }, resizerInfo: options => { return `Минималната ширина на левата или десната плоча е ${options.width}px`; }, jsonViewNotParsable: "Оваа вредност не може да се анализира JSON ", ttlTitle: "Поставете го TTL за секунди", passwordSecure: "Лозинката можеби ќе биде празна, но сепак ќе прикажува знаци, ова е безбедносна карактеристика.", tlsWithoutCert: "Овозможете TLS без дополнителен сертификат", tlsRejectUnauthorized: "Одбијте неовластен сертификат", tlsSecure: "Ако видите TLS конфигурација што започнува со P3X или сите поставки за TLS изгледаат исто, тоа е безбедна карактеристика. За да ги промените поставките, само заменете ги со празни или нешто друго и тие ќе бидат зачувани. Ако не ги промените поставките за TLS, поставките ќе се задржат како што се на серверот.", treeSeparatorEmpty: "Ако сепараторот на дрвото е празен, дрвото нема да има вгнездени јазли, само чиста листа", treeSeparatorEmptyNote: "Нема вгнездени јазли, само чиста листа", welcomeConsole: "Добредојдовте во конзолата Redis", welcomeConsoleInfo: "Историјата на курсорот ГОРЕ или ДОЛУ е овозможена", redisListIndexInfo: "Празен за додавање, -1 за прикачување или зачувување на прикажаната позиција.", console: "Конзола", connectiondAdd: "Додадете врска", connectiondEdit: "Уред�� врска", connectiondView: "Прикажи ја врската", connections: "Врски", licenseInfo: "Лиценца", licenseEditable: "Лиценца за уредување", licenseEditableYes: "Да", licenseEditableNo: "бр", licenseTerminalOnly: "Лиценцата може да се конфигурира само од терминалот на серверот.", licenseTierPolicyTitle: "Политика на нивоа", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "држава", licenseStateActive: "Активен", licenseStateInactive: "Неактивен", licenseStateNoLicense: "Без лиценца", licenseKeyMasked: "Зачуван клуч", licenseTier: "Ниво", licenseValid: "Важи", licenseStatus: "Статус на лиценца", licenseReason: "Причина", licenseCheckedAt: "Проверено во", licenseStartsAt: "Започнува во", licenseExpiresAt: "Истекува во", licenseDaysLeft: "Преостануваат денови", licenseMaxDevices: "Макс уреди", licenseActiveDevices: "Активни уреди", licenseActiveDevicesInfo: "Ако некој уред повеќе не се користи, неговото седиште автоматски се ослободува по 75 минути.", licenseCustomerEmail: "Е-пошта на клиентите", licenseFeatures: "Карактеристики", licenseFeaturesEmpty: "Нема дополнителни функции", licenseFeatureReadonlyMode: "Режим за поврзување само за читање", licenseFeatureReadonlyConnectionsFlag: "Врски само за читање (--readonly-connections/-r)", licenseFeatureSsh: "SSH тунелирање", licenseFeatureCluster: "Cluster врски", licenseFeatureSentinel: "Sentinel врски", licenseFeatureReJSON: "ReJSON (тип на податоци JSON)", keysSort: { on: "Вклучено е сортирање на копчињата", off: "Сортирање на копчињата" }, cluster: { on: "Cluster вклучен", off: "Cluster исклучено" }, sentinel: { on: "Sentinel вклучен", off: "Sentinel исклучено", name: "Sentinel име" }, readonly: { on: "Вклучено само за читање", off: "Исклучено само за читање" }, proSshOnly: "SSH е достапен во Pro или Enterprise.", proReadonlyOnly: "Режимот за поврзување само за читање е достапен во Pro или Enterprise.", enterpriseClusterSentinelOnly: "Cluster и Sentinel се достапн�� само во Enterprise.", theme: { light: "Светлина", dark: "Темно претпријатие", darkNeu: "Темно", darkoBluo: "Дарко Блуо", enterprise: "Претпријатие", redis: "Redis", matrix: "Матрица" }, connected: opts => { return `Поврзано: ${opts.name}`; }, tree: "Дрво", askAuth: "Побарајте овластување", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Модuli", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Исклучете се", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Команди", ungrouped: "Без група", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "Пребарај јазик...", exportProgress: "Извезување на клучеви...", importProgress: "Увезување на клучеви...", importPreview: "Преглед", importOverwrite: "Препишано", importSkip: "Прескокни", importConflict: "Ако клучот веќе постои:", noKeysToExport: "Нема клучеви за извоз", time: "Време", loading: "Се вчитува...", autoRefresh: "Авто", exportSearchHint: "Извоз само на клучеви кои одговараат на тековното пребарување", importSearchHint: "Увозот се применува на целата база на податоци, не само на резултатите од пребарувањето", importNoKeys: "Не се пронајдени клучеви во датотеката", }, status: { dataCopied: "Податоците се во таблата со исечоци", licenseSaved: "Лиценцата е зачувана", exportDone: "Извозот е завршен", indexCreated: "Индексот е создаден", indexDropped: "Индексот е избришан", importDone: (opts) => `Увозот завршен: ${opts.created} создадени, ${opts.skipped} прескокнати, ${opts.errors} грешки`, nodeRemoved: "Јазолот е отстранет", keyIsNotExisting: "Овој клуч можеше да биде избришан или истечен.", keyCount: opts => { if (opts.keyCount === 0) { return "Нема клуч"; } else if (opts.keyCount === 1) { return "1 клуч"; } else { return `${opts.keyCount} клучеви`; } }, treeExpandAll: "Проширете ги сите лисја на дрвјата. Оваа операција може да биде скапа и може да потрае ...", noRedisKeys: "Нема клучеви во оваа база на податоци.", redisConnected: "Redis е поврзан успешно", reloadingDataInfo: "Повторно вчитување податоци за Redis", added: "Додадено", saved: "Ажурирано", cancelled: "Откажано", deleted: "Избришано", savedRedis: "Податоците Redis се зачувани", redisDisconnected: opts => { return `Тековната врска имаше грешка: ${opts.error.message}`; }, dbChanged: opts => { return `Индексот db е поставен на ${opts.db}. `; }, treeDeleted: opts => { return `Клучот на дрвото беше избришан (${opts.key}).`; }, deletedKey: opts => { return `Клучот е избришан (${opts.key}).`; }, renamedKey: "Овој клуч е преименуван", ttlChanged: "TTL на овој клуч е променет", notInteger: "Овој влез не е цел број", persisted: "Овој клуч останува засекогаш", set: "Клучот е поставен/додаден" }, code: { "delete-connection": "Оваа врска е избришана, така што сте исклучени со овој примерок Redis.", "save-connection": "Оваа врска е променета, така што сте исклучени со овој примерок Redis. Може повторно да се поврзете.", "readonly-connections": "Врските за додавање/зачувување/бришење се само за читање!", "readonly-connection-mode": "Оваа врска е режим само за читање!", "list-out-of-bounds": "Овој индекс на список е надвор од границите", "donation-ware-feature": "Оваа функција е присутна во верзијата за донации.", "feature-pro-readonly-required": "Режимот за поврзување само за читање бара лиценца Pro или Enterprise.", "feature-pro-ssh-required": "За тунелирање SSH е потребна лиценца Pro или Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster и Sentinel бараат лиценца на Enterprise.", "feature-pro-json-binary-required": "Уредете го JSON, Поставете бинарно и преземање бинарно бара лиценца Pro или Enterprise.", "feature-pro-rejson-required": "ReJSON (тип на податоци JSON) бара лиценца Pro или Enterprise.", "invalid-json-value": "Вредноста не е валидна JSON.", "http_auth_required": "Потребна е овластување: ве молиме проверете ја автентичноста со HTTP Basic Auth и вчитајте ја повторно.", "auto-connection-failed": "Можно е, врската е отстранета и автоматската врска не успеа, поради ова.", invalid_console_command: "Оваа команда не работи преку GUI." }, licenseReason: { LICENSE_VALID: "Лиценцата е валидна", LICENSE_INVALID: "Лиценцата е неважечка", LICENSE_MISSING: "Не е поставен клуч за лиценца", LICENSE_DISABLED: "Лиценцата е оневозможена во конфигурацијата на серверот", LICENSE_NOT_FOUND: "Лиценцата не е пронајдена", LICENSE_EXPIRED: "Лиценцата е истечена", LICENSE_CLEARED: "Клучот за лиценца беше исчистен", LICENSE_MAX_DEVICES_REACHED: "Достигнати се максимални места на уредот", PRODUCT_MISMATCH: "Производот за лиценцирање не се совпаѓа" }, licenseStatusValue: { active: "Активен", deleted: "Избришано", all: "Сите", expired: "Истечен", missing: "Недостасува", inactive: "Неактивен" }, form: { error: { required: "Задолжително", port: "Пристаништето е помеѓу 1-65535", invalid: "Формата е неважечка" }, connection: { label: { name: "Име", group: "Group", host: "Име на домаќин", port: "Пристаниште", password: "Лозинка", username: "Корисничко име" } }, treeSettings: { maxValueDisplay: "Максимална вредност приказ на должина на низата", maxValueDisplayInfo: "Ако е поставено на 0, прикажете ги целосните вредности. Ако е поголемо од 0, скратете го на оваа должина. Ако -1: за низи, скријте ја вредноста до уредување; за други типови, прикажете целосна содржина.", maxKeys: "Максималниот број на клучеви", maxKeysInfo: "За да не падне GUI, го ограничуваме максималниот број на клучеви.", keyCount: () => { return `Број на клучеви: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Користете анимација", noAnimation: "Нема анимација", jsonFormatTwoSpace: "Форматирајте го JSON со 2 празни места", jsonFormatFourSpace: "Форматирајте го JSON со 4 празни места", formName: "Поставки за Redis", searchModeClient: "Режим за пребарување на клиент", searchModeServer: "Режим за пребарување на серверот", searchModeStartsWith: "Пребарувањето со започнува со режим", searchModeIncludes: "Пребарувањето вклучува режим" }, field: { treeSeparator: "Сепаратор на дрвја", treeSeparatorSelector: "Избирач на сепаратор на дрвја", page: "Број на страници на дрвото", keyPageCount: "Број на страници со клучеви", keysSort: "Подреди ги копчињата", searchMode: "Режим на пребарување", searchModeStartsWith: "Пребарувањето започнува со / вклучува" }, error: { keyPageCount: "Бројот на клучните страници мора да биде цел број помеѓу 5 - 100", page: "Бројот на страници мора да биде цел број помеѓу 10 - 5000", maxValueDisplay: "Максималната вредност на прикажување мора да биде цел број помеѓу -1 и 32768", maxKeys: "Максималната вредност на бројот на клучеви мора да биде цел број помеѓу 100 и 100000" } }, key: { label: { formName: { add: "Додадете нов клуч Redis", edit: "Уредете го клучот Redis", append: "Додај во постоечкиот клуч Redis" } }, field: { streamTimestamp: "Временски печат", key: "Клуч", type: "Тип", index: "Индекс", hashKey: "Хеш клуч", score: "Резултат", value: "Вредност" }, error: { streamTimestamp: "Потребен е временскиот печат, или формат Redis или како *", key: "Клучот е, барем, еден лик", hashKey: "Копчето за хеш табела е најмалку еден знак", score: "Потребен е подредениот сет резултат", value: "Вредноста е потребна" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Пребарување", index: "Индекс", query: "Барање", results: "Резултати", noIndex: "Не се пронајдени индекси", createIndex: "Создај индекс", dropIndex: "Избриши индекс", indexInfo: "Инфо за индекс", indexName: "Име на индекс", prefix: "Префикс на клуч (опционално)", fieldName: "Име на поле", }, monitor: { title: "Мониторинг", memory: "Меморија", opsPerSec: "Операции/сек", clients: "Клиенти", blocked: "Блокирани", hitsMisses: "Стапка на погодоци", networkIo: "Мрежа I/O", slowLog: "Бавен дневник", totalCommands: "Вкупно", expired: "Истечени", evicted: "Избркани", clientList: "Листа на клиенти", topKeys: "Најголеми клучеви по меморија", killClient: "Убиј клиент", clientKilled: "Клиентот е убиен", confirmKillClient: "Дали сте сигурни дека сакате да го прекинете овој клиент?", noKeys: "Нема клучеви", noClients: "Нема клиенти", }, overview: { noConnected: "Нема врска со Redis.", overviewClients: "Наведете ги поврзаните според бројот на клиенти", connectedCount: opt => { if (opt.length === 1) { return "1 клиент"; } return `${opt.length} клиенти`; } }, key: { label: { key: "Клуч", encoding: "Кодирање", length: "Големина", ttl: "TTL", ttlTitle: "Време да се живее", type: "Тип", ttlNotExpire: "не истекува", lengthString: "бајти", lengthItem: "предмети", actions: "Акции" }, list: { table: { index: "Индекс", value: "Вредност" } }, hash: { table: { hashkey: "Хашки", value: "Вредност" } }, set: { table: { value: "Член" } }, zset: { table: { value: "Член", score: "Резултат" } }, stream: { table: { timestamp: "ID на временски печат", field: "Поле", value: "Вредност" } } }, treeControls: { settings: "Поставки за дрво", expandAll: "Прошири ги сите", collapseAll: "Собори ги сите", search: { search: "Пребарајте во копчињата", clear: "Исчистете го тековното пребарување за да го поставите празно", placeholderClient: "Пребарајте ја страната на клиентот", placeholderServer: "Пребарување на страната на серверот", info: "Пребарувањето од страна на клиентот значи дека се совпаѓа со текстот во влезот за пребарување. Пребарувањето од страна на серверот значи, тоа е како пребарување во шаблоните на копчињата како *{search-text}*. За големи групи на пребарување, подобро е да користите пребарување од страна на серверот. За помали групи за пребарување, подобро е да се користи режимот за пребарување од страна на клиентот." + ` Ако пребројувањето на копчињата заврши ${p3xr.settings.maxLightKeysCount}, можете да пребарувате само на страната на серверот.`, largeSetInfo: "Во голем сет, пребарувањето од страна на клиентот е оневозможено. така што во моментов е можно само пребарување од страна на серверот.", infoDetails: "За да дознаете како функционира пребарувањето, проверете ги поставките" }, pager: { next: "Следно", prev: "Претходна", first: "Прво", last: "Последно" } } }, time: { loading: "Се вчитува...", years: "години", months: "месеци", days: "денови", year: "година", month: "месец", day: "ден" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ms/000077500000000000000000000000001517666434100137725ustar00rootroot00000000000000src/strings/ms/strings.js000066400000000000000000000662521517666434100160340ustar00rootroot00000000000000const strings = { error: { cleared_license: "Lesen dibersihkan", invalid_license: "Lesen tidak sah", license_max_devices_reached: "Tempat duduk peranti maksimum dicapai", license_readonly: "Lesen hanya boleh ditukar dari terminal pelayan.", server_error: "Ralat pelayan, sila cuba lagi" }, title: { donate: "Menderma", jsonRecursive: "Mengembangkan semua daun", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Anda boleh memilih sambungan Redis untuk disambungkan dari menu bawah kiri.", statistics: "Perangkaan", error: "ralat", connectingRedis: "Menyambung ke Redis ...", socketioConnectError: "Ralat Socket.IO", db: "DB", server: "pelayan", clients: "Pelanggan", memory: "Ingatan", persistence: "Kegigihan", stats: "Perangkaan", replication: "Replikasi", cpu: "CPU", cluster: "Cluster", modules: "Modul", errorstats: "Statistik Ralat", commandstats: "Statistik Arahan", latencystats: "Statistik Kependaman", keysizes: "Saiz Kunci", threads: "Benang", }, confirm: { dropIndex: "Adakah anda pasti mahu memadam indeks ini?", uploadBuffer: "Adakah anda pasti untuk memuat naik data binari ini?", uploadBufferDone: "Data binari dimuat naik", uploadBufferDoneAndSave: "Data binari dimuat naik dan disimpan pada pelayan", title: "sahkan", alert: "Makluman", info: "info", deleteListItem: "Adakah anda pasti akan memadamkan item senarai ini?", deleteHashKey: "Adakah anda pasti akan memadamkan item kunci cincang ini?", deleteStreamTimestamp: "Adakah anda pasti akan memadamkan cap masa strim ini?", deleteSetMember: "Adakah anda pasti akan memadamkan ahli set ini?", deleteZSetMember: "Adakah anda pasti akan memadamkan ahli set yang diisih ini?", deleteConnection: "sahkan", deleteConnectionText: "Adakah anda pasti akan memadamkan sambungan Redis ini?", deleteNode: "Adakah anda pasti akan memadamkan nod Redis ini?", deleteAllKeys: opts => { return `Padamkan pokok ini dan semua kuncinya (${opts.key})?`; }, socketioConnectError: "Socket.IO tidak boleh menyambung ke pelayan, anda boleh memuat semula dan cuba menyelesaikan sendiri ralat sambungan, pelanggan tidak tahu bagaimana untuk menyelesaikannya sendiri.", socketioAuthRequired: "Keizinan Socket.IO diperlukan. Sila sahkan dengan HTTP Basic Auth (nama pengguna/kata laluan) dan muat semula.", deleteKey: "Adakah anda pasti akan memadamkan kunci ini?", rename: { title: "Adakah anda pasti untuk menamakan semula kunci ini?", textContent: "Tindakan ini menamakan semula kunci secara kekal.", placeholder: "Kunci Redis (diperlukan)" }, ttl: { title: "Adakah anda pasti mahu menukar TTL kunci ini?", textContent: "Menukar TTL mengemas kini masa kunci ini untuk hidup. Biarkan kosong untuk menyimpan kunci ini selama-lamanya.", placeholder: "Kunci Redis TTL (integer atau kosong)", placeholderPlaceholder: "Kosong bermakna ia berterusan selama-lamanya; jika tidak masukkan integer.", convertTextToTime: "Tukar teks kepada masa", convertTextToTimePlaceholder: "Cth. 1d ialah 86400" }, license: { title: "Tetapkan lesen", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20AC1/month) or 4,000 HUF/year (\u20AC10/year), and Enterprise 1,200 HUF/month (\u20AC3/month) or 12,000 HUF/year (\u20AC30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20AC1.27/month) or 5,100 HUF/year (\u20AC12.70/year), Enterprise 1,500 HUF/month (\u20AC3.81/month) or 15,200 HUF/year (\u20AC38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Kunci lesen" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "salin", downloadBuffer: "Muat turun binari", setBuffer: "Muat naik binari", exportKeys: "Eksport kunci", exportAllKeys: (opts) => `Eksport semua ${opts.count} kunci`, exportSearchResults: (opts) => `Eksport ${opts.count} keputusan`, importKeys: "Import kunci", saveWithFormatJson: "Simpan dengan format", formatJson: "Format Json", wrap: "Bungkus", unwrap: "Buka bungkus", downloadJson: "Muat turun JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Bahasa", ok: "OK", addKey: "Tambahkan pada kunci ini", addKeyRoot: "Tambah kunci akar", reloadKey: "Muat semula kunci", reload: "Muat semula", close: "tutup", commands: "Perintah", view: "Lihat", statistics: "Perangkaan", refresh: "Segarkan semula", pause: "Jeda", resume: "Sambung", clear: "Jelas", rename: "Namakan semula", main: "Pangkalan data", cancel: "Batal", theme: "Tema", github: "GitHub", githubRepo: "Repositori", githubRelease: "Keluaran", githubChangelog: "Changelog", info: "Info", settings: "tetapan", connect: "Sambung", disconnect: "Putuskan sambungan", overview: "Gambaran keseluruhan", console: "Konsol", noConnections: "Tiada sambungan, tambah sambungan dalam menu tetapan.", noConnectionsInSettings: "Tiada sambungan, anda boleh menambah SAMBUNGAN BARU di atas.", connectionAdd: "Sambungan baharu", addGroup: "Tambah kumpulan", extend: "Panjangkan", collapse: "Runtuh", add: "Tambah", edit: "Sunting", save: "Jimat", ttl: "Tetapkan TTL", license: "Tetapkan lesen", delete: "Padam", remove: "Alih keluar", sure: "pasti", testConnection: "Uji sambungan", getKey: "Memuatkan kunci Redis dan data yang berkaitan ...", jsonViewShow: "Paparkan JSON", jsonViewEditor: "Edit JSON", quickConsole: "Konsol Pantas", }, label: { id: { nodeId: "ID nod", id: "ID Sambungan", info: "Jika anda tidak mahu menukar sifat-sifat: sshPassword, sshPrivateKey, kata laluan, tlsCrt, tlsKey, tlsCa, sila masukkan ID sambungan dalam sifat-sifat tersebut untuk mengekalkan nilai harta benda tersebut. Jika anda mahukan logik yang sama dalam kata laluan nod, kemudian masukkan ID nod dalam kata laluan nod." }, secureFeature: "Jika anda melihat nilai yang bermula dengan P3X rupa yang sama, ia adalah ciri selamat. Untuk menukar tetapan, cuma gantikan tetapan ini dengan kosong atau sesuatu yang lain dan ia akan disimpan. Jika anda tidak menukar tetapan, tetapan akan disimpan kerana ia berada pada pelayan.", ssh: { on: "SSH dihidupkan", off: "SSH dimatikan", sshHost: "SSH Hos", sshPort: "SSH port", sshUsername: "SSH nama pengguna", sshPassword: "Kata laluan SSH", sshPrivateKey: "Kunci peribadi SSH" }, isBuffer: opts => `[objek ArrayBuffer] bermakna bahawa nilai adalah data binari atau nilainya lebih besar daripada ${opts.maxValueAsBuffer}`, streamValue: `Medan dan nilai strim ialah satu pelapis. Cth.: medan1 nilai1 "medan 2" "nilai 2"`, streamTimestampId: `'*' bermaksud dijana secara automatik atau spesifikasi sebagai -`, unableToLoadKey: ({ key }) => { return `Tidak dapat memuatkan kunci ini: ${key}. Kemungkinan, kunci telah dipadamkan. Ralat yang tepat adalah dalam konsol.`; }, bigJson: "Objek JSON ini melebihi 10 kb, jadi pastikan anda tahu perkara yang anda lakukan, kerana sesetengah fungsi boleh menjadi pemaparan perlahan.", addNode: "Tambah nod", validateJson: "Sahkan JSON", reducedFunction: `Mengurangkan fungsi`, tooManyKeys: opts => { return `Untuk fungsi maksimum penuh yang dibenarkan jumlah kunci adalah ${opts.maxLightKeysCount} kira. Pangkalan data ini mempunyai lebih daripada kunci yang dibenarkan secara keseluruhan ${opts.count}. Pengisihan kunci dan maklumat pokok mewah tambahan dilumpuhkan. Pencarian hanya berlaku pada pelayan dan bukannya carian klien.`; }, redisCommandNotFound: "Tiada padanan arahan Redis ditemui ...", treeKeyStore: `Pengisihan (perbandingan semula jadi) dilaksanakan pada klien aka penyemak imbas, yang bermaksud ia mempunyai penalti untuk set besar yang besar, seperti lebih daripada 10k kekunci, ia mungkin menambah sedikit masa pada pemaparan halaman. Tiada pengisihan kunci dalam Redis, hanya seperti ini.`, socketIoTimeout: options => { return `Socket.IO tamat masa untuk permintaan ini (maks ${options.timeout / 1000} saat)...`; }, resizerInfo: options => { return `Lebar minimum panel kiri atau kanan ialah ${options.width}px`; }, jsonViewNotParsable: "Nilai ini bukan boleh dihuraikan JSON ", ttlTitle: "Tetapkan TTL dalam beberapa saat", passwordSecure: "Kata laluan mungkin kosong, tetapi tetap akan menunjukkan aksara, ini adalah ciri keselamatan.", tlsWithoutCert: "Dayakan TLS tanpa sijil tambahan", tlsRejectUnauthorized: "Tolak sijil yang tidak dibenarkan", tlsSecure: "Jika anda melihat konfigurasi TLS yang bermula dengan P3X atau semua tetapan TLS kelihatan sama, ia adalah ciri selamat. Untuk menukar tetapan, cuma gantikan tetapan ini dengan kosong atau sesuatu yang lain dan ia akan disimpan. Jika anda tidak menukar tetapan TLS, tetapan akan disimpan kerana ia berada pada pelayan.", treeSeparatorEmpty: "Jika pemisah pokok kosong, pokok itu tidak mempunyai nod bersarang, hanya senarai tulen", treeSeparatorEmptyNote: "Tiada nod bersarang, hanya senarai tulen", welcomeConsole: "Selamat datang ke Konsol Redis", welcomeConsoleInfo: "Sejarah ATAS atau BAWAH kursor didayakan", redisListIndexInfo: "Kosong untuk menambah, -1 untuk menambah atau menyimpannya ke kedudukan yang ditunjukkan.", console: "Konsol", connectiondAdd: "Tambah sambungan", connectiondEdit: "Edit sambungan", connectiondView: "Lihat sambungan", connections: "Sambungan", licenseInfo: "Lesen", licenseEditable: "Lesen boleh diedit", licenseEditableYes: "ya", licenseEditableNo: "Tidak", licenseTerminalOnly: "Lesen hanya boleh dikonfigurasikan daripada terminal pelayan.", licenseTierPolicyTitle: "Dasar peringkat", licenseTierPolicyText: "

Free

core Redis UI sahaja; tiada terowong SSH, tiada mod sambungan Baca sahaja, tiada Cluster/Sentinel, tiada Edit JSON/Muat naik binari/Muat turun binari, tiada ReJSON.
Harga: 0 HUF/bulan (€0/bulan) JSON, Muat naik perduaan, Muat turun perduaan, ReJSON.
Harga asas: 400 HUF/bulan (€1/bulan) atau 4. (€10/tahun).
Jumlah dengan 27% VAT: 500 HUF/bulan (€1.27,1 bulan0) atau HUF/tahun (€12.70/tahun) Cluster dan Sentinel, ditambah Edit JSON, Muat naik binari, Muat turun binari, ReJSON; --readonly-connections/-r juga berfungsi.
Harga asas: 1,200 HUF/bulan (€3/bulan) atau 12,000 HUF/tahun (€30/tahun).
Jumlah dengan 27% VAT: 1,500 HUF/bulan (€3.81/bulan), atau 3.81 €/bulan HUF/tahun (€38.10/tahun) harga.

Seats

Lesen lalai termasuk 5 tempat duduk. Jika anda memerlukan lebih banyak tempat duduk, hubungi kami di support@corifeus.com.

support@corifeus.com.

.

percubaan hari perindustrian yang sedia ada dengan alamat e-mel sebenar untuk sesiapa sahaja (e-mel bukan ujian) (pilihan).

Pembayaran

PayPal pembayaran tersedia hanya dalam HUF (forint); selepas menghantar wang @ https://paypal.me/corifeus saya akan menghantar invois kepada anda. Semua pembayaran tidak akan dikembalikan.

VAT

VAT ditambah pada harga (27% Hungary).

Hubungi

Jika anda ingin bertanya khabar atau mempunyai soalan, hubungi support@corifeus.com.

Bahasa

Invoice dan lesen dalam Bahasa Inggeris. Mata wang invois ialah HUF.

Note

Pengesahan lesen memerlukan akses internet.", licenseState: "negeri", licenseStateActive: "Aktif", licenseStateInactive: "Tidak aktif", licenseStateNoLicense: "Tiada lesen", licenseKeyMasked: "Kunci disimpan", licenseTier: "Peringkat", licenseValid: "sah", licenseStatus: "Status lesen", licenseReason: "Sebab", licenseCheckedAt: "Disemak di", licenseStartsAt: "Bermula pada", licenseExpiresAt: "Tamat tempoh pada", licenseDaysLeft: "Hari lagi", licenseMaxDevices: "Peranti maks", licenseActiveDevices: "Peranti aktif", licenseActiveDevicesInfo: "Jika peranti tidak lagi digunakan, tempat duduknya dilepaskan secara automatik selepas 75 minit.", licenseCustomerEmail: "E-mel pelanggan", licenseFeatures: "Ciri-ciri", licenseFeaturesEmpty: "Tiada ciri tambahan", licenseFeatureReadonlyMode: "Mod sambungan baca sahaja", licenseFeatureReadonlyConnectionsFlag: "Sambungan baca sahaja (--readonly-connections/-r)", licenseFeatureSsh: "SSH terowong", licenseFeatureCluster: "Sambungan Cluster", licenseFeatureSentinel: "Sambungan Sentinel", licenseFeatureReJSON: "ReJSON (JSON jenis data)", keysSort: { on: "Pengisihan kunci dihidupkan", off: "Pengisihan kunci dimatikan" }, cluster: { on: "Cluster dihidupkan", off: "Cluster dimatikan" }, sentinel: { on: "Sentinel dihidupkan", off: "Sentinel dimatikan", name: "Nama Sentinel" }, readonly: { on: "Baca sahaja", off: "Baca sahaja dimatikan" }, proSshOnly: "SSH tersedia dalam Pro atau Perusahaan.", proReadonlyOnly: "Mod sambungan baca sahaja tersedia dalam Pro atau Perusahaan.", enterpriseClusterSentinelOnly: "Cluster dan Sentinel tersedia dalam Perusahaan sahaja.", theme: { light: "Cahaya", dark: "Perusahaan gelap", darkNeu: "Gelap", darkoBluo: "Darko bluo", enterprise: "Perusahaan", redis: "Redis", matrix: "Matriks" }, connected: opts => { return `Bersambung: ${opts.name}`; }, tree: "pokok", askAuth: "Minta kebenaran", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Modul", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Putuskan sambungan", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Arahan Redis", ungrouped: "Tanpa kumpulan", grouped: "Grouped", connectFirst: "Sambung ke pelayan Redis terlebih dahulu", searchLanguage: "Cari bahasa...", exportProgress: "Mengeksport kunci...", importProgress: "Mengimport kunci...", importPreview: "Pratonton", importOverwrite: "Tulis ganti", importSkip: "Langkau", importConflict: "Jika kunci sudah wujud:", noKeysToExport: "Tiada kunci untuk dieksport", time: "Masa", loading: "Memuatkan...", autoRefresh: "Auto", exportSearchHint: "Mengeksport hanya kunci yang sepadan dengan carian semasa", importSearchHint: "Import dikenakan pada keseluruhan pangkalan data, bukan hanya hasil carian", importNoKeys: "Tiada kunci ditemui dalam fail", }, status: { dataCopied: "Data berada dalam papan keratan", licenseSaved: "Lesen disimpan", exportDone: "Eksport selesai", indexCreated: "Indeks dicipta", indexDropped: "Indeks dipadam", importDone: (opts) => `Import selesai: ${opts.created} dicipta, ${opts.skipped} dilangkau, ${opts.errors} ralat`, nodeRemoved: "Nod dialih keluar", keyIsNotExisting: "Kunci ini mungkin telah dipadamkan atau tamat tempoh.", keyCount: opts => { if (opts.keyCount === 0) { return "Tiada kunci"; } else if (opts.keyCount === 1) { return "1 kunci"; } else { return `${opts.keyCount} kunci`; } }, treeExpandAll: "Kembangkan semua daun pokok. Operasi ini mungkin mahal dan mungkin mengambil masa...", noRedisKeys: "Tiada kunci dalam pangkalan data ini.", redisConnected: "Redis berjaya disambungkan", reloadingDataInfo: "Memuat semula maklumat data Redis", added: "Ditambah", saved: "dikemas kini", cancelled: "Dibatalkan", deleted: "Dipadamkan", savedRedis: "Data Redis disimpan", redisDisconnected: opts => { return `Sambungan semasa mempunyai ralat: ${opts.error.message}`; }, dbChanged: opts => { return `Indeks db ditetapkan kepada ${opts.db}. `; }, treeDeleted: opts => { return `Kunci pokok telah dipadamkan (${opts.key}).`; }, deletedKey: opts => { return `Kunci telah dipadamkan (${opts.key}).`; }, renamedKey: "Kunci ini telah dinamakan semula", ttlChanged: "TTL kunci ini telah ditukar", notInteger: "Input ini bukan integer", persisted: "Kunci ini dikekalkan selama-lamanya", set: "Kunci ditetapkan/ditambah" }, code: { "delete-connection": "Sambungan ini telah dipadamkan, jadi anda terputus sambungan ke tika Redis ini.", "save-connection": "Sambungan ini telah ditukar, jadi anda terputus sambungan ke tika Redis ini. Anda boleh menyambung semula.", "readonly-connections": "Sambungan tambah/simpan/padam hanya baca sahaja!", "readonly-connection-mode": "Sambungan ini adalah mod baca sahaja!", "list-out-of-bounds": "Indeks senarai ini di luar sempadan", "donation-ware-feature": "Ciri ini terdapat dalam versi derma.", "feature-pro-readonly-required": "Mod sambungan baca sahaja memerlukan lesen Pro atau Perusahaan.", "feature-pro-ssh-required": "SSH terowong memerlukan lesen Pro atau Perusahaan.", "feature-enterprise-cluster-sentinel-required": "Cluster dan Sentinel memerlukan lesen Perusahaan.", "feature-pro-json-binary-required": "Edit JSON, Muat naik binari dan Muat turun binari memerlukan lesen Pro atau Perusahaan.", "feature-pro-rejson-required": "ReJSON (Jenis data JSON) memerlukan lesen Pro atau Perusahaan.", "invalid-json-value": "Nilai ini tidak sah JSON.", "http_auth_required": "Keizinan diperlukan: sila sahkan dengan HTTP Basic Auth dan muat semula.", "auto-connection-failed": "Kemungkinan, sambungan telah dialih keluar dan sambungan automatik gagal, kerana ini.", invalid_console_command: "Perintah ini tidak berfungsi melalui GUI." }, licenseReason: { LICENSE_VALID: "Lesen adalah sah", LICENSE_INVALID: "Lesen tidak sah", LICENSE_MISSING: "Tiada kunci lesen ditetapkan", LICENSE_DISABLED: "Lesen dilumpuhkan dalam konfigurasi pelayan", LICENSE_NOT_FOUND: "Lesen tidak ditemui", LICENSE_EXPIRED: "Lesen tamat tempoh", LICENSE_CLEARED: "Kunci lesen telah dikosongkan", LICENSE_MAX_DEVICES_REACHED: "Tempat duduk peranti maksimum dicapai", PRODUCT_MISMATCH: "Produk lesen tidak sepadan" }, licenseStatusValue: { active: "Aktif", deleted: "Dipadamkan", all: "Semua", expired: "Tamat tempoh", missing: "hilang", inactive: "Tidak aktif" }, form: { error: { required: "Diperlukan", port: "Pelabuhan adalah antara 1-65535", invalid: "Borang itu tidak sah" }, connection: { label: { name: "Nama", group: "Group", host: "Nama hos", port: "Pelabuhan", password: "Kata laluan", username: "Nama pengguna" } }, treeSettings: { maxValueDisplay: "Panjang rentetan paparan nilai maksimum", maxValueDisplayInfo: "Jika ditetapkan kepada 0, tunjukkan nilai penuh. Jika lebih daripada 0, potong ke panjang ini. Jika -1: untuk rentetan, sembunyikan nilai sehingga mengedit; untuk jenis lain, tunjukkan kandungan penuh.", maxKeys: "Kiraan kunci maks", maxKeysInfo: "Supaya GUI tidak ranap, kami mengehadkan kiraan kunci maks.", keyCount: () => { return `Bilangan kunci: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Gunakan animasi", noAnimation: "Tiada animasi", jsonFormatTwoSpace: "Format JSON dengan 2 ruang", jsonFormatFourSpace: "Format JSON dengan 4 ruang", formName: "Tetapan Redis", searchModeClient: "Mod carian pelanggan", searchModeServer: "Mod carian pelayan", searchModeStartsWith: "Cari dengan bermula dengan mod", searchModeIncludes: "Carian termasuk mod" }, field: { treeSeparator: "Pemisah pokok", treeSeparatorSelector: "Pemilih pemisah pokok", page: "Kiraan paging pokok", keyPageCount: "Kiraan halaman utama", keysSort: "Isih kekunci", searchMode: "Mod carian", searchModeStartsWith: "Carian bermula dengan / termasuk" }, error: { keyPageCount: "Kiraan halaman utama mestilah integer antara 5 - 100", page: "Kiraan halaman mestilah integer antara 10 - 5000", maxValueDisplay: "Nilai paparan maksimum mestilah integer antara -1 dan 32768", maxKeys: "Nilai kiraan kunci maksimum mestilah integer antara 100 dan 100000" } }, key: { label: { formName: { add: "Tambahkan kunci Redis baharu", edit: "Edit kunci Redis", append: "Tambahkan pada kunci Redis sedia ada" } }, field: { streamTimestamp: "Cap masa", key: "kunci", type: "taip", index: "Indeks", hashKey: "Kunci cincang", score: "skor", value: "Nilai" }, error: { streamTimestamp: "Cap masa diperlukan, sama ada format Redis atau sebagai *", key: "Kuncinya, sekurang-kurangnya, satu watak", hashKey: "Kekunci jadual cincang ialah sekurang-kurangnya satu aksara", score: "Skor set yang diisih diperlukan", value: "Nilai itu diperlukan" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Carian", index: "Indeks", query: "Pertanyaan", results: "Keputusan", noIndex: "Tiada indeks", createIndex: "Cipta indeks", dropIndex: "Padam indeks", indexInfo: "Info indeks", indexName: "Nama indeks", prefix: "Awalan kunci (pilihan)", fieldName: "Nama medan", }, monitor: { title: "Pemantauan", memory: "Memori", opsPerSec: "Ops/saat", clients: "Pelanggan", blocked: "Disekat", hitsMisses: "Kadar hit", networkIo: "Rangkaian I/O", slowLog: "Log perlahan", totalCommands: "Jumlah", expired: "Tamat tempoh", evicted: "Diusir", clientList: "Senarai pelanggan", topKeys: "Kunci terbesar mengikut memori", killClient: "Bunuh pelanggan", clientKilled: "Pelanggan dibunuh", confirmKillClient: "Adakah anda pasti mahu menamatkan pelanggan ini?", noKeys: "Tiada kunci", noClients: "Tiada pelanggan", }, overview: { noConnected: "Tiada sambungan ke Redis.", overviewClients: "Senaraikan yang disambungkan dengan kiraan pelanggan", connectedCount: opt => { if (opt.length === 1) { return "1 pelanggan"; } return `${opt.length} pelanggan`; } }, key: { label: { key: "kunci", encoding: "Pengekodan", length: "Saiz", ttl: "TTL", ttlTitle: "Masa Untuk Hidup", type: "taip", ttlNotExpire: "tidak luput", lengthString: "bait", lengthItem: "barang", actions: "Tindakan" }, list: { table: { index: "Indeks", value: "Nilai" } }, hash: { table: { hashkey: "Hashkey", value: "Nilai" } }, set: { table: { value: "Ahli" } }, zset: { table: { value: "Ahli", score: "skor" } }, stream: { table: { timestamp: "ID cap masa", field: "Padang", value: "Nilai" } } }, treeControls: { settings: "Tetapan pokok", expandAll: "Kembangkan semua", collapseAll: "Runtuhkan semua", search: { search: "Cari dalam kekunci", clear: "Kosongkan carian semasa untuk ditetapkan kosong", placeholderClient: "Cari bahagian pelanggan", placeholderServer: "Cari bahagian pelayan", info: "Carian sebelah klien bermaksud, ia sepadan dengan teks dalam input carian. Carian sisi pelayan bermaksud, ia seperti carian dalam corak kunci sebagai *{teks carian}*. Untuk set carian yang besar, lebih baik menggunakan carian sisi pelayan. Untuk set carian yang lebih kecil, lebih baik menggunakan mod carian sisi klien." + ` Jika kiraan kunci sudah tamat ${p3xr.settings.maxLightKeysCount}, anda hanya boleh mencari di sebelah pelayan.`, largeSetInfo: "Dalam set besar, carian sebelah pelanggan dilumpuhkan. jadi buat masa ini hanya carian sebelah pelayan boleh dilakukan.", infoDetails: "Untuk mengetahui cara carian berfungsi, sila semak tetapan" }, pager: { next: "Seterusnya", prev: "Sebelumnya", first: "Pertama", last: "Terakhir" } } }, time: { loading: "Memuatkan...", years: "tahun", months: "bulan", days: "hari", year: "tahun", month: "bulan", day: "hari" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ne/000077500000000000000000000000001517666434100137555ustar00rootroot00000000000000src/strings/ne/strings.js000066400000000000000000001302021517666434100160020ustar00rootroot00000000000000const strings = { error: { cleared_license: "लाइसेन्स खाली गरियो", invalid_license: "अवैध इजाजतपत्र", license_max_devices_reached: "अधिकतम उपकरण सिट पुग्यो", license_readonly: "सर्भर टर्मिनलबाट मात्र इजाजतपत्र परिवर्तन गर्न सकिन्छ।", server_error: "सर्भर त्रुटि, कृपया पुन: प्रयास गर्नुहोस्" }, title: { donate: "दान गर्नुहोस्", jsonRecursive: "सबै पातहरू विस्तार गर्दै", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "बायाँ तलको मेनुबाट जडान गर्न तपाईंले Redis जडान रोज्न सक्नुहुन्छ।", statistics: "तथ्याङ्क", error: "त्रुटि", connectingRedis: "Redis मा जडान गर्दै...", socketioConnectError: "Socket.IO त्रुटि", db: "DB", server: "सर्भर", clients: "ग्राहकहरु", memory: "मेमोरी", persistence: "दृढता", stats: "तथ्याङ्क", replication: "प्रतिकृति", cpu: "CPU", cluster: "Cluster", modules: "मoड्युलहरू", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "के तपाईं यो इन्डेक्स हटाउन निश्चित हुनुहुन्छ?", uploadBuffer: "के तपाइँ यो बाइनरी डाटा अपलोड गर्न निश्चित हुनुहुन्छ?", uploadBufferDone: "बाइनरी डाटा अपलोड गरिएको छ", uploadBufferDoneAndSave: "बाइनरी डाटा अपलोड र सर्भरमा बचत गरिएको छ", title: "पुष्टि गर्नुहोस्", alert: "अलर्ट", info: "जानकारी", deleteListItem: "के तपाइँ यो सूची वस्तु मेटाउन निश्चित हुनुहुन्छ?", deleteHashKey: "के तपाइँ यो ह्यास कुञ्��ी वस्तु मेटाउन निश्चित हुनुहुन्छ?", deleteStreamTimestamp: "के तपाइँ यो स्ट्रिम टाइमस्ट्याम्प मेटाउन निश्चित हुनुहुन्छ?", deleteSetMember: "के तपाइँ यो सेट सदस्य मेटाउन निश्चित हुनुहुन्छ?", deleteZSetMember: "के तपाइँ यो क्रमबद्ध सेट सदस्य मेटाउन निश्चित हुनुहु��्छ?", deleteConnection: "पुष्टि गर्नुहोस्", deleteConnectionText: "के तपाइँ यो Redis जडान मेटाउन निश्चित हुनुहुन्छ?", deleteNode: "के तपाइँ यो Redis नोड मेटाउन निश्चित हुनुहुन्छ?", deleteAllKeys: opts => { return `यो रूख र यसका सबै कुञ्जीहरू मेटाउनुहोस् (${opts.key})?`; }, socketioConnectError: "Socket.IO सर्भरमा जडान हुन सक्दैन, तपाइँ पुन: लोड गर्न सक्नुहुन्छ र जडान त्रुटि आफैं समाधान गर्न प्रयास गर्न सक्नुहुन्छ, ग्राहकलाई थाहा छैन कि यसलाई कसरी समाधान गर्ने।", socketioAuthRequired: "Socket.IO प्राधिकरण आवश्यक छ। कृपया HTTP Basic Auth (प्रयोगकर्ता नाम/पासवर्ड) को साथ प्रमाणीकरण गर्नुहोस् र पुन: लोड गर्नुहोस्।", deleteKey: "के तपाइँ यो कुञ्जी मेटाउन निश्चित हुनुहुन्छ?", rename: { title: "के तपाइँ यो कुञ्जी पुन: नामाकरण गर्न निश्चित हुनुहुन्छ?", textContent: "यो कार्यले स्थायी रूपमा कुञ्जीलाई पुन: नामाकरण गर्छ।", placeholder: "Redis कुञ्जी (आवश्यक)" }, ttl: { title: "के तपाइँ यो कुञ्जीको TTL परिवर्तन गर्न निश्चित हुनुहुन्छ?", textContent: "TTL परिवर्तन गर्नाले यो कुञ्जीको बाँच्ने समय अपडेट हुन्छ। यो कुञ्जीलाई सधैंभरि राख्न खाली छोड्नुहोस्।", placeholder: "Redis कुञ्जीको TTL (पूर्णांक वा खाली)", placeholderPlaceholder: "खाली को अर्थ यो सधैंभरि रहन्छ; अन्यथा एक पूर्णांक प्रविष्ट गर्नुहोस्।", convertTextToTime: "पाठलाई समयमा रूपान्तरण गर्नुहोस्", convertTextToTimePlaceholder: "जस्तै। 1d 86400 हुनेछ" }, license: { title: "लाइसेन्स सेट गर्नुहोस्", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "इजाजतपत्र कुञ्जी" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "प्रतिलिपि गर्नुहोस्", downloadBuffer: "बाइनरी डाउनलोड गर्नुहोस्", setBuffer: "बाइनरी अपलोड गर्नुहोस्", exportKeys: "कुञ्जीहरू निर्यात गर्नुहोस्", exportAllKeys: (opts) => `सबै ${opts.count} कुञ्जीहरू निर्यात`, exportSearchResults: (opts) => `${opts.count} परिणामहरू निर्यात`, importKeys: "कुञ्जीहरू आयात गर्नुहोस्", saveWithFormatJson: "ढाँचा संग बचत गर्नुहोस्", formatJson: "ढाँचा Json", wrap: "लपेट्���ुहोस्", unwrap: "खोल्नुहोस्", downloadJson: "JSON डाउनलोड गर्नुहोस्", pubsubMonitor: "PubSub मनिटर", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "भाषा", ok: "ठीक छ", addKey: "यो कुञ्जीमा थप्नुहोस्", addKeyRoot: "रूट कुञ्जी थप्नुहोस्", reloadKey: "कुञ्जी पुन: लोड गर्नुहोस्", reload: "पुन: लोड गर्नुहोस्", close: "बन्द गर्नुहोस्", commands: "आदेशहरू", view: "हेर्नुहोस्", statistics: "तथ्याङ्क", refresh: "रिफ्रेस गर्नुहोस्", pause: "रोक्नुहोस्", resume: "जारी राख्नुहोस्", clear: "खाली गर्नुहोस्", rename: "पुन: नामाकरण गर्नुहोस्", main: "डाटाबेस", cancel: "रद्द गर्नुहोस्", theme: "वि���यवस्तु", github: "GitHub", githubRepo: "भण्डार", githubRelease: "रिलीज गर्दछ", githubChangelog: "Changelog", info: "Info", settings: "सेटिङहरू", connect: "जडान गर्नुहोस्", disconnect: "जडान विच्छेद गर्नुहोस्", overview: "अवलोकन", console: "कन्सोल", noConnections: "कुनै जडान छैन, सेटिङ मेनुमा जडान थप्नुहोस्।", noConnectionsInSettings: "कुनै जडानहरू छैनन्, तपाईंले माथि नयाँ जडान थप्न सक्नुहुन्छ।", connectionAdd: "नयाँ जडान", addGroup: "समूह थप्नुहोस्", extend: "विस्तार गर्नुहोस्", collapse: "संक्षिप्त गर्नुहोस्", add: "थप्नुहोस्", edit: "सम्पादन गर्नुहोस्", save: "बचत गर्नुहोस्", ttl: "TTL सेट गर्नुहोस्", license: "लाइसेन्स सेट गर्नुहोस्", delete: "मेट्नुहोस्", remove: "हटाउनुहोस्", sure: "पक्का", testConnection: "परीक्षण जडान", getKey: "Redis कुञ्जी र सम्बन्धित डाटा लोड गर्दै...", jsonViewShow: "JSON प्रदर्शन गर्नुहोस्", jsonViewEditor: "JSON सम्पादन गर्नुहोस्", quickConsole: "द्रुत कन्सोल", }, label: { id: { nodeId: "नोड आईडी", id: "जडान ID", info: "यदि तपाइँ निम्न गुणहरू परिवर्तन गर्न चाहनुहुन्न भने: sshPassword, sshPrivateKey, पासवर्ड, tlsCrt, tlsKey, tlsCa, कृपया गुण मानहरू अक्षुण्ण राख्न ती गुणहरूमा जडानको ID प्रविष्ट गर्नुहोस्। यदि तपाइँ नोड पासवर्डमा समान तर्क चाहनुहुन्छ भने, त्यसपछि नोड पासवर्डमा नोड आईडी प्रविष्ट गर्नुहोस्।" }, secureFeature: "यदि तपाईंले P3X बाट सुरु हुने मान देख्नुभयो भने, यो एक सुरक्षित सुविधा हो। सेटिङ्हरू परिवर्तन गर्नका लागि, यी सेटिङहरूलाई खाली वा अरू केहीले बदल्नुहोस् र तिनीहरू बचत हुनेछन्। यदि तपाइँ सेटिङहरू परिवर्तन गर्नुहुन्न भने, सेटिङहरू सर्भरमा जस्तै राखिनेछ।", ssh: { on: "SSH सक्रिय", off: "SSH बन्द", sshHost: "SSH होस्ट", sshPort: "SSH पोर्ट", sshUsername: "SSH प्रयोगकर्ता नाम", sshPassword: "SSH पासवर्ड", sshPrivateKey: "SSH निजी कुञ्जी" }, isBuffer: opts => `[object ArrayBuffer] को अर्थ हो कि मान बाइनरी डेटा हो वा मान भन्दा ठूलो छ ${opts.maxValueAsBuffer}`, streamValue: `स्ट्रिम फिल्ड र मान एक लाइनर हो। उदाहरण: क्षेत्र1 मान1 "क्षेत्र 2" "मान 2"`, streamTimestampId: `'*' भनेको स्वत: उत्पन्न वा - को रूपमा निर्दिष्टीकरण हो।`, unableToLoadKey: ({ key }) => { return `यो कुञ्जी लोड गर्न असमर्थ: ${key}। सम्भव छ, कुञ्जी मेटाइयो। सही त्रुटि कन्सोलमा छ।`; }, bigJson: "यो JSON वस्तु 10 kb भन्दा बढी छ, त्यसैले निश्चित गर्नुहोस् कि तपाइँ के गर्दै हुनुहुन्छ थाहा छ, किनकि केहि प्रकार्यहरू ढिलो रेन्डरिङ हुन सक्छ।", addNode: "नोड थप्नुहोस्", validateJson: "JSON मान्य गर्नुहोस्", reducedFunction: `कम कार्यक्षमता`, tooManyKeys: opts => { return `पूर्ण अधिकतम प्रकार्यहरूको लागि अनुमति कुञ्जी कुल हो ${opts.maxLightKeysCount} गणना। यो डाटाबेसमा कुल अनुमति कुञ्जीहरू छन् ${opts.count}। कुञ्जी क्रमबद्ध र अतिरिक्त फेन्सी रूख जानकारी असक्षम गरिएको छ। खोजी ग्राहक खोजको सट्टा सर्भरमा मात्र भइरहेको छ।`; }, redisCommandNotFound: "कुनै Redis आदेश मिल्दो छैन ...", treeKeyStore: `क्रमबद्ध (प्राकृतिक तुलना) लाई क्लाइन्ट उर्फ ब्राउजरमा कार्यान्वयन गरिन्छ, जसको मतलब यो ठूला ठूला सेटहरूको लागि पेनाल्टी छ, जस्तै 10k कुञ्जीहरू, यसले पृष्ठ रेन्डरिङमा थोरै समय थप्न सक्छ। Redis मा कुनै कुञ्जी क्रमबद्ध छैन, केवल यो जस्तै।`, socketIoTimeout: options => { return `Socket.IO यो अनुरोधको लागि समय सकियो (अधिकतम ${options.timeout / 1000} सेकेन्ड)...`; }, resizerInfo: options => { return `बायाँ वा दायाँ प्यानल न्यूनतम चौडाइ हो ${options.width}px`; }, jsonViewNotParsable: "यो मान JSON पार्सयोग्य छै��� ", ttlTitle: "TTL सेकेन्डमा सेट गर्नुहोस्", passwordSecure: "पासवर्ड खाली हुन सक्छ, तर अझै पनि यसले क्यारेक्टरहरू देखाउनेछ, यो एक सुरक्षा सुविधा हो।", tlsWithoutCert: "अतिरिक्त प्रमाणपत्र बिना TLS सक्षम गर्नुहोस्", tlsRejectUnauthorized: "अनधिकृत प्रमाणपत्र अस्वीकार गर्नुहोस्", tlsSecure: "यदि तपाइँ P3X बाट सुरु हुने TLS कन्फिगरेसन देख्नुहुन्छ वा सबै TLS सेटिङहरू उस्तै देखिन्छन् भने, यो सुरक्षित सुविधा हो। सेटिङ्हरू परिवर्तन गर्नका लागि, यी सेटिङहरूलाई खाली वा अरू केहीले बदल्नुहोस् र तिनीहरू बचत हुन���छन्। यदि तपाईंले TLS सेटिङहरू परिवर्तन गर्नुभएन भने, सेटिङहरूलाई सर्भरमा जस्तै राखिनेछ।", treeSeparatorEmpty: "यदि रूख विभाजक खाली छ भने, रूखमा कुनै नेस्टेड नोडहरू हुनेछैन, केवल एक शुद्ध सूची", treeSeparatorEmptyNote: "कुनै नेस्टेड नोडहरू, केवल एक शुद्�� सूची", welcomeConsole: "Redis कन्सोलमा स्वागत छ", welcomeConsoleInfo: "कर्सर माथि वा तल इतिहास सक्षम छ", redisListIndexInfo: "जोड्नको लागि खाली, -1 लाई प्रिपेन्ड गर्न वा देखाइएको स्थितिमा बचत गर्न।", console: "कन्सोल", connectiondAdd: "जडान थप्नुहोस्", connectiondEdit: "जडान सम्पादन गर्नुहोस्", connectiondView: "जडान हेर्नुहोस्", connections: "जडानहरू", licenseInfo: "इजाजतपत्र", licenseEditable: "लाइसेन्स सम्पादन योग्य", licenseEditableYes: "हो", licenseEditableNo: "छैन", licenseTerminalOnly: "इजाजतपत्र सर्भर टर्मिनलबाट मात्र कन्फिगर गर्न सकिन्छ।", licenseTierPolicyTitle: "स्तरीय नीति", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "राज्य", licenseStateActive: "सक्रिय", licenseStateInactive: "निष्क्रिय", licenseStateNoLicense: "लाइसेन्स छैन", licenseKeyMasked: "बचत गरिएको कुञ्जी", licenseTier: "टियर", licenseValid: "मान्य", licenseStatus: "लाइसेन्स स्थिति", licenseReason: "कारण", licenseCheckedAt: "मा जाँच गरियो", licenseStartsAt: "मा सुरु हुन्छ", licenseExpiresAt: "मा म्याद सकिन्छ", licenseDaysLeft: "दिन बाँकी", licenseMaxDevices: "अधिकतम उपकरणहरू", licenseActiveDevices: "सक्रिय उपकरणहरू", licenseActiveDevicesInfo: "यदि कुनै उपकरण अब प्रयोग गरिएन भने, यसको सीट 75 मिनेट पछि स्वचालित रूपमा रिलिज हुन्छ।", licenseCustomerEmail: "ग्राहक इमेल", licenseFeatures: "सुविधाहरू", licenseFeaturesEmpty: "कुनै अतिरिक्त सुविधाहरू छैन", licenseFeatureReadonlyMode: "पढ्ने मात्र जडान मोड", licenseFeatureReadonlyConnectionsFlag: "पढ्ने मात्र जडानहरू (--readonly-connections/-r)", licenseFeatureSsh: "SSH टनेलिङ", licenseFeatureCluster: "Cluster जडानहरू", licenseFeatureSentinel: "Sentinel जडानहरू", licenseFeatureReJSON: "ReJSON (JSON डाटा प्रकार)", keysSort: { on: "कुञ्जी क्रमबद्ध गर्दै", off: "कुञ्जी क्रमबद्ध बन्द" }, cluster: { on: "Cluster सक्रिय", off: "Cluster बन्द" }, sentinel: { on: "Sentinel सक्रिय", off: "Sentinel बन्द", name: "Sentinel नाम" }, readonly: { on: "पढ्न मात्र", off: "पढ्ने मात्र बन्द" }, proSshOnly: "SSH प्रो वा इन्टरप्राइजमा उपलब्ध छ।", proReadonlyOnly: "केवल पढ्ने जडान मोड प्रो वा इन्टरप्राइजमा उपलब्ध छ।", enterpriseClusterSentinelOnly: "Cluster र Sentinel इन्टरप्राइजमा मात्र उपलब्ध छन्।", theme: { light: "उज्यालो", dark: "अँध्यारो उद्यम", darkNeu: "अँध्यारो", darkoBluo: "डार्को ब्लू", enterprise: "उद्यम", redis: "Redis", matrix: "म्याट्रिक्स" }, connected: opts => { return `जडान गरिएको: ${opts.name}`; }, tree: "रुख", askAuth: "प्राधिकरणको लागि सोध्नुहोस्", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "मoड्युलहरू", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "जडान विच्छेद गर्नुहोस्", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis आदेशहरू", ungrouped: "समूहविहीन", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "भाषा खोज्नुहोस्...", exportProgress: "कुञ्जीहरू निर्यात हुँदैछ...", importProgress: "कुञ्जीहरू आयात हुँदैछ...", importPreview: "पूर्वावलोकन", importOverwrite: "अधिलेखन", importSkip: "छोड्नुहोस्", importConflict: "कुञ्जी पहिले नै अवस्थित छ भने:", noKeysToExport: "निर्यात गर्न कुञ्जीहरू छैनन्", time: "समय", loading: "लोड हुँदैछ...", autoRefresh: "स्वचालित", exportSearchHint: "हालको खोजसँग मिल्ने कुञ्जीहरू मात्र निर्यात हुँदैछ", importSearchHint: "आयात सम्पूर्ण डाटाबेसमा लागू हुन्छ, खोज परिणामहरूमा मात्र होइन", importNoKeys: "फाइलमा कुञ्जीहरू फेला परेनन्", }, status: { dataCopied: "डाटा क्लिपबोर्डमा छ", licenseSaved: "इजाजतपत्र बचत गरियो", exportDone: "निर्यात पूरा भयो", indexCreated: "इन्डेक्स सिर्जना भयो", indexDropped: "इन्डेक्स हटाइयो", importDone: (opts) => `आयात पूरा: ${opts.created} सिर्जित, ${opts.skipped} छोडिएको, ${opts.errors} त्रुटि`, nodeRemoved: "नोड हटाइयो", keyIsNotExisting: "यो कुञ्जी मेटाउन वा म्याद सकिएको हुन सक्छ।", keyCount: opts => { if (opts.keyCount === 0) { return "कुञ्जी छैन"; } else if (opts.keyCount === 1) { return "१ कुञ्जी"; } else { return `${opts.keyCount} कुञ्जीहरू`; } }, treeExpandAll: "सबै रूख पातहरू विस्तार गर्नुहोस्। यो अपरेशन महँगो हुन सक्छ र समय लाग्न सक्छ ...", noRedisKeys: "यस डाटाबेसमा कुनै कुञ्जीहरू छैनन्।", redisConnected: "Redis सफल जडान भयो", reloadingDataInfo: "Redis डाटा जानकारी पुन: लोड गर्दै", added: "थपियो", saved: "अद्यावधिक गरियो", cancelled: "रद्द गरियो", deleted: "मेटाइयो", savedRedis: "Redis डाटा बचत गरिएको छ", redisDisconnected: opts => { return `हालक�� जडानमा त्रुटि थियो: ${opts.error.message}`; }, dbChanged: opts => { return `db सूचकांक सेट गरियो ${opts.db}। `; }, treeDeleted: opts => { return `रूख कुञ्जी मेटाइयो (${opts.key})।`; }, deletedKey: opts => { return `कुञ्जी मेटाइयो (${opts.key})।`; }, renamedKey: "यो कुञ्जी पुन: नामाकरण गरिएको छ", ttlChanged: "यो कुञ्जीको TTL परिवर्तन गरिएको छ", notInteger: "यो इनपुट पूर्णांक होइन", persisted: "यो कुञ्जी सधैंभरि रहन्छ", set: "कुञ्जी सेट/थपिएको छ" }, code: { "delete-connection": "यो जडान मेटाइएको थियो, त्यसैले तपाईं यस Redis उदाहरणमा विच्छेद हुनुभएको छ।", "save-connection": "यो जडान परिवर्तन गरिएको थियो, त्यसैले तपाईं यस Redis उदाहरणमा विच्छेद हुनुभएको छ। तपाइँ पुन: जडान गर्न सक्नुहुन्छ।", "readonly-connections": "जडानहरू थप्नुहोस्/बचत गर्नुहोस्/मेटाउनुहोस् केवल पढ्ने मात्र हो!", "readonly-connection-mode": "यो जडान पढ्ने मात्र मोड हो!", "list-out-of-bounds": "यो सूची सूचकांक सीमा बाहिर छ", "donation-ware-feature": "यो सुविधा दान संस्करणमा अवस्थित छ।", "feature-pro-readonly-required": "पढ्ने मात्र जडान मोडलाई प्रो वा इन्टरप्राइज इजाजतपत्र चाहिन्छ।", "feature-pro-ssh-required": "SSH टनेलिङलाई प्रो वा इन्टरप्राइज इजाजतपत्र चाहिन्छ।", "feature-enterprise-cluster-sentinel-required": "Cluster र Sentinel लाई इन्टरप्राइज इजाजतपत्र चाहिन्छ।", "feature-pro-json-binary-required": "JSON सम्पादन गर्नुहोस्, बाइनरी अपलोड गर्नुहोस् र बाइनरी डाउनलोड गर्नुहोस् प्रो वा इन्टरप्राइज इजाजतपत्र चाहिन्छ।", "feature-pro-rejson-required": "ReJSON (JSON डाटा प्रकार) लाई प्रो वा इन्टरप्राइज इजाजतपत्र चाहिन्छ।", "invalid-json-value": "मान मान्य छैन JSON।", "http_auth_required": "प्राधिकरण आवश्यक छ: कृपया HTTP Basic Auth को साथ प्रमाणीकरण गर्नुहोस् र पुन: लोड गर्नुहोस्।", "auto-connection-failed": "सम्भव छ, जडान हटाइयो र स्वत जडान असफल भयो, यस कारण।", invalid_console_command: "यो आदेश GUI मार्फत काम गरिरहेको छैन।" }, licenseReason: { LICENSE_VALID: "इजाजतपत्र मान्य छ", LICENSE_INVALID: "इजाजतपत्र अवैध छ", LICENSE_MISSING: "कुनै इजाजतपत्र कुञ्जी सेट गरिएको छैन", LICENSE_DISABLED: "सर्भर कन्फिगरेसनमा इजाजतपत्र असक्षम पारिएको छ", LICENSE_NOT_FOUND: "लाइसेन्स फेला परेन", LICENSE_EXPIRED: "इजाजतपत्रको म्याद सकिएको छ", LICENSE_CLEARED: "इजाजतपत्र कुञ्जी खाली गरियो", LICENSE_MAX_DEVICES_REACHED: "अधिकतम उपकरण सिट पुग्यो", PRODUCT_MISMATCH: "लाइसेन्स उत्पादन मेल खाँदैन" }, licenseStatusValue: { active: "सक्रिय", deleted: "मेटाइयो", all: "सबै", expired: "म्याद सकियो", missing: "हराइरहेको छ", inactive: "निष्क्रिय" }, form: { error: { required: "आवश्यक छ", port: "पोर्ट १-६५५३५ को बीचमा छ", invalid: "फारम अमान्य छ" }, connection: { label: { name: "ना��", group: "Group", host: "होस्टनाम", port: "पोर्ट", password: "पासवर्ड", username: "प्रयोगकर्ता नाम" } }, treeSettings: { maxValueDisplay: "अधिकतम मान प्रदर्शन स्ट्रिङ लम्बाइ", maxValueDisplayInfo: "यदि ० मा सेट गरियो भने, पूर्ण मानहरू देखाउनुहोस्। यदि ० भन्दा ठूलो छ भने, यो लम्बाइमा काट्नुहोस्। यदि -१: तारका लागि, सम्पादन नगरेसम्म मान लुकाउनुहोस्; अन्य प्रकारका लागि, पूर्ण सामग्री देखाउनुहोस्।", maxKeys: "अधिकतम कुञ्जी गणना", maxKeysInfo: "GUI क्र्यास नहोस् भनेर, हामी अधिकतम कुञ्जी गणना सीमित गर्छौं।", keyCount: () => { return `कुञ्जीहरूको संख्या: ${p3xr.state.keysRaw.length}`; }, label: { animation: "एनिमेसन प्रयोग गर्नुहोस्", noAnimation: "एनिमेसन छैन", jsonFormatTwoSpace: "ढाँचा JSON २ खाली ठाउँहरू सहित", jsonFormatFourSpace: "ढाँचा JSON 4 खाली ठाउँहरू सहित", formName: "Redis सेटिङहरू", searchModeClient: "ग्राहक खोज मोड", searchModeServer: "सर्भर खोज मोड", searchModeStartsWith: "खोज मोडको साथ सुरु हुन्छ", searchModeIncludes: "खोज मोड समावेश छ" }, field: { treeSeparator: "रूख विभाजक", treeSeparatorSelector: "रूख विभाजक चयनकर्ता", page: "रूख पृष्ठ गणना", keyPageCount: "कुञ्जी पृष्ठ गणना", keysSort: "कुञ्जीहरू क्रमबद्ध गर्नुहोस्", searchMode: "खोज मोड", searchModeStartsWith: "खोज / समावेश संग सुरु हुन्छ" }, error: { keyPageCount: "कुञ्जी पृष्ठ गणना 5 - 100 बीचको पूर्णांक हुनुपर्छ", page: "पृष्ठ गणना 10 - 5000 बीचको पूर्णांक हुनुपर्छ", maxValueDisplay: "अधिकतम प्रदर्शन मान -1 र 32768 बीचको पूर्णांक हुनुपर्छ", maxKeys: "अधिकतम कुञ्जी गणना मान 100 र 100000 बीचको पूर्णांक हुनुपर्छ" } }, key: { label: { formName: { add: "नयाँ Redis कुञ्जी थप्नुहोस्", edit: "Redis कु��्जी सम्पादन गर्नुहोस्", append: "अवस्थित Redis कुञ्जीमा थप्नुहोस्" } }, field: { streamTimestamp: "टाइमस्ट्याम्प", key: "कुञ्जी", type: "टाइप गर्नुहोस्", index: "अनुक्रमणिका", hashKey: "ह्यास कुञ्जी", score: "स्कोर", value: "मूल्य" }, error: { streamTimestamp: "टाइमस्ट्याम्प आवश्यक छ, या त Redis ढाँचा वा * को रूपमा", key: "कुञ्जी हो, कम्तिमा, एक वर्ण", hashKey: "ह्यास तालिका कुञ्जी कम्तिमा एक वर्ण हो", score: "क्रमबद्ध सेट स्कोर आवश्यक छ", value: "मूल्य आवश्यक छ" } }, main: { label: { database: "DB" } } }, page: { search: { title: "खोज", index: "इन्डेक्स", query: "क्वेरी", results: "परिणामहरू", noIndex: "इन्डेक्स फेला परेन", createIndex: "इन्डेक्स बनाउनुहोस्", dropIndex: "इन्डेक्स हटाउनुहोस्", indexInfo: "इन्डेक्स जानकारी", indexName: "इन्डेक्स नाम", prefix: "कुञ्जी उपसर्ग (वैकल्पिक)", fieldName: "फिल्ड नाम", }, monitor: { title: "निगरानी", memory: "मेमोरी", opsPerSec: "अपरेशन/सेकेन्ड", clients: "ग्राहकहरू", blocked: "अवरुद्ध", hitsMisses: "हिट दर", networkIo: "नेटवर्क I/O", slowLog: "ढिलो लग", totalCommands: "जम्मा", expired: "म्याद सकिएको", evicted: "निकालिएको", clientList: "ग्राहक सूची", topKeys: "मेमोरी अनुसार ठूला कुञ्जीहरू", killClient: "ग्राहक बन्द गर्नुहोस्", clientKilled: "ग्राहक बन्द गरियो", confirmKillClient: "के तपाईं यो ग्राहक बन्द गर्न निश्चित हुनुहुन्छ?", noKeys: "कुञ्जीहरू छैनन्", noClients: "ग्राहकहरू छैनन्", }, overview: { noConnected: "Redis सँग कुनै जडान छैन।", overviewClients: "ग्राहकहरूको गणनाद्वारा जडान गरिएको सूची गर्नुहोस्", connectedCount: opt => { if (opt.length === 1) { return "१ ग्राहक"; } return `${opt.length} ग्राहकहरु`; } }, key: { label: { key: "कुञ्जी", encoding: "इन्कोडिङ", length: "साइज", ttl: "TTL", ttlTitle: "ब��ँच्ने समय", type: "टाइप गर्नुहोस्", ttlNotExpire: "म्याद समाप्त हुँदैन", lengthString: "बाइट्स", lengthItem: "वस्तुहरू", actions: "कार्यहरू" }, list: { table: { index: "अनुक्रमणिका", value: "मूल्य" } }, hash: { table: { hashkey: "हैसके", value: "मूल्य" } }, set: { table: { value: "सदस्य" } }, zset: { table: { value: "सदस्य", score: "स्कोर" } }, stream: { table: { timestamp: "टाइमस्ट्याम्प आईडी", field: "क्षेत्र", value: "मूल्य" } } }, treeControls: { settings: "रूख सेटिङहरू", expandAll: "सबै विस्तार गर्नुहोस्", collapseAll: "सबै संक्षिप्त गर्नुहोस्", search: { search: "कुञ्जीहरूमा खोज्नुहोस्", clear: "खाली सेट गर्न हालको खोज खाली गर्नुहोस्", placeholderClient: "ग्राहक पक्ष खोज्नुहोस्", placeholderServer: "सर्भर साइड खोज्नुहोस्", info: "क्लाइन्ट साइड खोजको अर्थ, यो खोज इनपुटमा पाठसँग मेल खान्छ। सर्भर साइड खोजको अर्थ, यो कुञ्जी ढाँचामा *{search-text}* को रूपमा खोजी जस्तै हो। ठूला खोज सेटहरूको लागि, यो सर्भर साइड खोजी प्रयोग गर्न राम्रो छ। साना खोज सेटहरूको लागि, ग्राहक पक्ष खोज मोड प्रयोग गर्न राम्रो छ।" + ` यदि कुञ्जी गणना सकियो ${p3xr.settings.maxLightKeysCount}, तपाईले सर्भर साइडमा मात्र खोज्न सक्नुहुन्छ।`, largeSetInfo: "ठूलो सेटमा, ग्राहक पक्ष खोज असक्षम गरिएको छ। त्यसैले अहिले मात्र सर्भर साइड खोजी सम्भव छ।", infoDetails: "खोज कसरी काम गर्छ पत्ता लगाउन, कृपया सेटिङहरू जाँच गर्नुहोस्" }, pager: { next: "अर्को", prev: "अघिल्लो", first: "पहिले", last: "अन्तिम" } } }, time: { loading: "लोड हुँदैछ...", years: "वर्ष", months: "महिना", days: "दिनहरू", year: "वर्ष", month: "महिना", day: "दिन" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/nl/000077500000000000000000000000001517666434100137645ustar00rootroot00000000000000src/strings/nl/strings.js000066400000000000000000000700241517666434100160160ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licentie gewist", invalid_license: "Ongeldige licentie", license_max_devices_reached: "Maximaal aantal apparaatplaatsen bereikt", license_readonly: "De licentie kan alleen worden gewijzigd vanuit de serverterminal.", server_error: "Serverfout, probeer het opnieuw" }, title: { donate: "Doneren", jsonRecursive: "Alle takken uitvouwen", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "U kunt een Redis-verbinding kiezen via het menu linksonder.", statistics: "Statistieken", error: "Fout", connectingRedis: "Verbinden met Redis ...", socketioConnectError: "Socket.IO-fout", db: "DB", server: "Server", clients: "Clients", memory: "Geheugen", persistence: "Persistentie", stats: "Statistieken", replication: "Replicatie", cpu: "CPU", cluster: "Cluster", modules: "Modules", errorstats: "Foutstatistieken", commandstats: "Commandostatistieken", latencystats: "Latentiestatistieken", keysizes: "Sleutelgroottes", threads: "Threads", }, confirm: { dropIndex: "Weet u zeker dat u deze index wilt verwijderen?", uploadBuffer: "Weet u zeker dat u deze binaire gegevens wilt uploaden?", uploadBufferDone: "De binaire gegevens zijn geüpload", uploadBufferDoneAndSave: "De binaire gegevens zijn geüpload en opgeslagen op de server", title: "Bevestigen", alert: "Waarschuwing", info: "Info", deleteListItem: "Weet u zeker dat u dit lijstitem wilt verwijderen?", deleteHashKey: "Weet u zeker dat u deze hash-sleutel wilt verwijderen?", deleteStreamTimestamp: "Weet u zeker dat u dit stream-tijdstempel wilt verwijderen?", deleteSetMember: "Weet u zeker dat u dit set-lid wilt verwijderen?", deleteZSetMember: "Weet u zeker dat u dit gesorteerde set-lid wilt verwijderen?", deleteConnection: "Bevestigen", deleteConnectionText: "Weet u zeker dat u deze Redis-verbinding wilt verwijderen?", deleteNode: "Weet u zeker dat u dit Redis-knooppunt wilt verwijderen?", deleteAllKeys: opts => { return `Deze boom en al zijn sleutels verwijderen (${opts.key})?`; }, socketioConnectError: "Socket.IO kan geen verbinding maken met de server. U kunt herladen en proberen de verbindingsfout zelf op te lossen; de client weet niet hoe het zelf op te lossen.", socketioAuthRequired: "Socket.IO-autorisatie is vereist. Authenticeer met HTTP Basic Auth (gebruikersnaam/wachtwoord) en herlaad.", deleteKey: "Weet u zeker dat u deze sleutel wilt verwijderen?", rename: { title: "Weet u zeker dat u deze sleutel wilt hernoemen?", textContent: "Deze actie hernoemt de sleutel permanent.", placeholder: "De Redis-sleutel (verplicht)" }, ttl: { title: "Weet u zeker dat u de TTL van deze sleutel wilt wijzigen?", textContent: "Het wijzigen van de TTL werkt de levensduur van deze sleutel bij. Laat leeg om de sleutel voor altijd te bewaren.", placeholder: "De TTL van de Redis-sleutel (geheel getal of leeg)", placeholderPlaceholder: "Leeg betekent dat het voor altijd blijft bestaan; voer anders een geheel getal in.", convertTextToTime: "Tekst omzetten naar tijd", convertTextToTimePlaceholder: "Bijv. 1d wordt 86400" }, license: { title: "Licentie instellen", textContent: "Als u betaalde functies wilt gebruiken, neem dan contact op met support@corifeus.com om een licentie aan te vragen. De prijs is Pro 400 HUF/maand (€1/maand) of 4.000 HUF/jaar (€10/jaar), en Enterprise 1.200 HUF/maand (€3/maand) of 12.000 HUF/jaar (€30/jaar). Jaarlijks is 10x maandelijks. Met 27% BTW zijn de totalen Pro 500 HUF/maand (€1,27/maand) of 5.100 HUF/jaar (€12,70/jaar), Enterprise 1.500 HUF/maand (€3,81/maand) of 15.200 HUF/jaar (€38,10/jaar). Licentieverificatie vereist internettoegang. De standaardlicentie bevat 5 plaatsen. Als u meer plaatsen nodig hebt, neem dan contact met ons op via support@corifeus.com.", placeholder: "Licentiesleutel" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiëren", downloadBuffer: "Binair downloaden", setBuffer: "Binair uploaden", exportKeys: "Sleutels exporteren", exportAllKeys: (opts) => `Alle ${opts.count} sleutels exporteren`, exportSearchResults: (opts) => `${opts.count} resultaten exporteren`, importKeys: "Sleutels importeren", saveWithFormatJson: "Opslaan met opmaak", formatJson: "Json opmaken", wrap: "Terugloop", unwrap: "Geen terugloop", downloadJson: "JSON downloaden", pubsubMonitor: "PubSub Monitor", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Taal / Language", ok: "OK", addKey: "Toevoegen aan deze sleutel", addKeyRoot: "Een hoofdsleutel toevoegen", reloadKey: "Sleutel herladen", reload: "Herladen", close: "Sluiten", commands: "Opdrachten", view: "Beeld", statistics: "Statistieken", refresh: "Vernieuwen", pause: "Pauzeren", resume: "Hervatten", clear: "Wissen", rename: "Hernoemen", main: "Database", cancel: "Annuleren", theme: "Thema", github: "GitHub", githubRepo: "Repository", githubRelease: "Releases", githubChangelog: "Wijzigingslogboek", info: "Info", settings: "Instellingen", connect: "Verbinden", disconnect: "Verbinding verbreken", overview: "Overzicht", console: "Console", noConnections: "Geen verbindingen, voeg een verbinding toe in het instellingenmenu.", noConnectionsInSettings: "Geen verbindingen, u kunt hierboven een NIEUWE VERBINDING toevoegen.", connectionAdd: "Nieuwe verbinding", addGroup: "Groep toevoegen", extend: "Uitvouwen", collapse: "Invouwen", add: "Toevoegen", edit: "Bewerken", save: "Opslaan", ttl: "TTL instellen", license: "Licentie instellen", delete: "Verwijderen", remove: "Verwijderen", sure: "Zeker", testConnection: "Verbinding testen", getKey: "Redis-sleutel en bijbehorende gegevens laden ...", jsonViewShow: "JSON weergeven", jsonViewEditor: "JSON bewerken", quickConsole: "Snelle Console" }, label: { id: { nodeId: 'Knooppunt-ID', id: "Verbindings-ID", info: "Als u de volgende eigenschappen niet wilt wijzigen: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, voer dan de ID van de verbinding in bij die eigenschappen om de waarden intact te houden. Als u dezelfde logica wilt voor het knooppuntwachtwoord, voer dan de knooppunt-ID in bij het knooppuntwachtwoord." }, secureFeature: 'Als u een waarde ziet die begint met P3X en er hetzelfde uitziet, dan is het een beveiligingsfunctie. Om de instellingen te wijzigen, vervangt u deze instellingen door lege waarden of iets anders en ze worden opgeslagen. Als u de instellingen niet wijzigt, blijven ze zoals ze op de server staan.', ssh: { on: 'SSH aan', off: 'SSH uit', sshHost: 'SSH-host', sshPort: 'SSH-poort', sshUsername: 'SSH-gebruikersnaam', sshPassword: 'SSH-wachtwoord', sshPrivateKey: 'SSH-privésleutel' }, isBuffer: opts => `[object ArrayBuffer] betekent dat de waarde binaire gegevens is of de waarde groter is dan ${opts.maxValueAsBuffer}`, streamValue: `Stream-veld en waarde staan op één regel. Bijv.: veld1 waarde1 "veld 2" "waarde 2"`, streamTimestampId: `'*' betekent automatisch gegenereerd of de specificatie als -`, unableToLoadKey: ({ key }) => { return `Kan deze sleutel niet laden: ${key}. Mogelijk is de sleutel verwijderd. De exacte fout staat in de console.`; }, bigJson: "Dit JSON-object is groter dan 10 kb, wees er dus zeker van dat u weet wat u doet, want sommige functies kunnen traag renderen.", addNode: "Knooppunt toevoegen", validateJson: "JSON valideren", reducedFunction: `Beperkte functionaliteit`, tooManyKeys: opts => { return `Voor volledige functionaliteit is het maximale aantal toegestane sleutels ${opts.maxLightKeysCount}. Deze database heeft meer sleutels dan toegestaan, namelijk ${opts.count}. Het sorteren van sleutels en de extra boominformatie is uitgeschakeld. Het zoeken vindt alleen plaats op de server in plaats van de client.`; }, redisCommandNotFound: "Geen overeenkomende Redis-opdracht gevonden ...", treeKeyStore: `Het sorteren (natuurlijke vergelijking) wordt uitgevoerd op de client (de browser), wat een nadeel heeft voor grote sets, zoals meer dan 10k sleutels; het kan wat extra tijd toevoegen aan het renderen van de pagina. Er is geen sleutelsortering in Redis, alleen op deze manier.`, socketIoTimeout: options => { return `De Socket.IO-aanvraag is verlopen (maximaal ${options.timeout / 1000} seconden) ...`; }, resizerInfo: options => { return `De minimale breedte van het linker- of rechterpaneel is ${options.width}px`; }, jsonViewNotParsable: "Deze waarde is niet als JSON te parseren ", ttlTitle: "Stel de TTL in seconden in", passwordSecure: "Het wachtwoord kan leeg zijn, maar er worden toch tekens getoond; dit is een beveiligingsfunctie.", tlsWithoutCert: "TLS inschakelen zonder extra certificaat", tlsRejectUnauthorized: "Niet-geautoriseerd certificaat weigeren", tlsSecure: "Als u een TLS-configuratie ziet die begint met P3X of als alle TLS-instellingen er hetzelfde uitzien, is het een beveiligingsfunctie. Om de instellingen te wijzigen, vervangt u deze door lege waarden of iets anders en ze worden opgeslagen. Als u de TLS-instellingen niet wijzigt, blijven ze zoals ze op de server staan.", treeSeparatorEmpty: "Als het boomscheidingsteken leeg is, heeft de boom geen geneste knooppunten, maar slechts een platte lijst", treeSeparatorEmptyNote: "Geen geneste knooppunten, slechts een platte lijst", welcomeConsole: "Welkom bij de Redis Console", welcomeConsoleInfo: "Cursor OMHOOG of OMLAAG voor geschiedenis is ingeschakeld", redisListIndexInfo: "Leeg om toe te voegen, -1 om vooraan te plaatsen of sla het op op de getoonde positie.", console: "Console", connectiondAdd: "Verbinding toevoegen", connectiondEdit: "Verbinding bewerken", connectiondView: "Verbinding bekijken", connections: "Verbindingen", licenseInfo: "Licentie", licenseEditable: "Licentie bewerkbaar", licenseEditableYes: "Ja", licenseEditableNo: "Nee", licenseTerminalOnly: "De licentie kan alleen worden geconfigureerd vanuit de serverterminal.", licenseTierPolicyTitle: "Tariefbeleid", licenseTierPolicyText: "

Free

alleen basis Redis UI; geen SSH-tunneling, geen Readonly-verbindingsmodus, geen Cluster/Sentinel, geen Edit JSON/Upload binary/Download binary, geen ReJSON.
Prijs: 0 HUF/maand (€0/maand).

Pro

SSH-tunneling, Readonly-verbindingsmodus (inclusief --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Basisprijs: 400 HUF/maand (€1/maand) of 4.000 HUF/jaar (€10/jaar).
Totaal met 27% BTW: 500 HUF/maand (€1,27/maand) of 5.100 HUF/jaar (€12,70/jaar).

Enterprise

SSH-tunneling, Cluster en Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r werkt ook.
Basisprijs: 1.200 HUF/maand (€3/maand) of 12.000 HUF/jaar (€30/jaar).
Totaal met 27% BTW: 1.500 HUF/maand (€3,81/maand) of 15.200 HUF/jaar (€38,10/jaar).

Jaarregel

De jaarprijs is 10x de maandprijs.

Plaatsen

De standaardlicentie bevat 5 plaatsen. Als u meer plaatsen nodig hebt, neem dan contact met ons op via support@corifeus.com.

Enterprise-proefversie

10 dagen gratis voor iedereen met een bestaand e-mailadres (geen test-e-mail).

Facturatiegegevens per e-mail

Naam, Facturatie-e-mail, Landcode, Postcode, Stad, Adres, BTW-nummer (optioneel).

Betaling

PayPal-betaling is alleen beschikbaar in HUF (forint); na het verzenden van het geld via https://paypal.me/corifeus stuur ik u een factuur. Alle betalingen zijn niet-restitueerbaar.

BTW

BTW wordt toegevoegd aan de prijs (27% in Hongarije).

Contact

Als u hallo wilt zeggen of een vraag hebt, neem dan contact op met support@corifeus.com.

Taal

Facturen en licentie-e-mailcommunicatie zijn in het Engels. Factuurvaluta is HUF.

Opmerking

Licentieverificatie vereist internettoegang.", licenseState: "Status", licenseStateActive: "Actief", licenseStateInactive: "Inactief", licenseStateNoLicense: "Geen licentie", licenseKeyMasked: "Opgeslagen sleutel", licenseTier: "Tarief", licenseValid: "Geldig", licenseStatus: "Licentiestatus", licenseReason: "Reden", licenseCheckedAt: "Gecontroleerd op", licenseStartsAt: "Start op", licenseExpiresAt: "Verloopt op", licenseDaysLeft: "Resterende dagen", licenseMaxDevices: "Max. apparaten", licenseActiveDevices: "Actieve apparaten", licenseActiveDevicesInfo: "Als een apparaat niet meer wordt gebruikt, wordt de plaats automatisch na 75 minuten vrijgegeven.", licenseCustomerEmail: "E-mail van klant", licenseFeatures: "Functies", licenseFeaturesEmpty: "Geen extra functies", licenseFeatureReadonlyMode: "Alleen-lezen verbindingsmodus", licenseFeatureReadonlyConnectionsFlag: "Alleen-lezen verbindingen (--readonly-connections/-r)", licenseFeatureSsh: "SSH-tunneling", licenseFeatureCluster: "Cluster-verbindingen", licenseFeatureSentinel: "Sentinel-verbindingen", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Sleutelsortering aan", off: "Sleutelsortering uit" }, cluster: { on: "Cluster aan", off: "Cluster uit" }, sentinel: { on: "Sentinel aan", off: "Sentinel uit", name: "Sentinel-naam" }, readonly: { on: "Alleen-lezen aan", off: "Alleen-lezen uit" }, proSshOnly: "SSH is beschikbaar in Pro of Enterprise.", proReadonlyOnly: "Alleen-lezen verbindingsmodus is beschikbaar in Pro of Enterprise.", enterpriseClusterSentinelOnly: "Cluster en Sentinel zijn alleen beschikbaar in Enterprise.", theme: { light: "Licht", dark: "Donker enterprise", darkNeu: "Donker", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Verbonden: ${opts.name}`; }, tree: "Boom", askAuth: "Autorisatie aanvragen", keyboardShortcuts: "Sneltoetsen", about: "Over", supportedLanguages: "Ondersteunde talen", version: "Versie", redisVersion: "Redis-versie", modules: "Modules", shortcutRefresh: "Vernieuwen", shortcutSearch: "Zoeken focussen", shortcutNewKey: "Nieuwe sleutel", shortcutDisconnect: "Verbinding verbreken", themeAuto: "Automatisch (systeem)", shortcutCommandPalette: "Opdrachtenpalet", commandPalette: "Opdrachtenpalet", noResults: "Geen resultaten", redisCommandsReference: "Redis Commando's", ungrouped: "Ongegroepeerd", grouped: "Gegroepeerd", connectFirst: "Maak eerst verbinding met een Redis-server", searchLanguage: "Taal zoeken...", exportProgress: "Sleutels exporteren...", importProgress: "Sleutels importeren...", importPreview: "Voorbeeld", importOverwrite: "Overschrijven", importSkip: "Overslaan", importConflict: "Als de sleutel al bestaat:", noKeysToExport: "Geen sleutels om te exporteren", time: "Tijd", loading: "Laden...", autoRefresh: "Auto", exportSearchHint: "Alleen sleutels die overeenkomen met de huidige zoekopdracht worden geëxporteerd", importSearchHint: "Import is van toepassing op de gehele database, niet alleen op zoekresultaten", importNoKeys: "Geen sleutels gevonden in bestand", }, status: { dataCopied: "De gegevens staan op het klembord", licenseSaved: "Licentie opgeslagen", exportDone: "Export voltooid", indexCreated: "Index aangemaakt", indexDropped: "Index verwijderd", importDone: (opts) => `Import voltooid: ${opts.created} aangemaakt, ${opts.skipped} overgeslagen, ${opts.errors} fouten`, nodeRemoved: "Knooppunt verwijderd", keyIsNotExisting: "Deze sleutel is mogelijk verwijderd of verlopen.", keyCount: opts => { if (opts.keyCount === 0) { return "Geen sleutel"; } else if (opts.keyCount === 1) { return "1 sleutel"; } else { return `${opts.keyCount} sleutels`; } }, treeExpandAll: "Alle boomtakken uitvouwen. Deze bewerking kan duur zijn en kan enige tijd duren ...", noRedisKeys: "Er zijn geen sleutels in deze database.", redisConnected: "Redis succesvol verbonden", reloadingDataInfo: "Redis-gegevens opnieuw laden", added: "Toegevoegd", saved: "Bijgewerkt", cancelled: "Geannuleerd", deleted: "Verwijderd", savedRedis: "Redis-gegevens zijn opgeslagen", redisDisconnected: opts => { return `De huidige verbinding had een fout: ${opts.error.message}`; }, dbChanged: opts => { return `De database-index is ingesteld op ${opts.db}. `; }, treeDeleted: opts => { return `De boomsleutel is verwijderd (${opts.key}).`; }, deletedKey: opts => { return `De sleutel is verwijderd (${opts.key}).`; }, renamedKey: "Deze sleutel is hernoemd", ttlChanged: "De TTL van deze sleutel is gewijzigd", notInteger: "Deze invoer is geen geheel getal", persisted: "Deze sleutel wordt voor altijd bewaard", set: "De sleutel is ingesteld/toegevoegd" }, code: { "delete-connection": "Deze verbinding is verwijderd, dus u bent losgekoppeld van deze Redis-instantie.", "save-connection": "Deze verbinding is gewijzigd, dus u bent losgekoppeld van deze Redis-instantie. U kunt opnieuw verbinden.", "readonly-connections": "Verbindingen toevoegen/opslaan/verwijderen is alleen-lezen!", "readonly-connection-mode": "Deze verbinding is alleen-lezen!", "list-out-of-bounds": "Deze lijstindex valt buiten het bereik", "donation-ware-feature": "Deze functie is beschikbaar in de donatieversie.", "feature-pro-readonly-required": "Alleen-lezen verbindingsmodus vereist een Pro- of Enterprise-licentie.", "feature-pro-ssh-required": "SSH-tunneling vereist een Pro- of Enterprise-licentie.", "feature-enterprise-cluster-sentinel-required": "Cluster en Sentinel vereisen een Enterprise-licentie.", "feature-pro-json-binary-required": "Edit JSON, Upload binary en Download binary vereisen een Pro- of Enterprise-licentie.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorisatie vereist: authenticeer met HTTP Basic Auth en herlaad.", "auto-connection-failed": "Mogelijk is de verbinding verwijderd en is de automatische verbinding om die reden mislukt.", invalid_console_command: "Deze opdracht werkt niet via de GUI." }, licenseReason: { LICENSE_VALID: "Licentie is geldig", LICENSE_INVALID: "Licentie is ongeldig", LICENSE_MISSING: "Geen licentiesleutel ingesteld", LICENSE_DISABLED: "Licentie is uitgeschakeld in de serverconfiguratie", LICENSE_NOT_FOUND: "Licentie niet gevonden", LICENSE_EXPIRED: "Licentie is verlopen", LICENSE_CLEARED: "Licentiesleutel is gewist", LICENSE_MAX_DEVICES_REACHED: "Maximaal aantal apparaatplaatsen bereikt", PRODUCT_MISMATCH: "Licentieproduct komt niet overeen" }, licenseStatusValue: { active: "Actief", deleted: "Verwijderd", all: "Alle", expired: "Verlopen", missing: "Ontbreekt", inactive: "Inactief" }, form: { error: { required: "Verplicht", port: "De poort is tussen 1-65535", invalid: "Het formulier is ongeldig" }, connection: { label: { name: "Naam", group: "Groep", host: "Hostnaam", port: "Poort", password: "Wachtwoord", username: "Gebruikersnaam" } }, treeSettings: { maxValueDisplay: "Maximale lengte weergavewaarde", maxValueDisplayInfo: "Indien ingesteld op 0, worden volledige waarden getoond. Indien groter dan 0, wordt afgekapt tot deze lengte. Indien -1: voor strings wordt de waarde verborgen tot bewerking; voor andere typen wordt de volledige inhoud getoond.", maxKeys: "Maximaal aantal sleutels", maxKeysInfo: "Om te voorkomen dat de GUI vastloopt, beperken we het maximale aantal sleutels.", keyCount: () => { return `Aantal sleutels: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Animatie gebruiken", noAnimation: "Geen animatie", jsonFormatTwoSpace: "JSON opmaken met 2 spaties", jsonFormatFourSpace: "JSON opmaken met 4 spaties", formName: "Redis-instellingen", searchModeClient: "Zoekmodus client", searchModeServer: "Zoekmodus server", searchModeStartsWith: "Zoeken met begint-met-modus", searchModeIncludes: "Zoeken met bevat-modus" }, field: { treeSeparator: "Boomscheidingsteken", treeSeparatorSelector: "Boomscheidingstekenkiezer", page: "Aantal boompagina's", keyPageCount: "Aantal sleutelpagina's", keysSort: "Sleutels sorteren", searchMode: "Zoekmodus", searchModeStartsWith: "Begint met / bevat zoeken" }, error: { keyPageCount: "Het aantal sleutelpagina's moet een geheel getal zijn tussen 5 - 100", page: "Het aantal pagina's moet een geheel getal zijn tussen 10 - 5000", maxValueDisplay: "De maximale weergavewaarde moet een geheel getal zijn tussen -1 en 32768", maxKeys: "Het maximale aantal sleutels moet een geheel getal zijn tussen 100 en 100000" } }, key: { label: { formName: { add: "Nieuwe Redis-sleutel toevoegen", edit: "Redis-sleutel bewerken", append: "Toevoegen aan bestaande Redis-sleutel" } }, field: { streamTimestamp: "Tijdstempel", key: "Sleutel", type: "Type", index: "Index", hashKey: "Hash-sleutel", score: "Score", value: "Waarde" }, error: { streamTimestamp: "Het tijdstempel is verplicht, in Redis-formaat of als *", key: "De sleutel moet minimaal één teken bevatten", hashKey: "De hash-tabelsleutel moet minimaal één teken bevatten", score: "De gesorteerde set-score is verplicht", value: "De waarde is verplicht" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Zoeken", index: "Index", query: "Zoekopdracht", results: "Resultaten", noIndex: "Geen indexen gevonden", createIndex: "Index aanmaken", dropIndex: "Index verwijderen", indexInfo: "Index info", indexName: "Indexnaam", prefix: "Sleutelprefix (optioneel)", fieldName: "Veldnaam", }, monitor: { title: "Bewaking", memory: "Geheugen", opsPerSec: "Ops/sec", clients: "Clients", blocked: "Geblokkeerd", hitsMisses: "Trefkans", networkIo: "Netwerk I/O", slowLog: "Traag logboek", totalCommands: "Totaal", expired: "Verlopen", evicted: "Verdreven", clientList: "Clientlijst", topKeys: "Grootste sleutels op geheugen", killClient: "Client beëindigen", clientKilled: "Client beëindigd", confirmKillClient: "Weet u zeker dat u deze client wilt beëindigen?", noKeys: "Geen sleutels", noClients: "Geen clients", }, overview: { noConnected: "Er is geen verbinding met Redis.", overviewClients: "Verbonden weergeven op aantal clients", connectedCount: opt => { if (opt.length === 1) { return "1 client"; } return `${opt.length} clients`; } }, key: { label: { key: "Sleutel", encoding: "Codering", length: "Grootte", ttl: "TTL", ttlTitle: "Time To Live", type: "Type", ttlNotExpire: "verloopt niet", lengthString: "bytes", lengthItem: "items", actions: "Acties" }, list: { table: { index: "Index", value: "Waarde" } }, hash: { table: { hashkey: "Hash-sleutel", value: "Waarde" } }, set: { table: { value: "Lid" } }, zset: { table: { value: "Lid", score: "Score" } }, stream: { table: { timestamp: "Tijdstempel-ID", field: "Veld", value: "Waarde" } } }, treeControls: { settings: "Boominstellingen", expandAll: "Alles uitvouwen", collapseAll: "Alles invouwen", search: { search: "Zoeken in de sleutels", clear: "Huidige zoekopdracht wissen", placeholderClient: "Zoeken aan clientzijde", placeholderServer: "Zoeken aan serverzijde", info: "Zoeken aan de clientzijde betekent dat het overeenkomt met de tekst in het zoekveld. Zoeken aan de serverzijde betekent dat het zoekt in de sleutelpatronen als *{zoektekst}*. Voor grote zoeksets is het beter om aan de serverzijde te zoeken. Voor kleinere zoeksets is het beter om aan de clientzijde te zoeken." + ` Als het aantal sleutels meer is dan ${p3xr.settings.maxLightKeysCount}, kunt u alleen aan de serverzijde zoeken.`, largeSetInfo: "In een grote set is zoeken aan de clientzijde uitgeschakeld, dus momenteel is alleen zoeken aan de serverzijde mogelijk.", infoDetails: "Om te weten hoe het zoeken werkt, bekijk de instellingen" }, pager: { next: "Volgende", prev: "Vorige", first: "Eerste", last: "Laatste" } } }, time: { loading: "Laden...", years: "jaren", months: "maanden", days: "dagen", year: "jaar", month: "maand", day: "dag" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/no/000077500000000000000000000000001517666434100137675ustar00rootroot00000000000000src/strings/no/strings.js000066400000000000000000000661061517666434100160270ustar00rootroot00000000000000const strings = { error: { cleared_license: "Godkjent lisens", invalid_license: "Ugyldig lisens", license_max_devices_reached: "Maksimalt antall enhetsplasser nådd", license_readonly: "Lisens kan bare endres fra serverterminalen.", server_error: "Serverfeil, prøv igjen" }, title: { donate: "Doner", jsonRecursive: "Utvider alle blader", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Du kan velge en Redis-tilkobling for å koble til fra menyen nederst til venstre.", statistics: "Statistikk", error: "Feil", connectingRedis: "Kobler til Redis ...", socketioConnectError: "Socket.IO Feil", db: "DB", server: "Server", clients: "Kunder", memory: "Minne", persistence: "Utholdenhet", stats: "Statistikk", replication: "Replikering", cpu: "CPU", cluster: "Cluster", modules: "Moduler", errorstats: "Feilstatistikk", commandstats: "Kommandostatistikk", latencystats: "Latensstatistikk", keysizes: "Nøkkelstørrelser", threads: "Tråder", }, confirm: { dropIndex: "Er du sikker på at du vil slette denne indeksen?", uploadBuffer: "Er du sikker på at du laster opp disse binære dataene?", uploadBufferDone: "De binære dataene lastes opp", uploadBufferDoneAndSave: "De binære dataene lastes opp og lagres på serveren", title: "Bekreft", alert: "Varsel", info: "Info", deleteListItem: "Er du sikker på at du vil slette dette listeelementet?", deleteHashKey: "Er du sikker på at du vil slette dette hash-nøkkelelementet?", deleteStreamTimestamp: "Er du sikker på at du vil slette dette tidsstempelet for strømmen?", deleteSetMember: "Er du sikker på at du vil slette dette settemedlemmet?", deleteZSetMember: "Er du sikker på at du vil slette dette sorterte settmedlemmet?", deleteConnection: "Bekreft", deleteConnectionText: "Er du sikker på å slette denne Redis-tilkoblingen?", deleteNode: "Er du sikker på å slette denne Redis-noden?", deleteAllKeys: opts => { return `Slett dette treet og alle dets nøkler (${opts.key})?`; }, socketioConnectError: "Socket.IO kan ikke koble til serveren, du kan laste inn på nytt og prøve å løse tilkoblingsfeilen selv, klienten vet ikke hvordan den skal løse det selv.", socketioAuthRequired: "Socket.IO-autorisasjon kreves. Vennligst autentiser med HTTP Basic Auth (brukernavn/passord) og last inn på nytt.", deleteKey: "Er du sikker på at du vil slette denne nøkkelen?", rename: { title: "Er du sikker på at du vil gi nytt navn til denne nøkkelen?", textContent: "Denne handlingen gir nytt navn til nøkkelen permanent.", placeholder: "Redis-nøkkelen (påkrevd)" }, ttl: { title: "Er du sikker på at du vil endre denne nøkkelens TTL?", textContent: "Å endre TTL oppdaterer denne nøkkelens tid til å leve. La den stå tom for å beholde denne nøkkelen for alltid.", placeholder: "Redis-nøkkelens TTL (heltall eller tom)", placeholderPlaceholder: "Tom betyr at den vedvarer for alltid; ellers skriv inn et heltall.", convertTextToTime: "Konverter tekst til tid", convertTextToTimePlaceholder: "F.eks. 1d vil være 86400" }, license: { title: "Angi lisens", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Lisensnøkkel" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopier", downloadBuffer: "Last ned binær", setBuffer: "Last opp binær", exportKeys: "Eksporter nøkler", exportAllKeys: (opts) => `Eksporter alle ${opts.count} nøkler`, exportSearchResults: (opts) => `Eksporter ${opts.count} resultater`, importKeys: "Importer nøkler", saveWithFormatJson: "Lagre med format", formatJson: "Format Json", wrap: "Pakk inn", unwrap: "Pakk ut", downloadJson: "Last ned JSON", pubsubMonitor: "PubSub-skjerm", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Språk", ok: "OK", addKey: "Legg til denne nøkkelen", addKeyRoot: "Legg til en rotnøkkel", reloadKey: "Last inn nøkkelen på nytt", reload: "Last inn på nytt", close: "Lukk", commands: "Kommandoer", view: "Visning", statistics: "Statistikk", refresh: "Oppdater", pause: "Pause", resume: "Gjenoppta", clear: "Klart", rename: "Gi nytt navn", main: "Database", cancel: "Avbryt", theme: "Tema", github: "GitHub", githubRepo: "Depot", githubRelease: "Utgivelser", githubChangelog: "Endringslogg", info: "Info", settings: "Innstillinger", connect: "Koble til", disconnect: "Koble fra", overview: "Oversikt", console: "Konsoll", noConnections: "Ingen tilkoblinger, legg til en tilkobling i innstillingsmenyen.", noConnectionsInSettings: "Ingen tilkoblinger, du kan legge til en NY TILKOBLING ovenfor.", connectionAdd: "Ny tilkobling", addGroup: "Legg til gruppe", extend: "Forleng", collapse: "Skjul sammen", add: "Legg til", edit: "Rediger", save: "Lagre", ttl: "Sett TTL", license: "Angi lisens", delete: "Slett", remove: "Fjern", sure: "Klart det", testConnection: "Test tilkobling", getKey: "Laster inn Redis-nøkkel og tilhørende data ...", jsonViewShow: "Vis JSON", jsonViewEditor: "Rediger JSON", quickConsole: "Hurtigkonsoll", }, label: { id: { nodeId: "Node ID", id: "Tilkoblings-ID", info: "Hvis du ikke vil endre egenskapene til: sshPassword, sshPrivateKey, passord, tlsCrt, tlsKey, tlsCa, vennligst skriv inn ID-en til tilkoblingen i disse egenskapene for å holde egenskapsverdiene intakte. Hvis du vil ha samme logikk i nodepassordet, skriv inn node-ID i nodepassordet." }, secureFeature: "Hvis du ser en verdi som starter med en P3X og ser ut som den samme, er det en sikker funksjon. For å endre innstillingene, erstatt disse innstillingene med tomme eller noe annet, og de vil bli lagret. Hvis du ikke endrer innstillingene, beholdes innstillingene slik de er på serveren.", ssh: { on: "SSH på", off: "SSH av", sshHost: "SSH Vert", sshPort: "SSH-port", sshUsername: "SSH brukernavn", sshPassword: "SSH passord", sshPrivateKey: "SSH privat nøkkel" }, isBuffer: opts => `[object ArrayBuffer] betyr at verdien er binære data eller verdien er større enn ${opts.maxValueAsBuffer}`, streamValue: `Strømfelt og verdi er en oneliner. Eks.: felt1 verdi1 "felt 2" "verdi 2"`, streamTimestampId: `'*' betyr automatisk generert eller spesifikasjonen som -`, unableToLoadKey: ({ key }) => { return `Kan ikke laste denne nøkkelen: ${key}. Mulig, nøkkelen ble slettet. Den nøyaktige feilen er i konsollen.`; }, bigJson: "Dette JSON-objektet er over 10 kb, så sørg for at du vet hva du gjør, fordi noen funksjoner kan være treg gjengivelse.", addNode: "Legg til node", validateJson: "Valider JSON", reducedFunction: `Redusert funksjonalitet`, tooManyKeys: opts => { return `For de fulle maksimale funksjonene tillatte tastene totalt er ${opts.maxLightKeysCount} telle. Denne databasen har over de tillatte nøklene totalt ${opts.count}. Nøkkelsortering og ekstra fancy treinformasjon er deaktivert. Søket skjer bare på serveren i stedet for klientsøket.`; }, redisCommandNotFound: "Ingen Redis-kommandotreff funnet ...", treeKeyStore: `Sorteringen (naturlig sammenligning) utføres på klienten aka nettleseren, noe som betyr at den har en straff for store store sett, som over 10k nøkler, det kan legge til litt tid til sidegjengivelsen. Det er ingen nøkkelsortering i Redis, bare slik.`, socketIoTimeout: options => { return `Socket.IO ble tidsavbrutt for denne forespørselen (maks ${options.timeout / 1000} sekunder) ...`; }, resizerInfo: options => { return `Minste bredde på venstre eller høyre panel er ${options.width}px`; }, jsonViewNotParsable: "Denne verdien er ikke JSON parserbar ", ttlTitle: "Still inn TTL på sekunder", passwordSecure: "Passordet kan være tomt, men det vil fortsatt vise tegn, dette er en sikkerhetsfunksjon.", tlsWithoutCert: "Aktiver TLS uten ekstra sertifikat", tlsRejectUnauthorized: "Avvis uautorisert sertifikat", tlsSecure: "Hvis du ser en TLS-konfigurasjon som starter med en P3X eller alle TLS-innstillingene ser like ut, er det en sikker funksjon. For å endre innstillingene, erstatt disse innstillingene med tomme eller noe annet, og de vil bli lagret. Hvis du ikke endrer TLS-innstillingene, beholdes innstillingene slik de er på serveren.", treeSeparatorEmpty: "Hvis treskilleren er tom, vil treet ikke ha noen nestede noder, bare en ren liste", treeSeparatorEmptyNote: "Ingen nestede noder, bare en ren liste", welcomeConsole: "Velkommen til Redis-konsollen", welcomeConsoleInfo: "Markør OPP- eller NED-historikk er aktivert", redisListIndexInfo: "Tom for å legge til, -1 for å legge til eller lagre den til posisjonen som vises.", console: "Konsoll", connectiondAdd: "Legg til tilkobling", connectiondEdit: "Rediger tilkobling", connectiondView: "Se tilkoblingen", connections: "Tilkoblinger", licenseInfo: "Lisens", licenseEditable: "Lisens kan redigeres", licenseEditableYes: "Ja", licenseEditableNo: "Nei", licenseTerminalOnly: "Lisens kan bare konfigureres fra serverterminalen.", licenseTierPolicyTitle: "Nivåpolicy", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "stat", licenseStateActive: "Aktiv", licenseStateInactive: "Inaktiv", licenseStateNoLicense: "Ingen lisens", licenseKeyMasked: "Lagret nøkkel", licenseTier: "Nivå", licenseValid: "Gyldig", licenseStatus: "Lisensstatus", licenseReason: "Grunn", licenseCheckedAt: "Sjekket kl", licenseStartsAt: "Starter kl", licenseExpiresAt: "Utløper kl", licenseDaysLeft: "Dager igjen", licenseMaxDevices: "Maks enheter", licenseActiveDevices: "Aktive enheter", licenseActiveDevicesInfo: "Hvis en enhet ikke lenger brukes, frigjøres setet automatisk etter 75 minutter.", licenseCustomerEmail: "Kundens e-post", licenseFeatures: "Funksjoner", licenseFeaturesEmpty: "Ingen ekstra funksjoner", licenseFeatureReadonlyMode: "Skrivebeskyttet tilkoblingsmodus", licenseFeatureReadonlyConnectionsFlag: "Skrivebeskyttede tilkoblinger (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunnelering", licenseFeatureCluster: "Cluster tilkoblinger", licenseFeatureSentinel: "Sentinel tilkoblinger", licenseFeatureReJSON: "ReJSON (JSON datatype)", keysSort: { on: "Nøkkelsortering på", off: "Nøkkelsortering" }, cluster: { on: "Cluster på", off: "Cluster av" }, sentinel: { on: "Sentinel på", off: "Sentinel av", name: "Sentinel navn" }, readonly: { on: "Skrivebeskyttet på", off: "Skrivebeskyttet av" }, proSshOnly: "SSH er tilgjengelig i Pro eller Enterprise.", proReadonlyOnly: "Skrivebeskyttet tilkoblingsmodus er tilgjengelig i Pro eller Enterprise.", enterpriseClusterSentinelOnly: "Cluster og Sentinel er kun tilgjengelig i Enterprise.", theme: { light: "Lys", dark: "Mørk bedrift", darkNeu: "Mørkt", darkoBluo: "Mørk blå", enterprise: "Enterprise", redis: "Redis", matrix: "Matrise" }, connected: opts => { return `Tilkoblet: ${opts.name}`; }, tree: "Tre", askAuth: "Be om autorisasjon", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduler", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Koble fra", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Kommandoer", ungrouped: "Uten gruppe", grouped: "Grouped", connectFirst: "Koble til en Redis-server først", searchLanguage: "Søk språk...", exportProgress: "Eksporterer nøkler...", importProgress: "Importerer nøkler...", importPreview: "Forhåndsvisning", importOverwrite: "Overskriv", importSkip: "Hopp over", importConflict: "Hvis nøkkelen allerede finnes:", noKeysToExport: "Ingen nøkler å eksportere", time: "Tid", loading: "Laster...", autoRefresh: "Auto", exportSearchHint: "Eksporterer kun nøkler som matcher gjeldende søk", importSearchHint: "Import gjelder for hele databasen, ikke bare søkeresultater", importNoKeys: "Ingen nøkler funnet i filen", }, status: { dataCopied: "Dataene er i utklippstavlen", licenseSaved: "Lisensen er lagret", exportDone: "Eksport fullført", indexCreated: "Indeks opprettet", indexDropped: "Indeks slettet", importDone: (opts) => `Import fullført: ${opts.created} opprettet, ${opts.skipped} hoppet over, ${opts.errors} feil`, nodeRemoved: "Node fjernet", keyIsNotExisting: "Denne nøkkelen kan ha blitt slettet eller utløpt.", keyCount: opts => { if (opts.keyCount === 0) { return "Ingen nøkkel"; } else if (opts.keyCount === 1) { return "1 nøkkel"; } else { return `${opts.keyCount} nøkler`; } }, treeExpandAll: "Utvid alle trebladene. Denne operasjonen kan være dyr og kan ta tid ...", noRedisKeys: "Det er ingen nøkler i denne databasen.", redisConnected: "Redis tilkoblet vellykket", reloadingDataInfo: "Laster Redis datainfo på nytt", added: "Lagt til", saved: "Oppdatert", cancelled: "Kansellert", deleted: "Slettet", savedRedis: "Redis-data er lagret", redisDisconnected: opts => { return `Den gjeldende tilkoblingen hadde en feil: ${opts.error.message}`; }, dbChanged: opts => { return `db-indeksen satt til ${opts.db}. `; }, treeDeleted: opts => { return `Trenøkkelen ble slettet (${opts.key}).`; }, deletedKey: opts => { return `Nøkkelen ble slettet (${opts.key}).`; }, renamedKey: "Denne nøkkelen har fått nytt navn", ttlChanged: "Denne nøkkelens TTL er endret", notInteger: "Denne inngangen er ikke et heltall", persisted: "Denne nøkkelen er vedvart for alltid", set: "Nøkkelen er satt/lagt til" }, code: { "delete-connection": "Denne tilkoblingen ble slettet, så du er frakoblet denne Redis-forekomsten.", "save-connection": "Denne tilkoblingen ble endret, så du er koblet fra denne Redis-forekomsten. Du kan koble til på nytt.", "readonly-connections": "Tilkoblinger legg til/lagre/slett er skrivebeskyttet!", "readonly-connection-mode": "Denne tilkoblingen er skrivebeskyttet modus!", "list-out-of-bounds": "Denne listeindeksen er utenfor grensene", "donation-ware-feature": "Denne funksjonen er til stede i donasjonsversjonen.", "feature-pro-readonly-required": "Skrivebeskyttet tilkoblingsmodus krever Pro- eller Enterprise-lisens.", "feature-pro-ssh-required": "SSH-tunnelering krever Pro- eller Enterprise-lisens.", "feature-enterprise-cluster-sentinel-required": "Cluster og Sentinel krever Enterprise-lisens.", "feature-pro-json-binary-required": "Rediger JSON, Last opp binær og Last ned binær krever Pro- eller Enterprise-lisens.", "feature-pro-rejson-required": "ReJSON (JSON datatype) krever Pro- eller Enterprise-lisens.", "invalid-json-value": "Verdien er ikke gyldig JSON.", "http_auth_required": "Autorisasjon kreves: vennligst autentiser med HTTP Basic Auth og last inn på nytt.", "auto-connection-failed": "Mulig, tilkoblingen ble fjernet og den automatiske tilkoblingen mislyktes på grunn av dette.", invalid_console_command: "Denne kommandoen fungerer ikke via GUI." }, licenseReason: { LICENSE_VALID: "Lisensen er gyldig", LICENSE_INVALID: "Lisensen er ugyldig", LICENSE_MISSING: "Ingen lisensnøkkel er angitt", LICENSE_DISABLED: "Lisensen er deaktivert i serverkonfigurasjonen", LICENSE_NOT_FOUND: "Finner ikke lisensen", LICENSE_EXPIRED: "Lisensen er utløpt", LICENSE_CLEARED: "Lisensnøkkelen ble slettet", LICENSE_MAX_DEVICES_REACHED: "Maksimalt antall enhetsplasser nådd", PRODUCT_MISMATCH: "Lisensproduktet samsvarer ikke" }, licenseStatusValue: { active: "Aktiv", deleted: "Slettet", all: "Alle", expired: "Utløpt", missing: "Mangler", inactive: "Inaktiv" }, form: { error: { required: "Obligatorisk", port: "Porten er mellom 1-65535", invalid: "Skjemaet er ugyldig" }, connection: { label: { name: "Navn", group: "Group", host: "Vertsnavn", port: "Port", password: "Passord", username: "Brukernavn" } }, treeSettings: { maxValueDisplay: "Maks verdi for visningsstrenglengde", maxValueDisplayInfo: "Hvis satt til 0, vis hele verdiene. Hvis større enn 0, avkort til denne lengden. Hvis -1: for strenger, skjul verdien til du redigerer; for andre typer, vis fullt innhold.", maxKeys: "Maks nøkkeltall", maxKeysInfo: "For at GUI ikke skal krasje, begrenser vi maks nøkkeltall.", keyCount: () => { return `Antall nøkler: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Bruk animasjon", noAnimation: "Ingen animasjon", jsonFormatTwoSpace: "Formater JSON med 2 mellomrom", jsonFormatFourSpace: "Formater JSON med 4 mellomrom", formName: "Redis-innstillinger", searchModeClient: "Klientsøkemodus", searchModeServer: "Serversøkemodus", searchModeStartsWith: "Søk med starter med modus", searchModeIncludes: "Søk inkluderer modus" }, field: { treeSeparator: "Treskiller", treeSeparatorSelector: "Treskillevelger", page: "Antall tresøking", keyPageCount: "Antall nøkkelsøking", keysSort: "Sorter nøklene", searchMode: "Søkemodus", searchModeStartsWith: "Søket starter med / inkluderer" }, error: { keyPageCount: "Antall nøkkelsider må være et heltall mellom 5 og 100", page: "Sideantallet må være et heltall mellom 10 - 5000", maxValueDisplay: "Den maksimale visningsverdien må være et heltall mellom -1 og 32768", maxKeys: "Den maksimale nøkkeltallverdien må være et heltall mellom 100 og 100 000" } }, key: { label: { formName: { add: "Legg til ny Redis-nøkkel", edit: "Rediger Redis nøkkel", append: "Legg til eksisterende Redis-nøkkel" } }, field: { streamTimestamp: "Tidsstempel", key: "Nøkkel", type: "Type", index: "Indeks", hashKey: "Hash-nøkkel", score: "Score", value: "Verdi" }, error: { streamTimestamp: "Tidsstemplet er påkrevd, enten Redis-format eller som *", key: "Nøkkelen er minst ett tegn", hashKey: "Hash-tabellnøkkelen er minst ett tegn", score: "Den sorterte settpoengsummen er påkrevd", value: "Verdien er påkrevd" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Søk", index: "Indeks", query: "Spørring", results: "Resultater", noIndex: "Ingen indekser funnet", createIndex: "Opprett indeks", dropIndex: "Slett indeks", indexInfo: "Indeksinfo", indexName: "Indeksnavn", prefix: "Nøkkelprefiks (valgfritt)", fieldName: "Feltnavn", }, monitor: { title: "Overvåking", memory: "Minne", opsPerSec: "Ops/sek", clients: "Klienter", blocked: "Blokkert", hitsMisses: "Treffrate", networkIo: "Nettverk I/O", slowLog: "Treg logg", totalCommands: "Totalt", expired: "Utløpt", evicted: "Kastet ut", clientList: "Klientliste", topKeys: "Største nøkler etter minne", killClient: "Avslutt klient", clientKilled: "Klient avsluttet", confirmKillClient: "Er du sikker på at du vil avslutte denne klienten?", noKeys: "Ingen nøkler", noClients: "Ingen klienter", }, overview: { noConnected: "Det er ingen tilkobling til Redis.", overviewClients: "List de tilknyttede etter antall klienter", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klienter`; } }, key: { label: { key: "Nøkkel", encoding: "Koding", length: "Størrelse", ttl: "TTL", ttlTitle: "Tid å leve", type: "Type", ttlNotExpire: "utløper ikke", lengthString: "bytes", lengthItem: "gjenstander", actions: "Handlinger" }, list: { table: { index: "Indeks", value: "Verdi" } }, hash: { table: { hashkey: "Hashkey", value: "Verdi" } }, set: { table: { value: "Medlem" } }, zset: { table: { value: "Medlem", score: "Score" } }, stream: { table: { timestamp: "Tidsstempel-ID", field: "Felt", value: "Verdi" } } }, treeControls: { settings: "Treinnstillinger", expandAll: "Utvid alle", collapseAll: "Skjul alle", search: { search: "Søk i tastene", clear: "Slett gjeldende søk for å sette tomt", placeholderClient: "Søk på klientsiden", placeholderServer: "Søk på serversiden", info: "Søket på klientsiden betyr at det samsvarer med teksten i søkeinndataene. Søket på serversiden betyr at det er som å søke i nøkkelmønstrene som *{søk-tekst}*. For store søkesett er det bedre å bruke søk på serversiden. For mindre søkesett er det bedre å bruke søkemodus på klientsiden." + ` Hvis nøklene er over ${p3xr.settings.maxLightKeysCount}, kan du bare søke på serversiden.`, largeSetInfo: "I et stort sett er søk på klientsiden deaktivert. så akkurat nå er det bare søk på serversiden som er mulig.", infoDetails: "For å finne ut hvordan søket fungerer, sjekk innstillingene" }, pager: { next: "Neste", prev: "Forrige", first: "Først", last: "Sist" } } }, time: { loading: "Laster...", years: "år", months: "måneder", days: "dager", year: "år", month: "måned", day: "dag" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/pl/000077500000000000000000000000001517666434100137665ustar00rootroot00000000000000src/strings/pl/strings.js000066400000000000000000000705611517666434100160260ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licencja wyczyszczona", invalid_license: "Nieprawidłowa licencja", license_max_devices_reached: "Osiągnięto maksymalną liczbę miejsc na urządzenia", license_readonly: "Licencję można zmienić tylko z terminala serwera.", server_error: "Błąd serwera, spróbuj ponownie" }, title: { donate: "Wspomóż", jsonRecursive: "Rozwijanie wszystkich gałęzi", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Możesz wybrać połączenie Redis z menu w lewym dolnym rogu.", statistics: "Statystyki", error: "Błąd", connectingRedis: "Łączenie z Redis ...", socketioConnectError: "Błąd Socket.IO", db: "DB", server: "Serwer", clients: "Klienty", memory: "Pamięć", persistence: "Trwałość", stats: "Statystyki", replication: "Replikacja", cpu: "CPU", cluster: "Cluster", modules: "Moduły", errorstats: "Statystyki błędów", commandstats: "Statystyki poleceń", latencystats: "Statystyki opóźnień", keysizes: "Rozmiary kluczy", threads: "Wątki", }, confirm: { dropIndex: "Czy na pewno chcesz usunąć ten indeks?", uploadBuffer: "Czy na pewno chcesz przesłać te dane binarne?", uploadBufferDone: "Dane binarne zostały przesłane", uploadBufferDoneAndSave: "Dane binarne zostały przesłane i zapisane na serwerze", title: "Potwierdzenie", alert: "Ostrzeżenie", info: "Informacja", deleteListItem: "Czy na pewno chcesz usunąć ten element listy?", deleteHashKey: "Czy na pewno chcesz usunąć ten klucz hash?", deleteStreamTimestamp: "Czy na pewno chcesz usunąć ten znacznik czasu strumienia?", deleteSetMember: "Czy na pewno chcesz usunąć ten element zbioru?", deleteZSetMember: "Czy na pewno chcesz usunąć ten element zbioru posortowanego?", deleteConnection: "Potwierdzenie", deleteConnectionText: "Czy na pewno chcesz usunąć to połączenie Redis?", deleteNode: "Czy na pewno chcesz usunąć ten węzeł Redis?", deleteAllKeys: opts => { return `Usunąć to drzewo i wszystkie jego klucze (${opts.key})?`; }, socketioConnectError: "Socket.IO nie może połączyć się z serwerem. Możesz przeładować stronę i spróbować samodzielnie rozwiązać problem z połączeniem; klient nie potrafi rozwiązać go samodzielnie.", socketioAuthRequired: "Wymagana jest autoryzacja Socket.IO. Uwierzytelnij się za pomocą HTTP Basic Auth (nazwa użytkownika/hasło) i przeładuj stronę.", deleteKey: "Czy na pewno chcesz usunąć ten klucz?", rename: { title: "Czy na pewno chcesz zmienić nazwę tego klucza?", textContent: "Ta operacja trwale zmienia nazwę klucza.", placeholder: "Klucz Redis (wymagany)" }, ttl: { title: "Czy na pewno chcesz zmienić TTL tego klucza?", textContent: "Zmiana TTL aktualizuje czas życia tego klucza. Pozostaw puste, aby zachować klucz na zawsze.", placeholder: "TTL klucza Redis (liczba całkowita lub puste)", placeholderPlaceholder: "Puste oznacza, że klucz istnieje na zawsze; w przeciwnym razie wpisz liczbę całkowitą.", convertTextToTime: "Konwertuj tekst na czas", convertTextToTimePlaceholder: "Np. 1d to 86400" }, license: { title: "Ustaw licencję", textContent: "Jeśli chcesz korzystać z płatnych funkcji, skontaktuj się z support@corifeus.com, aby uzyskać licencję. Cena: Pro 400 HUF/miesiąc (€1/miesiąc) lub 4 000 HUF/rok (€10/rok), Enterprise 1 200 HUF/miesiąc (€3/miesiąc) lub 12 000 HUF/rok (€30/rok). Cena roczna to 10x ceny miesięcznej. Z 27% VAT łącznie: Pro 500 HUF/miesiąc (€1,27/miesiąc) lub 5 100 HUF/rok (€12,70/rok), Enterprise 1 500 HUF/miesiąc (€3,81/miesiąc) lub 15 200 HUF/rok (€38,10/rok). Weryfikacja licencji wymaga dostępu do internetu. Domyślna licencja obejmuje 5 miejsc. Jeśli potrzebujesz więcej miejsc, skontaktuj się z nami pod adresem support@corifeus.com.", placeholder: "Klucz licencyjny" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiuj", downloadBuffer: "Pobierz dane binarne", setBuffer: "Prześlij dane binarne", exportKeys: "Eksportuj klucze", exportAllKeys: (opts) => `Eksportuj wszystkie ${opts.count} kluczy`, exportSearchResults: (opts) => `Eksportuj ${opts.count} wyników`, importKeys: "Importuj klucze", saveWithFormatJson: "Zapisz z formatowaniem", formatJson: "Formatuj Json", wrap: "Zawijaj", unwrap: "Nie zawijaj", downloadJson: "Pobierz JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Język / Language", ok: "OK", addKey: "Dodaj do tego klucza", addKeyRoot: "Dodaj klucz główny", reloadKey: "Przeładuj klucz", reload: "Przeładuj", close: "Zamknij", commands: "Polecenia", view: "Widok", statistics: "Statystyki", refresh: "Odśwież", pause: "Pauza", resume: "Wznów", clear: "Wyczyść", rename: "Zmień nazwę", main: "Baza danych", cancel: "Anuluj", theme: "Motyw", github: "GitHub", githubRepo: "Repozytorium", githubRelease: "Wydania", githubChangelog: "Dziennik zmian", info: "Info", settings: "Ustawienia", connect: "Połącz", disconnect: "Rozłącz", overview: "Przegląd", console: "Konsola", noConnections: "Brak połączeń, dodaj połączenie w menu ustawień.", noConnectionsInSettings: "Brak połączeń, możesz dodać NOWE POŁĄCZENIE powyżej.", connectionAdd: "Nowe połączenie", addGroup: "Dodaj grupę", extend: "Rozwiń", collapse: "Zwiń", add: "Dodaj", edit: "Edytuj", save: "Zapisz", ttl: "Ustaw TTL", license: "Ustaw licencję", delete: "Usuń", remove: "Usuń", sure: "Pewne", testConnection: "Testuj połączenie", getKey: "Ładowanie klucza Redis i powiązanych danych ...", jsonViewShow: "Wyświetl JSON", jsonViewEditor: "Edytuj JSON", quickConsole: "Szybka Konsola" }, label: { id: { nodeId: 'ID węzła', id: "ID połączenia", info: "Jeśli nie chcesz zmieniać właściwości: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, wpisz ID połączenia w tych właściwościach, aby zachować wartości bez zmian. Jeśli chcesz zastosować tę samą logikę dla hasła węzła, wpisz ID węzła w haśle węzła." }, secureFeature: 'Jeśli widzisz wartość zaczynającą się od P3X, która wygląda tak samo, jest to funkcja bezpieczeństwa. Aby zmienić ustawienia, po prostu zastąp je pustymi lub innymi wartościami, a zostaną zapisane. Jeśli nie zmienisz ustawień, pozostaną takie, jakie są na serwerze.', ssh: { on: 'SSH włączony', off: 'SSH wyłączony', sshHost: 'Host SSH', sshPort: 'Port SSH', sshUsername: 'Nazwa użytkownika SSH', sshPassword: 'Hasło SSH', sshPrivateKey: 'Klucz prywatny SSH' }, isBuffer: opts => `[object ArrayBuffer] oznacza, że wartość jest danymi binarnymi lub wartość jest większa niż ${opts.maxValueAsBuffer}`, streamValue: `Pole i wartość strumienia są w jednej linii. Np.: pole1 wartość1 "pole 2" "wartość 2"`, streamTimestampId: `'*' oznacza automatycznie wygenerowany lub specyfikacja jako -`, unableToLoadKey: ({ key }) => { return `Nie można załadować tego klucza: ${key}. Możliwe, że klucz został usunięty. Dokładny błąd znajduje się w konsoli.`; }, bigJson: "Ten obiekt JSON ma ponad 10 kb, upewnij się, że wiesz co robisz, ponieważ niektóre funkcje mogą renderować się wolno.", addNode: "Dodaj węzeł", validateJson: "Waliduj JSON", reducedFunction: `Ograniczona funkcjonalność`, tooManyKeys: opts => { return `Dla pełnej funkcjonalności maksymalna dozwolona liczba kluczy to ${opts.maxLightKeysCount}. Ta baza danych ma więcej kluczy niż dozwolono, łącznie ${opts.count}. Sortowanie kluczy i dodatkowe informacje o drzewie są wyłączone. Wyszukiwanie odbywa się tylko po stronie serwera, a nie klienta.`; }, redisCommandNotFound: "Nie znaleziono pasującego polecenia Redis ...", treeKeyStore: `Sortowanie (porównanie naturalne) jest wykonywane na kliencie, czyli w przeglądarce, co oznacza karę wydajności dla dużych zbiorów, np. ponad 10 tys. kluczy; może to dodać trochę czasu do renderowania strony. W Redis nie ma sortowania kluczy, tylko w ten sposób.`, socketIoTimeout: options => { return `Socket.IO przekroczył limit czasu dla tego żądania (maks. ${options.timeout / 1000} sekund) ...`; }, resizerInfo: options => { return `Minimalna szerokość lewego lub prawego panelu to ${options.width}px`; }, jsonViewNotParsable: "Ta wartość nie jest parsowalna jako JSON ", ttlTitle: "Ustaw TTL w sekundach", passwordSecure: "Hasło może być puste, ale nadal będzie wyświetlać znaki; jest to funkcja bezpieczeństwa.", tlsWithoutCert: "Włącz TLS bez dodatkowego certyfikatu", tlsRejectUnauthorized: "Odrzuć nieautoryzowany certyfikat", tlsSecure: "Jeśli widzisz konfigurację TLS zaczynającą się od P3X lub wszystkie ustawienia TLS wyglądają tak samo, jest to funkcja bezpieczeństwa. Aby zmienić ustawienia, zastąp je pustymi lub innymi wartościami, a zostaną zapisane. Jeśli nie zmienisz ustawień TLS, pozostaną takie, jakie są na serwerze.", treeSeparatorEmpty: "Jeśli separator drzewa jest pusty, drzewo nie będzie miało zagnieżdżonych węzłów, tylko prostą listę", treeSeparatorEmptyNote: "Brak zagnieżdżonych węzłów, tylko prosta lista", welcomeConsole: "Witamy w konsoli Redis", welcomeConsoleInfo: "Historia za pomocą kursora W GÓRĘ lub W DÓŁ jest włączona", redisListIndexInfo: "Puste, aby dodać na końcu, -1, aby dodać na początku lub zapisać na wyświetlanej pozycji.", console: "Konsola", connectiondAdd: "Dodaj połączenie", connectiondEdit: "Edytuj połączenie", connectiondView: "Wyświetl połączenie", connections: "Połączenia", licenseInfo: "Licencja", licenseEditable: "Licencja edytowalna", licenseEditableYes: "Tak", licenseEditableNo: "Nie", licenseTerminalOnly: "Licencję można skonfigurować tylko z terminala serwera.", licenseTierPolicyTitle: "Polityka poziomów", licenseTierPolicyText: "

Free

tylko podstawowy Redis UI; bez tunelowania SSH, bez trybu Readonly connection mode, bez Cluster/Sentinel, bez Edit JSON/Upload binary/Download binary, bez ReJSON.
Cena: 0 HUF/miesiąc (€0/miesiąc).

Pro

Tunelowanie SSH, tryb Readonly connection mode (w tym --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Cena bazowa: 400 HUF/miesiąc (€1/miesiąc) lub 4 000 HUF/rok (€10/rok).
Łącznie z 27% VAT: 500 HUF/miesiąc (€1,27/miesiąc) lub 5 100 HUF/rok (€12,70/rok).

Enterprise

Tunelowanie SSH, Cluster i Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r również działa.
Cena bazowa: 1 200 HUF/miesiąc (€3/miesiąc) lub 12 000 HUF/rok (€30/rok).
Łącznie z 27% VAT: 1 500 HUF/miesiąc (€3,81/miesiąc) lub 15 200 HUF/rok (€38,10/rok).

Zasada roczna

Cena roczna to 10x ceny miesięcznej.

Miejsca

Domyślna licencja obejmuje 5 miejsc. Jeśli potrzebujesz więcej miejsc, skontaktuj się z nami: support@corifeus.com.

Wersja próbna Enterprise

10 dni za darmo dla każdego z prawdziwym adresem e-mail (nie testowym).

Dane do faktury w e-mailu

Imię i nazwisko, E-mail do rozliczeń, Kod kraju, Kod pocztowy, Miasto, Adres, NIP (opcjonalnie).

Płatność

Płatność PayPal jest dostępna tylko w HUF (forint); po wysłaniu pieniędzy na https://paypal.me/corifeus wyślę Ci fakturę. Wszystkie płatności są bezzwrotne.

VAT

VAT jest doliczany do ceny (27% na Węgrzech).

Kontakt

Jeśli chcesz się przywitać lub masz pytanie, napisz na support@corifeus.com.

Język

Komunikacja dotycząca faktur i licencji odbywa się w języku angielskim. Waluta faktury to HUF.

Uwaga

Weryfikacja licencji wymaga dostępu do internetu.", licenseState: "Stan", licenseStateActive: "Aktywna", licenseStateInactive: "Nieaktywna", licenseStateNoLicense: "Brak licencji", licenseKeyMasked: "Zapisany klucz", licenseTier: "Poziom", licenseValid: "Ważna", licenseStatus: "Status licencji", licenseReason: "Powód", licenseCheckedAt: "Sprawdzono", licenseStartsAt: "Rozpoczyna się", licenseExpiresAt: "Wygasa", licenseDaysLeft: "Pozostałe dni", licenseMaxDevices: "Maks. urządzenia", licenseActiveDevices: "Aktywne urządzenia", licenseActiveDevicesInfo: "Jeśli urządzenie nie jest już używane, jego miejsce jest automatycznie zwalniane po 75 minutach.", licenseCustomerEmail: "E-mail klienta", licenseFeatures: "Funkcje", licenseFeaturesEmpty: "Brak dodatkowych funkcji", licenseFeatureReadonlyMode: "Tryb połączenia tylko do odczytu", licenseFeatureReadonlyConnectionsFlag: "Połączenia tylko do odczytu (--readonly-connections/-r)", licenseFeatureSsh: "Tunelowanie SSH", licenseFeatureCluster: "Połączenia Cluster", licenseFeatureSentinel: "Połączenia Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Sortowanie kluczy włączone", off: "Sortowanie kluczy wyłączone" }, cluster: { on: "Cluster włączony", off: "Cluster wyłączony" }, sentinel: { on: "Sentinel włączony", off: "Sentinel wyłączony", name: "Nazwa Sentinel" }, readonly: { on: "Tylko do odczytu włączony", off: "Tylko do odczytu wyłączony" }, proSshOnly: "SSH jest dostępny w Pro lub Enterprise.", proReadonlyOnly: "Tryb połączenia tylko do odczytu jest dostępny w Pro lub Enterprise.", enterpriseClusterSentinelOnly: "Cluster i Sentinel są dostępne tylko w Enterprise.", theme: { light: "Jasny", dark: "Ciemny enterprise", darkNeu: "Ciemny", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Połączono: ${opts.name}`; }, tree: "Drzewo", askAuth: "Żądaj autoryzacji", keyboardShortcuts: "Skróty klawiaturowe", about: "O programie", supportedLanguages: "Obsługiwane języki", version: "Wersja", redisVersion: "Wersja Redis", modules: "Moduły", shortcutRefresh: "Odśwież", shortcutSearch: "Fokus na wyszukiwanie", shortcutNewKey: "Nowy klucz", shortcutDisconnect: "Rozłącz", themeAuto: "Automatyczny (system)", shortcutCommandPalette: "Paleta poleceń", commandPalette: "Paleta poleceń", noResults: "Brak wyników", redisCommandsReference: "Polecenia Redis", ungrouped: "Bez grupy", grouped: "Pogrupowane", connectFirst: "Najpierw połącz się z serwerem Redis", searchLanguage: "Szukaj języka...", exportProgress: "Eksportowanie kluczy...", importProgress: "Importowanie kluczy...", importPreview: "Podgląd", importOverwrite: "Nadpisz", importSkip: "Pomiń", importConflict: "Jeśli klucz już istnieje:", noKeysToExport: "Brak kluczy do eksportu", time: "Czas", loading: "Ładowanie...", autoRefresh: "Auto", exportSearchHint: "Eksportowane są tylko klucze pasujące do bieżącego wyszukiwania", importSearchHint: "Import dotyczy całej bazy danych, nie tylko wyników wyszukiwania", importNoKeys: "Nie znaleziono kluczy w pliku", }, status: { dataCopied: "Dane są w schowku", licenseSaved: "Licencja zapisana", exportDone: "Eksport zakończony", indexCreated: "Indeks utworzony", indexDropped: "Indeks usunięty", importDone: (opts) => `Import zakończony: ${opts.created} utworzono, ${opts.skipped} pominięto, ${opts.errors} błędów`, nodeRemoved: "Węzeł usunięty", keyIsNotExisting: "Ten klucz mógł zostać usunięty lub wygasnąć.", keyCount: opts => { if (opts.keyCount === 0) { return "Brak kluczy"; } else if (opts.keyCount === 1) { return "1 klucz"; } else { return `${opts.keyCount} kluczy`; } }, treeExpandAll: "Rozwiń wszystkie gałęzie drzewa. Ta operacja może być kosztowna i może zająć trochę czasu ...", noRedisKeys: "Brak kluczy w tej bazie danych.", redisConnected: "Połączenie z Redis nawiązane pomyślnie", reloadingDataInfo: "Ponowne ładowanie informacji o danych Redis", added: "Dodano", saved: "Zaktualizowano", cancelled: "Anulowano", deleted: "Usunięto", savedRedis: "Dane Redis zostały zapisane", redisDisconnected: opts => { return `Bieżące połączenie napotkało błąd: ${opts.error.message}`; }, dbChanged: opts => { return `Indeks bazy danych ustawiony na ${opts.db}. `; }, treeDeleted: opts => { return `Klucz drzewa został usunięty (${opts.key}).`; }, deletedKey: opts => { return `Klucz został usunięty (${opts.key}).`; }, renamedKey: "Nazwa tego klucza została zmieniona", ttlChanged: "TTL tego klucza został zmieniony", notInteger: "Ta wartość nie jest liczbą całkowitą", persisted: "Ten klucz jest zachowany na zawsze", set: "Klucz został ustawiony/dodany" }, code: { "delete-connection": "To połączenie zostało usunięte, dlatego zostałeś rozłączony z tą instancją Redis.", "save-connection": "To połączenie zostało zmienione, dlatego zostałeś rozłączony z tą instancją Redis. Możesz ponownie się połączyć.", "readonly-connections": "Dodawanie/zapisywanie/usuwanie połączeń jest w trybie tylko do odczytu!", "readonly-connection-mode": "To połączenie jest w trybie tylko do odczytu!", "list-out-of-bounds": "Indeks tej listy jest poza zakresem", "donation-ware-feature": "Ta funkcja jest dostępna w wersji z donatą.", "feature-pro-readonly-required": "Tryb połączenia tylko do odczytu wymaga licencji Pro lub Enterprise.", "feature-pro-ssh-required": "Tunelowanie SSH wymaga licencji Pro lub Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster i Sentinel wymagają licencji Enterprise.", "feature-pro-json-binary-required": "Edit JSON, Upload binary i Download binary wymagają licencji Pro lub Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Wymagana autoryzacja: uwierzytelnij się za pomocą HTTP Basic Auth i przeładuj stronę.", "auto-connection-failed": "Możliwe, że połączenie zostało usunięte i automatyczne połączenie nie powiodło się z tego powodu.", invalid_console_command: "To polecenie nie działa przez GUI." }, licenseReason: { LICENSE_VALID: "Licencja jest ważna", LICENSE_INVALID: "Licencja jest nieprawidłowa", LICENSE_MISSING: "Nie ustawiono klucza licencyjnego", LICENSE_DISABLED: "Licencja jest wyłączona w konfiguracji serwera", LICENSE_NOT_FOUND: "Licencja nie została znaleziona", LICENSE_EXPIRED: "Licencja wygasła", LICENSE_CLEARED: "Klucz licencyjny został wyczyszczony", LICENSE_MAX_DEVICES_REACHED: "Osiągnięto maksymalną liczbę miejsc na urządzenia", PRODUCT_MISMATCH: "Produkt licencji nie pasuje" }, licenseStatusValue: { active: "Aktywna", deleted: "Usunięta", all: "Wszystkie", expired: "Wygasła", missing: "Brak", inactive: "Nieaktywna" }, form: { error: { required: "Wymagane", port: "Port musi być w zakresie 1-65535", invalid: "Formularz jest nieprawidłowy" }, connection: { label: { name: "Nazwa", group: "Grupa", host: "Nazwa hosta", port: "Port", password: "Hasło", username: "Nazwa użytkownika" } }, treeSettings: { maxValueDisplay: "Maksymalna długość wyświetlanej wartości", maxValueDisplayInfo: "Jeśli ustawiono na 0, wyświetlane są pełne wartości. Jeśli większe niż 0, obcinane do tej długości. Jeśli -1: dla stringów wartość jest ukryta do edycji; dla innych typów wyświetlana jest pełna zawartość.", maxKeys: "Maksymalna liczba kluczy", maxKeysInfo: "Aby GUI się nie zawieszał, ograniczamy maksymalną liczbę kluczy.", keyCount: () => { return `Liczba kluczy: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Użyj animacji", noAnimation: "Bez animacji", jsonFormatTwoSpace: "Formatuj JSON z 2 spacjami", jsonFormatFourSpace: "Formatuj JSON z 4 spacjami", formName: "Ustawienia Redis", searchModeClient: "Tryb wyszukiwania po stronie klienta", searchModeServer: "Tryb wyszukiwania po stronie serwera", searchModeStartsWith: "Wyszukiwanie zaczynające się od", searchModeIncludes: "Wyszukiwanie zawierające" }, field: { treeSeparator: "Separator drzewa", treeSeparatorSelector: "Selektor separatora drzewa", page: "Liczba stron drzewa", keyPageCount: "Liczba stron kluczy", keysSort: "Sortuj klucze", searchMode: "Tryb wyszukiwania", searchModeStartsWith: "Wyszukiwanie zaczyna się od / zawiera" }, error: { keyPageCount: "Liczba stron kluczy musi być liczbą całkowitą w zakresie 5 - 100", page: "Liczba stron musi być liczbą całkowitą w zakresie 10 - 5000", maxValueDisplay: "Maksymalna wyświetlana wartość musi być liczbą całkowitą w zakresie od -1 do 32768", maxKeys: "Maksymalna liczba kluczy musi być liczbą całkowitą w zakresie od 100 do 100000" } }, key: { label: { formName: { add: "Dodaj nowy klucz Redis", edit: "Edytuj klucz Redis", append: "Dodaj do istniejącego klucza Redis" } }, field: { streamTimestamp: "Znacznik czasu", key: "Klucz", type: "Typ", index: "Indeks", hashKey: "Klucz hash", score: "Wynik", value: "Wartość" }, error: { streamTimestamp: "Znacznik czasu jest wymagany, w formacie Redis lub jako *", key: "Klucz musi mieć co najmniej jeden znak", hashKey: "Klucz tabeli hash musi mieć co najmniej jeden znak", score: "Wynik zbioru posortowanego jest wymagany", value: "Wartość jest wymagana" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Szukaj", index: "Indeks", query: "Zapytanie", results: "Wyniki", noIndex: "Nie znaleziono indeksów", createIndex: "Utwórz indeks", dropIndex: "Usuń indeks", indexInfo: "Info o indeksie", indexName: "Nazwa indeksu", prefix: "Prefiks klucza (opcjonalnie)", fieldName: "Nazwa pola", }, monitor: { title: "Monitorowanie", memory: "Pamięć", opsPerSec: "Operacji/s", clients: "Klienci", blocked: "Zablokowane", hitsMisses: "Trafienia", networkIo: "Sieć I/O", slowLog: "Wolny log", totalCommands: "Łącznie", expired: "Wygasłe", evicted: "Usunięte", clientList: "Lista klientów", topKeys: "Największe klucze według pamięci", killClient: "Zabij klienta", clientKilled: "Klient zabity", confirmKillClient: "Czy na pewno chcesz zakończyć tego klienta?", noKeys: "Brak kluczy", noClients: "Brak klientów", }, overview: { noConnected: "Brak połączenia z Redis.", overviewClients: "Wyświetl połączonych według liczby klientów", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klientów`; } }, key: { label: { key: "Klucz", encoding: "Kodowanie", length: "Rozmiar", ttl: "TTL", ttlTitle: "Time To Live", type: "Typ", ttlNotExpire: "nie wygasa", lengthString: "bajtów", lengthItem: "elementów", actions: "Akcje" }, list: { table: { index: "Indeks", value: "Wartość" } }, hash: { table: { hashkey: "Klucz hash", value: "Wartość" } }, set: { table: { value: "Element" } }, zset: { table: { value: "Element", score: "Wynik" } }, stream: { table: { timestamp: "ID znacznika czasu", field: "Pole", value: "Wartość" } } }, treeControls: { settings: "Ustawienia drzewa", expandAll: "Rozwiń wszystko", collapseAll: "Zwiń wszystko", search: { search: "Szukaj w kluczach", clear: "Wyczyść bieżące wyszukiwanie", placeholderClient: "Szukaj po stronie klienta", placeholderServer: "Szukaj po stronie serwera", info: "Wyszukiwanie po stronie klienta oznacza dopasowanie tekstu w polu wyszukiwania. Wyszukiwanie po stronie serwera oznacza wyszukiwanie we wzorcach kluczy jako *{szukany-tekst}*. Dla dużych zbiorów lepiej jest używać wyszukiwania po stronie serwera. Dla mniejszych zbiorów lepiej jest używać wyszukiwania po stronie klienta." + ` Jeśli liczba kluczy przekracza ${p3xr.settings.maxLightKeysCount}, możesz wyszukiwać tylko po stronie serwera.`, largeSetInfo: "W dużym zbiorze wyszukiwanie po stronie klienta jest wyłączone, więc obecnie możliwe jest tylko wyszukiwanie po stronie serwera.", infoDetails: "Aby dowiedzieć się, jak działa wyszukiwanie, sprawdź ustawienia" }, pager: { next: "Następna", prev: "Poprzednia", first: "Pierwsza", last: "Ostatnia" } } }, time: { loading: "Ładowanie...", years: "lat", months: "miesięcy", days: "dni", year: "rok", month: "miesiąc", day: "dzień" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/pt-BR/000077500000000000000000000000001517666434100142775ustar00rootroot00000000000000src/strings/pt-BR/strings.js000066400000000000000000000710661517666434100163400ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licença liberada", invalid_license: "Licença inválida", license_max_devices_reached: "Máximo de assentos de dispositivos atingido", license_readonly: "A licença só pode ser alterada no terminal do servidor.", server_error: "Erro no servidor, tente novamente" }, title: { donate: "Doe", jsonRecursive: "Expandindo todas as folhas", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Você pode escolher uma conexão Redis para conectar no menu inferior esquerdo.", statistics: "Estatísticas", error: "Erro", connectingRedis: "Conectando a Redis ...", socketioConnectError: "Erro Socket.IO", db: "DB", server: "Servidor", clients: "Clientes", memory: "Memória", persistence: "Persistência", stats: "Estatísticas", replication: "Replicação", cpu: "CPU", cluster: "Cluster", modules: "Módulos", errorstats: "Estatísticas de erros", commandstats: "Estatísticas de comandos", latencystats: "Estatísticas de latência", keysizes: "Tamanhos de chaves", threads: "Threads", }, confirm: { dropIndex: "Tem certeza de que deseja excluir este índice?", uploadBuffer: "Tem certeza de que deseja fazer upload desses dados binários?", uploadBufferDone: "Os dados binários são carregados", uploadBufferDoneAndSave: "Os dados binários são carregados e salvos no servidor", title: "Confirmar", alert: "Alerta", info: "Informações", deleteListItem: "Tem certeza de que deseja excluir este item da lista?", deleteHashKey: "Tem certeza de que deseja excluir este item de chave hash?", deleteStreamTimestamp: "Tem certeza de que deseja excluir o carimbo de data/hora deste stream?", deleteSetMember: "Tem certeza de que deseja excluir este membro do conjunto?", deleteZSetMember: "Tem certeza de que deseja excluir este membro do conjunto classificado?", deleteConnection: "Confirmar", deleteConnectionText: "Tem certeza de que deseja excluir esta conexão Redis?", deleteNode: "Tem certeza de que deseja excluir este nó Redis?", deleteAllKeys: opts => { return `Exclua esta árvore e todas as suas chaves (${opts.key})?`; }, socketioConnectError: "Socket.IO não consegue se conectar ao servidor, você pode recarregar e tentar resolver o erro de conexão sozinho, o cliente não sabe como resolvê-lo sozinho.", socketioAuthRequired: "É necessária autorização Socket.IO. Autentique com HTTP Basic Auth (nome de usuário/senha) e recarregue.", deleteKey: "Tem certeza de que deseja excluir esta chave?", rename: { title: "Tem certeza de que deseja renomear esta chave?", textContent: "Esta ação renomeia a chave permanentemente.", placeholder: "A chave Redis (obrigatória)" }, ttl: { title: "Tem certeza de que deseja alterar o TTL desta chave?", textContent: "Alterar TTL atualiza o tempo de vida desta chave. Deixe em branco para manter esta chave para sempre.", placeholder: "O TTL da chave Redis (inteiro ou vazio)", placeholderPlaceholder: "Vazio significa que persiste para sempre; caso contrário, insira um número inteiro.", convertTextToTime: "Converter texto em hora", convertTextToTimePlaceholder: "Por exemplo. 1d será 86400" }, license: { title: "Definir licença", textContent: "Se você quiser usar recursos pagos, entre em contato com support@corifeus.com para solicitar uma licença. O preço é Pro 400 HUF/mês (€ 1/mês) ou 4.000 HUF/ano (€ 10/ano) e Enterprise 1.200 HUF/mês (€ 3/mês) ou 12.000 HUF/ano (€ 30/ano). Anualmente é 10x mensal. Com 27% de VAT, os totais são Pro 500 HUF/mês (€ 1,27/mês) ou 5.100 HUF/ano (€ 12,70/ano), Enterprise 1.500 HUF/mês (€ 3,81/mês) ou 15.200 HUF/ano (38,10€/ano). A validação da licença requer acesso à Internet. A licença padrão inclui 5 licenças. Se precisar de mais assentos, entre em contato conosco pelo telefone support@corifeus.com.", placeholder: "Chave de licença" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copiar", downloadBuffer: "Baixar binário", setBuffer: "Carregar binário", exportKeys: "Exportar chaves", exportAllKeys: (opts) => `Exportar todas as ${opts.count} chaves`, exportSearchResults: (opts) => `Exportar ${opts.count} resultados`, importKeys: "Importar chaves", saveWithFormatJson: "Salvar com formato", formatJson: "Formatar JSON", wrap: "Embrulhar", unwrap: "Desembrulhar", downloadJson: "Baixar JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Idioma", ok: "OK", addKey: "Adicionar a esta chave", addKeyRoot: "Adicione uma chave raiz", reloadKey: "Chave de recarga", reload: "Recarregar", close: "Fechar", commands: "Comandos", view: "Ver", statistics: "Estatísticas", refresh: "Atualizar", pause: "Pausar", resume: "Retomar", clear: "Limpar", rename: "Renomear", main: "Banco de dados", cancel: "Cancelar", theme: "Tema", github: "GitHub", githubRepo: "Repositório", githubRelease: "Lançamentos", githubChangelog: "Registro de alterações", info: "Info", settings: "Configurações", connect: "Conectar", disconnect: "Desconectar", overview: "Visão geral", console: "Consola", noConnections: "Sem conexões, adicione uma conexão no menu de configurações.", noConnectionsInSettings: "Sem conexões, você pode adicionar uma NOVA CONEXÃO acima.", connectionAdd: "Nova conexão", addGroup: "Adicionar grupo", extend: "Estender", collapse: "Recolher", add: "Adicionar", edit: "Editar", save: "Salvar", ttl: "Definir TTL", license: "Definir licença", delete: "Excluir", remove: "Remover", sure: "Claro", testConnection: "Conexão de teste", getKey: "Carregando chave Redis e dados associados...", jsonViewShow: "Exibir JSON", jsonViewEditor: "Editar JSON", quickConsole: "Consola rápida", }, label: { id: { nodeId: "ID do nó", id: "ID de conexão", info: "Se você não deseja alterar as propriedades de: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, insira o ID da conexão nessas propriedades para manter os valores das propriedades intactos. Se desejar a mesma lógica na senha do nó, insira o ID do nó na senha do nó." }, secureFeature: "Se você vir um valor que começa com P3X e tem a mesma aparência, é um recurso seguro. Para alterar as configurações, basta substituir essas configurações por vazias ou qualquer outra coisa e elas serão salvas. Se você não alterar as configurações, elas serão mantidas como estão no servidor.", ssh: { on: "SSH ativado", off: "SSH desativado", sshHost: "Anfitrião SSH", sshPort: "Porta SSH", sshUsername: "Nome de usuário SSH", sshPassword: "Senha SSH", sshPrivateKey: "Chave privada SSH" }, isBuffer: opts => `[objeto ArrayBuffer] significa que o valor são dados binários ou o valor é maior que ${opts.maxValueAsBuffer}`, streamValue: `O campo e o valor do fluxo são oneliner. Ex.: campo1 valor1 "campo 2" "valor 2"`, streamTimestampId: `'*' significa gerado automaticamente ou a especificação como -`, unableToLoadKey: ({ key }) => { return `Não foi possível carregar esta chave: ${key}. Possível, a chave foi excluída. O erro exato está no console.`; }, bigJson: "Este objeto JSON tem mais de 10 kb, portanto, saiba o que está fazendo, pois algumas funções podem ter renderização lenta.", addNode: "Adicionar nó", validateJson: "Validar JSON", reducedFunction: `Funcionalidade reduzida`, tooManyKeys: opts => { return `Para o máximo de funções permitidas, o total de teclas é ${opts.maxLightKeysCount} contar. Este banco de dados tem mais do que as chaves permitidas no total ${opts.count}. A classificação de chaves e as informações adicionais da árvore sofisticada estão desativadas. A pesquisa está acontecendo apenas no servidor, e não na pesquisa do cliente.`; }, redisCommandNotFound: "Nenhuma correspondência de comando Redis encontrada...", treeKeyStore: `A classificação (comparação natural) é executada no cliente, também conhecido como navegador, o que significa que há uma penalidade para conjuntos grandes, como mais de 10 mil chaves, podendo adicionar um pouco de tempo à renderização da página. Não há classificação de chave em Redis, apenas assim.`, socketIoTimeout: options => { return `O Socket.IO expirou para esta solicitação (máx. ${options.timeout / 1000} segundos) ...`; }, resizerInfo: options => { return `A largura mínima do painel esquerdo ou direito é ${options.width}pixels`; }, jsonViewNotParsable: "Este valor não é analisável JSON ", ttlTitle: "Defina TTL em segundos", passwordSecure: "A senha pode estar vazia, mas ainda assim mostrará caracteres, este é um recurso de segurança.", tlsWithoutCert: "Habilite TLS sem certificado adicional", tlsRejectUnauthorized: "Rejeitar certificado não autorizado", tlsSecure: "Se você vir uma configuração TLS que começa com P3X ou todas as configurações TLS parecem iguais, é um recurso seguro. Para alterar as configurações, basta substituir essas configurações por vazias ou qualquer outra coisa e elas serão salvas. Se você não alterar as configurações de TLS, as configurações serão mantidas como estão no servidor.", treeSeparatorEmpty: "Se o separador da árvore estiver vazio, a árvore não terá nós aninhados, apenas uma lista pura", treeSeparatorEmptyNote: "Sem nós aninhados, apenas uma lista pura", welcomeConsole: "Bem-vindo ao console Redis", welcomeConsoleInfo: "O histórico do cursor PARA CIMA ou PARA BAIXO está ativado", redisListIndexInfo: "Vazio para anexar, -1 para preceder ou salvar na posição mostrada.", console: "Consola", connectiondAdd: "Adicionar conexão", connectiondEdit: "Editar conexão", connectiondView: "Ver conexão", connections: "Conexões", licenseInfo: "Licença", licenseEditable: "Licença editável", licenseEditableYes: "Sim", licenseEditableNo: "Não", licenseTerminalOnly: "A licença só pode ser configurada no terminal do servidor.", licenseTierPolicyTitle: "Política de nível", licenseTierPolicyText: "

Free

core Redis Somente UI; sem tunelamento SSH, sem modo de conexão somente leitura, sem Cluster/Sentinel, sem edição JSON/Upload binário/Download binário, sem ReJSON.
Preço: 0 HUF/mês (€0/mês).

Pro

SSH tunelamento, modo de conexão somente leitura (incluindo --readonly-connections/-r), Editar JSON, Carregar binário, Baixar binário, ReJSON.
Preço base: 400 HUF/mês (€1/mês) ou 4.000 HUF/ano (€10/ano).
Total com 27% VAT: 500 HUF/mês (€1,27/mês) ou 5.100 HUF/ano (€ 12,70/ano).

Enterprise

SSH tunelamento, Cluster e Sentinel, mais Editar JSON, Carregar binário, Baixar binário, ReJSON; --readonly-connections/-r também funciona.
Preço base: 1.200 HUF/mês (€3/mês) ou 12.000 HUF/ano (30€/ano).
Total com 27% VAT: 1.500 HUF/mês (3,81€/mês) ou 15.200 HUF/ano (€ 38,10/ano).

Regra anual

O preço anual é 10x o mensal preço.

Assentos

A licença padrão inclui 5 assentos. Se precisar de mais assentos, entre em contato conosco em support@corifeus.com.

Teste empresarial

10 dias grátis para qualquer pessoa com um endereço de e-mail real existente (sem teste email).

Informações de faturamento no e-mail

Nome, e-mail de cobrança, código do país, código postal, cidade, endereço, VAT ID (opcional).

Pagamento

PayPal o pagamento está disponível apenas em HUF (forint); após enviar o dinheiro @ https://paypal.me/corifeus enviarei uma fatura. Todos os pagamentos não são reembolsáveis.

VAT

VAT é adicionado ao preço (27% em Hungria).

Contato

Se você quiser dizer oi ou tiver alguma dúvida, entre em contato support@corifeus.com.

Idioma

A comunicação por e-mail de fatura e licença é feita em inglês. A moeda da fatura é HUF.

Nota

A validação da licença requer acesso à Internet.", licenseState: "Estado", licenseStateActive: "Ativo", licenseStateInactive: "Inativo", licenseStateNoLicense: "Sem licença", licenseKeyMasked: "Chave salva", licenseTier: "Nível", licenseValid: "Válido", licenseStatus: "Status da licença", licenseReason: "Razão", licenseCheckedAt: "Verificado em", licenseStartsAt: "Começa às", licenseExpiresAt: "Expira em", licenseDaysLeft: "Dias restantes", licenseMaxDevices: "Máximo de dispositivos", licenseActiveDevices: "Dispositivos ativos", licenseActiveDevicesInfo: "Se um dispositivo não for mais utilizado, seu assento será liberado automaticamente após 75 minutos.", licenseCustomerEmail: "E-mail do cliente", licenseFeatures: "Recursos", licenseFeaturesEmpty: "Sem recursos extras", licenseFeatureReadonlyMode: "Modo de conexão somente leitura", licenseFeatureReadonlyConnectionsFlag: "Conexões somente leitura (--readonly-connections/-r)", licenseFeatureSsh: "Tunelamento SSH", licenseFeatureCluster: "Conexões Cluster", licenseFeatureSentinel: "Conexões Sentinel", licenseFeatureReJSON: "ReJSON (tipo de dados JSON)", keysSort: { on: "Classificação de chaves ativada", off: "Classificação de chaves desativada" }, cluster: { on: "Cluster ativado", off: "Cluster desativado" }, sentinel: { on: "Sentinel ativado", off: "Sentinel desativado", name: "Nome Sentinel" }, readonly: { on: "Somente leitura ativado", off: "Somente leitura desativado" }, proSshOnly: "SSH está disponível em Pro ou Enterprise.", proReadonlyOnly: "O modo de conexão somente leitura está disponível no Pro ou Enterprise.", enterpriseClusterSentinelOnly: "Cluster e Sentinel estão disponíveis apenas no Enterprise.", theme: { light: "Luz", dark: "Empresa obscura", darkNeu: "Escuro", darkoBluo: "Azul escuro", enterprise: "Empresa", redis: "Redis", matrix: "Matriz" }, connected: opts => { return `Conectado: ${opts.name}`; }, tree: "Árvore", askAuth: "Peça autorização", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Módulos", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Desconectar", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Comandos Redis", ungrouped: "Sem grupo", grouped: "Grouped", connectFirst: "Conecte-se primeiro a um servidor Redis", searchLanguage: "Pesquisar idioma...", exportProgress: "Exportando chaves...", importProgress: "Importando chaves...", importPreview: "Visualização", importOverwrite: "Sobrescrever", importSkip: "Pular", importConflict: "Se a chave já existir:", noKeysToExport: "Nenhuma chave para exportar", time: "Tempo", loading: "Carregando...", autoRefresh: "Auto", exportSearchHint: "Exportando apenas chaves que correspondem à pesquisa atual", importSearchHint: "A importação se aplica a todo o banco de dados, não apenas aos resultados da pesquisa", importNoKeys: "Nenhuma chave encontrada no arquivo", }, status: { dataCopied: "Os dados estão na área de transferência", licenseSaved: "Licença salva", exportDone: "Exportação concluída", indexCreated: "Índice criado", indexDropped: "Índice excluído", importDone: (opts) => `Importação concluída: ${opts.created} criados, ${opts.skipped} pulados, ${opts.errors} erros`, nodeRemoved: "Nó removido", keyIsNotExisting: "Esta chave pode ter sido excluída ou expirada.", keyCount: opts => { if (opts.keyCount === 0) { return "Sem chave"; } else if (opts.keyCount === 1) { return "1 chave"; } else { return `${opts.keyCount} chaves`; } }, treeExpandAll: "Expanda todas as folhas das árvores. Esta operação pode ser cara e levar tempo ...", noRedisKeys: "Não há chaves neste banco de dados.", redisConnected: "Redis conectado com sucesso", reloadingDataInfo: "Recarregando informações de dados Redis", added: "Adicionado", saved: "Atualizado", cancelled: "Cancelado", deleted: "Excluído", savedRedis: "Os dados Redis são salvos", redisDisconnected: opts => { return `A conexão atual apresentou um erro: ${opts.error.message}`; }, dbChanged: opts => { return `O índice db definido como ${opts.db}. `; }, treeDeleted: opts => { return `A chave da árvore foi excluída (${opts.key}).`; }, deletedKey: opts => { return `A chave foi excluída (${opts.key}).`; }, renamedKey: "Esta chave foi renomeada", ttlChanged: "O TTL desta chave foi alterado", notInteger: "Esta entrada não é um número inteiro", persisted: "Esta chave persiste para sempre", set: "A chave está definida/adicionada" }, code: { "delete-connection": "Esta conexão foi excluída, portanto você está desconectado desta instância Redis.", "save-connection": "Esta conexão foi alterada, portanto você está desconectado desta instância Redis. Você pode se reconectar.", "readonly-connections": "As conexões adicionar/salvar/excluir são somente leitura!", "readonly-connection-mode": "Esta conexão está no modo somente leitura!", "list-out-of-bounds": "Este índice de lista está fora dos limites", "donation-ware-feature": "Esse recurso está presente na versão de doação.", "feature-pro-readonly-required": "O modo de conexão somente leitura requer licença Pro ou Enterprise.", "feature-pro-ssh-required": "O tunelamento SSH requer licença Pro ou Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster e Sentinel requerem licença empresarial.", "feature-pro-json-binary-required": "Editar JSON, Upload binário e Download binário requerem licença Pro ou Enterprise.", "feature-pro-rejson-required": "ReJSON (tipo de dados JSON) requer licença Pro ou Enterprise.", "invalid-json-value": "O valor não é válido JSON.", "http_auth_required": "Autorização necessária: autentique com HTTP Basic Auth e recarregue.", "auto-connection-failed": "Possível, a conexão foi removida e a conexão automática falhou por causa disso.", invalid_console_command: "Este comando não está funcionando por meio de GUI." }, licenseReason: { LICENSE_VALID: "A licença é válida", LICENSE_INVALID: "A licença é inválida", LICENSE_MISSING: "Nenhuma chave de licença está definida", LICENSE_DISABLED: "A licença está desativada na configuração do servidor", LICENSE_NOT_FOUND: "A licença não foi encontrada", LICENSE_EXPIRED: "A licença expirou", LICENSE_CLEARED: "A chave de licença foi apagada", LICENSE_MAX_DEVICES_REACHED: "Máximo de assentos de dispositivos atingido", PRODUCT_MISMATCH: "O produto licenciado não corresponde" }, licenseStatusValue: { active: "Ativo", deleted: "Excluído", all: "Todos", expired: "Expirado", missing: "Desaparecido", inactive: "Inativo" }, form: { error: { required: "Obrigatório", port: "A porta está entre 1-65535", invalid: "O formulário é inválido" }, connection: { label: { name: "Nome", group: "Group", host: "Nome do host", port: "Porto", password: "Senha", username: "Nome de usuário" } }, treeSettings: { maxValueDisplay: "Comprimento máximo da string de exibição do valor", maxValueDisplayInfo: "Se definido como 0, mostra valores completos. Se for maior que 0, trunque para esse comprimento. Se -1: para strings, oculta o valor até editar; para outros tipos, mostre o conteúdo completo.", maxKeys: "A contagem máxima de chaves", maxKeysInfo: "Para que GUI não trave, limitamos a contagem máxima de chaves.", keyCount: () => { return `Número de chaves: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Usar animação", noAnimation: "Sem animação", jsonFormatTwoSpace: "Formate JSON com 2 espaços", jsonFormatFourSpace: "Formate JSON com 4 espaços", formName: "Configurações Redis", searchModeClient: "Modo de pesquisa de cliente", searchModeServer: "Modo de pesquisa de servidor", searchModeStartsWith: "Pesquisa com começa com modo", searchModeIncludes: "Pesquisa inclui modo" }, field: { treeSeparator: "Separador de árvores", treeSeparatorSelector: "Seletor de separador de árvore", page: "Contagem de paginação em árvore", keyPageCount: "Contagem de paginação principal", keysSort: "Classifique as chaves", searchMode: "Modo de pesquisa", searchModeStartsWith: "A pesquisa começa com/inclui" }, error: { keyPageCount: "A contagem de páginas chave deve ser um número inteiro entre 5 e 100", page: "A contagem de páginas deve ser um número inteiro entre 10 e 5.000", maxValueDisplay: "O valor máximo de exibição deve ser um número inteiro entre -1 e 32768", maxKeys: "O valor máximo de contagem de chaves deve ser um número inteiro entre 100 e 100.000" } }, key: { label: { formName: { add: "Adicionar nova chave Redis", edit: "Editar chave Redis", append: "Adicionar à chave Redis existente" } }, field: { streamTimestamp: "Carimbo de data e hora", key: "Chave", type: "Tipo", index: "Índice", hashKey: "Chave hash", score: "Pontuação", value: "Valor" }, error: { streamTimestamp: "O carimbo de data/hora é obrigatório, no formato Redis ou como *", key: "A chave é, pelo menos, um caractere", hashKey: "A chave da tabela hash tem pelo menos um caractere", score: "A pontuação do conjunto classificado é obrigatória", value: "O valor é obrigatório" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Pesquisar", index: "Índice", query: "Consulta", results: "Resultados", noIndex: "Nenhum índice encontrado", createIndex: "Criar índice", dropIndex: "Excluir índice", indexInfo: "Info do índice", indexName: "Nome do índice", prefix: "Prefixo de chave (opcional)", fieldName: "Nome do campo", }, monitor: { title: "Monitoramento", memory: "Memória", opsPerSec: "Ops/seg", clients: "Clientes", blocked: "Bloqueados", hitsMisses: "Taxa de acerto", networkIo: "Rede I/O", slowLog: "Log lento", totalCommands: "Total", expired: "Expirados", evicted: "Despejados", clientList: "Lista de clientes", topKeys: "Maiores chaves por memória", killClient: "Encerrar cliente", clientKilled: "Cliente encerrado", confirmKillClient: "Tem certeza de que deseja encerrar este cliente?", noKeys: "Sem chaves", noClients: "Sem clientes", }, overview: { noConnected: "Não há conexão com Redis.", overviewClients: "Liste os conectados pela contagem de clientes", connectedCount: opt => { if (opt.length === 1) { return "1 cliente"; } return `${opt.length} clientes`; } }, key: { label: { key: "Chave", encoding: "Codificação", length: "Tamanho", ttl: "TTL", ttlTitle: "Hora de viver", type: "Tipo", ttlNotExpire: "não expira", lengthString: "bytes", lengthItem: "itens", actions: "Ações" }, list: { table: { index: "Índice", value: "Valor" } }, hash: { table: { hashkey: "Chave de hash", value: "Valor" } }, set: { table: { value: "Membro" } }, zset: { table: { value: "Membro", score: "Pontuação" } }, stream: { table: { timestamp: "ID do carimbo de data/hora", field: "Campo", value: "Valor" } } }, treeControls: { settings: "Configurações de árvore", expandAll: "Expandir tudo", collapseAll: "Recolher tudo", search: { search: "Pesquise nas chaves", clear: "Limpe a pesquisa atual para definir como vazia", placeholderClient: "Pesquisar no lado do cliente", placeholderServer: "Lado do servidor de pesquisa", info: "A pesquisa do lado do cliente significa que ela corresponde ao texto na entrada de pesquisa. A pesquisa no lado do servidor significa que é como pesquisar nos padrões de chaves como *{search-text}*. Para conjuntos de pesquisa grandes, é melhor usar a pesquisa no lado do servidor. Para conjuntos de pesquisa menores, é melhor usar o modo de pesquisa do lado do cliente." + ` Se a contagem de chaves acabar ${p3xr.settings.maxLightKeysCount}, você só poderá pesquisar no lado do servidor.`, largeSetInfo: "Em um conjunto grande, a pesquisa do lado do cliente está desativada. então, no momento, apenas a pesquisa no lado do servidor é possível.", infoDetails: "Para saber como funciona a pesquisa, verifique as configurações" }, pager: { next: "Próximo", prev: "Anterior", first: "Primeiro", last: "Último" } } }, time: { loading: "Carregando...", years: "anos", months: "meses", days: "dias", year: "ano", month: "mês", day: "dia" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/pt-PT/000077500000000000000000000000001517666434100143175ustar00rootroot00000000000000src/strings/pt-PT/strings.js000066400000000000000000000706071517666434100163600ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licença eliminada", invalid_license: "Licença inválida", license_max_devices_reached: "Número máximo de lugares de dispositivos atingido", license_readonly: "A licença só pode ser alterada a partir do terminal do servidor.", server_error: "Erro do servidor, por favor tente novamente" }, title: { donate: "Doar", jsonRecursive: "A expandir todas as folhas", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Pode escolher uma ligação Redis a partir do menu inferior esquerdo.", statistics: "Estatísticas", error: "Erro", connectingRedis: "A ligar ao Redis ...", socketioConnectError: "Erro Socket.IO", db: "DB", server: "Servidor", clients: "Clientes", memory: "Memória", persistence: "Persistência", stats: "Estatísticas", replication: "Replicação", cpu: "CPU", cluster: "Cluster", modules: "Módulos", errorstats: "Estatísticas de erros", commandstats: "Estatísticas de comandos", latencystats: "Estatísticas de latência", keysizes: "Tamanhos de chaves", threads: "Threads", }, confirm: { dropIndex: "Tem a certeza de que deseja eliminar este índice?", uploadBuffer: "Tem a certeza de que quer carregar estes dados binários?", uploadBufferDone: "Os dados binários foram carregados", uploadBufferDoneAndSave: "Os dados binários foram carregados e guardados no servidor", title: "Confirmar", alert: "Alerta", info: "Informação", deleteListItem: "Tem a certeza de que quer eliminar este item da lista?", deleteHashKey: "Tem a certeza de que quer eliminar esta chave hash?", deleteStreamTimestamp: "Tem a certeza de que quer eliminar este carimbo temporal do stream?", deleteSetMember: "Tem a certeza de que quer eliminar este membro do conjunto?", deleteZSetMember: "Tem a certeza de que quer eliminar este membro do conjunto ordenado?", deleteConnection: "Confirmar", deleteConnectionText: "Tem a certeza de que quer eliminar esta ligação Redis?", deleteNode: "Tem a certeza de que quer eliminar este nó Redis?", deleteAllKeys: opts => { return `Eliminar esta árvore e todas as suas chaves (${opts.key})?`; }, socketioConnectError: "O Socket.IO não consegue ligar-se ao servidor. Pode recarregar e tentar resolver o erro de ligação; o cliente não sabe como resolvê-lo sozinho.", socketioAuthRequired: "É necessária autorização Socket.IO. Autentique-se com HTTP Basic Auth (nome de utilizador/palavra-passe) e recarregue.", deleteKey: "Tem a certeza de que quer eliminar esta chave?", rename: { title: "Tem a certeza de que quer renomear esta chave?", textContent: "Esta ação renomeia a chave permanentemente.", placeholder: "A chave Redis (obrigatório)" }, ttl: { title: "Tem a certeza de que quer alterar o TTL desta chave?", textContent: "Alterar o TTL atualiza o tempo de vida desta chave. Deixe vazio para manter a chave para sempre.", placeholder: "O TTL da chave Redis (inteiro ou vazio)", placeholderPlaceholder: "Vazio significa que persiste para sempre; caso contrário, introduza um número inteiro.", convertTextToTime: "Converter texto em tempo", convertTextToTimePlaceholder: "Ex.: 1d será 86400" }, license: { title: "Definir licença", textContent: "Se pretende utilizar funcionalidades pagas, contacte support@corifeus.com para solicitar uma licença. O preço é Pro 400 HUF/mês (€1/mês) ou 4.000 HUF/ano (€10/ano), e Enterprise 1.200 HUF/mês (€3/mês) ou 12.000 HUF/ano (€30/ano). O preço anual é 10x o mensal. Com 27% IVA, os totais são Pro 500 HUF/mês (€1,27/mês) ou 5.100 HUF/ano (€12,70/ano), Enterprise 1.500 HUF/mês (€3,81/mês) ou 15.200 HUF/ano (€38,10/ano). A validação da licença requer acesso à internet. A licença predefinida inclui 5 lugares. Se precisar de mais lugares, contacte-nos em support@corifeus.com.", placeholder: "Chave de licença" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copiar", downloadBuffer: "Descarregar binário", setBuffer: "Carregar binário", exportKeys: "Exportar chaves", exportAllKeys: (opts) => `Exportar todas as ${opts.count} chaves`, exportSearchResults: (opts) => `Exportar ${opts.count} resultados`, importKeys: "Importar chaves", saveWithFormatJson: "Guardar com formatação", formatJson: "Formatar Json", wrap: "Quebrar linha", unwrap: "Não quebrar linha", downloadJson: "Descarregar JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Idioma / Language", ok: "OK", addKey: "Adicionar a esta chave", addKeyRoot: "Adicionar uma chave raiz", reloadKey: "Recarregar chave", reload: "Recarregar", close: "Fechar", commands: "Comandos", view: "Vista", statistics: "Estatísticas", refresh: "Atualizar", pause: "Pausar", resume: "Retomar", clear: "Limpar", rename: "Renomear", main: "Base de dados", cancel: "Cancelar", theme: "Tema", github: "GitHub", githubRepo: "Repositório", githubRelease: "Versões", githubChangelog: "Registo de alterações", info: "Info", settings: "Definições", connect: "Ligar", disconnect: "Desligar", overview: "Visão geral", console: "Consola", noConnections: "Sem ligações, adicione uma ligação no menu de definições.", noConnectionsInSettings: "Sem ligações, pode adicionar uma NOVA LIGAÇÃO acima.", connectionAdd: "Nova ligação", addGroup: "Adicionar grupo", extend: "Expandir", collapse: "Recolher", add: "Adicionar", edit: "Editar", save: "Guardar", ttl: "Definir TTL", license: "Definir licença", delete: "Eliminar", remove: "Remover", sure: "Sim", testConnection: "Testar ligação", getKey: "A carregar a chave Redis e dados associados ...", jsonViewShow: "Mostrar JSON", jsonViewEditor: "Editar JSON", quickConsole: "Consola Rápida" }, label: { id: { nodeId: 'ID do nó', id: "ID da ligação", info: "Se não pretende alterar as propriedades: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, introduza o ID da ligação nessas propriedades para manter os valores intactos. Se pretende a mesma lógica para a palavra-passe do nó, introduza o ID do nó na palavra-passe do nó." }, secureFeature: 'Se vir um valor que começa com P3X e parece igual, é uma funcionalidade de segurança. Para alterar as definições, basta substituí-las por valores vazios ou por outra coisa e serão guardadas. Se não alterar as definições, estas mantêm-se como estão no servidor.', ssh: { on: 'SSH ativado', off: 'SSH desativado', sshHost: 'Anfitrião SSH', sshPort: 'Porta SSH', sshUsername: 'Nome de utilizador SSH', sshPassword: 'Palavra-passe SSH', sshPrivateKey: 'Chave privada SSH' }, isBuffer: opts => `[object ArrayBuffer] significa que o valor é dados binários ou o valor é maior que ${opts.maxValueAsBuffer}`, streamValue: `O campo e valor do stream estão numa única linha. Ex.: campo1 valor1 "campo 2" "valor 2"`, streamTimestampId: `'*' significa gerado automaticamente ou a especificação como -`, unableToLoadKey: ({ key }) => { return `Não foi possível carregar esta chave: ${key}. É possível que a chave tenha sido eliminada. O erro exato está na consola.`; }, bigJson: "Este objeto JSON tem mais de 10 kb, por isso certifique-se de que sabe o que está a fazer, pois algumas funções podem renderizar lentamente.", addNode: "Adicionar nó", validateJson: "Validar JSON", reducedFunction: `Funcionalidade reduzida`, tooManyKeys: opts => { return `Para a funcionalidade completa, o máximo de chaves permitido é ${opts.maxLightKeysCount}. Esta base de dados tem mais chaves do que o permitido, num total de ${opts.count}. A ordenação de chaves e a informação adicional da árvore estão desativadas. A pesquisa ocorre apenas no servidor em vez do cliente.`; }, redisCommandNotFound: "Nenhum comando Redis correspondente encontrado ...", treeKeyStore: `A ordenação (comparação natural) é executada no cliente, ou seja, no navegador, o que significa que tem uma penalização para conjuntos grandes, como mais de 10k chaves; pode adicionar algum tempo à renderização da página. Não existe ordenação de chaves no Redis, apenas desta forma.`, socketIoTimeout: options => { return `O Socket.IO excedeu o tempo limite para este pedido (máx. ${options.timeout / 1000} segundos) ...`; }, resizerInfo: options => { return `A largura mínima do painel esquerdo ou direito é ${options.width}px`; }, jsonViewNotParsable: "Este valor não é analisável como JSON ", ttlTitle: "Definir o TTL em segundos", passwordSecure: "A palavra-passe pode estar vazia, mas ainda assim mostrará caracteres; é uma funcionalidade de segurança.", tlsWithoutCert: "Ativar TLS sem certificado adicional", tlsRejectUnauthorized: "Rejeitar certificado não autorizado", tlsSecure: "Se vir uma configuração TLS que começa com P3X ou se todas as definições TLS parecem iguais, é uma funcionalidade de segurança. Para alterar as definições, substitua-as por valores vazios ou por outra coisa e serão guardadas. Se não alterar as definições TLS, estas mantêm-se como estão no servidor.", treeSeparatorEmpty: "Se o separador da árvore estiver vazio, a árvore não terá nós aninhados, apenas uma lista simples", treeSeparatorEmptyNote: "Sem nós aninhados, apenas uma lista simples", welcomeConsole: "Bem-vindo à Consola Redis", welcomeConsoleInfo: "Histórico com cursor CIMA ou BAIXO está ativado", redisListIndexInfo: "Vazio para acrescentar, -1 para inserir no início ou guardar na posição apresentada.", console: "Consola", connectiondAdd: "Adicionar ligação", connectiondEdit: "Editar ligação", connectiondView: "Ver ligação", connections: "Ligações", licenseInfo: "Licença", licenseEditable: "Licença editável", licenseEditableYes: "Sim", licenseEditableNo: "Não", licenseTerminalOnly: "A licença só pode ser configurada a partir do terminal do servidor.", licenseTierPolicyTitle: "Política de níveis", licenseTierPolicyText: "

Free

apenas Redis UI básico; sem tunelamento SSH, sem modo Readonly connection mode, sem Cluster/Sentinel, sem Edit JSON/Upload binary/Download binary, sem ReJSON.
Preço: 0 HUF/mês (€0/mês).

Pro

Tunelamento SSH, modo Readonly connection mode (incluindo --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Preço base: 400 HUF/mês (€1/mês) ou 4.000 HUF/ano (€10/ano).
Total com 27% IVA: 500 HUF/mês (€1,27/mês) ou 5.100 HUF/ano (€12,70/ano).

Enterprise

Tunelamento SSH, Cluster e Sentinel, mais Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r também funciona.
Preço base: 1.200 HUF/mês (€3/mês) ou 12.000 HUF/ano (€30/ano).
Total com 27% IVA: 1.500 HUF/mês (€3,81/mês) ou 15.200 HUF/ano (€38,10/ano).

Regra anual

O preço anual é 10x o preço mensal.

Lugares

A licença predefinida inclui 5 lugares. Se precisar de mais lugares, contacte-nos em support@corifeus.com.

Teste Enterprise

10 dias grátis para qualquer pessoa com um endereço de e-mail real existente (não de teste).

Dados de faturação por e-mail

Nome, E-mail de faturação, Código do país, Código postal, Cidade, Morada, NIF (opcional).

Pagamento

O pagamento por PayPal está disponível apenas em HUF (forint); após enviar o dinheiro em https://paypal.me/corifeus enviarei a fatura. Todos os pagamentos não são reembolsáveis.

IVA

O IVA é adicionado ao preço (27% na Hungria).

Contacto

Se quiser dizer olá ou tiver uma pergunta, contacte support@corifeus.com.

Idioma

A comunicação de faturas e licenças por e-mail é em inglês. A moeda da fatura é HUF.

Nota

A validação da licença requer acesso à internet.", licenseState: "Estado", licenseStateActive: "Ativa", licenseStateInactive: "Inativa", licenseStateNoLicense: "Sem licença", licenseKeyMasked: "Chave guardada", licenseTier: "Nível", licenseValid: "Válida", licenseStatus: "Estado da licença", licenseReason: "Motivo", licenseCheckedAt: "Verificada em", licenseStartsAt: "Início em", licenseExpiresAt: "Expira em", licenseDaysLeft: "Dias restantes", licenseMaxDevices: "Máx. dispositivos", licenseActiveDevices: "Dispositivos ativos", licenseActiveDevicesInfo: "Se um dispositivo já não for utilizado, o seu lugar é libertado automaticamente após 75 minutos.", licenseCustomerEmail: "E-mail do cliente", licenseFeatures: "Funcionalidades", licenseFeaturesEmpty: "Sem funcionalidades extra", licenseFeatureReadonlyMode: "Modo de ligação só de leitura", licenseFeatureReadonlyConnectionsFlag: "Ligações só de leitura (--readonly-connections/-r)", licenseFeatureSsh: "Tunelamento SSH", licenseFeatureCluster: "Ligações Cluster", licenseFeatureSentinel: "Ligações Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Ordenação de chaves ativada", off: "Ordenação de chaves desativada" }, cluster: { on: "Cluster ativado", off: "Cluster desativado" }, sentinel: { on: "Sentinel ativado", off: "Sentinel desativado", name: "Nome do Sentinel" }, readonly: { on: "Só de leitura ativado", off: "Só de leitura desativado" }, proSshOnly: "SSH está disponível em Pro ou Enterprise.", proReadonlyOnly: "O modo de ligação só de leitura está disponível em Pro ou Enterprise.", enterpriseClusterSentinelOnly: "Cluster e Sentinel estão disponíveis apenas em Enterprise.", theme: { light: "Claro", dark: "Escuro enterprise", darkNeu: "Escuro", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Ligado: ${opts.name}`; }, tree: "Árvore", askAuth: "Pedir autorização", keyboardShortcuts: "Atalhos de teclado", about: "Sobre", supportedLanguages: "Idiomas suportados", version: "Versão", redisVersion: "Versão do Redis", modules: "Módulos", shortcutRefresh: "Atualizar", shortcutSearch: "Focar pesquisa", shortcutNewKey: "Nova chave", shortcutDisconnect: "Desligar", themeAuto: "Automático (sistema)", shortcutCommandPalette: "Paleta de comandos", commandPalette: "Paleta de comandos", noResults: "Sem resultados", redisCommandsReference: "Comandos Redis", ungrouped: "Sem grupo", grouped: "Agrupados", connectFirst: "Ligue-se primeiro a um servidor Redis", searchLanguage: "Pesquisar idioma...", exportProgress: "A exportar chaves...", importProgress: "A importar chaves...", importPreview: "Pré-visualização", importOverwrite: "Substituir", importSkip: "Ignorar", importConflict: "Se a chave já existir:", noKeysToExport: "Sem chaves para exportar", time: "Tempo", loading: "A carregar...", autoRefresh: "Auto", exportSearchHint: "Exportando apenas chaves que correspondem à pesquisa atual", importSearchHint: "A importação aplica-se a toda a base de dados, não apenas aos resultados da pesquisa", importNoKeys: "Nenhuma chave encontrada no ficheiro", }, status: { dataCopied: "Os dados estão na área de transferência", licenseSaved: "Licença guardada", exportDone: "Exportação concluída", indexCreated: "Índice criado", indexDropped: "Índice eliminado", importDone: (opts) => `Importação concluída: ${opts.created} criados, ${opts.skipped} ignorados, ${opts.errors} erros`, nodeRemoved: "Nó removido", keyIsNotExisting: "Esta chave pode ter sido eliminada ou expirada.", keyCount: opts => { if (opts.keyCount === 0) { return "Sem chaves"; } else if (opts.keyCount === 1) { return "1 chave"; } else { return `${opts.keyCount} chaves`; } }, treeExpandAll: "Expandir todas as folhas da árvore. Esta operação pode ser dispendiosa e demorar algum tempo ...", noRedisKeys: "Não existem chaves nesta base de dados.", redisConnected: "Ligação ao Redis estabelecida com sucesso", reloadingDataInfo: "A recarregar informações de dados Redis", added: "Adicionado", saved: "Atualizado", cancelled: "Cancelado", deleted: "Eliminado", savedRedis: "Os dados Redis foram guardados", redisDisconnected: opts => { return `A ligação atual teve um erro: ${opts.error.message}`; }, dbChanged: opts => { return `O índice da base de dados foi definido para ${opts.db}. `; }, treeDeleted: opts => { return `A chave da árvore foi eliminada (${opts.key}).`; }, deletedKey: opts => { return `A chave foi eliminada (${opts.key}).`; }, renamedKey: "Esta chave foi renomeada", ttlChanged: "O TTL desta chave foi alterado", notInteger: "Esta entrada não é um número inteiro", persisted: "Esta chave é persistida para sempre", set: "A chave foi definida/adicionada" }, code: { "delete-connection": "Esta ligação foi eliminada, por isso foi desligado desta instância Redis.", "save-connection": "Esta ligação foi alterada, por isso foi desligado desta instância Redis. Pode voltar a ligar-se.", "readonly-connections": "Adicionar/guardar/eliminar ligações é só de leitura!", "readonly-connection-mode": "Esta ligação é só de leitura!", "list-out-of-bounds": "O índice desta lista está fora dos limites", "donation-ware-feature": "Esta funcionalidade está presente na versão com donativo.", "feature-pro-readonly-required": "O modo de ligação só de leitura requer licença Pro ou Enterprise.", "feature-pro-ssh-required": "O tunelamento SSH requer licença Pro ou Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster e Sentinel requerem licença Enterprise.", "feature-pro-json-binary-required": "Edit JSON, Upload binary e Download binary requerem licença Pro ou Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorização necessária: autentique-se com HTTP Basic Auth e recarregue.", "auto-connection-failed": "É possível que a ligação tenha sido removida e a ligação automática tenha falhado por esse motivo.", invalid_console_command: "Este comando não funciona através da GUI." }, licenseReason: { LICENSE_VALID: "A licença é válida", LICENSE_INVALID: "A licença é inválida", LICENSE_MISSING: "Nenhuma chave de licença definida", LICENSE_DISABLED: "A licença está desativada na configuração do servidor", LICENSE_NOT_FOUND: "Licença não encontrada", LICENSE_EXPIRED: "A licença expirou", LICENSE_CLEARED: "A chave de licença foi eliminada", LICENSE_MAX_DEVICES_REACHED: "Número máximo de lugares de dispositivos atingido", PRODUCT_MISMATCH: "O produto da licença não corresponde" }, licenseStatusValue: { active: "Ativa", deleted: "Eliminada", all: "Todas", expired: "Expirada", missing: "Ausente", inactive: "Inativa" }, form: { error: { required: "Obrigatório", port: "A porta deve estar entre 1-65535", invalid: "O formulário é inválido" }, connection: { label: { name: "Nome", group: "Grupo", host: "Nome do anfitrião", port: "Porta", password: "Palavra-passe", username: "Nome de utilizador" } }, treeSettings: { maxValueDisplay: "Comprimento máximo de exibição do valor", maxValueDisplayInfo: "Se definido como 0, mostra valores completos. Se maior que 0, trunca para este comprimento. Se -1: para strings, oculta o valor até editar; para outros tipos, mostra o conteúdo completo.", maxKeys: "Número máximo de chaves", maxKeysInfo: "Para que a GUI não falhe, limitamos o número máximo de chaves.", keyCount: () => { return `Número de chaves: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Usar animação", noAnimation: "Sem animação", jsonFormatTwoSpace: "Formatar JSON com 2 espaços", jsonFormatFourSpace: "Formatar JSON com 4 espaços", formName: "Definições Redis", searchModeClient: "Modo de pesquisa no cliente", searchModeServer: "Modo de pesquisa no servidor", searchModeStartsWith: "Pesquisa com modo começa com", searchModeIncludes: "Pesquisa com modo inclui" }, field: { treeSeparator: "Separador da árvore", treeSeparatorSelector: "Seletor do separador da árvore", page: "Contagem de páginas da árvore", keyPageCount: "Contagem de páginas de chaves", keysSort: "Ordenar as chaves", searchMode: "Modo de pesquisa", searchModeStartsWith: "Pesquisa começa com / inclui" }, error: { keyPageCount: "A contagem de páginas de chaves deve ser um inteiro entre 5 - 100", page: "A contagem de páginas deve ser um inteiro entre 10 - 5000", maxValueDisplay: "O valor máximo de exibição deve ser um inteiro entre -1 e 32768", maxKeys: "O número máximo de chaves deve ser um inteiro entre 100 e 100000" } }, key: { label: { formName: { add: "Adicionar nova chave Redis", edit: "Editar chave Redis", append: "Adicionar a chave Redis existente" } }, field: { streamTimestamp: "Carimbo temporal", key: "Chave", type: "Tipo", index: "Índice", hashKey: "Chave hash", score: "Pontuação", value: "Valor" }, error: { streamTimestamp: "O carimbo temporal é obrigatório, em formato Redis ou como *", key: "A chave deve ter pelo menos um carácter", hashKey: "A chave da tabela hash deve ter pelo menos um carácter", score: "A pontuação do conjunto ordenado é obrigatória", value: "O valor é obrigatório" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Pesquisar", index: "Índice", query: "Consulta", results: "Resultados", noIndex: "Nenhum índice encontrado", createIndex: "Criar índice", dropIndex: "Eliminar índice", indexInfo: "Info do índice", indexName: "Nome do índice", prefix: "Prefixo de chave (opcional)", fieldName: "Nome do campo", }, monitor: { title: "Monitorização", memory: "Memória", opsPerSec: "Ops/seg", clients: "Clientes", blocked: "Bloqueados", hitsMisses: "Taxa de acerto", networkIo: "Rede I/O", slowLog: "Log lento", totalCommands: "Total", expired: "Expirados", evicted: "Despejados", clientList: "Lista de clientes", topKeys: "Maiores chaves por memória", killClient: "Encerrar cliente", clientKilled: "Cliente encerrado", confirmKillClient: "Tem a certeza de que deseja encerrar este cliente?", noKeys: "Sem chaves", noClients: "Sem clientes", }, overview: { noConnected: "Não existe ligação ao Redis.", overviewClients: "Listar os ligados pelo número de clientes", connectedCount: opt => { if (opt.length === 1) { return "1 cliente"; } return `${opt.length} clientes`; } }, key: { label: { key: "Chave", encoding: "Codificação", length: "Tamanho", ttl: "TTL", ttlTitle: "Time To Live", type: "Tipo", ttlNotExpire: "não expira", lengthString: "bytes", lengthItem: "itens", actions: "Ações" }, list: { table: { index: "Índice", value: "Valor" } }, hash: { table: { hashkey: "Chave hash", value: "Valor" } }, set: { table: { value: "Membro" } }, zset: { table: { value: "Membro", score: "Pontuação" } }, stream: { table: { timestamp: "ID do carimbo temporal", field: "Campo", value: "Valor" } } }, treeControls: { settings: "Definições da árvore", expandAll: "Expandir tudo", collapseAll: "Recolher tudo", search: { search: "Pesquisar nas chaves", clear: "Limpar pesquisa atual", placeholderClient: "Pesquisar no lado do cliente", placeholderServer: "Pesquisar no lado do servidor", info: "A pesquisa no lado do cliente significa que corresponde ao texto no campo de pesquisa. A pesquisa no lado do servidor significa que pesquisa nos padrões de chaves como *{texto-de-pesquisa}*. Para conjuntos de pesquisa grandes, é melhor usar a pesquisa no lado do servidor. Para conjuntos de pesquisa mais pequenos, é melhor usar a pesquisa no lado do cliente." + ` Se a contagem de chaves for superior a ${p3xr.settings.maxLightKeysCount}, só pode pesquisar no lado do servidor.`, largeSetInfo: "Num conjunto grande, a pesquisa no lado do cliente está desativada, portanto atualmente só é possível pesquisar no lado do servidor.", infoDetails: "Para saber como a pesquisa funciona, verifique as definições" }, pager: { next: "Seguinte", prev: "Anterior", first: "Primeiro", last: "Último" } } }, time: { loading: "A carregar...", years: "anos", months: "meses", days: "dias", year: "ano", month: "mês", day: "dia" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ro/000077500000000000000000000000001517666434100137735ustar00rootroot00000000000000src/strings/ro/strings.js000066400000000000000000000700671517666434100160340ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licenta a fost stearsa", invalid_license: "Licenta invalida", license_max_devices_reached: "Numarul maxim de locuri pentru dispozitive a fost atins", license_readonly: "Licenta poate fi modificata doar din terminalul serverului.", server_error: "Eroare de server, va rugam incercati din nou" }, title: { donate: "Donatie", jsonRecursive: "Se extind toate ramurile", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Puteti alege o conexiune Redis din meniul din stanga jos.", statistics: "Statistici", error: "Eroare", connectingRedis: "Conectare la Redis ...", socketioConnectError: "Eroare Socket.IO", db: "BD", server: "Server", clients: "Clienti", memory: "Memorie", persistence: "Persistenta", stats: "Statistici", replication: "Replicare", cpu: "CPU", cluster: "Cluster", modules: "Module", errorstats: "Statistici erori", commandstats: "Statistici comenzi", latencystats: "Statistici latență", keysizes: "Dimensiuni chei", threads: "Fire de execuție", }, confirm: { dropIndex: "Sunteți sigur că doriți să ștergeți acest index?", uploadBuffer: "Sunteti sigur ca doriti sa incarcati aceste date binare?", uploadBufferDone: "Datele binare au fost incarcate", uploadBufferDoneAndSave: "Datele binare au fost incarcate si salvate pe server", title: "Confirmare", alert: "Alerta", info: "Informatii", deleteListItem: "Sunteti sigur ca doriti sa stergeti acest element din lista?", deleteHashKey: "Sunteti sigur ca doriti sa stergeti aceasta cheie hash?", deleteStreamTimestamp: "Sunteti sigur ca doriti sa stergeti aceasta marca temporala din stream?", deleteSetMember: "Sunteti sigur ca doriti sa stergeti acest membru al setului?", deleteZSetMember: "Sunteti sigur ca doriti sa stergeti acest membru al setului sortat?", deleteConnection: "Confirmare", deleteConnectionText: "Sunteti sigur ca doriti sa stergeti aceasta conexiune Redis?", deleteNode: "Sunteti sigur ca doriti sa stergeti acest nod Redis?", deleteAllKeys: opts => { return `Stergeti acest arbore si toate cheile sale (${opts.key})?`; }, socketioConnectError: "Socket.IO nu se poate conecta la server, puteti reincarca si incerca sa rezolvati eroarea de conexiune singur, clientul nu stie cum sa o rezolve.", socketioAuthRequired: "Autorizarea Socket.IO este necesara. Va rugam autentificati-va cu HTTP Basic Auth (utilizator/parola) si reincarcati.", deleteKey: "Sunteti sigur ca doriti sa stergeti aceasta cheie?", rename: { title: "Sunteti sigur ca doriti sa redenumiti aceasta cheie?", textContent: "Aceasta actiune redenumeste cheia permanent.", placeholder: "Cheia Redis (obligatoriu)" }, ttl: { title: "Sunteti sigur ca doriti sa schimbati TTL-ul acestei chei?", textContent: "Schimbarea TTL-ului actualizeaza durata de viata a acestei chei. Lasati gol pentru a pastra cheia pentru totdeauna.", placeholder: "TTL-ul cheii Redis (numar intreg sau gol)", placeholderPlaceholder: "Gol inseamna ca persista pentru totdeauna; altfel introduceti un numar intreg.", convertTextToTime: "Convertire text in timp", convertTextToTimePlaceholder: "Ex. 1d va fi 86400" }, license: { title: "Setare licenta", textContent: "Daca doriti sa utilizati functii platite, va rugam contactati support@corifeus.com pentru a solicita o licenta. Pretul este Pro 400 HUF/luna (\u20AC1/luna) sau 4.000 HUF/an (\u20AC10/an), si Enterprise 1.200 HUF/luna (\u20AC3/luna) sau 12.000 HUF/an (\u20AC30/an). Anual este 10x lunar. Cu TVA 27%, totalurile sunt Pro 500 HUF/luna (\u20AC1,27/luna) sau 5.100 HUF/an (\u20AC12,70/an), Enterprise 1.500 HUF/luna (\u20AC3,81/luna) sau 15.200 HUF/an (\u20AC38,10/an). Validarea licentei necesita acces la internet. Licenta implicita include 5 locuri. Daca aveti nevoie de mai multe locuri, contactati-ne la support@corifeus.com.", placeholder: "Cheie de licenta" } }, language: { bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 / Bulgarian", cs: "\u010Ce\u0161tina / Czech", de: "Deutsch / German", el: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC / Greek", en: "English", es: "Espa\u00F1ol / Spanish", fr: "Fran\u00E7ais / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "\u65E5\u672C\u8A9E / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Portugu\u00EAs / Portuguese", ro: "Rom\u00E2n\u0103 / Romanian", ru: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 / Russian", sk: "Sloven\u010Dina / Slovak", sr: "\u0421\u0440\u043F\u0441\u043A\u0438 / Serbian", sv: "Svenska / Swedish", tr: "T\u00FCrk\u00E7e / Turkish", uk: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 / Ukrainian", zn: "\u4E2D\u6587 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Copiere", downloadBuffer: "Descarcare binar", setBuffer: "Incarcare binar", exportKeys: "Exportă chei", exportAllKeys: (opts) => `Exportă toate cele ${opts.count} chei`, exportSearchResults: (opts) => `Exportă ${opts.count} rezultate`, importKeys: "Importă chei", saveWithFormatJson: "Salvare cu formatare", formatJson: "Formatare Json", wrap: "Încadrare", unwrap: "Fără încadrare", downloadJson: "Descarcă JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Limba / Language", ok: "OK", addKey: "Adaugare la aceasta cheie", addKeyRoot: "Adaugare cheie principala", reloadKey: "Reincarcare cheie", reload: "Reincarcare", close: "Inchide", commands: "Comenzi", view: "Vizualizare", statistics: "Statistici", refresh: "Actualizeaza", pause: "Pauză", resume: "Reluare", clear: "Curata", rename: "Redenumire", main: "Bază de date", cancel: "Anulare", theme: "Tema", github: "GitHub", githubRepo: "Depozit", githubRelease: "Versiuni", githubChangelog: "Jurnal de modificari", info: "Info", settings: "Setari", connect: "Conectare", disconnect: "Deconectare", overview: "Prezentare generala", console: "Consola", noConnections: "Nu exista conexiuni, adaugati o conexiune in meniul de setari.", noConnectionsInSettings: "Nu exista conexiuni, puteti adauga o CONEXIUNE NOUA mai sus.", connectionAdd: "Conexiune noua", addGroup: "Adăugare grup", extend: "Extindere", collapse: "Restrangere", add: "Adaugare", edit: "Editare", save: "Salvare", ttl: "Setare TTL", license: "Setare licenta", delete: "Stergere", remove: "Eliminare", sure: "Sigur", testConnection: "Testare conexiune", getKey: "Se incarca cheia Redis si datele asociate ...", jsonViewShow: "Afisare JSON", jsonViewEditor: "Editare JSON", quickConsole: "Consola rapida" }, label: { id: { nodeId: 'ID nod', id: "ID conexiune", info: "Daca nu doriti sa schimbati proprietatile: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, va rugam introduceti ID-ul conexiunii in acele proprietati pentru a pastra valorile intacte. Daca doriti aceeasi logica pentru parola nodului, introduceti ID-ul nodului in parola nodului." }, secureFeature: 'Daca vedeti o valoare care incepe cu P3X si arata la fel, este o functie de securitate. Pentru a schimba setarile, inlocuiti aceste setari cu gol sau altceva si vor fi salvate. Daca nu schimbati setarile, acestea vor ramane asa cum sunt pe server.', ssh: { on: 'SSH activat', off: 'SSH dezactivat', sshHost: 'Gazda SSH', sshPort: 'Port SSH', sshUsername: 'Utilizator SSH', sshPassword: 'Parola SSH', sshPrivateKey: 'Cheie privata SSH' }, isBuffer: opts => `[object ArrayBuffer] inseamna ca valoarea este date binare sau valoarea este mai mare decat ${opts.maxValueAsBuffer}`, streamValue: `Campul si valoarea stream-ului sunt pe o singura linie. Ex.: camp1 valoare1 "camp 2" "valoare 2"`, streamTimestampId: `'*' inseamna generat automat sau specificatia ca -`, unableToLoadKey: ({ key }) => { return `Nu s-a putut incarca aceasta cheie: ${key}. Posibil, cheia a fost stearsa. Eroarea exacta este in consola.`; }, bigJson: "Acest obiect JSON depaseste 10 kb, asigurati-va ca stiti ce faceti, deoarece unele functii pot fi lente la randare.", addNode: "Adaugare nod", validateJson: "Validare JSON", reducedFunction: `Functionalitate redusa`, tooManyKeys: opts => { return `Pentru functiile complete maxime, numarul total de chei permis este ${opts.maxLightKeysCount}. Aceasta baza de date are mai mult decat cheile permise, totalul fiind ${opts.count}. Sortarea cheilor si informatiile suplimentare din arbore sunt dezactivate. Cautarea se face doar pe server in loc de cautarea pe client.`; }, redisCommandNotFound: "Nu s-a gasit nicio comanda Redis potrivita ...", treeKeyStore: `Sortarea (comparare naturala) se executa pe client (adica browserul), ceea ce inseamna ca are un cost pentru seturi mari, cum ar fi peste 10k chei, ar putea adauga putin timp la randarea paginii. Nu exista sortare de chei in Redis, doar in acest mod.`, socketIoTimeout: options => { return `Socket.IO a depasit limita de timp pentru aceasta cerere (maxim ${options.timeout / 1000} secunde) ...`; }, resizerInfo: options => { return `Latimea minima a panoului stang sau drept este ${options.width}px`; }, jsonViewNotParsable: "Aceasta valoare nu poate fi parsata ca JSON ", ttlTitle: "Setati TTL-ul in secunde", passwordSecure: "Parola ar putea fi goala, dar tot va afisa caractere, aceasta este o functie de securitate.", tlsWithoutCert: "Activare TLS fara certificat suplimentar", tlsRejectUnauthorized: "Respingere certificat neautorizat", tlsSecure: "Daca vedeti o configuratie TLS care incepe cu P3X sau toate setarile TLS arata la fel, este o functie de securitate. Pentru a schimba setarile, inlocuiti aceste setari cu gol sau altceva si vor fi salvate. Daca nu schimbati setarile TLS, acestea vor ramane asa cum sunt pe server.", treeSeparatorEmpty: "Daca separatorul de arbore este gol, arborele nu va avea noduri imbricate, ci doar o lista simpla", treeSeparatorEmptyNote: "Fara noduri imbricate, doar o lista simpla", welcomeConsole: "Bine ati venit in consola Redis", welcomeConsoleInfo: "Istoricul cu tastele SUS sau JOS este activat", redisListIndexInfo: "Gol pentru a adauga la sfarsit, -1 pentru a adauga la inceput sau salvati la pozitia afisata.", console: "Consola", connectiondAdd: "Adaugare conexiune", connectiondEdit: "Editare conexiune", connectiondView: "Vizualizare conexiune", connections: "Conexiuni", licenseInfo: "Licenta", licenseEditable: "Licenta editabila", licenseEditableYes: "Da", licenseEditableNo: "Nu", licenseTerminalOnly: "Licenta poate fi configurata doar din terminalul serverului.", licenseTierPolicyTitle: "Politica de niveluri", licenseTierPolicyText: "

Free

doar Redis UI de baza; fara tunelare SSH, fara mod conexiune Readonly, fara Cluster/Sentinel, fara Edit JSON/Upload binary/Download binary, fara ReJSON.
Pret: 0 HUF/luna (\u20AC0/luna).

Pro

tunelare SSH, mod conexiune Readonly (inclusiv --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Pret de baza: 400 HUF/luna (\u20AC1/luna) sau 4.000 HUF/an (\u20AC10/an).
Total cu TVA 27%: 500 HUF/luna (\u20AC1,27/luna) sau 5.100 HUF/an (\u20AC12,70/an).

Enterprise

tunelare SSH, Cluster si Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r functioneaza de asemenea.
Pret de baza: 1.200 HUF/luna (\u20AC3/luna) sau 12.000 HUF/an (\u20AC30/an).
Total cu TVA 27%: 1.500 HUF/luna (\u20AC3,81/luna) sau 15.200 HUF/an (\u20AC38,10/an).

Regula anuala

Pretul anual este de 10x pretul lunar.

Locuri

Licenta implicita include 5 locuri. Daca aveti nevoie de mai multe locuri, contactati-ne la support@corifeus.com.

Perioada de proba Enterprise

10 zile gratuit pentru oricine cu o adresa de email reala existenta (nu email de test).

Informatii de facturare prin e-mail

Nume, Email de facturare, Cod tara, Cod postal, Oras, Adresa, Cod TVA (optional).

Plata

Plata prin PayPal este disponibila doar in HUF (forint); dupa trimiterea banilor la https://paypal.me/corifeus va voi trimite o factura. Toate platile sunt nerambursabile.

TVA

TVA-ul este adaugat la pret (27% in Ungaria).

Contact

Daca doriti sa ne salutati sau aveti o intrebare, contactati support@corifeus.com.

Limba

Comunicarea privind factura si licenta se face in limba engleza. Moneda facturii este HUF.

Nota

Validarea licentei necesita acces la internet.", licenseState: "Stare", licenseStateActive: "Activa", licenseStateInactive: "Inactiva", licenseStateNoLicense: "Fara licenta", licenseKeyMasked: "Cheie salvata", licenseTier: "Nivel", licenseValid: "Valida", licenseStatus: "Starea licentei", licenseReason: "Motiv", licenseCheckedAt: "Verificata la", licenseStartsAt: "Incepe la", licenseExpiresAt: "Expira la", licenseDaysLeft: "Zile ramase", licenseMaxDevices: "Numar maxim de dispozitive", licenseActiveDevices: "Dispozitive active", licenseActiveDevicesInfo: "Daca un dispozitiv nu mai este utilizat, locul sau este eliberat automat dupa 75 de minute.", licenseCustomerEmail: "Email client", licenseFeatures: "Functionalitati", licenseFeaturesEmpty: "Fara functionalitati suplimentare", licenseFeatureReadonlyMode: "Mod conexiune doar citire", licenseFeatureReadonlyConnectionsFlag: "Conexiuni doar citire (--readonly-connections/-r)", licenseFeatureSsh: "Tunelare SSH", licenseFeatureCluster: "Conexiuni Cluster", licenseFeatureSentinel: "Conexiuni Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Sortare chei activata", off: "Sortare chei dezactivata" }, cluster: { on: "Cluster activat", off: "Cluster dezactivat" }, sentinel: { on: "Sentinel activat", off: "Sentinel dezactivat", name: "Nume Sentinel" }, readonly: { on: "Doar citire activat", off: "Doar citire dezactivat" }, proSshOnly: "SSH este disponibil in Pro sau Enterprise.", proReadonlyOnly: "Modul conexiune doar citire este disponibil in Pro sau Enterprise.", enterpriseClusterSentinelOnly: "Cluster si Sentinel sunt disponibile doar in Enterprise.", theme: { light: "Luminos", dark: "Inchis enterprise", darkNeu: "Inchis", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Conectat: ${opts.name}`; }, tree: "Arbore", askAuth: "Solicitare autorizare", keyboardShortcuts: "Comenzi rapide de la tastatură", about: "Despre", supportedLanguages: "Limbi acceptate", version: "Versiune", redisVersion: "Versiune Redis", modules: "Module", shortcutRefresh: "Reîmprospătare", shortcutSearch: "Focalizare căutare", shortcutNewKey: "Cheie nouă", shortcutDisconnect: "Deconectare", themeAuto: "Automat (sistem)", shortcutCommandPalette: "Paletă de comenzi", commandPalette: "Paletă de comenzi", noResults: "Fără rezultate", redisCommandsReference: "Comenzi Redis", ungrouped: "Fără grup", grouped: "Grupate", connectFirst: "Conectați-vă mai întâi la un server Redis", searchLanguage: "Caută limbă...", exportProgress: "Exportare chei...", importProgress: "Importare chei...", importPreview: "Previzualizare", importOverwrite: "Suprascrie", importSkip: "Omite", importConflict: "Dacă cheia există deja:", noKeysToExport: "Nu există chei de exportat", time: "Timp", loading: "Se încarcă...", autoRefresh: "Auto", exportSearchHint: "Se exportă doar cheile care corespund căutării curente", importSearchHint: "Importul se aplică întregii baze de date, nu doar rezultatelor căutării", importNoKeys: "Nu s-au găsit chei în fișier", }, status: { dataCopied: "Datele sunt in clipboard", licenseSaved: "Licenta salvata", exportDone: "Export finalizat", indexCreated: "Index creat", indexDropped: "Index șters", importDone: (opts) => `Import finalizat: ${opts.created} create, ${opts.skipped} omise, ${opts.errors} erori`, nodeRemoved: "Nodul a fost eliminat", keyIsNotExisting: "Aceasta cheie ar fi putut fi stearsa sau expirata.", keyCount: opts => { if (opts.keyCount === 0) { return "Nicio cheie"; } else if (opts.keyCount === 1) { return "1 cheie"; } else { return `${opts.keyCount} chei`; } }, treeExpandAll: "Extindere toate ramurile arborelui. Aceasta operatie poate fi costisitoare si poate dura ...", noRedisKeys: "Nu exista chei in aceasta baza de date.", redisConnected: "Redis conectat cu succes", reloadingDataInfo: "Se reincarca informatiile de date Redis", added: "Adaugat", saved: "Actualizat", cancelled: "Anulat", deleted: "Sters", savedRedis: "Datele Redis au fost salvate", redisDisconnected: opts => { return `Conexiunea curenta a avut o eroare: ${opts.error.message}`; }, dbChanged: opts => { return `Indexul bazei de date a fost setat la ${opts.db}. `; }, treeDeleted: opts => { return `Cheia din arbore a fost stearsa (${opts.key}).`; }, deletedKey: opts => { return `Cheia a fost stearsa (${opts.key}).`; }, renamedKey: "Aceasta cheie a fost redenumita", ttlChanged: "TTL-ul acestei chei a fost modificat", notInteger: "Aceasta valoare introdusa nu este un numar intreg", persisted: "Aceasta cheie este persistenta pentru totdeauna", set: "Cheia a fost setata/adaugata" }, code: { "delete-connection": "Aceasta conexiune a fost stearsa, asa ca sunteti deconectat de la aceasta instanta Redis.", "save-connection": "Aceasta conexiune a fost modificata, asa ca sunteti deconectat de la aceasta instanta Redis. Va puteti reconecta.", "readonly-connections": "Adaugarea/salvarea/stergerea conexiunilor este doar in citire!", "readonly-connection-mode": "Aceasta conexiune este in mod doar citire!", "list-out-of-bounds": "Indexul acestei liste este in afara limitelor", "donation-ware-feature": "Aceasta functie este disponibila in versiunea cu donatie.", "feature-pro-readonly-required": "Modul conexiune doar citire necesita licenta Pro sau Enterprise.", "feature-pro-ssh-required": "Tunelarea SSH necesita licenta Pro sau Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster si Sentinel necesita licenta Enterprise.", "feature-pro-json-binary-required": "Edit JSON, Upload binary si Download binary necesita licenta Pro sau Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorizare necesara: va rugam autentificati-va cu HTTP Basic Auth si reincarcati.", "auto-connection-failed": "Posibil, conexiunea a fost eliminata si conectarea automata a esuat din aceasta cauza.", invalid_console_command: "Aceasta comanda nu functioneaza prin GUI." }, licenseReason: { LICENSE_VALID: "Licenta este valida", LICENSE_INVALID: "Licenta este invalida", LICENSE_MISSING: "Nicio cheie de licenta nu este setata", LICENSE_DISABLED: "Licenta este dezactivata in configuratia serverului", LICENSE_NOT_FOUND: "Licenta nu a fost gasita", LICENSE_EXPIRED: "Licenta a expirat", LICENSE_CLEARED: "Cheia de licenta a fost stearsa", LICENSE_MAX_DEVICES_REACHED: "Numarul maxim de locuri pentru dispozitive a fost atins", PRODUCT_MISMATCH: "Produsul licentei nu se potriveste" }, licenseStatusValue: { active: "Activa", deleted: "Stearsa", all: "Toate", expired: "Expirata", missing: "Lipsa", inactive: "Inactiva" }, form: { error: { required: "Obligatoriu", port: "Portul este intre 1-65535", invalid: "Formularul este invalid" }, connection: { label: { name: "Nume", group: "Grup", host: "Nume gazda", port: "Port", password: "Parola", username: "Utilizator" } }, treeSettings: { maxValueDisplay: "Lungimea maxima de afisare a valorii", maxValueDisplayInfo: "Daca este setat la 0, afiseaza valorile complete. Daca este mai mare de 0, trunchiaza la aceasta lungime. Daca este -1: pentru siruri, ascunde valoarea pana la editare; pentru alte tipuri, afiseaza continutul complet.", maxKeys: "Numarul maxim de chei", maxKeysInfo: "Pentru ca GUI-ul sa nu se blocheze, limitam numarul maxim de chei.", keyCount: () => { return `Numarul de chei: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Foloseste animatie", noAnimation: "Fara animatie", jsonFormatTwoSpace: "Formatare JSON cu 2 spatii", jsonFormatFourSpace: "Formatare JSON cu 4 spatii", formName: "Setari Redis", searchModeClient: "Mod de cautare pe client", searchModeServer: "Mod de cautare pe server", searchModeStartsWith: "Cautare cu incepe cu", searchModeIncludes: "Cautare cu include" }, field: { treeSeparator: "Separator arbore", treeSeparatorSelector: "Selector separator arbore", page: "Numar de paginare arbore", keyPageCount: "Numar de paginare chei", keysSort: "Sorteaza cheile", searchMode: "Mod de cautare", searchModeStartsWith: "Cautare incepe cu / include" }, error: { keyPageCount: "Numarul de paginare a cheilor trebuie sa fie un numar intreg intre 5 - 100", page: "Numarul de paginare trebuie sa fie un numar intreg intre 10 - 5000", maxValueDisplay: "Valoarea maxima de afisare trebuie sa fie un numar intreg intre -1 si 32768", maxKeys: "Numarul maxim de chei trebuie sa fie un numar intreg intre 100 si 100000" } }, key: { label: { formName: { add: "Adaugare cheie Redis noua", edit: "Editare cheie Redis", append: "Adaugare la cheia Redis existenta" } }, field: { streamTimestamp: "Marca temporala", key: "Cheie", type: "Tip", index: "Index", hashKey: "Cheie hash", score: "Scor", value: "Valoare" }, error: { streamTimestamp: "Marca temporala este obligatorie, fie in format Redis, fie ca *", key: "Cheia are cel putin un caracter", hashKey: "Cheia tabelului hash are cel putin un caracter", score: "Scorul setului sortat este obligatoriu", value: "Valoarea este obligatorie" } }, main: { label: { database: "BD" } } }, page: { search: { title: "Căutare", index: "Index", query: "Interogare", results: "Rezultate", noIndex: "Nu s-au găsit indexuri", createIndex: "Creează index", dropIndex: "Șterge index", indexInfo: "Info index", indexName: "Nume index", prefix: "Prefix cheie (opțional)", fieldName: "Nume câmp", }, monitor: { title: "Monitorizare", memory: "Memorie", opsPerSec: "Operații/sec", clients: "Clienți", blocked: "Blocați", hitsMisses: "Rata de succes", networkIo: "Rețea I/O", slowLog: "Jurnal lent", totalCommands: "Total", expired: "Expirate", evicted: "Evacuate", clientList: "Lista clienților", topKeys: "Cele mai mari chei după memorie", killClient: "Oprește clientul", clientKilled: "Clientul a fost oprit", confirmKillClient: "Sunteți sigur că doriți să opriți acest client?", noKeys: "Fără chei", noClients: "Fără clienți", }, overview: { noConnected: "Nu exista conexiune la Redis.", overviewClients: "Listeaza conexiunile dupa numarul de clienti", connectedCount: opt => { if (opt.length === 1) { return "1 client"; } return `${opt.length} clienti`; } }, key: { label: { key: "Cheie", encoding: "Codificare", length: "Dimensiune", ttl: "TTL", ttlTitle: "Durata de viata", type: "Tip", ttlNotExpire: "nu expira", lengthString: "octeti", lengthItem: "elemente", actions: "Actiuni" }, list: { table: { index: "Index", value: "Valoare" } }, hash: { table: { hashkey: "Cheie hash", value: "Valoare" } }, set: { table: { value: "Membru" } }, zset: { table: { value: "Membru", score: "Scor" } }, stream: { table: { timestamp: "ID marca temporala", field: "Camp", value: "Valoare" } } }, treeControls: { settings: "Setari arbore", expandAll: "Extinde tot", collapseAll: "Restrange tot", search: { search: "Cautare in chei", clear: "Curata cautarea curenta", placeholderClient: "Cautare pe client", placeholderServer: "Cautare pe server", info: "Cautarea pe client inseamna potrivirea textului din campul de cautare. Cautarea pe server inseamna cautare cu modele in chei ca *{text-cautat}*. Pentru seturi mari de cautare, este mai bine sa folositi cautarea pe server. Pentru seturi mai mici, este mai bine sa folositi cautarea pe client." + ` Daca numarul de chei depaseste ${p3xr.settings.maxLightKeysCount}, puteti cauta doar pe server.`, largeSetInfo: "Intr-un set mare, cautarea pe client este dezactivata, asa ca in acest moment doar cautarea pe server este posibila.", infoDetails: "Pentru a afla cum functioneaza cautarea, verificati setarile" }, pager: { next: "Urmatorul", prev: "Anterior", first: "Primul", last: "Ultimul" } } }, time: { loading: "Se încarcă...", years: "ani", months: "luni", days: "zile", year: "an", month: "luna", day: "zi" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ru/000077500000000000000000000000001517666434100140015ustar00rootroot00000000000000src/strings/ru/strings.js000066400000000000000000001131571517666434100160400ustar00rootroot00000000000000const strings = { error: { cleared_license: "Очищенная лицензия", invalid_license: "Неверная лицензия", license_max_devices_reached: "Достигнут максимальный лимит устройств", license_readonly: "Лицензию можно изменить только из терминала сервера.", server_error: "Серверная ошибка, пожалуйсто попробуйте снова" }, title: { donate: "Донат", jsonRecursive: "Расширяем все листья", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Вы можете выбрать Redis коннектор для соединения из меню снизу слева.", statistics: "Статистика", error: "Ошибка", connectingRedis: "Подключаемся к Redis ...", socketioConnectError: "Ошибка Socket.IO", db: "База данных", server: "Сервер", clients: "Клиент", memory: "Память", persistence: "Постоянность", stats: "Статистика", replication: "Репликация", cpu: "ЦПУ", cluster: "Кластер", modules: "Модули", errorstats: "Статистика ошибок", commandstats: "Статистика команд", latencystats: "Статистика задержек", keysizes: "Размеры ключей", threads: "Потоки", }, confirm: { dropIndex: "Вы уверены, что хотите удалить этот индекс?", uploadBuffer: "Вы уверены, чтобы загрузить эти двоичные данные?", uploadBufferDone: "Двоичные данные загружаются", uploadBufferDoneAndSave: "Двоичные данные загружаются и сохраняются на сервере.", title: "Подтвердить", alert: "Внимание", info: "Информация", deleteListItem: "Вы точно хотите удалить этот список?", deleteHashKey: "Вы точно хотите удалить этот хэш?", deleteStreamTimestamp: "Вы точно хотите удалить эту временную отметку потока?", deleteSetMember: "Вы точно хотите удалить этого члена набора?", deleteZSetMember: "Вы точно хотите удалить этого члена сортированного набора?", deleteConnection: "Подтвердить", deleteConnectionText: "Вы точно хотите удалить это подключение Redis?", deleteNode: "Вы точно хотите удалить эту ноду Redis?", deleteAllKeys: opts => { return `Удалить это дерево и все его ключи (${opts.key})?`; }, socketioConnectError: "Socket.IO не может подключится к серверу, вы можете перезагрузить и решить проблему с соединением самостоятельно, клиент не знает как решить это.", socketioAuthRequired: "Для Socket.IO нужна авторизация. Выполните вход через HTTP Basic Auth (логин/пароль) и перезагрузите страницу.", deleteKey: "Вы точно хотите удалить этот ключ?", rename: { title: "Вы точно хотите переименовать этот ключ?", textContent: 'Если вы нажмёте кнопку "Переименоват" вы навсегда переименуете этот ключ.', placeholder: "Ключ Redis (обязательно)" }, ttl: { title: "Вы точно хотите изменить TTL этого ключа?", textContent: 'Если вы нажмёте "Изменить" вы измените TTL этого ключа, пустой TTL равен вечному.', placeholder: "TTL ключа Redis (цельная цифра или ничего)", placeholderPlaceholder: "Пустота означает вечность, для других случаев используйте целое число.", convertTextToTime: "Конвертировать текст во время", convertTextToTimePlaceholder: "Например, 1d равен 86400" }, license: { title: "Установить лицензию", textContent: "Если вы хотите использовать платные функции, запросите лицензию у support@corifeus.com. Цена: Pro — 400 HUF/месяц (€1/месяц) или 4 000 HUF/год (€10/год), Enterprise — 1 200 HUF/месяц (€3/месяц) или 12 000 HUF/год (€30/год). Годовая цена = 10x месячной. С НДС 27% итог: Pro — 500 HUF/месяц (€1.27/месяц) или 5 100 HUF/год (€12.70/год), Enterprise — 1 500 HUF/месяц (€3.81/месяц) или 15 200 HUF/год (€38.10/год). Для проверки лицензии требуется подключение к интернету. По умолчанию лицензия включает 5 мест (seats). Если нужно больше мест, свяжитесь с нами: support@corifeus.com.", placeholder: "Ключ лицензии" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "Английский / English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Копировать", downloadBuffer: "Скачать бинарный файл", setBuffer: "Загрузить двоичный файл", exportKeys: "Экспорт ключей", exportAllKeys: (opts) => `Экспорт всех ${opts.count} ключей`, exportSearchResults: (opts) => `Экспорт ${opts.count} результатов`, importKeys: "Импорт ключей", saveWithFormatJson: "Сохранить с форматом", formatJson: "Форматировать Json", wrap: "Перенос", unwrap: "Без переноса", downloadJson: "Скачать JSON", pubsubMonitor: "Мониторинг PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Язык / Language", ok: "ОК", addKey: "Добавить к этому ключу", addKeyRoot: "Добавить к корневому ключу", reloadKey: "Кнопка перезагрузки", reload: "Перезагрузить", close: "Закрыть", commands: "Команды", view: "Вид", statistics: "Статистика", refresh: "Обновить", pause: "Пауза", resume: "Продолжить", clear: "Очистить", rename: "Переименовать", main: "База данных", cancel: "Отмена", theme: "Тема", github: "GitHub", githubRepo: "Репозиторий", githubRelease: "Релизы", githubChangelog: "Изменения", info: "Info", settings: "Настройки", connect: "Подключиться", disconnect: "Отключится", overview: "Обзор", console: "Консоль", noConnections: "Подключения отсутствуют, добавьте подключение в меню настроек.", noConnectionsInSettings: "Подключения отсутствуют, вы можете добавить НОВОЕ ПОДКЛЮЧЕНИЕ выше.", connectionAdd: "Новое подключение", addGroup: "Добавить группу", extend: "Расширить", collapse: "Схлопнуть", add: "Добавить", edit: "Редактировать", save: "Сохранить", ttl: "Выбрать TTL", license: "Установить лицензию", delete: "Удалить", remove: "Убрать", sure: "Хорошо", testConnection: "Проверка соединения", getKey: "Загрузка ключа Redis и асоциированных данных ...", jsonViewShow: "Показать JSON", jsonViewEditor: "Редактировать JSON", quickConsole: "Быстрый" }, label: { id: { nodeId: 'Идентификатор узла', id: "Идентификатор соединения", info: "Если вы не хотите изменять свойства: sshPassword, sshPrivateKey, пароля, tlsCrt, tlsKey, tlsCa, введите идентификатор соединения в эти свойства, чтобы сохранить значения свойств нетронутыми. Если вы хотите использовать ту же логику в пароле узла, введите идентификатор узла в пароле узла." }, secureFeature: 'Если вы видите значение, которое начинается с P3X и выглядит похоже, это функция безопасности. Чтобы изменить настройки, просто замените эти настройки на пустые или что-то другое, и они будут сохранены. Если вы не измените настройки, настройки останутся такими, какие они есть на сервере.', ssh: { on: 'SSH включен', off: 'SSH выключен', sshHost: 'Хост SSH', sshPort: 'Порт SSH', sshUsername: 'Имя пользователя SSH', sshPassword: 'Пароль SSH', sshPrivateKey: 'Приватный ключ SSH' }, isBuffer: opts => `[object ArrayBuffer] означает, что значение представляет собой двоичный буфер или значение превышает ${opts.maxValueAsBuffer}`, streamValue: `Поле и значение потока это однополосник. Например: поле1 значение1 "поле 2" "значение 2"`, streamTimestampId: `'*' означает автогенерацию или определяется как -`, unableToLoadKey: ({ key }) => { return `Не вышло загрузить ключ: ${key}. Возможно он был удалён. Полная ошибка написана в консоли.`; }, bigJson: "Этот JSON обьект больше 10 kb, удостоверьтесь что вы знаете что делаете, так как некоторые функции рендерятся медленнее.", addNode: "Добавить ноду", validateJson: "Проверить JSON", reducedFunction: `Урезанная функциональность`, tooManyKeys: opts => { return `Для полноценной работы максимума функций разрешены ключи в общем количестве ${opts.maxLightKeysCount} штук. Эта база данных имеет больше ключей чем разрешено, суммой ${opts.count}. Сортировка и информация древом для ключей выключены. Поиск будет производится только на серверной стороне.`; }, redisCommandNotFound: "Ни одна команда Redis не совпадает с вводом ...", treeKeyStore: `Сортировка (природное сравнение) выполняется в клиенте (он же браузер), что замедляет большие сортировки, например больше чем 10k ключей, это может добавить немного задержки к прогрузке страницы. В самом Redis нету сортировки ключей, это можно делать только так.`, socketIoTimeout: options => { return `Socket.IO не успел ответить на запрос (максимум ${options.timeout / 1000} секунд) ...`; }, resizerInfo: options => { return `Минимальная ширина левой или правой панели это ${options.width}px`; }, jsonViewNotParsable: "Это значение не подобно JSON", ttlTitle: "Выбрать TTL в секундах", passwordSecure: "Пароль может быть пустым, но он всё ещё будет отображать символы, это фича для безопасности.", tlsWithoutCert: "Включить TLS без дополнительного сертификата", tlsRejectUnauthorized: "Reject unauthorized certificate", tlsSecure: "Если вы видите TLS конфигурацию которая начинается с P3X или все настройки TLS выглядят одинаково, это фича для безопасности. Для изминения настроек надо заменить эти настройки пустыми или чем либо ещё, и они сохранятся. Если вы ек измените настройки TLS, настройки останутся такими же как и на самом сервере.", treeSeparatorEmpty: "Если разделитель дерева пуст, в дереве вместо вложенных нод будет лишь чистый список", treeSeparatorEmptyNote: "Никаких вложенных нод, только чистый список", welcomeConsole: "Добро пожаловать в консоль Redis", welcomeConsoleInfo: "История по нажатию ВВЕРХ или ВНИЗ кллючена", redisListIndexInfo: "Пустое для добавления, -1 что бы сделать вид или сохранить в указанную позицию.", console: "Консоль", connectiondAdd: "Добавить соединение", connectiondEdit: "Изменить соединение", connectiondView: "Осмотреть соединение", connections: "Соединения", licenseInfo: "Лицензия", licenseEditable: "Редактирование лицензии", licenseEditableYes: "Да", licenseEditableNo: "Нет", licenseTerminalOnly: "Лицензию можно настроить только из терминала сервера.", licenseTierPolicyTitle: "Политика тарифов", licenseTierPolicyText: "

Free

только базовый Redis UI; без SSH-туннелирования, без режима Readonly connection mode, без Cluster/Sentinel, без Edit JSON/Upload binary/Download binary, без ReJSON.
Цена: 0 HUF/месяц (€0/месяц).

Pro

SSH-туннелирование, режим Readonly connection mode (включая --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Базовая цена: 400 HUF/месяц (€1/месяц) или 4 000 HUF/год (€10/год).
Итог с НДС 27%: 500 HUF/месяц (€1.27/месяц) или 5 100 HUF/год (€12.70/год).

Enterprise

SSH-туннелирование, Cluster и Sentinel, а также Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r тоже работает.
Базовая цена: 1 200 HUF/месяц (€3/месяц) или 12 000 HUF/год (€30/год).
Итог с НДС 27%: 1 500 HUF/месяц (€3.81/месяц) или 15 200 HUF/год (€38.10/год).

Годовое правило

Годовая цена = 10x месячной.

Места

По умолчанию лицензия включает 5 мест (seats). Если нужно больше мест, свяжитесь с нами: support@corifeus.com.

Пробный Enterprise

10 дней бесплатно для любого пользователя с реальным существующим email (не тестовым).

Данные для письма

Имя, Billing e-mail, Код страны, Почтовый индекс, Город, Адрес, VAT ID (если есть).

Оплата

Оплата через PayPal доступна только в HUF (форинт); после отправки денег на https://paypal.me/corifeus я отправлю вам счет. Все платежи не подлежат возврату.

НДС

НДС добавляется к цене (в Венгрии 27%).

Контакт

Если хотите просто поздороваться или задать вопрос, напишите на support@corifeus.com.

Язык

Коммуникация по счетам и отправке лицензионного ключа ведется на английском языке. Валюта счета: HUF.

Примечание

Для проверки лицензии требуется подключение к интернету.", licenseState: "Состояние", licenseStateActive: "Активна", licenseStateInactive: "Неактивна", licenseStateNoLicense: "Лицензия отсутствует", licenseKeyMasked: "Сохраненный ключ", licenseTier: "Тариф", licenseValid: "Валидна", licenseStatus: "Статус лицензии", licenseReason: "Причина", licenseCheckedAt: "Проверено", licenseStartsAt: "Начало", licenseExpiresAt: "Истекает", licenseDaysLeft: "Осталось дней", licenseMaxDevices: "Макс. устройств", licenseActiveDevices: "Активные устройства", licenseActiveDevicesInfo: "Если устройство больше не используется, его место освобождается автоматически через 75 минут.", licenseCustomerEmail: "Email клиента", licenseFeatures: "Функции", licenseFeaturesEmpty: "Дополнительных функций нет", licenseFeatureReadonlyMode: "Режим \"только чтение\"", licenseFeatureReadonlyConnectionsFlag: "Глобальный readonly (--readonly-connections/-r)", licenseFeatureSsh: "SSH-туннелирование", licenseFeatureCluster: "Подключения Cluster", licenseFeatureSentinel: "Подключения Sentinel", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Сортировка ключей включена", off: "Сортировка ключей выключена" }, cluster: { on: "Кластеризация активирована", off: "Кластеризация деактивирована" }, sentinel: { on: "Сентинел включен", off: "Сентинел выключен", name: "Имя дозорного" }, readonly: { on: 'Режим "только чтение"', off: 'Режим "редактирование"' }, proSshOnly: "SSH доступен в тарифах Pro и Enterprise.", proReadonlyOnly: 'Режим "только чтение" доступен в тарифах Pro и Enterprise.', enterpriseClusterSentinelOnly: "Cluster и Sentinel доступны только в Enterprise.", theme: { light: "Светлая", dark: "Тёмная корпоративная", darkNeu: "Тёмная", darkoBluo: "Тёмное синево", enterprise: "Корпоративная", redis: "Redis", matrix: "Матрица" }, connected: opts => { return `Подключено: ${opts.name}`; }, tree: "Дерево", askAuth: "Запросить авторизацию", keyboardShortcuts: "Горячие клавиши", about: "О программе", supportedLanguages: "Поддерживаемые языки", version: "Версия", redisVersion: "Версия Redis", modules: "Модули", shortcutRefresh: "Обновить", shortcutSearch: "Фокус на поиске", shortcutNewKey: "Новый ключ", shortcutDisconnect: "Отключится", themeAuto: "Авто (система)", shortcutCommandPalette: "Палитра команд", commandPalette: "Палитра команд", noResults: "Нет результатов", redisCommandsReference: "Команды Redis", ungrouped: "Без группы", grouped: "Сгруппированы", connectFirst: "Сначала подключитесь к серверу Redis", searchLanguage: "Поиск языка...", exportProgress: "Экспорт ключей...", importProgress: "Импорт ключей...", importPreview: "Предпросмотр", importOverwrite: "Перезаписать", importSkip: "Пропустить", importConflict: "Если ключ уже существует:", noKeysToExport: "Нет ключей для экспорта", time: "Время", loading: "Загрузка...", autoRefresh: "Авто", exportSearchHint: "Экспортируются только ключи, соответствующие текущему поиску", importSearchHint: "Импорт применяется ко всей базе данных, а не только к результатам поиска", importNoKeys: "Ключи не найдены в файле", }, status: { dataCopied: "Данные скопированы в буфер обмена", licenseSaved: "Лицензия сохранена", exportDone: "Экспорт завершён", indexCreated: "Индекс создан", indexDropped: "Индекс удалён", importDone: (opts) => `Импорт завершён: ${opts.created} создано, ${opts.skipped} пропущено, ${opts.errors} ошибок`, nodeRemoved: "Нода удалена", keyIsNotExisting: "Этот ключ вероятно был удалён или истёк.", keyCount: opts => { if (opts.keyCount === 0) { return "Нету ключей"; } else if (opts.keyCount === 1) { return "1 ключ"; } else { return `${opts.keyCount} ключей`; } }, treeExpandAll: "Развернуть все листья дерева, это имеет цену, временную ...", noRedisKeys: "Нету ключей в базе данных.", redisConnected: "Redis успешно подключен", reloadingDataInfo: "Перезагружаем информацию о данных Redis", added: "Добавлено", saved: "Обновлено", cancelled: "Отменено", deleted: "Удалено", savedRedis: "Данные Redis были сохранены", redisDisconnected: opts => { return `Произошла ошибка в теперешнем соединении: ${opts.error.message}`; }, dbChanged: opts => { return `Выбран индекс базы данных ${opts.db}. `; }, treeDeleted: opts => { return `Ключ дерева был удалён (${opts.key}).`; }, deletedKey: opts => { return `Ключ был удалён (${opts.key}).`; }, renamedKey: "Этот ключ был переименован", ttlChanged: "TTL этого ключа был изменён", notInteger: "Этот ввод не для цельной цифры", persisted: "Этот ключ не исчезнет сам", set: "Этот ключ был применён/добавлен" }, code: { "delete-connection": "Это соединение было удалено и по этому вы были отключены от этой инстанции Redis.", "save-connection": "Это подключение было изменено и по этому вы были отключены от этой инстанции Redis. Вы можете переподключится.", "readonly-connections": 'Добавление/сохранение/удаление соединений в режиме "только чтение"!', "readonly-connection-mode": 'Это соединение в режиме "только чтение"!', "list-out-of-bounds": "Индекс этого списка вышел за границы", "donation-ware-feature": "Эта функция доступна в донатерской версии.", "feature-pro-readonly-required": 'Режим "только чтение" требует лицензию Pro или Enterprise.', "feature-pro-ssh-required": "SSH-туннелирование требует лицензию Pro или Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster и Sentinel требуют лицензию Enterprise.", "feature-pro-json-binary-required": "Edit JSON, Upload binary и Download binary требуют лицензию Pro или Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Требуется авторизация: выполните вход через HTTP Basic Auth и перезагрузите страницу.", "auto-connection-failed": "Вероятно, соединение было удалено и авто-соединение провалилось по таковой причине.", invalid_console_command: "Эта команда не работает через GUI." }, licenseReason: { LICENSE_VALID: "Лицензия действительна", LICENSE_INVALID: "Лицензия недействительна", LICENSE_MISSING: "Ключ лицензии не задан", LICENSE_DISABLED: "Лицензия отключена в конфигурации сервера", LICENSE_NOT_FOUND: "Лицензия не найдена", LICENSE_EXPIRED: "Срок лицензии истек", LICENSE_CLEARED: "Ключ лицензии очищен", LICENSE_MAX_DEVICES_REACHED: "Достигнут максимальный лимит устройств", PRODUCT_MISMATCH: "Продукт лицензии не совпадает" }, licenseStatusValue: { active: "Активна", deleted: "Удалена", all: "Все", expired: "Истекла", missing: "Отсутствует", inactive: "Неактивна" }, form: { error: { required: "Обязательно", port: "Порт в границах 1-65535", invalid: "Форма заполнена неверно" }, connection: { label: { name: "Название", group: "Группа", host: "Имя хоста", port: "Порт", password: "Пароль", username: "Имя пользователя" } }, treeSettings: { maxValueDisplay: "Длинна видимой строки", maxValueDisplayInfo: "Если значение длинны показа равно нулю, будет показано всё, если же оно больше - вывод будет урезан. Если он равен минус одному, вывод будет скрыт до начала редактирования для строк, для других же типов будет показано всё.", maxKeys: "Максимум символов", maxKeysInfo: "Максимум ключей ограничен что бы GUI не падал.", keyCount: () => { return `Количество ключей: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Использовать анимацию", noAnimation: "Выключить анимацию", jsonFormatTwoSpace: "Форматировать JSON двумя пробелами", jsonFormatFourSpace: "Форматировать JSON четырьмя пробелами", formName: "Настройки Redis", searchModeClient: "Клиентский режим поиска", searchModeServer: "Серверный режим поиска", searchModeStartsWith: "Поиск начала", searchModeIncludes: "Поиск содержимого" }, field: { treeSeparator: "Разделитель дерева", treeSeparatorSelector: "Избиратель разделителя дерева", page: "Счётчик количества страниц", keyPageCount: "Счётчик количества ключей", keysSort: "Сортировка ключей", searchMode: "Режим поиска", searchModeStartsWith: "Поиск начинается с / содержит" }, error: { keyPageCount: "Ограничитель показа ключей на странице должен быть цельным числом в границах 5 - 100", page: "Ограничитель показа страниц должен быть цельным числом в границах 10 - 5000", maxValueDisplay: "Максимальное количество показываемых значений должен быть цельным числом между -1 и 32768", maxKeys: "Максимальное количество показываемых ключей должен быть цельным числом между 100 и 100000" } }, key: { label: { formName: { add: "Добавить новый ключ Redis", edit: "Редактировать ключ Redis", append: "Добавить к существующему ключу Redis" } }, field: { streamTimestamp: "Временная отметка", key: "Ключ", type: "Тип", index: "Индекс", hashKey: "Хэш", score: "Очки", value: "Значение" }, error: { streamTimestamp: "Временная отметка обязательна, либо в формате Redis либо как *", key: "Ключ должен иметь длинну минимум одного символа", hashKey: "Стол хэшей ключей должен иметь длинну минимум одного символа", score: "Очки сортировки набора обязательны", value: "Значение обязательно" } }, main: { label: { database: "База данных" } } }, page: { search: { title: "Поиск", index: "Индекс", query: "Запрос", results: "Результаты", noIndex: "Индексы не найдены", createIndex: "Создать индекс", dropIndex: "Удалить индекс", indexInfo: "Информация об индексе", indexName: "Имя индекса", prefix: "Префикс ключа (необязательно)", fieldName: "Имя поля", }, monitor: { title: "Мониторинг", memory: "Память", opsPerSec: "Операций/сек", clients: "Клиенты", blocked: "Заблокировано", hitsMisses: "Попадания", networkIo: "Сеть I/O", slowLog: "Медленный журнал", totalCommands: "Всего", expired: "Истекли", evicted: "Вытеснено", clientList: "Список клиентов", topKeys: "Крупнейшие ключи по памяти", killClient: "Завершить клиента", clientKilled: "Клиент завершён", confirmKillClient: "Вы уверены, что хотите завершить этого клиента?", noKeys: "Нет ключей", noClients: "Нет клиентов", }, overview: { noConnected: "Нету подключения к Redis.", overviewClients: "Показать подключения по количеству клиентов", connectedCount: opt => { if (opt.length === 1) { return "1 клиент"; } return `${opt.length} клиентов`; } }, key: { label: { key: "Ключ", encoding: "Кодировка", length: "Размер", ttl: "TTL", ttlTitle: "Время На Жизнь (TTL)", type: "Тип", ttlNotExpire: "не истекает", lengthString: "байты", lengthItem: "обьекты", actions: "Действия" }, list: { table: { index: "Индекс", value: "Значение" } }, hash: { table: { hashkey: "Хэш", value: "Значение" } }, set: { table: { value: "Член" } }, zset: { table: { value: "Член", score: "Очки" } }, stream: { table: { timestamp: "Идентификатор временной отметки", field: "Поле", value: "Значение" } } }, treeControls: { settings: "Настройки дерева", expandAll: "Развернуть все", collapseAll: "Свернуть все", search: { search: "Поиск ключа", clear: "Очистить теперешний поиск", placeholderClient: "Искать в клиенте", placeholderServer: "Искать на сервере", largeSetInfo: "In a large set, client side searching is disabled. so right now only server side searching is possible.", info: "Поиск в клиенте означает совпадание с содержимым поля поиска. Серверный поиск означает поиск паттерном на подобие *{искомый-текст}*. Для поиска больших наборов лучше использовать серверный поиск. Для меньших поисковых наборов лучше использовать поиск клиентом." + ` Если количество ключей превышает ${p3xr.settings.maxLightKeysCount}, можно будет искать только серверным поиском.`, infoDetails: "Что бы понять как поиск работает, изучите настройки" }, pager: { next: "Следующий", prev: "Предыдущий", first: "Первый", last: "Последний" } } }, time: { loading: "Загрузка...", years: "года", months: "месяца", days: "дни", year: "год", month: "месяц", day: "день" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/si/000077500000000000000000000000001517666434100137665ustar00rootroot00000000000000src/strings/si/strings.js000066400000000000000000001330531517666434100160220ustar00rootroot00000000000000const strings = { error: { cleared_license: "බලපත්\u200dරය ඉවත් කරන ලදී", invalid_license: "අවලංගු බලපත්\u200dරය", license_max_devices_reached: "උපරිම උපාංග ආසන සීමාවට ළඟා විය", license_readonly: "බලපත්\u200dරය සේවාදායක පර්යන්තයෙන් පමණක් වෙනස් කළ හැක.", server_error: "සේවාදායක දෝෂයක්, කරුණාකර නැවත උත්සාහ කරන්න" }, title: { donate: "පරිත්\u200dයාග කරන්න", jsonRecursive: "සියලුම කොළ පුළුල් කරමින්", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "ඔබට වම් පහළ මෙනුවෙන් Redis සම්බන්ධතාවයක් තෝරා ගත හැක.", statistics: "සංඛ්\u200dයාලේඛන", error: "දෝෂය", connectingRedis: "Redis වෙත සම්බන්ධ වෙමින් ...", socketioConnectError: "Socket.IO දෝෂය", db: "DB", server: "සේවාදායකය", clients: "සේවාලාභීන්", memory: "මතකය", persistence: "පවත්වාගෙන යාම", stats: "සංඛ්\u200dයාලේඛන", replication: "අනුරූපණය", cpu: "CPU", cluster: "සමූහය", modules: "modules", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "මෙම සුචිය මැකීමට විශ්වාසද?", uploadBuffer: "ඔබට මෙම ද්විමය දත්ත උඩුගත කිරීමට අවශ්\u200dය බව විශ්වාසද?", uploadBufferDone: "ද්විමය දත්ත උඩුගත කරන ලදී", uploadBufferDoneAndSave: "ද්විමය දත්ත උඩුගත කර සේවාදායකයේ සුරකින ලදී", title: "තහවුරු කරන්න", alert: "ඇඟවීම", info: "තොරතුරු", deleteListItem: "ඔබට මෙම ලැයිස්තු අයිතමය මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteHashKey: "ඔබට මෙම hash යතුරු අයිතමය මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteStreamTimestamp: "ඔබට මෙම ප්\u200dරවාහ කාල මුද්\u200dරාව මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteSetMember: "ඔබට මෙම කට්ටල සාමාජිකයා මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteZSetMember: "ඔබට මෙම වර්ග කළ කට්ටල සාමාජිකයා මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteConnection: "තහවුරු කරන්න", deleteConnectionText: "ඔබට මෙම Redis සම්බන්ධතාවය මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteNode: "ඔබට මෙම Redis නෝඩය මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", deleteAllKeys: opts => { return `මෙම ගස සහ එහි සියලුම යතුරු මකන්නද (${opts.key})?`; }, socketioConnectError: "Socket.IO සේවාදායකයට සම්බන්ධ විය නොහැක, ඔබට නැවත පූරණය කර සම්බන්ධතා දෝෂය විසඳීමට උත්සාහ කළ හැක, සේවාලාභියාට එය තනිවම විසඳන්නේ කෙසේදැයි නොදනී.", socketioAuthRequired: "Socket.IO අවසරය අවශ්\u200dයයි. කරුණාකර HTTP Basic Auth (පරිශීලක නාමය/මුරපදය) සමඟ සත්\u200dයාපනය කර නැවත පූරණය කරන්න.", deleteKey: "ඔබට මෙම යතුර මකා දැමීමට අවශ්\u200dය බව විශ්වාසද?", rename: { title: "ඔබට මෙම යතුර නැවත නම් කිරීමට අවශ්\u200dය බව විශ්වාසද?", textContent: "මෙම ක්\u200dරියාව යතුර ස්ථිරවම නැවත නම් කරයි.", placeholder: "Redis යතුර (අවශ්\u200dයයි)" }, ttl: { title: "ඔබට මෙම යතුරේ TTL වෙනස් කිරීමට අවශ්\u200dය බව විශ්වාසද?", textContent: "TTL වෙනස් කිරීමෙන් මෙම යතුරේ ජීවිත කාලය යාවත්කාලීන වේ. මෙම යතුර සදාකාලිකව තබා ගැනීමට හිස්ව තබන්න.", placeholder: "Redis යතුරේ TTL (පූර්ණ සංඛ්\u200dයාවක් හෝ හිස්)", placeholderPlaceholder: "හිස් යනු සදාකාලිකව පවතිනවා; නැතිනම් පූර්ණ සංඛ්\u200dයාවක් ඇතුළත් කරන්න.", convertTextToTime: "පෙළ කාලයට පරිවර්තනය කරන්න", convertTextToTimePlaceholder: "උදා. 1d 86400 වනු ඇත" }, license: { title: "බලපත්\u200dරය සකසන්න", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20ac1/month) or 4,000 HUF/year (\u20ac10/year), and Enterprise 1,200 HUF/month (\u20ac3/month) or 12,000 HUF/year (\u20ac30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20ac1.27/month) or 5,100 HUF/year (\u20ac12.70/year), Enterprise 1,500 HUF/month (\u20ac3.81/month) or 15,200 HUF/year (\u20ac38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "බලපත්\u200dර යතුර" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "බල්ගේරියානු / Bulgarian", cs: "චෙක් / Czech", de: "ජර්මන් / German", el: "ග්\u200dරීක / Greek", en: "ඉංග්\u200dරීසි / English", es: "ස්පාඤ්ඤ / Spanish", fr: "ප්\u200dරංශ / French", hu: "හංගේරියානු / Hungarian", it: "ඉතාලි / Italian", ja: "ජපන් / Japanese", nl: "ලන්දේසි / Dutch", pl: "පෝලන්ත / Polish", "pt-PT": "පෘතුගීසි / Portuguese", ro: "රොමේනියානු / Romanian", ru: "රුසියානු / Russian", sk: "ස්ලෝවැක් / Slovak", sr: "සර්බියානු / Serbian", sv: "ස්වීඩන් / Swedish", tr: "තුර්කි / Turkish", uk: "යුක්\u200dරේනියානු / Ukrainian", zn: "චීන / Chinese", ar: "අරාබි / Arabic", az: "අසර්බයිජානු / Azerbaijani", be: "බෙලරුසියානු / Belarusian", bn: "බෙංගාලි / Bengali", da: "ඩේනිශ් / Danish", et: "එස්තෝනියානු / Estonian", fi: "ෆින්ලන්ත / Finnish", fil: "පිලිපීන / Filipino", he: "හීබ්\u200dරු / Hebrew", hr: "ක්\u200dරොඒශියානු / Croatian", hy: "ආර්මේනියානු / Armenian", id: "ඉන්දුනීසියානු / Indonesian", ka: "ජෝර්ජියානු / Georgian", kk: "කසාක් / Kazakh", km: "කමර් / Khmer", ko: "කොරියානු / Korean", ky: "කිර්ගිස් / Kyrgyz", lt: "ලිතුවේනියානු / Lithuanian", mk: "මැසිඩෝනියානු / Macedonian", ms: "මැලේ / Malay", ne: "නේපාල / Nepali", no: "නෝර්වේජියානු / Norwegian", "pt-BR": "පෘතුගීසි (බ්\u200dරසීලය) / Portuguese (Brazil)", sl: "ස්ලෝවේනියානු / Slovenian", tg: "ටජික් / Tajik", th: "තායි / Thai", vi: "වියට්නාම / Vietnamese", "zh-HK": "චීන (හොංකොං) / Chinese (Hong Kong)", "zh-TW": "චීන (තායිවානය) / Chinese (Taiwan)", sw: "ස්වාහිලි / Swahili", si: "සිංහල / Sinhala", ta: "දෙමළ / Tamil", bs: "බොස්නියානු / Bosnian" }, intention: { copy: "පිටපත් කරන්න", downloadBuffer: "ද්විමය බාගත කරන්න", setBuffer: "ද්විමය උඩුගත කරන්න", exportKeys: "යතුරු අපනයනය", exportAllKeys: (opts) => `සියලුම ${opts.count} යතුරු අපනයනය`, exportSearchResults: (opts) => `${opts.count} ප්‍රතිඵල අපනයනය`, importKeys: "යතුරු ආනයනය", saveWithFormatJson: "ආකෘතිය සමඟ සුරකින්න", formatJson: "Json ආකෘතිකරණය", wrap: "ඔතන්න", unwrap: "ලිහන්න", downloadJson: "JSON බාගත කරන්න", pubsubMonitor: "PubSub නිරීක්ෂකය", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "භාෂාව / Language", ok: "හරි", addKey: "මෙම යතුරට එක් කරන්න", addKeyRoot: "මූල යතුරක් එක් කරන්න", reloadKey: "යතුර නැවත පූරණය කරන්න", reload: "නැවත පූරණය", close: "වසන්න", commands: "විධාන", view: "බලන්න", statistics: "සංඛ්\u200dයාලේඛන", refresh: "නැවුම් කරන්න", pause: "විරාමය", resume: "නැවත ආරම්භ", clear: "මකන්න", rename: "නැවත නම් කරන්න", main: "දත්ත සමුදාය", cancel: "අවලංගු කරන්න", theme: "තේමාව", github: "GitHub", githubRepo: "ගබඩාව", githubRelease: "නිකුතු", githubChangelog: "වෙනස්කම් ලොගය", info: "Info", settings: "සැකසුම්", connect: "සම්බන්ධ වන්න", disconnect: "විසන්ධි කරන්න", overview: "දළ විශ්ලේෂණය", console: "කොන්සෝලය", noConnections: "සම්බන්ධතා නැත, සැකසුම් මෙනුවේ සම්බන්ධතාවයක් එක් කරන්න.", noConnectionsInSettings: "සම්බන්ධතා නැත, ඔබට ඉහළින් නව සම්බන්ධතාවයක් එක් කළ හැක.", connectionAdd: "නව සම්බන්ධතාවය", addGroup: "කණ්ඩායම එකතු කරන්න", extend: "පුළුල් කරන්න", collapse: "හකුළන්න", add: "එක් කරන්න", edit: "සංස්කරණය කරන්න", save: "සුරකින්න", ttl: "TTL සකසන්න", license: "බලපත්\u200dරය සකසන්න", delete: "මකන්න", remove: "ඉවත් කරන්න", sure: "විශ්වාසයි", testConnection: "සම්බන්ධතාවය පරීක්ෂා කරන්න", getKey: "Redis යතුර සහ ආශ්\u200dරිත දත්ත පූරණය වෙමින් ...", jsonViewShow: "JSON පෙන්වන්න", jsonViewEditor: "JSON සංස්කරණය", quickConsole: "ඉක්මන් කොන්සෝලය" }, label: { id: { nodeId: 'නෝඩ ID', id: "සම්බන්ධතා ID", info: "ඔබට sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa හි ගුණාංග වෙනස් කිරීමට අවශ්\u200dය නැතිනම්, කරුණාකර ගුණාංග අගයන් නොවෙනස්ව තැබීමට එම ගුණාංගවල සම්බන්ධතා ID ඇතුළත් කරන්න. නෝඩ මුරපදයේ එම තර්කනයම අවශ්\u200dය නම්, නෝඩ මුරපදයේ නෝඩ ID ඇතුළත් කරන්න." }, secureFeature: 'ඔබට P3X සමඟ ආරම්භ වන අගයක් පෙනෙන්නේ නම් සහ සියල්ල සමානව පෙනේ නම්, එය ආරක්ෂිත විශේෂාංගයකි. සැකසුම් වෙනස් කිරීමට, මෙම සැකසුම් හිස් හෝ වෙනත් දෙයකින් ආදේශ කරන්න, ඒවා සුරැකෙනු ඇත. ඔබ සැකසුම් වෙනස් නොකරන්නේ නම්, සැකසුම් සේවාදායකයේ ඇති ආකාරයටම පවතිනු ඇත.', ssh: { on: 'SSH සක්\u200dරීයයි', off: 'SSH අක්\u200dරීයයි', sshHost: 'SSH සත්කාරකය', sshPort: 'SSH පෝර්ටුව', sshUsername: 'SSH පරිශීලක නාමය', sshPassword: 'SSH මුරපදය', sshPrivateKey: 'SSH පෞද්ගලික යතුර' }, isBuffer: opts => `[object ArrayBuffer] යනු අගය ද්විමය දත්ත බව හෝ අගය ${opts.maxValueAsBuffer} ට වඩා විශාල බව අදහස් වේ`, streamValue: `ප්\u200dරවාහ ක්ෂේත්\u200dරය සහ අගය එක පේළියකි. උදා.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' යනු ස්වයංක්\u200dරීයව ජනනය කළ හෝ - ලෙස පිරිවිතර`, unableToLoadKey: ({ key }) => { return `මෙම යතුර පූරණය කළ නොහැක: ${key}. සමහර විට යතුර මකා දමා ඇත. නිවැරදි දෝෂය කොන්සෝලයේ ඇත.`; }, bigJson: "මෙම JSON වස්තුව 10 kb ට වඩා වැඩියි, එබැවින් ඔබ කරන දේ දන්නා බවට වග බලා ගන්න, මන්ද සමහර කාර්යයන් රෙන්ඩරින්ගේදී මන්දගාමී විය හැක.", addNode: "නෝඩයක් එක් කරන්න", validateJson: "JSON වලංගු කරන්න", reducedFunction: `අඩු කළ ක්\u200dරියාකාරිත්වය`, tooManyKeys: opts => { return `සම්පූර්ණ උපරිම කාර්යයන් සඳහා අවසර ලත් යතුරු මුළු ප්\u200dරමාණය ${opts.maxLightKeysCount} කි. මෙම දත්ත සමුදායේ අවසර ලත් මුළු යතුරු ${opts.count} ට වඩා ඇත. යතුරු වර්ග කිරීම සහ අමතර ගස් තොරතුරු අක්\u200dරීය කර ඇත. සෙවීම සේවාලාභියා වෙනුවට සේවාදායකයේ පමණක් සිදු වේ.`; }, redisCommandNotFound: "ගැළපෙන Redis විධානයක් හමු නොවීය ...", treeKeyStore: `වර්ග කිරීම (ස්වාභාවික සංසන්දනය) සේවාලාභියා එනම් බ්\u200dරව්සරයේ ක්\u200dරියාත්මක වේ, එනම් 10k යතුරු වැනි විශාල කට්ටල සඳහා දඬුවමක් ඇත, පිටු රෙන්ඩරින්ගට සුළු කාලයක් එකතු විය හැක. Redis තුළ යතුරු වර්ග කිරීමක් නැත, මේ ආකාරයට පමණයි.`, socketIoTimeout: options => { return `Socket.IO මෙම ඉල්ලීම සඳහා කල් ඉකුත් විය (උපරිම ${options.timeout / 1000} තත්පර) ...`; }, resizerInfo: options => { return `වම් හෝ දකුණු පැනලයේ අවම පළල ${options.width}px`; }, jsonViewNotParsable: "මෙම අගය JSON ලෙස විග්\u200dරහ කළ නොහැක ", ttlTitle: "TTL තත්පර වලින් සකසන්න", passwordSecure: "මුරපදය හිස් විය හැක, නමුත් තවමත් අක්ෂර පෙන්වනු ඇත, මෙය ආරක්ෂිත විශේෂාංගයකි.", tlsWithoutCert: "අමතර සහතිකයක් නොමැතිව TLS සක්\u200dරීය කරන්න", tlsRejectUnauthorized: "අනවසර සහතිකය ප්\u200dරතික්ෂේප කරන්න", tlsSecure: "ඔබට P3X සමඟ ආරම්භ වන TLS වින්\u200dයාසයක් පෙනෙන්නේ නම් හෝ සියලුම TLS සැකසුම් සමානව පෙනේ නම්, එය ආරක්ෂිත විශේෂාංගයකි. සැකසුම් වෙනස් කිරීමට, මෙම සැකසුම් හිස් හෝ වෙනත් දෙයකින් ආදේශ කරන්න, ඒවා සුරැකෙනු ඇත. ඔබ TLS සැකසුම් වෙනස් නොකරන්නේ නම්, සැකසුම් සේවාදායකයේ ඇති ආකාරයටම පවතිනු ඇත.", treeSeparatorEmpty: "ගස් වෙන්කරන්නා හිස් නම්, ගසට කැදැලි නෝඩ නොමැත, සරල ලැයිස්තුවක් පමණි", treeSeparatorEmptyNote: "කැදැලි නෝඩ නැත, සරල ලැයිස්තුවක් පමණි", welcomeConsole: "Redis කොන්සෝලයට සාදරයෙන් පිළිගනිමු", welcomeConsoleInfo: "කර්සරය ඉහළ හෝ පහළ ඉතිහාසය සක්\u200dරීය කර ඇත", redisListIndexInfo: "එකතු කිරීමට හිස්, -1 ආරම්භයට එක් කිරීමට හෝ පෙන්වා ඇති ස්ථානයට සුරකින්න.", console: "කොන්සෝලය", connectiondAdd: "සම්බන්ධතාවය එක් කරන්න", connectiondEdit: "සම්බන්ධතාවය සංස්කරණය කරන්න", connectiondView: "සම්බන්ධතාවය බලන්න", connections: "සම්බන්ධතා", licenseInfo: "බලපත්\u200dරය", licenseEditable: "බලපත්\u200dරය සංස්කරණය කළ හැක", licenseEditableYes: "ඔව්", licenseEditableNo: "නැත", licenseTerminalOnly: "බලපත්\u200dරය සේවාදායක පර්යන්තයෙන් පමණක් වින්\u200dයාස කළ හැක.", licenseTierPolicyTitle: "මට්ටම් ප්\u200dරතිපත්තිය", licenseTierPolicyText: "

නොමිලේ

මූලික Redis UI පමණි; SSH උමගක් නැත, කියවීම පමණක් සම්බන්ධතා ප්\u200dරකාරය නැත, Cluster/Sentinel නැත, JSON සංස්කරණය/ද්විමය උඩුගත/ද්විමය බාගත නැත, ReJSON නැත.
මිල: 0 HUF/මාසය (\u20ac0/මාසය).

Pro

SSH උමගක්, කියවීම පමණක් සම්බන්ධතා ප්\u200dරකාරය (--readonly-connections/-r ඇතුළුව), JSON සංස්කරණය, ද්විමය උඩුගත, ද්විමය බාගත, ReJSON.
මූලික මිල: 400 HUF/මාසය (\u20ac1/මාසය) හෝ 4,000 HUF/වසරකට (\u20ac10/වසරකට).
27% VAT සමඟ මුළු: 500 HUF/මාසය (\u20ac1.27/මාසය) හෝ 5,100 HUF/වසරකට (\u20ac12.70/වසරකට).

Enterprise

SSH උමගක්, Cluster සහ Sentinel, තවද JSON සංස්කරණය, ද්විමය උඩුගත, ද්විමය බාගත, ReJSON; --readonly-connections/-r ද ක්\u200dරියා කරයි.
මූලික මිල: 1,200 HUF/මාසය (\u20ac3/මාසය) හෝ 12,000 HUF/වසරකට (\u20ac30/වසරකට).
27% VAT සමඟ මුළු: 1,500 HUF/මාසය (\u20ac3.81/මාසය) හෝ 15,200 HUF/වසරකට (\u20ac38.10/වසරකට).

වාර්ෂික නියමය

වාර්ෂික මිල මාසික මිලේ 10x වේ.

ආසන

පෙරනිමි බලපත්\u200dරයට ආසන 5ක් ඇතුළත් වේ. ඔබට තවත් ආසන අවශ්\u200dය නම්, support@corifeus.com හරහා අපව සම්බන්ධ කර ගන්න.

Enterprise අත්හදා බැලීම

සැබෑ විද්\u200dයුත් තැපැල් ලිපිනයක් ඇති ඕනෑම කෙනෙකුට දින 10ක් නොමිලේ (පරීක්ෂණ විද්\u200dයුත් තැපෑල නොවේ).

විද්\u200dයුත් තැපෑලෙන් බිල්පත් තොරතුරු

නම, බිල්පත් විද්\u200dයුත් තැපෑල, රට කේතය, තැපැල් කේතය, නගරය, ලිපිනය, VAT ID (විකල්ප).

ගෙවීම

PayPal ගෙවීම HUF (forint) වලින් පමණක් ලබා ගත හැක; https://paypal.me/corifeus @ මුදල් යැවීමෙන් පසු මම ඔබට ඉන්වොයිසියක් එවන්නෙමි. සියලුම ගෙවීම් ආපසු නොගෙවේ.

VAT

VAT මිලට එකතු වේ (හංගේරියාවේ 27%).

සම්බන්ධ වන්න

ඔබට ආයුබෝවන් කීමට හෝ ප්\u200dරශ්නයක් ඇත්නම්, support@corifeus.com අමතන්න.

භාෂාව

ඉන්වොයිසිය සහ බලපත්\u200dර විද්\u200dයුත් තැපැල් සන්නිවේදනය ඉංග්\u200dරීසියෙන්. ඉන්වොයිසි මුදල් HUF.

සටහන

බලපත්\u200dර වලංගුකරණයට අන්තර්ජාල ප්\u200dරවේශය අවශ්\u200dයයි.", licenseState: "තත්ත්වය", licenseStateActive: "සක්\u200dරීය", licenseStateInactive: "අක්\u200dරීය", licenseStateNoLicense: "බලපත්\u200dරයක් නැත", licenseKeyMasked: "සුරකින ලද යතුර", licenseTier: "මට්ටම", licenseValid: "වලංගු", licenseStatus: "බලපත්\u200dර තත්ත්වය", licenseReason: "හේතුව", licenseCheckedAt: "පරීක්ෂා කළ වේලාව", licenseStartsAt: "ආරම්භ වේලාව", licenseExpiresAt: "කල් ඉකුත් වන වේලාව", licenseDaysLeft: "ඉතිරි දින", licenseMaxDevices: "උපරිම උපාංග", licenseActiveDevices: "සක්\u200dරීය උපාංග", licenseActiveDevicesInfo: "උපාංගයක් තවදුරටත් භාවිතා නොකරන්නේ නම්, එහි ආසනය මිනිත්තු 75කට පසු ස්වයංක්\u200dරීයව මුදා හරිනු ලැබේ.", licenseCustomerEmail: "පාරිභෝගික විද්\u200dයුත් තැපෑල", licenseFeatures: "විශේෂාංග", licenseFeaturesEmpty: "අමතර විශේෂාංග නැත", licenseFeatureReadonlyMode: "කියවීම පමණක් සම්බන්ධතා ප්\u200dරකාරය", licenseFeatureReadonlyConnectionsFlag: "කියවීම පමණක් සම්බන්ධතා (--readonly-connections/-r)", licenseFeatureSsh: "SSH උමගක්", licenseFeatureCluster: "Cluster සම්බන්ධතා", licenseFeatureSentinel: "Sentinel සම්බන්ධතා", licenseFeatureReJSON: "ReJSON (JSON දත්ත වර්ගය)", keysSort: { on: "යතුරු වර්ග කිරීම සක්\u200dරීයයි", off: "යතුරු වර්ග කිරීම අක්\u200dරීයයි" }, cluster: { on: "Cluster සක්\u200dරීයයි", off: "Cluster අක්\u200dරීයයි" }, sentinel: { on: "Sentinel සක්\u200dරීයයි", off: "Sentinel අක්\u200dරීයයි", name: "Sentinel නම" }, readonly: { on: "කියවීම පමණක් සක්\u200dරීයයි", off: "කියවීම පමණක් අක්\u200dරීයයි" }, proSshOnly: "SSH Pro හෝ Enterprise වලින් ලබා ගත හැක.", proReadonlyOnly: "කියවීම පමණක් සම්බන්ධතා ප්\u200dරකාරය Pro හෝ Enterprise වලින් ලබා ගත හැක.", enterpriseClusterSentinelOnly: "Cluster සහ Sentinel Enterprise වලින් පමණක් ලබා ගත හැක.", theme: { light: "ලා", dark: "අඳුරු enterprise", darkNeu: "අඳුරු", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `සම්බන්ධිතයි: ${opts.name}`; }, tree: "ගස", askAuth: "අවසරය ඉල්ලන්න", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "modules", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "විසන්ධි කරන්න", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis විධානය", ungrouped: "කණ්ඩායම් නොකළ", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "භාෂාව සොයන්න...", exportProgress: "යතුරු අපනයනය කරමින්...", importProgress: "යතුරු ආනයනය කරමින්...", importPreview: "පෙරදසුන", importOverwrite: "නැවත ලියන්න", importSkip: "මඟ හරින්න", importConflict: "යතුර දැනටමත් පවතී නම්:", noKeysToExport: "අපනයනය කිරීමට යතුරු නැත", time: "කාලය", loading: "පූරණය වෙමින්...", autoRefresh: "ස්වයං", exportSearchHint: "වත්මන් සෙවීමට ගැළපෙන යතුරු පමණක් අපනයනය කරයි", importSearchHint: "ආනයනය සෙවුම් ප්‍රතිඵලවලට පමණක් නොව සම්පූර්ණ දත්ත සමුදායට අදාළ වේ", importNoKeys: "ගොනුවේ යතුරු හමු නොවීය", }, status: { dataCopied: "දත්ත පසුරු පුවරුවේ ඇත", licenseSaved: "බලපත්\u200dරය සුරකින ලදී", exportDone: "අපනයනය සම්පූර්ණයි", indexCreated: "සුචිය සාදන ලදී", indexDropped: "සුචිය මකා දමන ලදී", importDone: (opts) => `ආනයනය සම්පූර්ණයි: ${opts.created} සාදන ලදී, ${opts.skipped} මඟ හැරිණි, ${opts.errors} දෝෂ`, nodeRemoved: "නෝඩය ඉවත් කරන ලදී", keyIsNotExisting: "මෙම යතුර මකා දමා හෝ කල් ඉකුත් වී ඇති විය හැක.", keyCount: opts => { if (opts.keyCount === 0) { return "යතුරක් නැත"; } else if (opts.keyCount === 1) { return "යතුරු 1"; } else { return `යතුරු ${opts.keyCount}`; } }, treeExpandAll: "සියලුම ගස් කොළ පුළුල් කරන්න. මෙම මෙහෙයුම මිල අධික විය හැකි අතර කාලය ගත විය හැක ...", noRedisKeys: "මෙම දත්ත සමුදායේ යතුරු නැත.", redisConnected: "Redis සාර්ථකව සම්බන්ධ විය", reloadingDataInfo: "Redis දත්ත තොරතුරු නැවත පූරණය වෙමින්", added: "එක් කරන ලදී", saved: "යාවත්කාලීන කරන ලදී", cancelled: "අවලංගු කරන ලදී", deleted: "මකන ලදී", savedRedis: "Redis දත්ත සුරකින ලදී", redisDisconnected: opts => { return `වත්මන් සම්බන්ධතාවයේ දෝෂයක් ඇති විය: ${opts.error.message}`; }, dbChanged: opts => { return `db දර්ශකය ${opts.db} ලෙස සකසන ලදී. `; }, treeDeleted: opts => { return `ගස් යතුර මකන ලදී (${opts.key}).`; }, deletedKey: opts => { return `යතුර මකන ලදී (${opts.key}).`; }, renamedKey: "මෙම යතුර නැවත නම් කරන ලදී", ttlChanged: "මෙම යතුරේ TTL වෙනස් කරන ලදී", notInteger: "මෙම ආදානය පූර්ණ සංඛ්\u200dයාවක් නොවේ", persisted: "මෙම යතුර සදාකාලිකව පවතී", set: "යතුර සකසන ලදී/එක් කරන ලදී" }, code: { "delete-connection": "මෙම සම්බන්ධතාවය මකා දමන ලදී, එබැවින් ඔබ මෙම Redis අවස්ථාවෙන් විසන්ධි වී ඇත.", "save-connection": "මෙම සම්බන්ධතාවය වෙනස් කරන ලදී, එබැවින් ඔබ මෙම Redis අවස්ථාවෙන් විසන්ධි වී ඇත. ඔබට නැවත සම්බන්ධ විය හැක.", "readonly-connections": "සම්බන්ධතා එක් කිරීම/සුරැකීම/මකා දැමීම කියවීම පමණි!", "readonly-connection-mode": "මෙම සම්බන්ධතාවය කියවීම පමණක් ප්\u200dරකාරයකි!", "list-out-of-bounds": "මෙම ලැයිස්තු දර්ශකය සීමාවෙන් පිටතය", "donation-ware-feature": "මෙම විශේෂාංගය පරිත්\u200dයාග අනුවාදයේ ඇත.", "feature-pro-readonly-required": "කියවීම පමණක් සම්බන්ධතා ප්\u200dරකාරයට Pro හෝ Enterprise බලපත්\u200dරයක් අවශ්\u200dයයි.", "feature-pro-ssh-required": "SSH උමගට Pro හෝ Enterprise බලපත්\u200dරයක් අවශ්\u200dයයි.", "feature-enterprise-cluster-sentinel-required": "Cluster සහ Sentinel සඳහා Enterprise බලපත්\u200dරයක් අවශ්\u200dයයි.", "feature-pro-json-binary-required": "JSON සංස්කරණය, ද්විමය උඩුගත සහ ද්විමය බාගත කිරීමට Pro හෝ Enterprise බලපත්\u200dරයක් අවශ්\u200dයයි.", "feature-pro-rejson-required": "ReJSON (JSON දත්ත වර්ගය) සඳහා Pro හෝ Enterprise බලපත්\u200dරයක් අවශ්\u200dයයි.", "invalid-json-value": "අගය වලංගු JSON නොවේ.", "http_auth_required": "අවසරය අවශ්\u200dයයි: කරුණාකර HTTP Basic Auth සමඟ සත්\u200dයාපනය කර නැවත පූරණය කරන්න.", "auto-connection-failed": "සම්බන්ධතාවය ඉවත් කර ඇති විය හැකි අතර ස්වයංක්\u200dරීය සම්බන්ධතාවය මේ නිසා අසාර්ථක විය.", invalid_console_command: "මෙම විධානය GUI හරහා ක්\u200dරියා නොකරයි." }, licenseReason: { LICENSE_VALID: "බලපත්\u200dරය වලංගුයි", LICENSE_INVALID: "බලපත්\u200dරය අවලංගුයි", LICENSE_MISSING: "බලපත්\u200dර යතුරක් සකසා නැත", LICENSE_DISABLED: "සේවාදායක වින්\u200dයාසයේ බලපත්\u200dරය අක්\u200dරීය කර ඇත", LICENSE_NOT_FOUND: "බලපත්\u200dරය හමු නොවීය", LICENSE_EXPIRED: "බලපත්\u200dරය කල් ඉකුත් වී ඇත", LICENSE_CLEARED: "බලපත්\u200dර යතුර ඉවත් කරන ලදී", LICENSE_MAX_DEVICES_REACHED: "උපරිම උපාංග ආසන සීමාවට ළඟා විය", PRODUCT_MISMATCH: "බලපත්\u200dර නිෂ්පාදනය නොගැළපේ" }, licenseStatusValue: { active: "සක්\u200dරීය", deleted: "මකන ලදී", all: "සියල්ල", expired: "කල් ඉකුත් වී ඇත", missing: "අතුරුදහන්", inactive: "අක්\u200dරීය" }, form: { error: { required: "අවශ්\u200dයයි", port: "පෝර්ටුව 1-65535 අතර විය යුතුය", invalid: "පෝරමය අවලංගුයි" }, connection: { label: { name: "නම", group: "Group", host: "සත්කාරක නම", port: "පෝර්ටුව", password: "මුරපදය", username: "පරිශීලක නාමය" } }, treeSettings: { maxValueDisplay: "උපරිම අගය පෙන්වීමේ දිග", maxValueDisplayInfo: "0 ලෙස සකසන්නේ නම්, සම්පූර්ණ අගයන් පෙන්වන්න. 0 ට වඩා වැඩි නම්, මෙම දිගට කපන්න. -1 නම්: තන්තු සඳහා, සංස්කරණය කරන තුරු අගය සඟවන්න; වෙනත් වර්ග සඳහා, සම්පූර්ණ අන්තර්ගතය පෙන්වන්න.", maxKeys: "උපරිම යතුරු ගණන", maxKeysInfo: "GUI කඩා නොවැටෙන පරිදි, අපි උපරිම යතුරු ගණන සීමා කරමු.", keyCount: () => { return `යතුරු ගණන: ${p3xr.state.keysRaw.length}`; }, label: { animation: "සජීවිකරණය භාවිතා කරන්න", noAnimation: "සජීවිකරණය නැත", jsonFormatTwoSpace: "හිස්තැන් 2 කින් JSON ආකෘතිකරණය", jsonFormatFourSpace: "හිස්තැන් 4 කින් JSON ආකෘතිකරණය", formName: "Redis සැකසුම්", searchModeClient: "සේවාලාභී සෙවුම් ප්\u200dරකාරය", searchModeServer: "සේවාදායක සෙවුම් ප්\u200dරකාරය", searchModeStartsWith: "ආරම්භ වන ප්\u200dරකාරයෙන් සොයන්න", searchModeIncludes: "ඇතුළත් වන ප්\u200dරකාරයෙන් සොයන්න" }, field: { treeSeparator: "ගස් වෙන්කරන්නා", treeSeparatorSelector: "ගස් වෙන්කරන්නා තෝරකය", page: "ගස් පිටු ගණන", keyPageCount: "යතුරු පිටු ගණන", keysSort: "යතුරු වර්ග කරන්න", searchMode: "සෙවුම් ප්\u200dරකාරය", searchModeStartsWith: "සෙවුම ආරම්භ වේ / ඇතුළත් වේ" }, error: { keyPageCount: "යතුරු පිටු ගණන 5 - 100 අතර පූර්ණ සංඛ්\u200dයාවක් විය යුතුය", page: "පිටු ගණන 10 - 5000 අතර පූර්ණ සංඛ්\u200dයාවක් විය යුතුය", maxValueDisplay: "උපරිම පෙන්වීමේ අගය -1 සහ 32768 අතර පූර්ණ සංඛ්\u200dයාවක් විය යුතුය", maxKeys: "උපරිම යතුරු ගණන 100 සහ 100000 අතර පූර්ණ සංඛ්\u200dයාවක් විය යුතුය" } }, key: { label: { formName: { add: "නව Redis යතුරක් එක් කරන්න", edit: "Redis යතුර සංස්කරණය කරන්න", append: "පවතින Redis යතුරට එක් කරන්න" } }, field: { streamTimestamp: "කාල මුද්\u200dරාව", key: "යතුර", type: "වර්ගය", index: "දර්ශකය", hashKey: "Hash යතුර", score: "ලකුණු", value: "අගය" }, error: { streamTimestamp: "කාල මුද්\u200dරාව අවශ්\u200dයයි, Redis ආකෘතිය හෝ * ලෙස", key: "යතුර අවම වශයෙන් එක් අක්ෂරයක් විය යුතුය", hashKey: "hash වගු යතුර අවම වශයෙන් එක් අක්ෂරයක් විය යුතුය", score: "වර්ග කළ කට්ටලයේ ලකුණු අවශ්\u200dයයි", value: "අගය අවශ්\u200dයයි" } }, main: { label: { database: "DB" } } }, page: { search: { title: "සොයන්න", index: "සුචිය", query: "විමසුම", results: "ප්‍රතිඵල", noIndex: "සුචි හමු නොවීය", createIndex: "සුචිය සාදන්න", dropIndex: "සුචිය මකන්න", indexInfo: "සුචි තොරතුරු", indexName: "සුචි නම", prefix: "යතුරු උපසර්ගය (විකල්ප)", fieldName: "ක්ෂේත්‍ර නම", }, monitor: { title: "අධීක්ෂණය", memory: "මතකය", opsPerSec: "මෙහෙයුම්/තත්පර", clients: "සේවාදායකයින්", blocked: "අවහිර", hitsMisses: "පහර අනුපාතය", networkIo: "ජාලය I/O", slowLog: "මන්දගාමී ලොගය", totalCommands: "මුළු", expired: "කල් ඉකුත්", evicted: "පිටුවහල්", clientList: "සේවාදායක ලැයිස්තුව", topKeys: "මතකය අනුව විශාලතම යතුරු", killClient: "සේවාදායකයා නැවැත්වීම", clientKilled: "සේවාදායකයා නැවැත්විණි", confirmKillClient: "මෙම සේවාදායකයා නැවැත්වීමට විශ්වාසද?", noKeys: "යතුරු නැත", noClients: "සේවාදායකයින් නැත", }, overview: { noConnected: "Redis වෙත සම්බන්ධතාවයක් නැත.", overviewClients: "සේවාලාභීන් ගණන අනුව සම්බන්ධිත ලැයිස්තුව", connectedCount: opt => { if (opt.length === 1) { return "සේවාලාභියෙක් 1"; } return `සේවාලාභීන් ${opt.length}`; } }, key: { label: { key: "යතුර", encoding: "සංකේතනය", length: "ප්\u200dරමාණය", ttl: "TTL", ttlTitle: "ජීවිත කාලය", type: "වර්ගය", ttlNotExpire: "කල් ඉකුත් නොවේ", lengthString: "බයිට්", lengthItem: "අයිතම", actions: "ක්\u200dරියා" }, list: { table: { index: "දර්ශකය", value: "අගය" } }, hash: { table: { hashkey: "Hash යතුර", value: "අගය" } }, set: { table: { value: "සාමාජිකයා" } }, zset: { table: { value: "සාමාජිකයා", score: "ලකුණු" } }, stream: { table: { timestamp: "කාල මුද්\u200dරා ID", field: "ක්ෂේත්\u200dරය", value: "අගය" } } }, treeControls: { settings: "ගස් සැකසුම්", expandAll: "සියල්ල පුළුල් කරන්න", collapseAll: "සියල්ල හකුළන්න", search: { search: "යතුරු තුළ සොයන්න", clear: "වත්මන් සෙවුම හිස් කිරීමට මකන්න", placeholderClient: "සේවාලාභී පැත්තෙන් සොයන්න", placeholderServer: "සේවාදායක පැත්තෙන් සොයන්න", info: "සේවාලාභී පැත්තේ සෙවුම යනු සෙවුම් ආදානයේ පෙළට ගැළපීමයි. සේවාදායක පැත්තේ සෙවුම යනු *{search-text}* ලෙස යතුරු රටා තුළ සෙවීමයි. විශාල සෙවුම් කට්ටල සඳහා, සේවාදායක පැත්තේ සෙවුම භාවිතා කිරීම වඩා හොඳය. කුඩා සෙවුම් කට්ටල සඳහා, සේවාලාභී පැත්තේ සෙවුම් ප්\u200dරකාරය භාවිතා කිරීම වඩා හොඳය." + ` යතුරු ගණන ${p3xr.settings.maxLightKeysCount} ට වඩා වැඩි නම්, ඔබට සේවාදායක පැත්තෙන් පමණක් සෙවිය හැක.`, largeSetInfo: "විශාල කට්ටලයක, සේවාලාභී පැත්තේ සෙවුම අක්\u200dරීය කර ඇත. එබැවින් දැන් සේවාදායක පැත්තේ සෙවුම පමණක් හැකිය.", infoDetails: "සෙවුම ක්\u200dරියා කරන ආකාරය දැන ගැනීමට, කරුණාකර සැකසුම් පරීක්ෂා කරන්න" }, pager: { next: "ඊළඟ", prev: "පෙර", first: "පළමු", last: "අවසාන" } } }, time: { loading: "පූරණය වෙමින්...", years: "අවුරුදු", months: "මාස", days: "දින", year: "අවුරුද්ද", month: "මාසය", day: "දිනය" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/sk/000077500000000000000000000000001517666434100137705ustar00rootroot00000000000000src/strings/sk/strings.js000066400000000000000000000665731517666434100160400ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licencia bola vymazana", invalid_license: "Neplatna licencia", license_max_devices_reached: "Dosiahnuty maximalny pocet zariadeni", license_readonly: "Licenciu je mozne zmenit iba z terminalu servera.", server_error: "Chyba servera, skuste to znovu" }, title: { donate: "Prispiet", jsonRecursive: "Rozbalujem vsetky listy", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Mozete si vybrat Redis pripojenie z menu vlavo dole.", statistics: "Statistiky", error: "Chyba", connectingRedis: "Pripajam sa k Redis ...", socketioConnectError: "Chyba Socket.IO", db: "DB", server: "Server", clients: "Klienti", memory: "Pamat", persistence: "Perzistencia", stats: "Statistiky", replication: "Replikacia", cpu: "CPU", cluster: "Cluster", modules: "Moduly", errorstats: "Štatistiky chýb", commandstats: "Štatistiky príkazov", latencystats: "Štatistiky latencie", keysizes: "Veľkosti kľúčov", threads: "Vlákna", }, confirm: { dropIndex: "Naozaj chcete zmazať tento index?", uploadBuffer: "Ste si isty, ze chcete nahrat tieto binarne data?", uploadBufferDone: "Binarne data boli nahrate", uploadBufferDoneAndSave: "Binarne data boli nahrate a ulozene na serveri", title: "Potvrdenie", alert: "Upozornenie", info: "Informacia", deleteListItem: "Ste si isty, ze chcete vymazat tuto polozku zoznamu?", deleteHashKey: "Ste si isty, ze chcete vymazat tento hash kluc?", deleteStreamTimestamp: "Ste si isty, ze chcete vymazat tuto casovu znacku streamu?", deleteSetMember: "Ste si isty, ze chcete vymazat tohto clena mnoziny?", deleteZSetMember: "Ste si isty, ze chcete vymazat tohto clena zoradenej mnoziny?", deleteConnection: "Potvrdenie", deleteConnectionText: "Ste si isty, ze chcete vymazat toto Redis pripojenie?", deleteNode: "Ste si isty, ze chcete vymazat tento Redis uzol?", deleteAllKeys: opts => { return `Vymazat tento strom a vsetky jeho kluce (${opts.key})?`; }, socketioConnectError: "Socket.IO sa nemoze pripojit k serveru, mozete znovu nacitat a skusit vyriesit chybu pripojenia sami, klient nevie ako ju vyriesit.", socketioAuthRequired: "Autorizacia Socket.IO je potrebna. Prosim autentifikujte sa cez HTTP Basic Auth (meno/heslo) a znovu nacitajte.", deleteKey: "Ste si isty, ze chcete vymazat tento kluc?", rename: { title: "Ste si isty, ze chcete premenovat tento kluc?", textContent: "Tato akcia kluc trvalo premenuje.", placeholder: "Redis kluc (povinne)" }, ttl: { title: "Ste si isty, ze chcete zmenit TTL tohto kluca?", textContent: "Zmena TTL aktualizuje dobu zivotnosti tohto kluca. Nechajte prazdne pre zachovanie kluca natrvalo.", placeholder: "TTL Redis kluca (cele cislo alebo prazdne)", placeholderPlaceholder: "Prazdne znamena, ze pretrvava navzdy; inak zadajte cele cislo.", convertTextToTime: "Konvertovat text na cas", convertTextToTimePlaceholder: "Napr. 1d bude 86400" }, license: { title: "Nastavit licenciu", textContent: "Ak chcete pouzivat platene funkcie, kontaktujte support@corifeus.com pre ziskanie licencie. Cena je Pro 400 HUF/mesiac (\u20AC1/mesiac) alebo 4 000 HUF/rok (\u20AC10/rok) a Enterprise 1 200 HUF/mesiac (\u20AC3/mesiac) alebo 12 000 HUF/rok (\u20AC30/rok). Rocna cena je 10x mesacnej. S 27% DPH su sumy Pro 500 HUF/mesiac (\u20AC1,27/mesiac) alebo 5 100 HUF/rok (\u20AC12,70/rok), Enterprise 1 500 HUF/mesiac (\u20AC3,81/mesiac) alebo 15 200 HUF/rok (\u20AC38,10/rok). Overenie licencie vyzaduje pristup na internet. Predvolena licencia zahrna 5 miest. Ak potrebujete viac miest, kontaktujte nas na support@corifeus.com.", placeholder: "Licencny kluc" } }, language: { bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 / Bulgarian", cs: "\u010Ce\u0161tina / Czech", de: "Deutsch / German", el: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC / Greek", en: "English", es: "Espa\u00F1ol / Spanish", fr: "Fran\u00E7ais / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "\u65E5\u672C\u8A9E / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Portugu\u00EAs / Portuguese", ro: "Rom\u00E2n\u0103 / Romanian", ru: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 / Russian", sk: "Sloven\u010Dina / Slovak", sr: "\u0421\u0440\u043F\u0441\u043A\u0438 / Serbian", sv: "Svenska / Swedish", tr: "T\u00FCrk\u00E7e / Turkish", uk: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 / Ukrainian", zn: "\u4E2D\u6587 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopirovat", downloadBuffer: "Stiahnut binarny subor", setBuffer: "Nahrat binarny subor", exportKeys: "Exportovať kľúče", exportAllKeys: (opts) => `Exportovať všetkých ${opts.count} kľúčov`, exportSearchResults: (opts) => `Exportovať ${opts.count} výsledkov`, importKeys: "Importovať kľúče", saveWithFormatJson: "Ulozit s formatovanim", formatJson: "Formatovat Json", wrap: "Zalamovať", unwrap: "Nezalamovať", downloadJson: "Stiahnuť JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Jazyk / Language", ok: "OK", addKey: "Pridat k tomuto klucu", addKeyRoot: "Pridat korenovy kluc", reloadKey: "Znovu nacitat kluc", reload: "Znovu nacitat", close: "Zavriet", commands: "Prikazy", view: "Zobrazenie", statistics: "Statistiky", refresh: "Obnovit", pause: "Pozastaviť", resume: "Pokračovať", clear: "Vymazat", rename: "Premenovat", main: "Databáza", cancel: "Zrusit", theme: "Tema", github: "GitHub", githubRepo: "Repozitar", githubRelease: "Vydania", githubChangelog: "Zaznam zmien", info: "Info", settings: "Nastavenia", connect: "Pripojit", disconnect: "Odpojit", overview: "Prehlad", console: "Konzola", noConnections: "Ziadne pripojenia, pridajte pripojenie v menu nastaveni.", noConnectionsInSettings: "Ziadne pripojenia, mozete pridat NOVE PRIPOJENIE vyssie.", connectionAdd: "Nove pripojenie", addGroup: "Pridať skupinu", extend: "Rozbalit", collapse: "Zbalit", add: "Pridat", edit: "Upravit", save: "Ulozit", ttl: "Nastavit TTL", license: "Nastavit licenciu", delete: "Vymazat", remove: "Odstranit", sure: "Iste", testConnection: "Otestovat pripojenie", getKey: "Nacitavam Redis kluc a prisluchajuce data ...", jsonViewShow: "Zobrazit JSON", jsonViewEditor: "Upravit JSON", quickConsole: "Rychla konzola" }, label: { id: { nodeId: 'ID uzla', id: "ID pripojenia", info: "Ak nechcete menit vlastnosti: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, prosim zadajte ID pripojenia do tychto vlastnosti, aby ste zachovali hodnoty. Ak chcete rovnaku logiku pre heslo uzla, zadajte ID uzla do hesla uzla." }, secureFeature: 'Ak vidite hodnotu, ktora zacina P3X a vyzera rovnako, je to bezpecnostna funkcia. Pre zmenu nastaveni jednoducho nahradte tieto nastavenia prazdnym retazcom alebo niecim inym a budu ulozene. Ak nastavenia nezmenite, zostanu tak ako su na serveri.', ssh: { on: 'SSH zapnute', off: 'SSH vypnute', sshHost: 'SSH host', sshPort: 'SSH port', sshUsername: 'SSH pouzivatelske meno', sshPassword: 'SSH heslo', sshPrivateKey: 'SSH sukromny kluc' }, isBuffer: opts => `[object ArrayBuffer] znamena, ze hodnota su binarne data alebo hodnota je vacsia ako ${opts.maxValueAsBuffer}`, streamValue: `Pole a hodnota streamu su na jednom riadku. Napr.: pole1 hodnota1 "pole 2" "hodnota 2"`, streamTimestampId: `'*' znamena automaticky generovane alebo specifikacia ako -`, unableToLoadKey: ({ key }) => { return `Nepodarilo sa nacitat tento kluc: ${key}. Je mozne, ze kluc bol vymazany. Presna chyba je v konzole.`; }, bigJson: "Tento JSON objekt ma viac ako 10 kb, uistite sa ze viete co robite, pretoze niektore funkcie mozu byt pomale pri vykreslovani.", addNode: "Pridat uzol", validateJson: "Overit JSON", reducedFunction: `Obmedzena funkcionalita`, tooManyKeys: opts => { return `Pre plnu maximalnu funkcionalitu je povoleny celkovy pocet klucov ${opts.maxLightKeysCount}. Tato databaza ma viac klucov nez je povolene, celkovo ${opts.count}. Triedenie klucov a doplnkove informacie v strome su vypnute. Vyhladavanie prebieha len na serveri namiesto klienta.`; }, redisCommandNotFound: "Nebol najdeny zodpovedajuci Redis prikaz ...", treeKeyStore: `Triedenie (prirodzene porovnanie) sa vykonava na klientovi (t.j. prehliadaci), co znamena, ze pre velke sady, ako napriklad viac ako 10k klucov, to moze pridat trochu casu k vykreslovaniu stranky. V Redis nie je triedenie klucov, iba takto.`, socketIoTimeout: options => { return `Socket.IO prekrocil casovy limit pre tuto poziadavku (max ${options.timeout / 1000} sekund) ...`; }, resizerInfo: options => { return `Minimalna sirka laveho alebo praveho panelu je ${options.width}px`; }, jsonViewNotParsable: "Tato hodnota nie je JSON parsovatelna ", ttlTitle: "Nastavte TTL v sekundach", passwordSecure: "Heslo moze byt prazdne, ale stale bude zobrazovat znaky, toto je bezpecnostna funkcia.", tlsWithoutCert: "Povolit TLS bez doplnkoveho certifikatu", tlsRejectUnauthorized: "Odmietnut neautorizovany certifikat", tlsSecure: "Ak vidite TLS konfiguraciu, ktora zacina P3X alebo vsetky TLS nastavenia vyzeraju rovnako, je to bezpecnostna funkcia. Pre zmenu nastaveni jednoducho nahradte tieto nastavenia prazdnym retazcom alebo niecim inym a budu ulozene. Ak nezmenite TLS nastavenia, zostanu tak ako su na serveri.", treeSeparatorEmpty: "Ak je separator stromu prazdny, strom nebude mat vnorene uzly, len cisty zoznam", treeSeparatorEmptyNote: "Ziadne vnorene uzly, len cisty zoznam", welcomeConsole: "Vitajte v Redis konzole", welcomeConsoleInfo: "Historia kurzoru HORE alebo DOLE je povolena", redisListIndexInfo: "Prazdne pre pridanie na koniec, -1 pre pridanie na zaciatok alebo ulozit na zobrazenej pozicii.", console: "Konzola", connectiondAdd: "Pridat pripojenie", connectiondEdit: "Upravit pripojenie", connectiondView: "Zobrazit pripojenie", connections: "Pripojenia", licenseInfo: "Licencia", licenseEditable: "Licencia upravitelna", licenseEditableYes: "Ano", licenseEditableNo: "Nie", licenseTerminalOnly: "Licenciu je mozne nastavit len z terminalu servera.", licenseTierPolicyTitle: "Politika urovni", licenseTierPolicyText: "

Free

iba zakladne Redis UI; bez SSH tunelovania, bez rezimu Readonly pripojenia, bez Cluster/Sentinel, bez Edit JSON/Upload binary/Download binary, bez ReJSON.
Cena: 0 HUF/mesiac (\u20AC0/mesiac).

Pro

SSH tunelovanie, rezim Readonly pripojenia (vratane --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Zakladna cena: 400 HUF/mesiac (\u20AC1/mesiac) alebo 4 000 HUF/rok (\u20AC10/rok).
Celkom s DPH 27%: 500 HUF/mesiac (\u20AC1,27/mesiac) alebo 5 100 HUF/rok (\u20AC12,70/rok).

Enterprise

SSH tunelovanie, Cluster a Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r tiez funguje.
Zakladna cena: 1 200 HUF/mesiac (\u20AC3/mesiac) alebo 12 000 HUF/rok (\u20AC30/rok).
Celkom s DPH 27%: 1 500 HUF/mesiac (\u20AC3,81/mesiac) alebo 15 200 HUF/rok (\u20AC38,10/rok).

Rocne pravidlo

Rocna cena je 10x mesacnej ceny.

Miesta

Predvolena licencia zahrna 5 miest. Ak potrebujete viac miest, kontaktujte nas na support@corifeus.com.

Enterprise skusobna doba

10 dni zadarmo pre kohokoolvek s realnou existujucou emailovou adresou (nie testovaci email).

Fakturacne udaje e-mailom

Meno, Fakturacny e-mail, Kod krajiny, PSC, Mesto, Adresa, IC DPH (volitelne).

Platba

Platba cez PayPal je dostupna len v HUF (forint); po odoslani penazi na https://paypal.me/corifeus vam poslem fakturu. Vsetky platby su nevratne.

DPH

DPH sa pripocitava k cene (27% v Madarsku).

Kontakt

Ak chcete pozdravit alebo mate otazku, kontaktujte support@corifeus.com.

Jazyk

Komunikacia ohladne faktur a licencii je v anglickom jazyku. Mena faktury je HUF.

Poznamka

Overenie licencie vyzaduje pristup na internet.", licenseState: "Stav", licenseStateActive: "Aktivna", licenseStateInactive: "Neaktivna", licenseStateNoLicense: "Bez licencie", licenseKeyMasked: "Ulozeny kluc", licenseTier: "Uroven", licenseValid: "Platna", licenseStatus: "Stav licencie", licenseReason: "Dovod", licenseCheckedAt: "Overene", licenseStartsAt: "Zacina", licenseExpiresAt: "Konci", licenseDaysLeft: "Zostava dni", licenseMaxDevices: "Max. zariadeni", licenseActiveDevices: "Aktivne zariadenia", licenseActiveDevicesInfo: "Ak sa zariadenie uz nepouziva, jeho miesto sa automaticky uvolni po 75 minutach.", licenseCustomerEmail: "Email zakaznika", licenseFeatures: "Funkcie", licenseFeaturesEmpty: "Ziadne doplnkove funkcie", licenseFeatureReadonlyMode: "Rezim pripojenia len na citanie", licenseFeatureReadonlyConnectionsFlag: "Pripojenia len na citanie (--readonly-connections/-r)", licenseFeatureSsh: "SSH tunelovanie", licenseFeatureCluster: "Cluster pripojenia", licenseFeatureSentinel: "Sentinel pripojenia", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Triedenie klucov zapnute", off: "Triedenie klucov vypnute" }, cluster: { on: "Cluster zapnuty", off: "Cluster vypnuty" }, sentinel: { on: "Sentinel zapnuty", off: "Sentinel vypnuty", name: "Nazov Sentinel" }, readonly: { on: "Len na citanie zapnute", off: "Len na citanie vypnute" }, proSshOnly: "SSH je dostupne v Pro alebo Enterprise.", proReadonlyOnly: "Rezim pripojenia len na citanie je dostupny v Pro alebo Enterprise.", enterpriseClusterSentinelOnly: "Cluster a Sentinel su dostupne len v Enterprise.", theme: { light: "Svetla", dark: "Tmava enterprise", darkNeu: "Tmava", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Pripojene: ${opts.name}`; }, tree: "Strom", askAuth: "Poziadat o autorizaciu", keyboardShortcuts: "Klávesové skratky", about: "O aplikácii", supportedLanguages: "Podporované jazyky", version: "Verzia", redisVersion: "Verzia Redis", modules: "Moduly", shortcutRefresh: "Obnoviť", shortcutSearch: "Zamerať vyhľadávanie", shortcutNewKey: "Nový kľúč", shortcutDisconnect: "Odpojit", themeAuto: "Automaticky (systém)", shortcutCommandPalette: "Paleta príkazov", commandPalette: "Paleta príkazov", noResults: "Žiadne výsledky", redisCommandsReference: "Redis Príkazy", ungrouped: "Bez skupiny", grouped: "Zoskupené", connectFirst: "Najprv sa pripojte k serveru Redis", searchLanguage: "Hľadať jazyk...", exportProgress: "Exportovanie kľúčov...", importProgress: "Importovanie kľúčov...", importPreview: "Náhľad", importOverwrite: "Prepísať", importSkip: "Preskočiť", importConflict: "Ak kľúč už existuje:", noKeysToExport: "Žiadne kľúče na export", time: "Čas", loading: "Načítavanie...", autoRefresh: "Auto", exportSearchHint: "Exportujú sa iba kľúče zodpovedajúce aktuálnemu vyhľadávaniu", importSearchHint: "Import sa vzťahuje na celú databázu, nielen na výsledky vyhľadávania", importNoKeys: "V súbore neboli nájdené žiadne kľúče", }, status: { dataCopied: "Data su v schranke", licenseSaved: "Licencia ulozena", exportDone: "Export dokončený", indexCreated: "Index vytvorený", indexDropped: "Index zmazaný", importDone: (opts) => `Import dokončený: ${opts.created} vytvorených, ${opts.skipped} preskočených, ${opts.errors} chýb`, nodeRemoved: "Uzol bol odstraneny", keyIsNotExisting: "Tento kluc mohol byt vymazany alebo vyprsal.", keyCount: opts => { if (opts.keyCount === 0) { return "Ziadny kluc"; } else if (opts.keyCount === 1) { return "1 kluc"; } else { return `${opts.keyCount} klucov`; } }, treeExpandAll: "Rozbalit vsetky listy stromu. Tato operacia moze byt narocna a moze trvat ...", noRedisKeys: "V tejto databaze nie su ziadne kluce.", redisConnected: "Redis uspesne pripojeny", reloadingDataInfo: "Znovu nacitavam informacie o Redis datach", added: "Pridane", saved: "Aktualizovane", cancelled: "Zrusene", deleted: "Vymazane", savedRedis: "Redis data boli ulozene", redisDisconnected: opts => { return `Sucasne pripojenie malo chybu: ${opts.error.message}`; }, dbChanged: opts => { return `Index databazy bol nastaveny na ${opts.db}. `; }, treeDeleted: opts => { return `Kluc stromu bol vymazany (${opts.key}).`; }, deletedKey: opts => { return `Kluc bol vymazany (${opts.key}).`; }, renamedKey: "Tento kluc bol premenovany", ttlChanged: "TTL tohto kluca bol zmeneny", notInteger: "Tento vstup nie je cele cislo", persisted: "Tento kluc pretrva navzdy", set: "Kluc bol nastaveny/pridany" }, code: { "delete-connection": "Toto pripojenie bolo vymazane, takze ste odpojeny od tejto Redis instancie.", "save-connection": "Toto pripojenie bolo zmenene, takze ste odpojeny od tejto Redis instancie. Mozete sa znovu pripojit.", "readonly-connections": "Pridavanie/ukladanie/mazanie pripojeni je len na citanie!", "readonly-connection-mode": "Toto pripojenie je v rezime len na citanie!", "list-out-of-bounds": "Index tohto zoznamu je mimo rozsah", "donation-ware-feature": "Tato funkcia je pritomna v darovanej verzii.", "feature-pro-readonly-required": "Rezim pripojenia len na citanie vyzaduje licenciu Pro alebo Enterprise.", "feature-pro-ssh-required": "SSH tunelovanie vyzaduje licenciu Pro alebo Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster a Sentinel vyzaduju licenciu Enterprise.", "feature-pro-json-binary-required": "Edit JSON, Upload binary a Download binary vyzaduju licenciu Pro alebo Enterprise.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Autorizacia potrebna: prosim autentifikujte sa cez HTTP Basic Auth a znovu nacitajte.", "auto-connection-failed": "Je mozne, ze pripojenie bolo odstranene a automaticke pripojenie zlyhalo z tohto dovodu.", invalid_console_command: "Tento prikaz nefunguje cez GUI." }, licenseReason: { LICENSE_VALID: "Licencia je platna", LICENSE_INVALID: "Licencia je neplatna", LICENSE_MISSING: "Ziadny licencny kluc nie je nastaveny", LICENSE_DISABLED: "Licencia je vypnuta v konfiguraci servera", LICENSE_NOT_FOUND: "Licencia nebola najdena", LICENSE_EXPIRED: "Licencia vyprsala", LICENSE_CLEARED: "Licencny kluc bol vymazany", LICENSE_MAX_DEVICES_REACHED: "Dosiahnuty maximalny pocet zariadeni", PRODUCT_MISMATCH: "Produkt licencie sa nezhoduje" }, licenseStatusValue: { active: "Aktivna", deleted: "Vymazana", all: "Vsetky", expired: "Vyprsana", missing: "Chyba", inactive: "Neaktivna" }, form: { error: { required: "Povinne", port: "Port je medzi 1-65535", invalid: "Formular je neplatny" }, connection: { label: { name: "Nazov", group: "Skupina", host: "Nazov hostu", port: "Port", password: "Heslo", username: "Pouzivatelske meno" } }, treeSettings: { maxValueDisplay: "Maximalna dlzka zobrazenia hodnoty", maxValueDisplayInfo: "Ak je nastavene na 0, zobrazi uplne hodnoty. Ak je vacsie ako 0, skrati na tuto dlzku. Ak je -1: pre retazce skryje hodnotu az do upravy; pre ostatne typy zobrazi uplny obsah.", maxKeys: "Maximalny pocet klucov", maxKeysInfo: "Aby GUI nespadlo, obmedzujeme maximalny pocet klucov.", keyCount: () => { return `Pocet klucov: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Pouzit animaciu", noAnimation: "Bez animacie", jsonFormatTwoSpace: "Formatovat JSON s 2 medzerami", jsonFormatFourSpace: "Formatovat JSON so 4 medzerami", formName: "Nastavenia Redis", searchModeClient: "Rezim vyhladavania na klientovi", searchModeServer: "Rezim vyhladavania na serveri", searchModeStartsWith: "Vyhladavanie zacina na", searchModeIncludes: "Vyhladavanie obsahuje" }, field: { treeSeparator: "Separator stromu", treeSeparatorSelector: "Volba separatora stromu", page: "Pocet strankovania stromu", keyPageCount: "Pocet strankovania klucov", keysSort: "Triedit kluce", searchMode: "Rezim vyhladavania", searchModeStartsWith: "Vyhladavanie zacina na / obsahuje" }, error: { keyPageCount: "Pocet strankovania klucov musi byt cele cislo medzi 5 - 100", page: "Pocet strankovania musi byt cele cislo medzi 10 - 5000", maxValueDisplay: "Maximalna hodnota zobrazenia musi byt cele cislo medzi -1 a 32768", maxKeys: "Maximalny pocet klucov musi byt cele cislo medzi 100 a 100000" } }, key: { label: { formName: { add: "Pridat novy Redis kluc", edit: "Upravit Redis kluc", append: "Pridat k existujucemu Redis klucu" } }, field: { streamTimestamp: "Casova znacka", key: "Kluc", type: "Typ", index: "Index", hashKey: "Hash kluc", score: "Skore", value: "Hodnota" }, error: { streamTimestamp: "Casova znacka je povinna, bud vo formate Redis alebo ako *", key: "Kluc ma aspon jeden znak", hashKey: "Hash kluc tabulky ma aspon jeden znak", score: "Skore zoradenej mnoziny je povinne", value: "Hodnota je povinna" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Hľadať", index: "Index", query: "Dopyt", results: "Výsledky", noIndex: "Žiadne indexy", createIndex: "Vytvoriť index", dropIndex: "Zmazať index", indexInfo: "Info o indexe", indexName: "Názov indexu", prefix: "Prefix kľúča (voliteľné)", fieldName: "Názov poľa", }, monitor: { title: "Monitorovanie", memory: "Pamäť", opsPerSec: "Operácií/s", clients: "Klienti", blocked: "Blokovaní", hitsMisses: "Úspešnosť", networkIo: "Sieť I/O", slowLog: "Pomalý log", totalCommands: "Celkom", expired: "Vypršané", evicted: "Vyradené", clientList: "Zoznam klientov", topKeys: "Najväčšie kľúče podľa pamäte", killClient: "Zabiť klienta", clientKilled: "Klient zabitý", confirmKillClient: "Naozaj chcete ukončiť tohto klienta?", noKeys: "Žiadne kľúče", noClients: "Žiadni klienti", }, overview: { noConnected: "Nie je ziadne pripojenie k Redis.", overviewClients: "Zoznam pripojenych podla poctu klientov", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klientov`; } }, key: { label: { key: "Kluc", encoding: "Kodovanie", length: "Velkost", ttl: "TTL", ttlTitle: "Doba zivotnosti", type: "Typ", ttlNotExpire: "nevyprsi", lengthString: "bajtov", lengthItem: "poloziek", actions: "Akcie" }, list: { table: { index: "Index", value: "Hodnota" } }, hash: { table: { hashkey: "Hash kluc", value: "Hodnota" } }, set: { table: { value: "Clen" } }, zset: { table: { value: "Clen", score: "Skore" } }, stream: { table: { timestamp: "ID casovej znacky", field: "Pole", value: "Hodnota" } } }, treeControls: { settings: "Nastavenia stromu", expandAll: "Rozbalit vsetko", collapseAll: "Zbalit vsetko", search: { search: "Hladat v klucoch", clear: "Vymazat aktualne vyhladavanie", placeholderClient: "Hladat na strane klienta", placeholderServer: "Hladat na strane servera", info: "Vyhladavanie na strane klienta znamena, ze sa text porovnava so vstupom vyhladavania. Vyhladavanie na strane servera znamena, ze sa hladaju vzory v klucoch ako *{hladany-text}*. Pre velke sady vyhladavania je lepsie pouzit vyhladavanie na serveri. Pre mensie sady je lepsie pouzit vyhladavanie na klientovi." + ` Ak pocet klucov presahuje ${p3xr.settings.maxLightKeysCount}, mozete hladat iba na serveri.`, largeSetInfo: "Vo velkej sade je vyhladavanie na strane klienta vypnute, takze momentalne je mozne iba vyhladavanie na serveri.", infoDetails: "Ak chcete zistit ako vyhladavanie funguje, skontrolujte nastavenia" }, pager: { next: "Dalsi", prev: "Predchadzajuci", first: "Prvy", last: "Posledny" } } }, time: { loading: "Načítavanie...", years: "rokov", months: "mesiacov", days: "dni", year: "rok", month: "mesiac", day: "den" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/sl/000077500000000000000000000000001517666434100137715ustar00rootroot00000000000000src/strings/sl/strings.js000066400000000000000000000675171517666434100160400ustar00rootroot00000000000000const strings = { error: { cleared_license: "Preverjena licenca", invalid_license: "Neveljavna licenca", license_max_devices_reached: "Doseženo je največje število sedežev v napravi", license_readonly: "Licenco je mogoče spremeniti samo s strežniškega terminala.", server_error: "Napaka strežnika, poskusite znova" }, title: { donate: "Donirajte", jsonRecursive: "Razširitev vseh listov", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "V levem spodnjem meniju lahko izberete povezavo Redis za povezavo.", statistics: "Statistika", error: "Napaka", connectingRedis: "Povezovanje z Redis ...", socketioConnectError: "Socket.IO Napaka", db: "DB", server: "Strežnik", clients: "Stranke", memory: "Spomin", persistence: "Vztrajnost", stats: "Statistika", replication: "Replikacija", cpu: "CPU", cluster: "Cluster", modules: "Moduli", errorstats: "Statistike napak", commandstats: "Statistike ukazov", latencystats: "Statistike zakasnitev", keysizes: "Velikosti ključev", threads: "Niti", }, confirm: { dropIndex: "Ali ste prepričani, da želite izbrisati ta indeks?", uploadBuffer: "Ali ste prepričani, da želite naložiti te binarne podatke?", uploadBufferDone: "Binarni podatki so naloženi", uploadBufferDoneAndSave: "Binarni podatki se naložijo in shranijo na strežnik", title: "Potrdi", alert: "Opozorilo", info: "Informacije", deleteListItem: "Ali ste prepričani, da želite izbrisati ta element seznama?", deleteHashKey: "Ali ste prepričani, da želite izbrisati ta element zgoščenega ključa?", deleteStreamTimestamp: "Ali ste prepričani, da želite izbrisati ta časovni žig toka?", deleteSetMember: "Ali ste prepričani, da želite izbrisati tega člana niza?", deleteZSetMember: "Ali ste prepričani, da želite izbrisati ta razvrščeni član niza?", deleteConnection: "Potrdi", deleteConnectionText: "Ali ste prepričani, da želite izbrisati to povezavo Redis?", deleteNode: "Ali ste prepričani, da želite izbrisati to vozlišče Redis?", deleteAllKeys: opts => { return `Izbriši to drevo in vse njegove ključe (${opts.key})?`; }, socketioConnectError: "Socket.IO se ne more povezati s strežnikom, lahko znova naložite in poskusite sami odpraviti napako povezave, odjemalec ne ve, kako bi jo rešil sam.", socketioAuthRequired: "Zahtevana je avtorizacija Socket.IO. Preverite pristnost z HTTP Basic Auth (uporabniško ime/geslo) in znova naložite.", deleteKey: "Ali ste prepričani, da želite izbrisati ta ključ?", rename: { title: "Ali ste prepričani, da želite preimenovati ta ključ?", textContent: "To dejanje trajno preimenuje ključ.", placeholder: "Ključ Redis (obvezno)" }, ttl: { title: "Ali ste prepričani, da želite spremeniti TTL tega ključa?", textContent: "Spreminjanje TTL posodobi čas delovanja tega ključa. Pustite prazno, da obdržite ta ključ za vedno.", placeholder: "TTL ključa Redis (celo število ali prazno)", placeholderPlaceholder: "Prazno pomeni, da traja večno; drugače vnesite celo število.", convertTextToTime: "Pretvori besedilo v čas", convertTextToTimePlaceholder: "Npr. 1d bo 86400" }, license: { title: "Nastavite licenco", textContent: "Če želite uporabljati plačljive funkcije, se obrnite na support@corifeus.com in zahtevajte licenco. Cena je Pro 400 HUF/mesec (1 €/mesec) ali 4.000 HUF/leto (10 €/leto), Enterprise pa 1.200 HUF/mesec (3 €/mesec) ali 12.000 HUF/leto (30 €/leto). Letno je 10x mesečno. S 27 % VAT je skupni znesek Pro 500 HUF/mesec (1,27 €/mesec) ali 5100 HUF/leto (12,70 €/leto), Enterprise 1500 HUF/mesec (3,81 €/mesec) ali 15.200 HUF/leto (38,10 €/leto). Za preverjanje licence je potreben dostop do interneta. Privzeta licenca vključuje 5 sedežev. Če potrebujete več sedežev, nas kontaktirajte na support@corifeus.com.", placeholder: "Licenčni ključ" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiraj", downloadBuffer: "Prenesite binarno datoteko", setBuffer: "Naloži dvojiško datoteko", exportKeys: "Izvozi ključe", exportAllKeys: (opts) => `Izvozi vseh ${opts.count} ključev`, exportSearchResults: (opts) => `Izvozi ${opts.count} rezultatov`, importKeys: "Uvozi ključe", saveWithFormatJson: "Shrani z obliko", formatJson: "Format Json", wrap: "Ovitek", unwrap: "Odvij", downloadJson: "Prenesite JSON", pubsubMonitor: "Monitor PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Jezik", ok: "OK", addKey: "Dodajte temu ključu", addKeyRoot: "Dodajte korenski ključ", reloadKey: "Ključ za ponovno nalaganje", reload: "Ponovno naloži", close: "Zapri", commands: "Ukazi", view: "Pogled", statistics: "Statistika", refresh: "Osveži", pause: "Premor", resume: "Nadaljuj", clear: "jasno", rename: "Preimenuj", main: "Podatkovna baza", cancel: "Prekliči", theme: "Tema", github: "GitHub", githubRepo: "Repozitorij", githubRelease: "Izdaje", githubChangelog: "Dnevnik sprememb", info: "Info", settings: "nastavitve", connect: "Povežite se", disconnect: "Prekini povezavo", overview: "Pregled", console: "Konzola", noConnections: "Brez povezav, dodajte povezavo v meniju z nastavitvami.", noConnectionsInSettings: "Ni povezav, zgoraj lahko dodate NOVO POVEZAVO.", connectionAdd: "Nova povezava", addGroup: "Dodaj skupino", extend: "Podaljšaj", collapse: "Strni", add: "Dodaj", edit: "Uredi", save: "Shrani", ttl: "Nastavite TTL", license: "Nastavite licenco", delete: "Izbriši", remove: "Odstrani", sure: "seveda", testConnection: "Testna povezava", getKey: "Nalaganje ključa Redis in povezanih podatkov ...", jsonViewShow: "Prikaz JSON", jsonViewEditor: "Uredi JSON", quickConsole: "Hitra konzola", }, label: { id: { nodeId: "ID vozlišča", id: "ID povezave", info: "Če ne želite spremeniti lastnosti: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, vnesite ID povezave v te lastnosti, da ohranite vrednosti lastnosti nedotaknjene. Če želite isto logiko v geslu vozlišča, potem vnesite ID vozlišča v geslo vozlišča." }, secureFeature: "Če vidite vrednost, ki se začne s P3X in izgleda enako, je to varna funkcija. Če želite spremeniti nastavitve, le zamenjajte te nastavitve s praznimi ali s čim drugim in shranjene bodo. Če nastavitev ne spremenite, bodo nastavitve ohranjene takšne, kot so na strežniku.", ssh: { on: "SSH vklopljen", off: "SSH izklopljen", sshHost: "Gostitelj SSH", sshPort: "Vrata SSH", sshUsername: "SSH uporabniško ime", sshPassword: "SSH geslo", sshPrivateKey: "SSH zasebni ključ" }, isBuffer: opts => `[objekt ArrayBuffer] pomeni, da je vrednost binarni podatek ali da je vrednost večja od ${opts.maxValueAsBuffer}`, streamValue: `Polje in vrednost toka sta ena vrstica. Npr.: polje1 vrednost1 "polje 2" "vrednost 2"`, streamTimestampId: `'*' pomeni samodejno ustvarjeno ali specifikacijo kot -`, unableToLoadKey: ({ key }) => { return `Tega ključa ni mogoče naložiti: ${key}. Mogoče je bil ključ izbrisan. Natančna napaka je v konzoli.`; }, bigJson: "Ta objekt JSON je večji od 10 kb, zato se prepričajte, da veste, kaj počnete, saj se lahko nekatere funkcije upodabljajo počasi.", addNode: "Dodaj vozlišče", validateJson: "Potrdite JSON", reducedFunction: `Zmanjšana funkcionalnost`, tooManyKeys: opts => { return `Za polne največje dovoljene funkcije je skupno število ključev ${opts.maxLightKeysCount} štetje. Ta baza podatkov ima skupno več kot dovoljene ključe ${opts.count}. Razvrščanje po ključu in dodatne modne informacije o drevesu so onemogočene. Iskanje se dogaja samo na strežniku namesto iskanja odjemalca.`; }, redisCommandNotFound: "Ujemanje z ukazom Redis ni bilo najdeno ...", treeKeyStore: `Razvrščanje (naravna primerjava) se izvaja na odjemalcu ali brskalniku, kar pomeni, da ima kazen za velike velike nize, kot je več kot 10.000 ključev, lahko doda malo časa upodabljanju strani. V Redis ni razvrščanja po ključu, samo tako.`, socketIoTimeout: options => { return `Socket.IO je potekla za to zahtevo (maks ${options.timeout / 1000} sekund) ...`; }, resizerInfo: options => { return `Najmanjša širina leve ali desne plošče je ${options.width}px`; }, jsonViewNotParsable: "Te vrednosti JSON ni mogoče razčleniti ", ttlTitle: "Nastavite TTL v nekaj sekundah", passwordSecure: "Geslo bo morda prazno, vendar bodo še vedno prikazani znaki, to je varnostna funkcija.", tlsWithoutCert: "Omogoči TLS brez dodatnega potrdila", tlsRejectUnauthorized: "Zavrni nepooblaščeno potrdilo", tlsSecure: "Če vidite konfiguracijo TLS, ki se začne s P3X ali so vse nastavitve TLS videti enake, je to varna funkcija. Če želite spremeniti nastavitve, le zamenjajte te nastavitve s praznimi ali s čim drugim in shranjene bodo. Če nastavitev TLS ne spremenite, bodo nastavitve ohranjene takšne, kot so na strežniku.", treeSeparatorEmpty: "Če je ločilo dreves prazno, drevo ne bo imelo ugnezdenih vozlišč, le čisti seznam", treeSeparatorEmptyNote: "Brez ugnezdenih vozlišč, samo čisti seznam", welcomeConsole: "Dobrodošli v konzoli Redis", welcomeConsoleInfo: "Zgodovina kazalca GOR ali DOL je omogočena", redisListIndexInfo: "Prazno za dodajanje, -1 za dodajanje pred ali shranjevanje na prikazano mesto.", console: "Konzola", connectiondAdd: "Dodajte povezavo", connectiondEdit: "Uredi povezavo", connectiondView: "Ogled povezave", connections: "Povezave", licenseInfo: "Licenca", licenseEditable: "Licenco je mogoče urejati", licenseEditableYes: "ja", licenseEditableNo: "št", licenseTerminalOnly: "Licenco je mogoče konfigurirati samo s strežniškega terminala.", licenseTierPolicyTitle: "Politika stopnje", licenseTierPolicyText: "

Free

core Redis Samo uporabniški vmesnik; brez tuneliranja SSH, brez načina povezave samo za branje, brez Cluster/Sentinel, brez urejanja JSON/Naloži binarno/Prenesi binarno, ne ReJSON.
Cena: 0 HUF/mesec (0 €/mesec).

Pro

SSH tuneliranje, način povezave samo za branje (vključno --readonly-connections/-r), Urejanje JSON, Naloži binarno, Prenesi binarno, ReJSON.
Osnovna cena: 400 HUF/mesec (1€/mesec) ali 4.000 HUF/leto (10 €/leto).
Skupaj s 27 % VAT: 500 HUF/mesec (1,27 €/mesec) ali 5.100 HUF/leto (12,70 €/leto).

Enterprise

SSH tuneliranje, Cluster in Sentinel, plus Uredi JSON, Naloži binarno, Prenesi binarno, ReJSON; Deluje tudi --readonly-connections/-r.
Osnovna cena: 1.200 HUF/mesec (3 €/mesec) ali 12.000 HUF/leto (30 €/leto).
Skupaj s 27 % VAT: 1.500 HUF/mesec (3,81 €/mesec) ali 15.200 HUF/leto (38,10 €/leto).

Letno pravilo

Letna cena je 10-kratna mesečna cena.

Sedeži

Privzeta licenca vključuje 5 sedežev. Če potrebujete več sedežev, nas kontaktirajte na support@corifeus.com.

Enterprise trial

10 dni brezplačno za vsakogar z resničnim obstoječim e-poštnim naslovom (nepreizkusni e-poštni naslov).

Informacije za obračun v e-pošti

Ime, E-pošta za obračun, Državna številka, Poštna številka, Mesto, Naslov, VAT ID (neobvezno).

Plačilo

PayPal plačilo je na voljo samo v HUF (forint); po pošiljanju denarja @ https://paypal.me/corifeus vam bom poslal račun. Vsa plačila so nepovratna.

VAT

VAT je prištet k ceni (27 % v Madžarska).

Stik

Če želite pozdraviti ali imate vprašanje, kontaktirajte support@corifeus.com.

Language

E-poštna komunikacija na računih in licencah je v angleščini. Valuta računa je HUF.

Note

Za preverjanje veljavnosti licence je potreben dostop do interneta.", licenseState: "Država", licenseStateActive: "Aktiven", licenseStateInactive: "Neaktiven", licenseStateNoLicense: "Brez licence", licenseKeyMasked: "Shranjen ključ", licenseTier: "Stopnja", licenseValid: "Veljavno", licenseStatus: "Stanje licence", licenseReason: "Razlog", licenseCheckedAt: "Preverjeno pri", licenseStartsAt: "Začne se ob", licenseExpiresAt: "Poteče ob", licenseDaysLeft: "Ostali dnevi", licenseMaxDevices: "Največ naprav", licenseActiveDevices: "Aktivne naprave", licenseActiveDevicesInfo: "Če naprave ne uporabljate več, se njen sedež samodejno sprosti po 75 minutah.", licenseCustomerEmail: "E-pošta stranke", licenseFeatures: "Lastnosti", licenseFeaturesEmpty: "Brez dodatnih funkcij", licenseFeatureReadonlyMode: "Način povezave samo za branje", licenseFeatureReadonlyConnectionsFlag: "Povezave samo za branje (--readonly-connections/-r)", licenseFeatureSsh: "SSH tuneliranje", licenseFeatureCluster: "Cluster povezave", licenseFeatureSentinel: "Sentinel povezave", licenseFeatureReJSON: "ReJSON (podatkovni tip JSON)", keysSort: { on: "Razvrščanje ključev vklopljeno", off: "Razvrščanje ključev izklopljeno" }, cluster: { on: "Cluster vklopljen", off: "Cluster izklopljen" }, sentinel: { on: "Sentinel vklopljen", off: "Sentinel izklopljen", name: "Ime Sentinel" }, readonly: { on: "Vklopljeno samo za branje", off: "Samo za branje izklopljeno" }, proSshOnly: "SSH je na voljo v različici Pro ali Enterprise.", proReadonlyOnly: "Način povezave samo za branje je na voljo v različicah Pro ali Enterprise.", enterpriseClusterSentinelOnly: "Cluster in Sentinel sta na voljo samo v Enterprise.", theme: { light: "Svetloba", dark: "Temno podjetje", darkNeu: "Temno", darkoBluo: "Darko bluo", enterprise: "Podjetje", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Povezan: ${opts.name}`; }, tree: "Drevo", askAuth: "Vprašajte za avtorizacijo", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduli", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Prekini povezavo", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis Ukazi", ungrouped: "Brez skupine", grouped: "Grouped", connectFirst: "Najprej se povežite s strežnikom Redis", searchLanguage: "Išči jezik...", exportProgress: "Izvažanje ključev...", importProgress: "Uvažanje ključev...", importPreview: "Predogled", importOverwrite: "Prepiši", importSkip: "Preskoči", importConflict: "Če ključ že obstaja:", noKeysToExport: "Ni ključev za izvoz", time: "Čas", loading: "Nalaganje...", autoRefresh: "Auto", exportSearchHint: "Izvažajo se samo ključi, ki ustrezajo trenutnemu iskanju", importSearchHint: "Uvoz se nanaša na celotno bazo podatkov, ne le na rezultate iskanja", importNoKeys: "V datoteki ni bilo najdenih ključev", }, status: { dataCopied: "Podatki so v odložišču", licenseSaved: "Licenca shranjena", exportDone: "Izvoz zaključen", indexCreated: "Indeks ustvarjen", indexDropped: "Indeks izbrisan", importDone: (opts) => `Uvoz zaključen: ${opts.created} ustvarjenih, ${opts.skipped} preskočenih, ${opts.errors} napak`, nodeRemoved: "Vozlišče odstranjeno", keyIsNotExisting: "Ta ključ je morda izbrisan ali potekel.", keyCount: opts => { if (opts.keyCount === 0) { return "Brez ključa"; } else if (opts.keyCount === 1) { return "1 ključ"; } else { return `${opts.keyCount} ključi`; } }, treeExpandAll: "Razširite vse drevesne liste. Ta operacija je lahko draga in lahko traja dolgo ...", noRedisKeys: "V tej bazi podatkov ni ključev.", redisConnected: "Redis povezava je bila uspešna", reloadingDataInfo: "Ponovno nalaganje informacij o podatkih Redis", added: "Dodano", saved: "Posodobljeno", cancelled: "Preklicano", deleted: "Izbrisano", savedRedis: "Podatki Redis so shranjeni", redisDisconnected: opts => { return `Trenutna povezava je imela napako: ${opts.error.message}`; }, dbChanged: opts => { return `Indeks db nastavljen na ${opts.db}. `; }, treeDeleted: opts => { return `Ključ drevesa je bil izbrisan (${opts.key}).`; }, deletedKey: opts => { return `Ključ je bil izbrisan (${opts.key}).`; }, renamedKey: "Ta ključ je bil preimenovan", ttlChanged: "TTL tega ključa je bil spremenjen", notInteger: "Ta vnos ni celo število", persisted: "Ta ključ se ohrani za vedno", set: "Ključ je nastavljen/dodan" }, code: { "delete-connection": "Ta povezava je bila izbrisana, zato ste prekinjeni s tem primerkom Redis.", "save-connection": "Ta povezava je bila spremenjena, zato ste prekinjeni s tem primerkom Redis. Lahko se znova povežete.", "readonly-connections": "Dodajanje/shranjevanje/brisanje povezav je samo za branje!", "readonly-connection-mode": "Ta povezava je način samo za branje!", "list-out-of-bounds": "Indeks tega seznama je izven meja", "donation-ware-feature": "Ta funkcija je prisotna v različici za donacije.", "feature-pro-readonly-required": "Način povezave samo za branje zahteva licenco Pro ali Enterprise.", "feature-pro-ssh-required": "SSH tuneliranje zahteva licenco Pro ali Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster in Sentinel zahtevata licenco Enterprise.", "feature-pro-json-binary-required": "Urejanje JSON, Nalaganje binarne datoteke in Prenos binarne datoteke zahtevata licenco Pro ali Enterprise.", "feature-pro-rejson-required": "ReJSON (podatkovni tip JSON) zahteva licenco Pro ali Enterprise.", "invalid-json-value": "Vrednost ni veljavna JSON.", "http_auth_required": "Zahtevana avtorizacija: preverite pristnost z HTTP Basic Auth in znova naložite.", "auto-connection-failed": "Mogoče je bila povezava odstranjena in samodejna povezava zaradi tega ni uspela.", invalid_console_command: "Ta ukaz ne deluje prek GUI." }, licenseReason: { LICENSE_VALID: "Licenca velja", LICENSE_INVALID: "Licenca je neveljavna", LICENSE_MISSING: "Licenčni ključ ni nastavljen", LICENSE_DISABLED: "Licenca je onemogočena v konfiguraciji strežnika", LICENSE_NOT_FOUND: "Licenca ni bila najdena", LICENSE_EXPIRED: "Licenca je potekla", LICENSE_CLEARED: "Licenčni ključ je bil izbrisan", LICENSE_MAX_DEVICES_REACHED: "Doseženo je največje število sedežev v napravi", PRODUCT_MISMATCH: "Licenčni izdelek se ne ujema" }, licenseStatusValue: { active: "Aktiven", deleted: "Izbrisano", all: "Vse", expired: "potekel", missing: "manjka", inactive: "Neaktiven" }, form: { error: { required: "Obvezno", port: "Pristanišče je med 1-65535", invalid: "Obrazec je neveljaven" }, connection: { label: { name: "Ime", group: "Group", host: "Ime gostitelja", port: "Pristanišče", password: "Geslo", username: "Uporabniško ime" } }, treeSettings: { maxValueDisplay: "Največja dolžina niza prikaza vrednosti", maxValueDisplayInfo: "Če je nastavljeno na 0, prikaži celotne vrednosti. Če je večji od 0, ga skrajšajte na to dolžino. Če -1: za nize skrije vrednost do urejanja; za druge vrste pokaži celotno vsebino.", maxKeys: "Največje število ključev", maxKeysInfo: "Da se GUI ne zruši, omejimo največje število ključev.", keyCount: () => { return `Število ključev: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Uporabite animacijo", noAnimation: "Brez animacije", jsonFormatTwoSpace: "Oblika JSON z 2 presledkoma", jsonFormatFourSpace: "Oblika JSON s 4 presledki", formName: "nastavitve Redis", searchModeClient: "Način iskanja strank", searchModeServer: "Način iskanja strežnika", searchModeStartsWith: "Iskanje z se začne z načinom", searchModeIncludes: "Iskanje vključuje način" }, field: { treeSeparator: "Ločevalec dreves", treeSeparatorSelector: "Izbirnik drevesnega ločila", page: "Število stranskih strani dreves", keyPageCount: "Število stranskih ključev", keysSort: "Razvrsti ključe", searchMode: "Način iskanja", searchModeStartsWith: "Iskanje se začne z / vključuje" }, error: { keyPageCount: "Število ključnih strani mora biti celo število med 5 in 100", page: "Število strani mora biti celo število med 10 in 5000", maxValueDisplay: "Največja prikazana vrednost mora biti celo število med -1 in 32768", maxKeys: "Največja vrednost števila ključev mora biti celo število med 100 in 100000" } }, key: { label: { formName: { add: "Dodajte nov ključ Redis", edit: "Uredi ključ Redis", append: "Dodaj obstoječemu ključu Redis" } }, field: { streamTimestamp: "Časovni žig", key: "Ključ", type: "Vrsta", index: "Kazalo", hashKey: "Hash ključ", score: "rezultat", value: "Vrednost" }, error: { streamTimestamp: "Potreben je časovni žig v obliki Redis ali kot *", key: "Ključ je vsaj en znak", hashKey: "Ključ razpršilne tabele je vsaj en znak", score: "Potreben je razvrščen rezultat niza", value: "Vrednost je obvezna" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Iskanje", index: "Indeks", query: "Poizvedba", results: "Rezultati", noIndex: "Indeksov ni", createIndex: "Ustvari indeks", dropIndex: "Izbriši indeks", indexInfo: "Info o indeksu", indexName: "Ime indeksa", prefix: "Predpona ključa (neobvezno)", fieldName: "Ime polja", }, monitor: { title: "Nadzor", memory: "Pomnilnik", opsPerSec: "Operacij/s", clients: "Odjemalci", blocked: "Blokirani", hitsMisses: "Stopnja zadetkov", networkIo: "Omrežje I/O", slowLog: "Počasen dnevnik", totalCommands: "Skupaj", expired: "Potekli", evicted: "Izgnani", clientList: "Seznam odjemalcev", topKeys: "Največji ključi po pomnilniku", killClient: "Ubij odjemalca", clientKilled: "Odjemalec ubit", confirmKillClient: "Ali ste prepričani, da želite ustaviti tega odjemalca?", noKeys: "Ni ključev", noClients: "Ni odjemalcev", }, overview: { noConnected: "Ni povezave z Redis.", overviewClients: "Navedite povezane po številu strank", connectedCount: opt => { if (opt.length === 1) { return "1 stranka"; } return `${opt.length} stranke`; } }, key: { label: { key: "Ključ", encoding: "Kodiranje", length: "Velikost", ttl: "TTL", ttlTitle: "Čas za življenje", type: "Vrsta", ttlNotExpire: "ne poteče", lengthString: "bajtov", lengthItem: "predmete", actions: "Dejanja" }, list: { table: { index: "Kazalo", value: "Vrednost" } }, hash: { table: { hashkey: "Hashkey", value: "Vrednost" } }, set: { table: { value: "član" } }, zset: { table: { value: "član", score: "rezultat" } }, stream: { table: { timestamp: "ID časovnega žiga", field: "Polje", value: "Vrednost" } } }, treeControls: { settings: "Nastavitve drevesa", expandAll: "Razširi vse", collapseAll: "Strni vse", search: { search: "Išči v ključih", clear: "Počistite trenutno iskanje, da nastavite prazno", placeholderClient: "Iskanje na strani odjemalca", placeholderServer: "Iskanje na strani strežnika", info: "Iskanje na strani odjemalca pomeni, da se ujema z besedilom v iskalnem vnosu. Iskanje na strani strežnika pomeni, da je podobno iskanju v vzorcih ključev kot *{search-text}*. Za velike iskalne nize je bolje uporabiti iskanje na strani strežnika. Za manjše iskalne nize je bolje uporabiti način iskanja na strani odjemalca." + ` Če je štetja ključev konec ${p3xr.settings.maxLightKeysCount}, lahko iš��ete samo na strani strežnika.`, largeSetInfo: "V velikem nizu je iskanje na strani odjemalca onemogočeno. tako da je trenutno možno samo iskanje na strani strežnika.", infoDetails: "Če želite izvedeti, kako iskanje deluje, preverite nastavitve" }, pager: { next: "Naprej", prev: "Prejšnja", first: "najprej", last: "Zadnji" } } }, time: { loading: "Nalaganje...", years: "leta", months: "mesecih", days: "dni", year: "leto", month: "mesec", day: "dan" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/sr/000077500000000000000000000000001517666434100137775ustar00rootroot00000000000000src/strings/sr/strings.js000066400000000000000000002164361517666434100160420ustar00rootroot00000000000000const strings = { error: { cleared_license: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D\u0430", invalid_license: "\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0430", license_max_devices_reached: "\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0443\u0440\u0435\u0452\u0430\u0458\u0430", license_readonly: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0441\u0435 \u043C\u043E\u0436\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u0441\u0430\u043C\u043E \u0438\u0437 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", server_error: "\u0413\u0440\u0435\u0448\u043A\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043C\u043E\u043B\u0438\u043C\u043E \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E" }, title: { donate: "\u0414\u043E\u043D\u0430\u0446\u0438\u0458\u0430", jsonRecursive: "\u041F\u0440\u043E\u0448\u0438\u0440\u0438\u0432\u0430\u045A\u0435 \u0441\u0432\u0438\u0445 \u0433\u0440\u0430\u043D\u0430", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "\u041C\u043E\u0436\u0435\u0442\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u0442\u0438 Redis \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443 \u0437\u0430 \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u0438\u0437 \u043C\u0435\u043D\u0438\u0458\u0430 \u0434\u043E\u043B\u0435 \u043B\u0435\u0432\u043E.", statistics: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", error: "\u0413\u0440\u0435\u0448\u043A\u0430", connectingRedis: "\u041F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u0430 Redis ...", socketioConnectError: "\u0413\u0440\u0435\u0448\u043A\u0430 Socket.IO", db: "\u0411\u0414", server: "\u0421\u0435\u0440\u0432\u0435\u0440", clients: "\u041A\u043B\u0438\u0458\u0435\u043D\u0442\u0438", memory: "\u041C\u0435\u043C\u043E\u0440\u0438\u0458\u0430", persistence: "\u041F\u0435\u0440\u0437\u0438\u0441\u0442\u0435\u043D\u0446\u0438\u0458\u0430", stats: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", replication: "\u0420\u0435\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430", cpu: "CPU", cluster: "Cluster", modules: "Модулi", errorstats: "Статистика грешака", commandstats: "Статистика команди", latencystats: "Статистика кашњења", keysizes: "Величине кључева", threads: "Нити", }, confirm: { dropIndex: "Да ли сте сигурни да желите да обришете овај индекс?", uploadBuffer: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043F\u0440\u0435\u043C\u0438\u0442\u0435 \u043E\u0432\u0435 \u0431\u0438\u043D\u0430\u0440\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435?", uploadBufferDone: "\u0411\u0438\u043D\u0430\u0440\u043D\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u043E\u0442\u043F\u0440\u0435\u043C\u0459\u0435\u043D\u0438", uploadBufferDoneAndSave: "\u0411\u0438\u043D\u0430\u0440\u043D\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u043E\u0442\u043F\u0440\u0435\u043C\u0459\u0435\u043D\u0438 \u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443", title: "\u041F\u043E\u0442\u0432\u0440\u0434\u0430", alert: "\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435", info: "\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430", deleteListItem: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0443 \u0441\u0442\u0430\u0432\u043A\u0443 \u043B\u0438\u0441\u0442\u0435?", deleteHashKey: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0430\u0458 \u0445\u0435\u0448 \u043A\u0459\u0443\u0447?", deleteStreamTimestamp: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0443 \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0443 \u043E\u0437\u043D\u0430\u043A\u0443 \u0441\u0442\u0440\u0438\u043C\u0430?", deleteSetMember: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u043E\u0433 \u0447\u043B\u0430\u043D\u0430 \u0441\u043A\u0443\u043F\u0430?", deleteZSetMember: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u043E\u0433 \u0447\u043B\u0430\u043D\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u043D\u043E\u0433 \u0441\u043A\u0443\u043F\u0430?", deleteConnection: "\u041F\u043E\u0442\u0432\u0440\u0434\u0430", deleteConnectionText: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0443 Redis \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443?", deleteNode: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0430\u0458 Redis \u0447\u0432\u043E\u0440?", deleteAllKeys: opts => { return `\u041E\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u043E\u0432\u043E \u0441\u0442\u0430\u0431\u043B\u043E \u0438 \u0441\u0432\u0435 \u045A\u0435\u0433\u043E\u0432\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0435 (${opts.key})?`; }, socketioConnectError: "Socket.IO \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u0432\u0435\u0436\u0435 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0442\u0438 \u0434\u0430 \u0440\u0435\u0448\u0438\u0442\u0435 \u0433\u0440\u0435\u0448\u043A\u0443 \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0430 \u0441\u0430\u043C\u0438, \u043A\u043B\u0438\u0458\u0435\u043D\u0442 \u043D\u0435 \u0437\u043D\u0430 \u043A\u0430\u043A\u043E \u0434\u0430 \u0458\u0435 \u0440\u0435\u0448\u0438.", socketioAuthRequired: "\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u0430 \u0458\u0435 Socket.IO \u0430\u0443\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0458\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0442\u0435 \u0441\u0435 \u043F\u0443\u0442\u0435\u043C HTTP Basic Auth (\u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435/\u043B\u043E\u0437\u0438\u043D\u043A\u0430) \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458\u0442\u0435.", deleteKey: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447?", rename: { title: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0435\u0442\u0435 \u043E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447?", textContent: "\u041E\u0432\u0430 \u0440\u0430\u0434\u045A\u0430 \u0442\u0440\u0430\u0458\u043D\u043E \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0435 \u043A\u0459\u0443\u0447.", placeholder: "Redis \u043A\u0459\u0443\u0447 (\u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E)" }, ttl: { title: "\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 TTL \u043E\u0432\u043E\u0433 \u043A\u0459\u0443\u0447\u0430?", textContent: "\u041F\u0440\u043E\u043C\u0435\u043D\u0430 TTL-\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430 \u0432\u0440\u0435\u043C\u0435 \u0436\u0438\u0432\u043E\u0442\u0430 \u043E\u0432\u043E\u0433 \u043A\u0459\u0443\u0447\u0430. \u041E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043F\u0440\u0430\u0437\u043D\u043E \u0437\u0430 \u0442\u0440\u0430\u0458\u043D\u043E \u0447\u0443\u0432\u0430\u045A\u0435 \u043A\u0459\u0443\u0447\u0430.", placeholder: "TTL Redis \u043A\u0459\u0443\u0447\u0430 (\u0446\u0435\u043E \u0431\u0440\u043E\u0458 \u0438\u043B\u0438 \u043F\u0440\u0430\u0437\u043D\u043E)", placeholderPlaceholder: "\u041F\u0440\u0430\u0437\u043D\u043E \u0437\u043D\u0430\u0447\u0438 \u0434\u0430 \u0442\u0440\u0430\u0458\u0435 \u0437\u0430\u0443\u0432\u0435\u043A; \u0438\u043D\u0430\u0447\u0435 \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u0446\u0435\u043E \u0431\u0440\u043E\u0458.", convertTextToTime: "\u041F\u0440\u0435\u0442\u0432\u043E\u0440\u0438 \u0442\u0435\u043A\u0441\u0442 \u0443 \u0432\u0440\u0435\u043C\u0435", convertTextToTimePlaceholder: "\u041D\u043F\u0440. 1d \u045B\u0435 \u0431\u0438\u0442\u0438 86400" }, license: { title: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443", textContent: "\u0410\u043A\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043F\u043B\u0430\u045B\u0435\u043D\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0435, \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0438\u0440\u0430\u0458\u0442\u0435 support@corifeus.com \u0437\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0443. \u0426\u0435\u043D\u0430 \u0458\u0435 Pro 400 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC1/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 4.000 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC10/\u0433\u043E\u0434\u0438\u0448\u045A\u0435), \u0438 Enterprise 1.200 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC3/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 12.000 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC30/\u0433\u043E\u0434\u0438\u0448\u045A\u0435). \u0413\u043E\u0434\u0438\u0448\u045A\u0430 \u0446\u0435\u043D\u0430 \u0458\u0435 10x \u043C\u0435\u0441\u0435\u0447\u043D\u0435. \u0421\u0430 \u041F\u0414\u0412-\u043E\u043C 27%, \u0443\u043A\u0443\u043F\u043D\u043E Pro 500 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC1,27/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 5.100 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC12,70/\u0433\u043E\u0434\u0438\u0448\u045A\u0435), Enterprise 1.500 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC3,81/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 15.200 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC38,10/\u0433\u043E\u0434\u0438\u0448\u045A\u0435). \u0412\u0430\u043B\u0438\u0434\u0430\u0446\u0438\u0458\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0443. \u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0430 \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0435 5 \u043C\u0435\u0441\u0442\u0430. \u0410\u043A\u043E \u0432\u0430\u043C \u0442\u0440\u0435\u0431\u0430 \u0432\u0438\u0448\u0435 \u043C\u0435\u0441\u0442\u0430, \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u0430\u0441 \u043D\u0430 support@corifeus.com.", placeholder: "\u041B\u0438\u0446\u0435\u043D\u0446\u043D\u0438 \u043A\u0459\u0443\u0447" } }, language: { bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 / Bulgarian", cs: "\u010Ce\u0161tina / Czech", de: "Deutsch / German", el: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC / Greek", en: "English", es: "Espa\u00F1ol / Spanish", fr: "Fran\u00E7ais / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "\u65E5\u672C\u8A9E / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Portugu\u00EAs / Portuguese", ro: "Rom\u00E2n\u0103 / Romanian", ru: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 / Russian", sk: "Sloven\u010Dina / Slovak", sr: "\u0421\u0440\u043F\u0441\u043A\u0438 / Serbian", sv: "Svenska / Swedish", tr: "T\u00FCrk\u00E7e / Turkish", uk: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 / Ukrainian", zn: "\u4E2D\u6587 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "\u041A\u043E\u043F\u0438\u0440\u0430\u0458", downloadBuffer: "\u041F\u0440\u0435\u0443\u0437\u043C\u0438 \u0431\u0438\u043D\u0430\u0440\u043D\u043E", setBuffer: "\u041E\u0442\u043F\u0440\u0435\u043C\u0438 \u0431\u0438\u043D\u0430\u0440\u043D\u043E", exportKeys: "Извези кључеве", exportAllKeys: (opts) => `Извези свих ${opts.count} кључева`, exportSearchResults: (opts) => `Извези ${opts.count} резултата`, importKeys: "Увези кључеве", saveWithFormatJson: "\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u043E\u043C", formatJson: "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u0458 Json", wrap: "Преламање", unwrap: "Без преламања", downloadJson: "Преузми JSON", pubsubMonitor: "\u041C\u043E\u043D\u0438\u0442\u043E\u0440 PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "\u0408\u0435\u0437\u0438\u043A / Language", ok: "\u041E\u041A", addKey: "\u0414\u043E\u0434\u0430\u0458 \u043E\u0432\u043E\u043C \u043A\u0459\u0443\u0447\u0443", addKeyRoot: "\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u0440\u0435\u043D\u0441\u043A\u0438 \u043A\u0459\u0443\u0447", reloadKey: "\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u043A\u0459\u0443\u0447", reload: "\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458", close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438", commands: "\u041A\u043E\u043C\u0430\u043D\u0434\u0435", view: "\u041F\u0440\u0438\u043A\u0430\u0437", statistics: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", refresh: "\u041E\u0441\u0432\u0435\u0436\u0438", pause: "Пауза", resume: "Настави", clear: "\u041E\u0447\u0438\u0441\u0442\u0438", rename: "\u041F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458", main: "\u041F\u043E\u0447\u0435\u0442\u043D\u0430", cancel: "\u041E\u0442\u043A\u0430\u0436\u0438", theme: "\u0422\u0435\u043C\u0430", github: "GitHub", githubRepo: "\u0420\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0458\u0443\u043C", githubRelease: "\u0418\u0437\u0434\u0430\u045A\u0430", githubChangelog: "\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430", info: "Info", settings: "\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430", connect: "\u041F\u043E\u0432\u0435\u0436\u0438", disconnect: "\u041E\u0434\u0432\u043E\u0458\u0438", overview: "\u041F\u0440\u0435\u0433\u043B\u0435\u0434", console: "\u041A\u043E\u043D\u0437\u043E\u043B\u0430", noConnections: "\u041D\u0435\u043C\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430, \u0434\u043E\u0434\u0430\u0458\u0442\u0435 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443 \u0443 \u043C\u0435\u043D\u0438\u0458\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430.", noConnectionsInSettings: "\u041D\u0435\u043C\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430, \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u041D\u041E\u0412\u0423 \u041A\u041E\u041D\u0415\u041A\u0426\u0418\u0408\u0423 \u0438\u0437\u043D\u0430\u0434.", connectionAdd: "\u041D\u043E\u0432\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430", addGroup: "Додај групу", extend: "\u041F\u0440\u043E\u0448\u0438\u0440\u0438", collapse: "\u0421\u043A\u0443\u043F\u0438", add: "\u0414\u043E\u0434\u0430\u0458", edit: "\u0423\u0440\u0435\u0434\u0438", save: "\u0421\u0430\u0447\u0443\u0432\u0430\u0458", ttl: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438 TTL", license: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443", delete: "\u041E\u0431\u0440\u0438\u0448\u0438", remove: "\u0423\u043A\u043B\u043E\u043D\u0438", sure: "\u0421\u0438\u0433\u0443\u0440\u043D\u043E", testConnection: "\u0422\u0435\u0441\u0442\u0438\u0440\u0430\u0458 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443", getKey: "\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 Redis \u043A\u0459\u0443\u0447\u0430 \u0438 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 ...", jsonViewShow: "\u041F\u0440\u0438\u043A\u0430\u0436\u0438 JSON", jsonViewEditor: "\u0423\u0440\u0435\u0434\u0438 JSON", quickConsole: "\u0411\u0440\u0437\u0430 \u043A\u043E\u043D\u0437\u043E\u043B\u0430" }, label: { id: { nodeId: 'ID \u0447\u0432\u043E\u0440\u0430', id: "ID \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435", info: "\u0410\u043A\u043E \u043D\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043C\u0435\u045A\u0430\u0442\u0435 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, \u043C\u043E\u043B\u0438\u043C\u043E \u0443\u043D\u0435\u0441\u0438\u0442\u0435 ID \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 \u0443 \u0442\u0430 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043B\u0438 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. \u0410\u043A\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u0438\u0441\u0442\u0443 \u043B\u043E\u0433\u0438\u043A\u0443 \u0437\u0430 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0447\u0432\u043E\u0440\u0430, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 ID \u0447\u0432\u043E\u0440\u0430 \u0443 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0447\u0432\u043E\u0440\u0430." }, secureFeature: '\u0410\u043A\u043E \u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043A\u043E\u0458\u0430 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430 P3X \u0438 \u0438\u0437\u0433\u043B\u0435\u0434\u0430 \u0438\u0441\u0442\u043E, \u0442\u043E \u0458\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0417\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430, \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u0435 \u043E\u0432\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043F\u0440\u0430\u0437\u043D\u0438\u043C \u0438\u043B\u0438 \u043D\u0435\u0447\u0438\u043C \u0434\u0440\u0443\u0433\u0438\u043C \u0438 \u0431\u0438\u045B\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. \u0410\u043A\u043E \u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430, \u043E\u043D\u0430 \u045B\u0435 \u043E\u0441\u0442\u0430\u0442\u0438 \u043A\u0430\u043A\u0432\u0430 \u0458\u0435\u0441\u0443 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443.', ssh: { on: 'SSH \u0443\u043A\u0459\u0443\u0447\u0435\u043D', off: 'SSH \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D', sshHost: 'SSH \u0445\u043E\u0441\u0442', sshPort: 'SSH \u043F\u043E\u0440\u0442', sshUsername: 'SSH \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435', sshPassword: 'SSH \u043B\u043E\u0437\u0438\u043D\u043A\u0430', sshPrivateKey: 'SSH \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0438 \u043A\u0459\u0443\u0447' }, isBuffer: opts => `[object ArrayBuffer] \u0437\u043D\u0430\u0447\u0438 \u0434\u0430 \u0458\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0431\u0438\u043D\u0430\u0440\u043D\u0438 \u043F\u043E\u0434\u0430\u0442\u0430\u043A \u0438\u043B\u0438 \u0458\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0432\u0435\u045B\u0430 \u043E\u0434 ${opts.maxValueAsBuffer}`, streamValue: `\u041F\u043E\u0459\u0435 \u0438 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0441\u0442\u0440\u0438\u043C\u0430 \u0441\u0443 \u0443 \u0458\u0435\u0434\u043D\u043E\u043C \u0440\u0435\u0434\u0443. \u041D\u043F\u0440.: \u043F\u043E\u0459\u04351 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u04421 "\u043F\u043E\u0459\u0435 2" "\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 2"`, streamTimestampId: `'*' \u0437\u043D\u0430\u0447\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0441\u0430\u043D\u043E \u0438\u043B\u0438 \u0441\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u043A\u0430\u043E -`, unableToLoadKey: ({ key }) => { return `\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447: ${key}. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0458\u0435 \u043A\u0459\u0443\u0447 \u043E\u0431\u0440\u0438\u0441\u0430\u043D. \u0422\u0430\u0447\u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0430 \u0458\u0435 \u0443 \u043A\u043E\u043D\u0437\u043E\u043B\u0438.`; }, bigJson: "\u041E\u0432\u0430\u0458 JSON \u043E\u0431\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u043F\u0440\u0435\u043A\u043E 10 kb, \u043F\u0430 \u0441\u0435 \u0443\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u0437\u043D\u0430\u0442\u0435 \u0448\u0442\u0430 \u0440\u0430\u0434\u0438\u0442\u0435, \u0458\u0435\u0440 \u043D\u0435\u043A\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0441\u043F\u043E\u0440\u0435 \u043F\u0440\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0443.", addNode: "\u0414\u043E\u0434\u0430\u0458 \u0447\u0432\u043E\u0440", validateJson: "\u0412\u0430\u043B\u0438\u0434\u0438\u0440\u0430\u0458 JSON", reducedFunction: `\u0421\u043C\u0430\u045A\u0435\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u043E\u0441\u0442`, tooManyKeys: opts => { return `\u0417\u0430 \u043F\u0443\u043D\u0435 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u043D\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0435, \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u0438 \u0443\u043A\u0443\u043F\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u0458\u0435 ${opts.maxLightKeysCount}. \u041E\u0432\u0430 \u0431\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u0438\u043C\u0430 \u0432\u0438\u0448\u0435 \u043E\u0434 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u0438\u0445 \u043A\u0459\u0443\u0447\u0435\u0432\u0430, \u0443\u043A\u0443\u043F\u043D\u043E ${opts.count}. \u0421\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u0438 \u0434\u043E\u0434\u0430\u0442\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u0441\u0442\u0430\u0431\u043B\u0430 \u0441\u0443 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0435. \u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0435 \u0432\u0440\u0448\u0438 \u0441\u0430\u043C\u043E \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0443\u043C\u0435\u0441\u0442\u043E \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443.`; }, redisCommandNotFound: "\u041D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u0430 Redis \u043A\u043E\u043C\u0430\u043D\u0434\u0430 ...", treeKeyStore: `\u0421\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 (\u043F\u0440\u0438\u0440\u043E\u0434\u043D\u043E \u043F\u043E\u0440\u0435\u0452\u0435\u045A\u0435) \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443 (\u0442\u0458. \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0443), \u0448\u0442\u043E \u0437\u043D\u0430\u0447\u0438 \u0434\u0430 \u0438\u043C\u0430 \u0446\u0435\u043D\u0443 \u0437\u0430 \u0432\u0435\u043B\u0438\u043A\u0435 \u0441\u043A\u0443\u043F\u043E\u0432\u0435, \u043A\u0430\u043E \u043F\u0440\u0435\u043A\u043E 10k \u043A\u0459\u0443\u0447\u0435\u0432\u0430, \u043C\u043E\u0436\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043C\u0430\u043B\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435. \u0423 Redis-\u0443 \u043D\u0435\u043C\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0430 \u043A\u0459\u0443\u0447\u0435\u0432\u0430, \u0441\u0430\u043C\u043E \u043D\u0430 \u043E\u0432\u0430\u0458 \u043D\u0430\u0447\u0438\u043D.`, socketIoTimeout: options => { return `Socket.IO \u0458\u0435 \u043F\u0440\u0435\u043A\u043E\u0440\u0430\u0447\u0438\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u043E \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u045A\u0435 \u0437\u0430 \u043E\u0432\u0430\u0458 \u0437\u0430\u0445\u0442\u0435\u0432 (\u043C\u0430\u043A\u0441 ${options.timeout / 1000} \u0441\u0435\u043A\u0443\u043D\u0434\u0438) ...`; }, resizerInfo: options => { return `\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043B\u0435\u0432\u043E\u0433 \u0438\u043B\u0438 \u0434\u0435\u0441\u043D\u043E\u0433 \u043F\u0430\u043D\u0435\u043B\u0430 \u0458\u0435 ${options.width}px`; }, jsonViewNotParsable: "\u041E\u0432\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043D\u0438\u0458\u0435 JSON \u043F\u0430\u0440\u0441\u0438\u0440\u0459\u0438\u0432\u0430 ", ttlTitle: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 TTL \u0443 \u0441\u0435\u043A\u0443\u043D\u0434\u0430\u043C\u0430", passwordSecure: "\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0430\u0437\u043D\u0430, \u0430\u043B\u0438 \u045B\u0435 \u0438 \u0434\u0430\u0459\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0435, \u043E\u0432\u043E \u0458\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430.", tlsWithoutCert: "\u041E\u043C\u043E\u0433\u0443\u045B\u0438 TLS \u0431\u0435\u0437 \u0434\u043E\u0434\u0430\u0442\u043D\u043E\u0433 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u0430", tlsRejectUnauthorized: "\u041E\u0434\u0431\u0438\u0458 \u043D\u0435\u0430\u0443\u0442\u043E\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442", tlsSecure: "\u0410\u043A\u043E \u0432\u0438\u0434\u0438\u0442\u0435 TLS \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0458\u0443 \u043A\u043E\u0458\u0430 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430 P3X \u0438\u043B\u0438 \u0441\u0432\u0430 TLS \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0438\u0437\u0433\u043B\u0435\u0434\u0430\u0458\u0443 \u0438\u0441\u0442\u043E, \u0442\u043E \u0458\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0417\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430, \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u0435 \u043E\u0432\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043F\u0440\u0430\u0437\u043D\u0438\u043C \u0438\u043B\u0438 \u043D\u0435\u0447\u0438\u043C \u0434\u0440\u0443\u0433\u0438\u043C \u0438 \u0431\u0438\u045B\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. \u0410\u043A\u043E \u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 TLS \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430, \u043E\u043D\u0430 \u045B\u0435 \u043E\u0441\u0442\u0430\u0442\u0438 \u043A\u0430\u043A\u0432\u0430 \u0458\u0435\u0441\u0443 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443.", treeSeparatorEmpty: "\u0410\u043A\u043E \u0458\u0435 \u0441\u0435\u043F\u0430\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0431\u043B\u0430 \u043F\u0440\u0430\u0437\u0430\u043D, \u0441\u0442\u0430\u0431\u043B\u043E \u043D\u0435\u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u0443\u0433\u045A\u0435\u0436\u0434\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435, \u0441\u0430\u043C\u043E \u0447\u0438\u0441\u0442\u0443 \u043B\u0438\u0441\u0442\u0443", treeSeparatorEmptyNote: "\u0411\u0435\u0437 \u0443\u0433\u045A\u0435\u0436\u0434\u0435\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430, \u0441\u0430\u043C\u043E \u0447\u0438\u0441\u0442\u0430 \u043B\u0438\u0441\u0442\u0430", welcomeConsole: "\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u0443 Redis \u043A\u043E\u043D\u0437\u043E\u043B\u0443", welcomeConsoleInfo: "\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C \u0413\u041E\u0420\u0415 \u0438\u043B\u0438 \u0414\u041E\u041B\u0415 \u0458\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430", redisListIndexInfo: "\u041F\u0440\u0430\u0437\u043D\u043E \u0437\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u043A\u0440\u0430\u0458, -1 \u0437\u0430 \u0434\u043E\u0434\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u043F\u043E\u0447\u0435\u0442\u0430\u043A \u0438\u043B\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0458\u0442\u0435 \u043D\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0443 \u043F\u043E\u0437\u0438\u0446\u0438\u0458\u0443.", console: "\u041A\u043E\u043D\u0437\u043E\u043B\u0430", connectiondAdd: "\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443", connectiondEdit: "\u0423\u0440\u0435\u0434\u0438 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443", connectiondView: "\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0443", connections: "\u041A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435", licenseInfo: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430", licenseEditable: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0438\u0437\u043C\u0435\u043D\u0459\u0438\u0432\u0430", licenseEditableYes: "\u0414\u0430", licenseEditableNo: "\u041D\u0435", licenseTerminalOnly: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0441\u0435 \u043C\u043E\u0436\u0435 \u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0438 \u0441\u0430\u043C\u043E \u0438\u0437 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", licenseTierPolicyTitle: "\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430 \u043D\u0438\u0432\u043E\u0430", licenseTierPolicyText: "

Free

\u0441\u0430\u043C\u043E \u043E\u0441\u043D\u043E\u0432\u043D\u0438 Redis UI; \u0431\u0435\u0437 SSH \u0442\u0443\u043D\u0435\u043B\u043E\u0432\u0430\u045A\u0430, \u0431\u0435\u0437 Readonly \u0440\u0435\u0436\u0438\u043C\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435, \u0431\u0435\u0437 Cluster/Sentinel, \u0431\u0435\u0437 Edit JSON/Upload binary/Download binary, \u0431\u0435\u0437 ReJSON.
\u0426\u0435\u043D\u0430: 0 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC0/\u043C\u0435\u0441\u0435\u0447\u043D\u043E).

Pro

SSH \u0442\u0443\u043D\u0435\u043B\u043E\u0432\u0430\u045A\u0435, Readonly \u0440\u0435\u0436\u0438\u043C \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 (\u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0443\u045B\u0438 --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
\u041E\u0441\u043D\u043E\u0432\u043D\u0430 \u0446\u0435\u043D\u0430: 400 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC1/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 4.000 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC10/\u0433\u043E\u0434\u0438\u0448\u045A\u0435).
\u0423\u043A\u0443\u043F\u043D\u043E \u0441\u0430 \u041F\u0414\u0412 27%: 500 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC1,27/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 5.100 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC12,70/\u0433\u043E\u0434\u0438\u0448\u045A\u0435).

Enterprise

SSH \u0442\u0443\u043D\u0435\u043B\u043E\u0432\u0430\u045A\u0435, Cluster \u0438 Sentinel, \u043F\u043B\u0443\u0441 Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r \u0442\u0430\u043A\u043E\u0452\u0435 \u0440\u0430\u0434\u0438.
\u041E\u0441\u043D\u043E\u0432\u043D\u0430 \u0446\u0435\u043D\u0430: 1.200 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC3/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 12.000 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC30/\u0433\u043E\u0434\u0438\u0448\u045A\u0435).
\u0423\u043A\u0443\u043F\u043D\u043E \u0441\u0430 \u041F\u0414\u0412 27%: 1.500 HUF/\u043C\u0435\u0441\u0435\u0447\u043D\u043E (\u20AC3,81/\u043C\u0435\u0441\u0435\u0447\u043D\u043E) \u0438\u043B\u0438 15.200 HUF/\u0433\u043E\u0434\u0438\u0448\u045A\u0435 (\u20AC38,10/\u0433\u043E\u0434\u0438\u0448\u045A\u0435).

\u0413\u043E\u0434\u0438\u0448\u045A\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043E

\u0413\u043E\u0434\u0438\u0448\u045A\u0430 \u0446\u0435\u043D\u0430 \u0458\u0435 10x \u043C\u0435\u0441\u0435\u0447\u043D\u0435 \u0446\u0435\u043D\u0435.

\u041C\u0435\u0441\u0442\u0430

\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0430 \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0435 5 \u043C\u0435\u0441\u0442\u0430. \u0410\u043A\u043E \u0432\u0430\u043C \u0442\u0440\u0435\u0431\u0430 \u0432\u0438\u0448\u0435 \u043C\u0435\u0441\u0442\u0430, \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u0430\u0441 \u043D\u0430 support@corifeus.com.

Enterprise \u043F\u0440\u043E\u0431\u043D\u0438 \u043F\u0435\u0440\u0438\u043E\u0434

10 \u0434\u0430\u043D\u0430 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \u0437\u0430 \u0441\u0432\u0430\u043A\u043E\u0433 \u0441\u0430 \u0441\u0442\u0432\u0430\u0440\u043D\u043E\u043C \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u043E\u043C email \u0430\u0434\u0440\u0435\u0441\u043E\u043C (\u043D\u0435 \u0442\u0435\u0441\u0442 email).

\u041F\u043E\u0434\u0430\u0446\u0438 \u0437\u0430 \u0444\u0430\u043A\u0442\u0443\u0440\u0438\u0441\u0430\u045A\u0435 \u043F\u0443\u0442\u0435\u043C e-mail-\u0430

\u0418\u043C\u0435, Email \u0437\u0430 \u0444\u0430\u043A\u0442\u0443\u0440\u0438\u0441\u0430\u045A\u0435, \u041A\u043E\u0434 \u0437\u0435\u043C\u0459\u0435, \u041F\u043E\u0448\u0442\u0430\u043D\u0441\u043A\u0438 \u0431\u0440\u043E\u0458, \u0413\u0440\u0430\u0434, \u0410\u0434\u0440\u0435\u0441\u0430, \u041F\u0418\u0411 (\u043E\u043F\u0446\u0438\u043E\u043D\u043E).

\u041F\u043B\u0430\u045B\u0430\u045A\u0435

PayPal \u043F\u043B\u0430\u045B\u0430\u045A\u0435 \u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0441\u0430\u043C\u043E \u0443 HUF (\u0444\u043E\u0440\u0438\u043D\u0442\u0438); \u043D\u0430\u043A\u043E\u043D \u0441\u043B\u0430\u045A\u0430 \u043D\u043E\u0432\u0446\u0430 \u043D\u0430 https://paypal.me/corifeus \u043F\u043E\u0441\u043B\u0430\u045B\u0443 \u0432\u0430\u043C \u0444\u0430\u043A\u0442\u0443\u0440\u0443. \u0421\u0432\u0430 \u043F\u043B\u0430\u045B\u0430\u045A\u0430 \u0441\u0443 \u0431\u0435\u0437 \u043F\u043E\u0432\u0440\u0430\u045B\u0430\u0458\u0430.

\u041F\u0414\u0412

\u041F\u0414\u0412 \u0441\u0435 \u0434\u043E\u0434\u0430\u0458\u0435 \u043D\u0430 \u0446\u0435\u043D\u0443 (27% \u0443 \u041C\u0430\u0452\u0430\u0440\u0441\u043A\u043E\u0458).

\u041A\u043E\u043D\u0442\u0430\u043A\u0442

\u0410\u043A\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u0437\u0434\u0440\u0430\u0432\u0438\u0442\u0435 \u0438\u043B\u0438 \u0438\u043C\u0430\u0442\u0435 \u043F\u0438\u0442\u0430\u045A\u0435, \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0438\u0440\u0430\u0458\u0442\u0435 support@corifeus.com.

\u0408\u0435\u0437\u0438\u043A

\u041A\u043E\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u043E \u0444\u0430\u043A\u0442\u0443\u0440\u0430\u043C\u0430 \u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0430\u043C\u0430 \u0458\u0435 \u043D\u0430 \u0435\u043D\u0433\u043B\u0435\u0441\u043A\u043E\u043C. \u0412\u0430\u043B\u0443\u0442\u0430 \u0444\u0430\u043A\u0442\u0443\u0440\u0435 \u0458\u0435 HUF.

\u041D\u0430\u043F\u043E\u043C\u0435\u043D\u0430

\u0412\u0430\u043B\u0438\u0434\u0430\u0446\u0438\u0458\u0430 \u043B\u0438\u0446\u0435\u043D\u0446\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0443.", licenseState: "\u0421\u0442\u0430\u045A\u0435", licenseStateActive: "\u0410\u043A\u0442\u0438\u0432\u043D\u0430", licenseStateInactive: "\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430", licenseStateNoLicense: "\u0411\u0435\u0437 \u043B\u0438\u0446\u0435\u043D\u0446\u0435", licenseKeyMasked: "\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u0438 \u043A\u0459\u0443\u0447", licenseTier: "\u041D\u0438\u0432\u043E", licenseValid: "\u0412\u0430\u0436\u0435\u045B\u0430", licenseStatus: "\u0421\u0442\u0430\u0442\u0443\u0441 \u043B\u0438\u0446\u0435\u043D\u0446\u0435", licenseReason: "\u0420\u0430\u0437\u043B\u043E\u0433", licenseCheckedAt: "\u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E", licenseStartsAt: "\u041F\u043E\u0447\u0438\u045A\u0435", licenseExpiresAt: "\u0418\u0441\u0442\u0438\u0447\u0435", licenseDaysLeft: "\u041F\u0440\u0435\u043E\u0441\u0442\u0430\u043B\u043E \u0434\u0430\u043D\u0430", licenseMaxDevices: "\u041C\u0430\u043A\u0441. \u0443\u0440\u0435\u0452\u0430\u0458\u0430", licenseActiveDevices: "\u0410\u043A\u0442\u0438\u0432\u043D\u0438 \u0443\u0440\u0435\u0452\u0430\u0458\u0438", licenseActiveDevicesInfo: "\u0410\u043A\u043E \u0441\u0435 \u0443\u0440\u0435\u0452\u0430\u0458 \u0432\u0438\u0448\u0435 \u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438, \u045A\u0435\u0433\u043E\u0432\u043E \u043C\u0435\u0441\u0442\u043E \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0441\u043B\u043E\u0431\u0430\u0452\u0430 \u043D\u0430\u043A\u043E\u043D 75 \u043C\u0438\u043D\u0443\u0442\u0430.", licenseCustomerEmail: "Email \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430", licenseFeatures: "\u0424\u0443\u043D\u043A\u0446\u0438\u0458\u0435", licenseFeaturesEmpty: "\u041D\u0435\u043C\u0430 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430", licenseFeatureReadonlyMode: "\u0420\u0435\u0436\u0438\u043C \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435", licenseFeatureReadonlyConnectionsFlag: "\u041A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 (--readonly-connections/-r)", licenseFeatureSsh: "SSH \u0442\u0443\u043D\u0435\u043B\u043E\u0432\u0430\u045A\u0435", licenseFeatureCluster: "Cluster \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435", licenseFeatureSentinel: "Sentinel \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "\u0421\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u0443\u043A\u0459\u0443\u0447\u0435\u043D\u043E", off: "\u0421\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u043E" }, cluster: { on: "Cluster \u0443\u043A\u0459\u0443\u0447\u0435\u043D", off: "Cluster \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D" }, sentinel: { on: "Sentinel \u0443\u043A\u0459\u0443\u0447\u0435\u043D", off: "Sentinel \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D", name: "\u0418\u043C\u0435 Sentinel" }, readonly: { on: "\u0421\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u0443\u043A\u0459\u0443\u0447\u0435\u043D\u043E", off: "\u0421\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u043E" }, proSshOnly: "SSH \u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D \u0443 Pro \u0438\u043B\u0438 Enterprise.", proReadonlyOnly: "\u0420\u0435\u0436\u0438\u043C \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D \u0443 Pro \u0438\u043B\u0438 Enterprise.", enterpriseClusterSentinelOnly: "Cluster \u0438 Sentinel \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438 \u0441\u0430\u043C\u043E \u0443 Enterprise.", theme: { light: "\u0421\u0432\u0435\u0442\u043B\u0430", dark: "\u0422\u0430\u043C\u043D\u0430 enterprise", darkNeu: "\u0422\u0430\u043C\u043D\u0430", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u043E: ${opts.name}`; }, tree: "\u0421\u0442\u0430\u0431\u043B\u043E", askAuth: "\u0417\u0430\u0442\u0440\u0430\u0436\u0438 \u0430\u0443\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0458\u0443", keyboardShortcuts: "\u041F\u0440\u0435\u0447\u0438\u0446\u0435 \u043D\u0430 \u0442\u0430\u0441\u0442\u0430\u0442\u0443\u0440\u0438", about: "\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443", supportedLanguages: "\u041F\u043E\u0434\u0440\u0436\u0430\u043D\u0438 \u0458\u0435\u0437\u0438\u0446\u0438", version: "\u0412\u0435\u0440\u0437\u0438\u0458\u0430", redisVersion: "Redis \u0432\u0435\u0440\u0437\u0438\u0458\u0430", modules: "Модулi", shortcutRefresh: "\u041E\u0441\u0432\u0435\u0436\u0438", shortcutSearch: "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443", shortcutNewKey: "\u041D\u043E\u0432\u0438 \u043A\u0459\u0443\u0447", shortcutDisconnect: "\u041E\u0434\u0432\u043E\u0458\u0438", themeAuto: "Аутоматски (систем)", shortcutCommandPalette: "\u041F\u0430\u043B\u0435\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0438", commandPalette: "\u041F\u0430\u043B\u0435\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0438", noResults: "\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430", redisCommandsReference: "Redis Команде", ungrouped: "Без групе", grouped: "Груписано", connectFirst: "Прво се повежите на Redis сервер", searchLanguage: "Претражи језик...", exportProgress: "Извоз кључева...", importProgress: "Увоз кључева...", importPreview: "Преглед", importOverwrite: "Препиши", importSkip: "Прескочи", importConflict: "Ако кључ већ постоји:", noKeysToExport: "Нема кључева за извоз", time: "Време", loading: "Учитавање...", autoRefresh: "Ауто", exportSearchHint: "Извозе се само кључеви који одговарају тренутној претрази", importSearchHint: "Увоз се примењује на целу базу података, не само на резултате претраге", importNoKeys: "Кључеви нису пронађени у датотеци", }, status: { dataCopied: "\u041F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u0443 \u043C\u0435\u0452\u0443\u0441\u043F\u0440\u0435\u043C\u043D\u0438\u043A\u0443", licenseSaved: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430", exportDone: "Извоз завршен", indexCreated: "Индекс креиран", indexDropped: "Индекс обрисан", importDone: (opts) => `Увоз завршен: ${opts.created} креирано, ${opts.skipped} прескочено, ${opts.errors} грешака`, nodeRemoved: "\u0427\u0432\u043E\u0440 \u0458\u0435 \u0443\u043A\u043B\u043E\u045A\u0435\u043D", keyIsNotExisting: "\u041E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447 \u0458\u0435 \u043C\u043E\u0433\u0430\u043E \u0431\u0438\u0442\u0438 \u043E\u0431\u0440\u0438\u0441\u0430\u043D \u0438\u043B\u0438 \u0438\u0441\u0442\u0435\u043A\u0430\u043E.", keyCount: opts => { if (opts.keyCount === 0) { return "\u041D\u0435\u043C\u0430 \u043A\u0459\u0443\u0447\u0435\u0432\u0430"; } else if (opts.keyCount === 1) { return "1 \u043A\u0459\u0443\u0447"; } else { return `${opts.keyCount} \u043A\u0459\u0443\u0447\u0435\u0432\u0430`; } }, treeExpandAll: "\u041F\u0440\u043E\u0448\u0438\u0440\u0438 \u0441\u0432\u0435 \u0433\u0440\u0430\u043D\u0435 \u0441\u0442\u0430\u0431\u043B\u0430. \u041E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0437\u0430\u0445\u0442\u0435\u0432\u043D\u0430 \u0438 \u043C\u043E\u0436\u0435 \u043F\u043E\u0442\u0440\u0430\u0458\u0430\u0442\u0438 ...", noRedisKeys: "\u041D\u0435\u043C\u0430 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u0443 \u043E\u0432\u043E\u0458 \u0431\u0430\u0437\u0438 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430.", redisConnected: "Redis \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u043E\u0432\u0435\u0437\u0430\u043D", reloadingDataInfo: "\u041F\u043E\u043D\u043E\u0432\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430 \u043E Redis \u043F\u043E\u0434\u0430\u0446\u0438\u043C\u0430", added: "\u0414\u043E\u0434\u0430\u0442\u043E", saved: "\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E", cancelled: "\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E", deleted: "\u041E\u0431\u0440\u0438\u0441\u0430\u043D\u043E", savedRedis: "Redis \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438", redisDisconnected: opts => { return `\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u0438\u043C\u0430\u043B\u0430 \u0433\u0440\u0435\u0448\u043A\u0443: ${opts.error.message}`; }, dbChanged: opts => { return `\u0418\u043D\u0434\u0435\u043A\u0441 \u0431\u0430\u0437\u0435 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u0458\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D \u043D\u0430 ${opts.db}. `; }, treeDeleted: opts => { return `\u041A\u0459\u0443\u0447 \u0441\u0442\u0430\u0431\u043B\u0430 \u0458\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D (${opts.key}).`; }, deletedKey: opts => { return `\u041A\u0459\u0443\u0447 \u0458\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D (${opts.key}).`; }, renamedKey: "\u041E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447 \u0458\u0435 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D", ttlChanged: "TTL \u043E\u0432\u043E\u0433 \u043A\u0459\u0443\u0447\u0430 \u0458\u0435 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D", notInteger: "\u041E\u0432\u0430\u0458 \u0443\u043D\u043E\u0441 \u043D\u0438\u0458\u0435 \u0446\u0435\u043E \u0431\u0440\u043E\u0458", persisted: "\u041E\u0432\u0430\u0458 \u043A\u0459\u0443\u0447 \u0458\u0435 \u0442\u0440\u0430\u0458\u043D\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u043D", set: "\u041A\u0459\u0443\u0447 \u0458\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D/\u0434\u043E\u0434\u0430\u0442" }, code: { "delete-connection": "\u041E\u0432\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D\u0430, \u0442\u0430\u043A\u043E \u0434\u0430 \u0441\u0442\u0435 \u043E\u0434\u0432\u043E\u0458\u0435\u043D\u0438 \u043E\u0434 \u043E\u0432\u0435 Redis \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0435.", "save-connection": "\u041E\u0432\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430, \u0442\u0430\u043A\u043E \u0434\u0430 \u0441\u0442\u0435 \u043E\u0434\u0432\u043E\u0458\u0435\u043D\u0438 \u043E\u0434 \u043E\u0432\u0435 Redis \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0435. \u041C\u043E\u0436\u0435\u0442\u0435 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438.", "readonly-connections": "\u0414\u043E\u0434\u0430\u0432\u0430\u045A\u0435/\u0447\u0443\u0432\u0430\u045A\u0435/\u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435!", "readonly-connection-mode": "\u041E\u0432\u0430 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443 \u0440\u0435\u0436\u0438\u043C\u0443 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435!", "list-out-of-bounds": "\u0418\u043D\u0434\u0435\u043A\u0441 \u043E\u0432\u0435 \u043B\u0438\u0441\u0442\u0435 \u0458\u0435 \u0432\u0430\u043D \u0433\u0440\u0430\u043D\u0438\u0446\u0430", "donation-ware-feature": "\u041E\u0432\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430 \u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0438 \u0441\u0430 \u0434\u043E\u043D\u0430\u0446\u0438\u0458\u043E\u043C.", "feature-pro-readonly-required": "\u0420\u0435\u0436\u0438\u043C \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 Pro \u0438\u043B\u0438 Enterprise \u043B\u0438\u0446\u0435\u043D\u0446\u0443.", "feature-pro-ssh-required": "SSH \u0442\u0443\u043D\u0435\u043B\u043E\u0432\u0430\u045A\u0435 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 Pro \u0438\u043B\u0438 Enterprise \u043B\u0438\u0446\u0435\u043D\u0446\u0443.", "feature-enterprise-cluster-sentinel-required": "Cluster \u0438 Sentinel \u0437\u0430\u0445\u0442\u0435\u0432\u0430\u0458\u0443 Enterprise \u043B\u0438\u0446\u0435\u043D\u0446\u0443.", "feature-pro-json-binary-required": "Edit JSON, Upload binary \u0438 Download binary \u0437\u0430\u0445\u0442\u0435\u0432\u0430\u0458\u0443 Pro \u0438\u043B\u0438 Enterprise \u043B\u0438\u0446\u0435\u043D\u0446\u0443.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u0430 \u0430\u0443\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0458\u0430: \u043C\u043E\u043B\u0438\u043C\u043E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0442\u0435 \u0441\u0435 \u043F\u0443\u0442\u0435\u043C HTTP Basic Auth \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458\u0442\u0435.", "auto-connection-failed": "\u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0458\u0435 \u043A\u043E\u043D\u0435\u043A\u0446\u0438\u0458\u0430 \u0443\u043A\u043B\u043E\u045A\u0435\u043D\u0430 \u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E \u0437\u0431\u043E\u0433 \u0442\u043E\u0433\u0430.", invalid_console_command: "\u041E\u0432\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0435 \u0440\u0430\u0434\u0438 \u043F\u0440\u0435\u043A\u043E GUI." }, licenseReason: { LICENSE_VALID: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u0432\u0430\u0436\u0435\u045B\u0430", LICENSE_INVALID: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u043D\u0435\u0432\u0430\u0436\u0435\u045B\u0430", LICENSE_MISSING: "\u041B\u0438\u0446\u0435\u043D\u0446\u043D\u0438 \u043A\u0459\u0443\u0447 \u043D\u0438\u0458\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D", LICENSE_DISABLED: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 \u0443 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0458\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430", LICENSE_NOT_FOUND: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0430", LICENSE_EXPIRED: "\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u0438\u0441\u0442\u0435\u043A\u043B\u0430", LICENSE_CLEARED: "\u041B\u0438\u0446\u0435\u043D\u0446\u043D\u0438 \u043A\u0459\u0443\u0447 \u0458\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D", LICENSE_MAX_DEVICES_REACHED: "\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0443\u0440\u0435\u0452\u0430\u0458\u0430", PRODUCT_MISMATCH: "\u041F\u0440\u043E\u0438\u0437\u0432\u043E\u0434 \u043B\u0438\u0446\u0435\u043D\u0446\u0435 \u0441\u0435 \u043D\u0435 \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u0430" }, licenseStatusValue: { active: "\u0410\u043A\u0442\u0438\u0432\u043D\u0430", deleted: "\u041E\u0431\u0440\u0438\u0441\u0430\u043D\u0430", all: "\u0421\u0432\u0435", expired: "\u0418\u0441\u0442\u0435\u043A\u043B\u0430", missing: "\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435", inactive: "\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430" }, form: { error: { required: "\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E", port: "\u041F\u043E\u0440\u0442 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 1-65535", invalid: "\u0424\u043E\u0440\u043C\u0443\u043B\u0430\u0440 \u0458\u0435 \u043D\u0435\u0432\u0430\u0436\u0435\u045B\u0438" }, connection: { label: { name: "\u0418\u043C\u0435", group: "Група", host: "\u0418\u043C\u0435 \u0445\u043E\u0441\u0442\u0430", port: "\u041F\u043E\u0440\u0442", password: "\u041B\u043E\u0437\u0438\u043D\u043A\u0430", username: "\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435" } }, treeSettings: { maxValueDisplay: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u043D\u0430 \u0434\u0443\u0436\u0438\u043D\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438", maxValueDisplayInfo: "\u0410\u043A\u043E \u0458\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043D\u0430 0, \u043F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u043F\u0443\u043D\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. \u0410\u043A\u043E \u0458\u0435 \u0432\u0435\u045B\u0435 \u043E\u0434 0, \u0441\u043A\u0440\u0430\u045B\u0443\u0458\u0435 \u043D\u0430 \u043E\u0432\u0443 \u0434\u0443\u0436\u0438\u043D\u0443. \u0410\u043A\u043E \u0458\u0435 -1: \u0437\u0430 \u0441\u0442\u0440\u0438\u043D\u0433\u043E\u0432\u0435, \u0441\u043A\u0440\u0438\u0432\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0434\u043E \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0430; \u0437\u0430 \u043E\u0441\u0442\u0430\u043B\u0435 \u0442\u0438\u043F\u043E\u0432\u0435, \u043F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u043F\u0443\u043D \u0441\u0430\u0434\u0440\u0436\u0430\u0458.", maxKeys: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430", maxKeysInfo: "\u0414\u0430 \u0441\u0435 GUI \u043D\u0435 \u0431\u0438 \u0441\u0440\u0443\u0448\u0438\u043E, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0430\u0432\u0430\u043C\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430.", keyCount: () => { return `\u0411\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430: ${p3xr.state.keysRaw.length}`; }, label: { animation: "\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0458\u0443", noAnimation: "\u0411\u0435\u0437 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0458\u0435", jsonFormatTwoSpace: "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u0458 JSON \u0441\u0430 2 \u0440\u0430\u0437\u043C\u0430\u043A\u0430", jsonFormatFourSpace: "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u0458 JSON \u0441\u0430 4 \u0440\u0430\u0437\u043C\u0430\u043A\u0430", formName: "Redis \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430", searchModeClient: "\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443", searchModeServer: "\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443", searchModeStartsWith: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430", searchModeIncludes: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0430\u0434\u0440\u0436\u0438" }, field: { treeSeparator: "\u0421\u0435\u043F\u0430\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0431\u043B\u0430", treeSeparatorSelector: "\u0418\u0437\u0431\u043E\u0440 \u0441\u0435\u043F\u0430\u0440\u0430\u0442\u043E\u0440\u0430 \u0441\u0442\u0430\u0431\u043B\u0430", page: "\u0411\u0440\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0441\u0442\u0430\u0431\u043B\u0430", keyPageCount: "\u0411\u0440\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043A\u0459\u0443\u0447\u0435\u0432\u0430", keysSort: "\u0421\u043E\u0440\u0442\u0438\u0440\u0430\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0435", searchMode: "\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435", searchModeStartsWith: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430 / \u0441\u0430\u0434\u0440\u0436\u0438" }, error: { keyPageCount: "\u0411\u0440\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0446\u0435\u043E \u0431\u0440\u043E\u0458 \u0438\u0437\u043C\u0435\u0452\u0443 5 - 100", page: "\u0411\u0440\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0446\u0435\u043E \u0431\u0440\u043E\u0458 \u0438\u0437\u043C\u0435\u0452\u0443 10 - 5000", maxValueDisplay: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043F\u0440\u0438\u043A\u0430\u0437\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0446\u0435\u043E \u0431\u0440\u043E\u0458 \u0438\u0437\u043C\u0435\u0452\u0443 -1 \u0438 32768", maxKeys: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0446\u0435\u043E \u0431\u0440\u043E\u0458 \u0438\u0437\u043C\u0435\u0452\u0443 100 \u0438 100000" } }, key: { label: { formName: { add: "\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u0438 Redis \u043A\u0459\u0443\u0447", edit: "\u0423\u0440\u0435\u0434\u0438 Redis \u043A\u0459\u0443\u0447", append: "\u0414\u043E\u0434\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u043C Redis \u043A\u0459\u0443\u0447\u0443" } }, field: { streamTimestamp: "\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043E\u0437\u043D\u0430\u043A\u0430", key: "\u041A\u0459\u0443\u0447", type: "\u0422\u0438\u043F", index: "\u0418\u043D\u0434\u0435\u043A\u0441", hashKey: "\u0425\u0435\u0448 \u043A\u0459\u0443\u0447", score: "\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442", value: "\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442" }, error: { streamTimestamp: "\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043E\u0437\u043D\u0430\u043A\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0430, \u0431\u0438\u043B\u043E \u0443 Redis \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u0438\u043B\u0438 \u043A\u0430\u043E *", key: "\u041A\u0459\u0443\u0447 \u0438\u043C\u0430 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u0434\u0430\u043D \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440", hashKey: "\u0425\u0435\u0448 \u043A\u0459\u0443\u0447 \u0442\u0430\u0431\u0435\u043B\u0435 \u0438\u043C\u0430 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u0434\u0430\u043D \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440", score: "\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u043D\u043E\u0433 \u0441\u043A\u0443\u043F\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u0430\u043D", value: "\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0430" } }, main: { label: { database: "\u0411\u0414" } } }, page: { search: { title: "Претрага", index: "Индекс", query: "Упит", results: "Резултати", noIndex: "Нису пронађени индекси", createIndex: "Креирај индекс", dropIndex: "Обриши индекс", indexInfo: "Инфо о индексу", indexName: "Назив индекса", prefix: "Префикс кључа (опционално)", fieldName: "Назив поља", }, monitor: { title: "Надгледање", memory: "Меморија", opsPerSec: "Операција/сек", clients: "Клијенти", blocked: "Блокирани", hitsMisses: "Стопа погодака", networkIo: "Мрежа I/O", slowLog: "Спор дневник", totalCommands: "Укупно", expired: "Истекли", evicted: "Избачени", clientList: "Листа клијената", topKeys: "Највећи кључеви по меморији", killClient: "Убиј клијента", clientKilled: "Клијент убијен", confirmKillClient: "Да ли сте сигурни да желите да прекинете овог клијента?", noKeys: "Нема кључева", noClients: "Нема клијената", }, overview: { noConnected: "\u041D\u0435\u043C\u0430 \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0430 \u043D\u0430 Redis.", overviewClients: "\u041F\u0440\u0438\u043A\u0430\u0437 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u043F\u043E \u0431\u0440\u043E\u0458\u0443 \u043A\u043B\u0438\u0458\u0435\u043D\u0430\u0442\u0430", connectedCount: opt => { if (opt.length === 1) { return "1 \u043A\u043B\u0438\u0458\u0435\u043D\u0442"; } return `${opt.length} \u043A\u043B\u0438\u0458\u0435\u043D\u0430\u0442\u0430`; } }, key: { label: { key: "\u041A\u0459\u0443\u0447", encoding: "\u041A\u043E\u0434\u0438\u0440\u0430\u045A\u0435", length: "\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430", ttl: "TTL", ttlTitle: "\u0412\u0440\u0435\u043C\u0435 \u0436\u0438\u0432\u043E\u0442\u0430", type: "\u0422\u0438\u043F", ttlNotExpire: "\u043D\u0435 \u0438\u0441\u0442\u0438\u0447\u0435", lengthString: "\u0431\u0430\u0458\u0442\u043E\u0432\u0430", lengthItem: "\u0441\u0442\u0430\u0432\u043A\u0438", actions: "\u0410\u043A\u0446\u0438\u0458\u0435" }, list: { table: { index: "\u0418\u043D\u0434\u0435\u043A\u0441", value: "\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442" } }, hash: { table: { hashkey: "\u0425\u0435\u0448 \u043A\u0459\u0443\u0447", value: "\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442" } }, set: { table: { value: "\u0427\u043B\u0430\u043D" } }, zset: { table: { value: "\u0427\u043B\u0430\u043D", score: "\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442" } }, stream: { table: { timestamp: "ID \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0435 \u043E\u0437\u043D\u0430\u043A\u0435", field: "\u041F\u043E\u0459\u0435", value: "\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442" } } }, treeControls: { settings: "\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0442\u0430\u0431\u043B\u0430", expandAll: "\u041F\u0440\u043E\u0448\u0438\u0440\u0438 \u0441\u0432\u0435", collapseAll: "\u0421\u043A\u0443\u043F\u0438 \u0441\u0432\u0435", search: { search: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0443 \u043A\u0459\u0443\u0447\u0435\u0432\u0438\u043C\u0430", clear: "\u041E\u0447\u0438\u0441\u0442\u0438 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0443 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443", placeholderClient: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443", placeholderServer: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443", info: "\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443 \u0437\u043D\u0430\u0447\u0438 \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u0430\u045A\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0443 \u043F\u043E\u0459\u0443 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435. \u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0437\u043D\u0430\u0447\u0438 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u043E\u0431\u0440\u0430\u0437\u0430\u0446\u0430 \u0443 \u043A\u0459\u0443\u0447\u0435\u0432\u0438\u043C\u0430 \u043A\u0430\u043E *{\u0442\u0435\u043A\u0441\u0442-\u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435}*. \u0417\u0430 \u0432\u0435\u043B\u0438\u043A\u0435 \u0441\u043A\u0443\u043F\u043E\u0432\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435, \u0431\u043E\u0459\u0435 \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0417\u0430 \u043C\u0430\u045A\u0435 \u0441\u043A\u0443\u043F\u043E\u0432\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435, \u0431\u043E\u0459\u0435 \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443." + ` \u0410\u043A\u043E \u0431\u0440\u043E\u0458 \u043A\u0459\u0443\u0447\u0435\u0432\u0430 \u043F\u0440\u0435\u043B\u0430\u0437\u0438 ${p3xr.settings.maxLightKeysCount}, \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0442\u0438 \u0441\u0430\u043C\u043E \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443.`, largeSetInfo: "\u0423 \u0432\u0435\u043B\u0438\u043A\u043E\u043C \u0441\u043A\u0443\u043F\u0443, \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u043A\u043B\u0438\u0458\u0435\u043D\u0442\u0443 \u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430, \u0442\u0430\u043A\u043E \u0434\u0430 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043C\u043E\u0433\u0443\u045B\u0430 \u0441\u0430\u043C\u043E \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443.", infoDetails: "\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u0441\u0430\u0437\u043D\u0430\u043B\u0438 \u043A\u0430\u043A\u043E \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0438\u0448\u0435, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430" }, pager: { next: "\u0421\u043B\u0435\u0434\u0435\u045B\u0430", prev: "\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0430", first: "\u041F\u0440\u0432\u0430", last: "\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0430" } } }, time: { loading: "Учитавање...", years: "\u0433\u043E\u0434\u0438\u043D\u0430", months: "\u043C\u0435\u0441\u0435\u0446\u0438", days: "\u0434\u0430\u043D\u0430", year: "\u0433\u043E\u0434\u0438\u043D\u0430", month: "\u043C\u0435\u0441\u0435\u0446", day: "\u0434\u0430\u043D" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/sv/000077500000000000000000000000001517666434100140035ustar00rootroot00000000000000src/strings/sv/strings.js000066400000000000000000000662361517666434100160470ustar00rootroot00000000000000const strings = { error: { cleared_license: "Licensen har rensats", invalid_license: "Ogiltig licens", license_max_devices_reached: "Maximalt antal enhetsplatser har nåtts", license_readonly: "Licensen kan bara ändras från serverns terminal.", server_error: "Serverfel, vänligen försök igen" }, title: { donate: "Donera", jsonRecursive: "Expanderar alla löv", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Du kan välja en Redis-anslutning att ansluta till från menyn nere till vänster.", statistics: "Statistik", error: "Fel", connectingRedis: "Ansluter till Redis ...", socketioConnectError: "Socket.IO-fel", db: "DB", server: "Server", clients: "Klienter", memory: "Minne", persistence: "Persistens", stats: "Statistik", replication: "Replikering", cpu: "CPU", cluster: "Cluster", modules: "Moduler", errorstats: "Felstatistik", commandstats: "Kommandostatistik", latencystats: "Latensstatistik", keysizes: "Nyckelstorlekar", threads: "Trådar", }, confirm: { dropIndex: "Är du säker på att du vill ta bort detta index?", uploadBuffer: "Är du säker på att du vill ladda upp denna binärdata?", uploadBufferDone: "Binärdatan har laddats upp", uploadBufferDoneAndSave: "Binärdatan har laddats upp och sparats på servern", title: "Bekräfta", alert: "Varning", info: "Info", deleteListItem: "Är du säker på att du vill radera detta listobjekt?", deleteHashKey: "Är du säker på att du vill radera denna hash-nyckel?", deleteStreamTimestamp: "Är du säker på att du vill radera denna stream-tidsstämpel?", deleteSetMember: "Är du säker på att du vill radera denna uppsättningsmedlem?", deleteZSetMember: "Är du säker på att du vill radera denna sorterade uppsättningsmedlem?", deleteConnection: "Bekräfta", deleteConnectionText: "Är du säker på att du vill radera denna Redis-anslutning?", deleteNode: "Är du säker på att du vill radera denna Redis-nod?", deleteAllKeys: opts => { return `Radera detta träd och alla dess nycklar (${opts.key})?`; }, socketioConnectError: "Socket.IO kan inte ansluta till servern, du kan ladda om och försöka lösa anslutningsfelet själv, klienten vet inte hur den ska lösa det.", socketioAuthRequired: "Socket.IO-auktorisering krävs. Vänligen autentisera med HTTP Basic Auth (användarnamn/lösenord) och ladda om.", deleteKey: "Är du säker på att du vill radera denna nyckel?", rename: { title: "Är du säker på att du vill byta namn på denna nyckel?", textContent: "Denna åtgärd byter namn på nyckeln permanent.", placeholder: "Redis-nyckeln (obligatorisk)" }, ttl: { title: "Är du säker på att du vill ändra denna nyckels TTL?", textContent: "Att ändra TTL uppdaterar nyckelns livstid. Lämna tomt för att behålla nyckeln för alltid.", placeholder: "Redis-nyckelns TTL (heltal eller tomt)", placeholderPlaceholder: "Tomt betyder att den finns kvar för alltid; annars ange ett heltal.", convertTextToTime: "Konvertera text till tid", convertTextToTimePlaceholder: "T.ex. 1d blir 86400" }, license: { title: "Ange licens", textContent: "Om du vill använda betalfunktioner, kontakta support@corifeus.com för att begära en licens. Priset är Pro 400 HUF/månad (€1/månad) eller 4 000 HUF/år (€10/år), och Enterprise 1 200 HUF/månad (€3/månad) eller 12 000 HUF/år (€30/år). Årspris är 10x månadspriset. Med 27% moms blir totalen Pro 500 HUF/månad (€1,27/månad) eller 5 100 HUF/år (€12,70/år), Enterprise 1 500 HUF/månad (€3,81/månad) eller 15 200 HUF/år (€38,10/år). Licensvalidering kräver internetåtkomst. Standardlicensen inkluderar 5 platser. Om du behöver fler platser, kontakta oss på support@corifeus.com.", placeholder: "Licensnyckel" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopiera", downloadBuffer: "Ladda ner binär", setBuffer: "Ladda upp binär", exportKeys: "Exportera nycklar", exportAllKeys: (opts) => `Exportera alla ${opts.count} nycklar`, exportSearchResults: (opts) => `Exportera ${opts.count} resultat`, importKeys: "Importera nycklar", saveWithFormatJson: "Spara med formatering", formatJson: "Formatera Json", wrap: "Radbrytning", unwrap: "Ingen radbrytning", downloadJson: "Ladda ner JSON", pubsubMonitor: "PubSub-övervakare", language: "Språk / Language", ok: "OK", addKey: "Lägg till i denna nyckel", addKeyRoot: "Lägg till en rotnyckel", reloadKey: "Ladda om nyckel", reload: "Ladda om", close: "Stäng", commands: "Kommandon", view: "Visa", statistics: "Statistik", refresh: "Uppdatera", pause: "Pausa", resume: "Återuppta", clear: "Rensa", rename: "Byt namn", main: "Databas", cancel: "Avbryt", theme: "Tema", github: "GitHub", githubRepo: "Förråd", githubRelease: "Utgåvor", githubChangelog: "Ändringslogg", info: "Info", settings: "Inställningar", connect: "Anslut", disconnect: "Koppla från", overview: "Översikt", console: "Konsol", noConnections: "Inga anslutningar, lägg till en anslutning i inställningsmenyn.", noConnectionsInSettings: "Inga anslutningar, du kan lägga till en NY ANSLUTNING ovan.", connectionAdd: "Ny anslutning", addGroup: "Lägg till grupp", extend: "Expandera", collapse: "Komprimera", add: "Lägg till", edit: "Redigera", save: "Spara", ttl: "Ange TTL", license: "Ange licens", delete: "Radera", remove: "Ta bort", sure: "Säker", testConnection: "Testa anslutning", getKey: "Laddar Redis-nyckel och tillhörande data ...", jsonViewShow: "Visa JSON", jsonViewEditor: "Redigera JSON", quickConsole: "Snabbkonsol" }, label: { id: { nodeId: 'Nod-ID', id: "Anslutnings-ID", info: "Om du inte vill ändra egenskaperna för: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, ange anslutningens ID i dessa egenskaper för att behålla värdena. Om du vill ha samma logik för nodlösenordet, ange nod-ID:t i nodlösenordet." }, secureFeature: 'Om du ser ett värde som börjar med P3X och ser likadant ut, är det en säkerhetsfunktion. För att ändra inställningarna, ersätt dem med tomt eller något annat så sparas de. Om du inte ändrar inställningarna behålls de som de är på servern.', ssh: { on: 'SSH på', off: 'SSH av', sshHost: 'SSH-värd', sshPort: 'SSH-port', sshUsername: 'SSH-användarnamn', sshPassword: 'SSH-lösenord', sshPrivateKey: 'SSH privat nyckel' }, isBuffer: opts => `[object ArrayBuffer] betyder att värdet är binärdata eller att värdet är större än ${opts.maxValueAsBuffer}`, streamValue: `Stream-fält och värde är på en rad. T.ex.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' betyder autogenererat eller specifikationen som -`, unableToLoadKey: ({ key }) => { return `Kan inte ladda denna nyckel: ${key}. Möjligen har nyckeln raderats. Det exakta felet finns i konsolen.`; }, bigJson: "Detta JSON-objekt är över 10 kb, så se till att du vet vad du gör, eftersom vissa funktioner kan vara långsamma att rendera.", addNode: "Lägg till nod", validateJson: "Validera JSON", reducedFunction: `Reducerad funktionalitet`, tooManyKeys: opts => { return `Det maximala antalet nycklar för full funktionalitet är ${opts.maxLightKeysCount}. Denna databas har fler nycklar totalt ${opts.count}. Nyckelsortering och ytterligare trädinfo är inaktiverat. Sökningen sker bara på servern istället för klientsökning.`; }, redisCommandNotFound: "Inget matchande Redis-kommando hittades ...", treeKeyStore: `Sorteringen (naturlig jämförelse) utförs på klienten, dvs. webbläsaren, vilket innebär att det finns en prestandakostnad för stora uppsättningar, som över 10k nycklar, det kan lägga till lite tid till sidans rendering. Det finns ingen nyckelsortering i Redis, bara så här.`, socketIoTimeout: options => { return `Socket.IO-förfrågan tog för lång tid (max ${options.timeout / 1000} sekunder) ...`; }, resizerInfo: options => { return `Minsta bredd för vänster eller höger panel är ${options.width}px`; }, jsonViewNotParsable: "Detta värde kan inte tolkas som JSON ", ttlTitle: "Ange TTL i sekunder", passwordSecure: "Lösenordet kan vara tomt, men det visar fortfarande tecken, detta är en säkerhetsfunktion.", tlsWithoutCert: "Aktivera TLS utan ytterligare certifikat", tlsRejectUnauthorized: "Avvisa obehörigt certifikat", tlsSecure: "Om du ser en TLS-konfiguration som börjar med P3X eller alla TLS-inställningar ser likadana ut, är det en säkerhetsfunktion. För att ändra inställningarna, ersätt dem med tomt eller något annat så sparas de. Om du inte ändrar TLS-inställningarna behålls de som de är på servern.", treeSeparatorEmpty: "Om trädseparatorn är tom kommer trädet inte ha några kapslade noder, bara en ren lista", treeSeparatorEmptyNote: "Inga kapslade noder, bara en ren lista", welcomeConsole: "Välkommen till Redis-konsolen", welcomeConsoleInfo: "Piltangent UPP eller NER för historik är aktiverat", redisListIndexInfo: "Tomt för att lägga till sist, -1 för att lägga till först eller spara på den visade positionen.", console: "Konsol", connectiondAdd: "Lägg till anslutning", connectiondEdit: "Redigera anslutning", connectiondView: "Visa anslutning", connections: "Anslutningar", licenseInfo: "Licens", licenseEditable: "Licens redigerbar", licenseEditableYes: "Ja", licenseEditableNo: "Nej", licenseTerminalOnly: "Licensen kan bara konfigureras från serverns terminal.", licenseTierPolicyTitle: "Nivåpolicy", licenseTierPolicyText: "

Gratis

Enbart grundläggande Redis UI; ingen SSH-tunnel, inget skrivskyddat anslutningsläge, inget Cluster/Sentinel, ingen Redigera JSON/Ladda upp binär/Ladda ner binär, ingen ReJSON.
Pris: 0 HUF/månad (€0/månad).

Pro

SSH-tunnel, skrivskyddat anslutningsläge (inklusive --readonly-connections/-r), Redigera JSON, Ladda upp binär, Ladda ner binär, ReJSON.
Baspris: 400 HUF/månad (€1/månad) eller 4 000 HUF/år (€10/år).
Totalt med 27% moms: 500 HUF/månad (€1,27/månad) eller 5 100 HUF/år (€12,70/år).

Enterprise

SSH-tunnel, Cluster och Sentinel, plus Redigera JSON, Ladda upp binär, Ladda ner binär, ReJSON; --readonly-connections/-r fungerar också.
Baspris: 1 200 HUF/månad (€3/månad) eller 12 000 HUF/år (€30/år).
Totalt med 27% moms: 1 500 HUF/månad (€3,81/månad) eller 15 200 HUF/år (€38,10/år).

Årsregel

Årspriset är 10x månadspriset.

Platser

Standardlicensen inkluderar 5 platser. Om du behöver fler platser, kontakta oss på support@corifeus.com.

Enterprise-provperiod

10 dagars gratis provperiod för alla med en riktig befintlig e-postadress (ej test-e-post).

Faktureringsinfo via e-post

Namn, Faktura-e-post, Landskod, Postnummer, Stad, Adress, Momsregistreringsnummer (valfritt).

Betalning

PayPal-betalning är tillgänglig enbart i HUF (forint); efter att du skickat pengarna @ https://paypal.me/corifeus skickar jag en faktura. Alla betalningar är icke-återbetalningsbara.

Moms

Moms läggs till priset (27% i Ungern).

Kontakt

Om du vill hälsa eller har en fråga, kontakta support@corifeus.com.

Språk

Faktura och licens-e-postkommunikation sker på engelska. Fakturavaluta är HUF.

Obs

Licensvalidering kräver internetåtkomst.", licenseState: "Status", licenseStateActive: "Aktiv", licenseStateInactive: "Inaktiv", licenseStateNoLicense: "Ingen licens", licenseKeyMasked: "Sparad nyckel", licenseTier: "Nivå", licenseValid: "Giltig", licenseStatus: "Licensstatus", licenseReason: "Orsak", licenseCheckedAt: "Kontrollerad", licenseStartsAt: "Börjar", licenseExpiresAt: "Går ut", licenseDaysLeft: "Dagar kvar", licenseMaxDevices: "Max enheter", licenseActiveDevices: "Aktiva enheter", licenseActiveDevicesInfo: "Om en enhet inte längre används frigörs dess plats automatiskt efter 75 minuter.", licenseCustomerEmail: "Kund-e-post", licenseFeatures: "Funktioner", licenseFeaturesEmpty: "Inga extra funktioner", licenseFeatureReadonlyMode: "Skrivskyddat anslutningsläge", licenseFeatureReadonlyConnectionsFlag: "Skrivskyddade anslutningar (--readonly-connections/-r)", licenseFeatureSsh: "SSH-tunnel", licenseFeatureCluster: "Cluster-anslutningar", licenseFeatureSentinel: "Sentinel-anslutningar", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Nyckelsortering på", off: "Nyckelsortering av" }, cluster: { on: "Cluster på", off: "Cluster av" }, sentinel: { on: "Sentinel på", off: "Sentinel av", name: "Sentinel-namn" }, readonly: { on: "Skrivskydd på", off: "Skrivskydd av" }, proSshOnly: "SSH är tillgängligt i Pro eller Enterprise.", proReadonlyOnly: "Skrivskyddat anslutningsläge är tillgängligt i Pro eller Enterprise.", enterpriseClusterSentinelOnly: "Cluster och Sentinel är tillgängliga enbart i Enterprise.", theme: { light: "Ljus", dark: "Mörk enterprise", darkNeu: "Mörk", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Ansluten: ${opts.name}`; }, tree: "Träd", askAuth: "Fråga efter auktorisering", keyboardShortcuts: "Kortkommandon", about: "Om", supportedLanguages: "Språk som stöds", version: "Version", redisVersion: "Redis-version", modules: "Moduler", shortcutRefresh: "Uppdatera", shortcutSearch: "Fokusera sökning", shortcutNewKey: "Ny nyckel", shortcutDisconnect: "Koppla från", themeAuto: "Automatisk (system)", shortcutCommandPalette: "Kommandopalett", commandPalette: "Kommandopalett", noResults: "Inga resultat", redisCommandsReference: "Redis Kommandon", ungrouped: "Ogrupperad", grouped: "Grupperad", connectFirst: "Anslut först till en Redis-server", searchLanguage: "Sök språk...", exportProgress: "Exporterar nycklar...", importProgress: "Importerar nycklar...", importPreview: "Förhandsgranskning", importOverwrite: "Skriv över", importSkip: "Hoppa över", importConflict: "Om nyckeln redan finns:", noKeysToExport: "Inga nycklar att exportera", time: "Tid", loading: "Laddar...", autoRefresh: "Auto", exportSearchHint: "Exporterar bara nycklar som matchar aktuell sökning", importSearchHint: "Import gäller hela databasen, inte bara sökresultat", importNoKeys: "Inga nycklar hittades i filen", }, status: { dataCopied: "Datan finns i urklipp", licenseSaved: "Licensen sparad", exportDone: "Export klar", indexCreated: "Index skapat", indexDropped: "Index borttaget", importDone: (opts) => `Import klar: ${opts.created} skapade, ${opts.skipped} hoppade över, ${opts.errors} fel`, nodeRemoved: "Nod borttagen", keyIsNotExisting: "Denna nyckel kan ha raderats eller gått ut.", keyCount: opts => { if (opts.keyCount === 0) { return "Ingen nyckel"; } else if (opts.keyCount === 1) { return "1 nyckel"; } else { return `${opts.keyCount} nycklar`; } }, treeExpandAll: "Expandera alla trädlöv. Denna operation kan vara kostsam och kan ta tid ...", noRedisKeys: "Det finns inga nycklar i denna databas.", redisConnected: "Redis anslutet framgångsrikt", reloadingDataInfo: "Laddar om Redis-datainfo", added: "Tillagd", saved: "Uppdaterad", cancelled: "Avbruten", deleted: "Raderad", savedRedis: "Redis-data är sparad", redisDisconnected: opts => { return `Den aktuella anslutningen hade ett fel: ${opts.error.message}`; }, dbChanged: opts => { return `DB-index satt till ${opts.db}. `; }, treeDeleted: opts => { return `Trädnyckeln raderades (${opts.key}).`; }, deletedKey: opts => { return `Nyckeln raderades (${opts.key}).`; }, renamedKey: "Denna nyckel har bytt namn", ttlChanged: "Denna nyckels TTL har ändrats", notInteger: "Denna inmatning är inte ett heltal", persisted: "Denna nyckel finns kvar för alltid", set: "Nyckeln är satt/tillagd" }, code: { "delete-connection": "Denna anslutning raderades, så du är frånkopplad från denna Redis-instans.", "save-connection": "Denna anslutning ändrades, så du är frånkopplad från denna Redis-instans. Du kan ansluta igen.", "readonly-connections": "Anslutningar lägg till/spara/radera är enbart skrivskyddade!", "readonly-connection-mode": "Denna anslutning är i skrivskyddat läge!", "list-out-of-bounds": "Detta listindex är utanför intervallet", "donation-ware-feature": "Denna funktion finns i donationsversionen.", "feature-pro-readonly-required": "Skrivskyddat anslutningsläge kräver Pro- eller Enterprise-licens.", "feature-pro-ssh-required": "SSH-tunnel kräver Pro- eller Enterprise-licens.", "feature-enterprise-cluster-sentinel-required": "Cluster och Sentinel kräver Enterprise-licens.", "feature-pro-json-binary-required": "Redigera JSON, Ladda upp binär och Ladda ner binär kräver Pro- eller Enterprise-licens.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Auktorisering krävs: vänligen autentisera med HTTP Basic Auth och ladda om.", "auto-connection-failed": "Möjligen togs anslutningen bort och den automatiska anslutningen misslyckades på grund av detta.", invalid_console_command: "Detta kommando fungerar inte via GUI." }, licenseReason: { LICENSE_VALID: "Licensen är giltig", LICENSE_INVALID: "Licensen är ogiltig", LICENSE_MISSING: "Ingen licensnyckel angiven", LICENSE_DISABLED: "Licensen är inaktiverad i serverkonfigurationen", LICENSE_NOT_FOUND: "Licensen hittades inte", LICENSE_EXPIRED: "Licensen har gått ut", LICENSE_CLEARED: "Licensnyckeln har rensats", LICENSE_MAX_DEVICES_REACHED: "Maximalt antal enhetsplatser har nåtts", PRODUCT_MISMATCH: "Licensprodukten matchar inte" }, licenseStatusValue: { active: "Aktiv", deleted: "Raderad", all: "Alla", expired: "Utgången", missing: "Saknas", inactive: "Inaktiv" }, form: { error: { required: "Obligatoriskt", port: "Porten måste vara mellan 1-65535", invalid: "Formuläret är ogiltigt" }, connection: { label: { name: "Namn", group: "Grupp", host: "Värdnamn", port: "Port", password: "Lösenord", username: "Användarnamn" } }, treeSettings: { maxValueDisplay: "Max visningslängd för värde", maxValueDisplayInfo: "Om satt till 0, visa fullständiga värden. Om större än 0, korta av till denna längd. Om -1: för strängar, dölj värdet tills redigering; för andra typer, visa fullständigt innehåll.", maxKeys: "Max antal nycklar", maxKeysInfo: "För att GUI:t inte ska krascha begränsar vi max antal nycklar.", keyCount: () => { return `Antal nycklar: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Använd animation", noAnimation: "Ingen animation", jsonFormatTwoSpace: "Formatera JSON med 2 mellanslag", jsonFormatFourSpace: "Formatera JSON med 4 mellanslag", formName: "Redis-inställningar", searchModeClient: "Klientsökningsläge", searchModeServer: "Serversökningsläge", searchModeStartsWith: "Sök med börjar-med-läge", searchModeIncludes: "Sök med innehåller-läge" }, field: { treeSeparator: "Trädseparator", treeSeparatorSelector: "Trädseparatorväljare", page: "Trädpagineringsantal", keyPageCount: "Nyckelpagineringsantal", keysSort: "Sortera nycklarna", searchMode: "Sökläge", searchModeStartsWith: "Sök börjar med / innehåller" }, error: { keyPageCount: "Nyckelsidantal måste vara ett heltal mellan 5 - 100", page: "Sidantalet måste vara ett heltal mellan 10 - 5000", maxValueDisplay: "Det maximala visningsvärdet måste vara ett heltal mellan -1 och 32768", maxKeys: "Det maximala nyckelantalet måste vara ett heltal mellan 100 och 100000" } }, key: { label: { formName: { add: "Lägg till ny Redis-nyckel", edit: "Redigera Redis-nyckel", append: "Lägg till i befintlig Redis-nyckel" } }, field: { streamTimestamp: "Tidsstämpel", key: "Nyckel", type: "Typ", index: "Index", hashKey: "Hash-nyckel", score: "Poäng", value: "Värde" }, error: { streamTimestamp: "Tidsstämpeln krävs, antingen Redis-format eller som *", key: "Nyckeln måste ha minst ett tecken", hashKey: "Hash-tabellnyckeln måste ha minst ett tecken", score: "Sorterad uppsättningspoäng krävs", value: "Värdet krävs" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Sök", index: "Index", query: "Fråga", results: "Resultat", noIndex: "Inga index hittades", createIndex: "Skapa index", dropIndex: "Ta bort index", indexInfo: "Indexinfo", indexName: "Indexnamn", prefix: "Nyckelprefix (valfritt)", fieldName: "Fältnamn", }, monitor: { title: "Övervakning", memory: "Minne", opsPerSec: "Ops/sek", clients: "Klienter", blocked: "Blockerade", hitsMisses: "Träffkvot", networkIo: "Nätverk I/O", slowLog: "Långsam logg", totalCommands: "Totalt", expired: "Utgångna", evicted: "Borttagna", clientList: "Klientlista", topKeys: "Största nycklar efter minne", killClient: "Avsluta klient", clientKilled: "Klient avslutad", confirmKillClient: "Är du säker på att du vill avsluta denna klient?", noKeys: "Inga nycklar", noClients: "Inga klienter", }, overview: { noConnected: "Det finns ingen anslutning till Redis.", overviewClients: "Lista de anslutna efter antal klienter", connectedCount: opt => { if (opt.length === 1) { return "1 klient"; } return `${opt.length} klienter`; } }, key: { label: { key: "Nyckel", encoding: "Kodning", length: "Storlek", ttl: "TTL", ttlTitle: "Livstid", type: "Typ", ttlNotExpire: "går inte ut", lengthString: "byte", lengthItem: "objekt", actions: "Åtgärder" }, list: { table: { index: "Index", value: "Värde" } }, hash: { table: { hashkey: "Hash-nyckel", value: "Värde" } }, set: { table: { value: "Medlem" } }, zset: { table: { value: "Medlem", score: "Poäng" } }, stream: { table: { timestamp: "Tidsstämpel-ID", field: "Fält", value: "Värde" } } }, treeControls: { settings: "Trädinställningar", expandAll: "Expandera alla", collapseAll: "Komprimera alla", search: { search: "Sök bland nycklarna", clear: "Rensa aktuell sökning", placeholderClient: "Sök på klientsidan", placeholderServer: "Sök på serversidan", info: "Klientsidessökning innebär att den matchar texten i sökfältet. Serversidessökning innebär att den söker i nyckelmönster som *{sök-text}*. För stora sökuppsättningar är det bättre att använda serversidessökning. För mindre sökuppsättningar är det bättre att använda klientsidessökning." + ` Om nyckelantalet överstiger ${p3xr.settings.maxLightKeysCount} kan du bara söka på serversidan.`, largeSetInfo: "I en stor uppsättning är klientsidessökning inaktiverad, så just nu är bara serversidessökning möjlig.", infoDetails: "För att ta reda på hur sökningen fungerar, kontrollera inställningarna" }, pager: { next: "Nästa", prev: "Föregående", first: "Första", last: "Sista" } } }, time: { loading: "Laddar...", years: "år", months: "månader", days: "dagar", year: "år", month: "månad", day: "dag" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/sw/000077500000000000000000000000001517666434100140045ustar00rootroot00000000000000src/strings/sw/strings.js000066400000000000000000000674161517666434100160510ustar00rootroot00000000000000const strings = { error: { cleared_license: "Leseni imesafishwa", invalid_license: "Leseni batili", license_max_devices_reached: "Idadi ya juu ya vifaa imefikiwa", license_readonly: "Leseni inaweza kubadilishwa kutoka kwenye terminal ya seva pekee.", server_error: "Hitilafu ya seva, tafadhali jaribu tena" }, title: { donate: "Changia", jsonRecursive: "Kupanua majani yote", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Unaweza kuchagua muunganisho wa Redis kutoka kwenye menyu ya chini kushoto.", statistics: "Takwimu", error: "Hitilafu", connectingRedis: "Inaunganisha na Redis ...", socketioConnectError: "Hitilafu ya Socket.IO", db: "DB", server: "Seva", clients: "Wateja", memory: "Kumbukumbu", persistence: "Uhifadhi", stats: "Takwimu", replication: "Urudufishaji", cpu: "CPU", cluster: "Nguzo", modules: "Moduli", errorstats: "Takwimu za makosa", commandstats: "Takwimu za amri", latencystats: "Takwimu za ucheleweshaji", keysizes: "Ukubwa wa funguo", threads: "Nyuzi", }, confirm: { dropIndex: "Una uhakika unataka kufuta faharasa hii?", uploadBuffer: "Una uhakika wa kupakia data hii ya binary?", uploadBufferDone: "Data ya binary imepakiwa", uploadBufferDoneAndSave: "Data ya binary imepakiwa na kuhifadhiwa kwenye seva", title: "Thibitisha", alert: "Tahadhari", info: "Taarifa", deleteListItem: "Una uhakika wa kufuta kipengee hiki cha orodha?", deleteHashKey: "Una uhakika wa kufuta kipengee hiki cha ufunguo wa hash?", deleteStreamTimestamp: "Una uhakika wa kufuta muhuri huu wa wakati wa mkondo?", deleteSetMember: "Una uhakika wa kufuta mwanachama huyu wa seti?", deleteZSetMember: "Una uhakika wa kufuta mwanachama huyu wa seti iliyopangwa?", deleteConnection: "Thibitisha", deleteConnectionText: "Una uhakika wa kufuta muunganisho huu wa Redis?", deleteNode: "Una uhakika wa kufuta nodi hii ya Redis?", deleteAllKeys: opts => { return `Futa mti huu na funguo zake zote (${opts.key})?`; }, socketioConnectError: "Socket.IO haiwezi kuunganisha na seva, unaweza kupakia upya na kujaribu kutatua hitilafu ya muunganisho mwenyewe, mteja hajui jinsi ya kutatua peke yake.", socketioAuthRequired: "Idhini ya Socket.IO inahitajika. Tafadhali thibitisha na HTTP Basic Auth (jina la mtumiaji/nenosiri) na upakia upya.", deleteKey: "Una uhakika wa kufuta ufunguo huu?", rename: { title: "Una uhakika wa kubadilisha jina la ufunguo huu?", textContent: "Hatua hii inabadilisha jina la ufunguo kwa kudumu.", placeholder: "Ufunguo wa Redis (lazima)" }, ttl: { title: "Una uhakika unataka kubadilisha TTL ya ufunguo huu?", textContent: "Kubadilisha TTL kunasasisha muda wa kuishi wa ufunguo huu. Acha tupu ili kuhifadhi ufunguo huu milele.", placeholder: "TTL ya ufunguo wa Redis (nambari kamili au tupu)", placeholderPlaceholder: "Tupu inamaanisha unaendelea milele; vinginevyo ingiza nambari kamili.", convertTextToTime: "Badilisha maandishi kuwa wakati", convertTextToTimePlaceholder: "Mfano 1d itakuwa 86400" }, license: { title: "Weka leseni", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20ac1/month) or 4,000 HUF/year (\u20ac10/year), and Enterprise 1,200 HUF/month (\u20ac3/month) or 12,000 HUF/year (\u20ac30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20ac1.27/month) or 5,100 HUF/year (\u20ac12.70/year), Enterprise 1,500 HUF/month (\u20ac3.81/month) or 15,200 HUF/year (\u20ac38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Ufunguo wa leseni" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "Kibulgaria / Bulgarian", cs: "Kicheki / Czech", de: "Kijerumani / German", el: "Kigiriki / Greek", en: "Kiingereza / English", es: "Kihispania / Spanish", fr: "Kifaransa / French", hu: "Kihungari / Hungarian", it: "Kiitaliano / Italian", ja: "Kijapani / Japanese", nl: "Kiholanzi / Dutch", pl: "Kipolandi / Polish", "pt-PT": "Kireno / Portuguese", ro: "Kiromania / Romanian", ru: "Kirusi / Russian", sk: "Kislovaki / Slovak", sr: "Kiserbia / Serbian", sv: "Kiswidi / Swedish", tr: "Kituruki / Turkish", uk: "Kiukrania / Ukrainian", zn: "Kichina / Chinese", ar: "Kiarabu / Arabic", az: "Kiazabaijani / Azerbaijani", be: "Kibelarusi / Belarusian", bn: "Kibengali / Bengali", da: "Kidenmaki / Danish", et: "Kiestonia / Estonian", fi: "Kifini / Finnish", fil: "Kifilipino / Filipino", he: "Kiebrania / Hebrew", hr: "Kikroeshia / Croatian", hy: "Kiarmenia / Armenian", id: "Kiindonesia / Indonesian", ka: "Kijojia / Georgian", kk: "Kikazaki / Kazakh", km: "Kikambodia / Khmer", ko: "Kikorea / Korean", ky: "Kikirigizi / Kyrgyz", lt: "Kilithuania / Lithuanian", mk: "Kimasedonia / Macedonian", ms: "Kimalei / Malay", ne: "Kinepali / Nepali", no: "Kinorwe / Norwegian", "pt-BR": "Kireno (Brazili) / Portuguese (Brazil)", sl: "Kislovenia / Slovenian", tg: "Kitajiki / Tajik", th: "Kithai / Thai", vi: "Kivietinamu / Vietnamese", "zh-HK": "Kichina (Hong Kong) / Chinese (Hong Kong)", "zh-TW": "Kichina (Taiwan) / Chinese (Taiwan)", sw: "Kiswahili / Swahili", si: "Kisinhala / Sinhala", ta: "Kitamili / Tamil", bs: "Kibosnia / Bosnian" }, intention: { copy: "Nakili", downloadBuffer: "Pakua binary", setBuffer: "Pakia binary", exportKeys: "Hamisha funguo", exportAllKeys: (opts) => `Hamisha funguo zote ${opts.count}`, exportSearchResults: (opts) => `Hamisha matokeo ${opts.count}`, importKeys: "Ingiza funguo", saveWithFormatJson: "Hifadhi na muundo", formatJson: "Umbiza Json", wrap: "Funga", unwrap: "Fungua", downloadJson: "Pakua JSON", pubsubMonitor: "Mfuatiliaji wa PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Lugha / Language", ok: "Sawa", addKey: "Ongeza kwa ufunguo huu", addKeyRoot: "Ongeza ufunguo wa msingi", reloadKey: "Pakia upya ufunguo", reload: "Pakia upya", close: "Funga", commands: "Amri", view: "Tazama", statistics: "Takwimu", refresh: "Onyesha upya", pause: "Simamisha", resume: "Endelea", clear: "Futa", rename: "Badilisha jina", main: "Hifadhidata", cancel: "Ghairi", theme: "Mandhari", github: "GitHub", githubRepo: "Hifadhi", githubRelease: "Matoleo", githubChangelog: "Kumbukumbu ya mabadiliko", info: "Info", settings: "Mipangilio", connect: "Unganisha", disconnect: "Tenganisha", overview: "Muhtasari", console: "Konsoli", noConnections: "Hakuna muunganisho, ongeza muunganisho kwenye menyu ya mipangilio.", noConnectionsInSettings: "Hakuna muunganisho, unaweza kuongeza MUUNGANISHO MPYA hapo juu.", connectionAdd: "Muunganisho mpya", addGroup: "Ongeza kundi", extend: "Panua", collapse: "Kunja", add: "Ongeza", edit: "Hariri", save: "Hifadhi", ttl: "Weka TTL", license: "Weka leseni", delete: "Futa", remove: "Ondoa", sure: "Hakika", testConnection: "Jaribu muunganisho", getKey: "Inapakia ufunguo wa Redis na data inayohusiana ...", jsonViewShow: "Onyesha JSON", jsonViewEditor: "Hariri JSON", quickConsole: "Konsoli ya Haraka" }, label: { id: { nodeId: 'Kitambulisho cha Nodi', id: "Kitambulisho cha Muunganisho", info: "Ikiwa hutaki kubadilisha mali za: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, tafadhali ingiza Kitambulisho cha muunganisho kwenye mali hizo ili kuhifadhi thamani za mali. Ikiwa unataka mantiki sawa katika nenosiri la nodi, basi ingiza Kitambulisho cha nodi kwenye nenosiri la nodi." }, secureFeature: 'Ikiwa unaona thamani inayoanza na P3X na inaonekana sawa, ni kipengele cha usalama. Ili kubadilisha mipangilio, badilisha mipangilio hii na tupu au kitu kingine na itahifadhiwa. Ikiwa haubadilishi mipangilio, mipangilio itabaki kama ilivyo kwenye seva.', ssh: { on: 'SSH imewashwa', off: 'SSH imezimwa', sshHost: 'Mwenyeji wa SSH', sshPort: 'Bandari ya SSH', sshUsername: 'Jina la mtumiaji wa SSH', sshPassword: 'Nenosiri la SSH', sshPrivateKey: 'Ufunguo wa faragha wa SSH' }, isBuffer: opts => `[object ArrayBuffer] inamaanisha kuwa thamani ni data ya binary au thamani ni kubwa kuliko ${opts.maxValueAsBuffer}`, streamValue: `Uga na thamani ya mkondo ni mstari mmoja. Mfano: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' inamaanisha kuzalishwa kiotomatiki au ainisho kama -`, unableToLoadKey: ({ key }) => { return `Haiwezekani kupakia ufunguo huu: ${key}. Huenda ufunguo umefutwa. Hitilafu halisi iko kwenye konsoli.`; }, bigJson: "Kitu hiki cha JSON kina zaidi ya 10 kb, kwa hivyo hakikisha unajua unachofanya, kwa sababu baadhi ya kazi zinaweza kuwa polepole katika uonyeshaji.", addNode: "Ongeza nodi", validateJson: "Thibitisha JSON", reducedFunction: `Utendaji uliopunguzwa`, tooManyKeys: opts => { return `Kwa kazi kamili za juu, funguo zinazoruhusiwa ni ${opts.maxLightKeysCount} jumla. Hifadhidata hii ina zaidi ya funguo zinazoruhusiwa jumla ${opts.count}. Upangaji wa funguo na taarifa za ziada za mti wa mapambo zimezimwa. Utafutaji unafanyika kwenye seva badala ya utafutaji wa mteja.`; }, redisCommandNotFound: "Hakuna amri ya Redis inayolingana iliyopatikana ...", treeKeyStore: `Upangaji (ulinganisho wa asili) unatekelezwa kwenye mteja yaani kivinjari, ambayo inamaanisha ina adhabu kwa seti kubwa, kama zaidi ya funguo 10k, inaweza kuongeza muda kidogo kwa uonyeshaji wa ukurasa. Hakuna upangaji wa funguo katika Redis, ni kama hii tu.`, socketIoTimeout: options => { return `Socket.IO imekwisha muda kwa ombi hili (upeo ${options.timeout / 1000} sekunde) ...`; }, resizerInfo: options => { return `Upana wa chini wa paneli ya kushoto au kulia ni ${options.width}px`; }, jsonViewNotParsable: "Thamani hii haiwezi kuchambuliwa kama JSON ", ttlTitle: "Weka TTL kwa sekunde", passwordSecure: "Nenosiri linaweza kuwa tupu, lakini bado litaonyesha herufi, hii ni kipengele cha usalama.", tlsWithoutCert: "Wezesha TLS bila cheti cha ziada", tlsRejectUnauthorized: "Kataa cheti kisichoidhinishwa", tlsSecure: "Ikiwa unaona usanidi wa TLS unaoanza na P3X au mipangilio yote ya TLS inaonekana sawa, ni kipengele cha usalama. Ili kubadilisha mipangilio, badilisha mipangilio hii na tupu au kitu kingine na itahifadhiwa. Ikiwa haubadilishi mipangilio ya TLS, mipangilio itabaki kama ilivyo kwenye seva.", treeSeparatorEmpty: "Ikiwa kitenganishi cha mti ni tupu, mti hautakuwa na nodi zilizopachikwa, orodha safi tu", treeSeparatorEmptyNote: "Hakuna nodi zilizopachikwa, orodha safi tu", welcomeConsole: "Karibu kwenye Konsoli ya Redis", welcomeConsoleInfo: "Historia ya Mshale JUU au CHINI imewezeshwa", redisListIndexInfo: "Tupu kuongeza, -1 kuongeza mbele au hifadhi kwenye nafasi iliyoonyeshwa.", console: "Konsoli", connectiondAdd: "Ongeza muunganisho", connectiondEdit: "Hariri muunganisho", connectiondView: "Tazama muunganisho", connections: "Muunganisho", licenseInfo: "Leseni", licenseEditable: "Leseni inaweza kuhaririwa", licenseEditableYes: "Ndiyo", licenseEditableNo: "Hapana", licenseTerminalOnly: "Leseni inaweza kusanidiwa kutoka kwenye terminal ya seva pekee.", licenseTierPolicyTitle: "Sera ya ngazi", licenseTierPolicyText: "

Bure

Redis UI ya msingi pekee; hakuna uhandisi wa SSH, hakuna hali ya muunganisho wa Kusoma tu, hakuna Nguzo/Mlinzi, hakuna Kuhariri JSON/Kupakia binary/Kupakua binary, hakuna ReJSON.
Bei: 0 HUF/mwezi (\u20ac0/mwezi).

Pro

Uhandisi wa SSH, hali ya muunganisho wa Kusoma tu (ikiwa ni pamoja na --readonly-connections/-r), Kuhariri JSON, Kupakia binary, Kupakua binary, ReJSON.
Bei ya msingi: 400 HUF/mwezi (\u20ac1/mwezi) au 4,000 HUF/mwaka (\u20ac10/mwaka).
Jumla na 27% VAT: 500 HUF/mwezi (\u20ac1.27/mwezi) au 5,100 HUF/mwaka (\u20ac12.70/mwaka).

Enterprise

Uhandisi wa SSH, Nguzo na Mlinzi, pamoja na Kuhariri JSON, Kupakia binary, Kupakua binary, ReJSON; --readonly-connections/-r pia inafanya kazi.
Bei ya msingi: 1,200 HUF/mwezi (\u20ac3/mwezi) au 12,000 HUF/mwaka (\u20ac30/mwaka).
Jumla na 27% VAT: 1,500 HUF/mwezi (\u20ac3.81/mwezi) au 15,200 HUF/mwaka (\u20ac38.10/mwaka).

Kanuni ya kila mwaka

Bei ya kila mwaka ni 10x bei ya kila mwezi.

Viti

Leseni ya kawaida inajumuisha viti 5. Ikiwa unahitaji viti zaidi, wasiliana nasi kwa support@corifeus.com.

Jaribio la Enterprise

Siku 10 bure kwa mtu yeyote aliye na anwani halisi ya barua pepe (sio barua pepe ya majaribio).

Taarifa za malipo kwa barua pepe

Jina, Barua pepe ya malipo, Msimbo wa nchi, Msimbo wa posta, Jiji, Anwani, Kitambulisho cha VAT (hiari).

Malipo

Malipo ya PayPal yanapatikana kwa HUF (forint) pekee; baada ya kutuma pesa @ https://paypal.me/corifeus nitakutumia ankara. Malipo yote hayarudishwi.

VAT

VAT inaongezwa kwenye bei (27% nchini Hungaria).

Mawasiliano

Ikiwa unataka kusema habari au una swali, wasiliana na support@corifeus.com.

Lugha

Ankara na mawasiliano ya barua pepe ya leseni ni kwa Kiingereza. Sarafu ya ankara ni HUF.

Kumbuka

Uthibitishaji wa leseni unahitaji upatikanaji wa mtandao.", licenseState: "Hali", licenseStateActive: "Hai", licenseStateInactive: "Haifanyi kazi", licenseStateNoLicense: "Hakuna leseni", licenseKeyMasked: "Ufunguo uliohifadhiwa", licenseTier: "Ngazi", licenseValid: "Halali", licenseStatus: "Hali ya leseni", licenseReason: "Sababu", licenseCheckedAt: "Imeangaliwa saa", licenseStartsAt: "Inaanza saa", licenseExpiresAt: "Inaisha saa", licenseDaysLeft: "Siku zilizobaki", licenseMaxDevices: "Vifaa vya juu", licenseActiveDevices: "Vifaa vilivyo hai", licenseActiveDevicesInfo: "Ikiwa kifaa hakitumiki tena, kiti chake kinatolewa kiotomatiki baada ya dakika 75.", licenseCustomerEmail: "Barua pepe ya mteja", licenseFeatures: "Vipengele", licenseFeaturesEmpty: "Hakuna vipengele vya ziada", licenseFeatureReadonlyMode: "Hali ya muunganisho wa kusoma tu", licenseFeatureReadonlyConnectionsFlag: "Muunganisho wa kusoma tu (--readonly-connections/-r)", licenseFeatureSsh: "Uhandisi wa SSH", licenseFeatureCluster: "Muunganisho wa nguzo", licenseFeatureSentinel: "Muunganisho wa mlinzi", licenseFeatureReJSON: "ReJSON (aina ya data ya JSON)", keysSort: { on: "Upangaji wa funguo umewashwa", off: "Upangaji wa funguo umezimwa" }, cluster: { on: "Nguzo imewashwa", off: "Nguzo imezimwa" }, sentinel: { on: "Mlinzi amewashwa", off: "Mlinzi amezimwa", name: "Jina la mlinzi" }, readonly: { on: "Kusoma tu kumewashwa", off: "Kusoma tu kumezimwa" }, proSshOnly: "SSH inapatikana katika Pro au Enterprise.", proReadonlyOnly: "Hali ya muunganisho wa kusoma tu inapatikana katika Pro au Enterprise.", enterpriseClusterSentinelOnly: "Nguzo na Mlinzi zinapatikana katika Enterprise pekee.", theme: { light: "Mwanga", dark: "Giza enterprise", darkNeu: "Giza", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Imeunganishwa: ${opts.name}`; }, tree: "Mti", askAuth: "Omba idhini", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Moduli", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Tenganisha", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Amri za Redis", ungrouped: "Bila kikundi", grouped: "Grouped", connectFirst: "Unganisha kwanza kwa seva ya Redis", searchLanguage: "Tafuta lugha...", exportProgress: "Kuhamisha funguo...", importProgress: "Kuingiza funguo...", importPreview: "Hakiki", importOverwrite: "Andika juu", importSkip: "Ruka", importConflict: "Ikiwa ufunguo tayari upo:", noKeysToExport: "Hakuna funguo za kuhamisha", time: "Muda", loading: "Inapakia...", autoRefresh: "Otomatiki", exportSearchHint: "Kuhamisha funguo zinazolingana na utafutaji wa sasa pekee", importSearchHint: "Uingizaji unatumika kwa hifadhidata nzima, si matokeo ya utafutaji pekee", importNoKeys: "Hakuna funguo zilizopatikana kwenye faili", }, status: { dataCopied: "Data iko kwenye ubao wa kunakili", licenseSaved: "Leseni imehifadhiwa", exportDone: "Uhamishaji umekamilika", indexCreated: "Faharasa imeundwa", indexDropped: "Faharasa imefutwa", importDone: (opts) => `Uingizaji umekamilika: ${opts.created} vimeundwa, ${opts.skipped} vimerukwa, ${opts.errors} makosa`, nodeRemoved: "Nodi imeondolewa", keyIsNotExisting: "Ufunguo huu unaweza kuwa umefutwa au umekwisha muda.", keyCount: opts => { if (opts.keyCount === 0) { return "Hakuna ufunguo"; } else if (opts.keyCount === 1) { return "Ufunguo 1"; } else { return `Funguo ${opts.keyCount}`; } }, treeExpandAll: "Panua majani yote ya mti. Operesheni hii inaweza kuwa ghali na inaweza kuchukua muda ...", noRedisKeys: "Hakuna funguo katika hifadhidata hii.", redisConnected: "Redis imeunganishwa kwa mafanikio", reloadingDataInfo: "Inapakia upya taarifa za data za Redis", added: "Imeongezwa", saved: "Imesasishwa", cancelled: "Imeghairiwa", deleted: "Imefutwa", savedRedis: "Data ya Redis imehifadhiwa", redisDisconnected: opts => { return `Muunganisho wa sasa ulikuwa na hitilafu: ${opts.error.message}`; }, dbChanged: opts => { return `Faharasa ya db imewekwa kuwa ${opts.db}. `; }, treeDeleted: opts => { return `Ufunguo wa mti umefutwa (${opts.key}).`; }, deletedKey: opts => { return `Ufunguo umefutwa (${opts.key}).`; }, renamedKey: "Ufunguo huu umebadilishwa jina", ttlChanged: "TTL ya ufunguo huu imebadilishwa", notInteger: "Ingizo hili si nambari kamili", persisted: "Ufunguo huu umehifadhiwa milele", set: "Ufunguo umewekwa/imeongezwa" }, code: { "delete-connection": "Muunganisho huu umefutwa, kwa hivyo umetenganishwa na mfano huu wa Redis.", "save-connection": "Muunganisho huu umebadilishwa, kwa hivyo umetenganishwa na mfano huu wa Redis. Unaweza kuunganisha tena.", "readonly-connections": "Muunganisho wa kuongeza/kuhifadhi/kufuta ni wa kusoma pekee!", "readonly-connection-mode": "Muunganisho huu ni wa hali ya kusoma pekee!", "list-out-of-bounds": "Faharasa hii ya orodha iko nje ya mipaka", "donation-ware-feature": "Kipengele hiki kipo katika toleo la mchango.", "feature-pro-readonly-required": "Hali ya muunganisho wa kusoma pekee inahitaji leseni ya Pro au Enterprise.", "feature-pro-ssh-required": "Uhandisi wa SSH unahitaji leseni ya Pro au Enterprise.", "feature-enterprise-cluster-sentinel-required": "Nguzo na Mlinzi zinahitaji leseni ya Enterprise.", "feature-pro-json-binary-required": "Kuhariri JSON, Kupakia binary na Kupakua binary zinahitaji leseni ya Pro au Enterprise.", "feature-pro-rejson-required": "ReJSON (aina ya data ya JSON) inahitaji leseni ya Pro au Enterprise.", "invalid-json-value": "Thamani si JSON halali.", "http_auth_required": "Idhini inahitajika: tafadhali thibitisha na HTTP Basic Auth na upakia upya.", "auto-connection-failed": "Huenda muunganisho uliondolewa na muunganisho wa kiotomatiki umeshindwa kwa sababu hiyo.", invalid_console_command: "Amri hii haifanyi kazi kupitia GUI." }, licenseReason: { LICENSE_VALID: "Leseni ni halali", LICENSE_INVALID: "Leseni ni batili", LICENSE_MISSING: "Hakuna ufunguo wa leseni uliowekwa", LICENSE_DISABLED: "Leseni imezimwa katika usanidi wa seva", LICENSE_NOT_FOUND: "Leseni haikupatikana", LICENSE_EXPIRED: "Leseni imekwisha muda", LICENSE_CLEARED: "Ufunguo wa leseni umesafishwa", LICENSE_MAX_DEVICES_REACHED: "Idadi ya juu ya viti vya vifaa imefikiwa", PRODUCT_MISMATCH: "Bidhaa ya leseni hailingani" }, licenseStatusValue: { active: "Hai", deleted: "Imefutwa", all: "Zote", expired: "Imekwisha muda", missing: "Inakosekana", inactive: "Haifanyi kazi" }, form: { error: { required: "Inahitajika", port: "Bandari ni kati ya 1-65535", invalid: "Fomu ni batili" }, connection: { label: { name: "Jina", group: "Group", host: "Jina la mwenyeji", port: "Bandari", password: "Nenosiri", username: "Jina la mtumiaji" } }, treeSettings: { maxValueDisplay: "Urefu wa juu wa kuonyesha thamani", maxValueDisplayInfo: "Ikiwa imewekwa 0, onyesha thamani kamili. Ikiwa kubwa kuliko 0, punguza hadi urefu huu. Ikiwa -1: kwa herufi, ficha thamani hadi kuhariri; kwa aina nyingine, onyesha maudhui kamili.", maxKeys: "Idadi ya juu ya funguo", maxKeysInfo: "Ili GUI isishindwe, tunapunguza idadi ya juu ya funguo.", keyCount: () => { return `Idadi ya funguo: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Tumia uhuishaji", noAnimation: "Hakuna uhuishaji", jsonFormatTwoSpace: "Umbiza JSON na nafasi 2", jsonFormatFourSpace: "Umbiza JSON na nafasi 4", formName: "Mipangilio ya Redis", searchModeClient: "Hali ya utafutaji wa mteja", searchModeServer: "Hali ya utafutaji wa seva", searchModeStartsWith: "Tafuta na hali ya kuanza na", searchModeIncludes: "Tafuta inajumuisha hali" }, field: { treeSeparator: "Kitenganishi cha mti", treeSeparatorSelector: "Kichaguzi cha kitenganishi cha mti", page: "Idadi ya kurasa za mti", keyPageCount: "Idadi ya kurasa za funguo", keysSort: "Panga funguo", searchMode: "Hali ya utafutaji", searchModeStartsWith: "Utafutaji huanza na / inajumuisha" }, error: { keyPageCount: "Idadi ya kurasa za funguo lazima iwe nambari kamili kati ya 5 - 100", page: "Idadi ya kurasa lazima iwe nambari kamili kati ya 10 - 5000", maxValueDisplay: "Thamani ya juu ya kuonyesha lazima iwe nambari kamili kati ya -1 na 32768", maxKeys: "Thamani ya juu ya idadi ya funguo lazima iwe nambari kamili kati ya 100 na 100000" } }, key: { label: { formName: { add: "Ongeza ufunguo mpya wa Redis", edit: "Hariri ufunguo wa Redis", append: "Ongeza kwa ufunguo uliopo wa Redis" } }, field: { streamTimestamp: "Muhuri wa wakati", key: "Ufunguo", type: "Aina", index: "Faharasa", hashKey: "Ufunguo wa Hash", score: "Alama", value: "Thamani" }, error: { streamTimestamp: "Muhuri wa wakati unahitajika, ama muundo wa Redis au kama *", key: "Ufunguo ni, angalau, herufi moja", hashKey: "Ufunguo wa jedwali la hash ni angalau herufi moja", score: "Alama ya seti iliyopangwa inahitajika", value: "Thamani inahitajika" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Tafuta", index: "Faharasa", query: "Swali", results: "Matokeo", noIndex: "Hakuna faharasa", createIndex: "Unda faharasa", dropIndex: "Futa faharasa", indexInfo: "Maelezo ya faharasa", indexName: "Jina la faharasa", prefix: "Kiambishi awali cha ufunguo (hiari)", fieldName: "Jina la uga", }, monitor: { title: "Ufuatiliaji", memory: "Kumbukumbu", opsPerSec: "Ops/sek", clients: "Wateja", blocked: "Imezuiwa", hitsMisses: "Kiwango cha hit", networkIo: "Mtandao I/O", slowLog: "Logi polepole", totalCommands: "Jumla", expired: "Imeisha muda", evicted: "Imefukuzwa", clientList: "Orodha ya wateja", topKeys: "Funguo kubwa zaidi kwa kumbukumbu", killClient: "Ua mteja", clientKilled: "Mteja ameondolewa", confirmKillClient: "Una uhakika unataka kusimamisha mteja huyu?", noKeys: "Hakuna funguo", noClients: "Hakuna wateja", }, overview: { noConnected: "Hakuna muunganisho na Redis.", overviewClients: "Orodhesha wateja waliounganishwa kwa idadi ya wateja", connectedCount: opt => { if (opt.length === 1) { return "Mteja 1"; } return `Wateja ${opt.length}`; } }, key: { label: { key: "Ufunguo", encoding: "Usimbaji", length: "Ukubwa", ttl: "TTL", ttlTitle: "Muda wa Kuishi", type: "Aina", ttlNotExpire: "haiishi", lengthString: "baiti", lengthItem: "vipengee", actions: "Vitendo" }, list: { table: { index: "Faharasa", value: "Thamani" } }, hash: { table: { hashkey: "Ufunguo wa Hash", value: "Thamani" } }, set: { table: { value: "Mwanachama" } }, zset: { table: { value: "Mwanachama", score: "Alama" } }, stream: { table: { timestamp: "Kitambulisho cha Muhuri wa Wakati", field: "Uga", value: "Thamani" } } }, treeControls: { settings: "Mipangilio ya mti", expandAll: "Panua yote", collapseAll: "Kunja yote", search: { search: "Tafuta kwenye funguo", clear: "Futa utafutaji wa sasa ili kuweka tupu", placeholderClient: "Tafuta upande wa mteja", placeholderServer: "Tafuta upande wa seva", info: "Utafutaji wa upande wa mteja unamaanisha kuwa unalingana na maandishi kwenye ingizo la utafutaji. Utafutaji wa upande wa seva unamaanisha kuwa ni utafutaji kama katika mifumo ya funguo kama *{search-text}*. Kwa seti kubwa za utafutaji, ni bora kutumia utafutaji wa upande wa seva. Kwa seti ndogo za utafutaji, ni bora kutumia hali ya utafutaji wa upande wa mteja." + ` Ikiwa idadi ya funguo ni zaidi ya ${p3xr.settings.maxLightKeysCount}, unaweza kutafuta tu upande wa seva.`, largeSetInfo: "Katika seti kubwa, utafutaji wa upande wa mteja umezimwa. kwa hivyo sasa hivi utafutaji wa upande wa seva pekee ndio unaowezekana.", infoDetails: "Ili kujua jinsi utafutaji unavyofanya kazi, tafadhali angalia mipangilio" }, pager: { next: "Inayofuata", prev: "Iliyotangulia", first: "Ya kwanza", last: "Ya mwisho" } } }, time: { loading: "Inapakia...", years: "miaka", months: "miezi", days: "siku", year: "mwaka", month: "mwezi", day: "siku" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/ta/000077500000000000000000000000001517666434100137575ustar00rootroot00000000000000src/strings/ta/strings.js000066400000000000000000001444071517666434100160200ustar00rootroot00000000000000const strings = { error: { cleared_license: "உரிமம் அழிக்கப்பட்டது", invalid_license: "தவறான உரிமம்", license_max_devices_reached: "அதிகபட்ச சாதன இடங்கள் எட்டப்பட்டது", license_readonly: "உரிமத்தை சேவையக முனையத்தில் இருந்து மட்டுமே மாற்ற முடியும்.", server_error: "சேவையக பிழை, மீண்டும் முயற்சிக்கவும்" }, title: { donate: "நன்கொடை", jsonRecursive: "அனைத்து இலைகளையும் விரிவாக்குகிறது", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "இடது கீழ் மெனுவிலிருந்து Redis இணைப்பைத் தேர்வு செய்யலாம்.", statistics: "புள்ளிவிவரங்கள்", error: "பிழை", connectingRedis: "Redis உடன் இணைக்கிறது ...", socketioConnectError: "Socket.IO பிழை", db: "DB", server: "சேவையகம்", clients: "வாடிக்கையாளர்கள்", memory: "நினைவகம்", persistence: "நிலைத்தன்மை", stats: "புள்ளிவிவரங்கள்", replication: "நகலாக்கம்", cpu: "CPU", cluster: "கொத்து", modules: "modules", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "இந்த குறியீட்டை நீக்க விரும்புகிறீர்களா?", uploadBuffer: "இந்த பைனரி தரவை பதிவேற்ற விரும்புகிறீர்களா?", uploadBufferDone: "பைனரி தரவு பதிவேற்றப்பட்டது", uploadBufferDoneAndSave: "பைனரி தரவு பதிவேற்றப்பட்டு சேவையகத்தில் சேமிக்கப்பட்டது", title: "உறுதிப்படுத்தவும்", alert: "எச்சரிக்கை", info: "தகவல்", deleteListItem: "இந்த பட்டியல் உருப்படியை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteHashKey: "இந்த ஹாஷ் விசை உருப்படியை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteStreamTimestamp: "இந்த ஸ்ட்ரீம் நேர முத்திரையை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteSetMember: "இந்த தொகுப்பு உறுப்பினரை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteZSetMember: "இந்த வரிசைப்படுத்தப்பட்ட தொகுப்பு உறுப்பினரை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteConnection: "உறுதிப்படுத்தவும்", deleteConnectionText: "இந்த Redis இணைப்பை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteNode: "இந்த Redis முனையை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", deleteAllKeys: opts => { return `இந்த மரத்தையும் அதன் அனைத்து விசைகளையும் நீக்கவா (${opts.key})?`; }, socketioConnectError: "Socket.IO சேவையகத்துடன் இணைக்க முடியவில்லை, நீங்கள் மீளேற்றம் செய்து இணைப்புப் பிழையை தீர்க்க முயற்சிக்கலாம், வாடிக்கையாளருக்கு அதை தானே தீர்க்கத் தெரியவில்லை.", socketioAuthRequired: "Socket.IO அங்கீகாரம் தேவை. தயவுசெய்து HTTP Basic Auth (பயனர்பெயர்/கடவுச்சொல்) மூலம் அங்கீகரித்து மீளேற்றம் செய்யவும்.", deleteKey: "இந்த விசையை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", rename: { title: "இந்த விசையை நிச்சயமாக மறுபெயரிட விரும்புகிறீர்களா?", textContent: "இந்த செயல் விசையை நிரந்தரமாக மறுபெயரிடும்.", placeholder: "Redis விசை (தேவை)" }, ttl: { title: "இந்த விசையின் TTL ஐ மாற்ற விரும்புகிறீர்களா?", textContent: "TTL ஐ மாற்றுவது இந்த விசையின் வாழ்நாளை புதுப்பிக்கும். இந்த விசையை எப்போதும் வைக்க காலியாக விடவும்.", placeholder: "Redis விசையின் TTL (முழு எண் அல்லது காலி)", placeholderPlaceholder: "காலி என்றால் நிரந்தரமாக இருக்கும்; இல்லையெனில் முழு எண்ணை உள்ளிடவும்.", convertTextToTime: "உரையை நேரமாக மாற்றவும்", convertTextToTimePlaceholder: "எ.கா. 1d 86400 ஆக இருக்கும்" }, license: { title: "உரிமத்தை அமைக்கவும்", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (\u20ac1/month) or 4,000 HUF/year (\u20ac10/year), and Enterprise 1,200 HUF/month (\u20ac3/month) or 12,000 HUF/year (\u20ac30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (\u20ac1.27/month) or 5,100 HUF/year (\u20ac12.70/year), Enterprise 1,500 HUF/month (\u20ac3.81/month) or 15,200 HUF/year (\u20ac38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "உரிம விசை" } }, language: { // When you translate the english name, keep the Language in English // eg. Inglés / English bg: "பல்கேரியன் / Bulgarian", cs: "செக் / Czech", de: "ஜெர்மன் / German", el: "கிரேக்கம் / Greek", en: "ஆங்கிலம் / English", es: "ஸ்பானிஷ் / Spanish", fr: "பிரெஞ்சு / French", hu: "ஹங்கேரியன் / Hungarian", it: "இத்தாலியன் / Italian", ja: "ஜப்பானியம் / Japanese", nl: "டச்சு / Dutch", pl: "போலிஷ் / Polish", "pt-PT": "போர்த்துகீசியம் / Portuguese", ro: "ரோமேனியன் / Romanian", ru: "ரஷ்யன் / Russian", sk: "ஸ்லோவாக் / Slovak", sr: "செர்பியன் / Serbian", sv: "ஸ்வீடிஷ் / Swedish", tr: "துருக்கியம் / Turkish", uk: "உக்ரேனியன் / Ukrainian", zn: "சீனம் / Chinese", ar: "அரபு / Arabic", az: "அசர்பைஜானி / Azerbaijani", be: "பெலருசியன் / Belarusian", bn: "வங்காளம் / Bengali", da: "டேனிஷ் / Danish", et: "எஸ்தோனியன் / Estonian", fi: "பின்னிஷ் / Finnish", fil: "பிலிப்பினோ / Filipino", he: "எபிரேயம் / Hebrew", hr: "குரோஷியன் / Croatian", hy: "ஆர்மீனியன் / Armenian", id: "இந்தோனேசியன் / Indonesian", ka: "ஜோர்ஜியன் / Georgian", kk: "கசாக் / Kazakh", km: "கெமர் / Khmer", ko: "கொரியன் / Korean", ky: "கிர்கிஸ் / Kyrgyz", lt: "லிதுவேனியன் / Lithuanian", mk: "மாசிடோனியன் / Macedonian", ms: "மலாய் / Malay", ne: "நேபாளி / Nepali", no: "நார்வேஜியன் / Norwegian", "pt-BR": "போர்த்துகீசியம் (பிரேசில்) / Portuguese (Brazil)", sl: "ஸ்லோவேனியன் / Slovenian", tg: "தஜிக் / Tajik", th: "தாய் / Thai", vi: "வியட்நாமியம் / Vietnamese", "zh-HK": "சீனம் (ஹாங்காங்) / Chinese (Hong Kong)", "zh-TW": "சீனம் (தைவான்) / Chinese (Taiwan)", sw: "ஸ்வாஹிலி / Swahili", si: "சிங்களம் / Sinhala", ta: "தமிழ் / Tamil", bs: "போஸ்னியன் / Bosnian" }, intention: { copy: "நகலெடு", downloadBuffer: "பைனரி பதிவிறக்கம்", setBuffer: "பைனரி பதிவேற்றம்", exportKeys: "விசைகளை ஏற்றுமதி செய்", exportAllKeys: (opts) => `அனைத்து ${opts.count} விசைகளையும் ஏற்றுமதி செய்`, exportSearchResults: (opts) => `${opts.count} முடிவுகளை ஏற்றுமதி செய்`, importKeys: "விசைகளை இறக்குமதி செய்", saveWithFormatJson: "வடிவமைப்புடன் சேமி", formatJson: "Json வடிவமை", wrap: "மடி", unwrap: "விரி", downloadJson: "JSON பதிவிறக்கம்", pubsubMonitor: "PubSub கண்காணிப்பான்", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "மொழி / Language", ok: "சரி", addKey: "இந்த விசைக்கு சேர்", addKeyRoot: "ரூட் விசையை சேர்", reloadKey: "விசையை மீளேற்றம் செய்", reload: "மீளேற்றம்", close: "மூடு", commands: "கட்டளைகள்", view: "பார்", statistics: "புள்ளிவிவரங்கள்", refresh: "புதுப்பி", pause: "இடைநிறுத்தம்", resume: "தொடர்", clear: "அழி", rename: "மறுபெயரிடு", main: "தரவுத்தளம்", cancel: "ரத்து", theme: "தீம்", github: "GitHub", githubRepo: "களஞ்சியம்", githubRelease: "வெளியீடுகள்", githubChangelog: "மாற்ற பதிவு", info: "Info", settings: "அமைப்புகள்", connect: "இணை", disconnect: "துண்டி", overview: "கண்ணோட்டம்", console: "கன்சோல்", noConnections: "இணைப்புகள் இல்லை, அமைப்புகள் மெனுவில் இணைப்பைச் சேர்க்கவும்.", noConnectionsInSettings: "இணைப்புகள் இல்லை, மேலே புதிய இணைப்பைச் சேர்க்கலாம்.", connectionAdd: "புதிய இணைப்பு", addGroup: "குழுவைச் சேர்", extend: "விரிவாக்கு", collapse: "சுருக்கு", add: "சேர்", edit: "திருத்து", save: "சேமி", ttl: "TTL அமை", license: "உரிமம் அமை", delete: "நீக்கு", remove: "அகற்று", sure: "உறுதி", testConnection: "இணைப்பை சோதி", getKey: "Redis விசை மற்றும் தொடர்புடைய தரவை ஏற்றுகிறது ...", jsonViewShow: "JSON காட்சி", jsonViewEditor: "JSON திருத்தம்", quickConsole: "விரைவு கன்சோல்" }, label: { id: { nodeId: 'முனை ID', id: "இணைப்பு ID", info: "நீங்கள் sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa ஆகியவற்றின் பண்புகளை மாற்ற விரும்பவில்லை எனில், பண்பு மதிப்புகளை அப்படியே வைக்க அந்த பண்புகளில் இணைப்பு ID ஐ உள்ளிடவும். முனை கடவுச்சொல்லிலும் அதே தர்க்கம் வேண்டுமெனில், முனை கடவுச்சொல்லில் முனை ID ஐ உள்ளிடவும்." }, secureFeature: 'P3X உடன் தொடங்கும் மதிப்பை நீங்கள் கண்டால் மற்றும் அனைத்தும் ஒரே மாதிரியாக தெரிந்தால், அது ஒரு பாதுகாப்பு அம்சம். அமைப்புகளை மாற்ற, இந்த அமைப்புகளை காலி அல்லது வேறு ஏதாவது மாற்றவும், அவை சேமிக்கப்படும். அமைப்புகளை மாற்றவில்லை என்றால், சேவையகத்தில் உள்ளபடியே இருக்கும்.', ssh: { on: 'SSH இயக்கப்பட்டது', off: 'SSH முடக்கப்பட்டது', sshHost: 'SSH ஹோஸ்ட்', sshPort: 'SSH போர்ட்', sshUsername: 'SSH பயனர்பெயர்', sshPassword: 'SSH கடவுச்சொல்', sshPrivateKey: 'SSH தனிப்பட்ட விசை' }, isBuffer: opts => `[object ArrayBuffer] என்பது மதிப்பு பைனரி தரவு அல்லது மதிப்பு ${opts.maxValueAsBuffer} ஐ விட பெரியது என்பதைக் குறிக்கிறது`, streamValue: `ஸ்ட்ரீம் புலம் மற்றும் மதிப்பு ஒரு வரியில் உள்ளது. எ.கா.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' என்பது தானாக உருவாக்கப்பட்டது அல்லது - வடிவில்`, unableToLoadKey: ({ key }) => { return `இந்த விசையை ஏற்ற முடியவில்லை: ${key}. விசை நீக்கப்பட்டிருக்கலாம். சரியான பிழை கன்சோலில் உள்ளது.`; }, bigJson: "இந்த JSON பொருள் 10 kb க்கு மேல் உள்ளது, எனவே நீங்கள் என்ன செய்கிறீர்கள் என்பதை உறுதிப்படுத்திக்கொள்ளுங்கள், ஏனெனில் சில செயல்பாடுகள் ரெண்டரிங்கில் மெதுவாக இருக்கலாம்.", addNode: "முனையைச் சேர்", validateJson: "JSON ஐ சரிபார்", reducedFunction: `குறைக்கப்பட்ட செயல்பாடு`, tooManyKeys: opts => { return `முழு அதிகபட்ச செயல்பாடுகளுக்கு அனுமதிக்கப்பட்ட மொத்த விசைகள் ${opts.maxLightKeysCount} ஆகும். இந்த தரவுத்தளத்தில் அனுமதிக்கப்பட்ட மொத்த ${opts.count} விசைகளுக்கு மேல் உள்ளது. விசை வரிசைப்படுத்தல் மற்றும் கூடுதல் மர தகவல்கள் முடக்கப்பட்டுள்ளன. தேடல் வாடிக்கையாளர் தேடலுக்குப் பதிலாக சேவையகத்தில் மட்டுமே நடக்கிறது.`; }, redisCommandNotFound: "பொருந்தும் Redis கட்டளை கிடைக்கவில்லை ...", treeKeyStore: `வரிசைப்படுத்தல் (இயற்கை ஒப்பீடு) வாடிக்கையாளரில் அதாவது உலாவியில் செயல்படுத்தப்படுகிறது, அதாவது 10k விசைகளுக்கு மேல் உள்ள பெரிய தொகுப்புகளுக்கு அபராதம் உண்டு, பக்க ரெண்டரிங்குக்கு சிறிது நேரம் சேர்க்கலாம். Redis இல் விசை வரிசைப்படுத்தல் இல்லை, இது போல் மட்டுமே.`, socketIoTimeout: options => { return `Socket.IO இந்த கோரிக்கைக்கு காலாவதியானது (அதிகபட்சம் ${options.timeout / 1000} வினாடிகள்) ...`; }, resizerInfo: options => { return `இடது அல்லது வலது பேனலின் குறைந்தபட்ச அகலம் ${options.width}px`; }, jsonViewNotParsable: "இந்த மதிப்பை JSON ஆக பாகுபடுத்த முடியாது ", ttlTitle: "TTL ஐ வினாடிகளில் அமைக்கவும்", passwordSecure: "கடவுச்சொல் காலியாக இருக்கலாம், ஆனால் எழுத்துக்களைக் காட்டும், இது ஒரு பாதுகாப்பு அம்சம்.", tlsWithoutCert: "கூடுதல் சான்றிதழ் இல்லாமல் TLS ஐ இயக்கு", tlsRejectUnauthorized: "அங்கீகரிக்கப்படாத சான்றிதழை நிராகரி", tlsSecure: "P3X உடன் தொடங்கும் TLS உள்ளமைவை நீங்கள் கண்டால் அல்லது அனைத்து TLS அமைப்புகளும் ஒரே மாதிரியாக தெரிந்தால், அது ஒரு பாதுகாப்பு அம்சம். அமைப்புகளை மாற்ற, இந்த அமைப்புகளை காலி அல்லது வேறு ஏதாவது மாற்றவும், அவை சேமிக்கப்படும். TLS அமைப்புகளை மாற்றவில்லை என்றால், சேவையகத்தில் உள்ளபடியே இருக்கும்.", treeSeparatorEmpty: "மர பிரிப்பான் காலியாக இருந்தால், மரத்தில் உள்ளமை முனைகள் இருக்காது, தூய பட்டியல் மட்டுமே", treeSeparatorEmptyNote: "உள்ளமை முனைகள் இல்லை, தூய பட்டியல் மட்டுமே", welcomeConsole: "Redis கன்சோலுக்கு வரவேற்கிறோம்", welcomeConsoleInfo: "கர்சர் மேல் அல்லது கீழ் வரலாறு இயக்கப்பட்டுள்ளது", redisListIndexInfo: "சேர்க்க காலி, -1 முன்னிணைக்க அல்லது காட்டப்பட்ட நிலையில் சேமிக்கவும்.", console: "கன்சோல்", connectiondAdd: "இணைப்பைச் சேர்", connectiondEdit: "இணைப்பைத் திருத்து", connectiondView: "இணைப்பைப் பார்", connections: "இணைப்புகள்", licenseInfo: "உரிமம்", licenseEditable: "உரிமம் திருத்தக்கூடியது", licenseEditableYes: "ஆம்", licenseEditableNo: "இல்லை", licenseTerminalOnly: "உரிமத்தை சேவையக முனையத்தில் இருந்து மட்டுமே உள்ளமைக்க முடியும்.", licenseTierPolicyTitle: "அடுக்கு கொள்கை", licenseTierPolicyText: "

இலவசம்

அடிப்படை Redis UI மட்டும்; SSH சுரங்கப்பாதை இல்லை, படிக்க மட்டும் இணைப்பு முறை இல்லை, Cluster/Sentinel இல்லை, JSON திருத்தம்/பைனரி பதிவேற்றம்/பைனரி பதிவிறக்கம் இல்லை, ReJSON இல்லை.
விலை: 0 HUF/மாதம் (\u20ac0/மாதம்).

Pro

SSH சுரங்கப்பாதை, படிக்க மட்டும் இணைப்பு முறை (--readonly-connections/-r உட்பட), JSON திருத்தம், பைனரி பதிவேற்றம், பைனரி பதிவிறக்கம், ReJSON.
அடிப்படை விலை: 400 HUF/மாதம் (\u20ac1/மாதம்) அல்லது 4,000 HUF/ஆண்டு (\u20ac10/ஆண்டு).
27% VAT உடன் மொத்தம்: 500 HUF/மாதம் (\u20ac1.27/மாதம்) அல்லது 5,100 HUF/ஆண்டு (\u20ac12.70/ஆண்டு).

Enterprise

SSH சுரங்கப்பாதை, Cluster மற்றும் Sentinel, மற்றும் JSON திருத்தம், பைனரி பதிவேற்றம், பைனரி பதிவிறக்கம், ReJSON; --readonly-connections/-r வும் வேலை செய்யும்.
அடிப்படை விலை: 1,200 HUF/மாதம் (\u20ac3/மாதம்) அல்லது 12,000 HUF/ஆண்டு (\u20ac30/ஆண்டு).
27% VAT உடன் மொத்தம்: 1,500 HUF/மாதம் (\u20ac3.81/மாதம்) அல்லது 15,200 HUF/ஆண்டு (\u20ac38.10/ஆண்டு).

ஆண்டு விதி

ஆண்டு விலை மாத விலையின் 10 மடங்கு.

இடங்கள்

இயல்புநிலை உரிமத்தில் 5 இடங்கள் அடங்கும். மேலும் இடங்கள் தேவைப்பட்டால், support@corifeus.com இல் எங்களைத் தொடர்பு கொள்ளவும்.

Enterprise சோதனை

உண்மையான மின்னஞ்சல் முகவரி உள்ள எவருக்கும் 10 நாட்கள் இலவசம் (சோதனை மின்னஞ்சல் அல்ல).

மின்னஞ்சலில் பில்லிங் தகவல்

பெயர், பில்லிங் மின்னஞ்சல், நாட்டுக் குறியீடு, அஞ்சல் குறியீடு, நகரம், முகவரி, VAT ID (விருப்பத்திற்கு).

பணம் செலுத்துதல்

PayPal பணம் செலுத்துதல் HUF (forint) இல் மட்டுமே கிடைக்கும்; https://paypal.me/corifeus @ பணம் அனுப்பிய பிறகு நான் உங்களுக்கு விலைப்பட்டியல் அனுப்புவேன். அனைத்து பணம் செலுத்துதல்களும் திரும்பப் பெற இயலாது.

VAT

VAT விலையில் சேர்க்கப்படும் (ஹங்கேரியில் 27%).

தொடர்பு

நீங்கள் வணக்கம் சொல்ல அல்லது கேள்வி இருந்தால், support@corifeus.com ஐ தொடர்பு கொள்ளவும்.

மொழி

விலைப்பட்டியல் மற்றும் உரிம மின்னஞ்சல் தொடர்பு ஆங்கிலத்தில். விலைப்பட்டியல் நாணயம் HUF.

குறிப்பு

உரிம சரிபார்ப்புக்கு இணைய அணுகல் தேவை.", licenseState: "நிலை", licenseStateActive: "செயலில்", licenseStateInactive: "செயலற்றது", licenseStateNoLicense: "உரிமம் இல்லை", licenseKeyMasked: "சேமிக்கப்பட்ட விசை", licenseTier: "அடுக்கு", licenseValid: "செல்லுபடியாகும்", licenseStatus: "உரிம நிலை", licenseReason: "காரணம்", licenseCheckedAt: "சரிபார்க்கப்பட்ட நேரம்", licenseStartsAt: "தொடக்க நேரம்", licenseExpiresAt: "காலாவதி நேரம்", licenseDaysLeft: "மீதமுள்ள நாட்கள்", licenseMaxDevices: "அதிகபட்ச சாதனங்கள்", licenseActiveDevices: "செயலில் உள்ள சாதனங்கள்", licenseActiveDevicesInfo: "ஒரு சாதனம் இனி பயன்படுத்தப்படாவிட்டால், அதன் இடம் 75 நிமிடங்களுக்குப் பிறகு தானாகவே விடுவிக்கப்படும்.", licenseCustomerEmail: "வாடிக்கையாளர் மின்னஞ்சல்", licenseFeatures: "அம்சங்கள்", licenseFeaturesEmpty: "கூடுதல் அம்சங்கள் இல்லை", licenseFeatureReadonlyMode: "படிக்க மட்டும் இணைப்பு முறை", licenseFeatureReadonlyConnectionsFlag: "படிக்க மட்டும் இணைப்புகள் (--readonly-connections/-r)", licenseFeatureSsh: "SSH சுரங்கப்பாதை", licenseFeatureCluster: "Cluster இணைப்புகள்", licenseFeatureSentinel: "Sentinel இணைப்புகள்", licenseFeatureReJSON: "ReJSON (JSON தரவு வகை)", keysSort: { on: "விசை வரிசைப்படுத்தல் இயக்கப்பட்டது", off: "விசை வரிசைப்படுத்தல் முடக்கப்பட்டது" }, cluster: { on: "Cluster இயக்கப்பட்டது", off: "Cluster முடக்கப்பட்டது" }, sentinel: { on: "Sentinel இயக்கப்பட்டது", off: "Sentinel முடக்கப்பட்டது", name: "Sentinel பெயர்" }, readonly: { on: "படிக்க மட்டும் இயக்கப்பட்டது", off: "படிக்க மட்டும் முடக்கப்பட்டது" }, proSshOnly: "SSH Pro அல்லது Enterprise இல் கிடைக்கும்.", proReadonlyOnly: "படிக்க மட்டும் இணைப்பு முறை Pro அல்லது Enterprise இல் கிடைக்கும்.", enterpriseClusterSentinelOnly: "Cluster மற்றும் Sentinel Enterprise இல் மட்டுமே கிடைக்கும்.", theme: { light: "ஒளி", dark: "இருள் enterprise", darkNeu: "இருள்", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `இணைக்கப்பட்டது: ${opts.name}`; }, tree: "மரம்", askAuth: "அங்கீகாரம் கேள்", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "modules", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "துண்டி", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis கட்டளைகள்", ungrouped: "குழுவில்லாது", grouped: "Grouped", connectFirst: "connectFirst", searchLanguage: "மொழி தேடு...", exportProgress: "விசைகள் ஏற்றுமதி செய்யப்படுகின்றன...", importProgress: "விசைகள் இறக்குமதி செய்யப்படுகின்றன...", importPreview: "முன்னோட்டம்", importOverwrite: "மேலெழுது", importSkip: "தவிர்", importConflict: "விசை ஏற்கனவே இருந்தால்:", noKeysToExport: "ஏற்றுமதி செய்ய விசைகள் இல்லை", time: "நேரம்", loading: "ஏற்றுகிறது...", autoRefresh: "தானி", exportSearchHint: "தற்போதைய தேடலுடன் பொருந்தும் விசைகளை மட்டும் ஏற்றுமதி செய்கிறது", importSearchHint: "இறக்குமதி தேடல் முடிவுகளுக்கு மட்டுமல்ல, முழு தரவுத்தளத்திற்கும் பொருந்தும்", importNoKeys: "கோப்பில் விசைகள் காணப்படவில்லை", }, status: { dataCopied: "தரவு கிளிப்போர்டில் உள்ளது", licenseSaved: "உரிமம் சேமிக்கப்பட்டது", exportDone: "ஏற்றுமதி முடிந்தது", indexCreated: "குறியீடு உருவாக்கப்பட்டது", indexDropped: "குறியீடு நீக்கப்பட்டது", importDone: (opts) => `இறக்குமதி முடிந்தது: ${opts.created} உருவாக்கப்பட்டது, ${opts.skipped} தவிர்க்கப்பட்டது, ${opts.errors} பிழைகள்`, nodeRemoved: "முனை அகற்றப்பட்டது", keyIsNotExisting: "இந்த விசை நீக்கப்பட்டிருக்கலாம் அல்லது காலாவதியாகியிருக்கலாம்.", keyCount: opts => { if (opts.keyCount === 0) { return "விசை இல்லை"; } else if (opts.keyCount === 1) { return "1 விசை"; } else { return `${opts.keyCount} விசைகள்`; } }, treeExpandAll: "அனைத்து மர இலைகளையும் விரிவாக்கு. இந்த செயல்பாடு விலை உயர்ந்ததாக இருக்கலாம் மற்றும் நேரம் எடுக்கலாம் ...", noRedisKeys: "இந்த தரவுத்தளத்தில் விசைகள் இல்லை.", redisConnected: "Redis வெற்றிகரமாக இணைக்கப்பட்டது", reloadingDataInfo: "Redis தரவு தகவலை மீளேற்றம் செய்கிறது", added: "சேர்க்கப்பட்டது", saved: "புதுப்பிக்கப்பட்டது", cancelled: "ரத்து செய்யப்பட்டது", deleted: "நீக்கப்பட்டது", savedRedis: "Redis தரவு சேமிக்கப்பட்டது", redisDisconnected: opts => { return `தற்போதைய இணைப்பில் பிழை ஏற்பட்டது: ${opts.error.message}`; }, dbChanged: opts => { return `db குறியீடு ${opts.db} ஆக அமைக்கப்பட்டது. `; }, treeDeleted: opts => { return `மர விசை நீக்கப்பட்டது (${opts.key}).`; }, deletedKey: opts => { return `விசை நீக்கப்பட்டது (${opts.key}).`; }, renamedKey: "இந்த விசை மறுபெயரிடப்பட்டது", ttlChanged: "இந்த விசையின் TTL மாற்றப்பட்டது", notInteger: "இந்த உள்ளீடு முழு எண் அல்ல", persisted: "இந்த விசை நிரந்தரமாக சேமிக்கப்பட்டது", set: "விசை அமைக்கப்பட்டது/சேர்க்கப்பட்டது" }, code: { "delete-connection": "இந்த இணைப்பு நீக்கப்பட்டது, எனவே இந்த Redis நிகழ்வுடன் துண்டிக்கப்பட்டீர்கள்.", "save-connection": "இந்த இணைப்பு மாற்றப்பட்டது, எனவே இந்த Redis நிகழ்வுடன் துண்டிக்கப்பட்டீர்கள். மீண்டும் இணையலாம்.", "readonly-connections": "இணைப்புகள் சேர்/சேமி/நீக்கு படிக்க மட்டுமே!", "readonly-connection-mode": "இந்த இணைப்பு படிக்க மட்டும் முறையில் உள்ளது!", "list-out-of-bounds": "இந்த பட்டியல் குறியீடு எல்லைக்கு அப்பாற்பட்டது", "donation-ware-feature": "இந்த அம்சம் நன்கொடை பதிப்பில் உள்ளது.", "feature-pro-readonly-required": "படிக்க மட்டும் இணைப்பு முறைக்கு Pro அல்லது Enterprise உரிமம் தேவை.", "feature-pro-ssh-required": "SSH சுரங்கப்பாதைக்கு Pro அல்லது Enterprise உரிமம் தேவை.", "feature-enterprise-cluster-sentinel-required": "Cluster மற்றும் Sentinel க்கு Enterprise உரிமம் தேவை.", "feature-pro-json-binary-required": "JSON திருத்தம், பைனரி பதிவேற்றம் மற்றும் பைனரி பதிவிறக்கத்திற்கு Pro அல்லது Enterprise உரிமம் தேவை.", "feature-pro-rejson-required": "ReJSON (JSON தரவு வகை) க்கு Pro அல்லது Enterprise உரிமம் தேவை.", "invalid-json-value": "மதிப்பு செல்லுபடியான JSON அல்ல.", "http_auth_required": "அங்கீகாரம் தேவை: தயவுசெய்து HTTP Basic Auth மூலம் அங்கீகரித்து மீளேற்றம் செய்யவும்.", "auto-connection-failed": "இணைப்பு அகற்றப்பட்டிருக்கலாம் மற்றும் தானியங்கி இணைப்பு இதனால் தோல்வியடைந்தது.", invalid_console_command: "இந்த கட்டளை GUI வழியாக வேலை செய்யாது." }, licenseReason: { LICENSE_VALID: "உரிமம் செல்லுபடியாகும்", LICENSE_INVALID: "உரிமம் செல்லாது", LICENSE_MISSING: "உரிம விசை அமைக்கப்படவில்லை", LICENSE_DISABLED: "சேவையக உள்ளமைவில் உரிமம் முடக்கப்பட்டுள்ளது", LICENSE_NOT_FOUND: "உரிமம் கண்டறியப்படவில்லை", LICENSE_EXPIRED: "உரிமம் காலாவதியானது", LICENSE_CLEARED: "உரிம விசை அழிக்கப்பட்டது", LICENSE_MAX_DEVICES_REACHED: "அதிகபட்ச சாதன இடங்கள் எட்டப்பட்டது", PRODUCT_MISMATCH: "உரிம தயாரிப்பு பொருந்தவில்லை" }, licenseStatusValue: { active: "செயலில்", deleted: "நீக்கப்பட்டது", all: "அனைத்தும்", expired: "காலாவதியானது", missing: "காணவில்லை", inactive: "செயலற்றது" }, form: { error: { required: "தேவை", port: "போர்ட் 1-65535 க்கு இடையில் இருக்க வேண்டும்", invalid: "படிவம் தவறானது" }, connection: { label: { name: "பெயர்", group: "Group", host: "ஹோஸ்ட்பெயர்", port: "போர்ட்", password: "கடவுச்சொல்", username: "பயனர்பெயர்" } }, treeSettings: { maxValueDisplay: "அதிகபட்ச மதிப்பு காட்சி நீளம்", maxValueDisplayInfo: "0 ஆக அமைத்தால், முழு மதிப்புகளைக் காட்டு. 0 ஐ விட அதிகமாக இருந்தால், இந்த நீளத்திற்கு வெட்டு. -1 என்றால்: சரங்களுக்கு, திருத்தும் வரை மதிப்பை மறை; மற்ற வகைகளுக்கு, முழு உள்ளடக்கத்தைக் காட்டு.", maxKeys: "அதிகபட்ச விசை எண்ணிக்கை", maxKeysInfo: "GUI செயலிழக்காமல் இருக்க, அதிகபட்ச விசை எண்ணிக்கையை வரம்பிடுகிறோம்.", keyCount: () => { return `விசைகளின் எண்ணிக்கை: ${p3xr.state.keysRaw.length}`; }, label: { animation: "அசைவூட்டம் பயன்படுத்து", noAnimation: "அசைவூட்டம் இல்லை", jsonFormatTwoSpace: "2 இடைவெளிகளுடன் JSON வடிவமை", jsonFormatFourSpace: "4 இடைவெளிகளுடன் JSON வடிவமை", formName: "Redis அமைப்புகள்", searchModeClient: "வாடிக்கையாளர் தேடல் முறை", searchModeServer: "சேவையக தேடல் முறை", searchModeStartsWith: "தொடங்குவதன் மூலம் தேடு", searchModeIncludes: "உள்ளடக்கும் முறையில் தேடு" }, field: { treeSeparator: "மர பிரிப்பான்", treeSeparatorSelector: "மர பிரிப்பான் தேர்வி", page: "மர பக்க எண்ணிக்கை", keyPageCount: "விசை பக்க எண்ணிக்கை", keysSort: "விசைகளை வரிசைப்படுத்து", searchMode: "தேடல் முறை", searchModeStartsWith: "தேடல் தொடங்குவது / உள்ளடக்குவது" }, error: { keyPageCount: "விசை பக்க எண்ணிக்கை 5 - 100 க்கு இடையிலான முழு எண்ணாக இருக்க வேண்டும்", page: "பக்க எண்ணிக்கை 10 - 5000 க்கு இடையிலான முழு எண்ணாக இருக்க வேண்டும்", maxValueDisplay: "அதிகபட்ச காட்சி மதிப்பு -1 மற்றும் 32768 க்கு இடையிலான முழு எண்ணாக இருக்க வேண்டும்", maxKeys: "அதிகபட்ச விசை எண்ணிக்கை 100 மற்றும் 100000 க்கு இடையிலான முழு எண்ணாக இருக்க வேண்டும்" } }, key: { label: { formName: { add: "புதிய Redis விசையைச் சேர்", edit: "Redis விசையைத் திருத்து", append: "ஏற்கனவே உள்ள Redis விசைக்கு சேர்" } }, field: { streamTimestamp: "நேர முத்திரை", key: "விசை", type: "வகை", index: "குறியீடு", hashKey: "Hash விசை", score: "மதிப்பெண்", value: "மதிப்பு" }, error: { streamTimestamp: "நேர முத்திரை தேவை, Redis வடிவம் அல்லது * ஆக", key: "விசை குறைந்தது ஒரு எழுத்தாவது இருக்க வேண்டும்", hashKey: "hash அட்டவணை விசை குறைந்தது ஒரு எழுத்தாவது இருக்க வேண்டும்", score: "வரிசைப்படுத்தப்பட்ட தொகுப்பு மதிப்பெண் தேவை", value: "மதிப்பு தேவை" } }, main: { label: { database: "DB" } } }, page: { search: { title: "தேடு", index: "குறியீடு", query: "வினவல்", results: "முடிவுகள்", noIndex: "குறியீடுகள் காணப்படவில்லை", createIndex: "குறியீடு உருவாக்கு", dropIndex: "குறியீடு நீக்கு", indexInfo: "குறியீடு தகவல்", indexName: "குறியீடு பெயர்", prefix: "விசை முன்னொட்டு (விருப்பம்)", fieldName: "புலப் பெயர்", }, monitor: { title: "கண்காணிப்பு", memory: "நினைவகம்", opsPerSec: "செயல்/வி", clients: "வாடிக்கையாளர்கள்", blocked: "தடுக்கப்பட்டது", hitsMisses: "வெற்றி விகிதம்", networkIo: "நெட்வொர்க் I/O", slowLog: "மெதுவான பதிவு", totalCommands: "மொத்தம்", expired: "காலாவதி", evicted: "வெளியேற்றப்பட்டது", clientList: "வாடிக்கையாளர் பட்டியல்", topKeys: "நினைவகத்தின் படி பெரிய விசைகள்", killClient: "வாடிக்கையாளரை நிறுத்து", clientKilled: "வாடிக்கையாளர் நிறுத்தப்பட்டார்", confirmKillClient: "இந்த வாடிக்கையாளரை நிறுத்த விரும்புகிறீர்களா?", noKeys: "விசைகள் இல்லை", noClients: "வாடிக்கையாளர்கள் இல்லை", }, overview: { noConnected: "Redis உடன் இணைப்பு இல்லை.", overviewClients: "வாடிக்கையாளர்களின் எண்ணிக்கையின் படி இணைக்கப்பட்டவற்றை பட்டியலிடு", connectedCount: opt => { if (opt.length === 1) { return "1 வாடிக்கையாளர்"; } return `${opt.length} வாடிக்கையாளர்கள்`; } }, key: { label: { key: "விசை", encoding: "குறியாக்கம்", length: "அளவு", ttl: "TTL", ttlTitle: "வாழ்நாள்", type: "வகை", ttlNotExpire: "காலாவதியாகாது", lengthString: "பைட்கள்", lengthItem: "உருப்படிகள்", actions: "செயல்கள்" }, list: { table: { index: "குறியீடு", value: "மதிப்பு" } }, hash: { table: { hashkey: "Hash விசை", value: "மதிப்பு" } }, set: { table: { value: "உறுப்பினர்" } }, zset: { table: { value: "உறுப்பினர்", score: "மதிப்பெண்" } }, stream: { table: { timestamp: "நேர முத்திரை ID", field: "புலம்", value: "மதிப்பு" } } }, treeControls: { settings: "மர அமைப்புகள்", expandAll: "அனைத்தையும் விரிவாக்கு", collapseAll: "அனைத்தையும் சுருக்கு", search: { search: "விசைகளில் தேடு", clear: "தற்போதைய தேடலை காலியாக்க அழி", placeholderClient: "வாடிக்கையாளர் பக்கம் தேடு", placeholderServer: "சேவையக பக்கம் தேடு", info: "வாடிக்கையாளர் பக்க தேடல் என்பது தேடல் உள்ளீட்டில் உள்ள உரையுடன் பொருத்துவது. சேவையக பக்க தேடல் என்பது *{search-text}* போன்ற விசை வடிவங்களில் தேடுவது. பெரிய தேடல் தொகுப்புகளுக்கு, சேவையக பக்க தேடலைப் பயன்படுத்துவது நல்லது. சிறிய தேடல் தொகுப்புகளுக்கு, வாடிக்கையாளர் பக்க தேடல் முறையைப் பயன்படுத்துவது நல்லது." + ` விசைகளின் எண்ணிக்கை ${p3xr.settings.maxLightKeysCount} ஐ விட அதிகமாக இருந்தால், சேவையக பக்கத்தில் மட்டுமே தேடலாம்.`, largeSetInfo: "பெரிய தொகுப்பில், வாடிக்கையாளர் பக்க தேடல் முடக்கப்பட்டுள்ளது. எனவே தற்போது சேவையக பக்க தேடல் மட்டுமே சாத்தியம்.", infoDetails: "தேடல் எவ்வாறு வேலை செய்கிறது என்பதை அறிய, அமைப்புகளைப் பார்க்கவும்" }, pager: { next: "அடுத்தது", prev: "முந்தையது", first: "முதல்", last: "கடைசி" } } }, time: { loading: "ஏற்றுகிறது...", years: "ஆண்டுகள்", months: "மாதங்கள்", days: "நாட்கள்", year: "ஆண்டு", month: "மாதம்", day: "நாள்" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/tg/000077500000000000000000000000001517666434100137655ustar00rootroot00000000000000src/strings/tg/strings.js000066400000000000000000001127601517666434100160230ustar00rootroot00000000000000const strings = { error: { cleared_license: "Иҷозатномаи тозашуда", invalid_license: "Иҷозатномаи беэътибор", license_max_devices_reached: "Ба ҳадди ниҳоии курсиҳои дастгоҳ расид", license_readonly: "Литсензияро танҳо аз терминали сервер иваз кардан мумкин аст.", server_error: "Хатогии сервер, лутфан бори дигар кӯшиш кунед" }, title: { donate: "Садақа кунед", jsonRecursive: "Васеъ кардани ҳама баргҳо", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Шумо метавонед пайвасти Redis-ро барои пайвастшавӣ аз менюи поёни чап интихоб кунед.", statistics: "Статистика", error: "Хатогӣ", connectingRedis: "Пайвастшавӣ ба Redis ...", socketioConnectError: "Хатогии Socket.IO", db: "DB", server: "Сервер", clients: "Мизоҷон", memory: "Хотира", persistence: "Устуворӣ", stats: "Статистика", replication: "Репликатсия", cpu: "CPU", cluster: "Cluster", modules: "Модулҳо", errorstats: "errorstats", commandstats: "commandstats", latencystats: "latencystats", keysizes: "keysizes", threads: "threads", }, confirm: { dropIndex: "Шумо мутмаинед, ки ин индексро нест кунед?", uploadBuffer: "Оё мутмаин ҳастед, ки ин маълумоти бинариро бор кунед?", uploadBufferDone: "Маълумоти дуӣ бор карда мешавад", uploadBufferDoneAndSave: "Маълумоти дуӣ боргузорӣ ва дар сервер захира карда мешавад", title: "Тасдиқ кунед", alert: "Огоҳӣ", info: "Маълумот", deleteListItem: "Оё мутмаин ҳастед, ки ин ҷузъи рӯйхатро нест кунед?", deleteHashKey: "Оё мутмаин ҳастед, ки ин калиди ҳашро нест кунед?", deleteStreamTimestamp: "Оё мутмаин ҳастед, ки ин тамғаи ҷараёнро нест кунед?", deleteSetMember: "Оё мутмаин ҳастед, ки ин узви маҷмӯаро нест мекунед?", deleteZSetMember: "Оё мутмаин ҳастед, ки ин узви маҷмӯи ҷудошударо нест кунед?", deleteConnection: "Тасдиқ кунед", deleteConnectionText: "Оё мутмаин ҳастед, ки ин пайвасти Redis-ро нест кунед?", deleteNode: "Оё мутмаин ҳастед, ки ин гиреҳи Redis-ро нест кунед?", deleteAllKeys: opts => { return `Ин дарахт ва ҳамаи калидҳои онро нест кунед (${opts.key})?`; }, socketioConnectError: "Socket.IO ба сервер пайваст шуда наметавонад, шумо метавонед аз нав бор кунед ва кӯшиш кунед, ки хатои пайвастшавиро худатон ҳал кунед, муштарӣ намедонад худаш чӣ гуна онро ҳал кунад.", socketioAuthRequired: "Иҷозатномаи Socket.IO лозим аст. Лутфан бо HTTP Basic Auth (номи корбар/парол) тасдиқ кунед ва аз нав бор кунед.", deleteKey: "Оё мутмаин ҳастед, ки ин калидро нест кунед?", rename: { title: "Оё мутмаин ҳастед, ки ин калидро тағир диҳед?", textContent: "Ин амал калидро ба таври доимӣ иваз мекунад.", placeholder: "Калиди Redis (талаб)" }, ttl: { title: "Шумо мутмаин ҳастед, ки мехоҳед ин калиди TTL-ро иваз кунед?", textContent: "Тағйир додани TTL вақти зинда мондани ин калидро нав мекунад. Барои то абад нигоҳ доштани ин калид холӣ гузоред.", placeholder: "Калиди Redis TTL (шумораи бутун ё холӣ)", placeholderPlaceholder: "Холӣ маънои онро дорад, ки он то абад боқӣ мемонад; дар акси ҳол адади бутун ворид ку��ед.", convertTextToTime: "Матнро ба вақт табдил диҳед", convertTextToTimePlaceholder: "Масалан. 1d 86400 хоҳад буд" }, license: { title: "Муқаррар кардани иҷозатнома", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "Калиди иҷозатнома" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Нусхабардорӣ", downloadBuffer: "Бинариро зеркашӣ кунед", setBuffer: "Бинариро бор кунед", exportKeys: "Содирот кардани калидҳо", exportAllKeys: (opts) => `Содироти ҳамаи ${opts.count} калидҳо`, exportSearchResults: (opts) => `Содироти ${opts.count} натиҷа`, importKeys: "Воридот кардани калидҳо", saveWithFormatJson: "Бо формат захира кунед", formatJson: "Формат Json", wrap: "печонед", unwrap: "Кушодан", downloadJson: "Download JSON", pubsubMonitor: "Монитор PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Забон", ok: "Хуб", addKey: "Ба ин калид илова кунед", addKeyRoot: "Калиди решаро илова кунед", reloadKey: "Калидро аз нав бор кунед", reload: "Аз нав бор кунед", close: "Пӯшед", commands: "Фармонҳо", view: "Намоиш", statistics: "Статистика", refresh: "Навсозӣ", pause: "Таваққуф", resume: "Идома додан", clear: "Тоза", rename: "Номи дигар", main: "Пойгоҳи додаҳо", cancel: "Бекор кардан", theme: "Мавзӯъ", github: "GitHub", githubRepo: "Анбор", githubRelease: "Варақаҳои", githubChangelog: "Тағйирот", info: "Info", settings: "Танзимотҳо", connect: "Пайваст кунед", disconnect: "Қатъ кунед", overview: "Барраси", console: "Консол", noConnections: "Пайвастшавӣ нест, пайвастро дар менюи танзимот илова кунед.", noConnectionsInSettings: "Пайвастшавӣ нест, шумо метавонед дар боло ПАЙВАСТИ НАВ илова кунед.", connectionAdd: "Пайвастагии нав", addGroup: "Гурӯҳ илова кунед", extend: "дароз кардан", collapse: "Фурӯпошӣ", add: "Илова", edit: "Таҳрир", save: "Захира кунед", ttl: "Танзими TTL", license: "Муқаррар кардани иҷозатнома", delete: "Ноб��д кунед", remove: "Хориҷ кунед", sure: "Албатта", testConnection: "Пайвастшавӣ озмоиш", getKey: "Калиди Redis ва маълумоти алоқаманд бор карда мешавад ...", jsonViewShow: "Намоиши JSON", jsonViewEditor: "Таҳрири JSON", quickConsole: "Консол зуд", }, label: { id: { nodeId: "ID гиреҳ", id: "ID пайваст", info: "Агар шумо нахоҳед, ки хосиятҳои зеринро тағир диҳед: sshPassword, sshPrivateKey, парол, tlsCrt, tlsKey, tlsCa, лутфан ID-и пайвастшавиро дар он хосиятҳо ворид кунед, то арзишҳои амвол бетағйир нигоҳ дошта шаванд. Агар шумо хоҳед, ки мантиқи якхела дар пароли гиреҳ бошад, пас ID-и гиреҳро дар пароли гиреҳ ворид кунед." }, secureFeature: "Агар шумо арзишеро бинед, ки бо P3X оғоз мешавад ва ба як намуди он монанд аст, он хусусияти бехатар аст. Барои тағир додани танзимот, танҳо ин танзимотҳоро бо холӣ ё чизи дигар иваз кунед ва онҳо захира карда мешаванд. Агар шумо танзимотро тағир надиҳед, танзимот ҳамчунон дар сервер нигоҳ дошта мешаванд.", ssh: { on: "SSH дар", off: "SSH хомӯш", sshHost: "SSH Мизбон", sshPort: "Порти SSH", sshUsername: "Номи корбари SSH", sshPassword: "пароли SSH", sshPrivateKey: "SSH калиди хусусӣ" }, isBuffer: opts => `[object ArrayBuffer] маънои онро дорад, ки арзиш маълумоти дуӣ аст ё арзиш аз он калонтар аст ${opts.maxValueAsBuffer}`, streamValue: `Майдони ҷараён ва арзиши он oneliner аст. Масалан: майдони1 арзиши1 "майдони 2" "арзиши 2"`, streamTimestampId: `'*' маънои худкор тавлидшуда ё мушаххасотро ҳамчун - дорад`, unableToLoadKey: ({ key }) => { return `Ин калидро бор кардан ғайриимкон аст: ${key}. Эҳтимол, калид нест карда шуд. Хатогии дақиқ дар консол аст.`; }, bigJson: "Ин объекти JSON зиёда аз 10 кб аст, бинобар ин боварӣ ҳосил кунед, ки шумо чӣ кор карда истодаед, медонед, зеро баъзе вазифаҳо метавонанд суст гардонанд.", addNode: "Иловаи гиреҳ", validateJson: "Тасдиқ кардани JSON", reducedFunction: `Функсияҳои камшуда`, tooManyKeys: opts => { return `Барои ҳадди пурраи функсияҳои иҷозатдодашуда калидҳои умумии аст ${opts.maxLightKeysCount} шумор. Ин базаи маълумот дар маҷмӯъ зиёда аз калидҳои иҷозатдодашуда дорад ${opts.count}. Ҷудокунии калидҳо ва маълумоти иловагӣ дар бораи дарахти зебо ғайрифаъол аст. Ҷустуҷӯ танҳо дар сервер ба ҷои ҷустуҷӯи муштарӣ сурат мегирад.`; }, redisCommandNotFound: "Ягон мувофиқати фармони Redis ёфт нашуд ...", treeKeyStore: `Ҷудокунӣ (муқоисаи табиӣ) дар муштарӣ, яъне браузер иҷро карда мешавад, ки ин маънои онро дорад, ки он барои маҷмӯаҳои калон ҷарима дорад, ба монанди беш аз 10k калидҳо, он метавонад ба намоиши саҳифа вақти каме илова кунад. Дар Redis навъбандии калидӣ вуҷуд надорад, танҳо ҳамин тавр.`, socketIoTimeout: options => { return `Socket.IO барои ин дархост вақт тамом шуд (макс ${options.timeout / 1000} сония)...`; }, resizerInfo: options => { return `Паҳнои ҳадди ақали панели чап ё рост аст ${options.width}px`; }, jsonViewNotParsable: "Ин арзиш аст, JSON parsable нест ", ttlTitle: "TTL-ро дар сонияҳо насб кунед", passwordSecure: "Парол метавонад холӣ бошад, аммо ба ҳар ҳол он аломатҳоро нишон медиҳад, ин хусусияти амниятӣ аст.", tlsWithoutCert: "TLS-ро бе сертификати иловагӣ фаъол созед", tlsRejectUnauthorized: "Шаҳодатномаи беиҷозатро рад кунед", tlsSecure: "Агар шумо конфигуратсияи TLS-ро бинед, ки бо P3X оғоз мешавад ё ҳамаи танзимоти TLS ба якхела монанд аст, ин хусусияти бехатар аст. Барои тағир додани танзимот, танҳо ин танзимотҳоро бо холӣ ё чизи дигар иваз кунед ва онҳо захира карда мешаванд. Агар шумо танзимоти TLS-ро тағир надиҳед, танзимот ҳамчунон дар сервер нигоҳ дошта мешаванд.", treeSeparatorEmpty: "Агар ҷудокунандаи дарахт холӣ бошад, дарахт ҳеҷ гиреҳи лона надорад, танҳо рӯйхати пок аст", treeSeparatorEmptyNote: "Не гиреҳҳои лона, танҳо рӯйхати пок", welcomeConsole: "Хуш омадед ба консол Redis", welcomeConsoleInfo: "Таърихи курсор ба боло ё поён фаъол аст", redisListIndexInfo: "Холӣ барои замима, -1 барои пешнавис ё захира кардани он ба мавқеи нишон додашуда.", console: "Консол", connectiondAdd: "Пайвастшавӣ илова кунед", connectiondEdit: "Таҳрири пайвастшавӣ", connectiondView: "Пайвастшавиро дидан", connections: "Пайвастшавӣ", licenseInfo: "Иҷозатнома", licenseEditable: "Литсензия таҳриршаванда", licenseEditableYes: "Бале", licenseEditableNo: "Не", licenseTerminalOnly: "Литсензияро танҳо аз терминали сервер танзим кардан мумкин аст.", licenseTierPolicyTitle: "Сиёсати сатҳ", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "Давлат", licenseStateActive: "Фаъол", licenseStateInactive: "ғайрифаъол", licenseStateNoLicense: "Не иҷозатнома", licenseKeyMasked: "Калиди захирашуда", licenseTier: "Сатҳи", licenseValid: "Эътибор дорад", licenseStatus: "Ҳолати иҷозатнома", licenseReason: "Сабаб", licenseCheckedAt: "Санҷида шуд", licenseStartsAt: "Сар мешавад", licenseExpiresAt: "Мӯҳлаташ дар", licenseDaysLeft: "Рӯзҳо мондаанд", licenseMaxDevices: "Дастгоҳҳои максималӣ", licenseActiveDevices: "Дастгоҳҳои фаъол", licenseActiveDevicesInfo: "Агар дастгоҳ дигар истифода нашавад, курсии он пас аз 75 дақиқа ба таври худкор озод карда мешавад.", licenseCustomerEmail: "почтаи электронии муштарӣ", licenseFeatures: "Хусусиятҳо", licenseFeaturesEmpty: "Ҳеҷ гуна хусусиятҳои иловагӣ", licenseFeatureReadonlyMode: "Ҳолати пайвастшавӣ танҳо барои хондан", licenseFeatureReadonlyConnectionsFlag: "Пайвастҳои танҳо барои хондан (--readonly-connections/-r)", licenseFeatureSsh: "Нақби SSH", licenseFeatureCluster: "Пайвастҳои Cluster", licenseFeatureSentinel: "Пайвастҳои Sentinel", licenseFeatureReJSON: "ReJSON (навъи маълумот JSON)", keysSort: { on: "Ҷудокунии калид фаъол аст", off: "Хомӯш кардани калид" }, cluster: { on: "Cluster дар", off: "Cluster хомӯш" }, sentinel: { on: "Sentinel дар", off: "Sentinel хомӯш", name: "Номи Sentinel" }, readonly: { on: "Танҳо хондан дар", off: "Танҳо барои хондан хомӯш" }, proSshOnly: "SSH дар Pro ё Enterprise дастрас аст.", proReadonlyOnly: "Ҳолати пайвастшавӣ танҳо барои хондан дар Pro ё Enterprise дастрас аст.", enterpriseClusterSentinelOnly: "Cluster ва Sentinel танҳо дар Enterprise дастрасанд.", theme: { light: "Нур", dark: "Корхонаи сиёҳ", darkNeu: "Торик", darkoBluo: "Дарко блуо", enterprise: "Корхона", redis: "Redis", matrix: "Матритса" }, connected: opts => { return `Пайваст: ${opts.name}`; }, tree: "Дарахт", askAuth: "Иҷозат талаб кунед", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Модулҳо", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Қатъ кунед", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Фармонҳои Redis", ungrouped: "Бе гурӯҳ", grouped: "Grouped", connectFirst: "Аввал ба сервери Redis пайваст шавед", searchLanguage: "Ҷустуҷӯи забон...", exportProgress: "Содироти калидҳо...", importProgress: "Воридоти калидҳо...", importPreview: "Пешнамоиш", importOverwrite: "Аз нав навиштан", importSkip: "Гузаштан", importConflict: "Агар калид аллакай мавҷуд бошад:", noKeysToExport: "Калидҳо барои содирот нест", time: "Вақт", loading: "Бор мешавад...", autoRefresh: "Авто", exportSearchHint: "Танҳо калидҳои мувофиқи ҷустуҷӯи ҷорӣ содирот мешаванд", importSearchHint: "Воридот ба тамоми пойгоҳи додаҳо татбиқ мешавад, на танҳо ба натиҷаҳои ҷустуҷӯ", importNoKeys: "Дар файл калидҳо ёфт нашуд", }, status: { dataCopied: "Маълумот дар буфер аст", licenseSaved: "Иҷозатнома захира карда шуд", exportDone: "Содирот анҷом ёфт", indexCreated: "Индекс сохта шуд", indexDropped: "Индекс нест шуд", importDone: (opts) => `Воридот анҷом ёфт: ${opts.created} сохта шуд, ${opts.skipped} гузашт, ${opts.errors} хато`, nodeRemoved: "Гиреҳ хориҷ карда шуд", keyIsNotExisting: "Ин калид метавонист нест карда шавад ё мӯҳлати истифодааш гузашта бошад.", keyCount: opts => { if (opts.keyCount === 0) { return "Калид нест"; } else if (opts.keyCount === 1) { return "1 калид"; } else { return `${opts.keyCount} калидҳо`; } }, treeExpandAll: "Ҳама баргҳои дарахтонро васеъ кунед. Ин амалиёт метавонад қимат бошад ва метавонад вақтро талаб кунад ...", noRedisKeys: "Да�� ин база ягон калид вуҷуд надорад.", redisConnected: "Redis бомуваффақият пайваст", reloadingDataInfo: "Бозборкунии маълумоти Redis", added: "Илова карда шуд", saved: "Навсозӣ", cancelled: "Бекор карда шуд", deleted: "Нобуд", savedRedis: "Маълумоти Redis захира карда мешавад", redisDisconnected: opts => { return `Пайвасти ҷорӣ хатогӣ дошт: ${opts.error.message}`; }, dbChanged: opts => { return `Индекси db ба ${opts.db}. `; }, treeDeleted: opts => { return `Калиди дарахт нест карда шуд (${opts.key}).`; }, deletedKey: opts => { return `Калид нест карда шуд (${opts.key}).`; }, renamedKey: "Ин калид номгузорӣ шудааст", ttlChanged: "Ин калиди TTL тағир дода шудааст", notInteger: "Ин вуруд адади бутун нест", persisted: "Ин калид то абад нигоҳ дошта мешавад", set: "Калид гузошта шудааст/илова карда шудааст" }, code: { "delete-connection": "Ин пайвастшавӣ нест карда шуд, бинобар ин шумо аз ин мисоли Redis ҷудо кардаед.", "save-connection": "Ин пайвастшавӣ тағир дода шуд, бинобар ин шумо аз ин мисоли Redis ҷудо шудаед. Шумо метавонед дубора пайваст шавед.", "readonly-connections": "Пайвастшавӣ илова/захира/нест кардан танҳо барои хондан аст!", "readonly-connection-mode": "Ин пайвастшавӣ ҳолати танҳо барои хондан аст!", "list-out-of-bounds": "Ин шохиси рӯйхат берун аз ҳудуди аст", "donation-ware-feature": "Ин хусусият дар версияи хайрия мавҷуд аст.", "feature-pro-readonly-required": "Ҳолати пайвастшавӣ танҳо барои хондан иҷозатномаи Pro ё Enterprise -ро талаб мекунад.", "feature-pro-ssh-required": "Нақби SSH иҷозатномаи Pro ё Enterprise-ро талаб мекунад.", "feature-enterprise-cluster-sentinel-required": "Cluster ва Sentinel иҷозатномаи корхонаро талаб мекунанд.", "feature-pro-json-binary-required": "Таҳрири JSON, Боркунии бинарӣ ва зеркашии бинарӣ иҷозатномаи Pro ё Enterprise талаб мекунанд.", "feature-pro-rejson-required": "ReJSON (навъи маълумот JSON) иҷозатномаи Pro ё Enterprise -ро талаб мекунад.", "invalid-json-value": "Қимат JSON эътибор надорад.", "http_auth_required": "Иҷозатнома талаб карда мешавад: лутфан б�� HTTP Basic Auth аутентификатсия кунед ва аз нав бор кунед.", "auto-connection-failed": "Эҳтимол аст, ки пайвастшавӣ хориҷ карда шуд ва пайвасти худкор аз ин сабаб ноком шуд.", invalid_console_command: "Ин фармон тавассути GUI кор намекунад." }, licenseReason: { LICENSE_VALID: "Иҷозатнома эътибор дорад", LICENSE_INVALID: "Иҷозатнома беэътибор аст", LICENSE_MISSING: "Калиди литсензия муқаррар карда нашудааст", LICENSE_DISABLED: "Литсензия дар конфигуратсияи сервер ғайрифаъол аст", LICENSE_NOT_FOUND: "Литсензия ёфт нашуд", LICENSE_EXPIRED: "Мӯҳлати иҷозатнома ба охир расидааст", LICENSE_CLEARED: "Калиди литсензия тоза карда шуд", LICENSE_MAX_DEVICES_REACHED: "Ба ҳадди ниҳоии курсиҳои дастгоҳ расид", PRODUCT_MISMATCH: "Маҳсулоти иҷозатнома мувофиқат намекунад" }, licenseStatusValue: { active: "Фаъол", deleted: "Нобуд", all: "Ҳама", expired: "Муддат гузаштааст", missing: "Бедарак", inactive: "ғайрифаъол" }, form: { error: { required: "Талаб карда мешавад", port: "Порт дар байни 1-65535 аст", invalid: "Шакл беэътибор аст" }, connection: { label: { name: "Ном", group: "Group", host: "Номи мизбон", port: "Порт", password: "Рамз", username: "Номи корбар" } }, treeSettings: { maxValueDisplay: "Арзиши максималии дарозии сатри намоиш", maxValueDisplayInfo: "Агар ба 0 муқаррар карда шавад, арзишҳои пурраро нишон диҳед. Агар аз 0 зиёд бошад, ба ин дарозӣ буред. Агар -1: барои сатрҳо, арзишро то таҳрир пинҳон кунед; барои навъҳои дигар, мундариҷаи пурраро нишон диҳед.", maxKeys: "Шумораи максималии калид", maxKeysInfo: "Барои он ки GUI суқут накунад, мо шумораи максималии калидҳоро маҳдуд мекунем.", keyCount: () => { return `Шумораи калидҳо: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Аниматсияро истифода баред", noAnimation: "Аниматсия нест", jsonFormatTwoSpace: "Формат JSON бо 2 фосила", jsonFormatFourSpace: "Формат JSON бо 4 фосила", formName: "Танзимоти Redis", searchModeClient: "Ҳолати ҷустуҷӯи муштарӣ", searchModeServer: "Ҳолати ҷустуҷӯи сервер", searchModeStartsWith: "Ҷустуҷӯ бо оғоз бо режим", searchModeIncludes: "Ҷустуҷӯ режимро дар бар мегирад" }, field: { treeSeparator: "Ҷудокунандаи дарахт", treeSeparatorSelector: "Интихобкунандаи ҷудокунандаи дарахт", page: "Шумораи пейджинги дарахт", keyPageCount: "Шумораи пейджинги калидӣ", keysSort: "Калидҳоро ҷудо кунед", searchMode: "Ҳолати ҷустуҷӯ", searchModeStartsWith: "Ҷустуҷӯ бо / дар бар мегирад" }, error: { keyPageCount: "Шумораи саҳифаҳои калидӣ бояд адад аз 5 то 100 бошад", page: "Шумораи саҳифаҳо бояд адади бутуни аз 10 то 5000 бошад", maxValueDisplay: "Қимати максималии намоиш бояд адади бутуни байни -1 ва 32768 бошад", maxKeys: "Қимати максималии ҳисобкунии калид бояд адад аз 100 то 100000 бошад" } }, key: { label: { formName: { add: "Калиди нави Redis илова кунед", edit: "Калиди Redis-ро таҳрир кунед", append: "Ба калиди мавҷудаи Redis илова кунед" } }, field: { streamTimestamp: "Тамғаи вақт", key: "Калид", type: "Навъи", index: "Индекс", hashKey: "Калиди хэш", score: "Хол", value: "Арзиш" }, error: { streamTimestamp: "Тамғаи вақт талаб карда мешавад, ё формати Redis ё ҳамчун *", key: "Калид, ҳад��и аққал як аломат аст", hashKey: "Калиди ҷадвали ҳаш ҳадди аққал як аломат аст", score: "Холи маҷмӯи мураттабшуда талаб карда мешавад", value: "Арзиш талаб карда мешавад" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Ҷустуҷӯ", index: "Индекс", query: "Дархост", results: "Натиҷаҳо", noIndex: "Индексҳо ёфт нашуд", createIndex: "Индекс созед", dropIndex: "Индексро нест кунед", indexInfo: "Маълумоти индекс", indexName: "Номи индекс", prefix: "Пешванди калид (ихтиёрӣ)", fieldName: "Номи майдон", }, monitor: { title: "Мониторинг", memory: "Хотира", opsPerSec: "Амалиёт/сон", clients: "Муштариён", blocked: "Басташуда", hitsMisses: "Сатҳи бурд", networkIo: "Шабака I/O", slowLog: "Гузориши суст", totalCommands: "Ҷамъ", expired: "Мӯҳлаташ гузашт", evicted: "Ронда шуд", clientList: "Рӯйхати муштариён", topKeys: "Калидҳои калон аз рӯи хотира", killClient: "Муштариро фурӯзонед", clientKilled: "Муштарӣ фурӯзонда шуд", confirmKillClient: "Шумо мутмаинед, ки ин муштариро қатъ кунед?", noKeys: "Калидҳо нест", noClients: "Муштариён нест", }, overview: { noConnected: "Ба Redis пайв��ст нест.", overviewClients: "Рӯйхати пайвастшавӣ аз рӯи шумораи муштариён", connectedCount: opt => { if (opt.length === 1) { return "1 муштарӣ"; } return `${opt.length} мизоҷон`; } }, key: { label: { key: "Калид", encoding: "Рамзгузорӣ", length: "Андоза", ttl: "TTL", ttlTitle: "Вақт барои зиндагӣ", type: "Навъи", ttlNotExpire: "ба охир намерасад", lengthString: "байт", lengthItem: "ашё", actions: "Амалҳо" }, list: { table: { index: "Индекс", value: "Арзиш" } }, hash: { table: { hashkey: "Хешкей", value: "Арзиш" } }, set: { table: { value: "аъзо" } }, zset: { table: { value: "аъзо", score: "Хол" } }, stream: { table: { timestamp: "ID тамғаи вақт", field: "Майдон", value: "Арзиш" } } }, treeControls: { settings: "Танзимоти дарахт", expandAll: "Ҳамаро васеъ кунед", collapseAll: "Ҳамаро вайрон кунед", search: { search: "Дар калидҳо ҷустуҷӯ кунед", clear: "Ҷустуҷӯи ҷориро тоза кунед, то холӣ таъин кунед", placeholderClient: "Ҷустуҷӯи тарафи муштарӣ", placeholderServer: "Ҷустуҷӯи тарафи сервер", info: "Ҷустуҷӯи ҷониби муштарӣ маънои онро дорад, ки он ба матни вуруди ҷустуҷӯ мувофиқат мекунад. Ҷустуҷӯи тарафи сервер маънои онро дорад, ки он мисли ҷустуҷӯ дар намунаҳои калидҳо ҳамчун *{search-text}* аст. Барои маҷмӯаҳои ҷустуҷӯии калон, беҳтар аст, ки ҷустуҷӯи серверро истифода баред. Барои маҷмӯаҳои ҷустуҷӯии хурдтар, беҳтар аст, ки режими ҷустуҷӯи муштарӣ истифода шавад." + ` Агар шумори калидҳо тамом шавад ${p3xr.settings.maxLightKeysCount}, шумо метавонед танҳо дар тарафи сервер ҷустуҷӯ кунед.`, largeSetInfo: "Дар маҷмӯи калон ҷустуҷӯи муштарӣ ғайрифаъол аст. бинобар ин ҳоло танҳо ҷустуҷӯи сервер имконпазир аст.", infoDetails: "Барои фаҳмидани он ки ҷустуҷӯ чӣ гуна кор мекунад, лутфан танзимотро тафтиш кунед" }, pager: { next: "Оянда", prev: "Гузашта", first: "Аввал", last: "Охирин" } } }, time: { loading: "Бор мешавад...", years: "сол", months: "моҳҳо", days: "рӯз", year: "сол", month: "моҳ", day: "рӯз" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/th/000077500000000000000000000000001517666434100137665ustar00rootroot00000000000000src/strings/th/strings.js000066400000000000000000001343371517666434100160300ustar00rootroot00000000000000const strings = { error: { cleared_license: "ใบอนุญาตเคลียร์แล้ว", invalid_license: "ใบอนุญาตไม่ถูกต้อง", license_max_devices_reached: "ถึงจำนวนที่นั่งอุปกรณ์สูงสุดแล้ว", license_readonly: "ใบอนุญาตสามารถเปลี่ยนแปลงได้จากเทอร์มินัลเซิร์ฟเวอร์เท่านั้น", server_error: "ข้อผิดพลาดของเซิร์ฟเวอร์ โปรดลองอีกครั้ง" }, title: { donate: "บริจาค", jsonRecursive: "ขยายใบทั้งหมด", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "คุณสามารถเลือกการเชื่อมต่อ Redis เพื่อเชื่อมต่อจา��เมนูด้านล่างซ้าย", statistics: "สถิติ", error: "เกิดข้อผิดพลาด", connectingRedis: "กำลังเชื่อมต่อกับ Redis ...", socketioConnectError: "ข้อผิดพลาด Socket.IO", db: "DB", server: "เซิร์ฟเวอร์", clients: "ลูกค้า", memory: "หน่วยความจำ", persistence: "ความพากเพียร", stats: "สถิติ", replication: "การจำลองแบบ", cpu: "CPU", cluster: "Cluster", modules: "โมดูล", errorstats: "สถิติข้อผิดพลาด", commandstats: "สถิติคำสั่ง", latencystats: "สถิติเวลาแฝง", keysizes: "ขนาดคีย์", threads: "เธรด", }, confirm: { dropIndex: "คุณแน่ใจหรือว่าต้องการลบดัชนีนี้?", uploadBuffer: "คุณแน่ใจหรือว่าจะอัปโหลดข้อมูลไบนารีนี้", uploadBufferDone: "ข้อมูลไบนารี่ถูกอัพโหลด", uploadBufferDoneAndSave: "ข้อมูลไบนารีถูกอัพโหลดและบันทึกบนเซิร์ฟเวอร์", title: "ยืนยัน", alert: "การแจ้งเตือน", info: "ข้อมูล", deleteListItem: "คุณแน่ใจที่จะลบรายการนี้หรือไม่?", deleteHashKey: "คุณแน่ใจหรือไม่ว่าจะลบรายการคีย์แฮชนี้", deleteStreamTimestamp: "คุณแน่ใจหรือว่าจะลบการประทับเวลาสตรีมนี้", deleteSetMember: "คุณแน่ใจหรือว่าจะลบสมาชิกชุดนี้", deleteZSetMember: "คุณแน่ใจหรือไม่ที่จะลบสมาชิกชุดที่เรียงลำดับนี้", deleteConnection: "ยืนยัน", deleteConnectionText: "คุณแน่ใจหรือไม่ว่าจะ��บการเชื่อมต่อ Redis นี้", deleteNode: "คุณแน่ใจหรือไม่ว่าจะลบโหนด Redis นี้", deleteAllKeys: opts => { return `ลบแผนผังนี้และกุญแจทั้งหมด (${opts.key})?`; }, socketioConnectError: "Socket.IO ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ คุณสามารถโหลดซ้ำและลองแ��้ไขข้อผิดพลาดในการเชื่อมต่อด้วยตนเอง ไคลเอ็นต์ไม่ทราบวิธีแก้ปัญหาด้วยตนเอง", socketioAuthRequired: "ต้องมีการอนุญาต Socket.IO โปรดตรวจสอบสิทธิ์ด้วย HTTP Basic Auth (ชื่อผู้ใช้/รหัสผ่าน) แล้วโหลดซ้ำ", deleteKey: "คุณแน่ใจหรือว่าจะลบคีย์นี้", rename: { title: "คุณแน่ใจหรือว่าจะเปลี่ยนชื่อคีย์นี้", textContent: "การดำเนินการนี้จะเปลี่ยนชื่อคีย์อย่างถาวร", placeholder: "คีย์ Redis (จำเป็น)" }, ttl: { title: "คุณแน่ใจหรือไม่ว่าต้องการเปลี่ยน TTL ของคีย์นี้", textContent: "การเปลี่ยน TTL จะอัปเดตเวลาใช้งานของคีย์นี้ เว้นว่างไว้เพื่อเก็บคีย์นี้ไว้ตลอดไป", placeholder: "TTL ของคีย์ TTL (จำนวนเต็มหรือว่าง)", placeholderPlaceholder: "ความว่างเปล่าหมายความว่ามันคงอยู่ตลอดไป มิฉะนั้นให้ป้อนจำนวนเต็ม", convertTextToTime: "แปลงข้อความเป็นเวลา", convertTextToTimePlaceholder: "เช่น 1d จะเป็น 86400" }, license: { title: "กำหนดใบอนุญาต", textContent: "หากคุณต้องการใช้คุณสมบัติแบบชำระเงิน โปรดติดต่อ support@corifeus.com เพื่อขอใบอนุญาต ราคาคือ Pro 400 HUF/เดือน (€1/เดือน) หรือ 4,000 HUF/ปี (€10/ปี) และ Enterprise 1,200 HUF/เดือน (3 ยูโร/เดือน) หรือ 12,000 HUF/ปี (30 ยูโร/ปี) รายปีคือ 10x ต่อเดือน ด้วย 27% VAT ยอดรวมคือ Pro 500 HUF/เดือน (1.27 ยูโร/เดือน) หรือ 5,100 HUF/ปี (12.70 ยูโร/ปี), Enterprise 1,500 HUF/เดือน (3.81 ยูโร/เดือน) หรือ 15,200 HUF/ปี (€38.10/ปี) การตรวจสอบใบอนุญาตต้องมีการเข้าถึงอินเทอร์เน็ต ใบอนุญาตเริ่มต้นประกอบด้วย 5 ที่นั่ง หากต้องการที่นั่งเพิ่มเติม โปรดติดต่อเราที่ support@corifeus.com", placeholder: "รหัสใบอนุญาต" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "คัดลอก", downloadBuffer: "ดาวน์โหลด��บนารี่", setBuffer: "อัปโหลดไบนารี", exportKeys: "ส่งออกคีย์", exportAllKeys: (opts) => `ส่งออกคีย์ทั้งหมด ${opts.count} รายการ`, exportSearchResults: (opts) => `ส่งออก ${opts.count} ผลลัพธ์`, importKeys: "นำเข้าคีย์", saveWithFormatJson: "บันทึกด้วยรูปแบบ", formatJson: "จัดรูปแบบ Json", wrap: "ห่อ", unwrap: "แกะห่อ", downloadJson: "ดาวน์โหลด JSON.dll", pubsubMonitor: "มอนิเตอร์ PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "ภาษา", ok: "ตกลง", addKey: "เพิ่มลงในคีย์นี้", addKeyRoot: "เพิ่มคี���์รูท", reloadKey: "โหลดคีย์ซ้ำ", reload: "โหลดซ้ำ", close: "ปิด", commands: "คำสั่ง", view: "ดู", statistics: "สถิติ", refresh: "รีเฟรช", pause: "หยุดชั่วคราว", resume: "ดำเนินการต่อ", clear: "ชัดเจน", rename: "เปลี่ยนชื่อ", main: "ฐานข้อมูล", cancel: "ยกเลิก", theme: "ธีม", github: "GitHub", githubRepo: "พื้นที่เก็บข้อมูล", githubRelease: "ข่าวประชาสัมพันธ์", githubChangelog: "บันทึกการเปลี่ยนแปลง", info: "Info", settings: "การตั้งค่า", connect: "เชื่อมต่อ", disconnect: "ตัดการเชื่อมต่อ", overview: "ภาพรวม", console: "คอนโซล", noConnections: "ไม่มีการเชื่อมต่อ เพิ่มการเชื่อมต่อในเมนูการตั้งค่า", noConnectionsInSettings: "ไม่มีการเชื่อมต่อ คุณสามารถเพิ่มการเชื่อมต่อใหม่ด้านบนได้", connectionAdd: "การเชื่อมต่อใหม่", addGroup: "เพิ่มกลุ่ม", extend: "ขยาย", collapse: "ยุบ", add: "เพิ่ม", edit: "แก้ไข", save: "บันทึก", ttl: "ตั้งค่า TTL", license: "กำหนดใบอนุญาต", delete: "ลบ", remove: "ลบ", sure: "แน่นอน", testConnection: "ทดสอบการเชื่อมต่อ", getKey: "กำลังโหลดคีย์ Redis และข้อมูลที่เกี่ยวข้อง ...", jsonViewShow: "จอแสดงผล JSON", jsonViewEditor: "แก้ไข JSON", quickConsole: "คอนโซลด่วน", }, label: { id: { nodeId: "รหัสโหนด", id: "รหัสการเชื่อมต่อ", info: "หากคุณไม่ต้องการเปลี่ยนคุณสมบัติของ: sshPassword, sshPrivateKey, รหัสผ่าน, tlsCrt, tlsKey, tlsCa โปรดป้อน ID ของการเชื่อมต่อในคุณสมบัติเหล่านั้นเพื่อรักษาค่าคุณสมบัติให้คงเดิม หากคุณต้องการตรรกะเดียวกันในรหัสผ่านโหนด ให้ป้อน ID โหนดในรหัสผ่านโหนด" }, secureFeature: "หากคุณเห็นค่าที่ขึ้นต้นด้วย P3X และมีลักษณะเหมือนกัน แสดงว่าเป็นคุณสมบัติที่ปลอดภัย หากต้องการเปลี่ยนการตั้งค่า เพียงแทนที่การตั้งค่าเหล่านี้ด้วยค่าว่างหรืออย่างอื่น จากนั้นระบบจะบันทึกการตั้งค่าเหล่านั้น หากคุณไม่เปลี่ยนการตั้งค่า การตั้งค่าจะถูกเก็บไว้เหมือนเดิมบนเซิร์ฟเวอร์", ssh: { on: "เปิด SSH", off: "ปิด SSH", sshHost: "โฮสต์ SSH", sshPort: "พอร์ต SSH", sshUsername: "ชื่อผู้ใช้ SSH", sshPassword: "รหัสผ่าน SSH", sshPrivateKey: "รหัสส่วนตัว SSH" }, isBuffer: opts => `[object ArrayBuffer] หมายความว่าค่าเป็นข้อมูลไบนารีหรือค่ามากกว่า ${opts.maxValueAsBuffer}`, streamValue: `ฟิลด์สตรีมและค่าเป็น oneliner เช่น: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' หมายถึง สร้างอัตโนมัติหรือสเปคเป็น -`, unableToLoadKey: ({ key }) => { return `ไม่สามารถโหลดคีย์นี้ได้: ${key}. เป็นไปได้ คีย์ถูกลบไปแล้ว ข้อผิดพลาดที่แน่นอนอยู่ในคอนโซล`; }, bigJson: "อ็อบเจ็กต์ JSON นี้มีขนาดเกิน 10 kb ดังนั้นตรวจสอบให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ เนื่องจากบางฟังก์ชันอาจแสดงผลช้า", addNode: "เพิ่มโหนด", validateJson: "ตรวจสอบ JSON", reducedFunction: `ฟังก์ชั่นลดลง`, tooManyKeys: opts => { return `สำหรับฟังก์ชันสูงสุดที่อนุญาตทั้งหมด คีย์ทั้งหมดคือ ${opts.maxLightKeysCount} นับ ฐานข้อมูลนี้มีมากกว่าคีย์ที่อนุญาตทั้งหมด ${opts.count}. การเรียงลำดับคีย์และข้อมูลแผนผังแฟนซีเพิ่มเติมถูกปิดใช้งาน การค้นหาเกิดขึ้นเฉพาะบนเซิร์ฟเวอร์แทนการค้นหาไคลเอ็นต์`; }, redisCommandNotFound: "ไม่พบการจับคู่คำสั่ง Redis ...", treeKeyStore: `การเรียงลำดับ (การเปรียบเทียบแบบธรรมชาติ) จะดำเนินการบนไคลเอนต์หรือที่เรียกว่าเบราว์เซอร์ ซึ่งหมายความว่ามีการลงโทษสำหรับชุดขนาดใหญ่ขนาดใหญ่ เช่น มากกว่า 10,000 คีย์ ซึ่งอาจเพิ่มเวลาเล็กน้อยในการแสดงผลเพจ ไม่มีการเรียงลำดับคีย์ใน Redis มีเพียงเท่านี้เท่านั้น`, socketIoTimeout: options => { return `Socket.IO หมดเวลาสำหรับคำขอนี้ (สูงสุด ${options.timeout / 1000} วินาที) ...`; }, resizerInfo: options => { return `ความกว้างขั้นต่ำของแผงด้านซ้ายหรือด้านขวาคือ ${options.width}พิกเซล`; }, jsonViewNotParsable: "ค่านี้ไม่สามารถแยกวิเคราะห์ JSON ได้ ", ttlTitle: "ตั้งค่า TTL เป็นวินาที", passwordSecure: "รหัสผ่านอาจจะว่างเปล่า แต่ยังคงแสดงตัวอักษร นี่คือคุณลักษณะด้านความปลอดภัย", tlsWithoutCert: "เปิดใช้งาน TLS โดยไม่มีใบรับรองเพิ่มเติม", tlsRejectUnauthorized: "ปฏิเสธใบรับรองที่ไม่ได้รับอนุญาต", tlsSecure: "หากคุณเห็นการกำหนดค่า TLS ที่ขึ้นต้นด้วย P3X หรือการต���้งค่า TLS ทั้งหมดเหมือนกัน แสดงว่าเป็นคุณสมบัติที่ปลอดภัย หากต้องการเปลี่ยนการตั้งค่า เพียงแทนที่การตั้งค่าเหล่านี้ด้วยค่าว่างหรืออย่างอื่น จากนั้นระบบจะบันทึกการตั้งค่าเหล่านั้น หากคุณไม่เปลี่ยนการตั้งค่า TLS การตั้งค่าจะถูกเก็บไว้เหมือนเดิมบนเซิร์ฟเวอร์", treeSeparatorEmpty: "หากตัวแยกแผ��ผังว่างเปล่า ต้นไม้จะไม่มีโหนดที่ซ้อนกัน เป็นเพียงรายการล้วนๆ", treeSeparatorEmptyNote: "ไม่มีโหนดที่ซ้อนกัน เป็นเพียงรายการล้วนๆ", welcomeConsole: "ยินดีต้อนรับสู่คอนโซล Redis", welcomeConsoleInfo: "เปิดใช้งานประวัติเคอร์เซอร์ขึ้นหรือลง", redisListIndexInfo: "เว้นว่างไว้เพื่อต่อท้าย -1 เพื่อเติมหรือบันทึกลงในตำแหน่งที่แสดง", console: "คอนโซล", connectiondAdd: "เพิ่มการเชื่อมต่อ", connectiondEdit: "แก้ไขการเชื่อมต่อ", connectiondView: "ดูการเชื่อมต่อ", connections: "การเชื่อมต่อ", licenseInfo: "ใบอนุญาต", licenseEditable: "ใบอนุญาตแก้ไขได้", licenseEditableYes: "ใช่", licenseEditableNo: "ไม่", licenseTerminalOnly: "ใบอนุญาตสามารถกำหนดค่าได้จากเทอร์มินัลเซิร์ฟเวอร์เท่านั้น", licenseTierPolicyTitle: "นโยบายระดับ", licenseTierPolicyText: "

Free

core Redis UI เท่านั้น; ไม่มีช่องสัญญาณ SSH, ไม่มีโหมดการเชื่อมต่อแบบอ่านอย่างเดียว, ไม่มี Cluster/Sentinel, ไม่มีการแก้ไข JSON/อัปโหลดไบนารี/ไบนารีดาวน์โหลด, ไม่มี ReJSON.
ราคา: 0 HUF/เดือน (0 ยูโร/เดือน).

Pro

SSH tunneling, โหมดการเชื่อมต่อแบบอ่านอย่างเดียว (รวมถึง --readonly-connections/-r), แก้ไข JSON, อัปโหลดไบนารี่, ดาวน์โหลดไบนารี, ReJSON.
ราคาพื้นฐาน: 400 HUF/เดือน (1 ยูโร/เดือน) หรือ 4,000 HUF/ปี (€10/ปี).
รวมด้วย 27% VAT: 500 HUF/เดือน (1.27 ยูโร/เดือน) หรือ 5,100 HUF/ปี (€12.70/ปี).

Enterprise

SSH tunneling, Cluster และ Sentinel รวมถึงแก้ไข JSON, อัปโหลดไบนารี, ดาวน์โหลดไบนารี, ReJSON; --readonly-connections/-r ยังใช้งานได้
ราคาพื้นฐาน: 1,200 HUF/เดือน (3 ยูโร/เดือน) หรือ 12,000 HUF/ปี (€30/ปี).
รวมด้วย 27% VAT: 1,500 HUF/เดือน (€3.81/เดือน) หรือ 15,200 HUF/ปี (€38.10/ปี).

Yกฎช่วงแรก

Yราคาช่วงต้นคือ 10 เท่าของรายเดือน ราคา

Seats

ใบอนุญาตเริ่มต้นประกอบด้วย 5 ที่นั่ง หากคุณต้องการที่นั่งเพิ่ม โปรดติดต่อเราที่ support@corifeus.com.

Enterprise ทดลองใช้

ฟรี 10 วันสำหรับทุกคนที่มีที่อยู่อีเมลจริง (อีเมลที่ไม่ใช่การทดสอบ).

ข้อมูลการเรียกเก็บเงินในอีเมล

Name, อีเมลการเรียกเก็บเงิน, รหัสประเทศ, รหัสไปรษณีย์, เมือง, ที่อยู่, VAT ID (ไม่จำเป็น).

Payment

PayPal การชำระเงินมีเฉพาะใน HUF (ฟอรินต์); หลังจากโอนเงินแล้ว @ https://paypal.me/corifeus ฉันจะส่งใบแจ้งหนี้ไปให้คุณ การชำระเงินทั้งหมดไม่สามารถคืนเงินได้

VAT

VAT จะถูกเพิ่มเข้าไปในราคา (27% ใน ฮังการี).

ติดต่อ

หากคุณต้องการทักทายหรือมีคำถาม โปรดติดต่อ support@corifeus.com.

Language

ใบแจ้งหนี้และใบอนุญาต การสื่อสารทางอีเมลเป็นภาษาอังกฤษ สกุลเงินของใบแจ้งหนี้คือ HUF.

Note

License การตรวจสอบความถูกต้องต้องมีการเข้าถึงอินเทอร์เน็ต", licenseState: "รัฐ", licenseStateActive: "ใช้งานอยู่", licenseStateInactive: "ไม่ได้ใช้งาน", licenseStateNoLicense: "ไม่มีใบอนุญาต", licenseKeyMasked: "คีย์ที่บันทึกไว้", licenseTier: "ชั้น", licenseValid: "ถูกต้อง", licenseStatus: "สถานะใบอนุญาต", licenseReason: "เหตุผล", licenseCheckedAt: "ตรวจที่", licenseStartsAt: "เริ่มต้นที่", licenseExpiresAt: "หมดอายุที่", licenseDaysLeft: "เหลืออีกไม่กี่วัน", licenseMaxDevices: "อุปกรณ์สูงสุด", licenseActiveDevices: "อุปกรณ์ที่ใช้งานอยู่", licenseActiveDevicesInfo: "หากไม่ได้ใช้งานอุปกรณ์อีกต่อไป ที่นั่งจะถูกปล่อยโดยอัตโนมัติหลังจากผ่านไป 75 นาที", licenseCustomerEmail: "อีเมล์ลูกค้า", licenseFeatures: "คุณสมบัติ", licenseFeaturesEmpty: "ไม่มีคุณสมบัติพิเศษ", licenseFeatureReadonlyMode: "โหมดการเชื่อมต่อแบบอ่านอย่างเดียว", licenseFeatureReadonlyConnectionsFlag: "การเชื่อมต่อแบบอ่านอย่างเดียว (--readonly-connections/-r)", licenseFeatureSsh: "การขุดอุโมงค์ SSH", licenseFeatureCluster: "การเชื่อมต่อ Cluster", licenseFeatureSentinel: "การเชื่อมต่อ Sentinel", licenseFeatureReJSON: "ReJSON (ชนิดข้อมูล JSON)", keysSort: { on: "เปิดการเรียงลำดับคีย์", off: "การเรียงลำดับคีย์ออก" }, cluster: { on: "เปิด Cluster", off: "ปิด Cluster" }, sentinel: { on: "เปิด Sentinel", off: "ปิด Sentinel", name: "ชื่อ Sentinel" }, readonly: { on: "เปิดอ่านอย่างเดียว", off: "ปิดอ่านอย่างเดียว" }, proSshOnly: "SSH มีให้ใช้งานในรุ่น Pro หรือ Enterprise", proReadonlyOnly: "โหมดการเชื่อมต่อแบบอ่านอย่างเดียวมีให้ใช้งานในรุ่น Pro หรือ Enterprise", enterpriseClusterSentinelOnly: "Cluster ��ละ Sentinel มีเฉพาะใน Enterprise เท่านั้น", theme: { light: "เบา", dark: "องค์กรแห่งความมืด", darkNeu: "มืด", darkoBluo: "ดาร์โก บลู", enterprise: "องค์กร", redis: "Redis", matrix: "เมทริกซ์" }, connected: opts => { return `เชื่อมต่อแล้ว: ${opts.name}`; }, tree: "ต้นไม้", askAuth: "ขออนุญาติ", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "โมดูล", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "ตัดการเชื่อมต่อ", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "คำสั่ง Redis", ungrouped: "ไม่มีกลุ่ม", grouped: "Grouped", connectFirst: "เชื่อมต่อกับเซิร์ฟเวอร์ Redis ก่อน", searchLanguage: "ค้นหาภาษา...", exportProgress: "กำลังส่งออกคีย์...", importProgress: "กำลังนำเข้าคีย์...", importPreview: "แสดงตัวอย่าง", importOverwrite: "เขียนทับ", importSkip: "ข้าม", importConflict: "หากคีย์มีอยู่แล้ว:", noKeysToExport: "ไม่มีคีย์ที่จะส่งออก", time: "เวลา", loading: "กำลังโหลด...", autoRefresh: "อัตโนมัติ", exportSearchHint: "ส่งออกเฉพาะคีย์ที่ตรงกับการค้นหาปัจจุบัน", importSearchHint: "การนำเข้าจะใช้กับฐานข้อมูลทั้งหมด ไม่ใช่แค่ผลการค้นหา", importNoKeys: "ไม่พบคีย์ในไฟล์", }, status: { dataCopied: "ข้อมูลอยู่ในคลิปบอร์ด", licenseSaved: "บันทึกใบอนุญาตแล้ว", exportDone: "ส่งออกเสร็จสิ้น", indexCreated: "สร้างดัชนีแล้ว", indexDropped: "ลบดัชนีแล้ว", importDone: (opts) => `นำเข้าเสร็จสิ้น: ${opts.created} สร้างแล้ว, ${opts.skipped} ข้ามแล้ว, ${opts.errors} ข้อผิดพลาด`, nodeRemoved: "นำโหนดออกแล้ว", keyIsNotExisting: "คีย์นี้อาจถูกลบหรือหมดอายุแล้ว", keyCount: opts => { if (opts.keyCount === 0) { return "ไม่มีกุญแจ"; } else if (opts.keyCount === 1) { return "1 คีย์"; } else { return `${opts.keyCount} กุญแจ`; } }, treeExpandAll: "ขยายใบต้นไม้ทั้งหมด การดำเนินการนี้อาจมีราคาแพงและอาจต้องใช้เวลา ...", noRedisKeys: "ไม่มีคีย์ในฐานข้อมูลนี้", redisConnected: "เชื่อมต่อ Redis ส���เร็จแล้ว", reloadingDataInfo: "กำลังโหลดข้อมูลข้อมูล Redis อีกครั้ง", added: "เพิ่มแล้ว", saved: "อัปเดตแล้ว", cancelled: "ยกเลิกแล้ว", deleted: "ลบแล้ว", savedRedis: "ข้อมูล Redis จะถูกบันทึกไว้", redisDisconnected: opts => { return `การเชื่อมต่อปัจจุบันมีข้อผิดพลาด: ${opts.error.message}`; }, dbChanged: opts => { return `ดัชนี db ตั้งค่าเป็น ${opts.db}. `; }, treeDeleted: opts => { return `ทรีคีย์ถูกลบแล้ว (${opts.key}).`; }, deletedKey: opts => { return `คีย์ถูกลบแล้ว (${opts.key}).`; }, renamedKey: "เปลี่ยนชื่อคีย์นี้แล้ว", ttlChanged: "TTL ของคีย์นี้มีการเปลี่ยนแปลง", notInteger: "อินพุตนี้ไม่ใช่จำ���วนเต็ม", persisted: "กุญแจดอกนี้จะคงอยู่ตลอดไป", set: "กุญแจถูกตั้งค่า/เพิ่ม" }, code: { "delete-connection": "การเชื่อมต่อนี้ถูกลบแล้ว ดังนั้นคุณจึงยกเลิกการเชื่อมต่อกับอินสแตนซ์ Redis นี้", "save-connection": "การเชื่อมต่อน��้มีการเปลี่ยนแปลง ดังนั้นคุณจึงยกเลิกการเชื่อมต่อกับอินสแตนซ์ Redis นี้ คุณสามารถเชื่อมต่อใหม่ได้", "readonly-connections": "การเชื่อมต่อเพิ่ม/บันทึก/ลบเป็นแบบอ่านอย่างเดียวเท่านั้น!", "readonly-connection-mode": "การเชื่อมต่อนี้เป็นโหมดอ่านอย่างเดียว!", "list-out-of-bounds": "ดัชนีรายการนี้อยู่นอกขอบเขต", "donation-ware-feature": "คุณลักษณะนี้มีอยู่ในเวอร์ชันบริจาค", "feature-pro-readonly-required": "โหมดการเชื่อมต่อแบบอ่านอย่างเดียวต้องใช้ใบอนุญาต Pro หรือ Enterprise", "feature-pro-ssh-required": "การทำทันเนล SSH จำเป็นต้องมีใบอนุญาต Pro หรือ Enterprise", "feature-enterprise-cluster-sentinel-required": "Cluster และ Sentinel จำเป็นต้องมีใบอนุญาตระดับองค์กร", "feature-pro-json-binary-required": "แก้ไข JSON อัปโหลดไบนารี่ และดาวน์โหลดไบนารี่ต้องใช้ใบอนุญาต Pro หรือ Enterprise", "feature-pro-rejson-required": "ReJSON (ประเภทข้อมูล JSON) ต้องใช้ใบอนุญาต Pro หรือ Enterprise", "invalid-json-value": "ค่านี้ไม่ถูกต้อง JSON", "http_auth_required": "ต้องมีการอนุญาต: โปรดตรวจสอบสิทธิ์กับ HTTP Basic Auth และโหลดซ้ำ", "auto-connection-failed": "เป็นไปได้ การเชื่อมต่อถูกลบออก และการเชื่อมต่ออัตโนมัติล้มเหลวด้วยเหตุนี้", invalid_console_command: "คำสั่งนี้ใช้ไม่ได้กับ GUI" }, licenseReason: { LICENSE_VALID: "ใบอนุญาตถูกต้อง", LICENSE_INVALID: "ใบอนุญาตไม่ถูกต้อง", LICENSE_MISSING: "ไม่ม��การตั้งค่ารหัสใบอนุญาต", LICENSE_DISABLED: "ใบอนุญาตถูกปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์", LICENSE_NOT_FOUND: "ไม่พบใบอนุญาต", LICENSE_EXPIRED: "ใบอนุญาตหมดอายุแล้ว", LICENSE_CLEARED: "ล้างรหัสใบอนุญาตแล้ว", LICENSE_MAX_DEVICES_REACHED: "ถึงจำนวนที่นั่งอุปกรณ์สูงสุดแล้ว", PRODUCT_MISMATCH: "ผลิตภัณฑ์ลิขสิทธิ์ไม่ตรงกัน" }, licenseStatusValue: { active: "ใช้งานอยู่", deleted: "ลบแล้ว", all: "ทั้งหมด", expired: "หมดอายุแล้ว", missing: "หายไป", inactive: "ไม่ได้ใช้งาน" }, form: { error: { required: "จำเป็น", port: "พอร์ตอ���ู่ระหว่าง 1-65535", invalid: "แบบฟอร์มไม่ถูกต้อง" }, connection: { label: { name: "ชื่อ", group: "Group", host: "ชื่อโฮสต์", port: "ท่าเรือ", password: "รหัสผ่าน", username: "ชื่อผู้ใช้" } }, treeSettings: { maxValueDisplay: "ความยาวสตริงการแสดงค่าสูงสุด", maxValueDisplayInfo: "หากตั้งค่าเป็น 0 แสดงค่าเต็ม หากมากกว่า 0 ให้ตัดทอนตามความยาวนี้ ถ้า -1: สำหรับสตริง ให้ซ่อนค่าจนกว่าจะแก้ไข สำหรับประเภทอื่นๆ ให้แสดงเ���ื้อหาทั้งหมด", maxKeys: "จำนวนคีย์สูงสุด", maxKeysInfo: "เพื่อให้ GUI ไม่ขัดข้อง เราจึงจำกัดจำนวนคีย์สูงสุด", keyCount: () => { return `จำนวนปุ่ม: ${p3xr.state.keysRaw.length}`; }, label: { animation: "ใช้ภาพเคลื่อนไหว", noAnimation: "ไม่มีภาพเคลื่อนไหว", jsonFormatTwoSpace: "จัดรูปแบบ JSON โดยเว้นวรรค 2 ช่อง", jsonFormatFourSpace: "จัดรูปแบบ JSON ด้วยช่องว่าง 4 ช่อง", formName: "การตั้งค่า Redis", searchModeClient: "โหมดการค้นหาลูกค้า", searchModeServer: "โหมดการค้นหาเซิร์ฟเวอร์", searchModeStartsWith: "ค้นหาด้วยการเริ่มต้นด้วยโหมด", searchModeIncludes: "ค้นหารวมถึงโหมด" }, field: { treeSeparator: "เครื่องแยกต้นไม้", treeSeparatorSelector: "ตัวเลือกตัวแยกต้���ไม้", page: "จำนวนเพจต้นไม้", keyPageCount: "จำนวนการเพจคีย์", keysSort: "จัดเรียงคีย์", searchMode: "โหมดการค้นหา", searchModeStartsWith: "ค้นหาเริ่มต้นด้วย / รวม" }, error: { keyPageCount: "จำนวนหน้าหลักต้องเป็นจำนวนเต็มระหว่าง 5 - 100", page: "จำนวนหน้าต้องเป็นจำนวนเต็มระหว่าง 10 - 5,000", maxValueDisplay: "ค่าที่แสดงสูงสุดต้องเป็นจำนวนเต็มระ���ว่าง -1 ถึง 32768", maxKeys: "ค่าจำนวนคีย์สูงสุดต้องเป็นจำนวนเต็มระหว่าง 100 ถึง 100,000" } }, key: { label: { formName: { add: "เพิ่มคีย์ Redis ใหม่", edit: "แก้ไขคีย์ Redis", append: "เพิ่มไปยังคีย์ Redis ที่มีอยู่" } }, field: { streamTimestamp: "การประทับเวลา", key: "คีย์", type: "ประเภท", index: "ดัชนี", hashKey: "แฮชคีย์", score: "คะแนน", value: "ความคุ้มค่า" }, error: { streamTimestamp: "ต้องมีการประทับเวลา รูปแบบ Redis หรือเป็น *", key: "สิ่งสำคัญคือต้องมีอักขระอย่างน้อยหนึ่งตัว", hashKey: "คีย์ตารางแฮชมีอักขระอย่างน้อยหนึ่งตัว", score: "จำเป็นต้องมีคะแนนชุดการเรียงลำดับ", value: "ต้องระบุค่า" } }, main: { label: { database: "DB" } } }, page: { search: { title: "ค้นหา", index: "ดัชนี", query: "คำค้นหา", results: "ผลลัพธ์", noIndex: "ไม่พบดัชนี", createIndex: "สร้างดัชนี", dropIndex: "ลบดัชนี", indexInfo: "ข้อมูลดัชนี", indexName: "ชื่อดัชนี", prefix: "คำนำหน้าคีย์ (ไม่บังคับ)", fieldName: "ชื่อฟิลด์", }, monitor: { title: "การตรวจสอบ", memory: "หน่วยความจำ", opsPerSec: "ปฏิบัติการ/วินาที", clients: "ไคลเอนต์", blocked: "ถูกบล็อก", hitsMisses: "อัตราการเข้าถึง", networkIo: "เครือข่าย I/O", slowLog: "บันทึกช้า", totalCommands: "ทั้งหมด", expired: "หมดอายุ", evicted: "ถูกลบ", clientList: "รายชื่อไคลเอนต์", topKeys: "คีย์ที่ใหญ่ที่สุดตามหน่วยความจำ", killClient: "ปิดไคลเอนต์", clientKilled: "ไคลเอนต์ถูกปิด", confirmKillClient: "คุณแน่ใจหรือว่าต้องการปิดไคลเอนต์นี้?", noKeys: "ไม่มีคีย์", noClients: "ไม่มีไคลเอนต์", }, overview: { noConnected: "ไม่มีการเชื่อมต่อกับ Redis", overviewClients: "รายชื่อการเชื่อมต่อตามจำนวนลูกค้า", connectedCount: opt => { if (opt.length === 1) { return "ลูกค้า 1 ราย"; } return `${opt.length} ลูกค้า`; } }, key: { label: { key: "คีย์", encoding: "การเข้ารหัส", length: "ขนาด", ttl: "TTL", ttlTitle: "ถึงเวลามีชีวิตอยู่", type: "ประเภท", ttlNotExpire: "ไม่หมดอายุ", lengthString: "ไบต์", lengthItem: "รายการ", actions: "การดำเนินการ" }, list: { table: { index: "ดัชนี", value: "ความคุ้มค่า" } }, hash: { table: { hashkey: "แฮชคีย์", value: "ความคุ้มค่า" } }, set: { table: { value: "สมาชิก" } }, zset: { table: { value: "สมาชิก", score: "คะแนน" } }, stream: { table: { timestamp: "รหัสการประทับเวลา", field: "สนาม", value: "ความคุ้มค่า" } } }, treeControls: { settings: "การตั้งค่าต้นไม้", expandAll: "ขยายทั้งหมด", collapseAll: "ยุบทั้งหมด", search: { search: "ค้นหาในคีย์", clear: "ล้างการค้นหาปัจจุบันเพื่อตั้งค่าว่าง", placeholderClient: "ค้นหาฝั่งไคลเอ็นต์", placeholderServer: "ค้นหาฝั่งเซิร์ฟเวอร์", info: "การค้นหาฝั่งไคลเอ็นต์หมายความว่าตรงกับข้อความในการป้อนข้อมูลการค้นหา การค้นหาฝั่งเซิร์ฟเวอร์หมายความว่าเหมือนกับการค้นหาในรูปแบบคีย์เป็น *{search-text}* สำหรับชุดการค้นหาขนาดใหญ่ ควรใช้การค้นหาฝั่งเซิร์ฟเวอร์จะดีกว่า สำหรับชุดการค้นหาที่มีขนาดเล็ก ควรใช้โหมดการค้นหาฝั่งไคลเอ็นต์จะดีกว่า" + ` หากนับคีย์หมด ${p3xr.settings.maxLightKeysCount}คุณสามารถค้นหาได้เฉพาะฝั่งเซิร์ฟเวอร์เท่านั้น`, largeSetInfo: "ในชุดใหญ่ การค้นหาฝั่งไคลเอ็นต์จะถูกปิดใช้งาน ดังนั้นตอนนี้ทำได้เฉพาะการค้นหาฝั่งเซิร์ฟเวอร์เท่านั้น", infoDetails: "หากต้องการทราบว่าการค้นหาทำงานอย่างไร โปรดตรวจสอบการตั้งค่า" }, pager: { next: "ถัดไป", prev: "ก่อนหน้า", first: "อันดับแรก", last: "สุดท้าย" } } }, time: { loading: "กำลังโหลด...", years: "ปี", months: "เดือน", days: "วัน", year: "ปี", month: "เดือน", day: "วัน" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/tr/000077500000000000000000000000001517666434100140005ustar00rootroot00000000000000src/strings/tr/strings.js000066400000000000000000000701571517666434100160410ustar00rootroot00000000000000const strings = { error: { cleared_license: "Lisans temizlendi", invalid_license: "Geçersiz lisans", license_max_devices_reached: "Maksimum cihaz kotasına ulaşıldı", license_readonly: "Lisans yalnızca sunucu terminalinden değiştirilebilir.", server_error: "Sunucu hatası, lütfen tekrar deneyin" }, title: { donate: "Bağış Yap", jsonRecursive: "Tüm yapraklar genişletiliyor", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Sol alt menüden bağlanmak için bir Redis bağlantısı seçebilirsiniz.", statistics: "İstatistikler", error: "Hata", connectingRedis: "Redis'e bağlanılıyor ...", socketioConnectError: "Socket.IO Hatası", db: "DB", server: "Sunucu", clients: "İstemciler", memory: "Bellek", persistence: "Kalıcılık", stats: "İstatistikler", replication: "Replikasyon", cpu: "CPU", cluster: "Cluster", modules: "Modüller", errorstats: "Hata İstatistikleri", commandstats: "Komut İstatistikleri", latencystats: "Gecikme İstatistikleri", keysizes: "Anahtar Boyutları", threads: "İş Parçacıkları", }, confirm: { dropIndex: "Bu indeksi silmek istediğinizden emin misiniz?", uploadBuffer: "Bu ikili veriyi yüklemek istediğinizden emin misiniz?", uploadBufferDone: "İkili veri yüklendi", uploadBufferDoneAndSave: "İkili veri yüklendi ve sunucuya kaydedildi", title: "Onayla", alert: "Uyarı", info: "Bilgi", deleteListItem: "Bu liste öğesini silmek istediğinizden emin misiniz?", deleteHashKey: "Bu hash anahtarını silmek istediğinizden emin misiniz?", deleteStreamTimestamp: "Bu stream zaman damgasını silmek istediğinizden emin misiniz?", deleteSetMember: "Bu küme üyesini silmek istediğinizden emin misiniz?", deleteZSetMember: "Bu sıralı küme üyesini silmek istediğinizden emin misiniz?", deleteConnection: "Onayla", deleteConnectionText: "Bu Redis bağlantısını silmek istediğinizden emin misiniz?", deleteNode: "Bu Redis düğümünü silmek istediğinizden emin misiniz?", deleteAllKeys: opts => { return `Bu ağacı ve tüm anahtarlarını silmek istiyor musunuz (${opts.key})?`; }, socketioConnectError: "Socket.IO sunucuya bağlanamıyor, yeniden yükleyip bağlantı hatasını kendiniz çözmeyi deneyebilirsiniz, istemci bunu kendi başına nasıl çözeceğini bilmiyor.", socketioAuthRequired: "Socket.IO yetkilendirmesi gerekli. Lütfen HTTP Basic Auth (kullanıcı adı/şifre) ile kimlik doğrulaması yapın ve yeniden yükleyin.", deleteKey: "Bu anahtarı silmek istediğinizden emin misiniz?", rename: { title: "Bu anahtarı yeniden adlandırmak istediğinizden emin misiniz?", textContent: "Bu işlem anahtarı kalıcı olarak yeniden adlandırır.", placeholder: "Redis anahtarı (zorunlu)" }, ttl: { title: "Bu anahtarın TTL değerini değiştirmek istediğinizden emin misiniz?", textContent: "TTL'yi değiştirmek bu anahtarın yaşam süresini günceller. Anahtarı kalıcı tutmak için boş bırakın.", placeholder: "Redis anahtarının TTL değeri (tamsayı veya boş)", placeholderPlaceholder: "Boş, kalıcı olduğu anlamına gelir; aksi takdirde bir tamsayı girin.", convertTextToTime: "Metni zamana dönüştür", convertTextToTimePlaceholder: "Örn. 1d, 86400 olacaktır" }, license: { title: "Lisans ayarla", textContent: "Ücretli özellikleri kullanmak istiyorsanız, lisans talep etmek için support@corifeus.com adresine başvurun. Fiyatlandırma Pro ayda 400 HUF (ayda €1) veya yılda 4.000 HUF (yılda €10) ve Enterprise ayda 1.200 HUF (ayda €3) veya yılda 12.000 HUF (yılda €30). Yıllık fiyat aylığın 10 katıdır. %27 KDV ile toplamlar Pro ayda 500 HUF (ayda €1,27) veya yılda 5.100 HUF (yılda €12,70), Enterprise ayda 1.500 HUF (ayda €3,81) veya yılda 15.200 HUF (yılda €38,10). Lisans doğrulaması internet erişimi gerektirir. Varsayılan lisans 5 koltuk içerir. Daha fazla koltuğa ihtiyacınız varsa support@corifeus.com adresinden bize ulaşın.", placeholder: "Lisans anahtarı" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Kopyala", downloadBuffer: "İkili indir", setBuffer: "İkili yükle", exportKeys: "Anahtarları dışa aktar", exportAllKeys: (opts) => `Tüm ${opts.count} anahtarı dışa aktar`, exportSearchResults: (opts) => `${opts.count} sonucu dışa aktar`, importKeys: "Anahtarları içe aktar", saveWithFormatJson: "Biçimle kaydet", formatJson: "Json Biçimle", wrap: "Kaydır", unwrap: "Kaydırma", downloadJson: "JSON indir", pubsubMonitor: "PubSub İzleyici", language: "Dil / Language", ok: "Tamam", addKey: "Bu anahtara ekle", addKeyRoot: "Kök anahtar ekle", reloadKey: "Anahtarı yeniden yükle", reload: "Yeniden yükle", close: "Kapat", commands: "Komutlar", view: "Görünüm", statistics: "İstatistikler", refresh: "Yenile", pause: "Duraklat", resume: "Devam et", clear: "Temizle", rename: "Yeniden adlandır", main: "Veritabanı", cancel: "İptal", theme: "Tema", github: "GitHub", githubRepo: "Depo", githubRelease: "Sürümler", githubChangelog: "Değişiklik günlüğü", info: "Info", settings: "Ayarlar", connect: "Bağlan", disconnect: "Bağlantıyı kes", overview: "Genel Bakış", console: "Konsol", noConnections: "Bağlantı yok, ayarlar menüsünden bir bağlantı ekleyin.", noConnectionsInSettings: "Bağlantı yok, yukarıdan YENİ BAĞLANTI ekleyebilirsiniz.", connectionAdd: "Yeni bağlantı", addGroup: "Grup ekle", extend: "Genişlet", collapse: "Daralt", add: "Ekle", edit: "Düzenle", save: "Kaydet", ttl: "TTL Ayarla", license: "Lisans ayarla", delete: "Sil", remove: "Kaldır", sure: "Emin", testConnection: "Bağlantıyı test et", getKey: "Redis anahtarı ve ilgili veriler yükleniyor ...", jsonViewShow: "JSON Görüntüle", jsonViewEditor: "JSON Düzenle", quickConsole: "Hızlı Konsol" }, label: { id: { nodeId: 'Düğüm ID', id: "Bağlantı ID", info: "sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa özelliklerini değiştirmek istemiyorsanız, değerleri korumak için bu özelliklere bağlantı ID'sini girin. Aynı mantığı düğüm şifresi için istiyorsanız, düğüm şifresine düğüm ID'sini girin." }, secureFeature: 'P3X ile başlayan ve aynı görünen bir değer görüyorsanız, bu bir güvenlik özelliğidir. Ayarları değiştirmek için bunları boş veya başka bir şeyle değiştirin, kaydedilecektir. Ayarları değiştirmezseniz sunucudaki haliyle korunacaktır.', ssh: { on: 'SSH açık', off: 'SSH kapalı', sshHost: 'SSH Ana Bilgisayar', sshPort: 'SSH port', sshUsername: 'SSH kullanıcı adı', sshPassword: 'SSH şifre', sshPrivateKey: 'SSH özel anahtar' }, isBuffer: opts => `[object ArrayBuffer] değerin ikili veri olduğu veya değerin ${opts.maxValueAsBuffer} değerinden büyük olduğu anlamına gelir`, streamValue: `Stream alanı ve değeri tek satırdır. Örn.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' otomatik oluşturulmuş anlamına gelir veya - biçiminde belirtim`, unableToLoadKey: ({ key }) => { return `Bu anahtar yüklenemiyor: ${key}. Muhtemelen anahtar silinmiş. Tam hata konsolda görünür.`; }, bigJson: "Bu JSON nesnesi 10 kb'den büyük, bu yüzden ne yaptığınızı bildiğinizden emin olun, çünkü bazı işlevler yavaş render edebilir.", addNode: "Düğüm ekle", validateJson: "JSON Doğrula", reducedFunction: `Azaltılmış işlevsellik`, tooManyKeys: opts => { return `Tam işlevsellik için izin verilen maksimum anahtar sayısı ${opts.maxLightKeysCount}. Bu veritabanında toplam ${opts.count} izin verilen üzerinde anahtar var. Anahtar sıralama ve ek ağaç bilgisi devre dışı bırakıldı. Arama istemci araması yerine yalnızca sunucuda yapılıyor.`; }, redisCommandNotFound: "Eşleşen Redis komutu bulunamadı ...", treeKeyStore: `Sıralama (doğal karşılaştırma) istemcide yani tarayıcıda yapılır, bu da 10k üzerinde anahtar gibi büyük veri kümeleri için bir performans maliyeti olduğu anlamına gelir, sayfa oluşturmaya biraz zaman ekleyebilir. Redis'te anahtar sıralaması yoktur, yalnızca bu şekilde yapılır.`, socketIoTimeout: options => { return `Bu istek için Socket.IO zaman aşımına uğradı (maks ${options.timeout / 1000} saniye) ...`; }, resizerInfo: options => { return `Sol veya sağ panel minimum genişliği ${options.width}px`; }, jsonViewNotParsable: "Bu değer JSON olarak ayrıştırılamaz ", ttlTitle: "TTL'yi saniye olarak ayarlayın", passwordSecure: "Şifre boş olabilir, ancak yine de karakterler gösterecektir, bu bir güvenlik özelliğidir.", tlsWithoutCert: "Ek sertifika olmadan TLS'yi etkinleştir", tlsRejectUnauthorized: "Yetkisiz sertifikayı reddet", tlsSecure: "P3X ile başlayan bir TLS yapılandırması görüyorsanız veya tüm TLS ayarları aynı görünüyorsa, bu bir güvenlik özelliğidir. Ayarları değiştirmek için bunları boş veya başka bir şeyle değiştirin, kaydedilecektir. TLS ayarlarını değiştirmezseniz sunucudaki haliyle korunacaktır.", treeSeparatorEmpty: "Ağaç ayırıcısı boşsa, ağaçta iç içe düğümler olmaz, sadece düz bir liste olur", treeSeparatorEmptyNote: "İç içe düğüm yok, sadece düz bir liste", welcomeConsole: "Redis Konsoluna Hoş Geldiniz", welcomeConsoleInfo: "İmleç YUKARI veya AŞAĞI geçmişi etkindir", redisListIndexInfo: "Sona eklemek için boş bırakın, başa eklemek için -1 veya gösterilen konuma kaydedin.", console: "Konsol", connectiondAdd: "Bağlantı ekle", connectiondEdit: "Bağlantı düzenle", connectiondView: "Bağlantı görüntüle", connections: "Bağlantılar", licenseInfo: "Lisans", licenseEditable: "Lisans düzenlenebilir", licenseEditableYes: "Evet", licenseEditableNo: "Hayır", licenseTerminalOnly: "Lisans yalnızca sunucu terminalinden yapılandırılabilir.", licenseTierPolicyTitle: "Katman politikası", licenseTierPolicyText: "

Ücretsiz

Yalnızca temel Redis UI; SSH tüneli yok, Salt okunur bağlantı modu yok, Cluster/Sentinel yok, JSON Düzenleme/İkili Yükleme/İkili İndirme yok, ReJSON yok.
Fiyat: 0 HUF/ay (€0/ay).

Pro

SSH tüneli, Salt okunur bağlantı modu (--readonly-connections/-r dahil), JSON Düzenleme, İkili Yükleme, İkili İndirme, ReJSON.
Taban fiyat: 400 HUF/ay (€1/ay) veya 4.000 HUF/yıl (€10/yıl).
%27 KDV ile toplam: 500 HUF/ay (€1,27/ay) veya 5.100 HUF/yıl (€12,70/yıl).

Enterprise

SSH tüneli, Cluster ve Sentinel, artı JSON Düzenleme, İkili Yükleme, İkili İndirme, ReJSON; --readonly-connections/-r de çalışır.
Taban fiyat: 1.200 HUF/ay (€3/ay) veya 12.000 HUF/yıl (€30/yıl).
%27 KDV ile toplam: 1.500 HUF/ay (€3,81/ay) veya 15.200 HUF/yıl (€38,10/yıl).

Yıllık kural

Yıllık fiyat aylık fiyatın 10 katıdır.

Koltuklar

Varsayılan lisans 5 koltuk içerir. Daha fazla koltuğa ihtiyacınız varsa support@corifeus.com adresinden bize ulaşın.

Enterprise deneme

Gerçek mevcut bir e-posta adresine sahip herkes için 10 gün ücretsiz (test e-postası değil).

E-posta ile fatura bilgisi

Ad, Fatura e-postası, Ülke kodu, Posta kodu, Şehir, Adres, KDV numarası (isteğe bağlı).

Ödeme

PayPal ödemesi yalnızca HUF (forint) ile yapılabilir; parayı @ https://paypal.me/corifeus adresine gönderdikten sonra size bir fatura göndereceğim. Tüm ödemeler iade edilemez.

KDV

KDV fiyata eklenir (Macaristan'da %27).

İletişim

Merhaba demek veya bir sorunuz varsa support@corifeus.com ile iletişime geçin.

Dil

Fatura ve lisans e-posta iletişimi İngilizcedir. Fatura para birimi HUF'tur.

Not

Lisans doğrulaması internet erişimi gerektirir.", licenseState: "Durum", licenseStateActive: "Aktif", licenseStateInactive: "Pasif", licenseStateNoLicense: "Lisans yok", licenseKeyMasked: "Kayıtlı anahtar", licenseTier: "Katman", licenseValid: "Geçerli", licenseStatus: "Lisans durumu", licenseReason: "Sebep", licenseCheckedAt: "Kontrol tarihi", licenseStartsAt: "Başlangıç", licenseExpiresAt: "Bitiş", licenseDaysLeft: "Kalan gün", licenseMaxDevices: "Maks cihaz", licenseActiveDevices: "Aktif cihazlar", licenseActiveDevicesInfo: "Bir cihaz artık kullanılmıyorsa, koltuğu 75 dakika sonra otomatik olarak serbest bırakılır.", licenseCustomerEmail: "Müşteri e-postası", licenseFeatures: "Özellikler", licenseFeaturesEmpty: "Ek özellik yok", licenseFeatureReadonlyMode: "Salt okunur bağlantı modu", licenseFeatureReadonlyConnectionsFlag: "Salt okunur bağlantılar (--readonly-connections/-r)", licenseFeatureSsh: "SSH tüneli", licenseFeatureCluster: "Cluster bağlantıları", licenseFeatureSentinel: "Sentinel bağlantıları", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Anahtar sıralama açık", off: "Anahtar sıralama kapalı" }, cluster: { on: "Cluster açık", off: "Cluster kapalı" }, sentinel: { on: "Sentinel açık", off: "Sentinel kapalı", name: "Sentinel adı" }, readonly: { on: "Salt okunur açık", off: "Salt okunur kapalı" }, proSshOnly: "SSH, Pro veya Enterprise sürümünde kullanılabilir.", proReadonlyOnly: "Salt okunur bağlantı modu, Pro veya Enterprise sürümünde kullanılabilir.", enterpriseClusterSentinelOnly: "Cluster ve Sentinel yalnızca Enterprise sürümünde kullanılabilir.", theme: { light: "Açık", dark: "Koyu enterprise", darkNeu: "Koyu", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Bağlandı: ${opts.name}`; }, tree: "Ağaç", askAuth: "Yetkilendirme iste", keyboardShortcuts: "Klavye kısayolları", about: "Hakkında", supportedLanguages: "Desteklenen diller", version: "Sürüm", redisVersion: "Redis sürümü", modules: "Modüller", shortcutRefresh: "Yenile", shortcutSearch: "Aramaya odaklan", shortcutNewKey: "Yeni anahtar", shortcutDisconnect: "Bağlantıyı kes", themeAuto: "Otomatik (sistem)", shortcutCommandPalette: "Komut paleti", commandPalette: "Komut paleti", noResults: "Sonuç yok", redisCommandsReference: "Redis Komutları", ungrouped: "Grupsuz", grouped: "Gruplanmış", connectFirst: "Önce bir Redis sunucusuna bağlanın", searchLanguage: "Dil ara...", exportProgress: "Anahtarlar dışa aktarılıyor...", importProgress: "Anahtarlar içe aktarılıyor...", importPreview: "Önizleme", importOverwrite: "Üzerine yaz", importSkip: "Atla", importConflict: "Anahtar zaten varsa:", noKeysToExport: "Dışa aktarılacak anahtar yok", time: "Zaman", loading: "Yükleniyor...", autoRefresh: "Otomatik", exportSearchHint: "Yalnızca mevcut aramayla eşleşen anahtarlar dışa aktarılıyor", importSearchHint: "İçe aktarma yalnızca arama sonuçlarına değil, tüm veritabanına uygulanır", importNoKeys: "Dosyada anahtar bulunamadı", }, status: { dataCopied: "Veri panoya kopyalandı", licenseSaved: "Lisans kaydedildi", exportDone: "Dışa aktarma tamamlandı", indexCreated: "İndeks oluşturuldu", indexDropped: "İndeks silindi", importDone: (opts) => `İçe aktarma tamamlandı: ${opts.created} oluşturuldu, ${opts.skipped} atlandı, ${opts.errors} hata`, nodeRemoved: "Düğüm kaldırıldı", keyIsNotExisting: "Bu anahtar silinmiş veya süresi dolmuş olabilir.", keyCount: opts => { if (opts.keyCount === 0) { return "Anahtar yok"; } else if (opts.keyCount === 1) { return "1 anahtar"; } else { return `${opts.keyCount} anahtar`; } }, treeExpandAll: "Tüm ağaç yapraklarını genişlet. Bu işlem maliyetli olabilir ve zaman alabilir ...", noRedisKeys: "Bu veritabanında anahtar bulunmuyor.", redisConnected: "Redis bağlantısı başarılı", reloadingDataInfo: "Redis veri bilgisi yeniden yükleniyor", added: "Eklendi", saved: "Güncellendi", cancelled: "İptal edildi", deleted: "Silindi", savedRedis: "Redis verisi kaydedildi", redisDisconnected: opts => { return `Mevcut bağlantıda bir hata oluştu: ${opts.error.message}`; }, dbChanged: opts => { return `DB indeksi ${opts.db} olarak ayarlandı. `; }, treeDeleted: opts => { return `Ağaç anahtarı silindi (${opts.key}).`; }, deletedKey: opts => { return `Anahtar silindi (${opts.key}).`; }, renamedKey: "Bu anahtar yeniden adlandırıldı", ttlChanged: "Bu anahtarın TTL değeri değiştirildi", notInteger: "Bu girdi bir tamsayı değil", persisted: "Bu anahtar kalıcı olarak saklanıyor", set: "Anahtar ayarlandı/eklendi" }, code: { "delete-connection": "Bu bağlantı silindi, bu yüzden bu Redis örneğinden bağlantınız kesildi.", "save-connection": "Bu bağlantı değiştirildi, bu yüzden bu Redis örneğinden bağlantınız kesildi. Yeniden bağlanabilirsiniz.", "readonly-connections": "Bağlantı ekleme/kaydetme/silme yalnızca salt okunurdur!", "readonly-connection-mode": "Bu bağlantı salt okunur modda!", "list-out-of-bounds": "Bu liste indeksi sınır dışında", "donation-ware-feature": "Bu özellik bağış sürümünde mevcuttur.", "feature-pro-readonly-required": "Salt okunur bağlantı modu Pro veya Enterprise lisansı gerektirir.", "feature-pro-ssh-required": "SSH tüneli Pro veya Enterprise lisansı gerektirir.", "feature-enterprise-cluster-sentinel-required": "Cluster ve Sentinel, Enterprise lisansı gerektirir.", "feature-pro-json-binary-required": "JSON Düzenleme, İkili Yükleme ve İkili İndirme Pro veya Enterprise lisansı gerektirir.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Yetkilendirme gerekli: lütfen HTTP Basic Auth ile kimlik doğrulaması yapın ve yeniden yükleyin.", "auto-connection-failed": "Muhtemelen bağlantı kaldırıldı ve bu nedenle otomatik bağlantı başarısız oldu.", invalid_console_command: "Bu komut GUI üzerinden çalışmıyor." }, licenseReason: { LICENSE_VALID: "Lisans geçerli", LICENSE_INVALID: "Lisans geçersiz", LICENSE_MISSING: "Lisans anahtarı ayarlanmamış", LICENSE_DISABLED: "Lisans sunucu yapılandırmasında devre dışı bırakıldı", LICENSE_NOT_FOUND: "Lisans bulunamadı", LICENSE_EXPIRED: "Lisansın süresi doldu", LICENSE_CLEARED: "Lisans anahtarı temizlendi", LICENSE_MAX_DEVICES_REACHED: "Maksimum cihaz kotasına ulaşıldı", PRODUCT_MISMATCH: "Lisans ürünü eşleşmiyor" }, licenseStatusValue: { active: "Aktif", deleted: "Silindi", all: "Tümü", expired: "Süresi doldu", missing: "Eksik", inactive: "Pasif" }, form: { error: { required: "Zorunlu", port: "Port 1-65535 arasında olmalıdır", invalid: "Form geçersiz" }, connection: { label: { name: "Ad", group: "Grup", host: "Ana bilgisayar adı", port: "Port", password: "Şifre", username: "Kullanıcı adı" } }, treeSettings: { maxValueDisplay: "Maksimum değer görüntüleme uzunluğu", maxValueDisplayInfo: "0 olarak ayarlanırsa tam değerleri gösterir. 0'dan büyükse bu uzunluğa kısaltır. -1 ise: dizeler için düzenlemeye kadar değeri gizler; diğer türler için tam içeriği gösterir.", maxKeys: "Maksimum anahtar sayısı", maxKeysInfo: "GUI'nin çökmemesi için maksimum anahtar sayısını sınırlıyoruz.", keyCount: () => { return `Anahtar sayısı: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Animasyon kullan", noAnimation: "Animasyon yok", jsonFormatTwoSpace: "JSON'u 2 boşlukla biçimle", jsonFormatFourSpace: "JSON'u 4 boşlukla biçimle", formName: "Redis ayarları", searchModeClient: "İstemci arama modu", searchModeServer: "Sunucu arama modu", searchModeStartsWith: "İle başlayan modda ara", searchModeIncludes: "İçeren modda ara" }, field: { treeSeparator: "Ağaç ayırıcısı", treeSeparatorSelector: "Ağaç ayırıcı seçici", page: "Ağaç sayfalama sayısı", keyPageCount: "Anahtar sayfalama sayısı", keysSort: "Anahtarları sırala", searchMode: "Arama modu", searchModeStartsWith: "İle başlayan / içeren arama" }, error: { keyPageCount: "Anahtar sayfa sayısı 5 - 100 arasında bir tamsayı olmalıdır", page: "Sayfa sayısı 10 - 5000 arasında bir tamsayı olmalıdır", maxValueDisplay: "Maksimum görüntüleme değeri -1 ile 32768 arasında bir tamsayı olmalıdır", maxKeys: "Maksimum anahtar sayısı değeri 100 ile 100000 arasında bir tamsayı olmalıdır" } }, key: { label: { formName: { add: "Yeni Redis anahtarı ekle", edit: "Redis anahtarını düzenle", append: "Mevcut Redis anahtarına ekle" } }, field: { streamTimestamp: "Zaman damgası", key: "Anahtar", type: "Tür", index: "İndeks", hashKey: "Hash anahtarı", score: "Puan", value: "Değer" }, error: { streamTimestamp: "Zaman damgası gereklidir, Redis formatında veya * olarak", key: "Anahtar en az bir karakter olmalıdır", hashKey: "Hash tablosu anahtarı en az bir karakter olmalıdır", score: "Sıralı küme puanı gereklidir", value: "Değer gereklidir" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Arama", index: "İndeks", query: "Sorgu", results: "Sonuçlar", noIndex: "İndeks bulunamadı", createIndex: "İndeks oluştur", dropIndex: "İndeksi sil", indexInfo: "İndeks bilgisi", indexName: "İndeks adı", prefix: "Anahtar ön eki (isteğe bağlı)", fieldName: "Alan adı", }, monitor: { title: "İzleme", memory: "Bellek", opsPerSec: "İşlem/sn", clients: "İstemciler", blocked: "Engellenen", hitsMisses: "İsabet oranı", networkIo: "Ağ I/O", slowLog: "Yavaş günlük", totalCommands: "Toplam", expired: "Süresi dolan", evicted: "Çıkarılan", clientList: "İstemci listesi", topKeys: "Belleğe göre en büyük anahtarlar", killClient: "İstemciyi sonlandır", clientKilled: "İstemci sonlandırıldı", confirmKillClient: "Bu istemciyi sonlandırmak istediğinizden emin misiniz?", noKeys: "Anahtar yok", noClients: "İstemci yok", }, overview: { noConnected: "Redis'e bağlantı yok.", overviewClients: "Bağlı olanları istemci sayısına göre listele", connectedCount: opt => { if (opt.length === 1) { return "1 istemci"; } return `${opt.length} istemci`; } }, key: { label: { key: "Anahtar", encoding: "Kodlama", length: "Boyut", ttl: "TTL", ttlTitle: "Yaşam Süresi", type: "Tür", ttlNotExpire: "süresi dolmaz", lengthString: "bayt", lengthItem: "öğe", actions: "İşlemler" }, list: { table: { index: "İndeks", value: "Değer" } }, hash: { table: { hashkey: "Hash anahtarı", value: "Değer" } }, set: { table: { value: "Üye" } }, zset: { table: { value: "Üye", score: "Puan" } }, stream: { table: { timestamp: "Zaman damgası ID", field: "Alan", value: "Değer" } } }, treeControls: { settings: "Ağaç ayarları", expandAll: "Tümünü genişlet", collapseAll: "Tümünü daralt", search: { search: "Anahtarlarda ara", clear: "Mevcut aramayı temizle", placeholderClient: "İstemci tarafında ara", placeholderServer: "Sunucu tarafında ara", info: "İstemci tarafı araması, arama girişindeki metni eşleştirmek anlamına gelir. Sunucu tarafı araması, anahtar kalıplarında *{arama-metni}* gibi arama yapmak anlamına gelir. Büyük arama kümeleri için sunucu tarafı araması kullanmak daha iyidir. Küçük arama kümeleri için istemci tarafı arama modu kullanmak daha iyidir." + ` Anahtar sayısı ${p3xr.settings.maxLightKeysCount} üzerindeyse yalnızca sunucu tarafında arama yapabilirsiniz.`, largeSetInfo: "Büyük bir veri kümesinde istemci tarafı araması devre dışıdır, şu anda yalnızca sunucu tarafı araması yapılabilir.", infoDetails: "Aramanın nasıl çalıştığını öğrenmek için lütfen ayarları kontrol edin" }, pager: { next: "Sonraki", prev: "Önceki", first: "İlk", last: "Son" } } }, time: { loading: "Yükleniyor...", years: "yıl", months: "ay", days: "gün", year: "yıl", month: "ay", day: "gün" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/uk/000077500000000000000000000000001517666434100137725ustar00rootroot00000000000000src/strings/uk/strings.js000066400000000000000000001137401517666434100160270ustar00rootroot00000000000000const strings = { error: { cleared_license: "Ліцензію очищено", invalid_license: "Недійсна ліцензія", license_max_devices_reached: "Досягнуто максимальну кількість місць для пристроїв", license_readonly: "Ліцензію можна змінити лише з термінала сервера.", server_error: "Помилка сервера, будь ласка, спробуйте ще раз" }, title: { donate: "Пожертвувати", jsonRecursive: "Розгортання всіх гілок", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Ви можете вибрати Redis-з'єднання для підключення з меню внизу зліва.", statistics: "Статистика", error: "Помилка", connectingRedis: "Підключення до Redis ...", socketioConnectError: "Помилка Socket.IO", db: "DB", server: "Сервер", clients: "Клієнти", memory: "Пам'ять", persistence: "Збереження", stats: "Статистика", replication: "Реплікація", cpu: "CPU", cluster: "Cluster", modules: "Модулі", errorstats: "Статистика помилок", commandstats: "Статистика команд", latencystats: "Статистика затримок", keysizes: "Розміри ключів", threads: "Потоки", }, confirm: { dropIndex: "Ви впевнені, що хочете видалити цей індекс?", uploadBuffer: "Ви впевнені, що хочете завантажити ці бінарні дані?", uploadBufferDone: "Бінарні дані завантажено", uploadBufferDoneAndSave: "Бінарні дані завантажено та збережено на сервері", title: "Підтвердити", alert: "Попередження", info: "Інформація", deleteListItem: "Ви впевнені, що хочете видалити цей елемент списку?", deleteHashKey: "Ви впевнені, що хочете видалити цей хеш-ключ?", deleteStreamTimestamp: "Ви впевнені, що хочете видалити цю мітку часу потоку?", deleteSetMember: "Ви впевнені, що хочете видалити цього члена множини?", deleteZSetMember: "Ви впевнені, що хочете видалити цього члена впорядкованої множини?", deleteConnection: "Підтвердити", deleteConnectionText: "Ви впевнені, що хочете видалити це Redis-з'єднання?", deleteNode: "Ви впевнені, що хочете видалити цей Redis-вузол?", deleteAllKeys: opts => { return `Видалити це дерево та всі його ключі (${opts.key})?`; }, socketioConnectError: "Socket.IO не може підключитися до сервера, ви можете перезавантажити та спробувати вирішити помилку підключення самостійно, клієнт не знає, як її вирішити.", socketioAuthRequired: "Потрібна авторизація Socket.IO. Будь ласка, автентифікуйтесь за допомогою HTTP Basic Auth (ім'я користувача/пароль) та перезавантажте.", deleteKey: "Ви впевнені, що хочете видалити цей ключ?", rename: { title: "Ви впевнені, що хочете перейменувати цей ключ?", textContent: "Ця дія перейменовує ключ назавжди.", placeholder: "Redis-ключ (обов'язковий)" }, ttl: { title: "Ви впевнені, що хочете змінити TTL цього ключа?", textContent: "Зміна TTL оновлює час життя цього ключа. Залиште порожнім, щоб зберегти ключ назавжди.", placeholder: "TTL Redis-ключа (ціле число або порожнє)", placeholderPlaceholder: "Порожнє означає, що він зберігається назавжди; інакше введіть ціле число.", convertTextToTime: "Конвертувати текст у час", convertTextToTimePlaceholder: "Напр. 1d буде 86400" }, license: { title: "Встановити ліцензію", textContent: "Якщо ви хочете використовувати платні функції, зверніться на support@corifeus.com для запиту ліцензії. Ціна Pro 400 HUF/місяць (€1/місяць) або 4 000 HUF/рік (€10/рік), та Enterprise 1 200 HUF/місяць (€3/місяць) або 12 000 HUF/рік (€30/рік). Річна ціна в 10 разів більша за місячну. З 27% ПДВ підсумки: Pro 500 HUF/місяць (€1,27/місяць) або 5 100 HUF/рік (€12,70/рік), Enterprise 1 500 HUF/місяць (€3,81/місяць) або 15 200 HUF/рік (€38,10/рік). Перевірка ліцензії потребує доступу до інтернету. Стандартна ліцензія включає 5 місць. Якщо потрібно більше місць, зверніться до нас на support@corifeus.com.", placeholder: "Ліцензійний ключ" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Копіювати", downloadBuffer: "Завантажити бінарний файл", setBuffer: "Вивантажити бінарний файл", exportKeys: "Експорт ключів", exportAllKeys: (opts) => `Експорт усіх ${opts.count} ключів`, exportSearchResults: (opts) => `Експорт ${opts.count} результатів`, importKeys: "Імпорт ключів", saveWithFormatJson: "Зберегти з форматуванням", formatJson: "Форматувати Json", wrap: "Перенос", unwrap: "Без переносу", downloadJson: "Завантажити JSON", pubsubMonitor: "PubSub-монітор", language: "Мова / Language", ok: "OK", addKey: "Додати до цього ключа", addKeyRoot: "Додати кореневий ключ", reloadKey: "Перезавантажити ключ", reload: "Перезавантажити", close: "Закрити", commands: "Команди", view: "Вигляд", statistics: "Статистика", refresh: "Оновити", pause: "Пауза", resume: "Продовжити", clear: "Очистити", rename: "Перейменувати", main: "База даних", cancel: "Скасувати", theme: "Тема", github: "GitHub", githubRepo: "Репозиторій", githubRelease: "Релізи", githubChangelog: "Журнал змін", info: "Info", settings: "Налаштування", connect: "Підключити", disconnect: "Відключити", overview: "Огляд", console: "Консоль", noConnections: "Немає з'єднань, додайте з'єднання в меню налаштувань.", noConnectionsInSettings: "Немає з'єднань, ви можете додати НОВЕ З'ЄДНАННЯ вище.", connectionAdd: "Нове з'єднання", addGroup: "Додати групу", extend: "Розгорнути", collapse: "Згорнути", add: "Додати", edit: "Редагувати", save: "Зберегти", ttl: "Встановити TTL", license: "Встановити ліцензію", delete: "Видалити", remove: "Вилучити", sure: "Впевнені", testConnection: "Тестувати з'єднання", getKey: "Завантаження Redis-ключа та пов'язаних даних ...", jsonViewShow: "Показати JSON", jsonViewEditor: "Редагувати JSON", quickConsole: "Швидка консоль" }, label: { id: { nodeId: 'ID вузла', id: "ID з'єднання", info: "Якщо ви не хочете змінювати властивості: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, введіть ID з'єднання в ці властивості, щоб зберегти значення. Якщо ви хочете такої ж логіки для пароля вузла, введіть ID вузла в поле пароля вузла." }, secureFeature: 'Якщо ви бачите значення, яке починається з P3X і виглядає однаково, це функція безпеки. Щоб змінити налаштування, замініть їх порожніми або чимось іншим, і вони будуть збережені. Якщо ви не зміните налаштування, вони залишаться такими, як є на сервері.', ssh: { on: 'SSH увімкнено', off: 'SSH вимкнено', sshHost: 'SSH-хост', sshPort: 'SSH-порт', sshUsername: "SSH ім'я користувача", sshPassword: 'SSH-пароль', sshPrivateKey: 'SSH приватний ключ' }, isBuffer: opts => `[object ArrayBuffer] означає, що значення є бінарними даними або значення більше ніж ${opts.maxValueAsBuffer}`, streamValue: `Поле та значення Stream записуються в один рядок. Напр.: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' означає автоматично згенероване або специфікація як <мілісекундиЧасу>-<номерПослідовності>`, unableToLoadKey: ({ key }) => { return `Неможливо завантажити цей ключ: ${key}. Можливо, ключ було видалено. Точна помилка знаходиться в консолі.`; }, bigJson: "Цей JSON-об'єкт більше 10 кб, тому переконайтесь, що ви знаєте, що робите, оскільки деякі функції можуть повільно відображатися.", addNode: "Додати вузол", validateJson: "Перевірити JSON", reducedFunction: `Обмежена функціональність`, tooManyKeys: opts => { return `Максимальна кількість ключів для повної функціональності — ${opts.maxLightKeysCount}. У цій базі даних ключів більше ніж дозволено: ${opts.count}. Сортування ключів та додаткова інформація дерева вимкнені. Пошук здійснюється лише на сервері, а не на клієнті.`; }, redisCommandNotFound: "Відповідну команду Redis не знайдено ...", treeKeyStore: `Сортування (природне порівняння) виконується на клієнті, тобто в браузері, що означає штраф продуктивності для великих наборів, наприклад понад 10 тис. ключів, це може додати трохи часу до рендерингу сторінки. У Redis немає сортування ключів, тільки таким чином.`, socketIoTimeout: options => { return `Час очікування Socket.IO для цього запиту вичерпано (макс. ${options.timeout / 1000} секунд) ...`; }, resizerInfo: options => { return `Мінімальна ширина лівої або правої панелі — ${options.width}px`; }, jsonViewNotParsable: "Це значення не може бути розпізнане як JSON ", ttlTitle: "Встановіть TTL у секундах", passwordSecure: "Пароль може бути порожнім, але все одно відображатиме символи, це функція безпеки.", tlsWithoutCert: "Увімкнути TLS без додаткового сертифіката", tlsRejectUnauthorized: "Відхилити неавторизований сертифікат", tlsSecure: "Якщо ви бачите конфігурацію TLS, яка починається з P3X, або всі налаштування TLS виглядають однаково, це функція безпеки. Щоб змінити налаштування, замініть їх порожніми або чимось іншим, і вони будуть збережені. Якщо ви не зміните налаштування TLS, вони залишаться такими, як є на сервері.", treeSeparatorEmpty: "Якщо роздільник дерева порожній, дерево не матиме вкладених вузлів, лише простий список", treeSeparatorEmptyNote: "Немає вкладених вузлів, лише простий список", welcomeConsole: "Ласкаво просимо до консолі Redis", welcomeConsoleInfo: "Історія курсором ВГОРУ або ВНИЗ увімкнена", redisListIndexInfo: "Порожнє для додавання в кінець, -1 для додавання на початок або збережіть на показану позицію.", console: "Консоль", connectiondAdd: "Додати з'єднання", connectiondEdit: "Редагувати з'єднання", connectiondView: "Переглянути з'єднання", connections: "З'єднання", licenseInfo: "Ліцензія", licenseEditable: "Ліцензія редагована", licenseEditableYes: "Так", licenseEditableNo: "Ні", licenseTerminalOnly: "Ліцензію можна налаштувати лише з термінала сервера.", licenseTierPolicyTitle: "Політика рівнів", licenseTierPolicyText: "

Безкоштовно

Лише базовий Redis UI; без SSH-тунелювання, без режиму підключення лише для читання, без Cluster/Sentinel, без Редагування JSON/Завантаження бінарних файлів/Вивантаження бінарних файлів, без ReJSON.
Ціна: 0 HUF/місяць (€0/місяць).

Pro

SSH-тунелювання, режим підключення лише для читання (включаючи --readonly-connections/-r), Редагування JSON, Завантаження бінарних файлів, Вивантаження бінарних файлів, ReJSON.
Базова ціна: 400 HUF/місяць (€1/місяць) або 4 000 HUF/рік (€10/рік).
Разом з 27% ПДВ: 500 HUF/місяць (€1,27/місяць) або 5 100 HUF/рік (€12,70/рік).

Enterprise

SSH-тунелювання, Cluster та Sentinel, плюс Редагування JSON, Завантаження бінарних файлів, Вивантаження бінарних файлів, ReJSON; --readonly-connections/-r також працює.
Базова ціна: 1 200 HUF/місяць (€3/місяць) або 12 000 HUF/рік (€30/рік).
Разом з 27% ПДВ: 1 500 HUF/місяць (€3,81/місяць) або 15 200 HUF/рік (€38,10/рік).

Річне правило

Річна ціна в 10 разів більша за місячну.

Місця

Стандартна ліцензія включає 5 місць. Якщо потрібно більше місць, зверніться до нас на support@corifeus.com.

Пробна версія Enterprise

10 днів безкоштовно для всіх з реальною існуючою електронною адресою (не тестова пошта).

Платіжна інформація в е-пошті

Ім'я, Електронна адреса для рахунків, Код країни, Поштовий індекс, Місто, Адреса, ІПН (необов'язково).

Оплата

Оплата PayPal доступна лише в HUF (форинт); після надсилання грошей @ https://paypal.me/corifeus я надішлю вам рахунок-фактуру. Усі платежі не підлягають поверненню.

ПДВ

ПДВ додається до ціни (27% в Угорщині).

Контакти

Якщо ви хочете привітатися або маєте запитання, зверніться на support@corifeus.com.

Мова

Рахунки та листування щодо ліцензії ведеться англійською мовою. Валюта рахунку — HUF.

Примітка

Перевірка ліцензії потребує доступу до інтернету.", licenseState: "Стан", licenseStateActive: "Активна", licenseStateInactive: "Неактивна", licenseStateNoLicense: "Немає ліцензії", licenseKeyMasked: "Збережений ключ", licenseTier: "Рівень", licenseValid: "Дійсна", licenseStatus: "Статус ліцензії", licenseReason: "Причина", licenseCheckedAt: "Перевірено", licenseStartsAt: "Починається", licenseExpiresAt: "Закінчується", licenseDaysLeft: "Днів залишилось", licenseMaxDevices: "Макс. пристроїв", licenseActiveDevices: "Активні пристрої", licenseActiveDevicesInfo: "Якщо пристрій більше не використовується, його місце автоматично звільняється через 75 хвилин.", licenseCustomerEmail: "Електронна пошта клієнта", licenseFeatures: "Функції", licenseFeaturesEmpty: "Немає додаткових функцій", licenseFeatureReadonlyMode: "Режим підключення лише для читання", licenseFeatureReadonlyConnectionsFlag: "Підключення лише для читання (--readonly-connections/-r)", licenseFeatureSsh: "SSH-тунелювання", licenseFeatureCluster: "Cluster-з'єднання", licenseFeatureSentinel: "Sentinel-з'єднання", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "Сортування ключів увімкнено", off: "Сортування ключів вимкнено" }, cluster: { on: "Cluster увімкнено", off: "Cluster вимкнено" }, sentinel: { on: "Sentinel увімкнено", off: "Sentinel вимкнено", name: "Назва Sentinel" }, readonly: { on: "Лише для читання увімкнено", off: "Лише для читання вимкнено" }, proSshOnly: "SSH доступний у Pro або Enterprise.", proReadonlyOnly: "Режим підключення лише для читання доступний у Pro або Enterprise.", enterpriseClusterSentinelOnly: "Cluster та Sentinel доступні лише в Enterprise.", theme: { light: "Світла", dark: "Темна enterprise", darkNeu: "Темна", darkoBluo: "Darko bluo", enterprise: "Enterprise", redis: "Redis", matrix: "Matrix" }, connected: opts => { return `Підключено: ${opts.name}`; }, tree: "Дерево", askAuth: "Запитати авторизацію", keyboardShortcuts: "Гарячі клавіші", about: "Про програму", supportedLanguages: "Підтримувані мови", version: "Версія", redisVersion: "Версія Redis", modules: "Модулі", shortcutRefresh: "Оновити", shortcutSearch: "Фокус на пошуку", shortcutNewKey: "Новий ключ", shortcutDisconnect: "Відключити", themeAuto: "Автоматично (система)", shortcutCommandPalette: "Палітра команд", commandPalette: "Палітра команд", noResults: "Немає результатів", redisCommandsReference: "Команди Redis", ungrouped: "Без групи", grouped: "Згруповані", connectFirst: "Спочатку підключіться до сервера Redis", searchLanguage: "Пошук мови...", exportProgress: "Експорт ключів...", importProgress: "Імпорт ключів...", importPreview: "Попередній перегляд", importOverwrite: "Перезаписати", importSkip: "Пропустити", importConflict: "Якщо ключ вже існує:", noKeysToExport: "Немає ключів для експорту", time: "Час", loading: "Завантаження...", autoRefresh: "Авто", exportSearchHint: "Експортуються лише ключі, що відповідають поточному пошуку", importSearchHint: "Імпорт застосовується до всієї бази даних, а не лише до результатів пошуку", importNoKeys: "Ключі не знайдено у файлі", }, status: { dataCopied: "Дані скопійовано в буфер обміну", licenseSaved: "Ліцензію збережено", exportDone: "Експорт завершено", indexCreated: "Індекс створено", indexDropped: "Індекс видалено", importDone: (opts) => `Імпорт завершено: ${opts.created} створено, ${opts.skipped} пропущено, ${opts.errors} помилок`, nodeRemoved: "Вузол видалено", keyIsNotExisting: "Цей ключ міг бути видалений або його термін дії минув.", keyCount: opts => { if (opts.keyCount === 0) { return "Немає ключів"; } else if (opts.keyCount === 1) { return "1 ключ"; } else { return `${opts.keyCount} ключів`; } }, treeExpandAll: "Розгорнути всі гілки дерева. Ця операція може бути ресурсоємною і зайняти час ...", noRedisKeys: "У цій базі даних немає ключів.", redisConnected: "Redis підключено успішно", reloadingDataInfo: "Перезавантаження інформації Redis", added: "Додано", saved: "Оновлено", cancelled: "Скасовано", deleted: "Видалено", savedRedis: "Дані Redis збережено", redisDisconnected: opts => { return `Поточне з'єднання мало помилку: ${opts.error.message}`; }, dbChanged: opts => { return `Індекс БД встановлено на ${opts.db}. `; }, treeDeleted: opts => { return `Ключ дерева було видалено (${opts.key}).`; }, deletedKey: opts => { return `Ключ було видалено (${opts.key}).`; }, renamedKey: "Цей ключ було перейменовано", ttlChanged: "TTL цього ключа було змінено", notInteger: "Це введення не є цілим числом", persisted: "Цей ключ зберігається назавжди", set: "Ключ встановлено/додано" }, code: { "delete-connection": "Це з'єднання було видалено, тому вас від'єднано від цього екземпляра Redis.", "save-connection": "Це з'єднання було змінено, тому вас від'єднано від цього екземпляра Redis. Ви можете підключитися знову.", "readonly-connections": "Додавання/збереження/видалення з'єднань доступне лише для читання!", "readonly-connection-mode": "Це з'єднання в режимі лише для читання!", "list-out-of-bounds": "Цей індекс списку виходить за межі", "donation-ware-feature": "Ця функція доступна у версії з пожертвуванням.", "feature-pro-readonly-required": "Режим підключення лише для читання потребує Pro або Enterprise ліцензії.", "feature-pro-ssh-required": "SSH-тунелювання потребує Pro або Enterprise ліцензії.", "feature-enterprise-cluster-sentinel-required": "Cluster та Sentinel потребують Enterprise ліцензії.", "feature-pro-json-binary-required": "Редагування JSON, завантаження та вивантаження бінарних файлів потребують Pro або Enterprise ліцензії.", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Потрібна авторизація: будь ласка, автентифікуйтесь за допомогою HTTP Basic Auth та перезавантажте.", "auto-connection-failed": "Можливо, з'єднання було видалено і через це автоматичне підключення не вдалося.", invalid_console_command: "Ця команда не працює через GUI." }, licenseReason: { LICENSE_VALID: "Ліцензія дійсна", LICENSE_INVALID: "Ліцензія недійсна", LICENSE_MISSING: "Ліцензійний ключ не встановлено", LICENSE_DISABLED: "Ліцензію вимкнено в конфігурації сервера", LICENSE_NOT_FOUND: "Ліцензію не знайдено", LICENSE_EXPIRED: "Термін дії ліцензії минув", LICENSE_CLEARED: "Ліцензійний ключ очищено", LICENSE_MAX_DEVICES_REACHED: "Досягнуто максимальну кількість місць для пристроїв", PRODUCT_MISMATCH: "Продукт ліцензії не відповідає" }, licenseStatusValue: { active: "Активна", deleted: "Видалена", all: "Всі", expired: "Прострочена", missing: "Відсутня", inactive: "Неактивна" }, form: { error: { required: "Обов'язкове", port: "Порт повинен бути між 1-65535", invalid: "Форма недійсна" }, connection: { label: { name: "Назва", group: "Група", host: "Ім'я хоста", port: "Порт", password: "Пароль", username: "Ім'я користувача" } }, treeSettings: { maxValueDisplay: "Максимальна довжина відображення значення", maxValueDisplayInfo: "Якщо встановлено 0, показувати повні значення. Якщо більше 0, обрізати до цієї довжини. Якщо -1: для рядків — приховати значення до редагування; для інших типів — показувати повний вміст.", maxKeys: "Максимальна кількість ключів", maxKeysInfo: "Щоб GUI не зламався, ми обмежуємо максимальну кількість ключів.", keyCount: () => { return `Кількість ключів: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Використовувати анімацію", noAnimation: "Без анімації", jsonFormatTwoSpace: "Форматувати JSON з 2 пробілами", jsonFormatFourSpace: "Форматувати JSON з 4 пробілами", formName: "Налаштування Redis", searchModeClient: "Режим пошуку на клієнті", searchModeServer: "Режим пошуку на сервері", searchModeStartsWith: "Пошук з режимом «починається з»", searchModeIncludes: "Пошук з режимом «містить»" }, field: { treeSeparator: "Роздільник дерева", treeSeparatorSelector: "Вибір роздільника дерева", page: "Кількість сторінок дерева", keyPageCount: "Кількість сторінок ключів", keysSort: "Сортувати ключі", searchMode: "Режим пошуку", searchModeStartsWith: "Пошук починається з / містить" }, error: { keyPageCount: "Кількість сторінок ключів повинна бути цілим числом від 5 до 100", page: "Кількість сторінок повинна бути цілим числом від 10 до 5000", maxValueDisplay: "Максимальне значення відображення повинно бути цілим числом від -1 до 32768", maxKeys: "Максимальна кількість ключів повинна бути цілим числом від 100 до 100000" } }, key: { label: { formName: { add: "Додати новий Redis-ключ", edit: "Редагувати Redis-ключ", append: "Додати до існуючого Redis-ключа" } }, field: { streamTimestamp: "Мітка часу", key: "Ключ", type: "Тип", index: "Індекс", hashKey: "Хеш-ключ", score: "Оцінка", value: "Значення" }, error: { streamTimestamp: "Мітка часу обов'язкова, у форматі Redis або як *", key: "Ключ повинен містити щонайменше один символ", hashKey: "Ключ хеш-таблиці повинен містити щонайменше один символ", score: "Оцінка впорядкованої множини обов'язкова", value: "Значення обов'язкове" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Пошук", index: "Індекс", query: "Запит", results: "Результати", noIndex: "Індекси не знайдено", createIndex: "Створити індекс", dropIndex: "Видалити індекс", indexInfo: "Інформація про індекс", indexName: "Назва індексу", prefix: "Префікс ключа (необов'язково)", fieldName: "Назва поля", }, monitor: { title: "Моніторинг", memory: "Пам'ять", opsPerSec: "Операцій/сек", clients: "Клієнти", blocked: "Заблоковано", hitsMisses: "Влучність", networkIo: "Мережа I/O", slowLog: "Повільний журнал", totalCommands: "Всього", expired: "Прострочено", evicted: "Витіснено", clientList: "Список клієнтів", topKeys: "Найбільші ключі за памяттю", killClient: "Завершити клієнта", clientKilled: "Клієнта завершено", confirmKillClient: "Ви впевнені, що хочете завершити цього клієнта?", noKeys: "Немає ключів", noClients: "Немає клієнтів", }, overview: { noConnected: "Немає підключення до Redis.", overviewClients: "Перелік підключених за кількістю клієнтів", connectedCount: opt => { if (opt.length === 1) { return "1 клієнт"; } return `${opt.length} клієнтів`; } }, key: { label: { key: "Ключ", encoding: "Кодування", length: "Розмір", ttl: "TTL", ttlTitle: "Час життя", type: "Тип", ttlNotExpire: "не закінчується", lengthString: "байт", lengthItem: "елементів", actions: "Дії" }, list: { table: { index: "Індекс", value: "Значення" } }, hash: { table: { hashkey: "Хеш-ключ", value: "Значення" } }, set: { table: { value: "Член" } }, zset: { table: { value: "Член", score: "Оцінка" } }, stream: { table: { timestamp: "ID мітки часу", field: "Поле", value: "Значення" } } }, treeControls: { settings: "Налаштування дерева", expandAll: "Розгорнути все", collapseAll: "Згорнути все", search: { search: "Пошук серед ключів", clear: "Очистити поточний пошук", placeholderClient: "Пошук на стороні клієнта", placeholderServer: "Пошук на стороні сервера", info: "Пошук на стороні клієнта означає, що текст збігається з введеним у пошуковому полі. Пошук на стороні сервера означає пошук у шаблонах ключів як *{текст-пошуку}*. Для великих наборів даних краще використовувати пошук на стороні сервера. Для менших наборів даних краще використовувати пошук на стороні клієнта." + ` Якщо кількість ключів перевищує ${p3xr.settings.maxLightKeysCount}, ви можете шукати лише на стороні сервера.`, largeSetInfo: "У великому наборі даних пошук на стороні клієнта вимкнено, тому зараз можливий лише пошук на стороні сервера.", infoDetails: "Щоб дізнатися, як працює пошук, перегляньте налаштування" }, pager: { next: "Наступна", prev: "Попередня", first: "Перша", last: "Остання" } } }, time: { loading: "Завантаження...", years: "років", months: "місяців", days: "днів", year: "рік", month: "місяць", day: "день" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/vi/000077500000000000000000000000001517666434100137715ustar00rootroot00000000000000src/strings/vi/strings.js000066400000000000000000000767571517666434100160460ustar00rootroot00000000000000const strings = { error: { cleared_license: "Đã xóa giấy phép", invalid_license: "Giấy phép không hợp lệ", license_max_devices_reached: "Đã đạt đến số lượng thiết bị tối đa", license_readonly: "Giấy phép chỉ có thể được thay đổi từ thiết bị đầu cuối máy chủ.", server_error: "Lỗi máy chủ, vui lòng thử lại" }, title: { donate: "Đóng góp", jsonRecursive: "Mở rộng tất cả các lá", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "Bạn có thể chọn kết nối Redis để kết nối từ menu phía dưới bên trái.", statistics: "Thống kê", error: "Lỗi", connectingRedis: "Đang kết nối với Redis ...", socketioConnectError: "Lỗi Socket.IO", db: "DB", server: "Máy chủ", clients: "Khách hàng", memory: "Bộ nhớ", persistence: "Kiên trì", stats: "Thống kê", replication: "Sao chép", cpu: "CPU", cluster: "Cluster", modules: "Mô-đun", errorstats: "Thống kê lỗi", commandstats: "Thống kê lệnh", latencystats: "Thống kê độ trễ", keysizes: "Kích thước khóa", threads: "Luồng", }, confirm: { dropIndex: "Bạn có chắc muốn xóa chỉ mục này?", uploadBuffer: "Bạn có chắc chắn tải lên dữ liệu nhị phân này không?", uploadBufferDone: "Dữ liệu nhị phân được tải lên", uploadBufferDoneAndSave: "Dữ liệu nhị phân được tải lên và lưu trên máy chủ", title: "Xác nhận", alert: "Cảnh báo", info: "Thông tin", deleteListItem: "Bạn có chắc chắn xóa mục danh sách này không?", deleteHashKey: "Bạn có chắc chắn xóa mục khóa băm này không?", deleteStreamTimestamp: "Bạn có chắc chắn xóa dấu thời gian của luồng này không?", deleteSetMember: "Bạn có chắc chắn xóa thành viên đã đặt này không?", deleteZSetMember: "Bạn có chắc chắn xóa thành viên tập hợp đã sắp xếp này không?", deleteConnection: "Xác nhận", deleteConnectionText: "Bạn có chắc chắn xóa kết nối Redis này không?", deleteNode: "Bạn có chắc chắn xóa nút Redis này không?", deleteAllKeys: opts => { return `Xóa cây này và tất cả các khóa của nó (${opts.key})?`; }, socketioConnectError: "Socket.IO không kết nối được với máy chủ, bạn có thể tải lại và thử tự khắc phục lỗi kết nối, máy khách không biết tự giải quyết.", socketioAuthRequired: "Cần có ủy quyền Socket.IO. Vui lòng xác thực bằng HTTP Basic Auth (tên người dùng/mật khẩu) và tải lại.", deleteKey: "Bạn có chắc chắn xóa khóa này không?", rename: { title: "Bạn có chắc chắn đổi tên khóa này không?", textContent: "Hành động này đổi tên khóa vĩnh viễn.", placeholder: "Khóa Redis (bắt buộc)" }, ttl: { title: "Bạn có chắc chắn muốn thay đổi TTL của khóa này không?", textContent: "Việc thay đổi TTL sẽ cập nhật thời gian tồn tại của khóa này. Để trống để giữ chìa khóa này mãi mãi.", placeholder: "TTL của khóa Redis (số nguyên hoặc trống)", placeholderPlaceholder: "Trống rỗng có nghĩa là nó tồn tại mãi mãi; nếu không thì nhập một số nguyên.", convertTextToTime: "Chuyển đổi văn bản thành thời gian", convertTextToTimePlaceholder: "Ví dụ: 1d sẽ là 86400" }, license: { title: "Đặt giấy phép", textContent: "Nếu bạn muốn sử dụng các tính năng trả phí, vui lòng liên hệ support@corifeus.com để yêu cầu giấy phép. Giá là Pro 400 HUF/tháng (€1/tháng) hoặc 4.000 HUF/năm (€10/năm) và Enterprise 1.200 HUF/tháng (€3/tháng) hoặc 12.000 HUF/năm (€30/năm). Hàng năm là 10x hàng tháng. Với 27% VAT, tổng cộng là Pro 500 HUF/tháng (€1,27/tháng) hoặc 5.100 HUF/năm (€12,70/năm), Doanh nghiệp 1.500 HUF/tháng (€3,81/tháng) hoặc 15.200 HUF/năm (€38,10/năm). Xác thực giấy phép yêu cầu truy cập internet. Giấy phép mặc định bao gồm 5 chỗ. Nếu bạn cần thêm chỗ ngồi, hãy liên hệ với chúng tôi tại support@corifeus.com.", placeholder: "Mã cấp phép" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "Sao chép", downloadBuffer: "Tải xuống nhị phân", setBuffer: "Tải lên nhị phân", exportKeys: "Xuất khóa", exportAllKeys: (opts) => `Xuất tất cả ${opts.count} khóa`, exportSearchResults: (opts) => `Xuất ${opts.count} kết quả`, importKeys: "Nhập khóa", saveWithFormatJson: "Lưu với định dạng", formatJson: "Định dạng Json", wrap: "Bọc", unwrap: "Mở gói", downloadJson: "Tải xuống JSON", pubsubMonitor: "Màn hình PubSub", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "Ngôn ngữ", ok: "được rồi", addKey: "Thêm vào khóa này", addKeyRoot: "Thêm khóa gốc", reloadKey: "Phím tải lại", reload: "Tải lại", close: "Đóng", commands: "Lệnh", view: "Xem", statistics: "Thống kê", refresh: "Làm mới", pause: "Tạm dừng", resume: "Tiếp tục", clear: "Xóa", rename: "Đổi tên", main: "Cơ sở dữ liệu", cancel: "Hủy bỏ", theme: "chủ đề", github: "GitHub", githubRepo: "Kho lưu trữ", githubRelease: "phát hành", githubChangelog: "Nhật ký thay đổi", info: "Info", settings: "Cài đặt", connect: "Kết nối", disconnect: "Ngắt kết nối", overview: "Tổng quan", console: "Bảng điều khiển", noConnections: "Không có kết nối, thêm kết nối trong menu cài đặt.", noConnectionsInSettings: "Không có kết nối, bạn có thể thêm KẾT NỐI MỚI ở trên.", connectionAdd: "Kết nối mới", addGroup: "Thêm nhóm", extend: "Gia hạn", collapse: "Thu gọn", add: "Thêm", edit: "Chỉnh sửa", save: "Lưu", ttl: "Đặt TTL", license: "Đặt giấy phép", delete: "Xóa", remove: "Xóa", sure: "Chắc chắn rồi", testConnection: "Kiểm tra kết nối", getKey: "Đang tải khóa Redis và dữ liệu liên quan ...", jsonViewShow: "Hiển thị JSON", jsonViewEditor: "Chỉnh sửa JSON", quickConsole: "Bảng điều khiển nhanh", }, label: { id: { nodeId: "ID nút", id: "ID kết nối", info: "Nếu bạn không muốn thay đổi các thuộc tính của: sshPassword, sshPrivateKey, mật khẩu, tlsCrt, tlsKey, tlsCa, vui lòng nhập ID của kết nối vào các thuộc tính đó để giữ nguyên các giá trị thuộc tính. Nếu bạn muốn logic tương tự trong mật khẩu nút, hãy nhập ID nút vào mật khẩu nút." }, secureFeature: "Nếu bạn thấy một giá trị bắt đầu bằng P3X và trông giống như vậy thì đó là một tính năng bảo mật. Để thay đổi cài đặt, chỉ cần thay thế các cài đặt này bằng trống hoặc cài đặt khác và chúng sẽ được lưu. Nếu bạn không thay đổi cài đặt, cài đặt sẽ được giữ nguyên trên máy chủ.", ssh: { on: "SSH đang bật", off: "Tắt SSH", sshHost: "Máy chủ SSH", sshPort: "Cổng SSH", sshUsername: "Tên người dùng SSH", sshPassword: "Mật khẩu SSH", sshPrivateKey: "Khóa riêng SSH" }, isBuffer: opts => `[đối tượng ArrayBuffer] có nghĩa là giá trị là dữ liệu nhị phân hoặc giá trị lớn hơn ${opts.maxValueAsBuffer}`, streamValue: `Trường luồng và giá trị là một oneliner. Ví dụ: field1 value1 "field 2" "value 2"`, streamTimestampId: `'*' có nghĩa là được tạo tự động hoặc thông số kỹ thuật là -`, unableToLoadKey: ({ key }) => { return `Không thể tải khóa này: ${key}. Có thể, chìa khóa đã bị xóa. Lỗi chính xác là trong bảng điều khiển.`; }, bigJson: "Đối tượng JSON này có dung lượng trên 10 kb, vì vậy hãy đảm bảo bạn biết mình đang làm gì vì một số chức năng có thể hiển thị chậm.", addNode: "Thêm nút", validateJson: "Xác thực JSON", reducedFunction: `Giảm chức năng`, tooManyKeys: opts => { return `Đối với các chức năng tối đa đầy đủ, tổng số phím được phép là ${opts.maxLightKeysCount} đếm. Cơ sở dữ liệu này có tổng số khóa được phép ${opts.count}. Việc sắp xếp khóa và thông tin cây ưa thích bổ sung bị vô hiệu hóa. Việc tìm kiếm chỉ diễn ra trên máy chủ thay vì tìm kiếm trên máy khách.`; }, redisCommandNotFound: "Không tìm thấy lệnh Redis nào khớp ...", treeKeyStore: `Việc sắp xếp (so sánh tự nhiên) được thực thi trên máy khách hay còn gọi là trình duyệt, có nghĩa là nó có một hình phạt đối với các tập hợp lớn, chẳng hạn như hơn 10 nghìn khóa, nó có thể tốn thêm một chút thời gian để hiển thị trang. Không có cách sắp xếp khóa nào trong Redis, chỉ như thế này.`, socketIoTimeout: options => { return `Socket.IO đã hết thời gian chờ cho yêu cầu này (tối đa ${options.timeout / 1000} giây)...`; }, resizerInfo: options => { return `Chiều rộng tối thiểu của bảng bên trái hoặc bên phải là ${options.width}px`; }, jsonViewNotParsable: "Giá trị này không thể phân tích được JSON ", ttlTitle: "Đặt TTL trong vài giây", passwordSecure: "Mật khẩu có thể trống nhưng vẫn hiển thị các ký tự, đây là một tính năng bảo mật.", tlsWithoutCert: "Kích hoạt TLS mà không cần chứng chỉ bổ sung", tlsRejectUnauthorized: "Từ chối chứng chỉ trái phép", tlsSecure: "Nếu bạn thấy cấu hình TLS bắt đầu bằng P3X hoặc tất cả cài đặt TLS trông giống nhau thì đó là một tính năng bảo mật. Để thay đổi cài đặt, chỉ cần thay thế các cài đặt này bằng trống hoặc cài đặt khác và chúng sẽ được lưu. Nếu bạn không thay đổi cài đặt TLS, cài đặt sẽ được giữ nguyên trên máy chủ.", treeSeparatorEmpty: "Nếu dấu tách cây trống, cây sẽ không có nút l���ng nhau, chỉ có một danh sách thuần túy", treeSeparatorEmptyNote: "Không có nút lồng nhau, chỉ có một danh sách thuần túy", welcomeConsole: "Chào mừng bạn đến với Bảng điều khiển Redis", welcomeConsoleInfo: "Lịch sử con trỏ LÊN hoặc XUỐNG được bật", redisListIndexInfo: "Trống để nối thêm, -1 để thêm vào trước hoặc lưu nó vào vị trí hiển thị.", console: "Bảng điều khiển", connectiondAdd: "Thêm kết nối", connectiondEdit: "Chỉnh sửa kết nối", connectiondView: "Xem kết nối", connections: "Kết nối", licenseInfo: "Giấy phép", licenseEditable: "Giấy phép có thể chỉnh sửa", licenseEditableYes: "Có", licenseEditableNo: "Không", licenseTerminalOnly: "Giấy phép chỉ có thể được cấu hình từ thiết bị đầu cuối của máy chủ.", licenseTierPolicyTitle: "Chính sách cấp độ", licenseTierPolicyText: "Chỉ giao diện người dùng

Free

core Redis; không có đường hầm SSH, không có chế độ kết nối Chỉ đọc, không có Cluster/Sentinel, không Chỉnh sửa JSON/Tải lên nhị phân/Tải xuống nhị phân, không ReJSON.
Giá: 0 HUF/tháng (€0/tháng).

Pro

SSH, chế độ kết nối chỉ đọc (bao gồm --readonly-connections/-r), Chỉnh sửa JSON, Tải lên nhị phân, Tải xuống nhị phân, ReJSON.
Giá cơ bản: 400 HUF/tháng (€1/tháng) hoặc 4.000 HUF/năm (€10/năm).
Tổng cộng với 27% VAT: 500 HUF/tháng (€1,27/tháng) hoặc 5.100 HUF/năm (€12,70/năm).

Enterprise

SSH đào hầm, Cluster và Sentinel, cộng thêm Chỉnh sửa JSON, Tải lên nhị phân, Tải xuống nhị phân, ReJSON; --readonly-connections/-r cũng hoạt động.
Giá cơ bản: 1.200 HUF/tháng (€3/tháng) hoặc 12.000 HUF/năm (€30/năm).
Tổng cộng với 27% VAT: 1.500 HUF/tháng (€3,81/tháng) hoặc 15.200 HUF/năm (€38,10/năm).

YQuy tắc sớm

YGiá ban đầu là 10 lần giá hàng tháng price.

Seats

Giấy phép mặc định bao gồm 5 chỗ. Nếu bạn cần thêm chỗ ngồi, hãy liên hệ với chúng tôi tại support@corifeus.com.

Bản dùng thử Enterprise

10 ngày miễn phí cho bất kỳ ai có một địa chỉ email thực hiện có (email không kiểm tra).

Thông tin thanh toán trong e-mail

Tên, e-mail thanh toán, Mã quốc gia, Mã bưu chính, Thành phố, Địa chỉ, VAT ID (tùy chọn).

Payment

PayPal thanh toán chỉ có sẵn bằng HUF (forint); sau khi gửi tiền @ https://paypal.me/corifeus tôi sẽ gửi hóa đơn cho bạn. Tất cả các khoản thanh toán đều không được hoàn lại.

VAT

VAT được thêm vào giá (27% trong Hungary).

Liên hệ

Nếu bạn muốn gửi lời chào hoặc có thắc mắc, hãy liên hệ support@corifeus.com.

Ngôn ngữ

Giao tiếp qua e-mail hóa đơn và giấy phép bằng tiếng Anh. Đơn vị tiền tệ của hóa đơn là HUF.

Note

Xác thực giấy phép yêu cầu truy cập internet.", licenseState: "tiểu bang", licenseStateActive: "Đang hoạt động", licenseStateInactive: "Không hoạt động", licenseStateNoLicense: "Không có giấy phép", licenseKeyMasked: "Khóa đã lưu", licenseTier: "cấp", licenseValid: "hợp lệ", licenseStatus: "Trạng thái giấy phép", licenseReason: "Lý do", licenseCheckedAt: "Đã kiểm tra tại", licenseStartsAt: "Bắt đầu lúc", licenseExpiresAt: "Hết hạn vào lúc", licenseDaysLeft: "Số ngày còn lại", licenseMaxDevices: "Số thiết bị tối đa", licenseActiveDevices: "Thiết bị hoạt động", licenseActiveDevicesInfo: "Nếu thiết bị không còn được sử dụng nữa, chỗ ngồi của thiết bị đó sẽ tự động được giải phóng sau 75 phút.", licenseCustomerEmail: "Email khách hàng", licenseFeatures: "Tính năng", licenseFeaturesEmpty: "Không có tính năng bổ sung", licenseFeatureReadonlyMode: "Chế độ kết nối chỉ đọc", licenseFeatureReadonlyConnectionsFlag: "Kết nối chỉ đọc (--readonly-connections/-r)", licenseFeatureSsh: "Đường hầm SSH", licenseFeatureCluster: "Kết nối Cluster", licenseFeatureSentinel: "K���t nối Sentinel", licenseFeatureReJSON: "ReJSON (kiểu dữ liệu JSON)", keysSort: { on: "Sắp xếp khóa đang bật", off: "Sắp xếp chìa khóa" }, cluster: { on: "Cluster đang bật", off: "Tắt Cluster" }, sentinel: { on: "Sentinel đang bật", off: "Tắt Sentinel", name: "Tên Sentinel" }, readonly: { on: "Bật chế độ chỉ đọc", off: "Tắt chế độ chỉ đọc" }, proSshOnly: "SSH có sẵn ở phiên bản Pro hoặc Enterprise.", proReadonlyOnly: "Chế độ kết nối chỉ đọc có sẵn trong Pro hoặc Enterprise.", enterpriseClusterSentinelOnly: "Cluster và Sentinel chỉ có sẵn trong Enterprise.", theme: { light: "Ánh sáng", dark: "Doanh nghiệp đen tối", darkNeu: "Tối", darkoBluo: "màu xanh đậm", enterprise: "Doanh nghiệp", redis: "Redis", matrix: "Ma trận" }, connected: opts => { return `Đã kết nối: ${opts.name}`; }, tree: "Cây", askAuth: "Yêu cầu ủy quyền", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "Mô-đun", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "Ngắt kết nối", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Lệnh Redis", ungrouped: "Không nhóm", grouped: "Grouped", connectFirst: "Kết nối với máy chủ Redis trước", searchLanguage: "Tìm kiếm ngôn ngữ...", exportProgress: "Đang xuất khóa...", importProgress: "Đang nhập khóa...", importPreview: "Xem trước", importOverwrite: "Ghi đè", importSkip: "Bỏ qua", importConflict: "Nếu khóa đã tồn tại:", noKeysToExport: "Không có khóa để xuất", time: "Thời gian", loading: "Đang tải...", autoRefresh: "Tự động", exportSearchHint: "Chỉ xuất các khóa khớp với tìm kiếm hiện tại", importSearchHint: "Nhập áp dụng cho toàn bộ cơ sở dữ liệu, không chỉ kết quả tìm kiếm", importNoKeys: "Không tìm thấy khóa trong tệp", }, status: { dataCopied: "Dữ liệu nằm trong clipboard", licenseSaved: "Đã lưu giấy phép", exportDone: "Xuất hoàn tất", indexCreated: "Đã tạo chỉ mục", indexDropped: "Đã xóa chỉ mục", importDone: (opts) => `Nhập hoàn tất: ${opts.created} đã tạo, ${opts.skipped} đã bỏ qua, ${opts.errors} lỗi`, nodeRemoved: "Đã xóa nút", keyIsNotExisting: "Khóa này có thể đã bị xóa hoặc hết hạn.", keyCount: opts => { if (opts.keyCount === 0) { return "Không có chìa khóa"; } else if (opts.keyCount === 1) { return "1 chìa khóa"; } else { return `${opts.keyCount} phím`; } }, treeExpandAll: "Mở rộng tất cả các lá cây. Hoạt động này có thể tốn kém và có thể mất thời gian...", noRedisKeys: "Không có chìa khóa trong cơ sở dữ liệu này.", redisConnected: "Redis đã kết nối thành công", reloadingDataInfo: "Đang tải lại thông tin dữ liệu Redis", added: "Đã thêm", saved: "Đã cập nhật", cancelled: "Đã hủy", deleted: "Đã xóa", savedRedis: "Dữ liệu Redis được lưu", redisDisconnected: opts => { return `Kết nối hiện tại có lỗi: ${opts.error.message}`; }, dbChanged: opts => { return `Chỉ mục db được đặt thành ${opts.db}. `; }, treeDeleted: opts => { return `Khóa cây đã bị xóa (${opts.key}).`; }, deletedKey: opts => { return `Chìa khóa đã bị xóa (${opts.key}).`; }, renamedKey: "Chìa khóa này đã được đổi tên", ttlChanged: "TTL của khóa này đã được thay đổi", notInteger: "Dữ liệu đầu vào này không phải là số nguyên", persisted: "Chìa khóa này được tồn tại mãi mãi", set: "Khóa được đặt/thêm" }, code: { "delete-connection": "Kết nối này đã bị xóa nên bạn bị ngắt kết nối với phiên bản Redis này.", "save-connection": "Kết nối này đã thay đổi nên bạn bị ngắt kết nối với phiên bản Redis này. Bạn có thể kết nối lại.", "readonly-connections": "Các kết nối thêm/lưu/xóa chỉ ở chế độ đọc!", "readonly-connection-mode": "Kết nối này là chế độ chỉ đọc!", "list-out-of-bounds": "Chỉ mục danh sách này nằm ngoài giới hạn", "donation-ware-feature": "Tính năng này có trong phiên bản quyên góp.", "feature-pro-readonly-required": "Chế độ kết nối chỉ đọc yêu cầu giấy phép Pro hoặc Enterprise.", "feature-pro-ssh-required": "Đường hầm SSH yêu cầu giấy phép Pro hoặc Enterprise.", "feature-enterprise-cluster-sentinel-required": "Cluster và Sentinel yêu cầu giấy phép Doanh nghiệp.", "feature-pro-json-binary-required": "Chỉnh sửa JSON, Tải lên nhị phân và Tải xuống nhị phân yêu cầu giấy phép Pro hoặc Enterprise.", "feature-pro-rejson-required": "ReJSON (loại dữ liệu JSON) yêu cầu giấy phép Pro hoặc Enterprise.", "invalid-json-value": "Giá trị không hợp lệ JSON.", "http_auth_required": "Yêu cầu ủy quyền: vui lòng xác thực bằng HTTP Basic Auth và tải lại.", "auto-connection-failed": "Có thể kết nối đã bị xóa và kết nối tự động không thành công vì điều này.", invalid_console_command: "Lệnh này không hoạt động thông qua GUI." }, licenseReason: { LICENSE_VALID: "Giấy phép có hiệu lực", LICENSE_INVALID: "Giấy phép không hợp lệ", LICENSE_MISSING: "Không có mã cấp phép nào được đặt", LICENSE_DISABLED: "Giấy phép bị vô hiệu hóa trong cấu hình máy chủ", LICENSE_NOT_FOUND: "Không tìm thấy giấy phép", LICENSE_EXPIRED: "Giấy phép đã hết hạn", LICENSE_CLEARED: "Khóa cấp phép đã bị xóa", LICENSE_MAX_DEVICES_REACHED: "Đã đạt đến số lượng thiết bị tối đa", PRODUCT_MISMATCH: "Sản phẩm giấy phép không phù hợp" }, licenseStatusValue: { active: "Đang hoạt động", deleted: "Đã xóa", all: "Tất cả", expired: "Đã hết hạn", missing: "Thiếu", inactive: "Không hoạt động" }, form: { error: { required: "Bắt buộc", port: "Cổng nằm trong khoảng 1-65535", invalid: "Biểu mẫu không hợp lệ" }, connection: { label: { name: "Tên", group: "Group", host: "Tên máy chủ", port: "Cảng", password: "Mật khẩu", username: "Tên người dùng" } }, treeSettings: { maxValueDisplay: "Độ dài chuỗi hiển thị giá trị tối đa", maxValueDisplayInfo: "Nếu được đặt thành 0, hiển thị giá trị đầy đủ. Nếu lớn hơn 0, hãy cắt bớt độ dài này. Nếu -1: đối với chuỗi, ẩn giá trị cho đến khi chỉnh sửa; đối với các loại khác, hiển thị nội dung đầy đủ.", maxKeys: "Số lượng phím tối đa", maxKeysInfo: "Để GUI không gặp sự cố, chúng tôi giới hạn số lượng khóa tối đa.", keyCount: () => { return `Số lượng phím: ${p3xr.state.keysRaw.length}`; }, label: { animation: "Sử dụng hoạt ảnh", noAnimation: "Không có hình ảnh động", jsonFormatTwoSpace: "Định dạng JSON có 2 dấu cách", jsonFormatFourSpace: "Định dạng JSON có 4 dấu cách", formName: "Cài đặt Redis", searchModeClient: "Chế độ tìm kiếm khách hàng", searchModeServer: "Chế độ tìm kiếm máy chủ", searchModeStartsWith: "Tìm kiếm bằng chế độ bắt đầu", searchModeIncludes: "Tìm kiếm bao gồm chế độ" }, field: { treeSeparator: "Tách cây", treeSeparatorSelector: "Bộ chọn tách cây", page: "Số lần phân trang cây", keyPageCount: "Số lần phân trang chính", keysSort: "Sắp xếp các phím", searchMode: "Chế độ tìm kiếm", searchModeStartsWith: "Tìm kiếm bắt đầu bằng / bao gồm" }, error: { keyPageCount: "Số trang chính phải là số nguyên trong khoảng từ 5 - 100", page: "Số trang phải là số nguyên trong khoảng 10 - 5000", maxValueDisplay: "Giá trị hiển thị tối đa phải là số nguyên trong khoảng từ -1 đến 32768", maxKeys: "Giá trị số lượng khóa tối đa phải là số nguyên trong khoảng từ 100 đến 100000" } }, key: { label: { formName: { add: "Thêm khóa Redis mới", edit: "Chỉnh sửa khóa Redis", append: "Thêm vào khóa Redis hiện có" } }, field: { streamTimestamp: "Dấu thời gian", key: "Chìa khóa", type: "Loại", index: "chỉ mục", hashKey: "Khóa băm", score: "Điểm", value: "Giá trị" }, error: { streamTimestamp: "Dấu thời gian là bắt buộc, ở định dạng Redis hoặc ở dạng *", key: "Chìa khóa ít nhất là một ký tự", hashKey: "Khóa bảng băm có ít nhất một ký tự", score: "Điểm số đã sắp xếp là bắt buộc", value: "Giá trị là bắt buộc" } }, main: { label: { database: "DB" } } }, page: { search: { title: "Tìm kiếm", index: "Chỉ mục", query: "Truy vấn", results: "Kết quả", noIndex: "Không tìm thấy chỉ mục", createIndex: "Tạo chỉ mục", dropIndex: "Xóa chỉ mục", indexInfo: "Thông tin chỉ mục", indexName: "Tên chỉ mục", prefix: "Tiền tố khóa (tùy chọn)", fieldName: "Tên trường", }, monitor: { title: "Giám sát", memory: "Bộ nhớ", opsPerSec: "Thao tác/giây", clients: "Kết nối", blocked: "Bị chặn", hitsMisses: "Tỷ lệ trúng", networkIo: "Mạng I/O", slowLog: "Nhật ký chậm", totalCommands: "Tổng", expired: "Hết hạn", evicted: "Bị loại", clientList: "Danh sách kết nối", topKeys: "Khóa lớn nhất theo bộ nhớ", killClient: "Ngắt kết nối", clientKilled: "Kết nối đã bị ngắt", confirmKillClient: "Bạn có chắc muốn ngắt kết nối này?", noKeys: "Không có khóa", noClients: "Không có kết nối", }, overview: { noConnected: "Không có kết nối với Redis.", overviewClients: "Liệt kê các kết nối theo số lượng khách hàng", connectedCount: opt => { if (opt.length === 1) { return "1 khách hàng"; } return `${opt.length} khách hàng`; } }, key: { label: { key: "Chìa khóa", encoding: "Mã hóa", length: "Kích thước", ttl: "TTL", ttlTitle: "Thời gian để sống", type: "Loại", ttlNotExpire: "không hết hạn", lengthString: "byte", lengthItem: "đồ vật", actions: "hành động" }, list: { table: { index: "chỉ mục", value: "Giá trị" } }, hash: { table: { hashkey: "Mã băm", value: "Giá trị" } }, set: { table: { value: "Thành viên" } }, zset: { table: { value: "Thành viên", score: "Điểm" } }, stream: { table: { timestamp: "ID dấu thời gian", field: "trường", value: "Giá trị" } } }, treeControls: { settings: "Cài đặt cây", expandAll: "Mở rộng tất cả", collapseAll: "Thu gọn tất cả", search: { search: "Tìm kiếm trong các phím", clear: "Xóa tìm kiếm hiện tại để đặt trống", placeholderClient: "Tìm kiếm phía khách hàng", placeholderServer: "Phía máy chủ tìm kiếm", info: "Tìm kiếm phía máy khách có nghĩa là nó khớp với văn bản trong đầu vào tìm kiếm. Tìm kiếm phía máy chủ có nghĩa là nó giống như tìm kiếm trong c��c mẫu khóa dưới dạng *{search-text}*. Đối với các tập hợp tìm kiếm lớn, tốt hơn nên sử dụng tìm kiếm phía máy chủ. Đối với các tập hợp tìm kiếm nhỏ hơn, tốt hơn nên sử dụng chế độ tìm kiếm phía máy khách." + ` Nếu số lượng phím kết thúc ${p3xr.settings.maxLightKeysCount}, bạn chỉ có thể tìm kiếm ở phía máy chủ.`, largeSetInfo: "Trong một tập hợp lớn, tìm kiếm phía máy khách bị vô hiệu hóa. vì vậy hiện tại chỉ có thể tìm kiếm phía máy chủ.", infoDetails: "Để tìm hiểu cách hoạt động của tìm kiếm, vui lòng kiểm tra cài đặt" }, pager: { next: "Tiếp theo", prev: "trước đó", first: "đầu tiên", last: "Cuối cùng" } } }, time: { loading: "Đang tải...", years: "năm", months: "tháng", days: "ngày", year: "năm", month: "tháng", day: "ngày" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/zh-HK/000077500000000000000000000000001517666434100142745ustar00rootroot00000000000000src/strings/zh-HK/strings.js000066400000000000000000000634401517666434100163320ustar00rootroot00000000000000const strings = { error: { cleared_license: "已獲得許可", invalid_license: "許可證無效", license_max_devices_reached: "已達到最大設備席次數", license_readonly: "許可證只能從伺服器終端更改。", server_error: "伺服器錯誤,請重試" }, title: { donate: "捐贈", jsonRecursive: "展開所有葉子", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "您可以從左下方選單中選擇 Redis 連線進行連線。", statistics: "統計數據", error: "錯誤", connectingRedis: "正在連接到 Redis ...", socketioConnectError: "Socket.IO 錯誤", db: "DB", server: "伺服器", clients: "客戶", memory: "記憶體", persistence: "堅持", stats: "統計數據", replication: "複製", cpu: "CPU", cluster: "Cluster", modules: "模組", errorstats: "錯誤統計", commandstats: "命令統計", latencystats: "延遲統計", keysizes: "鍵大小", threads: "執行緒", }, confirm: { dropIndex: "確定要刪除此索引嗎?", uploadBuffer: "您確定上傳此二進位資料嗎?", uploadBufferDone: "二進位數據已上傳", uploadBufferDoneAndSave: "二進位資料上傳並保存在伺服器上", title: "確認", alert: "警報", info: "資訊", deleteListItem: "您確定要刪除該清單項目嗎?", deleteHashKey: "您確定刪除該雜湊鍵項嗎?", deleteStreamTimestamp: "您確定要刪除該串流時間戳記嗎?", deleteSetMember: "您確定要刪除該集合成員嗎?", deleteZSetMember: "您確定要刪除這個排序集成員嗎?", deleteConnection: "確認", deleteConnectionText: "您確定刪除此 Redis 連線嗎?", deleteNode: "您確定要刪除這個Redis節點嗎?", deleteAllKeys: opts => { return `刪除這棵樹及其所有鍵(${opts.key})?`; }, socketioConnectError: "Socket.IO 無��連接伺服器,您可以重新載入並嘗試自行解決連線錯誤,用戶端不知道如何解決。", socketioAuthRequired: "需要Socket.IO授權。請使用 HTTP Basic Auth(使用者名稱/密碼)進行身份驗證並重新載入。", deleteKey: "您確定要刪除該密鑰嗎?", rename: { title: "您確定要重新命名該鍵嗎?", textContent: "此操作將永久重命名該密鑰。", placeholder: "Redis 金鑰(必要)" }, ttl: { title: "您確定要變更此金鑰的 TTL 嗎?", textContent: "變更 TTL 會更新此金鑰的生存時間。留空以永久保留此密鑰。", placeholder: "Redis 金鑰的 TTL(整數或空)", placeholderPlaceholder: "空意味著它永遠存在;否則輸入一個整數。", convertTextToTime: "將文字轉換為時間", convertTextToTimePlaceholder: "例如。 1d 將是 86400" }, license: { title: "設定許可證", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "許可證密鑰" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "複製", downloadBuffer: "下載二進位文件", setBuffer: "上傳二進位文件", exportKeys: "匯出金鑰", exportAllKeys: (opts) => `匯出全部 ${opts.count} 個金鑰`, exportSearchResults: (opts) => `匯出 ${opts.count} 個結果`, importKeys: "匯入金鑰", saveWithFormatJson: "以格式儲存", formatJson: "格式化Json", wrap: "包裹", unwrap: "展開", downloadJson: "��載JSON", pubsubMonitor: "PubSub 監視器", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "語言", ok: "好的", addKey: "新增到此鍵", addKeyRoot: "新增根密鑰", reloadKey: "重新載入金鑰", reload: "重新載入", close: "關閉", commands: "命令", view: "查看", statistics: "統計數據", refresh: "重新整理", pause: "暫停", resume: "繼續", clear: "清除", rename: "重新命名", main: "資料庫", cancel: "取消", theme: "主題", github: "GitHub", githubRepo: "儲存庫", githubRelease: "發布", githubChangelog: "變更日誌", info: "Info", settings: "設定", connect: "連接", disconnect: "斷開連接", overview: "概述", console: "主機", noConnections: "沒有連接,請在設定選單中新增連接。", noConnectionsInSettings: "沒有連接,您可以在上面添加一個新連接。", connectionAdd: "新連接", addGroup: "添加分組", extend: "延伸", collapse: "崩潰", add: "添加", edit: "編輯", save: "儲存", ttl: "設定 TTL", license: "設定許可證", delete: "刪除", remove: "刪除", sure: "當然可以", testConnection: "測試連接", getKey: "正在載入 Redis 金鑰和相關資料...", jsonViewShow: "顯示 JSON", jsonViewEditor: "編輯JSON", quickConsole: "快速控制台", }, label: { id: { nodeId: "節點號", id: "連接ID", info: "如果您不想變更下列屬性:sshPassword、sshPrivateKey、password、tlsCrt、tlsKey、tlsCa,請在這些屬性中輸入連接 ID 以保持屬性值不變。如果您希望節點密碼具有相同的邏輯,則在節點密碼中輸入節點 ID。" }, secureFeature: "如果您看到以 P3X 開頭的值並且看起來相似,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改設置,這些設置將保留在伺服器上的原樣。", ssh: { on: "SSH 開啟", off: "SSH 關閉", sshHost: "SSH 主機", sshPort: "SSH 端口", sshUsername: "SSH 使用者名", sshPassword: "SSH 密碼", sshPrivateKey: "SSH 私鑰" }, isBuffer: opts => `[object ArrayBuffer] 表示該值為二進位資料或該值大於${opts.maxValueAsBuffer}`, streamValue: `流字段和值是一個單行符。例如:field1 value1“字段2”“值2”`, streamTimestampId: `'*'表示自動產生或規格為-`, unableToLoadKey: ({ key }) => { return `無法載入此密鑰:${key}。可能,該密鑰已被刪除。確切的錯誤在控制台中。`; }, bigJson: "這個 JSON 物件超過 10 kb,因此請確保您知道自己在做什麼,因為某些函數可能會導致渲染速度變慢。", addNode: "新增節點", validateJson: "驗證 JSON", reducedFunction: `功能減少`, tooManyKeys: opts => { return `對於全部最大功能,允許的按鍵總數為${opts.maxLightKeysCount} 計數。該資料庫總共擁有超過允許的鍵${opts.count}。鍵排序和附加花式樹資訊被停用。搜尋僅發生在伺服器上,而不是客戶端搜尋。`; }, redisCommandNotFound: "未找到 Redis 指令匹配...", treeKeyStore: `排序(自然比較)在客戶端(即瀏覽器)上執行,這意味著它會對大型集合(例如超過 10k 個鍵)造成懲罰,它可能會增加頁面渲染的時間。 Redis中沒有key排序,只有這樣。`, socketIoTimeout: options => { return `Socket.IO 此請求逾時(最大${options.timeout / 1000} 秒)...`; }, resizerInfo: options => { return `左或右面板最小寬度為${options.width}像素`; }, jsonViewNotParsable: "該值不可解析 JSON", ttlTitle: "以秒為單位設定 TTL", passwordSecure: "密碼可能為空,但仍會顯示字符,這是安全功能。", tlsWithoutCert: "無需額外憑證即可啟用 TLS", tlsRejectUnauthorized: "拒絕未經授權的證書", tlsSecure: "如果您看到以 P3X 開頭的 TLS 設定或所有 TLS 設定看起來都相同,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改 TLS 設置,這些設置將保留在伺服器上的原樣。", treeSeparatorEmpty: "如果樹分隔符號為空,則樹將沒有巢狀節點,只有一個純列表", treeSeparatorEmptyNote: "沒有巢狀節點,只是一個純列��", welcomeConsole: "歡迎來到 Redis 控制台", welcomeConsoleInfo: "啟用遊標向上或向下歷史記錄", redisListIndexInfo: "為空表示附加,-1 表示新增或儲存到所示位置。", console: "主機", connectiondAdd: "新增連接", connectiondEdit: "編輯連接", connectiondView: "查看連接", connections: "連接", licenseInfo: "許可證", licenseEditable: "許可證可編輯", licenseEditableYes: "是的", licenseEditableNo: "否", licenseTerminalOnly: "許可證只能從伺服器終端配置。", licenseTierPolicyTitle: "分級政策", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "狀態", licenseStateActive: "活躍", licenseStateInactive: "不活躍", licenseStateNoLicense: "無執照", licenseKeyMasked: "已儲存的密鑰", licenseTier: "等級", licenseValid: "有效", licenseStatus: "許可證狀態", licenseReason: "原因", licenseCheckedAt: "檢查於", licenseStartsAt: "開始於", licenseExpiresAt: "到期日", licenseDaysLeft: "剩餘天數", licenseMaxDevices: "最大设备数", licenseActiveDevices: "有源设备", licenseActiveDevicesInfo: "如果不再使用某个设备,其座位将在 75 分钟后自动释放。", licenseCustomerEmail: "客户邮箱", licenseFeatures: "特點", licenseFeaturesEmpty: "没有额外的功能", licenseFeatureReadonlyMode: "只读连接模式", licenseFeatureReadonlyConnectionsFlag: "只读连接 (--readonly-connections/-r)", licenseFeatureSsh: "SSH 隧道", licenseFeatureCluster: "Cluster 连接", licenseFeatureSentinel: "Sentinel 連接", licenseFeatureReJSON: "ReJSON(JSON 数据类型)", keysSort: { on: "键排序开启", off: "鑰匙分類" }, cluster: { on: "Cluster 開啟", off: "Cluster 關閉" }, sentinel: { on: "Sentinel 開啟", off: "Sentinel 關閉", name: "Sentinel 名称" }, readonly: { on: "只读开启", off: "只讀關閉" }, proSshOnly: "SSH 适用于专业版或企业版。", proReadonlyOnly: "只读连接模式在专业版或企业版中可用。", enterpriseClusterSentinelOnly: "Cluster 和 Sentinel 仅在企业版中可用。", theme: { light: "光", dark: "黑暗企业", darkNeu: "黑暗", darkoBluo: "达科蓝", enterprise: "企業", redis: "Redis", matrix: "矩陣" }, connected: opts => { return `已连接: ${opts.name}`; }, tree: "樹", askAuth: "請求授權", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "模組", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "斷開連接", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis 命令", ungrouped: "未分組", grouped: "Grouped", connectFirst: "請先連接到 Redis 伺服器", searchLanguage: "搜尋語言...", exportProgress: "正在匯出金鑰...", importProgress: "正在匯入金鑰...", importPreview: "預覽", importOverwrite: "覆蓋", importSkip: "跳過", importConflict: "如果金鑰已存在:", noKeysToExport: "沒有金鑰可匯出", time: "時間", loading: "載入中...", autoRefresh: "自動", exportSearchHint: "僅匯出與當前搜尋匹配的金鑰", importSearchHint: "匯入適用於整個資料庫,而不僅僅是搜尋結果", importNoKeys: "檔案中未找到金鑰", }, status: { dataCopied: "資料在剪貼簿中", licenseSaved: "許可證已儲存", exportDone: "匯出完成", indexCreated: "索引已建立", indexDropped: "索引已刪除", importDone: (opts) => `匯入完成:${opts.created} 已建立,${opts.skipped} 已跳過,${opts.errors} 個錯誤`, nodeRemoved: "節點已刪除", keyIsNotExisting: "該密鑰可能已被刪除或過期。", keyCount: opts => { if (opts.keyCount === 0) { return "沒有鑰匙"; } else if (opts.keyCount === 1) { return "1把鑰匙"; } else { return `${opts.keyCount} 鍵`; } }, treeExpandAll: "展開所有樹葉。此操作可能會很昂貴並且可能需要時間...", noRedisKeys: "該資料庫中沒有密鑰。", redisConnected: "Redis 連線成功", reloadingDataInfo: "正在重新載入Redis資料訊息", added: "已新增", saved: "已更新", cancelled: "取消", deleted: "已刪除", savedRedis: "Redis 資料已儲存", redisDisconnected: opts => { return `目前連線有錯誤:${opts.error.message}`; }, dbChanged: opts => { return `資料庫索引設定為${opts.db}。 `; }, treeDeleted: opts => { return `樹鍵已刪除(${opts.key})。`; }, deletedKey: opts => { return `密鑰已被刪除(${opts.key})。`; }, renamedKey: "該鍵已重新命名", ttlChanged: "該密鑰的 TTL 已更改", notInteger: "該輸入不是整數", persisted: "該密鑰將永遠保留", set: "密鑰已設定/新增" }, code: { "delete-connection": "此連線已刪除,因此您與此 Redis 實例的連線已中斷。", "save-connection": "此連線已更改,因此您與此 Redis 實例的連線已中斷。您可以重新連線。", "readonly-connections": "連接新增/儲存/刪除是唯讀的!", "readonly-connection-mode": "此連接是唯讀模式!", "list-out-of-bounds": "此列表索引超出範圍", "donation-ware-feature": "此功能存在於捐贈版本中。", "feature-pro-readonly-required": "只讀連線模式需要專業版或企業版授權。", "feature-pro-ssh-required": "SSH 隧道需要專業版或企業版授權。", "feature-enterprise-cluster-sentinel-required": "Cluster 和 Sentinel 需要企業授權。", "feature-pro-json-binary-required": "編輯 JSON、上傳二進位檔案和下載二進位檔案需要專業版或企業版授權。", "feature-pro-rejson-required": "ReJSON(JSON 資料類型)需要 Pro 或 Enterprise 授權。", "invalid-json-value": "該值無效 JSON。", "http_auth_required": "需要授權:請使用HTTP Basic Auth進行身份驗證並重新載入。", "auto-connection-failed": "可能是因為這個原因,連線被刪除並且自動連線失敗。", invalid_console_command: "該命令無法透過 GUI 運行。" }, licenseReason: { LICENSE_VALID: "許可證有效", LICENSE_INVALID: "許可證無效", LICENSE_MISSING: "未設定許可證密鑰", LICENSE_DISABLED: "伺服器配置中禁用了許可證", LICENSE_NOT_FOUND: "未找到許可證", LICENSE_EXPIRED: "許可證已過期", LICENSE_CLEARED: "許可證密鑰已清除", LICENSE_MAX_DEVICES_REACHED: "已達到最大設備席次數", PRODUCT_MISMATCH: "授權產品不匹配" }, licenseStatusValue: { active: "活躍", deleted: "已刪除", all: "全部", expired: "已過期", missing: "失蹤", inactive: "不活躍" }, form: { error: { required: "必填", port: "連接埠號碼在1-65535之間", invalid: "表格無效" }, connection: { label: { name: "名稱", group: "Group", host: "主機名稱", port: "港口", password: "密碼", username: "使用者名稱" } }, treeSettings: { maxValueDisplay: "最大值顯示字串長度", maxValueDisplayInfo: "如果設定為 0,則顯示完整值。如果大於 0,則截斷至此長度。如果-1:對於字串,隱藏該值直到編輯;對於其他類型,顯示完整內容。", maxKeys: "最大按鍵數", maxKeysInfo: "為了讓 GUI 不會崩潰,我們限制了最大按鍵數。", keyCount: () => { return `鑰匙數量:${p3xr.state.keysRaw.length}`; }, label: { animation: "使用動畫", noAnimation: "無動畫", jsonFormatTwoSpace: "格式為 JSON,含 2 個空格", jsonFormatFourSpace: "格式為 JSON,有 4 個空格", formName: "Redis 設定", searchModeClient: "客戶搜尋模式", searchModeServer: "伺服器搜尋模式", searchModeStartsWith: "搜尋以模式開頭", searchModeIncludes: "搜尋包含模式" }, field: { treeSeparator: "樹分隔符", treeSeparatorSelector: "樹分隔符號選擇器", page: "樹分頁計數", keyPageCount: "關鍵尋呼計數", keysSort: "對鍵進行排序", searchMode: "搜尋模式", searchModeStartsWith: "搜尋以 / 開頭" }, error: { keyPageCount: "關鍵頁數必須是 5 - 100 之間的整數", page: "頁數必須是 10 - 5000 之間的整數", maxValueDisplay: "最大顯示值必須是 -1 到 32768 之間的整數", maxKeys: "最大鍵計數值必須是 100 到 100000 之間的整數" } }, key: { label: { formName: { add: "新增新的 Redis 金鑰", edit: "編輯 Redis 金鑰", append: "新增至現有的 Redis 金鑰" } }, field: { streamTimestamp: "時間戳", key: "鑰匙", type: "類型", index: "索引", hashKey: "哈希鍵", score: "分數", value: "價值" }, error: { streamTimestamp: "時間戳記是必要的,可以是 Redis 格式或 *", key: "關鍵是至少有一個字符", hashKey: "哈希表鍵至少為一個字符", score: "需要排序後的集合分數", value: "該值是必需的" } }, main: { label: { database: "DB" } } }, page: { search: { title: "搜尋", index: "索引", query: "查詢", results: "結果", noIndex: "未找到索引", createIndex: "建立索引", dropIndex: "刪除索引", indexInfo: "索引資訊", indexName: "索引名稱", prefix: "鍵前綴(可選)", fieldName: "欄位名稱", }, monitor: { title: "監控", memory: "記憶體", opsPerSec: "操作/秒", clients: "用戶端", blocked: "已封鎖", hitsMisses: "命中率", networkIo: "網路 I/O", slowLog: "慢查詢日誌", totalCommands: "總計", expired: "已過期", evicted: "已驅逐", clientList: "用戶端列表", topKeys: "記憶體最大的金鑰", killClient: "終止用戶端", clientKilled: "用戶端已終止", confirmKillClient: "確定要終止此用戶端嗎?", noKeys: "沒有金鑰", noClients: "沒有用戶端", }, overview: { noConnected: "與 Redis 沒有連接。", overviewClients: "按客戶端數量列出連接", connectedCount: opt => { if (opt.length === 1) { return "1 名客戶"; } return `${opt.length} 客戶`; } }, key: { label: { key: "鑰匙", encoding: "編碼", length: "尺寸", ttl: "TTL", ttlTitle: "生存時間", type: "類型", ttlNotExpire: "不會過期", lengthString: "位元組", lengthItem: "專案", actions: "行動" }, list: { table: { index: "索引", value: "價值" } }, hash: { table: { hashkey: "哈希鍵", value: "價值" } }, set: { table: { value: "會員" } }, zset: { table: { value: "會員", score: "分數" } }, stream: { table: { timestamp: "時間戳ID", field: "領域", value: "價值" } } }, treeControls: { settings: "樹設定", expandAll: "全部展開", collapseAll: "全部折疊", search: { search: "在鍵中搜尋", clear: "清除目前搜尋以設定為空", placeholderClient: "搜尋客戶端", placeholderServer: "搜尋伺服器端", info: "客戶端搜尋意味著它與搜尋輸入中的文字相符。伺服器端搜尋意味著,就像在 *{search-text}* 這樣的鍵模式中進行搜尋。對於大型搜尋集,最好使用伺服器端搜尋。對於較小的搜尋集,最好使用客戶端搜尋模式。" + ` 如果鑰匙數已結束${p3xr.settings.maxLightKeysCount},只能在伺服器端搜尋。`, largeSetInfo: "在大型集合中,停用客戶端搜尋。所以現在只能進行伺服器端搜尋。", infoDetails: "要了解搜尋的工作原理,請檢查設置" }, pager: { next: "下一步", prev: "上一頁", first: "第一", last: "最後" } } }, time: { loading: "載入中...", years: "年", months: "月", days: "天", year: "年", month: "月", day: "日" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/zh-TW/000077500000000000000000000000001517666434100143245ustar00rootroot00000000000000src/strings/zh-TW/strings.js000066400000000000000000000634421517666434100163640ustar00rootroot00000000000000const strings = { error: { cleared_license: "已獲得許可", invalid_license: "許可證無效", license_max_devices_reached: "已達到最大設備席次數", license_readonly: "許可證只能從伺服器終端更改。", server_error: "伺服器錯誤,請重試" }, title: { donate: "捐贈", jsonRecursive: "展開所有葉子", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "您可以從左下方選單中選擇 Redis 連線進行連線。", statistics: "統計數據", error: "錯誤", connectingRedis: "正在連接到 Redis ...", socketioConnectError: "Socket.IO 錯誤", db: "DB", server: "伺服器", clients: "客戶", memory: "記憶體", persistence: "堅持", stats: "統計數據", replication: "複製", cpu: "CPU", cluster: "Cluster", modules: "模組", errorstats: "錯誤統計", commandstats: "命令統計", latencystats: "延遲統計", keysizes: "鍵大小", threads: "執行緒", }, confirm: { dropIndex: "確定要刪除此索引嗎?", uploadBuffer: "您確定上傳此二進位資料嗎?", uploadBufferDone: "二進位數據已上傳", uploadBufferDoneAndSave: "二進位資料上傳並保存在伺服器上", title: "確認", alert: "警報", info: "資訊", deleteListItem: "您確定要刪除該清單項目嗎?", deleteHashKey: "您確定刪除該雜湊鍵項嗎?", deleteStreamTimestamp: "您確定要刪除該串流時間戳記嗎?", deleteSetMember: "您確定要刪除該集合成員嗎?", deleteZSetMember: "您確定要刪除這個排序集成員嗎?", deleteConnection: "確認", deleteConnectionText: "您確定刪除此 Redis 連線嗎?", deleteNode: "您確定要刪除這個Redis節點嗎?", deleteAllKeys: opts => { return `刪除這棵樹及其所有鍵(${opts.key})?`; }, socketioConnectError: "Socket.IO 無��連接伺服器,您可以重新載入並嘗試自行解決連線錯誤,用戶端不知道如何解決。", socketioAuthRequired: "需要Socket.IO授權。請使用 HTTP Basic Auth(使用者名稱/密碼)進行身份驗證並重新載入。", deleteKey: "您確定要刪除該密鑰嗎?", rename: { title: "您確定要重新命名該鍵嗎?", textContent: "此操作將永久重命名該密鑰。", placeholder: "Redis 金鑰(必要)" }, ttl: { title: "您確定要變更此金鑰的 TTL 嗎?", textContent: "變更 TTL 會更新此金鑰的生存時間。留空以永久保留此密鑰。", placeholder: "Redis 金鑰的 TTL(整數或空)", placeholderPlaceholder: "空意味著它永遠存在;否則輸入一個整數。", convertTextToTime: "將文字轉換為時間", convertTextToTimePlaceholder: "例如。 1d 將是 86400" }, license: { title: "設定許可證", textContent: "If you want to use paid features, please contact support@corifeus.com to request a license. Pricing is Pro 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year), and Enterprise 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year). Yearly is 10x monthly. With 27% VAT, totals are Pro 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year), Enterprise 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year). License validation requires internet access. Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.", placeholder: "許可證密鑰" } }, language: { ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bg: "Български / Bulgarian", bn: "বাংলা / Bengali", cs: "Čeština / Czech", da: "Dansk / Danish", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "English", es: "Español / Spanish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", fr: "Français / French", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hu: "Magyar / Hungarian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", it: "Italiano / Italian", ja: "日本語 / Japanese", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", nl: "Nederlands / Dutch", no: "Norsk / Norwegian", pl: "Polski / Polish", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sl: "Slovenščina / Slovenian", sr: "Српски / Serbian", sv: "Svenska / Swedish", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", zn: "中文 / Chinese", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "複製", downloadBuffer: "下載二進位文件", setBuffer: "上傳二進位文件", exportKeys: "匯出金鑰", exportAllKeys: (opts) => `匯出全部 ${opts.count} 個金鑰`, exportSearchResults: (opts) => `匯出 ${opts.count} 個結果`, importKeys: "匯入金鑰", saveWithFormatJson: "以格式儲存", formatJson: "格式化Json", wrap: "包裹", unwrap: "展開", downloadJson: "��載JSON", pubsubMonitor: "PubSub 監視器", // When you translate the language, keep the Language in English // eg. Idioma / Language language: "語言", ok: "好的", addKey: "新增到此鍵", addKeyRoot: "新增根密鑰", reloadKey: "重新載入金鑰", reload: "重新載入", close: "關閉", commands: "命令", view: "查看", statistics: "統計數據", refresh: "重新整理", pause: "暫停", resume: "繼續", clear: "清除", rename: "重新命名", main: "資料庫", cancel: "取消", theme: "主題", github: "GitHub", githubRepo: "儲存庫", githubRelease: "發布", githubChangelog: "變更日誌", info: "Info", settings: "設定", connect: "連接", disconnect: "斷開連接", overview: "概述", console: "主機", noConnections: "沒有連接,請在設定選單中新增連接。", noConnectionsInSettings: "沒有連接,您可以在上面添加一個新連接。", connectionAdd: "新連接", addGroup: "添加分組", extend: "延伸", collapse: "崩潰", add: "添加", edit: "編輯", save: "儲存", ttl: "設定 TTL", license: "設定許可證", delete: "刪除", remove: "刪除", sure: "當然可以", testConnection: "測試連接", getKey: "正在載入 Redis 金鑰和相關資料...", jsonViewShow: "顯示 JSON", jsonViewEditor: "編輯JSON", quickConsole: "快速控制台", }, label: { id: { nodeId: "節點號", id: "連接ID", info: "如果您不想變更下列屬性:sshPassword、sshPrivateKey、password、tlsCrt、tlsKey、tlsCa,請在這些屬性中輸入連接 ID 以保持屬性值不變。如果您希望節點密碼具有相同的邏輯,則在節點密碼中輸入節點 ID。" }, secureFeature: "如果您看到以 P3X 開頭的值並且看起來相似,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改設置,這些設置將保留在伺服器上的原樣。", ssh: { on: "SSH 開啟", off: "SSH 關閉", sshHost: "SSH 主機", sshPort: "SSH 端口", sshUsername: "SSH 使用者名", sshPassword: "SSH 密碼", sshPrivateKey: "SSH 私鑰" }, isBuffer: opts => `[object ArrayBuffer] 表示該值為二進位資料或該值大於${opts.maxValueAsBuffer}`, streamValue: `流字段和值是一個單行符。例如:field1 value1“字段2”“值2”`, streamTimestampId: `'*'表示自動產生或規格為-`, unableToLoadKey: ({ key }) => { return `無法載入此密鑰:${key}。可能,該密鑰已被刪除。確切的錯誤在控制台中。`; }, bigJson: "這個 JSON 物件超過 10 kb,因此請確保您知道自己在做什麼,因為某些函數可能會導致渲染速度變慢。", addNode: "新增節點", validateJson: "驗證 JSON", reducedFunction: `功能減少`, tooManyKeys: opts => { return `對於全部最大功能,允許的按鍵總數為${opts.maxLightKeysCount} 計數。該資料庫總共擁有超過允許的鍵${opts.count}。鍵排序和附加花式樹資訊被停用。搜尋僅發生在伺服器上,而不是客戶端搜尋。`; }, redisCommandNotFound: "未找到 Redis 指令匹配...", treeKeyStore: `排序(自然比較)在客戶端(即瀏覽器)上執行,這意味著它會對大型集合(例如超過 10k 個鍵)造成懲罰,它可能會增加頁面渲染的時間。 Redis中沒有key排序,只有這樣。`, socketIoTimeout: options => { return `Socket.IO 此請求逾時(最大${options.timeout / 1000} 秒)...`; }, resizerInfo: options => { return `左或右面板最小寬度為${options.width}像素`; }, jsonViewNotParsable: "該值不可解析 JSON", ttlTitle: "以秒為單位設定 TTL", passwordSecure: "密碼可能為空,但仍會顯示字符,這是安全功能。", tlsWithoutCert: "無需額外憑證即可啟用 TLS", tlsRejectUnauthorized: "拒絕未經授權的證書", tlsSecure: "如果您看到以 P3X 開頭的 TLS 設定或所有 TLS 設定看起來都相同,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改 TLS 設置,這些設置將保留在伺服器上的原樣。", treeSeparatorEmpty: "如果樹分隔符號為空,則樹將沒有巢狀節點,只有一個純列表", treeSeparatorEmptyNote: "沒有巢狀節點,只是一個純列��", welcomeConsole: "歡迎來到 Redis 控制台", welcomeConsoleInfo: "啟用遊標向上或向下歷史記錄", redisListIndexInfo: "為空表示附加,-1 表示新增或儲存到所示位置。", console: "主機", connectiondAdd: "新增連接", connectiondEdit: "編輯連接", connectiondView: "查看連接", connections: "連接", licenseInfo: "許可證", licenseEditable: "許可證可編輯", licenseEditableYes: "是的", licenseEditableNo: "否", licenseTerminalOnly: "許可證只能從伺服器終端配置。", licenseTierPolicyTitle: "分級政策", licenseTierPolicyText: "

Free

core Redis UI only; no SSH tunneling, no Readonly connection mode, no Cluster/Sentinel, no Edit JSON/Upload binary/Download binary, no ReJSON.
Price: 0 HUF/month (€0/month).

Pro

SSH tunneling, Readonly connection mode (including --readonly-connections/-r), Edit JSON, Upload binary, Download binary, ReJSON.
Base price: 400 HUF/month (€1/month) or 4,000 HUF/year (€10/year).
Total with 27% VAT: 500 HUF/month (€1.27/month) or 5,100 HUF/year (€12.70/year).

Enterprise

SSH tunneling, Cluster and Sentinel, plus Edit JSON, Upload binary, Download binary, ReJSON; --readonly-connections/-r also works.
Base price: 1,200 HUF/month (€3/month) or 12,000 HUF/year (€30/year).
Total with 27% VAT: 1,500 HUF/month (€3.81/month) or 15,200 HUF/year (€38.10/year).

Yearly rule

Yearly price is 10x the monthly price.

Seats

Default license includes 5 seats. If you need more seats, contact us at support@corifeus.com.

Enterprise trial

10 days free for anyone with a real existing email address (non-test email).

Billing info in e-mail

Name, Billing e-mail, Country code, Postal code, City, Address, VAT ID (optional).

Payment

PayPal payment is available only in HUF (forint); after sending the money @ https://paypal.me/corifeus I will send you an invoice. All payments are non-refundable.

VAT

VAT is added to the price (27% in Hungary).

Contact

If you want to say hi or have a question, contact support@corifeus.com.

Language

Invoice and license e-mail communication is in English. Invoice currency is HUF.

Note

License validation requires internet access.", licenseState: "狀態", licenseStateActive: "活躍", licenseStateInactive: "不活躍", licenseStateNoLicense: "無執照", licenseKeyMasked: "已儲存的密鑰", licenseTier: "等級", licenseValid: "有效", licenseStatus: "許可證狀態", licenseReason: "原因", licenseCheckedAt: "檢查於", licenseStartsAt: "開始於", licenseExpiresAt: "到期日", licenseDaysLeft: "剩餘天數", licenseMaxDevices: "最大設備數", licenseActiveDevices: "有源設備", licenseActiveDevicesInfo: "如果不再使用某個設備,其座位將在 75 分鐘後自動釋放。", licenseCustomerEmail: "客戶信箱", licenseFeatures: "特點", licenseFeaturesEmpty: "沒有額外的功能", licenseFeatureReadonlyMode: "唯讀連線模式", licenseFeatureReadonlyConnectionsFlag: "只讀連接 (--readonly-connections/-r)", licenseFeatureSsh: "SSH 隧道", licenseFeatureCluster: "Cluster 連接", licenseFeatureSentinel: "Sentinel 連接", licenseFeatureReJSON: "ReJSON(JSON 資料類型)", keysSort: { on: "鍵排序開啟", off: "鑰匙分類" }, cluster: { on: "Cluster 開啟", off: "Cluster 關閉" }, sentinel: { on: "Sentinel 開啟", off: "Sentinel 關閉", name: "Sentinel 名稱" }, readonly: { on: "唯讀開啟", off: "只讀關閉" }, proSshOnly: "SSH 適用於專業版或企業版。", proReadonlyOnly: "只讀連線模式可在專業版或企業版中使用。", enterpriseClusterSentinelOnly: "Cluster 和 Sentinel 僅在企業版中可用。", theme: { light: "光", dark: "黑暗企業", darkNeu: "黑暗", darkoBluo: "達科藍", enterprise: "企業", redis: "Redis", matrix: "矩陣" }, connected: opts => { return `已連線:${opts.name}`; }, tree: "樹", askAuth: "請求授權", keyboardShortcuts: "Keyboard Shortcuts", about: "About", supportedLanguages: "Supported Languages", version: "Version", redisVersion: "Redis Version", modules: "模組", shortcutRefresh: "Refresh", shortcutSearch: "Focus Search", shortcutNewKey: "New Key", shortcutDisconnect: "斷開連接", themeAuto: "Auto (system)", shortcutCommandPalette: "Command Palette", commandPalette: "Command Palette", noResults: "No results", redisCommandsReference: "Redis 命令", ungrouped: "未分組", grouped: "Grouped", connectFirst: "請先連接到 Redis 伺服器", searchLanguage: "搜尋語言...", exportProgress: "正在匯出金鑰...", importProgress: "正在匯入金鑰...", importPreview: "預覽", importOverwrite: "覆蓋", importSkip: "跳過", importConflict: "如果金鑰已存在:", noKeysToExport: "沒有金鑰可匯出", time: "時間", loading: "載入中...", autoRefresh: "自動", exportSearchHint: "僅匯出與當前搜尋匹配的金鑰", importSearchHint: "匯入適用於整個資料庫,而不僅僅是搜尋結果", importNoKeys: "檔案中未找到金鑰", }, status: { dataCopied: "資料在剪貼簿中", licenseSaved: "許可證已儲存", exportDone: "匯出完成", indexCreated: "索引已建立", indexDropped: "索引已刪除", importDone: (opts) => `匯入完成:${opts.created} 已建立,${opts.skipped} 已跳過,${opts.errors} 個錯誤`, nodeRemoved: "節點已刪除", keyIsNotExisting: "該密鑰可能已被刪除或過期。", keyCount: opts => { if (opts.keyCount === 0) { return "沒有鑰匙"; } else if (opts.keyCount === 1) { return "1把鑰匙"; } else { return `${opts.keyCount} 鍵`; } }, treeExpandAll: "展開所有樹葉。此操作可能會很昂貴並且可能需要時間...", noRedisKeys: "該資料庫中沒有密鑰。", redisConnected: "Redis 連線成功", reloadingDataInfo: "正在重新載入Redis資料訊息", added: "已新增", saved: "已更新", cancelled: "取消", deleted: "已刪除", savedRedis: "Redis 資料已儲存", redisDisconnected: opts => { return `目前連線有錯誤:${opts.error.message}`; }, dbChanged: opts => { return `資料庫索引設定為${opts.db}。 `; }, treeDeleted: opts => { return `樹鍵已刪除(${opts.key})。`; }, deletedKey: opts => { return `密鑰已被刪除(${opts.key})。`; }, renamedKey: "該鍵已重新命名", ttlChanged: "該密鑰的 TTL 已更改", notInteger: "該輸入不是整數", persisted: "該密鑰將永遠保留", set: "密鑰已設定/新增" }, code: { "delete-connection": "此連線已刪除,因此您與此 Redis 實例的連線已中斷。", "save-connection": "此連線已更改,因此您與此 Redis 實例的連線已中斷。您可以重新連線。", "readonly-connections": "連接新增/儲存/刪除是唯讀的!", "readonly-connection-mode": "此連接是唯讀模式!", "list-out-of-bounds": "此列表索引超出範圍", "donation-ware-feature": "此功能存在於捐贈版本中。", "feature-pro-readonly-required": "只讀連線模式需要專業版或企業版授權。", "feature-pro-ssh-required": "SSH 隧道需要專業版或企業版授權。", "feature-enterprise-cluster-sentinel-required": "Cluster 和 Sentinel 需要企業授權。", "feature-pro-json-binary-required": "編輯 JSON、上傳二進位檔案和下載二進位檔案需要專業版或企業版授權。", "feature-pro-rejson-required": "ReJSON(JSON 資料類型)需要 Pro 或 Enterprise 授權。", "invalid-json-value": "該值無效 JSON。", "http_auth_required": "需要授權:請使用HTTP Basic Auth進行身份驗證並重新載入。", "auto-connection-failed": "可能是因為這個原因,連線被刪除並且自動連線失敗。", invalid_console_command: "該命令無法透過 GUI 運行。" }, licenseReason: { LICENSE_VALID: "許可證有效", LICENSE_INVALID: "許可證無效", LICENSE_MISSING: "未設定許可證密鑰", LICENSE_DISABLED: "伺服器配置中禁用了許可證", LICENSE_NOT_FOUND: "未找到許可證", LICENSE_EXPIRED: "許可證已過期", LICENSE_CLEARED: "許可證密鑰已清除", LICENSE_MAX_DEVICES_REACHED: "已達到最大設備席次數", PRODUCT_MISMATCH: "授權產品不匹配" }, licenseStatusValue: { active: "活躍", deleted: "已刪除", all: "全部", expired: "已過期", missing: "失蹤", inactive: "不活躍" }, form: { error: { required: "必填", port: "連接埠號碼在1-65535之間", invalid: "表格無效" }, connection: { label: { name: "名稱", group: "Group", host: "主機名稱", port: "港口", password: "密碼", username: "使用者名稱" } }, treeSettings: { maxValueDisplay: "最大值顯示字串長度", maxValueDisplayInfo: "如果設定為 0,則顯示完整值。如果大於 0,則截斷至此長度。如果-1:對於字串,隱藏該值直到編輯;對於其他類型,顯示完整內容。", maxKeys: "最大按鍵數", maxKeysInfo: "為了讓 GUI 不會崩潰,我們限制了最大按鍵數。", keyCount: () => { return `鑰匙數量:${p3xr.state.keysRaw.length}`; }, label: { animation: "使用動畫", noAnimation: "無動畫", jsonFormatTwoSpace: "格式為 JSON,含 2 個空格", jsonFormatFourSpace: "格式為 JSON,有 4 個空格", formName: "Redis 設定", searchModeClient: "客戶搜尋模式", searchModeServer: "伺服器搜尋模式", searchModeStartsWith: "搜尋以模式開頭", searchModeIncludes: "搜尋包含模式" }, field: { treeSeparator: "樹分隔符", treeSeparatorSelector: "樹分隔符號選擇器", page: "樹分頁計數", keyPageCount: "關鍵尋呼計數", keysSort: "對鍵進行排序", searchMode: "搜尋模式", searchModeStartsWith: "搜尋以 / 開頭" }, error: { keyPageCount: "關鍵頁數必須是 5 - 100 之間的整數", page: "頁數必須是 10 - 5000 之間的整數", maxValueDisplay: "最大顯示值必須是 -1 到 32768 之間的整數", maxKeys: "最大鍵計數值必須是 100 到 100000 之間的整數" } }, key: { label: { formName: { add: "新增新的 Redis 金鑰", edit: "編輯 Redis 金鑰", append: "新增至現有的 Redis 金鑰" } }, field: { streamTimestamp: "時間戳", key: "鑰匙", type: "類型", index: "索引", hashKey: "哈希鍵", score: "分數", value: "價值" }, error: { streamTimestamp: "時間戳記是必要的,可以是 Redis 格式或 *", key: "關鍵是至少有一個字符", hashKey: "哈希表鍵至少為一個字符", score: "需要排序後的集合分數", value: "該值是必需的" } }, main: { label: { database: "DB" } } }, page: { search: { title: "搜尋", index: "索引", query: "查詢", results: "結果", noIndex: "未找到索引", createIndex: "建立索引", dropIndex: "刪除索引", indexInfo: "索引資訊", indexName: "索引名稱", prefix: "鍵前綴(可選)", fieldName: "欄位名稱", }, monitor: { title: "監控", memory: "記憶體", opsPerSec: "操作/秒", clients: "用戶端", blocked: "已封鎖", hitsMisses: "命中率", networkIo: "網路 I/O", slowLog: "慢查詢日誌", totalCommands: "總計", expired: "已過期", evicted: "已驅逐", clientList: "用戶端列表", topKeys: "記憶體最大的金鑰", killClient: "終止用戶端", clientKilled: "用戶端已終止", confirmKillClient: "確定要終止此用戶端嗎?", noKeys: "沒有金鑰", noClients: "沒有用戶端", }, overview: { noConnected: "與 Redis 沒有連接。", overviewClients: "按客戶端數量列出連接", connectedCount: opt => { if (opt.length === 1) { return "1 名客戶"; } return `${opt.length} 客戶`; } }, key: { label: { key: "鑰匙", encoding: "編碼", length: "尺寸", ttl: "TTL", ttlTitle: "生存時間", type: "類型", ttlNotExpire: "不會過期", lengthString: "位元組", lengthItem: "專案", actions: "行動" }, list: { table: { index: "索引", value: "價值" } }, hash: { table: { hashkey: "哈希鍵", value: "價值" } }, set: { table: { value: "會員" } }, zset: { table: { value: "會員", score: "分數" } }, stream: { table: { timestamp: "時間戳ID", field: "領域", value: "價值" } } }, treeControls: { settings: "樹設定", expandAll: "全部展開", collapseAll: "全部折疊", search: { search: "在鍵中搜尋", clear: "清除目前搜尋以設定為空", placeholderClient: "搜尋客戶端", placeholderServer: "搜尋伺服器端", info: "客戶端搜尋意味著它與搜尋輸入中的文字相符。伺服器端搜尋意味著,就像在 *{search-text}* 這樣的鍵模式中進行搜尋。對於大型搜尋集,最好使用伺服器端搜尋。對於較小的搜尋集,最好使用客戶端搜尋模式。" + ` 如果鑰匙數已結束${p3xr.settings.maxLightKeysCount},只能在伺服器端搜尋。`, largeSetInfo: "在大型集合中,停用客戶端搜尋。所以現在只能進行伺服器端搜尋。", infoDetails: "要了解搜尋的工作原理,請檢查設置" }, pager: { next: "下一步", prev: "上一頁", first: "第一", last: "最後" } } }, time: { loading: "載入中...", years: "年", months: "月", days: "天", year: "年", month: "月", day: "日" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/strings/zn/000077500000000000000000000000001517666434100140025ustar00rootroot00000000000000src/strings/zn/strings.js000066400000000000000000000630401517666434100160340ustar00rootroot00000000000000const strings = { error: { cleared_license: "清除许可证", invalid_license: "无效的许可证", license_max_devices_reached: "已达到设备席位上限", license_readonly: "许可证只能在服务器终端中修改。", server_error: "服务器错误,请重试" }, title: { donate: "捐赠", jsonRecursive: "展开所有叶子", name: "P3X Redis UI", nameDonated: "P3X Redis UI+", main: "您可以从左下方菜单中选择要连接的Redis进行连接访问", statistics: "Statistics", error: "错误", connectingRedis: "连接到Redis ...", socketioConnectError: "Socket.IO 错误", db: "DB", server: "服务端", clients: "客户端", memory: "内存", persistence: "持久性", stats: "统计", replication: "同步复制", cpu: "CPU", cluster: "集群", modules: "模块", errorstats: "错误统计", commandstats: "命令统计", latencystats: "延迟统计", keysizes: "键大小", threads: "线程", }, confirm: { dropIndex: "确定要删除此索引吗?", uploadBuffer: "您确定上传此二进制数据吗?", uploadBufferDone: "二进制数据已上传", uploadBufferDoneAndSave: "二进制数据上传并保存在服务器上", title: "确认", alert: "警告", info: "信息", deleteListItem: "您确定要删除该列表项吗?", deleteHashKey: "您确定要删除该哈希键项吗?", deleteStreamTimestamp: "您确定要删除此流时间戳吗?", deleteSetMember: "您确定要删除该集合成员?", deleteZSetMember: "您确定要删除该有序集合成员?", deleteConnection: "确认", deleteConnectionText: "您确定要删除此Redis连接吗?", deleteNode: "您确定要删除此Redis节点吗?", deleteAllKeys: opts => { return `删除此树及其所有键 (${opts.key})?`; }, socketioConnectError: "Socket.IO 无法连接到该服务,请重新加载并尝试解决此错误,客户端无法解决此错误", socketioAuthRequired: "Socket.IO 需要授权。请先完成 HTTP Basic Auth(用户名/密码)后再刷新页面。", deleteKey: "您确定要删除此键吗?", rename: { title: "您确定要重命名此键吗?", textContent: "如果您点击重命名按钮,它将永久重命名此键。", placeholder: "Redis键(必须存在)" }, ttl: { title: "您要更改此键的TTL吗?", textContent: "如果您点击更改TTL按钮,将更改此键的生存时间,将其设置为空表示永久有效。", placeholder: "Redis键的TTL(整数或空)", placeholderPlaceholder: "空表示永久存在,否则使用所提供的整数。", convertTextToTime: "将文本转换为时间", convertTextToTimePlaceholder: "例如,1d 表示 86400" }, license: { title: "设置许可证", textContent: "如果要使用付费功能,请联系 support@corifeus.com 申请许可证。价格:Pro 400 HUF/月(€1/月)或 4,000 HUF/年(€10/年),Enterprise 1,200 HUF/月(€3/月)或 12,000 HUF/年(€30/年)。年费=月费的10倍。加上27%增值税后,总价:Pro 500 HUF/月(€1.27/月)或 5,100 HUF/年(€12.70/年),Enterprise 1,500 HUF/月(€3.81/月)或 15,200 HUF/年(€38.10/年)。许可证验证需要互联网连接。默认许可证包含 5 个席位(seats)。如果您需要更多席位,请通过 support@corifeus.com 联系我们。", placeholder: "注册码" } }, language: { bg: "Български / Bulgarian", cs: "Čeština / Czech", de: "Deutsch / German", el: "Ελληνικά / Greek", en: "英语 / English", es: "Español / Spanish", fr: "Français / French", hu: "Magyar / Hungarian", it: "Italiano / Italian", ja: "日本語 / Japanese", nl: "Nederlands / Dutch", pl: "Polski / Polish", "pt-PT": "Português / Portuguese", ro: "Română / Romanian", ru: "Русский / Russian", sk: "Slovenčina / Slovak", sr: "Српски / Serbian", sv: "Svenska / Swedish", tr: "Türkçe / Turkish", uk: "Українська / Ukrainian", zn: "中文 / Chinese", ar: "العربية / Arabic", az: "Azərbaycanca / Azerbaijani", be: "Беларуская / Belarusian", bn: "বাংলা / Bengali", da: "Dansk / Danish", et: "Eesti / Estonian", fi: "Suomi / Finnish", fil: "Filipino / Filipino", he: "עברית / Hebrew", hr: "Hrvatski / Croatian", hy: "Հայերեն / Armenian", id: "Bahasa Indonesia / Indonesian", ka: "ქართული / Georgian", kk: "Қазақша / Kazakh", km: "ខ្មែរ / Khmer", ko: "한국어 / Korean", ky: "Кыргызча / Kyrgyz", lt: "Lietuvių / Lithuanian", mk: "Македонски / Macedonian", ms: "Bahasa Melayu / Malay", ne: "नेपाली / Nepali", no: "Norsk / Norwegian", "pt-BR": "Português (Brasil) / Portuguese (Brazil)", sl: "Slovenščina / Slovenian", tg: "Тоҷикӣ / Tajik", th: "ไทย / Thai", vi: "Tiếng Việt / Vietnamese", "zh-HK": "中文(香港) / Chinese (Hong Kong)", "zh-TW": "中文(台灣) / Chinese (Taiwan)", bs: 'Bosanski / Bosnian', si: 'සිංහල / Sinhala', sw: 'Kiswahili / Swahili', ta: 'தமிழ் / Tamil' }, intention: { copy: "复制", downloadBuffer: "下載二進位文件", setBuffer: "上傳二進位文件", exportKeys: "导出键", exportAllKeys: (opts) => `导出全部 ${opts.count} 个键`, exportSearchResults: (opts) => `导出 ${opts.count} 个结果`, importKeys: "导入键", saveWithFormatJson: "保存格式", formatJson: "格式化Json", wrap: "自动换行", unwrap: "不换行", downloadJson: "下载 JSON", pubsubMonitor: "PubSub监视器", language: "语言 / Language", ok: "确定", addKey: "加入此键", addKeyRoot: "加入一个根键", reloadKey: "重载键", reload: "重载", close: "关闭", commands: "命令", view: "视图", statistics: "统计", refresh: "刷新", pause: "暂停", resume: "继续", clear: "清除", rename: "重命名", main: "数据库", cancel: "取消", theme: "主题", github: "GitHub", githubRepo: "仓库", githubRelease: "发布", githubChangelog: "更新日志", info: "Info", settings: "设置", connect: "连接", disconnect: "断开", overview: "概览", console: "控制台", noConnections: "没有任何连接,请在设置菜单中添加一个连接。", noConnectionsInSettings: "没有连接,您可以在上面添加一个新的连接。", connectionAdd: "新连接", addGroup: "添加分组", extend: "拓展", collapse: "折叠", add: "添加", edit: "编辑", save: "保存", ttl: "设置 TTL", license: "设置许可证", delete: "删除", remove: "删除", sure: "确定", testConnection: "测试连接", getKey: "加载Redis键及相关数据...", jsonViewShow: "显示 JSON 树", jsonViewEditor: "编辑JSON", quickConsole: "快的" }, label: { id: { nodeId: '节点号', id: "连接ID", info: "如果您不想更改以下属性:sshPassword、sshPrivateKey、password、tlsCrt、tlsKey、tlsCa,请在这些属性中输入连接 ID 以保持属性值不变。 如果您希望节点密码具有相同的逻辑,则在节点密码中输入节点 ID。" }, secureFeature: '如果您看到以 P3X 开头的值并且看起来相似,则这是一项安全功能。 要更改设置,只需将这些设置替换为空或其他内容即可保存它们。 如果您不更改设置,这些设置将保留在服务器上的原样。', ssh: { on: 'SSH 开启', off: 'SSH 关闭', sshHost: 'SSH 主机', sshPort: 'SSH端口', sshUsername: 'SSH 用户名', sshPassword: 'SSH密码', sshPrivateKey: 'SSH 私钥' }, isBuffer: opts => `[object ArrayBuffer] 表示該值是二進位緩衝區或該值大於 ${opts.maxValueAsBuffer}`, streamValue: `流字段和值是唯一的。 例如:field1 value1 "field 2" "value 2"`, streamTimestampId: `'*'表示自动生成或指定为-`, unableToLoadKey: ({ key }) => { return `无法加载此密钥:: ${key}。可能,密钥被删除了。确切的错误在控制台中。`; }, bigJson: "此JSON对象超过10 kb,因此请确保您知道自己在做什么,因为某些功能可能会缓慢呈现。", addNode: "添加节点", validateJson: "验证JSON", reducedFunction: `功能限制`, tooManyKeys: opts => { return `对于最大函数允许的键个数为 ${opts.maxLightKeysCount}. 该数据库允许共超过的键总数为 ${opts.count}.但键的排序及范式树等相关信息会被禁用。搜索仅在服务器上进行,而不是客户端搜索。`; }, redisCommandNotFound: "找不到匹配的Redis命令...", treeKeyStore: `该排序(自然排序)运行在客户端的浏览器上, 意味着针对大型集合(例如超过1W个键),渲染的时长开销需要增加.Redis中没有键排序, 就像这样。`, socketIoTimeout: options => { return `Socket.IO 请求超时,请求时最长(最大 ${options.timeout / 1000}秒) ...`; }, resizerInfo: options => { return `面板(左/右)的最小宽度是 ${options.width}像素`; }, jsonViewNotParsable: "该值JSON无法解析", ttlTitle: "设置TTL时间(秒)", passwordSecure: "密码可能为空,但仍会显示字符,这是一项安全功能。", treeSeparatorEmpty: "如果树分隔符为空,则树将没有嵌套节点,只有纯列表", tlsWithoutCert: "无需额外证书即可启用 TLS", tlsRejectUnauthorized: "拒绝未经授权的证书", tlsSecure: "如果您看到以 P3X 开头的 TLS 配置或所有 TLS 设置看起来都相同,则这是一项安全功能。 要更改设置,只需将这些设置替换为空或其他内容即可保存。 如果您不更改 TLS 设置,这些设置将保持在服务器上的原样。", treeSeparatorEmptyNote: "没有嵌套节点,只是一个纯列表", welcomeConsole: "欢迎来到Redis控制台", welcomeConsoleInfo: "上下方向键选择历史记录功能已启用", redisListIndexInfo: "空值追加, -1 到前置或保存到光标之处", console: "控制台", connectiondAdd: "添加连接", connectiondEdit: "编辑连接", connectiondView: "查看连接", connections: "连接", licenseInfo: "许可证", licenseEditable: "许可证可编辑", licenseEditableYes: "是", licenseEditableNo: "否", licenseTerminalOnly: "许可证只能从服务器终端进行配置。", licenseTierPolicyTitle: "套餐策略", licenseTierPolicyText: "

Free

仅基础 Redis UI;不支持 SSH 隧道,不支持 Readonly connection mode,不支持 Cluster/Sentinel,不支持 Edit JSON/Upload binary/Download binary,不支持 ReJSON。
价格:0 HUF/月(€0/月)。

Pro

支持 SSH 隧道、Readonly connection mode(包含 --readonly-connections/-r)、Edit JSON、Upload binary、Download binary、ReJSON。
基础价格:400 HUF/月(€1/月)或 4,000 HUF/年(€10/年)。
含27%增值税总价:500 HUF/月(€1.27/月)或 5,100 HUF/年(€12.70/年)。

Enterprise

支持 SSH 隧道、Cluster 和 Sentinel,并且也支持 Edit JSON、Upload binary、Download binary、ReJSON;--readonly-connections/-r 也可用。
基础价格:1,200 HUF/月(€3/月)或 12,000 HUF/年(€30/年)。
含27%增值税总价:1,500 HUF/月(€3.81/月)或 15,200 HUF/年(€38.10/年)。

年费规则

年费=月费的10倍。

席位

默认许可证包含 5 个席位(seats)。如果您需要更多席位,请通过 support@corifeus.com 联系我们。

Enterprise 试用

任何使用真实且已存在邮箱(非测试邮箱)的用户可免费试用 10 天。

邮件需提供

姓名、Billing e-mail、国家代码、邮政编码、城市、地址、VAT ID(如有)。

付款

PayPal 仅支持 HUF(匈牙利福林)付款;向 https://paypal.me/corifeus 付款后,我会给您发送发票。所有付款均不予退款。

增值税

价格需另加增值税(匈牙利为 27%)。

联系

如果您想打个招呼或有任何问题,请联系 support@corifeus.com

语言

关于发票和发送许可证密钥的邮件沟通使用英语。发票币种为 HUF。

说明

许可证验证需要互联网连接。", licenseState: "状态", licenseStateActive: "有效", licenseStateInactive: "无效", licenseStateNoLicense: "没有许可证", licenseKeyMasked: "已保存密钥", licenseTier: "等级", licenseValid: "是否有效", licenseStatus: "许可证状态", licenseReason: "原因", licenseCheckedAt: "检查时间", licenseStartsAt: "开始时间", licenseExpiresAt: "过期时间", licenseDaysLeft: "剩余天数", licenseMaxDevices: "最大设备数", licenseActiveDevices: "活跃设备数", licenseActiveDevicesInfo: "如果某个设备不再使用,其席位会在 75 分钟后自动释放。", licenseCustomerEmail: "客户邮箱", licenseFeatures: "功能", licenseFeaturesEmpty: "无额外功能", licenseFeatureReadonlyMode: "只读连接模式", licenseFeatureReadonlyConnectionsFlag: "全局只读 (--readonly-connections/-r)", licenseFeatureSsh: "SSH 隧道", licenseFeatureCluster: "Cluster 连接", licenseFeatureSentinel: "Sentinel 连接", licenseFeatureReJSON: "ReJSON (JSON data type)", keysSort: { on: "开启键排序", off: "关闭键排序" }, cluster: { on: "群集", off: "集群关闭" }, sentinel: { on: "哨兵開啟", off: "哨兵關閉", name: '哨兵名称' }, readonly: { on: "只读", off: "只读关闭" }, proSshOnly: "SSH 仅在 Pro 或 Enterprise 中可用。", proReadonlyOnly: "只读连接模式仅在 Pro 或 Enterprise 中可用。", enterpriseClusterSentinelOnly: "Cluster 和 Sentinel 仅在 Enterprise 中可用。", theme: { light: "浅棕", dark: "黑暗企业", darkNeu: "暗色", darkoBluo: "蓝色", enterprise: "企业风", redis: "Redis风格", matrix: "矩阵" }, connected: opts => { return `已连接: ${opts.name}`; }, tree: "树", askAuth: "请求授权", keyboardShortcuts: "键盘快捷键", about: "关于", supportedLanguages: "支持的语言", version: "版本", redisVersion: "Redis 版本", modules: "模块", shortcutRefresh: "刷新", shortcutSearch: "聚焦搜索", shortcutNewKey: "新建键", shortcutDisconnect: "断开", themeAuto: "自动(系统)", shortcutCommandPalette: "命令面板", commandPalette: "命令面板", noResults: "无结果", redisCommandsReference: "Redis 命令", ungrouped: "未分组", grouped: "已分组", connectFirst: "请先连接到 Redis 服务器", searchLanguage: "搜索语言...", exportProgress: "正在导出键...", importProgress: "正在导入键...", importPreview: "预览", importOverwrite: "覆盖", importSkip: "跳过", importConflict: "如果键已存在:", noKeysToExport: "没有键可导出", time: "时间", loading: "加载中...", autoRefresh: "自动", exportSearchHint: "仅导出与当前搜索匹配的键", importSearchHint: "导入适用于整个数据库,而不仅仅是搜索结果", importNoKeys: "文件中未找到键", }, status: { dataCopied: "数据在剪贴板中", licenseSaved: "许可证已保存", exportDone: "导出完成", indexCreated: "索引已创建", indexDropped: "索引已删除", importDone: (opts) => `导入完成:${opts.created} 已创建,${opts.skipped} 已跳过,${opts.errors} 个错误`, nodeRemoved: "节点已删除", keyIsNotExisting: "此键可能已被删除或过期。", keyCount: opts => { if (opts.keyCount === 0) { return "没有任何键"; } else if (opts.keyCount === 1) { return "1 个键"; } else { return `${opts.keyCount} 键`; } }, treeExpandAll: "展开所可能的原因是,连接已删除,自动连接失败有树,该操作的代价就是有点费时...", noRedisKeys: "此数据库中没有任何键。", redisConnected: "Redis 连接成功", reloadingDataInfo: "重新加载Redis数据信息", added: "已添加", saved: "已更新", cancelled: "已取消", deleted: "已删除", savedRedis: "Redis数据已保存", redisDisconnected: opts => { return `该连接有一个错误: ${opts.error.message}`; }, dbChanged: opts => { return `db索引设置为 ${opts.db}. `; }, treeDeleted: opts => { return `该树已删除 (${opts.key}).`; }, deletedKey: opts => { return `该键已删除 (${opts.key}).`; }, renamedKey: "该键已重命名", ttlChanged: "该键TTL已被更改", notInteger: "输入值不是一个整数", persisted: "永久键", set: "键已设置/添加" }, code: { "delete-connection": "此连接已删除,因此您与此Redis实例断开连接。", "save-connection": "此连接已更改,因此您与此Redis实例断开连接。 你可以重新连接。", "readonly-connections": "连接(添加/保存/删除)只是只读!", "readonly-connection-mode": "此连接为只读模式!", "list-out-of-bounds": "此列表索引超出范围", "donation-ware-feature": "捐赠版本中提供了此功能。", "feature-pro-readonly-required": "只读连接模式需要 Pro 或 Enterprise 许可证。", "feature-pro-ssh-required": "SSH 隧道需要 Pro 或 Enterprise 许可证。", "feature-enterprise-cluster-sentinel-required": "Cluster 和 Sentinel 需要 Enterprise 许可证。", "feature-pro-json-binary-required": "Edit JSON、Upload binary 和 Download binary 需要 Pro 或 Enterprise 许可证。", "feature-pro-rejson-required": "ReJSON (JSON data type) requires Pro or Enterprise license.", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "需要授权:请先完成 HTTP Basic Auth 登录后再刷新页面。", "auto-connection-failed": "因此,可能导致连接被删除并且自动连接失败。", invalid_console_command: "此命令无法通过 GUI 运行。" }, licenseReason: { LICENSE_VALID: "许可证有效", LICENSE_INVALID: "许可证无效", LICENSE_MISSING: "未设置许可证密钥", LICENSE_DISABLED: "许可证在服务器配置中被禁用", LICENSE_NOT_FOUND: "未找到许可证", LICENSE_EXPIRED: "许可证已过期", LICENSE_CLEARED: "许可证密钥已清除", LICENSE_MAX_DEVICES_REACHED: "已达到设备席位上限", PRODUCT_MISMATCH: "许可证产品不匹配" }, licenseStatusValue: { active: "有效", deleted: "已删除", all: "全部", expired: "已过期", missing: "不存在", inactive: "未激活" }, form: { error: { required: "必填", port: "端口号范围是 1-65535", invalid: "值无效,请重新输入" }, connection: { label: { name: "连接名字", group: "分组", host: "主机名", port: "端口", password: "密码", username: "用户名" } }, treeSettings: { maxValueDisplay: "最大值显示字符串长度", maxValueDisplayInfo: "如果最大值显示为零,则显示所有内容,如果大于0,则将截断。 如果它是-1,它将不显示没有编辑字符串的值,对于其他人,它显示所有内容。", maxKeys: "最大密钥数", maxKeysInfo: "为了避免GUI崩溃,我们限制了最大密钥数。", keyCount: () => { return `键数: ${p3xr.state.keysRaw.length}`; }, label: { animation: "使用动画", noAnimation: "没有动画", jsonFormatTwoSpace: "用2个空格格式化JSON", jsonFormatFourSpace: "用4个空格格式化JSON", formName: "Redis设置", searchModeClient: "客户端搜索模式", searchModeServer: "服务端搜索模式", searchModeStartsWith: "以模式启动搜索", searchModeIncludes: "搜索包括模式" }, field: { treeSeparator: "树分隔符", treeSeparatorSelector: "树分隔符选择器", page: "树分页数", keyPageCount: "按键分页数", keysSort: "对键进行排序", searchMode: "搜索模式", searchModeStartsWith: "搜索以 / 开头" }, error: { keyPageCount: "密钥页数必须为5到100之间的整数", page: "页数必须是10 - 5000之间的整数", maxValueDisplay: "最大显示值必须是介于-1和32768之间的整数", maxKeys: "最大密钥计数值必须是100到100000之间的整数" } }, key: { label: { formName: { add: "添加新的Redis键", edit: "编辑 Redis key", append: "添加到现有的Redis键" } }, field: { streamTimestamp: "时间戳记", key: "键", type: "类型", index: "索引", hashKey: "哈希键", score: "分数", value: "值" }, error: { streamTimestamp: "时间戳是必需的,可以是Redis格式,也可以*", key: "键至少存在一个字符", hashKey: "哈希表键至少是一个字符", score: "排序的集合分数是必需的", value: "该值是必填的" } }, main: { label: { database: "DB" } } }, page: { search: { title: "搜索", index: "索引", query: "查询", results: "结果", noIndex: "未找到索引", createIndex: "创建索引", dropIndex: "删除索引", indexInfo: "索引信息", indexName: "索引名称", prefix: "键前缀(可选)", fieldName: "字段名称", }, monitor: { title: "监控", memory: "内存", opsPerSec: "操作/秒", clients: "客户端", blocked: "已阻塞", hitsMisses: "命中率", networkIo: "网络 I/O", slowLog: "慢查询日志", totalCommands: "总计", expired: "已过期", evicted: "已驱逐", clientList: "客户端列表", topKeys: "内存最大的键", killClient: "终止客户端", clientKilled: "客户端已终止", confirmKillClient: "确定要终止此客户端吗?", noKeys: "没有键", noClients: "没有客户端", }, overview: { noConnected: "没有任何连接到Redis", overviewClients: "按客户端连接计数展示所有连接", connectedCount: opt => { if (opt.length === 1) { return "1 客户端"; } return `${opt.length} 客户端`; } }, key: { label: { key: "键", encoding: "编码", length: "大小", ttl: "TTL", ttlTitle: "生存时间", type: "类型", ttlNotExpire: "不会过期", lengthString: "位元組", lengthItem: "项数", actions: "操作" }, list: { table: { index: "索引", value: "值" } }, hash: { table: { hashkey: "哈希", value: "值" } }, set: { table: { value: "成员" } }, zset: { table: { value: "成员", score: "分数" } }, stream: { table: { timestamp: "时间戳ID", field: "领域", value: "值" } } }, treeControls: { settings: "树设置", expandAll: "展开所有", collapseAll: "折叠所有", search: { search: "在键中搜索", clear: "清空当前搜索结果", placeholderClient: "客户端搜索", placeholderServer: "服务端搜索", info: `客户端搜索是匹配输入的文本,服务端搜索则遵循*{search-text}*模式搜索.对于大量数据的搜索最好在服务端进行搜索,而较小数据量可以考虑客户端搜索。如果键数超过 ${p3xr.settings.maxLightKeysCount}个的则只能在服务端搜索`, largeSetInfo: "在大型集合中,禁用客户端搜索。 所以现在只能进行服务器端搜索。", infoDetails: "要了解搜索的工作原理,请查看设置" }, pager: { next: "下一页", prev: "上一页", first: "首页", last: "末页" } } }, time: { loading: "加载中...", years: "年份", months: "个月", days: "天", year: "年", month: "月", day: "天" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON" } }; module.exports = strings; src/vendor.js000066400000000000000000000036671517666434100135310ustar00rootroot00000000000000require('./vendor.scss') // zone.js must be loaded before Angular bootstraps require('zone.js') // dayjs (replaces moment.js — 2KB vs 400KB) const dayjs = require('dayjs') const localizedFormat = require('dayjs/plugin/localizedFormat') const relativeTime = require('dayjs/plugin/relativeTime') dayjs.extend(localizedFormat) dayjs.extend(relativeTime) // Load dayjs locales require('dayjs/locale/ar') require('dayjs/locale/az') require('dayjs/locale/be') require('dayjs/locale/bg') require('dayjs/locale/bn') require('dayjs/locale/cs') require('dayjs/locale/da') require('dayjs/locale/de') require('dayjs/locale/el') require('dayjs/locale/es') require('dayjs/locale/et') require('dayjs/locale/fi') require('dayjs/locale/tl-ph') require('dayjs/locale/fr') require('dayjs/locale/he') require('dayjs/locale/hr') require('dayjs/locale/hu') require('dayjs/locale/hy-am') require('dayjs/locale/id') require('dayjs/locale/it') require('dayjs/locale/ja') require('dayjs/locale/ka') require('dayjs/locale/kk') require('dayjs/locale/km') require('dayjs/locale/ko') require('dayjs/locale/ky') require('dayjs/locale/lt') require('dayjs/locale/mk') require('dayjs/locale/ms') require('dayjs/locale/ne') require('dayjs/locale/nb') require('dayjs/locale/nl') require('dayjs/locale/pl') require('dayjs/locale/pt-br') require('dayjs/locale/pt') require('dayjs/locale/ro') require('dayjs/locale/ru') require('dayjs/locale/sk') require('dayjs/locale/sl') require('dayjs/locale/sr') require('dayjs/locale/sv') require('dayjs/locale/tg') require('dayjs/locale/th') require('dayjs/locale/tr') require('dayjs/locale/uk') require('dayjs/locale/vi') require('dayjs/locale/zh-hk') require('dayjs/locale/zh-tw') require('dayjs/locale/zh-cn') require('dayjs/locale/bs') require('dayjs/locale/si') require('dayjs/locale/sw') require('dayjs/locale/ta') global.dayjs = dayjs global.htmlEncode = require('js-htmlencode').htmlEncode // socket global.io = require('socket.io-client/dist/socket.io.js') src/vendor.scss000066400000000000000000000013521517666434100140550ustar00rootroot00000000000000// Angular Material themes (M3) for new Angular components — @use must come first // Each theme is scoped under body.p3xr-mat-theme-{name} @use './ng/themes/angular-material-themes'; @import '~material-design-icons-iconfont/dist/material-design-icons.css'; @import '~@fortawesome/fontawesome-free/css/all.css'; @import '~@fontsource/roboto/300.css'; @import '~@fontsource/roboto/400.css'; @import '~@fontsource/roboto/400-italic.css'; @import '~@fontsource/roboto/500.css'; @import '~@fontsource/roboto/700.css'; @import '~@fontsource/roboto-mono/300.css'; @import '~@fontsource/roboto-mono/400.css'; @import '~@fontsource/roboto-mono/400-italic.css'; @import '~@fontsource/roboto-mono/500.css'; @import '~@fontsource/roboto-mono/700.css'; tsconfig.json000066400000000000000000000012661517666434100136070ustar00rootroot00000000000000{ "compilerOptions": { "target": "ES2022", "module": "ES2022", "lib": ["ES2022", "DOM", "DOM.Iterable"], "moduleResolution": "bundler", "experimentalDecorators": true, "emitDecoratorMetadata": true, "allowJs": true, "sourceMap": true, "declaration": false, "rootDir": "./src", "outDir": "./dist", "typeRoots": ["node_modules/@types"], "types": ["node"], "strict": false, "noImplicitAny": false, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true }, "include": [ "src/**/*.ts" ], "exclude": [ "node_modules", "dist" ] } yarn.lock000066400000000000000000016536621517666434100127410ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@ampproject/remapping@2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@angular-devkit/architect@0.2102.5": version "0.2102.5" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.2102.5.tgz#4dd8a75e40058970c7242bdcef703cf4dccc1198" integrity sha512-9xE7G177R9G9Kte+4AtbEMlEeZUupnvdBUMVBlZRa/n4UDUyAkB/vj58KrzRCCIVQ/ypHVMwUilaDTO484dd+g== dependencies: "@angular-devkit/core" "21.2.5" rxjs "7.8.2" "@angular-devkit/build-angular@^21.2.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-21.2.5.tgz#d1fae102a10d57d844558bf118e1b0ee567b706e" integrity sha512-r07RZPM0AeYEk/VDY3JXdciUQUeSLx5C8S3ntEUmRc2OXILYIJLmuQ9ldcSQCcFeAcbTr1EYIg/iMjV0vjB4Yw== dependencies: "@ampproject/remapping" "2.3.0" "@angular-devkit/architect" "0.2102.5" "@angular-devkit/build-webpack" "0.2102.5" "@angular-devkit/core" "21.2.5" "@angular/build" "21.2.5" "@babel/core" "7.29.0" "@babel/generator" "7.29.1" "@babel/helper-annotate-as-pure" "7.27.3" "@babel/helper-split-export-declaration" "7.24.7" "@babel/plugin-transform-async-generator-functions" "7.29.0" "@babel/plugin-transform-async-to-generator" "7.28.6" "@babel/plugin-transform-runtime" "7.29.0" "@babel/preset-env" "7.29.0" "@babel/runtime" "7.28.6" "@discoveryjs/json-ext" "0.6.3" "@ngtools/webpack" "21.2.5" ansi-colors "4.1.3" autoprefixer "10.4.27" babel-loader "10.0.0" browserslist "^4.26.0" copy-webpack-plugin "14.0.0" css-loader "7.1.3" esbuild-wasm "0.27.3" http-proxy-middleware "3.0.5" istanbul-lib-instrument "6.0.3" jsonc-parser "3.3.1" karma-source-map-support "1.4.0" less "4.4.2" less-loader "12.3.1" license-webpack-plugin "4.0.2" loader-utils "3.3.1" mini-css-extract-plugin "2.10.0" open "11.0.0" ora "9.3.0" picomatch "4.0.4" piscina "5.1.4" postcss "8.5.6" postcss-loader "8.2.0" resolve-url-loader "5.0.0" rxjs "7.8.2" sass "1.97.3" sass-loader "16.0.7" semver "7.7.4" source-map-loader "5.0.0" source-map-support "0.5.21" terser "5.46.0" tinyglobby "0.2.15" tree-kill "1.2.2" tslib "2.8.1" webpack "5.105.2" webpack-dev-middleware "7.4.5" webpack-dev-server "5.2.3" webpack-merge "6.0.1" webpack-subresource-integrity "5.1.0" optionalDependencies: esbuild "0.27.3" "@angular-devkit/build-webpack@0.2102.5": version "0.2102.5" resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.2102.5.tgz#b0c68bc67167f3aee59bae639654cd56991c8a5c" integrity sha512-DBhMEbPD7scUXjoA/43f/6tS6PckIWkY15LldAEWwxbJqRUokMLfnuX21+pv+RETGrIKOQuXxZgLFeQYpodGfA== dependencies: "@angular-devkit/architect" "0.2102.5" rxjs "7.8.2" "@angular-devkit/core@21.2.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-21.2.5.tgz#cac97c40d98d408017c3a47982da1cff4cfeda2e" integrity sha512-9z9w7UxKKVmib5QHFZTOfJpAiSudqQwwEZFpQy31yaXR3tJw85xO5owi+66sgTpEvNh9Ix2THhcUq//ToP/0VA== dependencies: ajv "8.18.0" ajv-formats "3.0.1" jsonc-parser "3.3.1" picomatch "4.0.4" rxjs "7.8.2" source-map "0.7.6" "@angular/animations@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-21.2.6.tgz#652249503c101945144dfc4ccffcdca4676f4e69" integrity sha512-SPzTOlkyVagPdb7OMe9hw3dnpMGq2p/nADatzNfRUMXwit8AU8VaiPIrFRsCD52sAL1zDDj60gKsk/dprzIyFA== dependencies: tslib "^2.3.0" "@angular/build@21.2.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@angular/build/-/build-21.2.5.tgz#30858cc5781e1f58ce9fc0a0238be6ccec0cb552" integrity sha512-AfE09K+pkgS3VB84R74XG/XB9LQmO6Q6YfpssjDwMnWGwDGGwUGydXn8AKdhnhI4mM2nFKoe+QYszFgrzu5HeQ== dependencies: "@ampproject/remapping" "2.3.0" "@angular-devkit/architect" "0.2102.5" "@babel/core" "7.29.0" "@babel/helper-annotate-as-pure" "7.27.3" "@babel/helper-split-export-declaration" "7.24.7" "@inquirer/confirm" "5.1.21" "@vitejs/plugin-basic-ssl" "2.1.4" beasties "0.4.1" browserslist "^4.26.0" esbuild "0.27.3" https-proxy-agent "7.0.6" istanbul-lib-instrument "6.0.3" jsonc-parser "3.3.1" listr2 "9.0.5" magic-string "0.30.21" mrmime "2.0.1" parse5-html-rewriting-stream "8.0.0" picomatch "4.0.4" piscina "5.1.4" rolldown "1.0.0-rc.4" sass "1.97.3" semver "7.7.4" source-map-support "0.5.21" tinyglobby "0.2.15" undici "7.24.4" vite "7.3.1" watchpack "2.5.1" optionalDependencies: lmdb "3.5.1" "@angular/cdk@^21.2.4": version "21.2.4" resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-21.2.4.tgz#4d371810019fc0bd3375692f3c7f08a85531beac" integrity sha512-Zv+q9Z/wVWTt0ckuO3gnU7PbpCLTr1tKPEsofLGGzDufA5/85aBLn2UiLcjlY6wQ+V3EMqANhGo/8XJgvBEYFA== dependencies: parse5 "^8.0.0" tslib "^2.3.0" "@angular/common@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/common/-/common-21.2.6.tgz#916d3b47bb092eafabc5f34bed4845e42fd05318" integrity sha512-2FcpZ1h6AZ4JwCIlnpHCYrbRTGQTOj/RFXkuX/qw7K6cFmJGfWFMmr++xWtHZEvUddfbR9hqDo+v1mkqEKE/Kw== dependencies: tslib "^2.3.0" "@angular/compiler-cli@^21.2.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-21.2.6.tgz#642de3ba50fd838e41ca6eb412690d925ff9c1b0" integrity sha512-CiPmat4+D+hWXMTAY++09WeII/5D0r6iTjdLdaTq8tlo0uJcrOlazib4CpA94kJ2CRdzfhmC1H+ttwBI1xIlTg== dependencies: "@babel/core" "7.29.0" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^5.0.0" convert-source-map "^1.5.1" reflect-metadata "^0.2.0" semver "^7.0.0" tslib "^2.3.0" yargs "^18.0.0" "@angular/compiler@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-21.2.6.tgz#3060747d3a4a2127cd3c23ec3d6f9d2af832ca00" integrity sha512-shGkb/aAIPbG8oSYkVJ0msGlRdDVcJBVaUVx2KenMltifQjfLn5N8DFMAzOR6haaA3XeugFExxKqmvySjrVq+A== dependencies: tslib "^2.3.0" "@angular/core@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/core/-/core-21.2.6.tgz#94ad32c803a7f7c1d5ea41aa38c0b75de6e4e034" integrity sha512-svgK5DhFlQlS+sMybXftn08rHHRiDGY/uIKT5LZUaKgyffnkPb8uClpMIW0NzANtU8qs8pwgDZFoJw85Ia3oqQ== dependencies: tslib "^2.3.0" "@angular/forms@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-21.2.6.tgz#7dc06ab6a36095a2897fa93fcf834d968878a7fa" integrity sha512-i8BoWxBAm0g2xOMcQ8wTdj07gqMPIFYIyefCOo0ezcGj5XhYjd+C2UrYnKsup0aMZqqEAO1l2aZbmfHx9xLheQ== dependencies: "@standard-schema/spec" "^1.0.0" tslib "^2.3.0" "@angular/material@^21.2.4": version "21.2.4" resolved "https://registry.yarnpkg.com/@angular/material/-/material-21.2.4.tgz#b433e78bfb3167198708909e0eb40cb10dee6157" integrity sha512-YzkPjgZezdsDeAhSm3zix2h+ohApwaRUMG8ea/75XR1eSkT1n3N7qZaHC8HDkhPYApk8a951RDxsTiiAidnGqg== dependencies: tslib "^2.3.0" "@angular/platform-browser-dynamic@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.6.tgz#2a99332ebc39d2bbd4c32c2d464c36d7b72d35e2" integrity sha512-6a+zA9jM70b1kH3fSfAJIEVmkE3qB3oIXw7otWkv1nEhOJtNO0mM0dTUuO70C3GhnV9tmpLXa2him56C2LhVig== dependencies: tslib "^2.3.0" "@angular/platform-browser@^21": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-21.2.6.tgz#6e7d3e42b0971c4e1d4c97f1b8071165518ee100" integrity sha512-LW1vPXVHvy71LBahn+fSzPlWQl25kJIdcXq+ptG7HsMVgbPQ3/vvkKXAHYaRdppLGCFL+v+3dQGHYLNLiYL9qg== dependencies: tslib "^2.3.0" "@angular/router@^21.2.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/router/-/router-21.2.6.tgz#52b36485950717a1dfdc16660de709d5321febc2" integrity sha512-0ajhkKYeOqHQEEH88+Q0HrheR3helwTvdTqD/0gTaapCe+HOoC+SYwmzzsYP2zwAxBNQEg4JHOGKQ30X9/gwgw== dependencies: tslib "^2.3.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: "@babel/helper-validator-identifier" "^7.28.5" js-tokens "^4.0.0" picocolors "^1.1.1" "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" "@babel/compat-data@^7.27.2": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.7.tgz#7fd698e531050cce432b073ab64857b99e0f3804" integrity sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ== "@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== "@babel/core@7.29.0", "@babel/core@^7.23.9", "@babel/core@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== dependencies: "@babel/code-frame" "^7.29.0" "@babel/generator" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-module-transforms" "^7.28.6" "@babel/helpers" "^7.28.6" "@babel/parser" "^7.29.0" "@babel/template" "^7.28.6" "@babel/traverse" "^7.29.0" "@babel/types" "^7.29.0" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" "@babel/generator@7.29.1", "@babel/generator@^7.29.0": version "7.29.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: "@babel/parser" "^7.29.0" "@babel/types" "^7.29.0" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" "@babel/generator@^7.27.5": version "7.27.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== dependencies: "@babel/parser" "^7.27.5" "@babel/types" "^7.27.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" "@babel/generator@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== dependencies: "@babel/parser" "^7.28.5" "@babel/types" "^7.28.5" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" "@babel/helper-annotate-as-pure@7.27.3", "@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": version "7.27.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: "@babel/types" "^7.27.3" "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz" integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: "@babel/types" "^7.25.9" "@babel/helper-compilation-targets@^7.27.1": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: "@babel/compat-data" "^7.27.2" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-compilation-targets@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== dependencies: "@babel/compat-data" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-member-expression-to-functions" "^7.28.5" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/helper-replace-supers" "^7.28.6" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/traverse" "^7.28.6" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6": version "7.26.3" resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz" integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== dependencies: "@babel/helper-annotate-as-pure" "^7.27.1" regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" regexpu-core "^6.3.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" debug "^4.4.3" lodash.debounce "^4.0.8" resolve "^1.22.11" "@babel/helper-define-polyfill-provider@^0.6.7": version "0.6.7" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz#8d01cba97de419115ad3497573a476db15dc6c6a" integrity sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w== dependencies: "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" debug "^4.4.3" lodash.debounce "^4.0.8" resolve "^1.22.11" "@babel/helper-globals@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@babel/helper-member-expression-to-functions@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== dependencies: "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-member-expression-to-functions@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== dependencies: "@babel/traverse" "^7.28.5" "@babel/types" "^7.28.5" "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-module-imports@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== dependencies: "@babel/traverse" "^7.28.6" "@babel/types" "^7.28.6" "@babel/helper-module-transforms@^7.27.1": version "7.27.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.27.3" "@babel/helper-module-transforms@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== dependencies: "@babel/helper-module-imports" "^7.28.6" "@babel/helper-validator-identifier" "^7.28.5" "@babel/traverse" "^7.28.6" "@babel/helper-optimise-call-expression@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== dependencies: "@babel/types" "^7.27.1" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-plugin-utils@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== "@babel/helper-remap-async-to-generator@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== dependencies: "@babel/helper-annotate-as-pure" "^7.27.1" "@babel/helper-wrap-function" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/helper-replace-supers@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== dependencies: "@babel/helper-member-expression-to-functions" "^7.27.1" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/helper-replace-supers@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== dependencies: "@babel/helper-member-expression-to-functions" "^7.28.5" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.28.6" "@babel/helper-skip-transparent-expression-wrappers@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== dependencies: "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-split-export-declaration@7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== dependencies: "@babel/types" "^7.24.7" "@babel/helper-string-parser@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@babel/helper-validator-identifier@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helper-wrap-function@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz#b88285009c31427af318d4fe37651cd62a142409" integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== dependencies: "@babel/template" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helpers@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== dependencies: "@babel/template" "^7.28.6" "@babel/types" "^7.28.6" "@babel/parser@^7.23.9": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== dependencies: "@babel/types" "^7.29.0" "@babel/parser@^7.27.2", "@babel/parser@^7.27.5", "@babel/parser@^7.27.7": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.7.tgz#1687f5294b45039c159730e3b9c1f1b242e425e9" integrity sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q== dependencies: "@babel/types" "^7.27.7" "@babel/parser@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: "@babel/types" "^7.28.5" "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== dependencies: "@babel/types" "^7.29.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-optional-chaining" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f" integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/traverse" "^7.28.6" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-import-assertions@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-syntax-import-attributes@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-arrow-functions@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-async-generator-functions@7.29.0", "@babel/plugin-transform-async-generator-functions@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/traverse" "^7.29.0" "@babel/plugin-transform-async-to-generator@7.28.6", "@babel/plugin-transform-async-to-generator@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77" integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g== dependencies: "@babel/helper-module-imports" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/plugin-transform-block-scoped-functions@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-block-scoping@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-class-properties@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72" integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw== dependencies: "@babel/helper-create-class-features-plugin" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-class-static-block@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-classes@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-globals" "^7.28.0" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-replace-supers" "^7.28.6" "@babel/traverse" "^7.28.6" "@babel/plugin-transform-computed-properties@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/template" "^7.28.6" "@babel/plugin-transform-destructuring@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.28.5" "@babel/plugin-transform-dotall-regex@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61" integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-duplicate-keys@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-dynamic-import@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-explicit-resource-management@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-exponentiation-operator@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091" integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-export-namespace-from@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-for-of@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-function-name@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== dependencies: "@babel/helper-compilation-targets" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/plugin-transform-json-strings@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038" integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-literals@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-logical-assignment-operators@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605" integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-member-expression-literals@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-amd@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== dependencies: "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-commonjs@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1" integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA== dependencies: "@babel/helper-module-transforms" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-modules-systemjs@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz#e458a95a17807c415924106a3ff188a3b8dee964" integrity sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ== dependencies: "@babel/helper-module-transforms" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-validator-identifier" "^7.28.5" "@babel/traverse" "^7.29.0" "@babel/plugin-transform-modules-umd@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== dependencies: "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-new-target@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757" integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-numeric-separator@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f" integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-object-rest-spread@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7" integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA== dependencies: "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/traverse" "^7.28.6" "@babel/plugin-transform-object-super@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" "@babel/plugin-transform-optional-catch-binding@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c" integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-optional-chaining@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-optional-chaining@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd" integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-parameters@^7.27.7": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-private-methods@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411" integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== dependencies: "@babel/helper-create-class-features-plugin" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-private-property-in-object@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811" integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-create-class-features-plugin" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-property-literals@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regenerator@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-regexp-modifiers@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b" integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-reserved-words@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-runtime@7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== dependencies: "@babel/helper-module-imports" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-spread@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== dependencies: "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-sticky-regex@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-template-literals@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-typeof-symbol@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-escapes@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-property-regex@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821" integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-transform-unicode-regex@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e" integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" "@babel/preset-env@7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.0.tgz#c55db400c515a303662faaefd2d87e796efa08d0" integrity sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w== dependencies: "@babel/compat-data" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-import-assertions" "^7.28.6" "@babel/plugin-syntax-import-attributes" "^7.28.6" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.27.1" "@babel/plugin-transform-async-generator-functions" "^7.29.0" "@babel/plugin-transform-async-to-generator" "^7.28.6" "@babel/plugin-transform-block-scoped-functions" "^7.27.1" "@babel/plugin-transform-block-scoping" "^7.28.6" "@babel/plugin-transform-class-properties" "^7.28.6" "@babel/plugin-transform-class-static-block" "^7.28.6" "@babel/plugin-transform-classes" "^7.28.6" "@babel/plugin-transform-computed-properties" "^7.28.6" "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-dotall-regex" "^7.28.6" "@babel/plugin-transform-duplicate-keys" "^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-dynamic-import" "^7.27.1" "@babel/plugin-transform-explicit-resource-management" "^7.28.6" "@babel/plugin-transform-exponentiation-operator" "^7.28.6" "@babel/plugin-transform-export-namespace-from" "^7.27.1" "@babel/plugin-transform-for-of" "^7.27.1" "@babel/plugin-transform-function-name" "^7.27.1" "@babel/plugin-transform-json-strings" "^7.28.6" "@babel/plugin-transform-literals" "^7.27.1" "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" "@babel/plugin-transform-member-expression-literals" "^7.27.1" "@babel/plugin-transform-modules-amd" "^7.27.1" "@babel/plugin-transform-modules-commonjs" "^7.28.6" "@babel/plugin-transform-modules-systemjs" "^7.29.0" "@babel/plugin-transform-modules-umd" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-new-target" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" "@babel/plugin-transform-numeric-separator" "^7.28.6" "@babel/plugin-transform-object-rest-spread" "^7.28.6" "@babel/plugin-transform-object-super" "^7.27.1" "@babel/plugin-transform-optional-catch-binding" "^7.28.6" "@babel/plugin-transform-optional-chaining" "^7.28.6" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/plugin-transform-private-methods" "^7.28.6" "@babel/plugin-transform-private-property-in-object" "^7.28.6" "@babel/plugin-transform-property-literals" "^7.27.1" "@babel/plugin-transform-regenerator" "^7.29.0" "@babel/plugin-transform-regexp-modifiers" "^7.28.6" "@babel/plugin-transform-reserved-words" "^7.27.1" "@babel/plugin-transform-shorthand-properties" "^7.27.1" "@babel/plugin-transform-spread" "^7.28.6" "@babel/plugin-transform-sticky-regex" "^7.27.1" "@babel/plugin-transform-template-literals" "^7.27.1" "@babel/plugin-transform-typeof-symbol" "^7.27.1" "@babel/plugin-transform-unicode-escapes" "^7.27.1" "@babel/plugin-transform-unicode-property-regex" "^7.28.6" "@babel/plugin-transform-unicode-regex" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.15" babel-plugin-polyfill-corejs3 "^0.14.0" babel-plugin-polyfill-regenerator "^0.6.6" core-js-compat "^3.48.0" semver "^6.3.1" "@babel/preset-env@^7.29.2": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.2.tgz#5a173f22c7d8df362af1c9fe31facd320de4a86c" integrity sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw== dependencies: "@babel/compat-data" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-import-assertions" "^7.28.6" "@babel/plugin-syntax-import-attributes" "^7.28.6" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.27.1" "@babel/plugin-transform-async-generator-functions" "^7.29.0" "@babel/plugin-transform-async-to-generator" "^7.28.6" "@babel/plugin-transform-block-scoped-functions" "^7.27.1" "@babel/plugin-transform-block-scoping" "^7.28.6" "@babel/plugin-transform-class-properties" "^7.28.6" "@babel/plugin-transform-class-static-block" "^7.28.6" "@babel/plugin-transform-classes" "^7.28.6" "@babel/plugin-transform-computed-properties" "^7.28.6" "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-dotall-regex" "^7.28.6" "@babel/plugin-transform-duplicate-keys" "^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-dynamic-import" "^7.27.1" "@babel/plugin-transform-explicit-resource-management" "^7.28.6" "@babel/plugin-transform-exponentiation-operator" "^7.28.6" "@babel/plugin-transform-export-namespace-from" "^7.27.1" "@babel/plugin-transform-for-of" "^7.27.1" "@babel/plugin-transform-function-name" "^7.27.1" "@babel/plugin-transform-json-strings" "^7.28.6" "@babel/plugin-transform-literals" "^7.27.1" "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" "@babel/plugin-transform-member-expression-literals" "^7.27.1" "@babel/plugin-transform-modules-amd" "^7.27.1" "@babel/plugin-transform-modules-commonjs" "^7.28.6" "@babel/plugin-transform-modules-systemjs" "^7.29.0" "@babel/plugin-transform-modules-umd" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" "@babel/plugin-transform-new-target" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" "@babel/plugin-transform-numeric-separator" "^7.28.6" "@babel/plugin-transform-object-rest-spread" "^7.28.6" "@babel/plugin-transform-object-super" "^7.27.1" "@babel/plugin-transform-optional-catch-binding" "^7.28.6" "@babel/plugin-transform-optional-chaining" "^7.28.6" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/plugin-transform-private-methods" "^7.28.6" "@babel/plugin-transform-private-property-in-object" "^7.28.6" "@babel/plugin-transform-property-literals" "^7.27.1" "@babel/plugin-transform-regenerator" "^7.29.0" "@babel/plugin-transform-regexp-modifiers" "^7.28.6" "@babel/plugin-transform-reserved-words" "^7.27.1" "@babel/plugin-transform-shorthand-properties" "^7.27.1" "@babel/plugin-transform-spread" "^7.28.6" "@babel/plugin-transform-sticky-regex" "^7.27.1" "@babel/plugin-transform-template-literals" "^7.27.1" "@babel/plugin-transform-typeof-symbol" "^7.27.1" "@babel/plugin-transform-unicode-escapes" "^7.27.1" "@babel/plugin-transform-unicode-property-regex" "^7.28.6" "@babel/plugin-transform-unicode-regex" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.15" babel-plugin-polyfill-corejs3 "^0.14.0" babel-plugin-polyfill-regenerator "^0.6.6" core-js-compat "^3.48.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/runtime@7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== "@babel/template@^7.27.1", "@babel/template@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: "@babel/code-frame" "^7.27.1" "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" "@babel/template@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== dependencies: "@babel/code-frame" "^7.28.6" "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.7.tgz#8355c39be6818362eace058cf7f3e25ac2ec3b55" integrity sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw== dependencies: "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.27.5" "@babel/parser" "^7.27.7" "@babel/template" "^7.27.2" "@babel/types" "^7.27.7" debug "^4.3.1" globals "^11.1.0" "@babel/traverse@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== dependencies: "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.5" "@babel/helper-globals" "^7.28.0" "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" "@babel/types" "^7.28.5" debug "^4.3.1" "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: "@babel/code-frame" "^7.29.0" "@babel/generator" "^7.29.0" "@babel/helper-globals" "^7.28.0" "@babel/parser" "^7.29.0" "@babel/template" "^7.28.6" "@babel/types" "^7.29.0" debug "^4.3.1" "@babel/types@^7.24.7", "@babel/types@^7.28.6", "@babel/types@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" "@babel/types@^7.25.9", "@babel/types@^7.4.4": version "7.26.3" resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz" integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.7": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.7.tgz#40eabd562049b2ee1a205fa589e629f945dce20f" integrity sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" "@babel/types@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" "@codemirror/autocomplete@^6.0.0": version "6.20.1" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz#4cfbc8b2e1e25f890ec34a081037e58b4e44143e" integrity sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.17.0" "@lezer/common" "^1.0.0" "@codemirror/commands@^6.0.0": version "6.10.3" resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.10.3.tgz#01877060befdec352e8300dec1f185489c300635" integrity sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.6.0" "@codemirror/view" "^6.27.0" "@lezer/common" "^1.1.0" "@codemirror/lang-json@^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.2.tgz#054b160671306667e25d80385286049841836179" integrity sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ== dependencies: "@codemirror/language" "^6.0.0" "@lezer/json" "^1.0.0" "@codemirror/language@^6.0.0": version "6.12.3" resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.12.3.tgz#0b220182973a4c19850b29f7dd82aec1bbae3d7e" integrity sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.23.0" "@lezer/common" "^1.5.0" "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" style-mod "^4.0.0" "@codemirror/lint@^6.0.0": version "6.9.5" resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.5.tgz#c7da006f3335a33014799a7375c82df558e89f90" integrity sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.35.0" crelt "^1.0.5" "@codemirror/search@^6.0.0": version "6.6.0" resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.6.0.tgz#3b83a1e35391e1575a83a3b485e3f95263ddaa0b" integrity sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.37.0" crelt "^1.0.5" "@codemirror/state@^6.0.0", "@codemirror/state@^6.6.0": version "6.6.0" resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.6.0.tgz#b88dbdc14aea4ace3c6d67bb77fe28bb84e4394e" integrity sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ== dependencies: "@marijn/find-cluster-break" "^1.0.0" "@codemirror/theme-one-dark@^6.1.3": version "6.1.3" resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz#1dbb73f6e73c53c12ad2aed9f48c263c4e63ea37" integrity sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" "@lezer/highlight" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0": version "6.40.0" resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.40.0.tgz#97198fd717ebf471ef594a5bd557a9f2d1d4d165" integrity sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg== dependencies: "@codemirror/state" "^6.6.0" crelt "^1.0.6" style-mod "^4.1.0" w3c-keyname "^2.2.4" "@codemirror/view@^6.41.0": version "6.41.0" resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.41.0.tgz#482cbcb5f8f90131908e5f9c0e2f4681e0684db0" integrity sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA== dependencies: "@codemirror/state" "^6.6.0" crelt "^1.0.6" style-mod "^4.1.0" w3c-keyname "^2.2.4" "@discoveryjs/json-ext@0.6.3", "@discoveryjs/json-ext@^0.6.3": version "0.6.3" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== "@discoveryjs/json-ext@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-1.0.0.tgz#f75c08f88cfd9eb8d9b062284d5bbcc60c41bf2a" integrity sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ== "@esbuild/aix-ppc64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== "@esbuild/aix-ppc64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz#4c585002f7ad694d38fe0e8cbf5cfd939ccff327" integrity sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q== "@esbuild/android-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== "@esbuild/android-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz#7625d0952c3b402d3ede203a16c9f2b78f8a4827" integrity sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw== "@esbuild/android-arm@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== "@esbuild/android-arm@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.4.tgz#9a0cf1d12997ec46dddfb32ce67e9bca842381ac" integrity sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ== "@esbuild/android-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== "@esbuild/android-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.4.tgz#06e1fdc6283fccd6bc6aadd6754afce6cf96f42e" integrity sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw== "@esbuild/darwin-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== "@esbuild/darwin-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz#6c550ee6c0273bcb0fac244478ff727c26755d80" integrity sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ== "@esbuild/darwin-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== "@esbuild/darwin-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz#ed7a125e9f25ce0091b9aff783ee943f6ba6cb86" integrity sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw== "@esbuild/freebsd-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== "@esbuild/freebsd-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz#597dc8e7161dba71db4c1656131c1f1e9d7660c6" integrity sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw== "@esbuild/freebsd-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== "@esbuild/freebsd-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz#ea171f9f4f00efaa8e9d3fe8baa1b75d757d1b36" integrity sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ== "@esbuild/linux-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== "@esbuild/linux-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz#e52d57f202369386e6dbcb3370a17a0491ab1464" integrity sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA== "@esbuild/linux-arm@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== "@esbuild/linux-arm@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz#5e0c0b634908adbce0a02cebeba8b3acac263fb6" integrity sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg== "@esbuild/linux-ia32@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== "@esbuild/linux-ia32@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz#5f90f01f131652473ec06b038a14c49683e14ec7" integrity sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA== "@esbuild/linux-loong64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== "@esbuild/linux-loong64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz#63bacffdb99574c9318f9afbd0dd4fff76a837e3" integrity sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA== "@esbuild/linux-mips64el@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== "@esbuild/linux-mips64el@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz#c4b6952eca6a8efff67fee3671a3536c8e67b7eb" integrity sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw== "@esbuild/linux-ppc64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== "@esbuild/linux-ppc64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz#6dea67d3d98c6986f1b7769e4f1848e5ae47ad58" integrity sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA== "@esbuild/linux-riscv64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== "@esbuild/linux-riscv64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz#9ad2b4c3c0502c6bada9c81997bb56c597853489" integrity sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw== "@esbuild/linux-s390x@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== "@esbuild/linux-s390x@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz#c43d3cfd073042ca6f5c52bb9bc313ed2066ce28" integrity sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA== "@esbuild/linux-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== "@esbuild/linux-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz#45fa173e0591ac74d80d3cf76704713e14e2a4a6" integrity sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA== "@esbuild/netbsd-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== "@esbuild/netbsd-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz#366b0ef40cdb986fc751cbdad16e8c25fe1ba879" integrity sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q== "@esbuild/netbsd-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== "@esbuild/netbsd-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz#e985d49a3668fd2044343071d52e1ae815112b3e" integrity sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg== "@esbuild/openbsd-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== "@esbuild/openbsd-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz#6fb4ab7b73f7e5572ce5ec9cf91c13ff6dd44842" integrity sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow== "@esbuild/openbsd-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== "@esbuild/openbsd-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz#641f052040a0d79843d68898f5791638a026d983" integrity sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ== "@esbuild/openharmony-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== "@esbuild/openharmony-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz#fc1d33eac9d81ae0a433b3ed1dd6171a20d4e317" integrity sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg== "@esbuild/sunos-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== "@esbuild/sunos-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz#af2cd5ca842d6d057121f66a192d4f797de28f53" integrity sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g== "@esbuild/win32-arm64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== "@esbuild/win32-arm64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz#78ec7e59bb06404583d4c9511e621db31c760de3" integrity sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg== "@esbuild/win32-ia32@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== "@esbuild/win32-ia32@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz#0e616aa488b7ee5d2592ab070ff9ec06a9fddf11" integrity sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw== "@esbuild/win32-x64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== "@esbuild/win32-x64@0.27.4": version "0.27.4" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz#1f7ba71a3d6155d44a6faa8dbe249c62ab3e408c" integrity sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg== "@fontsource/roboto-mono@^5.2.8": version "5.2.8" resolved "https://registry.yarnpkg.com/@fontsource/roboto-mono/-/roboto-mono-5.2.8.tgz#b77a6e3f6c0329ed2d762f0aa9c9ea4740bc4ff5" integrity sha512-M0XPRcvkOKiTPooXwX7yJSNpuad3CPcQwsADBfnopz3apBs+VKI47pc42mlvAxJjNTRauu5rndSxHc8F52bR7Q== "@fontsource/roboto@^5.2.10": version "5.2.10" resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.2.10.tgz#b985d34de475913b41d0fb57e2dcd0b16ab9ecb5" integrity sha512-8HlA5FtSfz//oFSr2eL7GFXAiE7eIkcGOtx7tjsLKq+as702x9+GU7K95iDeWFapHC4M2hv9RrpXKRTGGBI8Zg== "@fortawesome/fontawesome-free@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d" integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg== "@harperfast/extended-iterable@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz#471489c5058331017e821bf6c33de70fc2c073ee" integrity sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw== "@inquirer/ansi@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== "@inquirer/confirm@5.1.21": version "5.1.21" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== dependencies: "@inquirer/core" "^10.3.2" "@inquirer/type" "^3.0.10" "@inquirer/core@^10.3.2": version "10.3.2" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== dependencies: "@inquirer/ansi" "^1.0.2" "@inquirer/figures" "^1.0.15" "@inquirer/type" "^3.0.10" cli-width "^4.1.0" mute-stream "^2.0.0" signal-exit "^4.1.0" wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.3" "@inquirer/figures@^1.0.15": version "1.0.15" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== "@inquirer/type@^3.0.10": version "3.0.10" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" string-width-cjs "npm:string-width@^4.2.0" strip-ansi "^7.0.1" strip-ansi-cjs "npm:strip-ansi@^6.0.1" wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@isaacs/fs-minipass@^4.0.0": version "4.0.1" resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== dependencies: minipass "^7.0.4" "@isaacs/string-locale-compare@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz" integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/pattern@30.0.1": version "30.0.1" resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f" integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== dependencies: "@types/node" "*" jest-regex-util "30.0.1" "@jest/schemas@30.0.5": version "30.0.5" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== dependencies: "@sinclair/typebox" "^0.34.0" "@jest/types@30.2.0": version "30.2.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8" integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== dependencies: "@jest/pattern" "30.0.1" "@jest/schemas" "30.0.5" "@types/istanbul-lib-coverage" "^2.0.6" "@types/istanbul-reports" "^3.0.4" "@types/node" "*" "@types/yargs" "^17.0.33" chalk "^4.1.2" "@jridgewell/gen-mapping@^0.3.12": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/remapping@^2.3.5": version "2.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": version "0.3.6" resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@jsonjoy.com/base64@17.67.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-17.67.0.tgz#7eeda3cb41138d77a90408fd2e42b2aba10576d7" integrity sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw== "@jsonjoy.com/base64@^1.1.1", "@jsonjoy.com/base64@^1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz" integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== "@jsonjoy.com/buffers@17.67.0", "@jsonjoy.com/buffers@^17.65.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz#5c58dbcdeea8824ce296bd1cfce006c2eb167b3d" integrity sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw== "@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz#8d99c7f67eaf724d3428dfd9826c6455266a5c83" integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== "@jsonjoy.com/codegen@17.67.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz#3635fd8769d77e19b75dc5574bc9756019b2e591" integrity sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q== "@jsonjoy.com/codegen@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== "@jsonjoy.com/fs-core@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.57.1.tgz#03c0d7a7bf96030376f7194b9c5c815cb7bf71d7" integrity sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA== dependencies: "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node-utils" "4.57.1" thingies "^2.5.0" "@jsonjoy.com/fs-fsa@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.1.tgz#87ffa6cd695b363b58b9ccddc87a66212a1b25fd" integrity sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA== dependencies: "@jsonjoy.com/fs-core" "4.57.1" "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node-utils" "4.57.1" thingies "^2.5.0" "@jsonjoy.com/fs-node-builtins@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.1.tgz#a6793654d6ffaead81f040e3becc063a265deb7c" integrity sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og== "@jsonjoy.com/fs-node-to-fsa@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.1.tgz#9011872df67ac302f0b0f7fd13502993a026c306" integrity sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg== dependencies: "@jsonjoy.com/fs-fsa" "4.57.1" "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node-utils" "4.57.1" "@jsonjoy.com/fs-node-utils@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.1.tgz#e9d030b676f7f4074eb90a42927bac708dc4312c" integrity sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw== dependencies: "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.57.1.tgz#3dae969fe02d9450f5dfc7c12bfe3b859cb1038e" integrity sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ== dependencies: "@jsonjoy.com/fs-core" "4.57.1" "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node-utils" "4.57.1" "@jsonjoy.com/fs-print" "4.57.1" "@jsonjoy.com/fs-snapshot" "4.57.1" glob-to-regex.js "^1.0.0" thingies "^2.5.0" "@jsonjoy.com/fs-print@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.57.1.tgz#59359be175145cd44e83f7cdfba06cb1fed23313" integrity sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw== dependencies: "@jsonjoy.com/fs-node-utils" "4.57.1" tree-dump "^1.1.0" "@jsonjoy.com/fs-snapshot@4.57.1": version "4.57.1" resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.1.tgz#54cd9073a97e290a1650070f2ee9529a0accdb93" integrity sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg== dependencies: "@jsonjoy.com/buffers" "^17.65.0" "@jsonjoy.com/fs-node-utils" "4.57.1" "@jsonjoy.com/json-pack" "^17.65.0" "@jsonjoy.com/util" "^17.65.0" "@jsonjoy.com/json-pack@^1.0.3": version "1.1.1" resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz" integrity sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw== dependencies: "@jsonjoy.com/base64" "^1.1.1" "@jsonjoy.com/util" "^1.1.2" hyperdyperid "^1.2.0" thingies "^1.20.0" "@jsonjoy.com/json-pack@^1.11.0": version "1.21.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz#93f8dd57fe3a3a92132b33d1eb182dcd9e7629fa" integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== dependencies: "@jsonjoy.com/base64" "^1.1.2" "@jsonjoy.com/buffers" "^1.2.0" "@jsonjoy.com/codegen" "^1.0.0" "@jsonjoy.com/json-pointer" "^1.0.2" "@jsonjoy.com/util" "^1.9.0" hyperdyperid "^1.2.0" thingies "^2.5.0" tree-dump "^1.1.0" "@jsonjoy.com/json-pack@^17.65.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz#8dd8ff65dd999c5d4d26df46c63915c7bdec093a" integrity sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w== dependencies: "@jsonjoy.com/base64" "17.67.0" "@jsonjoy.com/buffers" "17.67.0" "@jsonjoy.com/codegen" "17.67.0" "@jsonjoy.com/json-pointer" "17.67.0" "@jsonjoy.com/util" "17.67.0" hyperdyperid "^1.2.0" thingies "^2.5.0" tree-dump "^1.1.0" "@jsonjoy.com/json-pointer@17.67.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz#74439573dc046e0c9a3a552fb94b391bc75313b8" integrity sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA== dependencies: "@jsonjoy.com/util" "17.67.0" "@jsonjoy.com/json-pointer@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== dependencies: "@jsonjoy.com/codegen" "^1.0.0" "@jsonjoy.com/util" "^1.9.0" "@jsonjoy.com/util@17.67.0", "@jsonjoy.com/util@^17.65.0": version "17.67.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-17.67.0.tgz#7c4288fc3808233e55c7610101e7bb4590cddd3f" integrity sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew== dependencies: "@jsonjoy.com/buffers" "17.67.0" "@jsonjoy.com/codegen" "17.67.0" "@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0": version "1.5.0" resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz" integrity sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA== "@jsonjoy.com/util@^1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== dependencies: "@jsonjoy.com/buffers" "^1.0.0" "@jsonjoy.com/codegen" "^1.0.0" "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@lezer/common@^1.0.0", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0": version "1.5.1" resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.1.tgz#6e8c114ff5d36a41148e146a253734d3bb8807d3" integrity sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw== "@lezer/highlight@^1.0.0": version "1.2.3" resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.3.tgz#a20f324b71148a2ea9ba6ff42e58bbfaec702857" integrity sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g== dependencies: "@lezer/common" "^1.3.0" "@lezer/json@^1.0.0": version "1.0.3" resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.3.tgz#e773a012ad0088fbf07ce49cfba875cc9e5bc05f" integrity sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" "@lezer/lr@^1.0.0": version "1.4.8" resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.8.tgz#333de9bc9346057323ff09beb4cda47ccc38a498" integrity sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA== dependencies: "@lezer/common" "^1.0.0" "@lmdb/lmdb-darwin-arm64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.1.tgz#b1fe8b88fa023ccbf5800b1e630285b7eab1538f" integrity sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ== "@lmdb/lmdb-darwin-x64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.5.1.tgz#ab5c9937d2019563227291a22aa7e140481eb5eb" integrity sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w== "@lmdb/lmdb-linux-arm64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.5.1.tgz#e05fce5ae4b40990052e184038c8f29a75565e00" integrity sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg== "@lmdb/lmdb-linux-arm@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.5.1.tgz#95cb7e1186d6f57a7b1b0da4f7bd459eeb1ce812" integrity sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A== "@lmdb/lmdb-linux-x64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.5.1.tgz#8f289fbd336357c22ba0218449d863020b74cacd" integrity sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g== "@lmdb/lmdb-win32-arm64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.5.1.tgz#c667bf2adb59d69a5ecd5986b7898a35925182de" integrity sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w== "@lmdb/lmdb-win32-x64@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.5.1.tgz#da0f989e868d2ce02c9ed24c082f561354ab4d0f" integrity sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg== "@marijn/find-cluster-break@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== "@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== "@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== "@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== "@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== "@napi-rs/nice-android-arm-eabi@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz#4ebd966821cd6c2cc7cc020eb468de397bb9b40f" integrity sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw== "@napi-rs/nice-android-arm64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz#e183ba874512bc005852daab8b78c63e0a4288a8" integrity sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw== "@napi-rs/nice-darwin-arm64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz#64b1585809774cbb8bf95cea3d4c8827c9897394" integrity sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A== "@napi-rs/nice-darwin-x64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz#99c0c7f62cb1e23ca76881bb29cc6000aeccc6f0" integrity sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ== "@napi-rs/nice-freebsd-x64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz#9a5ca0e3ced86207887c98a5a560de8cde5a909e" integrity sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ== "@napi-rs/nice-linux-arm-gnueabihf@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz#b8a6a1bc88d0de3e99ac3fdea69980dc6e20b502" integrity sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg== "@napi-rs/nice-linux-arm64-gnu@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz#226f1ef30fcb80fa40370e843b75cc86e39e1183" integrity sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ== "@napi-rs/nice-linux-arm64-musl@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz#01345c3db79210ba5406c8729e8db75ed11c5f14" integrity sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg== "@napi-rs/nice-linux-ppc64-gnu@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz#ce7a1025227daab491ded40784b561394d688fcb" integrity sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg== "@napi-rs/nice-linux-riscv64-gnu@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz#9bef5dc89a0425d03163853b4968dbb686d98fd5" integrity sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw== "@napi-rs/nice-linux-s390x-gnu@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz#247c8c7c45876877bdb337cfeb290ff4fd82de62" integrity sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ== "@napi-rs/nice-linux-x64-gnu@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz#7fd1f5e037cb44ab4f5f95a3b3225a99e3248f12" integrity sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg== "@napi-rs/nice-linux-x64-musl@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz#d447cd7157ae5da5c0b15fc618bf61f0c344ff6f" integrity sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw== "@napi-rs/nice-openharmony-arm64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz#1120e457d2cc6b2bc86ef0a697faefe2e194dfce" integrity sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ== "@napi-rs/nice-win32-arm64-msvc@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz#91e4cfecf339b43fa7934f0c8b19d04f4cdd9bc0" integrity sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA== "@napi-rs/nice-win32-ia32-msvc@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz#ed9300bba074d3e3b0a077d6b157f2b4ff70af0e" integrity sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug== "@napi-rs/nice-win32-x64-msvc@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz#8292b82fb46458618ccff5b8130f78974349541e" integrity sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ== "@napi-rs/nice@^1.0.4": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice/-/nice-1.1.1.tgz#c1aacd631ecd4c500c959e3e7cfedd5c73bffe2a" integrity sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw== optionalDependencies: "@napi-rs/nice-android-arm-eabi" "1.1.1" "@napi-rs/nice-android-arm64" "1.1.1" "@napi-rs/nice-darwin-arm64" "1.1.1" "@napi-rs/nice-darwin-x64" "1.1.1" "@napi-rs/nice-freebsd-x64" "1.1.1" "@napi-rs/nice-linux-arm-gnueabihf" "1.1.1" "@napi-rs/nice-linux-arm64-gnu" "1.1.1" "@napi-rs/nice-linux-arm64-musl" "1.1.1" "@napi-rs/nice-linux-ppc64-gnu" "1.1.1" "@napi-rs/nice-linux-riscv64-gnu" "1.1.1" "@napi-rs/nice-linux-s390x-gnu" "1.1.1" "@napi-rs/nice-linux-x64-gnu" "1.1.1" "@napi-rs/nice-linux-x64-musl" "1.1.1" "@napi-rs/nice-openharmony-arm64" "1.1.1" "@napi-rs/nice-win32-arm64-msvc" "1.1.1" "@napi-rs/nice-win32-ia32-msvc" "1.1.1" "@napi-rs/nice-win32-x64-msvc" "1.1.1" "@napi-rs/wasm-runtime@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== dependencies: "@tybys/wasm-util" "^0.10.1" "@ngtools/webpack@21.2.5", "@ngtools/webpack@^21.2.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-21.2.5.tgz#91d1d53cca96ccef82d920a6d77886debcf105d1" integrity sha512-1TRy5KIMOlrseKsPD+OukdHFo9MNn7xRrJ2nuEKmoeA+DovIaldheAbLuw5llkGWa6LZ8uzsL/AuOIUR8z/paQ== "@noble/hashes@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== "@npmcli/agent@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz" integrity sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== dependencies: agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" "@npmcli/arborist@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-9.0.0.tgz#cad6961fa58362c558ec82910fd2bab3c477c802" integrity sha512-ZFsI/VJ7wJ2rTksLNJ9xqr75Ste/wiKvW+7w12ZGbcT67xWii97yS+aDlh3edNhqlqoXvdzYG4hTNui81VxJCA== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/fs" "^4.0.0" "@npmcli/installed-package-contents" "^3.0.0" "@npmcli/map-workspaces" "^4.0.1" "@npmcli/metavuln-calculator" "^9.0.0" "@npmcli/name-from-folder" "^3.0.0" "@npmcli/node-gyp" "^4.0.0" "@npmcli/package-json" "^6.0.1" "@npmcli/query" "^4.0.0" "@npmcli/redact" "^3.0.0" "@npmcli/run-script" "^9.0.1" bin-links "^5.0.0" cacache "^19.0.1" common-ancestor-path "^1.0.1" hosted-git-info "^8.0.0" json-stringify-nice "^1.1.4" lru-cache "^10.2.2" minimatch "^9.0.4" nopt "^8.0.0" npm-install-checks "^7.1.0" npm-package-arg "^12.0.0" npm-pick-manifest "^10.0.0" npm-registry-fetch "^18.0.1" pacote "^21.0.0" parse-conflict-json "^4.0.0" proc-log "^5.0.0" proggy "^3.0.0" promise-all-reject-late "^1.0.0" promise-call-limit "^3.0.1" read-package-json-fast "^4.0.0" semver "^7.3.7" ssri "^12.0.0" treeverse "^3.0.0" walk-up-path "^4.0.0" "@npmcli/config@^10.0.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-10.0.1.tgz#ee569d6448b959050e92f9ce4b32de8996e7d58d" integrity sha512-772OMXb+ItCUAIfajIynTVDkNgPmrYY367NgCrcPHEHQljjZdbU2qpufk1GIxUeJnkutVFLfc5XyWyzdTO7buw== dependencies: "@npmcli/map-workspaces" "^4.0.1" "@npmcli/package-json" "^6.0.1" ci-info "^4.0.0" ini "^5.0.0" nopt "^8.0.0" proc-log "^5.0.0" semver "^7.3.5" walk-up-path "^4.0.0" "@npmcli/fs@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz" integrity sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q== dependencies: semver "^7.3.5" "@npmcli/git@^6.0.0", "@npmcli/git@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz" integrity sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw== dependencies: "@npmcli/promise-spawn" "^8.0.0" ini "^5.0.0" lru-cache "^10.0.1" npm-pick-manifest "^10.0.0" proc-log "^5.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" which "^5.0.0" "@npmcli/installed-package-contents@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz" integrity sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q== dependencies: npm-bundled "^4.0.0" npm-normalize-package-bin "^4.0.0" "@npmcli/map-workspaces@^4.0.1", "@npmcli/map-workspaces@^4.0.2": version "4.0.2" resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz" integrity sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q== dependencies: "@npmcli/name-from-folder" "^3.0.0" "@npmcli/package-json" "^6.0.0" glob "^10.2.2" minimatch "^9.0.0" "@npmcli/metavuln-calculator@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.0.tgz#7e54d7c9f33999fde0ad2998904e0edd1627e26d" integrity sha512-znLKqdy1ZEGNK3VB9j/RzGyb/P0BJb3fGpvEbHIAyBAXsps2l1ce8SVHfsGAFLl9s8072PxafqTn7RC8wSnQPg== dependencies: cacache "^19.0.0" json-parse-even-better-errors "^4.0.0" pacote "^21.0.0" proc-log "^5.0.0" semver "^7.3.5" "@npmcli/name-from-folder@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz" integrity sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA== "@npmcli/node-gyp@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz" integrity sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA== "@npmcli/package-json@^6.0.0", "@npmcli/package-json@^6.0.1", "@npmcli/package-json@^6.1.0": version "6.1.0" resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz" integrity sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug== dependencies: "@npmcli/git" "^6.0.0" glob "^10.2.2" hosted-git-info "^8.0.0" json-parse-even-better-errors "^4.0.0" normalize-package-data "^7.0.0" proc-log "^5.0.0" semver "^7.5.3" "@npmcli/package-json@^6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-6.1.1.tgz#78ff92d138fdcb85f31cab907455d5db96d017cb" integrity sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw== dependencies: "@npmcli/git" "^6.0.0" glob "^10.2.2" hosted-git-info "^8.0.0" json-parse-even-better-errors "^4.0.0" proc-log "^5.0.0" semver "^7.5.3" validate-npm-package-license "^3.0.4" "@npmcli/promise-spawn@^8.0.0", "@npmcli/promise-spawn@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz" integrity sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ== dependencies: which "^5.0.0" "@npmcli/query@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@npmcli/query/-/query-4.0.0.tgz" integrity sha512-3pPbese0fbCiFJ/7/X1GBgxAKYFE8sxBddA7GtuRmOgNseH4YbGsXJ807Ig3AEwNITjDUISHglvy89cyDJnAwA== dependencies: postcss-selector-parser "^6.1.2" "@npmcli/redact@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz" integrity sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ== "@npmcli/run-script@^9.0.0", "@npmcli/run-script@^9.0.1": version "9.0.2" resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz" integrity sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw== dependencies: "@npmcli/node-gyp" "^4.0.0" "@npmcli/package-json" "^6.0.0" "@npmcli/promise-spawn" "^8.0.0" node-gyp "^11.0.0" proc-log "^5.0.0" which "^5.0.0" "@oxc-project/types@=0.113.0": version "0.113.0" resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.113.0.tgz#e323164a2d0cdc72c3eb980cd2a471e641df8d52" integrity sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA== "@parcel/watcher-android-arm64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== "@parcel/watcher-darwin-arm64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== "@parcel/watcher-darwin-x64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== "@parcel/watcher-freebsd-x64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== "@parcel/watcher-linux-arm-glibc@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== "@parcel/watcher-linux-arm-musl@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== "@parcel/watcher-linux-arm64-glibc@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== "@parcel/watcher-linux-arm64-musl@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== "@parcel/watcher-linux-x64-glibc@2.5.0": version "2.5.0" resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz" integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== "@parcel/watcher-linux-x64-musl@2.5.0": version "2.5.0" resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz" integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== "@parcel/watcher-win32-arm64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== "@parcel/watcher-win32-ia32@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== "@parcel/watcher-win32-x64@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== "@parcel/watcher@^2.4.1": version "2.5.0" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz" integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" optionalDependencies: "@parcel/watcher-android-arm64" "2.5.0" "@parcel/watcher-darwin-arm64" "2.5.0" "@parcel/watcher-darwin-x64" "2.5.0" "@parcel/watcher-freebsd-x64" "2.5.0" "@parcel/watcher-linux-arm-glibc" "2.5.0" "@parcel/watcher-linux-arm-musl" "2.5.0" "@parcel/watcher-linux-arm64-glibc" "2.5.0" "@parcel/watcher-linux-arm64-musl" "2.5.0" "@parcel/watcher-linux-x64-glibc" "2.5.0" "@parcel/watcher-linux-x64-musl" "2.5.0" "@parcel/watcher-win32-arm64" "2.5.0" "@parcel/watcher-win32-ia32" "2.5.0" "@parcel/watcher-win32-x64" "2.5.0" "@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz#cb5445c1bad9197d176073bf142a5c035b460640" integrity sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" "@peculiar/asn1-x509-attr" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-csr@^2.6.0": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz#9629d403bc5a61254f28ed0b90e99cee61c0e8be" integrity sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-ecc@^2.6.0": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz#d29c4af671508a9934edc78e7c9419fbf7bc9870" integrity sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-pfx@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz#75cddd14d43ef875109e91ea150377d679c8fbc1" integrity sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw== dependencies: "@peculiar/asn1-cms" "^2.6.1" "@peculiar/asn1-pkcs8" "^2.6.1" "@peculiar/asn1-rsa" "^2.6.1" "@peculiar/asn1-schema" "^2.6.0" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-pkcs8@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz#bd56b4bb9e8a3702369049713a89134c87c6931a" integrity sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-pkcs9@^2.6.0": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz#ddc5222952f25b59a0562a6f8cabdb72f586a496" integrity sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw== dependencies: "@peculiar/asn1-cms" "^2.6.1" "@peculiar/asn1-pfx" "^2.6.1" "@peculiar/asn1-pkcs8" "^2.6.1" "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" "@peculiar/asn1-x509-attr" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz#2cdf9f9ea6d6fdbaae214b9fed6de0534b654437" integrity sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-schema@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz#0dca1601d5b0fed2a72fed7a5f1d0d7dbe3a6f82" integrity sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg== dependencies: asn1js "^3.0.6" pvtsutils "^1.3.6" tslib "^2.8.1" "@peculiar/asn1-x509-attr@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz#6425008b8099476010aace5b8ae9f9cbc41db0ab" integrity sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ== dependencies: "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.1" asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz#4e8995659e16178e0e90fe90519aa269045af262" integrity sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA== dependencies: "@peculiar/asn1-schema" "^2.6.0" asn1js "^3.0.6" pvtsutils "^1.3.6" tslib "^2.8.1" "@peculiar/x509@^1.14.2": version "1.14.3" resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== dependencies: "@peculiar/asn1-cms" "^2.6.0" "@peculiar/asn1-csr" "^2.6.0" "@peculiar/asn1-ecc" "^2.6.0" "@peculiar/asn1-pkcs9" "^2.6.0" "@peculiar/asn1-rsa" "^2.6.0" "@peculiar/asn1-schema" "^2.6.0" "@peculiar/asn1-x509" "^2.6.0" pvtsutils "^1.3.6" reflect-metadata "^0.2.2" tslib "^2.8.1" tsyringe "^4.10.0" "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@playwright/test@^1.59.0": version "1.59.0" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.59.0.tgz#576c67501a2a0e42a5693f5706471e5ebde30add" integrity sha512-TOA5sTLd49rTDaZpYpvCQ9hGefHQq/OYOyCVnGqS2mjMfX+lGZv2iddIJd0I48cfxqSPttS9S3OuLKyylHcO1w== dependencies: playwright "1.59.0" "@polka/url@^1.0.0-next.24": version "1.0.0-next.28" resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@rolldown/binding-android-arm64@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.4.tgz#bb275690413cd0109d49ba5dd4491e1c0296ad0e" integrity sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w== "@rolldown/binding-darwin-arm64@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.4.tgz#cd59b855ee90e464e8b6e97919089d00d98590e1" integrity sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q== "@rolldown/binding-darwin-x64@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.4.tgz#5c1411b969c26ffd88b661b1a38bafcf1519a431" integrity sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww== "@rolldown/binding-freebsd-x64@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.4.tgz#5b06b2792df246bb3fcc64630bd92af9feff3f87" integrity sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw== "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.4.tgz#93d9a3259cc41054425c8134d8ba41c9f92984f1" integrity sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w== "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.4.tgz#aa9e8f5b3874dc29bf54940eb55cb23274956e32" integrity sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A== "@rolldown/binding-linux-arm64-musl@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.4.tgz#e3b56288dcb2ba9219c3e3ff62bf0395c0dc9de4" integrity sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ== "@rolldown/binding-linux-x64-gnu@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.4.tgz#003570df20ba503ed71f052d1b201535fd6a217d" integrity sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg== "@rolldown/binding-linux-x64-musl@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.4.tgz#e1e22ee0b8913e45bf769291a7c7db57aa20b7fe" integrity sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g== "@rolldown/binding-openharmony-arm64@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.4.tgz#494ee66307a2b1192f24d6876564c1300ec90241" integrity sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ== "@rolldown/binding-wasm32-wasi@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.4.tgz#dc98418ee2e5668f7dcc4bf4155523a079b34a80" integrity sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw== dependencies: "@napi-rs/wasm-runtime" "^1.1.1" "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.4.tgz#a294ee643275bb099c1128ad294bd6101bae1eca" integrity sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ== "@rolldown/binding-win32-x64-msvc@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.4.tgz#b9248d23625f6f59ec1af0b3140706cba6afc36c" integrity sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g== "@rolldown/pluginutils@1.0.0-rc.4": version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.4.tgz#267b477af268a082861c861e47f6a787dff59cc4" integrity sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ== "@rollup/rollup-android-arm-eabi@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz#7e158ddfc16f78da99c0d5ccbae6cae403ef3284" integrity sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A== "@rollup/rollup-android-arm64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz#49f4ae0e22b6f9ffbcd3818b9a0758fa2d10b1cd" integrity sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw== "@rollup/rollup-darwin-arm64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz#bb200269069acf5c1c4d79ad142524f77e8b8236" integrity sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA== "@rollup/rollup-darwin-x64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz#1bf7a92b27ebdd5e0d1d48503c7811160773be1a" integrity sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw== "@rollup/rollup-freebsd-arm64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz#5ccf537b99c5175008444702193ad0b1c36f7f16" integrity sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw== "@rollup/rollup-freebsd-x64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz#1196ecd7bf4e128624ef83cd1f9d785114474a77" integrity sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA== "@rollup/rollup-linux-arm-gnueabihf@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz#cc147633a4af229fee83a737bf2334fbac3dc28e" integrity sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g== "@rollup/rollup-linux-arm-musleabihf@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz#3559f9f060153ea54594a42c3b87a297bedcc26e" integrity sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ== "@rollup/rollup-linux-arm64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz#e91f887b154123485cfc4b59befe2080fcd8f2df" integrity sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A== "@rollup/rollup-linux-arm64-musl@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz#660752f040df9ba44a24765df698928917c0bf21" integrity sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ== "@rollup/rollup-linux-loong64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz#cb0e939a5fa479ccef264f3f45b31971695f869c" integrity sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw== "@rollup/rollup-linux-loong64-musl@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz#42f86fbc82cd1a81be2d346476dd3231cf5ee442" integrity sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog== "@rollup/rollup-linux-ppc64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz#39776a647a789dc95ea049277c5ef8f098df77f9" integrity sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ== "@rollup/rollup-linux-ppc64-musl@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz#466f20029a8e8b3bb2954c7ddebc9586420cac2c" integrity sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg== "@rollup/rollup-linux-riscv64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz#cff9877c78f12e7aa6246f6902ad913e99edb2b7" integrity sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA== "@rollup/rollup-linux-riscv64-musl@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz#9a762fb99b5a82a921017f56491b7e892b9fb17d" integrity sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ== "@rollup/rollup-linux-s390x-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz#9d25ad8ac7dab681935baf78ac5ea92d14629cdf" integrity sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ== "@rollup/rollup-linux-x64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz#5e5139e11819fa38a052368da79422cb4afcf466" integrity sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg== "@rollup/rollup-linux-x64-musl@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz#b6211d46e11b1f945f5504cc794fce839331ed08" integrity sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw== "@rollup/rollup-openbsd-x64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz#e6e09eebaa7012bb9c7331b437a9e992bd94ca35" integrity sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw== "@rollup/rollup-openharmony-arm64@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz#f7d99ae857032498e57a5e7259fb7100fd24a87e" integrity sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA== "@rollup/rollup-win32-arm64-msvc@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz#41e392f5d9f3bf1253fdaf2f6d6f6b1bfc452856" integrity sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ== "@rollup/rollup-win32-ia32-msvc@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz#f41b0490be0e5d3cf459b4dc076a192b532adea9" integrity sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w== "@rollup/rollup-win32-x64-gnu@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz#0fcf9f1fcb750f0317b13aac3b3231687e6397a5" integrity sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA== "@rollup/rollup-win32-x64-msvc@4.60.0": version "4.60.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz#3afdb30405f6d4248df5e72e1ca86c5eab55fab8" integrity sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w== "@sigstore/bundle@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz" integrity sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg== dependencies: "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/core@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz" integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== "@sigstore/protobuf-specs@^0.3.2": version "0.3.2" resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz" integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== "@sigstore/sign@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz" integrity sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw== dependencies: "@sigstore/bundle" "^3.0.0" "@sigstore/core" "^2.0.0" "@sigstore/protobuf-specs" "^0.3.2" make-fetch-happen "^14.0.1" proc-log "^5.0.0" promise-retry "^2.0.1" "@sigstore/tuf@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz" integrity sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw== dependencies: "@sigstore/protobuf-specs" "^0.3.2" tuf-js "^3.0.1" "@sigstore/verify@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz" integrity sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg== dependencies: "@sigstore/bundle" "^3.0.0" "@sigstore/core" "^2.0.0" "@sigstore/protobuf-specs" "^0.3.2" "@sinclair/typebox@^0.34.0": version "0.34.48" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.48.tgz#75b0ead87e59e1adbd6dccdc42bad4fddee73b59" integrity sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA== "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== "@socket.io/component-emitter@~3.1.0": version "3.1.2" resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== "@standard-schema/spec@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@tufjs/canonical-json@2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz" integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== "@tufjs/models@3.0.1": version "3.0.1" resolved "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz" integrity sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA== dependencies: "@tufjs/canonical-json" "2.0.0" minimatch "^9.0.5" "@tybys/wasm-util@^0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== dependencies: tslib "^2.4.0" "@types/body-parser@*": version "1.19.5" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": version "3.4.38" resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": version "9.6.1" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz" integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*": version "1.0.6" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/estree@1.0.8", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": version "5.0.2" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz" integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" "@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": version "4.19.6" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" "@types/express@*": version "5.0.0" resolved "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz" integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^5.0.0" "@types/qs" "*" "@types/serve-static" "*" "@types/express@^4.17.25": version "4.17.25" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "^1" "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-errors@*": version "2.0.4" resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.15": version "1.17.17" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== dependencies: "@types/node" "*" "@types/http-proxy@^1.17.8": version "1.17.15" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz" integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mime@^1": version "1.3.5" resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimatch@*": version "6.0.0" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-6.0.0.tgz#4d207b1cc941367bdcd195a3a781a7e4fc3b1e03" integrity sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA== dependencies: minimatch "*" "@types/node@*": version "22.10.2" resolved "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz" integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== dependencies: undici-types "~6.20.0" "@types/qs@*": version "6.9.17" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz" integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": version "1.2.7" resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/retry@0.12.2": version "0.12.2" resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz" integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== "@types/send@*": version "0.17.4" resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/send@<1": version "0.17.6" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.15.5": version "1.15.7" resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" "@types/node" "*" "@types/send" "*" "@types/serve-static@^1": version "1.15.10" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== dependencies: "@types/http-errors" "*" "@types/node" "*" "@types/send" "<1" "@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" "@types/ws@^8.5.10": version "8.5.13" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz" integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.33": version "17.0.35" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": version "2.10.3" resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz" integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" "@uiw/codemirror-theme-github@^4.25.9": version "4.25.9" resolved "https://registry.yarnpkg.com/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.25.9.tgz#7c34a341689d9e03a07f85252d6493bfd3bb80fd" integrity sha512-AGpTamNiySKNzq3Jc7QjpwgQRVaHUaBtmOKiUDghYSfEGjsc5uW4NUW70sSU3BnkGv+lCTUnF3175KM24BWZbw== dependencies: "@uiw/codemirror-themes" "4.25.9" "@uiw/codemirror-themes@4.25.9": version "4.25.9" resolved "https://registry.yarnpkg.com/@uiw/codemirror-themes/-/codemirror-themes-4.25.9.tgz#08d70061d4b8ec721023484cd80d4e0302184443" integrity sha512-DAHKb/L9ELwjY4nCf/MP/mIllHOn4GQe7RR4x8AMJuNeh9nGRRoo1uPxrxMmUL/bKqe6kDmDbIZ2AlhlqyIJuw== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" "@ungap/structured-clone@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitejs/plugin-basic-ssl@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz#c45abecc7f373343132870eb23b7fe84dfc018a1" integrity sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw== "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: "@webassemblyjs/helper-numbers" "1.13.2" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/floating-point-hex-parser@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== "@webassemblyjs/helper-api-error@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== "@webassemblyjs/helper-buffer@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== "@webassemblyjs/helper-numbers@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.13.2" "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" "@webassemblyjs/helper-wasm-bytecode@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== "@webassemblyjs/helper-wasm-section@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/ieee754@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== "@webassemblyjs/wasm-edit@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== dependencies: "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/helper-wasm-section" "1.14.1" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-opt" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" "@webassemblyjs/wast-printer" "1.14.1" "@webassemblyjs/wasm-gen@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/ieee754" "1.13.2" "@webassemblyjs/leb128" "1.13.2" "@webassemblyjs/utf8" "1.13.2" "@webassemblyjs/wasm-opt@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" "@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-api-error" "1.13.2" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/ieee754" "1.13.2" "@webassemblyjs/leb128" "1.13.2" "@webassemblyjs/utf8" "1.13.2" "@webassemblyjs/wast-printer@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== abbrev@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz" integrity sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA== accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" negotiator "0.6.3" acorn-import-phases@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== acorn-walk@^8.0.0: version "8.3.4" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.0.4, acorn@^8.11.0, acorn@^8.8.2: version "8.14.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== acorn@^8.15.0, acorn@^8.16.0: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== dependencies: loader-utils "^2.0.0" regex-parser "^2.2.11" agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.3" resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== ajv-formats@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== dependencies: ajv "^8.0.0" ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" ajv@8.18.0: version "8.18.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" ansi-colors@4.1.3, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^7.0.0: version "7.3.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== dependencies: environment "^1.0.0" ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-regex@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== ansi-styles@^6.2.1, ansi-styles@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== any-promise@^1.0.0: version "1.3.0" resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" aproba@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== archive-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz" integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA== dependencies: file-type "^4.2.0" archy@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-each@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz" integrity sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA== array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-slice@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== asn1js@^3.0.6: version "3.0.7" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.7.tgz#15f1f2f59e60f80d5b43ef14047a294a969f824f" integrity sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ== dependencies: pvtsutils "^1.3.6" pvutils "^1.1.3" tslib "^2.8.1" async@^2.6.0: version "2.6.4" resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" async@^3.2.3, async@~3.2.0: version "3.2.6" resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== autoprefixer@10.4.27: version "10.4.27" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.27.tgz#51ea301a5c3c5f8642f8e564759c4f573be486f2" integrity sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA== dependencies: browserslist "^4.28.1" caniuse-lite "^1.0.30001774" fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" axios@^0.21.1: version "0.21.4" resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" babel-loader@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-10.0.0.tgz#b9743714c0e1e084b3e4adef3cd5faee33089977" integrity sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== dependencies: find-up "^5.0.0" babel-loader@^10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-10.1.1.tgz#ce9748e85b7071eb88006e3cfa9e6cf14eeb97c5" integrity sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg== dependencies: find-up "^5.0.0" babel-plugin-polyfill-corejs2@^0.4.14: version "0.4.17" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: "@babel/compat-data" "^7.28.6" "@babel/helper-define-polyfill-provider" "^0.6.8" semver "^6.3.1" babel-plugin-polyfill-corejs2@^0.4.15: version "0.4.16" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz#a1321145f6cde738b0a412616b6bcf77f143ab36" integrity sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw== dependencies: "@babel/compat-data" "^7.28.6" "@babel/helper-define-polyfill-provider" "^0.6.7" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.5" core-js-compat "^3.43.0" babel-plugin-polyfill-corejs3@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz#75fb533a1c23c0a976f189cba1d035199705b8ad" integrity sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.7" core-js-compat "^3.48.0" babel-plugin-polyfill-regenerator@^0.6.5: version "0.6.8" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.8" babel-plugin-polyfill-regenerator@^0.6.6: version "0.6.7" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz#eca723d67ef87b798881ad00546db1b6dd72e1ef" integrity sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.7" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== balanced-match@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== batch@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== beasties@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/beasties/-/beasties-0.4.1.tgz#5c0cc2a89ba3b329d2e75fdd2e494ad661fdd954" integrity sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg== dependencies: css-select "^6.0.0" css-what "^7.0.0" dom-serializer "^2.0.0" domhandler "^5.0.3" htmlparser2 "^10.0.0" picocolors "^1.1.1" postcss "^8.4.49" postcss-media-query-parser "^0.2.3" postcss-safe-parser "^7.0.1" big.js@^5.2.2: version "5.2.2" resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bin-links@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz" integrity sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA== dependencies: cmd-shim "^7.0.0" npm-normalize-package-bin "^4.0.0" proc-log "^5.0.0" read-cmd-shim "^5.0.0" write-file-atomic "^6.0.0" binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binary-extensions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-3.0.0.tgz#14ce687f80e3ebab2a2fb78bb8611584c29f12c3" integrity sha512-X0RfwMgXPEesg6PCXzytQZt9Unh9gtc4SfeTNJvKifUL//Oegcc/Yf31z6hThNZ8dnD3Ir3wkHVN0eWrTvP5ww== bl@^1.0.0: version "1.2.3" resolved "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz" integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== dependencies: readable-stream "^2.3.5" safe-buffer "^5.1.1" body-parser@~1.20.3: version "1.20.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== dependencies: bytes "~3.1.2" content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "~1.2.0" http-errors "~2.0.1" iconv-lite "~0.4.24" on-finished "~2.4.1" qs "~6.14.0" raw-body "~2.5.3" type-is "~1.6.18" unpipe "~1.0.0" body@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/body/-/body-5.1.0.tgz" integrity sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ== dependencies: continuable-cache "^0.3.1" error "^7.0.0" raw-body "~1.1.0" safe-json-parse "~1.0.1" bonjour-service@^1.2.1: version "1.3.0" resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz" integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" boolbase@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" brace-expansion@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== dependencies: balanced-match "^4.0.2" braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.0.0, browserslist@^4.24.0: version "4.24.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz" integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" node-releases "^2.0.19" update-browserslist-db "^1.1.1" browserslist@^4.24.5: version "4.25.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== dependencies: caniuse-lite "^1.0.30001726" electron-to-chromium "^1.5.173" node-releases "^2.0.19" update-browserslist-db "^1.1.3" browserslist@^4.26.0, browserslist@^4.28.1: version "4.28.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== dependencies: baseline-browser-mapping "^2.9.0" caniuse-lite "^1.0.30001759" electron-to-chromium "^1.5.263" node-releases "^2.0.27" update-browserslist-db "^1.2.0" buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.2.1: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" ieee754 "^1.1.13" bundle-name@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== dependencies: run-applescript "^7.0.0" bytes@1: version "1.0.0" resolved "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz" integrity sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ== bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== bytestreamjs@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz#a32947c7ce389a6fa11a09a9a563d0a45889535e" integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== cacache@^19.0.0, cacache@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz" integrity sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== dependencies: "@npmcli/fs" "^4.0.0" fs-minipass "^3.0.0" glob "^10.2.2" lru-cache "^10.0.1" minipass "^7.0.3" minipass-collect "^2.0.1" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" p-map "^7.0.2" ssri "^12.0.0" tar "^7.4.3" unique-filename "^4.0.0" cacheable-request@^2.1.1: version "2.1.4" resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz" integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ== dependencies: clone-response "1.0.2" get-stream "3.0.0" http-cache-semantics "3.8.1" keyv "3.0.0" lowercase-keys "1.0.0" normalize-url "2.0.1" responselike "1.0.2" call-bind-apply-helpers@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" call-bound@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz" integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== dependencies: call-bind-apply-helpers "^1.0.1" get-intrinsic "^1.2.6" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== dependencies: no-case "^2.2.0" upper-case "^1.1.1" camel-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" tslib "^2.0.3" camelcase@^6.0.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" caniuse-lite "^1.0.0" lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001726, caniuse-lite@^1.0.30001759: version "1.0.30001778" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz" integrity sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg== caniuse-lite@^1.0.30001774: version "1.0.30001781" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz#344b47c03eb8168b79c3c158b872bcfbdd02a400" integrity sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw== chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.2, chalk@~4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" chalk@^1.0.0, chalk@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" has-ansi "^2.0.0" strip-ansi "^3.0.0" supports-color "^2.0.0" chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" chalk@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== chalk@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" readdirp "~3.6.0" optionalDependencies: fsevents "~2.3.2" chokidar@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" chokidar@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== dependencies: readdirp "^5.0.0" chownr@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chownr@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^4.0.0, ci-info@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz" integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== ci-info@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== cidr-regex@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.1.1.tgz" integrity sha512-ekKcVp+iRB9zlKFXyx7io7nINgb0oRjgRdXNEodp1OuxRui8FXr/CA40Tz1voWUp9DPPrMyQKy01vJhDo4N1lw== dependencies: ip-regex "^5.0.0" clean-css@^4.2.1: version "4.2.4" resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== dependencies: source-map "~0.6.0" clean-css@^5.2.2, clean-css@~5.3.2: version "5.3.3" resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz" integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" clean-webpack-plugin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729" integrity sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w== dependencies: del "^4.1.1" cli-columns@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz" integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ== dependencies: string-width "^4.2.3" strip-ansi "^6.0.1" cli-cursor@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" cli-spinners@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-3.4.0.tgz#1f11f6d48c4e5bc6849fcb4efa0dc98f9e7299ea" integrity sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw== cli-truncate@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-5.2.0.tgz#c8e72aaca8339c773d128c36e0a17c6315b694eb" integrity sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw== dependencies: slice-ansi "^8.0.0" string-width "^8.2.0" cli-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.1" wrap-ansi "^7.0.0" cliui@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-9.0.1.tgz#6f7890f386f6f1f79953adc1f78dec46fcc2d291" integrity sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== dependencies: string-width "^7.2.0" strip-ansi "^7.1.0" wrap-ansi "^9.0.0" clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" kind-of "^6.0.2" shallow-clone "^3.0.0" clone-response@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== dependencies: mimic-response "^1.0.0" cmd-shim@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz" integrity sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw== codemirror@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.2.tgz#4d3fea1ad60b6753f97ca835f2f48c6936a8946e" integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/commands" "^6.0.0" "@codemirror/language" "^6.0.0" "@codemirror/lint" "^6.0.0" "@codemirror/search" "^6.0.0" "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colord@^2.9.3: version "2.9.3" resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.10, colorette@^2.0.20: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" integrity sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== commander@^10.0.0: version "10.0.1" resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^14.0.2, commander@^14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== commander@^2.19.0, commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^8.3.0: version "8.3.0" resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== compressible@~2.0.18: version "2.0.18" resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: bytes "3.1.2" compressible "~2.0.18" debug "2.6.9" negotiator "~0.6.4" on-headers "~1.1.0" safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concurrently@^9.2.1: version "9.2.1" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.1.tgz#248ea21b95754947be2dad9c3e4b60f18ca4e44f" integrity sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng== dependencies: chalk "4.1.2" rxjs "7.8.2" shell-quote "1.8.3" supports-color "8.1.1" tree-kill "1.2.2" yargs "17.7.2" connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== content-disposition@^0.5.2, content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz" integrity sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA== convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== cookie@~0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== dependencies: is-what "^3.14.1" copy-webpack-plugin@14.0.0, copy-webpack-plugin@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz#cd253b60e8e55bb41019dfe3ef2979ba705592c7" integrity sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA== dependencies: glob-parent "^6.0.1" normalize-path "^3.0.0" schema-utils "^4.2.0" serialize-javascript "^7.0.3" tinyglobby "^0.2.12" core-js-compat@^3.43.0: version "3.49.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== dependencies: browserslist "^4.28.1" core-js-compat@^3.48.0: version "3.48.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== dependencies: browserslist "^4.28.1" core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== corifeus-builder@^2025.4.135: version "2025.4.135" resolved "https://registry.yarnpkg.com/corifeus-builder/-/corifeus-builder-2025.4.135.tgz#ae5ce1d952a987143fb91c1e459cf5952e9316e3" integrity sha512-37Hl1n7tLhdtstS8+DGhwcQMhYNQnCYyZ0mZW58UzluZB0ecxR09uhWVNt/2fpLgpYh/tKHNV9TGaRvV3r+Fmw== dependencies: corifeus-utils "^2025.4.120" download "^8.0.0" extract-zip "^2.0.1" fs-extra "^11.3.0" github-api "^3.4.0" glob "^8.0.3" glob-promise "^6.0.7" grunt "^1.6.1" grunt-contrib-clean "^2.0.1" grunt-contrib-copy "^1.0.0" grunt-contrib-htmlmin "^3.1.0" grunt-contrib-watch "^1.1.0" jit-grunt "^0.10.0" lodash "^4.17.21" mkdirp "^3.0.1" mocha "^11.1.0" mz "^2.7.0" npm "^11.1.0" npm-check-updates "^17.1.14" should "^13.2.3" time-grunt "^2.0.0" yaml "^2.7.0" corifeus-utils@^2025.4.120: version "2025.4.120" resolved "https://registry.yarnpkg.com/corifeus-utils/-/corifeus-utils-2025.4.120.tgz#3e2b54d42f35bf57c3c0700c289ae55fd15455eb" integrity sha512-Plv0NcZDIoYT2OsxzF47grWaOEGFWph3vIiPSt5gDTkqlTZ/Wy5+EneeYTzMlpMKsNrNKtAcwM98dAtmLoFg4g== dependencies: fs-extra "^11.3.0" ms "^2.1.3" mz "^2.7.0" timestring "^7.0.0" uuid "^11.0.5" corifeus-utils@^2025.4.123: version "2025.4.123" resolved "https://registry.yarnpkg.com/corifeus-utils/-/corifeus-utils-2025.4.123.tgz#4fe1a95c369d1281fef7a4384ad7a71ed7afe5a8" integrity sha512-YbZZr0OzY/4sK0G08i8bOapYUC1rKk3yb1pU3pQ81cGkMdY+sZLq/B0Mzr0I795Ov3mm4LeR+L+h5qyx14T3Jg== dependencies: fs-extra "^11.3.0" ms "^2.1.3" mz "^2.7.0" timestring "^7.0.0" uuid "^11.0.5" cosmiconfig@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.1.tgz#df110631a8547b5d1a98915271986f06e3011379" integrity sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ== dependencies: env-paths "^2.2.1" import-fresh "^3.3.0" js-yaml "^4.1.0" parse-json "^5.2.0" crelt@^1.0.5, crelt@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== cross-spawn@^7.0.0, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" css-declaration-sorter@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz" integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== css-loader@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.3.tgz#c0de715ceabe39b8531a85fcaf6734a430c4d99a" integrity sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA== dependencies: icss-utils "^5.1.0" postcss "^8.4.40" postcss-modules-extract-imports "^3.1.0" postcss-modules-local-by-default "^4.0.5" postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.6.3" css-loader@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.4.tgz#8f6bf9f8fc8cbef7d2ef6e80acc6545eaefa90b1" integrity sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw== dependencies: icss-utils "^5.1.0" postcss "^8.4.40" postcss-modules-extract-imports "^3.1.0" postcss-modules-local-by-default "^4.0.5" postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.6.3" css-minimizer-webpack-plugin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-8.0.0.tgz#e8e881dd171ec586d2229124177349c8ca3b63c3" integrity sha512-9bEpzHs8gEq6/cbEj418jXL/YWjBUD2YTLLk905Npt2JODqnRITin0+So5Vx4Dp5vyi2Lpt9pp2QHzQ7fdxNrw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" cssnano "^7.0.4" jest-worker "^30.0.5" postcss "^8.4.40" schema-utils "^4.2.0" serialize-javascript "^7.0.3" css-select@^4.1.3: version "4.3.0" resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" css-what "^6.0.1" domhandler "^4.3.1" domutils "^2.8.0" nth-check "^2.0.1" css-select@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" css-what "^6.1.0" domhandler "^5.0.2" domutils "^3.0.1" nth-check "^2.0.1" css-select@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-6.0.0.tgz#7e63f09881ad118084091048ed543786dad96644" integrity sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw== dependencies: boolbase "^1.0.0" css-what "^7.0.0" domhandler "^5.0.3" domutils "^3.2.2" nth-check "^2.1.1" css-tree@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz" integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: mdn-data "2.0.30" source-map-js "^1.0.1" css-tree@~2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz" integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== dependencies: mdn-data "2.0.28" source-map-js "^1.0.1" css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css-what@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-7.0.0.tgz#5796fbebd43571d73c60ba0dd7a6e75dd0d22fe4" integrity sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssnano-preset-default@^7.0.7: version "7.0.7" resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz#1ea881837a837a4400c383d77d9e6cdf4339b6a0" integrity sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow== dependencies: browserslist "^4.24.5" css-declaration-sorter "^7.2.0" cssnano-utils "^5.0.1" postcss-calc "^10.1.1" postcss-colormin "^7.0.3" postcss-convert-values "^7.0.5" postcss-discard-comments "^7.0.4" postcss-discard-duplicates "^7.0.2" postcss-discard-empty "^7.0.1" postcss-discard-overridden "^7.0.1" postcss-merge-longhand "^7.0.5" postcss-merge-rules "^7.0.5" postcss-minify-font-values "^7.0.1" postcss-minify-gradients "^7.0.1" postcss-minify-params "^7.0.3" postcss-minify-selectors "^7.0.5" postcss-normalize-charset "^7.0.1" postcss-normalize-display-values "^7.0.1" postcss-normalize-positions "^7.0.1" postcss-normalize-repeat-style "^7.0.1" postcss-normalize-string "^7.0.1" postcss-normalize-timing-functions "^7.0.1" postcss-normalize-unicode "^7.0.3" postcss-normalize-url "^7.0.1" postcss-normalize-whitespace "^7.0.1" postcss-ordered-values "^7.0.2" postcss-reduce-initial "^7.0.3" postcss-reduce-transforms "^7.0.1" postcss-svgo "^7.0.2" postcss-unique-selectors "^7.0.4" cssnano-utils@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.1.tgz#f529e9aa0d7930512ca45b9e2ddb8d6b9092eb30" integrity sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg== cssnano@^7.0.4: version "7.0.7" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.7.tgz#1aca487fc32d6b3b71e385c41a8cccb2f43735ac" integrity sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng== dependencies: cssnano-preset-default "^7.0.7" lilconfig "^3.1.3" csso@^5.0.5: version "5.0.5" resolved "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz" integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== dependencies: css-tree "~2.2.0" date-time@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz" integrity sha512-RrxZQ06cdKe7YQ5oqIxs3GMc7W3vXscy7Ds+aZIqmxA59QnVtTiCseA4jbzVUub9xCbo9GuYVZo0OrZLYXnnmw== dependencies: time-zone "^0.1.0" dateformat@~4.6.2: version "4.6.3" resolved "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== dayjs@^1.11.20: version "1.11.20" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.20.tgz#88d919fd639dc991415da5f4cb6f1b6650811938" integrity sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ== debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: version "4.4.0" resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" debug@^3.1.0: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.4.3, debug@~4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" debug@~4.3.1: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz" integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== dependencies: file-type "^5.2.0" is-stream "^1.1.0" tar-stream "^1.5.2" decompress-tarbz2@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz" integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== dependencies: decompress-tar "^4.1.0" file-type "^6.1.0" is-stream "^1.1.0" seek-bzip "^1.0.5" unbzip2-stream "^1.0.9" decompress-targz@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz" integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== dependencies: decompress-tar "^4.1.1" file-type "^5.2.0" is-stream "^1.1.0" decompress-unzip@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz" integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== dependencies: file-type "^3.8.0" get-stream "^2.2.0" pify "^2.3.0" yauzl "^2.4.2" decompress@^4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz" integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" decompress-targz "^4.0.0" decompress-unzip "^4.0.1" graceful-fs "^4.1.10" make-dir "^1.0.0" pify "^2.3.0" strip-dirs "^2.0.0" default-browser-id@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz" integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== default-browser@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz" integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== dependencies: bundle-name "^4.1.0" default-browser-id "^5.0.0" default-browser@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== dependencies: bundle-name "^4.1.0" default-browser-id "^5.0.0" define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== dependencies: "@types/glob" "^7.1.1" globby "^6.1.0" is-path-cwd "^2.0.0" is-path-in-cwd "^2.0.0" p-map "^2.0.0" pify "^4.0.1" rimraf "^2.6.3" depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-file@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-libc@^2.0.1: version "2.1.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diff@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" entities "^2.0.0" dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" domhandler "^5.0.2" entities "^4.2.0" domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" domhandler "^4.2.0" domutils@^3.0.1: version "3.2.1" resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz" integrity sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" domhandler "^5.0.3" domutils@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" domhandler "^5.0.3" dot-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" tslib "^2.0.3" download@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/download/-/download-8.0.0.tgz" integrity sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA== dependencies: archive-type "^4.0.0" content-disposition "^0.5.2" decompress "^4.2.1" ext-name "^5.0.0" file-type "^11.1.0" filenamify "^3.0.0" get-stream "^4.1.0" got "^8.3.1" make-dir "^2.1.0" p-event "^2.1.0" pify "^4.0.1" dunder-proto@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" es-errors "^1.3.0" gopd "^1.2.0" duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.173: version "1.5.177" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz#db730d8254959184e65320a3a0b7edcd29c54f60" integrity sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g== electron-to-chromium@^1.5.263: version "1.5.307" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz#09f8973100c39fb0d003b890393cd1d58932b1c8" integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== electron-to-chromium@^1.5.73: version "1.5.76" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz" integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== emoji-regex@^10.3.0: version "10.6.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" engine.io-client@~6.6.1: version "6.6.2" resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz" integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.2.1" ws "~8.17.1" xmlhttprequest-ssl "~2.1.1" engine.io-parser@~5.2.1: version "5.2.3" resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== enhanced-resolve@^5.0.0, enhanced-resolve@^5.19.0: version "5.20.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0" integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA== dependencies: graceful-fs "^4.2.4" tapable "^2.3.0" enhanced-resolve@^5.20.0: version "5.20.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== dependencies: graceful-fs "^4.2.4" tapable "^2.3.0" entities@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== entities@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b" integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.14.0: version "7.14.0" resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz" integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== environment@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== err-code@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" error-ex@^1.3.1: version "1.3.4" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" error@^7.0.0: version "7.2.1" resolved "https://registry.npmjs.org/error/-/error-7.2.1.tgz" integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== dependencies: string-template "~0.2.1" es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1" integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" esbuild-wasm@0.27.3: version "0.27.3" resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.27.3.tgz#99311a6d97e65d281ed55fc397d72374073950a4" integrity sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw== esbuild@0.27.3: version "0.27.3" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== optionalDependencies: "@esbuild/aix-ppc64" "0.27.3" "@esbuild/android-arm" "0.27.3" "@esbuild/android-arm64" "0.27.3" "@esbuild/android-x64" "0.27.3" "@esbuild/darwin-arm64" "0.27.3" "@esbuild/darwin-x64" "0.27.3" "@esbuild/freebsd-arm64" "0.27.3" "@esbuild/freebsd-x64" "0.27.3" "@esbuild/linux-arm" "0.27.3" "@esbuild/linux-arm64" "0.27.3" "@esbuild/linux-ia32" "0.27.3" "@esbuild/linux-loong64" "0.27.3" "@esbuild/linux-mips64el" "0.27.3" "@esbuild/linux-ppc64" "0.27.3" "@esbuild/linux-riscv64" "0.27.3" "@esbuild/linux-s390x" "0.27.3" "@esbuild/linux-x64" "0.27.3" "@esbuild/netbsd-arm64" "0.27.3" "@esbuild/netbsd-x64" "0.27.3" "@esbuild/openbsd-arm64" "0.27.3" "@esbuild/openbsd-x64" "0.27.3" "@esbuild/openharmony-arm64" "0.27.3" "@esbuild/sunos-x64" "0.27.3" "@esbuild/win32-arm64" "0.27.3" "@esbuild/win32-ia32" "0.27.3" "@esbuild/win32-x64" "0.27.3" esbuild@^0.27.0: version "0.27.4" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.4.tgz#b9591dd7e0ab803a11c9c3b602850403bef22f00" integrity sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ== optionalDependencies: "@esbuild/aix-ppc64" "0.27.4" "@esbuild/android-arm" "0.27.4" "@esbuild/android-arm64" "0.27.4" "@esbuild/android-x64" "0.27.4" "@esbuild/darwin-arm64" "0.27.4" "@esbuild/darwin-x64" "0.27.4" "@esbuild/freebsd-arm64" "0.27.4" "@esbuild/freebsd-x64" "0.27.4" "@esbuild/linux-arm" "0.27.4" "@esbuild/linux-arm64" "0.27.4" "@esbuild/linux-ia32" "0.27.4" "@esbuild/linux-loong64" "0.27.4" "@esbuild/linux-mips64el" "0.27.4" "@esbuild/linux-ppc64" "0.27.4" "@esbuild/linux-riscv64" "0.27.4" "@esbuild/linux-s390x" "0.27.4" "@esbuild/linux-x64" "0.27.4" "@esbuild/netbsd-arm64" "0.27.4" "@esbuild/netbsd-x64" "0.27.4" "@esbuild/openbsd-arm64" "0.27.4" "@esbuild/openbsd-x64" "0.27.4" "@esbuild/openharmony-arm64" "0.27.4" "@esbuild/sunos-x64" "0.27.4" "@esbuild/win32-arm64" "0.27.4" "@esbuild/win32-ia32" "0.27.4" "@esbuild/win32-x64" "0.27.4" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" estraverse "^4.1.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter2@~0.4.13: version "0.4.14" resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" integrity sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ== eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== eventemitter3@^5.0.1: version "5.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== events@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== exit@~0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== dependencies: homedir-polyfill "^1.0.1" exponential-backoff@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== express@^4.22.1: version "4.22.1" resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "~1.20.3" content-disposition "~0.5.4" content-type "~1.0.4" cookie "~0.7.1" cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" finalhandler "~1.3.1" fresh "~0.5.2" http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" on-finished "~2.4.1" parseurl "~1.3.3" path-to-regexp "~0.1.12" proxy-addr "~2.0.7" qs "~6.14.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "~0.19.0" serve-static "~1.16.2" setprototypeof "1.2.0" statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext-list@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz" integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== dependencies: mime-db "^1.28.0" ext-name@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz" integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== dependencies: ext-list "^2.0.0" sort-keys-length "^1.0.0" extend@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: debug "^4.1.1" get-stream "^5.1.0" yauzl "^2.10.0" optionalDependencies: "@types/yauzl" "^2.9.1" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-uri@^3.0.1: version "3.0.3" resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz" integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz" integrity sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ== dependencies: websocket-driver ">=0.5.1" fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" fdir@^6.4.4: version "6.4.6" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== fdir@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== figures@^1.0.0: version "1.7.0" resolved "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" file-sync-cmp@^0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz" integrity sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA== file-type@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz" integrity sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g== file-type@^3.8.0: version "3.9.0" resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== file-type@^4.2.0: version "4.4.0" resolved "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz" integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ== file-type@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz" integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== file-type@^6.1.0: version "6.2.0" resolved "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz" integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz" integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== filenamify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz" integrity sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g== dependencies: filename-reserved-regex "^2.0.0" strip-outer "^1.0.0" trim-repeated "^1.0.0" fill-range@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" finalhandler@~1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "~2.4.1" parseurl "~1.3.3" statuses "~2.0.2" unpipe "~1.0.0" find-up@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" findup-sync@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== dependencies: detect-file "^1.0.0" is-glob "^4.0.0" micromatch "^4.0.2" resolve-dir "^1.0.1" findup-sync@~5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz" integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== dependencies: detect-file "^1.0.0" is-glob "^4.0.3" micromatch "^4.0.4" resolve-dir "^1.0.1" fined@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz" integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== dependencies: expand-tilde "^2.0.2" is-plain-object "^2.0.3" object.defaults "^1.1.0" object.pick "^1.2.0" parse-filepath "^1.0.1" flagged-respawn@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz" integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== flat@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0, follow-redirects@^1.14.0: version "1.15.9" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-in@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== for-own@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== dependencies: for-in "^1.0.1" foreground-child@^3.1.0: version "3.3.0" resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^5.3.4: version "5.3.4" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== from2@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" readable-stream "^2.0.0" fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^11.3.0: version "11.3.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-minipass@^3.0.0, fs-minipass@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz" integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: minipass "^7.0.3" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gaze@^1.1.0: version "1.1.3" resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz" integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== dependencies: globule "^1.0.0" gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz#ce7008fe345edcf5497a6f557cfa54bc318a9ce7" integrity sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA== get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: version "1.2.6" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz" integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== dependencies: call-bind-apply-helpers "^1.0.1" dunder-proto "^1.0.0" es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" function-bind "^1.1.2" gopd "^1.2.0" has-symbols "^1.1.0" hasown "^2.0.2" math-intrinsics "^1.0.0" get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-stream@^2.2.0: version "2.3.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz" integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== dependencies: object-assign "^4.0.1" pinkie-promise "^2.0.0" get-stream@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" getobject@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz" integrity sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg== github-api@^3.4.0: version "3.4.0" resolved "https://registry.npmjs.org/github-api/-/github-api-3.4.0.tgz" integrity sha512-2yYqYS6Uy4br1nw0D3VrlYWxtGTkUhIZrumBrcBwKdBOzMT8roAe8IvI6kjIOkxqxapKR5GkEsHtz3Du/voOpA== dependencies: axios "^0.21.1" debug "^2.2.0" js-base64 "^2.1.9" utf8 "^2.1.1" glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-promise@^6.0.7: version "6.0.7" resolved "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.7.tgz" integrity sha512-DEAe6br1w8ZF+y6KM2pzgdfhpreladtNvyNNVgSkxxkFWzXTJFXxQrJQQbAnc7kL0EUd7w5cR8u4K0P4+/q+Gw== glob-to-regex.js@^1.0.0, glob-to-regex.js@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.2.2, glob@^10.3.10, glob@^10.3.7, glob@^10.4.5: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.0.3, glob@^7.1.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" glob@^8.0.3: version "8.1.0" resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^5.0.1" once "^1.3.0" glob@~7.1.1, glob@~7.1.6: version "7.1.7" resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" global-modules@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" resolve-dir "^1.0.0" global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" ini "^1.3.4" is-windows "^1.0.1" which "^1.2.14" globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" globule@^1.0.0: version "1.3.4" resolved "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz" integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg== dependencies: glob "~7.1.1" lodash "^4.17.21" minimatch "~3.0.2" gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^8.3.1: version "8.3.2" resolved "https://registry.npmjs.org/got/-/got-8.3.2.tgz" integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== dependencies: "@sindresorhus/is" "^0.7.0" cacheable-request "^2.1.1" decompress-response "^3.3.0" duplexer3 "^0.1.4" get-stream "^3.0.0" into-stream "^3.1.0" is-retry-allowed "^1.1.0" isurl "^1.0.0-alpha5" lowercase-keys "^1.0.0" mimic-response "^1.0.0" p-cancelable "^0.4.0" p-timeout "^2.0.1" pify "^3.0.0" safe-buffer "^5.1.1" timed-out "^4.0.1" url-parse-lax "^3.0.0" url-to-options "^1.0.1" graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grunt-cli@~1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz" integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ== dependencies: grunt-known-options "~2.0.0" interpret "~1.1.0" liftup "~3.0.1" nopt "~4.0.1" v8flags "~3.2.0" grunt-contrib-clean@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz" integrity sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA== dependencies: async "^3.2.3" rimraf "^2.6.2" grunt-contrib-copy@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz" integrity sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA== dependencies: chalk "^1.1.1" file-sync-cmp "^0.1.0" grunt-contrib-htmlmin@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/grunt-contrib-htmlmin/-/grunt-contrib-htmlmin-3.1.0.tgz" integrity sha512-Khaa+0MUuqqNroDIe9tsjZkioZnW2Y+iTGbonBkLWaG7+SkSFExfb4jLt7M6rxKV3RSqlS7NtVvu4SVIPkmKXg== dependencies: chalk "^2.4.2" html-minifier "^4.0.0" pretty-bytes "^5.1.0" grunt-contrib-watch@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz" integrity sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg== dependencies: async "^2.6.0" gaze "^1.1.0" lodash "^4.17.10" tiny-lr "^1.1.1" grunt-known-options@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz" integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA== grunt-legacy-log-utils@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz" integrity sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw== dependencies: chalk "~4.1.0" lodash "~4.17.19" grunt-legacy-log@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz" integrity sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA== dependencies: colors "~1.1.2" grunt-legacy-log-utils "~2.1.0" hooker "~0.2.3" lodash "~4.17.19" grunt-legacy-util@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz" integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w== dependencies: async "~3.2.0" exit "~0.1.2" getobject "~1.0.0" hooker "~0.2.3" lodash "~4.17.21" underscore.string "~3.3.5" which "~2.0.2" grunt@^1.6.1: version "1.6.1" resolved "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz" integrity sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA== dependencies: dateformat "~4.6.2" eventemitter2 "~0.4.13" exit "~0.1.2" findup-sync "~5.0.0" glob "~7.1.6" grunt-cli "~1.4.3" grunt-known-options "~2.0.0" grunt-legacy-log "~3.0.0" grunt-legacy-util "~2.0.1" iconv-lite "~0.6.3" js-yaml "~3.14.0" minimatch "~3.0.4" nopt "~3.0.6" handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz" integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== dependencies: has-symbol-support-x "^1.4.1" hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" hooker@^0.2.3, hooker@~0.2.3: version "0.2.3" resolved "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" integrity sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA== hosted-git-info@^8.0.0, hosted-git-info@^8.0.2: version "8.0.2" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz" integrity sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg== dependencies: lru-cache "^10.0.1" hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" readable-stream "^2.0.1" wbuf "^1.1.0" html-escaper@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== html-loader@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/html-loader/-/html-loader-5.1.0.tgz" integrity sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA== dependencies: html-minifier-terser "^7.2.0" parse5 "^7.1.2" html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" clean-css "^5.2.2" commander "^8.3.0" he "^1.2.0" param-case "^3.0.4" relateurl "^0.2.7" terser "^5.10.0" html-minifier-terser@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz" integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== dependencies: camel-case "^4.1.2" clean-css "~5.3.2" commander "^10.0.0" entities "^4.4.0" param-case "^3.0.4" relateurl "^0.2.7" terser "^5.15.1" html-minifier@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz" integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== dependencies: camel-case "^3.0.0" clean-css "^4.2.1" commander "^2.19.0" he "^1.2.0" param-case "^2.1.1" relateurl "^0.2.7" uglify-js "^3.5.1" html-webpack-plugin@^5.6.6: version "5.6.6" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz#5321b9579f4a1949318550ced99c2a4a4e60cbaf" integrity sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" lodash "^4.17.21" pretty-error "^4.0.0" tapable "^2.0.0" htmlparser2@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-10.1.0.tgz#fe3f2e12c73b6e462d4e10395db9c1119e4d6ae4" integrity sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ== dependencies: domelementtype "^2.3.0" domhandler "^5.0.3" domutils "^3.2.2" entities "^7.0.1" htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" domhandler "^4.0.0" domutils "^2.5.2" entities "^2.0.0" http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== http-errors@~1.6.2: version "1.6.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" http-errors@~2.0.0, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: depd "~2.0.0" inherits "~2.0.4" setprototypeof "~1.2.0" statuses "~2.0.2" toidentifier "~1.0.1" http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^7.0.0: version "7.0.2" resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" debug "^4.3.4" http-proxy-middleware@3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz#9dcde663edc44079bc5a9c63e03fe5e5d6037fab" integrity sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg== dependencies: "@types/http-proxy" "^1.17.15" debug "^4.3.6" http-proxy "^1.18.1" is-glob "^4.0.3" is-plain-object "^5.0.0" micromatch "^4.0.8" http-proxy-middleware@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" is-glob "^4.0.1" is-plain-obj "^3.0.0" micromatch "^4.0.2" http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" https-proxy-agent@7.0.6, https-proxy-agent@^7.0.1: version "7.0.6" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" debug "4" humanize-duration@^3.33.2: version "3.33.2" resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.33.2.tgz#2e41986eabb00cb5ad0eef616a78233099dbdac4" integrity sha512-K7Ny/ULO1hDm2nnhvAY+SJV1skxFb61fd073SG1IWJl+D44ULrruCuTyjHKjBVVcSuTlnY99DKtgEG39CM5QOQ== hyperdyperid@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@~0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ieee754@^1.1.13: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-walk@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz" integrity sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ== dependencies: minimatch "^9.0.0" image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== immutable@^5.0.2, immutable@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.5.tgz#93ee4db5c2a9ab42a4a783069f3c5d8847d40165" integrity sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A== import-fresh@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-local@^3.0.2: version "3.2.0" resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.4: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz" integrity sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw== init-package-json@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-8.0.0.tgz#feaa2e5e949c68bec3bcfb25c1b7075ffe6fc88b" integrity sha512-zKgxfaGt6Zzi8VBSInOK0CYDigA9gzDCWPnSzGIoUlTU/5w7qIyi+6MyJYX96mMlxDGrIR85FhQszVyodYfB9g== dependencies: "@npmcli/package-json" "^6.1.0" npm-package-arg "^12.0.0" promzard "^2.0.0" read "^4.0.0" semver "^7.3.5" validate-npm-package-license "^3.0.4" validate-npm-package-name "^6.0.0" interpret@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== interpret@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz" integrity sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA== into-stream@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz" integrity sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ== dependencies: from2 "^2.1.1" p-is-promise "^1.1.0" ip-address@^9.0.5: version "9.0.5" resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== dependencies: jsbn "1.1.0" sprintf-js "^1.1.3" ip-regex@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz" integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== dependencies: is-relative "^1.0.0" is-windows "^1.0.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-cidr@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/is-cidr/-/is-cidr-5.1.0.tgz" integrity sha512-OkVS+Ht2ssF27d48gZdB+ho1yND1VbkJRKKS6Pc1/Cw7uqkd9IOJg8/bTwBDQL6tfBhSdguPRnlGiE8pU/X5NQ== dependencies: cidr-regex "^4.1.1" is-core-module@^2.16.0, is-core-module@^2.16.1: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-docker@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finite@^1.0.1: version "1.1.0" resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^5.0.0, is-fullwidth-code-point@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== dependencies: get-east-asian-width "^1.3.1" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-in-ssh@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-in-ssh/-/is-in-ssh-1.0.0.tgz#8eb73c1cabba77748d389588eeea132a63057622" integrity sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw== is-inside-container@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== dependencies: is-docker "^3.0.0" is-interactive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz" integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== is-network-error@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz" integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g== is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-object@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== dependencies: is-path-inside "^2.1.0" is-path-inside@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== dependencies: path-is-inside "^1.0.2" is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-relative@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: is-unc-path "^1.0.0" is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== dependencies: unc-path-regex "^0.1.2" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-unicode-supported@^2.0.0, is-unicode-supported@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== is-windows@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== dependencies: is-inside-container "^1.0.0" isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isexe@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" "@babel/parser" "^7.23.9" "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz" integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== dependencies: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" jest-regex-util@30.0.1: version "30.0.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== jest-util@30.2.0: version "30.2.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705" integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== dependencies: "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" ci-info "^4.2.0" graceful-fs "^4.2.11" picomatch "^4.0.2" jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" jest-worker@^30.0.5: version "30.2.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== dependencies: "@types/node" "*" "@ungap/structured-clone" "^1.3.0" jest-util "30.2.0" merge-stream "^2.0.0" supports-color "^8.1.1" jit-grunt@^0.10.0: version "0.10.0" resolved "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz" integrity sha512-eT/f4c9wgZ3buXB7X1JY1w6uNtAV0bhrbOGf/mFmBb0CDNLUETJ/VRoydayWOI54tOoam0cz9RooVCn3QY1WoA== jiti@^2.5.1: version "2.6.1" resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== js-base64@^2.1.9: version "2.6.4" resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== js-htmlencode@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/js-htmlencode/-/js-htmlencode-0.3.0.tgz" integrity sha512-HedYg9SJsimM4aca37Lj0Ct0eZ1WT8CCxlgMPfUV7mCc6g3UfEUHy2b9qfzuC0uwk4gjVEJKrkWbPSdnUJBFTQ== js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" js-yaml@~3.14.0: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" jsbn@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-parse-even-better-errors@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz" integrity sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== just-diff-apply@^5.2.0: version "5.5.0" resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz" integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== just-diff@^6.0.0: version "6.0.2" resolved "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz" integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== karma-source-map-support@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== dependencies: source-map-support "^0.5.5" keyv@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz" integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== dependencies: json-buffer "3.0.0" kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== launch-editor@^2.6.1: version "2.9.1" resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz" integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" less-loader@12.3.1: version "12.3.1" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.3.1.tgz#4b80179507d522fa3082c19a09d08e50b9495ac3" integrity sha512-JZZmG7gMzoDP3VGeEG8Sh6FW5wygB5jYL7Wp29FFihuRTsIBacqO3LbRPr2yStYD11riVf13selLm/CPFRDBRQ== less@4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/less/-/less-4.4.2.tgz#fa4291fdb0334de91163622cc038f4bd3eb6b8d7" integrity sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" tslib "^2.3.0" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" image-size "~0.5.0" make-dir "^2.1.0" mime "^1.4.1" needle "^3.1.0" source-map "~0.6.0" libnpmaccess@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-10.0.0.tgz#a5279a683af982fa971599d37ed471e59339bd01" integrity sha512-Nz9Lolajvh6nPA5ixdKNfN2BJS0N7LvqTXPqy3+F37i3T4mcped24JCjwnp5KCPCB0ewX3ccopwUnhaTS1/yXg== dependencies: npm-package-arg "^12.0.0" npm-registry-fetch "^18.0.1" libnpmdiff@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-8.0.0.tgz#940f3a3d70207a90b5eab290f6b3e0ab428a027e" integrity sha512-Ul1oGHnlQ9+bpNdaKDXZEqolJxg81xp2KG5QgVZThSS/ypLFpkcQjHeOHR99ZdxK483s1z2vdiCUMghpDo+0pg== dependencies: "@npmcli/arborist" "^9.0.0" "@npmcli/installed-package-contents" "^3.0.0" binary-extensions "^3.0.0" diff "^7.0.0" minimatch "^9.0.4" npm-package-arg "^12.0.0" pacote "^21.0.0" tar "^6.2.1" libnpmexec@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-10.0.0.tgz#16aff2dc73309b7a39232fd583400e6efe0a705a" integrity sha512-kB1d44LhwvUT/0Ln+rwM8Yw2QmHZ2wSCJaqXnw5K17Iuzqy+TKSlNJNWUlLSTAD/WSGLT6lruZO09H+uRLAAdw== dependencies: "@npmcli/arborist" "^9.0.0" "@npmcli/run-script" "^9.0.1" ci-info "^4.0.0" npm-package-arg "^12.0.0" pacote "^21.0.0" proc-log "^5.0.0" read "^4.0.0" read-package-json-fast "^4.0.0" semver "^7.3.7" walk-up-path "^4.0.0" libnpmfund@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-7.0.0.tgz#9295682784fef9adcfb315a1ebafc1e0e236477d" integrity sha512-uiL9lsC2/E0JX/+gKfwlsGj2W5Cd0MHss5w0yZ7gSIyYn+KhytOBdD/1GB6Kwg5V7LAm07XEEbnWYwzUBS0Tjw== dependencies: "@npmcli/arborist" "^9.0.0" libnpmorg@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-8.0.0.tgz#e133658149f7e70f5536511a8501ad9348559c2e" integrity sha512-VO/mxds3Qu67S7/3TsFbykN+7kzpes14P/RiO3ECtLtUYQdlE5ddXGArRgU2tP4hUHZRvyBhc4sSiAXEzTA4eQ== dependencies: aproba "^2.0.0" npm-registry-fetch "^18.0.1" libnpmpack@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-9.0.0.tgz#3841750d69037f80ffa69829857871f3588a04c7" integrity sha512-6UBeHebxorKuFZq6qQDV1PIjfZo6OvyzXMfI2UsRtrhlFDsOQsg9H2mZQwPryQXTOO/ifHxnjpmZmJdVn5INTg== dependencies: "@npmcli/arborist" "^9.0.0" "@npmcli/run-script" "^9.0.1" npm-package-arg "^12.0.0" pacote "^21.0.0" libnpmpublish@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-11.0.0.tgz#7b1bd0d4e2b388add88e53cc8d689307adbad355" integrity sha512-c+cBWLWXafHzmSEQwRVKjHP6KkWntvqvAAT83agwmWrOwRpEXWDtiIlkopwzPcLRau6BcS6BwOttTlAWboH3BQ== dependencies: ci-info "^4.0.0" normalize-package-data "^7.0.0" npm-package-arg "^12.0.0" npm-registry-fetch "^18.0.1" proc-log "^5.0.0" semver "^7.3.7" sigstore "^3.0.0" ssri "^12.0.0" libnpmsearch@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-9.0.0.tgz#dfe2e86ef28a24d8687f79480a045f002b38542d" integrity sha512-uMUbX5ynU/imuXlijCPathemyi1EZVtka9PEbaIqghdrjdHmMJITbyTsmSB+muzBWm1NUUFwRRKdpwktEmvipg== dependencies: npm-registry-fetch "^18.0.1" libnpmteam@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-8.0.0.tgz#d537352ce727aa57fb1acef318d69571b011d04c" integrity sha512-GfbxITlY4rVe3PKUU6wBjfNNc4Xho9Jv03N0sdzqho9H+9hynFjiwJpfWGwfVBdtimH+kPQW58qRUMott/Bkyg== dependencies: aproba "^2.0.0" npm-registry-fetch "^18.0.1" libnpmversion@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-8.0.0.tgz#68998a1eb2c9c068e721e9221073d78edb4efc73" integrity sha512-nqHD/YQtC/xLRquvFj2W2hvTNAIWSssJdz5ULCV0jAGBxjlQaPS9s8FNIiJ3w+iina+pCJo5AmlBjA7oWew0JQ== dependencies: "@npmcli/git" "^6.0.1" "@npmcli/run-script" "^9.0.1" json-parse-even-better-errors "^4.0.0" proc-log "^5.0.0" semver "^7.3.7" license-webpack-plugin@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6" integrity sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw== dependencies: webpack-sources "^3.0.0" liftup@~3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz" integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw== dependencies: extend "^3.0.2" findup-sync "^4.0.0" fined "^1.2.0" flagged-respawn "^1.0.1" is-plain-object "^2.0.4" object.map "^1.0.1" rechoir "^0.7.0" resolve "^1.19.0" lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== listr2@9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/listr2/-/listr2-9.0.5.tgz#92df7c4416a6da630eb9ef46da469b70de97b316" integrity sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g== dependencies: cli-truncate "^5.0.0" colorette "^2.0.20" eventemitter3 "^5.0.1" log-update "^6.1.0" rfdc "^1.4.1" wrap-ansi "^9.0.0" livereload-js@^2.3.0: version "2.4.0" resolved "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== lmdb@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.5.1.tgz#36b41ad6f20cba355c7e9ddced54ac9e1418acf3" integrity sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg== dependencies: "@harperfast/extended-iterable" "^1.0.3" msgpackr "^1.11.2" node-addon-api "^6.1.0" node-gyp-build-optional-packages "5.2.2" ordered-binary "^1.5.3" weak-lru-cache "^1.2.2" optionalDependencies: "@lmdb/lmdb-darwin-arm64" "3.5.1" "@lmdb/lmdb-darwin-x64" "3.5.1" "@lmdb/lmdb-linux-arm" "3.5.1" "@lmdb/lmdb-linux-arm64" "3.5.1" "@lmdb/lmdb-linux-x64" "3.5.1" "@lmdb/lmdb-win32-arm64" "3.5.1" "@lmdb/lmdb-win32-x64" "3.5.1" loader-runner@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== loader-utils@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" locate-path@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.19, lodash@~4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lodash@^4.18.0: version "4.18.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.0.tgz#dfd726f07ab2e39dd763de28fcf66e395c03e440" integrity sha512-l1mfj2atMqndAHI3ls7XqPxEjV2J9ZkcNyHpoZA3r2T1LLwDB69jgkMWh71YKwhBbK0G2f4WSn05ahmQXVxupA== log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" log-symbols@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-7.0.1.tgz#f52e68037d96f589fc572ff2193dc424d48c195b" integrity sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg== dependencies: is-unicode-supported "^2.0.0" yoctocolors "^2.1.1" log-update@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" cli-cursor "^5.0.0" slice-ansi "^7.1.0" strip-ansi "^7.1.0" wrap-ansi "^9.0.0" lower-case@^1.1.1: version "1.1.4" resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz" integrity sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A== lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: version "10.4.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" magic-string@0.30.21: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" make-dir@^1.0.0: version "1.3.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" semver "^5.6.0" make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== dependencies: "@npmcli/agent" "^3.0.0" cacache "^19.0.1" http-cache-semantics "^4.1.1" minipass "^7.0.2" minipass-fetch "^4.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^1.0.0" proc-log "^5.0.0" promise-retry "^2.0.1" ssri "^12.0.0" make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== dependencies: kind-of "^6.0.2" map-cache@^0.2.0: version "0.2.2" resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== material-design-icons-iconfont@^6.7.0: version "6.7.0" resolved "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz" integrity sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA== math-intrinsics@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdn-data@2.0.28: version "2.0.28" resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz" integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== mdn-data@2.0.30: version "2.0.30" resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^4.43.1: version "4.57.1" resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.57.1.tgz#5ccee42e2aab1cf086c45baf9c4ef1ff4fffb123" integrity sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ== dependencies: "@jsonjoy.com/fs-core" "4.57.1" "@jsonjoy.com/fs-fsa" "4.57.1" "@jsonjoy.com/fs-node" "4.57.1" "@jsonjoy.com/fs-node-builtins" "4.57.1" "@jsonjoy.com/fs-node-to-fsa" "4.57.1" "@jsonjoy.com/fs-node-utils" "4.57.1" "@jsonjoy.com/fs-print" "4.57.1" "@jsonjoy.com/fs-snapshot" "4.57.1" "@jsonjoy.com/json-pack" "^1.11.0" "@jsonjoy.com/util" "^1.9.0" glob-to-regex.js "^1.0.1" thingies "^2.5.0" tree-dump "^1.0.3" tslib "^2.0.0" memfs@^4.6.0: version "4.15.1" resolved "https://registry.npmjs.org/memfs/-/memfs-4.15.1.tgz" integrity sha512-ufCzgFwiVnR6R9cCYuvwznJdhdYXEvFl0hpnM4cCtVaVkHuqBR+6fo2sqt1SSMdp+uiHw9GyPZr3OMM5tqjSmQ== dependencies: "@jsonjoy.com/json-pack" "^1.0.3" "@jsonjoy.com/util" "^1.3.0" tree-dump "^1.0.1" tslib "^2.0.0" merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: version "1.53.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== mime-db@^1.54.0: version "1.54.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime-types@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== dependencies: mime-db "^1.54.0" mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-function@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mini-css-extract-plugin@2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz#d801a1f388f8fac7333c01b7c15c9222c811def4" integrity sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" mini-css-extract-plugin@^2.10.2: version "2.10.2" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz#5c85ec9450c05d26e32531b465a15a08c3a57253" integrity sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimatch@*: version "10.2.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== dependencies: brace-expansion "^5.0.2" minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minimatch@^9.0.0, minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimatch@~3.0.2, minimatch@~3.0.4: version "3.0.8" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz" integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== dependencies: brace-expansion "^1.1.7" minipass-collect@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz" integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== dependencies: minipass "^7.0.3" minipass-fetch@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz" integrity sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w== dependencies: minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^3.0.1" optionalDependencies: encoding "^0.1.13" minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass-sized@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.1, minipass@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" minizlib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz" integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg== dependencies: minipass "^7.0.4" rimraf "^5.0.5" mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== mobile-detect@^1.4.5: version "1.4.5" resolved "https://registry.npmjs.org/mobile-detect/-/mobile-detect-1.4.5.tgz" integrity sha512-yc0LhH6tItlvfLBugVUEtgawwFU2sIe+cSdmRJJCTMZ5GEJyLxNyC/NIOAOGk67Fa8GNpOttO3Xz/1bHpXFD/g== mocha@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.1.0.tgz#20d7c6ac4d6d6bcb60a8aa47971fca74c65c3c66" integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg== dependencies: ansi-colors "^4.1.3" browser-stdout "^1.3.1" chokidar "^3.5.3" debug "^4.3.5" diff "^5.2.0" escape-string-regexp "^4.0.0" find-up "^5.0.0" glob "^10.4.5" he "^1.2.0" js-yaml "^4.1.0" log-symbols "^4.1.0" minimatch "^5.1.6" ms "^2.1.3" serialize-javascript "^6.0.2" strip-json-comments "^3.1.1" supports-color "^8.1.1" workerpool "^6.5.1" yargs "^17.7.2" yargs-parser "^21.1.1" yargs-unparser "^2.0.0" mrmime@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== mrmime@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.3, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== msgpackr-extract@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012" integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== dependencies: node-gyp-build-optional-packages "5.2.2" optionalDependencies: "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3" "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" msgpackr@^1.11.2: version "1.11.9" resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.9.tgz#1aa99ed379a066374ac82b62f8ad70723bbd3a59" integrity sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw== optionalDependencies: msgpackr-extract "^3.0.2" multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" mute-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" thenify-all "^1.0.0" nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== needle@^3.1.0: version "3.5.0" resolved "https://registry.yarnpkg.com/needle/-/needle-3.5.0.tgz#aa2023642cb41b11a11babb733fd8fa952919112" integrity sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w== dependencies: iconv-lite "^0.6.3" sax "^1.2.4" negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== negotiator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== negotiator@~0.6.4: version "0.6.4" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== no-case@^2.2.0: version "2.3.2" resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" tslib "^2.0.3" node-addon-api@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== node-addon-api@^7.0.0: version "7.1.1" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-gyp-build-optional-packages@5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== dependencies: detect-libc "^2.0.1" node-gyp@^11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz" integrity sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" glob "^10.3.10" graceful-fs "^4.2.6" make-fetch-happen "^14.0.3" nopt "^8.0.0" proc-log "^5.0.0" semver "^7.3.5" tar "^7.4.3" which "^5.0.0" node-releases@^2.0.19: version "2.0.19" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-releases@^2.0.27: version "2.0.36" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== nopt@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz" integrity sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw== dependencies: abbrev "^2.0.0" nopt@~3.0.6: version "3.0.6" resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" nopt@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" osenv "^0.1.4" normalize-package-data@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz" integrity sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA== dependencies: hosted-git-info "^8.0.0" semver "^7.3.5" validate-npm-package-license "^3.0.4" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz" integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== dependencies: prepend-http "^2.0.0" query-string "^5.0.1" sort-keys "^2.0.0" npm-audit-report@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-6.0.0.tgz" integrity sha512-Ag6Y1irw/+CdSLqEEAn69T8JBgBThj5mw0vuFIKeP7hATYuQuS5jkMjK6xmVB8pr7U4g5Audbun0lHhBDMIBRA== npm-bundled@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz" integrity sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA== dependencies: npm-normalize-package-bin "^4.0.0" npm-check-updates@^17.1.14: version "17.1.14" resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-17.1.14.tgz#68285d98b296656bf7a8f747123c51d1adbdbb2b" integrity sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA== npm-install-checks@^7.1.0, npm-install-checks@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz" integrity sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg== dependencies: semver "^7.1.1" npm-normalize-package-bin@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz" integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== npm-package-arg@^12.0.0, npm-package-arg@^12.0.1: version "12.0.1" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz" integrity sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ== dependencies: hosted-git-info "^8.0.0" proc-log "^5.0.0" semver "^7.3.5" validate-npm-package-name "^6.0.0" npm-packlist@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-10.0.0.tgz#35634f0a90f84a811ebdf565eb78d2b36252888c" integrity sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg== dependencies: ignore-walk "^7.0.0" npm-pick-manifest@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz" integrity sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ== dependencies: npm-install-checks "^7.1.0" npm-normalize-package-bin "^4.0.0" npm-package-arg "^12.0.0" semver "^7.3.5" npm-profile@^11.0.1: version "11.0.1" resolved "https://registry.npmjs.org/npm-profile/-/npm-profile-11.0.1.tgz" integrity sha512-HP5Cw9WHwFS9vb4fxVlkNAQBUhVL5BmW6rAR+/JWkpwqcFJid7TihKUdYDWqHl0NDfLd0mpucheGySqo8ysyfw== dependencies: npm-registry-fetch "^18.0.0" proc-log "^5.0.0" npm-registry-fetch@^18.0.0, npm-registry-fetch@^18.0.1, npm-registry-fetch@^18.0.2: version "18.0.2" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz" integrity sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ== dependencies: "@npmcli/redact" "^3.0.0" jsonparse "^1.3.1" make-fetch-happen "^14.0.0" minipass "^7.0.2" minipass-fetch "^4.0.0" minizlib "^3.0.1" npm-package-arg "^12.0.0" proc-log "^5.0.0" npm-user-validate@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-3.0.0.tgz" integrity sha512-9xi0RdSmJ4mPYTC393VJPz1Sp8LyCx9cUnm/L9Qcb3cFO8gjT4mN20P9FAsea8qDHdQ7LtcN8VLh2UT47SdKCw== npm@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/npm/-/npm-11.1.0.tgz#dba08f7d0f5301ebedaf968b4f74b2282f97a750" integrity sha512-rPMBrZud26lI/LcjQeLw/K5Hf1apXMKgkpNNEzp0YQYmM877+T1ZNKPcB2hnTi7e6fBNz8xLtMMn/w46fVUqGw== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/arborist" "^9.0.0" "@npmcli/config" "^10.0.1" "@npmcli/fs" "^4.0.0" "@npmcli/map-workspaces" "^4.0.2" "@npmcli/package-json" "^6.1.1" "@npmcli/promise-spawn" "^8.0.2" "@npmcli/redact" "^3.0.0" "@npmcli/run-script" "^9.0.1" "@sigstore/tuf" "^3.0.0" abbrev "^3.0.0" archy "~1.0.0" cacache "^19.0.1" chalk "^5.4.1" ci-info "^4.1.0" cli-columns "^4.0.0" fastest-levenshtein "^1.0.16" fs-minipass "^3.0.3" glob "^10.4.5" graceful-fs "^4.2.11" hosted-git-info "^8.0.2" ini "^5.0.0" init-package-json "^8.0.0" is-cidr "^5.1.0" json-parse-even-better-errors "^4.0.0" libnpmaccess "^10.0.0" libnpmdiff "^8.0.0" libnpmexec "^10.0.0" libnpmfund "^7.0.0" libnpmorg "^8.0.0" libnpmpack "^9.0.0" libnpmpublish "^11.0.0" libnpmsearch "^9.0.0" libnpmteam "^8.0.0" libnpmversion "^8.0.0" make-fetch-happen "^14.0.3" minimatch "^9.0.5" minipass "^7.1.1" minipass-pipeline "^1.2.4" ms "^2.1.2" node-gyp "^11.0.0" nopt "^8.0.0" normalize-package-data "^7.0.0" npm-audit-report "^6.0.0" npm-install-checks "^7.1.1" npm-package-arg "^12.0.1" npm-pick-manifest "^10.0.0" npm-profile "^11.0.1" npm-registry-fetch "^18.0.2" npm-user-validate "^3.0.0" p-map "^7.0.3" pacote "^21.0.0" parse-conflict-json "^4.0.0" proc-log "^5.0.0" qrcode-terminal "^0.12.0" read "^4.0.0" semver "^7.6.3" spdx-expression-parse "^4.0.0" ssri "^12.0.0" supports-color "^9.4.0" tar "^6.2.1" text-table "~0.2.0" tiny-relative-date "^1.3.0" treeverse "^3.0.0" validate-npm-package-name "^6.0.0" which "^5.0.0" nth-check@^2.0.1, nth-check@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3: version "1.13.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" integrity sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA== dependencies: array-each "^1.0.1" array-slice "^1.0.0" for-own "^1.0.0" isobject "^3.0.0" object.map@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz" integrity sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== dependencies: for-own "^1.0.0" make-iterator "^1.0.0" object.pick@^1.2.0: version "1.3.0" resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-headers@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" open@11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/open/-/open-11.0.0.tgz#897e6132f994d3554cbcf72e0df98f176a7e5f62" integrity sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw== dependencies: default-browser "^5.4.0" define-lazy-prop "^3.0.0" is-in-ssh "^1.0.0" is-inside-container "^1.0.0" powershell-utils "^0.1.0" wsl-utils "^0.3.0" open@^10.0.3: version "10.1.0" resolved "https://registry.npmjs.org/open/-/open-10.1.0.tgz" integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== dependencies: default-browser "^5.2.1" define-lazy-prop "^3.0.0" is-inside-container "^1.0.0" is-wsl "^3.1.0" opener@^1.5.2: version "1.5.2" resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== ora@9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-9.3.0.tgz#187c87cc1062350f549f481de32bf91424c2b0e3" integrity sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw== dependencies: chalk "^5.6.2" cli-cursor "^5.0.0" cli-spinners "^3.2.0" is-interactive "^2.0.0" is-unicode-supported "^2.1.0" log-symbols "^7.0.1" stdin-discarder "^0.3.1" string-width "^8.1.0" ordered-binary@^1.5.3: version "1.6.1" resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.6.1.tgz#5ac240ea719d6a0e6d4f0485385d3f9cb1cd4432" integrity sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w== os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@^0.1.4: version "0.1.5" resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" p-cancelable@^0.4.0: version "0.4.1" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== p-event@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz" integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== dependencies: p-timeout "^2.0.1" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-is-promise@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz" integrity sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg== p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-map@^7.0.2, p-map@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz" integrity sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA== p-retry@^6.2.0: version "6.2.1" resolved "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz" integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== dependencies: "@types/retry" "0.12.2" is-network-error "^1.0.0" retry "^0.13.1" p-timeout@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz" integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== dependencies: p-finally "^1.0.0" p-try@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== pacote@^21.0.0: version "21.0.0" resolved "https://registry.yarnpkg.com/pacote/-/pacote-21.0.0.tgz#5fe3878a9f808ca5c455c4c1d8ca46eb13351f7b" integrity sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA== dependencies: "@npmcli/git" "^6.0.0" "@npmcli/installed-package-contents" "^3.0.0" "@npmcli/package-json" "^6.0.0" "@npmcli/promise-spawn" "^8.0.0" "@npmcli/run-script" "^9.0.0" cacache "^19.0.0" fs-minipass "^3.0.0" minipass "^7.0.2" npm-package-arg "^12.0.0" npm-packlist "^10.0.0" npm-pick-manifest "^10.0.0" npm-registry-fetch "^18.0.0" proc-log "^5.0.0" promise-retry "^2.0.1" sigstore "^3.0.0" ssri "^12.0.0" tar "^6.1.11" param-case@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== dependencies: no-case "^2.2.0" param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" tslib "^2.0.3" parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-conflict-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz" integrity sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ== dependencies: json-parse-even-better-errors "^4.0.0" just-diff "^6.0.0" just-diff-apply "^5.2.0" parse-filepath@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== dependencies: is-absolute "^1.0.0" map-cache "^0.2.0" path-root "^0.1.1" parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz" integrity sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg== parse-node-version@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse5-html-rewriting-stream@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz#3f442e5b5811a5456e2a56b68ea44ef153b44d92" integrity sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw== dependencies: entities "^6.0.0" parse5 "^8.0.0" parse5-sax-parser "^8.0.0" parse5-sax-parser@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz#49755efbd2b63846c7b908a297a874af00760715" integrity sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw== dependencies: parse5 "^8.0.0" parse5@^7.1.2: version "7.2.1" resolved "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz" integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== dependencies: entities "^4.5.0" parse5@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-8.0.0.tgz#aceb267f6b15f9b6e6ba9e35bfdd481fc2167b12" integrity sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA== dependencies: entities "^6.0.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" tslib "^2.0.3" path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== path-root@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: path-root-regex "^0.1.0" path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@~0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== pend@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@4.0.4, picomatch@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== piscina@5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/piscina/-/piscina-5.1.4.tgz#86ca2b8e42bcbfc258dc7b09d918ee04b2327a67" integrity sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg== optionalDependencies: "@napi-rs/nice" "^1.0.4" pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkijs@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.3.3.tgz#b3f04d7b2eaacb05c81675f882be374e591626ec" integrity sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw== dependencies: "@noble/hashes" "1.4.0" asn1js "^3.0.6" bytestreamjs "^2.0.1" pvtsutils "^1.3.6" pvutils "^1.1.3" tslib "^2.8.1" playwright-core@1.59.0: version "1.59.0" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.59.0.tgz#994d71ceffda76ea0f9e95eeb065db7532b87069" integrity sha512-PW/X/IoZ6BMUUy8rpwHEZ8Kc0IiLIkgKYGNFaMs5KmQhcfLILNx9yCQD0rnWeWfz1PNeqcFP1BsihQhDOBCwZw== playwright@1.59.0, playwright@^1.59.0: version "1.59.0" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.59.0.tgz#8d4b152c8d1c6b9e6e5bcb18b6cf62f51b9edb8b" integrity sha512-wihGScriusvATUxmhfENxg0tj1vHEFeIwxlnPFKQTOQVd7aG08mUfvvniRP/PtQOC+2Bs52kBOC/Up1jTXeIbw== dependencies: playwright-core "1.59.0" optionalDependencies: fsevents "2.3.2" plur@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz" integrity sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw== postcss-calc@^10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.1.tgz#52b385f2e628239686eb6e3a16207a43f36064ca" integrity sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw== dependencies: postcss-selector-parser "^7.0.0" postcss-value-parser "^4.2.0" postcss-colormin@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.3.tgz#602d093c6f186d5316a4516607ddf4f0073ae5a5" integrity sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA== dependencies: browserslist "^4.24.5" caniuse-api "^3.0.0" colord "^2.9.3" postcss-value-parser "^4.2.0" postcss-convert-values@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz#35263382f3197d83b865c0967ddc708cdde3115e" integrity sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw== dependencies: browserslist "^4.24.5" postcss-value-parser "^4.2.0" postcss-discard-comments@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz#9aded15cf437d14ee02b7589ee911b780cd73ffb" integrity sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg== dependencies: postcss-selector-parser "^7.1.0" postcss-discard-duplicates@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz#9cf3e659d4f94b046eef6f93679490c0250a8e4e" integrity sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w== postcss-discard-empty@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz#b6c57e8b5c69023169abea30dceb93f98a2ffd9f" integrity sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg== postcss-discard-overridden@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz#bd9c9bc5e4548d3b6e67e7f8d64f2c9d745ae2a0" integrity sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg== postcss-loader@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.2.0.tgz#9b830af550bc0829d565d4e774738d84df88eab7" integrity sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA== dependencies: cosmiconfig "^9.0.0" jiti "^2.5.1" semver "^7.6.2" postcss-media-query-parser@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== postcss-merge-longhand@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz#e1b126e92f583815482e8b1e82c47d2435a20421" integrity sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw== dependencies: postcss-value-parser "^4.2.0" stylehacks "^7.0.5" postcss-merge-rules@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz#08c009036172db1305f988c67b04881ee8aaa76b" integrity sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg== dependencies: browserslist "^4.24.5" caniuse-api "^3.0.0" cssnano-utils "^5.0.1" postcss-selector-parser "^7.1.0" postcss-minify-font-values@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz#6fb4770131b31fd5a2014bd84e32f386a3406664" integrity sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ== dependencies: postcss-value-parser "^4.2.0" postcss-minify-gradients@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz#933cb642dd00df397237c17194f37dcbe4cad739" integrity sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A== dependencies: colord "^2.9.3" cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" postcss-minify-params@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz#ff4d0f765b6cdb9aa10e805ca3012393206686c9" integrity sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg== dependencies: browserslist "^4.24.5" cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" postcss-minify-selectors@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz#d8c89eeeb208705ab4127a464d1f54a3bc22cae3" integrity sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug== dependencies: cssesc "^3.0.0" postcss-selector-parser "^7.1.0" postcss-modules-extract-imports@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz" integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.5: version "4.2.0" resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz" integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.2.0: version "3.2.1" resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz" integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-normalize-charset@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz#bccc3f7c5f4440883608eea8b444c8f41ce55ff6" integrity sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ== postcss-normalize-display-values@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz#feb40277d89a7f677b67a84cac999f0306e38235" integrity sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-positions@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz#c771c0d33034455205f060b999d8557c2308d22c" integrity sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-repeat-style@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz#05fe4d838eedbd996436c5cab78feef9bb1ae57b" integrity sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-string@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz#0f111e7b5dfb6de6ab19f09d9e1c16fabeee232f" integrity sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-timing-functions@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz#7b645a36f113fec49d95d56386c9980316c71216" integrity sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-unicode@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz#39092101a9dbe9cbac2e00e52c58a1390e9f2924" integrity sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw== dependencies: browserslist "^4.24.5" postcss-value-parser "^4.2.0" postcss-normalize-url@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz#d6471a22b6747ce93d7038c16eb9f1ba8b307e25" integrity sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-whitespace@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz#ab8e9ff1f3213f3f3851c0a7d0e4ce4716777cea" integrity sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA== dependencies: postcss-value-parser "^4.2.0" postcss-ordered-values@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz#0e803fbb9601e254270481772252de9a8c905f48" integrity sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw== dependencies: cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" postcss-reduce-initial@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz#3ab073ecaf9e549f4c49fb0727bab09daf486672" integrity sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA== dependencies: browserslist "^4.24.5" caniuse-api "^3.0.0" postcss-reduce-transforms@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz#f87111264b0dfa07e1f708d7e6401578707be5d6" integrity sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g== dependencies: postcss-value-parser "^4.2.0" postcss-safe-parser@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz#36e4f7e608111a0ca940fd9712ce034718c40ec0" integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-selector-parser@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz" integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-selector-parser@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-svgo@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.2.tgz#3de498299af585a5bfae28fd2a445edd1f4954f6" integrity sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA== dependencies: postcss-value-parser "^4.2.0" svgo "^3.3.2" postcss-unique-selectors@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz#625ad1c808bdf322fab6c027ae8d4f2637140995" integrity sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ== dependencies: postcss-selector-parser "^7.1.0" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@8.5.6, postcss@^8.4.40: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" source-map-js "^1.2.1" postcss@^8.2.14, postcss@^8.4.49, postcss@^8.5.6: version "8.5.8" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" source-map-js "^1.2.1" powershell-utils@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/powershell-utils/-/powershell-utils-0.1.0.tgz#5a42c9a824fb4f2f251ccb41aaae73314f5d6ac2" integrity sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A== prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== pretty-bytes@^5.1.0: version "5.6.0" resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== pretty-bytes@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-7.1.0.tgz#d788c9906241dbdcd4defab51b6d7470243db9bd" integrity sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw== pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" renderkid "^3.0.0" pretty-ms@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz" integrity sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg== dependencies: is-finite "^1.0.1" parse-ms "^1.0.0" plur "^1.0.0" proc-log@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz" integrity sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== proggy@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/proggy/-/proggy-3.0.0.tgz" integrity sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q== promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz" integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== promise-call-limit@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz" integrity sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw== promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" retry "^0.12.0" promzard@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/promzard/-/promzard-2.0.0.tgz" integrity sha512-Ncd0vyS2eXGOjchIRg6PVCYKetJYrW1BSbbIo+bKdig61TB6nH2RQNF2uP+qMpsI73L/jURLWojcw8JNIKZ3gg== dependencies: read "^4.0.0" proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pump@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pvtsutils@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== dependencies: tslib "^2.8.1" pvutils@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== qrcode-terminal@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== qs@^6.4.0: version "6.13.1" resolved "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz" integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== dependencies: side-channel "^1.0.6" qs@~6.14.0: version "6.14.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== dependencies: side-channel "^1.1.0" query-string@^5.0.1: version "5.1.1" resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" strict-uri-encode "^1.0.0" randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@~1.1.0: version "1.1.7" resolved "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz" integrity sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg== dependencies: bytes "1" string_decoder "0.10" raw-body@~2.5.3: version "2.5.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: bytes "~3.1.2" http-errors "~2.0.1" iconv-lite "~0.4.24" unpipe "~1.0.0" raw-loader@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" read-cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz" integrity sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw== read-package-json-fast@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" integrity sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg== dependencies: json-parse-even-better-errors "^4.0.0" npm-normalize-package-bin "^4.0.0" read@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read/-/read-4.0.0.tgz" integrity sha512-nbYGT3cec3J5NPUeJia7l72I3oIzMIB6yeNyDqi8CVHr3WftwjrCUqR0j13daoHEMVaZ/rxCpmHKrbods3hI2g== dependencies: mute-stream "^2.0.0" readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.1.1" util-deprecate "~1.0.1" readable-stream@^3.0.6: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readdirp@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz" integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== readdirp@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.7.0: version "0.7.1" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: resolve "^1.9.0" rechoir@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" reflect-metadata@^0.2.0, reflect-metadata@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties@^10.2.2: version "10.2.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regex-parser@^2.2.11: version "2.3.1" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.1.tgz#ee3f70e50bdd81a221d505242cb9a9c275a2ad91" integrity sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ== regexpu-core@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" regexpu-core@^6.3.1: version "6.4.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.2" regjsgen "^0.8.0" regjsparser "^0.13.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.2.1" regjsgen@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== regjsparser@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" regjsparser@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== dependencies: jsesc "~3.1.0" relateurl@^0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== renderkid@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" dom-converter "^0.2.0" htmlparser2 "^6.1.0" lodash "^4.17.21" strip-ansi "^6.0.1" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-url-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== dependencies: adjust-sourcemap-loader "^4.0.0" convert-source-map "^1.7.0" loader-utils "^2.0.0" postcss "^8.2.14" source-map "0.6.1" resolve@^1.19.0, resolve@^1.20.0, resolve@^1.9.0: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^1.22.11: version "1.22.11" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" responselike@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" signal-exit "^4.1.0" retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== retry@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^5.0.5: version "5.0.10" resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz" integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== dependencies: glob "^10.3.7" rolldown@1.0.0-rc.4: version "1.0.0-rc.4" resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0-rc.4.tgz#c22246260ab3da62caa209556e26d81fe516cf10" integrity sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA== dependencies: "@oxc-project/types" "=0.113.0" "@rolldown/pluginutils" "1.0.0-rc.4" optionalDependencies: "@rolldown/binding-android-arm64" "1.0.0-rc.4" "@rolldown/binding-darwin-arm64" "1.0.0-rc.4" "@rolldown/binding-darwin-x64" "1.0.0-rc.4" "@rolldown/binding-freebsd-x64" "1.0.0-rc.4" "@rolldown/binding-linux-arm-gnueabihf" "1.0.0-rc.4" "@rolldown/binding-linux-arm64-gnu" "1.0.0-rc.4" "@rolldown/binding-linux-arm64-musl" "1.0.0-rc.4" "@rolldown/binding-linux-x64-gnu" "1.0.0-rc.4" "@rolldown/binding-linux-x64-musl" "1.0.0-rc.4" "@rolldown/binding-openharmony-arm64" "1.0.0-rc.4" "@rolldown/binding-wasm32-wasi" "1.0.0-rc.4" "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.4" "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.4" rollup@^4.43.0: version "4.60.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.0.tgz#d7d68c8cda873e96e08b2443505609b7e7be9eb8" integrity sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ== dependencies: "@types/estree" "1.0.8" optionalDependencies: "@rollup/rollup-android-arm-eabi" "4.60.0" "@rollup/rollup-android-arm64" "4.60.0" "@rollup/rollup-darwin-arm64" "4.60.0" "@rollup/rollup-darwin-x64" "4.60.0" "@rollup/rollup-freebsd-arm64" "4.60.0" "@rollup/rollup-freebsd-x64" "4.60.0" "@rollup/rollup-linux-arm-gnueabihf" "4.60.0" "@rollup/rollup-linux-arm-musleabihf" "4.60.0" "@rollup/rollup-linux-arm64-gnu" "4.60.0" "@rollup/rollup-linux-arm64-musl" "4.60.0" "@rollup/rollup-linux-loong64-gnu" "4.60.0" "@rollup/rollup-linux-loong64-musl" "4.60.0" "@rollup/rollup-linux-ppc64-gnu" "4.60.0" "@rollup/rollup-linux-ppc64-musl" "4.60.0" "@rollup/rollup-linux-riscv64-gnu" "4.60.0" "@rollup/rollup-linux-riscv64-musl" "4.60.0" "@rollup/rollup-linux-s390x-gnu" "4.60.0" "@rollup/rollup-linux-x64-gnu" "4.60.0" "@rollup/rollup-linux-x64-musl" "4.60.0" "@rollup/rollup-openbsd-x64" "4.60.0" "@rollup/rollup-openharmony-arm64" "4.60.0" "@rollup/rollup-win32-arm64-msvc" "4.60.0" "@rollup/rollup-win32-ia32-msvc" "4.60.0" "@rollup/rollup-win32-x64-gnu" "4.60.0" "@rollup/rollup-win32-x64-msvc" "4.60.0" fsevents "~2.3.2" run-applescript@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz" integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== rxjs@7.8.2, rxjs@^7.8.2: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz" integrity sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass-loader@16.0.7, sass-loader@^16.0.7: version "16.0.7" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.7.tgz#d1f8723b795805831d41b5825e3d9cd72cb939e7" integrity sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA== dependencies: neo-async "^2.6.2" sass@1.97.3: version "1.97.3" resolved "https://registry.yarnpkg.com/sass/-/sass-1.97.3.tgz#9cb59339514fa7e2aec592b9700953ac6e331ab2" integrity sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" optionalDependencies: "@parcel/watcher" "^2.4.1" sass@^1.98.0: version "1.98.0" resolved "https://registry.yarnpkg.com/sass/-/sass-1.98.0.tgz#924ce85a3745ccaccd976262fdc1bc0c13aa8e57" integrity sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A== dependencies: chokidar "^4.0.0" immutable "^5.1.5" source-map-js ">=0.6.2 <2.0.0" optionalDependencies: "@parcel/watcher" "^2.4.1" sax@^1.2.4: version "1.6.0" resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== schema-utils@^3.0.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz" integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" ajv-formats "^2.1.1" ajv-keywords "^5.1.0" schema-utils@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" ajv-formats "^2.1.1" ajv-keywords "^5.1.0" seek-bzip@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz" integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== dependencies: commander "^2.8.1" select-hose@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-5.5.0.tgz#4c9ab7c7c9f35f18fb6a9882c253eb0e6bd6557b" integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== dependencies: "@peculiar/x509" "^1.14.2" pkijs "^3.3.3" semver@7.7.4, semver@^7.0.0, semver@^7.3.4, semver@^7.5.4, semver@^7.6.2: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== semver@^5.6.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.6.3: version "7.6.3" resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== send@~0.19.0, send@~0.19.1: version "0.19.2" resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" fresh "~0.5.2" http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" on-finished "~2.4.1" range-parser "~1.2.1" statuses "~2.0.2" serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" serialize-javascript@^7.0.3: version "7.0.4" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.4.tgz#c517735bd5b7631dd1fc191ee19cbb713ff8e05c" integrity sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg== serve-index@^1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" debug "2.6.9" escape-html "~1.0.3" http-errors "~1.6.2" mime-types "~2.1.17" parseurl "~1.3.2" serve-static@~1.16.2: version "1.16.3" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" send "~0.19.1" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== shell-quote@^1.8.1: version "1.8.2" resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz" integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== should-equal@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz" integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== dependencies: should-type "^1.4.0" should-format@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz" integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== dependencies: should-type "^1.3.0" should-type-adaptors "^1.0.1" should-type-adaptors@^1.0.1: version "1.1.0" resolved "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz" integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== dependencies: should-type "^1.3.0" should-util "^1.0.0" should-type@^1.3.0, should-type@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== should-util@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz" integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== should@^13.2.3: version "13.2.3" resolved "https://registry.npmjs.org/should/-/should-13.2.3.tgz" integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== dependencies: should-equal "^2.0.0" should-format "^3.0.3" should-type "^1.4.0" should-type-adaptors "^1.0.1" should-util "^1.0.0" side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" object-inspect "^1.13.3" side-channel-map@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" es-errors "^1.3.0" get-intrinsic "^1.2.5" object-inspect "^1.13.3" side-channel-weakmap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" es-errors "^1.3.0" get-intrinsic "^1.2.5" object-inspect "^1.13.3" side-channel-map "^1.0.1" side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" object-inspect "^1.13.3" side-channel-list "^1.0.0" side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sigstore@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz" integrity sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA== dependencies: "@sigstore/bundle" "^3.0.0" "@sigstore/core" "^2.0.0" "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/sign" "^3.0.0" "@sigstore/tuf" "^3.0.0" "@sigstore/verify" "^2.0.0" sirv@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" integrity sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== dependencies: "@polka/url" "^1.0.0-next.24" mrmime "^2.0.0" totalist "^3.0.0" slice-ansi@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== dependencies: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" slice-ansi@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-8.0.0.tgz#22d0b66d18bc5c57f488bfcf36cbde3bef731537" integrity sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg== dependencies: ansi-styles "^6.2.3" is-fullwidth-code-point "^5.1.0" smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socket.io-client@^4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.3.tgz#62717edd46a318c918125b57e92dc7f8bb71c34c" integrity sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.4.1" engine.io-client "~6.6.1" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" sockjs@^0.3.24: version "0.3.24" resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" uuid "^8.3.2" websocket-driver "^0.7.4" socks-proxy-agent@^8.0.3: version "8.0.5" resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: agent-base "^7.1.2" debug "^4.3.4" socks "^2.8.3" socks@^2.8.3: version "2.8.3" resolved "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz" integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== dependencies: sort-keys "^1.0.0" sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== dependencies: is-plain-obj "^1.0.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz" integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-loader@5.0.0, source-map-loader@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz" integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== dependencies: iconv-lite "^0.6.3" source-map-js "^1.0.2" source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map@0.6.1, source-map@^0.6.0, source-map@~0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@0.7.6, source-map@^0.7.4: version "0.7.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.5.0" resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-expression-parse@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz" integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: version "3.0.20" resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz" integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" detect-node "^2.0.4" hpack.js "^2.1.6" obuf "^1.1.2" readable-stream "^3.0.6" wbuf "^1.7.3" spdy@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" http-deceiver "^1.2.7" select-hose "^2.0.0" spdy-transport "^3.0.0" sprintf-js@^1.1.1, sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssri@^12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz" integrity sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ== dependencies: minipass "^7.0.3" "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== statuses@~2.0.1, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== stdin-discarder@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.3.1.tgz#92a1e741e709248865d0562bb7babe84d350ae6a" integrity sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA== strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== string-template@~0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz" integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" string-width@^7.0.0, string-width@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" string-width@^8.1.0, string-width@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.2.0.tgz#bdb6a9bd6d7800db635adae96cdb0443fec56c42" integrity sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw== dependencies: get-east-asian-width "^1.5.0" strip-ansi "^7.1.2" string_decoder@0.10: version "0.10.31" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-ansi@^7.1.0, strip-ansi@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: ansi-regex "^6.2.2" strip-dirs@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz" integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== dependencies: is-natural-number "^4.0.1" strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz" integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== dependencies: escape-string-regexp "^1.0.2" style-loader@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz" integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== style-mod@^4.0.0, style-mod@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.3.tgz#6e9012255bb799bdac37e288f7671b5d71bf9f73" integrity sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ== stylehacks@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.5.tgz#86985a8c810f88e4a1a34804b0fe350686457ca9" integrity sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA== dependencies: browserslist "^4.24.5" postcss-selector-parser "^7.1.0" supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^9.4.0: version "9.4.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz" integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svgo@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz" integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" css-select "^5.1.0" css-tree "^2.3.1" css-what "^6.1.0" csso "^5.0.5" picocolors "^1.0.0" tapable@^2.0.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tapable@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" buffer-alloc "^1.2.0" end-of-stream "^1.0.0" fs-constants "^1.0.0" readable-stream "^2.3.0" to-buffer "^1.1.1" xtend "^4.0.0" tar@^6.1.11, tar@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" tar@^7.4.3: version "7.4.3" resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== dependencies: "@isaacs/fs-minipass" "^4.0.0" chownr "^3.0.0" minipass "^7.1.2" minizlib "^3.0.1" mkdirp "^3.0.1" yallist "^5.0.0" terser-webpack-plugin@^5.3.16, terser-webpack-plugin@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz#95fc4cf4437e587be11ecf37d08636089174d76b" integrity sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^4.3.0" terser "^5.31.1" terser-webpack-plugin@^5.3.17: version "5.3.17" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz#75ea98876297fbb190d2fbb395e982582b859a67" integrity sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^4.3.0" terser "^5.31.1" terser@5.46.0: version "5.46.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: version "5.37.0" resolved "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz" integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" thingies@^1.20.0: version "1.21.0" resolved "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz" integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== thingies@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1" integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg== through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== time-grunt@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/time-grunt/-/time-grunt-2.0.0.tgz" integrity sha512-iQD2AeDYCAJrsPC/eUsfYZD9UT7TuBOmUIgFV5zeTQgRk6yLJKoc3aYR0gusJ0m+bG13B6qrDZ0SwPLe0/htHw== dependencies: chalk "^1.0.0" date-time "^1.1.0" figures "^1.0.0" hooker "^0.2.3" number-is-nan "^1.0.0" pretty-ms "^2.1.0" text-table "^0.2.0" time-zone@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz" integrity sha512-S5CjtVIkeBTnlsaZP3gjsTb78ClBe74sEcgEoBwAVUKnTRDAGqUtLLIZHMsIyqOWjt9DGQpLMMoD8ZKIfP2ddQ== timed-out@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== timestring@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/timestring/-/timestring-7.0.0.tgz" integrity sha512-U7ttxEdKWqHYJ96OGoJJR5gU8Nwkl3tlY0n7Jr4vcpLD2RkVZLE1Ph9k8ZRrZ7LYX9QCtd3M9OUaR9P8Z37QNg== tiny-lr@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz" integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== dependencies: body "^5.1.0" debug "^3.1.0" faye-websocket "~0.10.0" livereload-js "^2.3.0" object-assign "^4.1.0" qs "^6.4.0" tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== tinyglobby@0.2.15, tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: fdir "^6.5.0" picomatch "^4.0.3" tinyglobby@^0.2.12: version "0.2.14" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== dependencies: fdir "^6.4.4" picomatch "^4.0.2" to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tree-dump@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz" integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ== tree-dump@^1.0.3, tree-dump@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== treeverse@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz" integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== trim-repeated@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== dependencies: escape-string-regexp "^1.0.2" ts-loader@^9.5.4: version "9.5.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.4.tgz#44b571165c10fb5a90744aa5b7e119233c4f4585" integrity sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" micromatch "^4.0.0" semver "^7.3.4" source-map "^0.7.4" tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsyringe@^4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== dependencies: tslib "^1.9.3" tuf-js@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz" integrity sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA== dependencies: "@tufjs/models" "3.0.1" debug "^4.3.6" make-fetch-happen "^14.0.1" type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" typed-assert@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== typescript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.2.tgz#0b1bfb15f68c64b97032f3d78abbf98bdbba501f" integrity sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ== uglify-js@^3.5.1: version "3.19.3" resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbzip2-stream@^1.0.9: version "1.4.3" resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== dependencies: buffer "^5.2.1" through "^2.3.8" unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== underscore.string@~3.3.5: version "3.3.6" resolved "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz" integrity sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ== dependencies: sprintf-js "^1.1.1" util-deprecate "^1.0.2" undici-types@~6.20.0: version "6.20.0" resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@7.24.4: version "7.24.4" resolved "https://registry.yarnpkg.com/undici/-/undici-7.24.4.tgz#873bce680d7c6354c941399fd4e8ea4563de4ea7" integrity sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" unicode-match-property-value-ecmascript@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-match-property-value-ecmascript@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unique-filename@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz" integrity sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ== dependencies: unique-slug "^5.0.0" unique-slug@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz" integrity sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg== dependencies: imurmurhash "^0.1.4" universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: escalade "^3.2.0" picocolors "^1.1.0" update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" picocolors "^1.1.1" update-browserslist-db@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" picocolors "^1.1.1" uplot@^1.6.32: version "1.6.32" resolved "https://registry.yarnpkg.com/uplot/-/uplot-1.6.32.tgz#c800a63b432bad692d6d746f44f0882aa73a49ae" integrity sha512-KIMVnG68zvu5XXUbC4LQEPnhwOxBuLyW1AHtpm6IKTXImkbLgkMy+jabjLgSLMasNuGGzQm/ep3tOkyTxpiQIw== upper-case@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz" integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== utf8@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz" integrity sha512-QXo+O/QkLP/x1nyi54uQiG0XrODxdysuQvE5dtVqv7F5K2Qb6FsN+qbr6KhF5wQ20tfcV3VQp0/2x1e1MRSPWg== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utila@~0.4: version "0.4.0" resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^11.0.5: version "11.0.5" resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8flags@~3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz" integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== dependencies: homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" validate-npm-package-name@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz" integrity sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg== vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vite@7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.1.tgz#7f6cfe8fb9074138605e822a75d9d30b814d6507" integrity sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA== dependencies: esbuild "^0.27.0" fdir "^6.5.0" picomatch "^4.0.3" postcss "^8.5.6" rollup "^4.43.0" tinyglobby "^0.2.15" optionalDependencies: fsevents "~2.3.3" w3c-keyname@^2.2.4: version "2.2.8" resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== walk-up-path@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198" integrity sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A== watchpack@2.5.1, watchpack@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" weak-lru-cache@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== webpack-bundle-analyzer@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.3.0.tgz#ca289e08f2f5e39964a9988c38ff3090559392bf" integrity sha512-PEhAoqiJ+47d0uLMx/+zo5XOvaU+Vk6N2ZLht7H3n09QLy/fhyvqGNwjdRUHJDgMN8crBR2ZwVHkIswT3Xuawg== dependencies: "@discoveryjs/json-ext" "^0.6.3" acorn "^8.0.4" acorn-walk "^8.0.0" commander "^14.0.2" escape-string-regexp "^5.0.0" html-escaper "^3.0.3" opener "^1.5.2" picocolors "^1.0.0" sirv "^3.0.2" ws "^8.19.0" webpack-cli@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-7.0.2.tgz#c916e324acc7c14f895226ed351020924900db12" integrity sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g== dependencies: "@discoveryjs/json-ext" "^1.0.0" commander "^14.0.3" cross-spawn "^7.0.6" envinfo "^7.14.0" fastest-levenshtein "^1.0.12" import-local "^3.0.2" interpret "^3.1.1" rechoir "^0.8.0" webpack-merge "^6.0.1" webpack-dev-middleware@7.4.5: version "7.4.5" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz#d4e8720aa29cb03bc158084a94edb4594e3b7ac0" integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== dependencies: colorette "^2.0.10" memfs "^4.43.1" mime-types "^3.0.1" on-finished "^2.4.1" range-parser "^1.2.1" schema-utils "^4.0.0" webpack-dev-middleware@^7.4.2: version "7.4.2" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz" integrity sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA== dependencies: colorette "^2.0.10" memfs "^4.6.0" mime-types "^2.1.31" on-finished "^2.4.1" range-parser "^1.2.1" schema-utils "^4.0.0" webpack-dev-server@5.2.3, webpack-dev-server@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz#7f36a78be7ac88833fd87757edee31469a9e47d3" integrity sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ== dependencies: "@types/bonjour" "^3.5.13" "@types/connect-history-api-fallback" "^1.5.4" "@types/express" "^4.17.25" "@types/express-serve-static-core" "^4.17.21" "@types/serve-index" "^1.9.4" "@types/serve-static" "^1.15.5" "@types/sockjs" "^0.3.36" "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" bonjour-service "^1.2.1" chokidar "^3.6.0" colorette "^2.0.10" compression "^1.8.1" connect-history-api-fallback "^2.0.0" express "^4.22.1" graceful-fs "^4.2.6" http-proxy-middleware "^2.0.9" ipaddr.js "^2.1.0" launch-editor "^2.6.1" open "^10.0.3" p-retry "^6.2.0" schema-utils "^4.2.0" selfsigned "^5.5.0" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^7.4.2" ws "^8.18.0" webpack-merge@6.0.1, webpack-merge@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz" integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== dependencies: clone-deep "^4.0.1" flat "^5.0.2" wildcard "^2.0.1" webpack-remove-debug@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/webpack-remove-debug/-/webpack-remove-debug-0.1.0.tgz" integrity sha512-6RWybQwb/kuuaY99GUxCuHkG/DufaiUEClypvyOS+8y7QwDi8iB2DyUQiMMa0VwsFiBIWQ8FKOi1uFi44KnbcA== webpack-sources@^3.0.0, webpack-sources@^3.3.3, webpack-sources@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891" integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q== webpack-subresource-integrity@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== dependencies: typed-assert "^1.0.8" webpack@5.105.2: version "5.105.2" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.2.tgz#f3b76f9fc36f1152e156e63ffda3bbb82e6739ea" integrity sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" "@types/json-schema" "^7.0.15" "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.15.0" acorn-import-phases "^1.0.3" browserslist "^4.28.1" chrome-trace-event "^1.0.2" enhanced-resolve "^5.19.0" es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.3.1" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^4.3.3" tapable "^2.3.0" terser-webpack-plugin "^5.3.16" watchpack "^2.5.1" webpack-sources "^3.3.3" webpack@^5.105.4: version "5.105.4" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169" integrity sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" "@types/json-schema" "^7.0.15" "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.16.0" acorn-import-phases "^1.0.3" browserslist "^4.28.1" chrome-trace-event "^1.0.2" enhanced-resolve "^5.20.0" es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.3.1" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^4.3.3" tapable "^2.3.0" terser-webpack-plugin "^5.3.17" watchpack "^2.5.1" webpack-sources "^3.3.4" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: version "0.1.4" resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== which@^1.2.14: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@~2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" which@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/which/-/which-5.0.0.tgz" integrity sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ== dependencies: isexe "^3.1.1" wildcard@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== workerpool@^6.5.1: version "6.5.1" resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" wrap-ansi@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== dependencies: ansi-styles "^6.2.1" string-width "^7.0.0" strip-ansi "^7.1.0" wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz" integrity sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ== dependencies: imurmurhash "^0.1.4" signal-exit "^4.0.1" ws@^8.18.0: version "8.18.0" resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== ws@^8.19.0: version "8.19.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== ws@~8.17.1: version "8.17.1" resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== wsl-utils@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.3.1.tgz#9479836ddf03be267aad3abfc3cb1f6e0c9f1ed1" integrity sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg== dependencies: is-wsl "^3.1.0" powershell-utils "^0.1.0" xmlhttprequest-ssl@~2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz" integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== xtend@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yallist@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== yaml@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-parser@^22.0.0: version "22.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8" integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" decamelize "^4.0.0" flat "^5.0.2" is-plain-obj "^2.1.0" yargs@17.7.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" yargs-parser "^21.1.1" yargs@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-18.0.0.tgz#6c84259806273a746b09f579087b68a3c2d25bd1" integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== dependencies: cliui "^9.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" string-width "^7.2.0" y18n "^5.0.5" yargs-parser "^22.0.0" yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yoctocolors-cjs@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== yoctocolors@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== zone.js@^0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.16.1.tgz#ca91f0889e46b1c252aab6c75332e36840916227" integrity sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==