.babelrc000066400000000000000000000003501517650670600124640ustar00rootroot00000000000000{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "current" } } ] ], "plugins": ["angularjs-annotate"] } .github/000077500000000000000000000000001517650670600124335ustar00rootroot00000000000000.github/workflows/000077500000000000000000000000001517650670600144705ustar00rootroot00000000000000.github/workflows/build.yml000066400000000000000000000016761517650670600163240ustar00rootroot00000000000000# 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 .gitignore000066400000000000000000000004201517650670600130570ustar00rootroot00000000000000/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.npmignore000066400000000000000000000004751517650670600131000ustar00rootroot00000000000000/.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.js000066400000000000000000000017441517650670600133760ustar00rootroot00000000000000const 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) } }) } LICENSE000066400000000000000000000020131517650670600120740ustar00rootroot00000000000000MIT 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.md000066400000000000000000000106231517650670600123540ustar00rootroot00000000000000# 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.351 🌌 **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.351 [![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/000077500000000000000000000000001517650670600130535ustar00rootroot00000000000000artifacts/reduce-bundle-size.txt000066400000000000000000000022451517650670600173050ustar00rootroot000000000000002020 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.json000066400000000000000000000106071517650670600133650ustar00rootroot00000000000000{ "name": "p3x-redis-ui-material", "version": "2026.4.351", "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.6", "@angular/animations": "^21", "@angular/cdk": "^21.2.5", "@angular/common": "^21", "@angular/compiler": "^21", "@angular/compiler-cli": "^21.2.7", "@angular/core": "^21", "@angular/forms": "^21", "@angular/material": "^21.2.5", "@angular/platform-browser": "^21", "@angular/platform-browser-dynamic": "^21", "@angular/router": "^21.2.7", "@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.6", "@playwright/test": "^1.59.1", "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.1", "material-design-icons-iconfont": "^6.7.0", "mini-css-extract-plugin": "^2.10.2", "mobile-detect": "^1.4.5", "playwright": "^1.59.1", "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.7", "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", "jspdf": "^4.2.1", "jszip": "^3.10.1", "uplot": "^1.6.32" }, "resolutions": { "@codemirror/view": "^6.41.0" } }playwright.config.ts000066400000000000000000000026031517650670600151020ustar00rootroot00000000000000import { 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/000077500000000000000000000000001517650670600116625ustar00rootroot00000000000000src/builder/000077500000000000000000000000001517650670600133105ustar00rootroot00000000000000src/builder/webpack.config.js000066400000000000000000000201531517650670600165270ustar00rootroot00000000000000const 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/000077500000000000000000000000001517650670600126125ustar00rootroot00000000000000src/core/api.js000066400000000000000000000004071517650670600137220ustar00rootroot00000000000000p3xr.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.js000066400000000000000000000003341517650670600151070ustar00rootroot00000000000000p3xr.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.js000066400000000000000000000015601517650670600142520ustar00rootroot00000000000000const 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.js000066400000000000000000000046121517650670600137320ustar00rootroot00000000000000// 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.js000066400000000000000000000015061517650670600143470ustar00rootroot00000000000000const 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.js000066400000000000000000000010431517650670600145160ustar00rootroot00000000000000let 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.js000066400000000000000000000002601517650670600140420ustar00rootroot00000000000000// 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.js000066400000000000000000000002121517650670600144230ustar00rootroot00000000000000p3xr.random = () => { return (Math.floor(Math.random() * (99999999999999999 - 10000000000000000)) + 10000000000000000).toString(16) } src/core/settings.js000066400000000000000000000201561517650670600150140ustar00rootroot00000000000000const 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.js000066400000000000000000000014311517650670600141360ustar00rootroot00000000000000p3xr.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.js000066400000000000000000000237031517650670600164670ustar00rootroot00000000000000/** * 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.js000066400000000000000000000015321517650670600142710ustar00rootroot00000000000000p3xr.state = { treeDividers: [], 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.js000066400000000000000000000001451517650670600146410ustar00rootroot00000000000000p3xr.translations = { en: require('../strings/en/strings') } p3xr.strings = p3xr.translations.en src/decorate/000077500000000000000000000000001517650670600134505ustar00rootroot00000000000000src/decorate/string.js000066400000000000000000000002071517650670600153130ustar00rootroot00000000000000if (!String.prototype.reverse) { String.prototype.reverse = function () { return this.split('').reverse().join('') } } src/index.html000066400000000000000000000120651517650670600136630ustar00rootroot00000000000000 P3X Redis UI
src/main-development.js000066400000000000000000000003741517650670600154700ustar00rootroot00000000000000global.p3xrDevMode = true console.log('-------------------------------------') console.log(' development mode ') console.log('-------------------------------------') if (module.hot) { module.hot.accept() } require('./main') src/main.js000066400000000000000000000224641517650670600131540ustar00rootroot00000000000000require('./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 or Electron bootstrap storage. let _initialLang = 'en' try { // Check Electron bootstrap storage first (passed via query params before Angular strips them) const electronLang = p3xr.electronUiStorageBootstrap?.[p3xr.settings.language.storageKey] if (electronLang) { _initialLang = electronLang } else { _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.scss000066400000000000000000000003531517650670600135040ustar00rootroot00000000000000@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/000077500000000000000000000000001517650670600122665ustar00rootroot00000000000000src/ng/app.routes.ts000066400000000000000000000063321517650670600147420ustar00rootroot00000000000000import { 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-shell" */ './pages/monitoring/monitoring-shell.component' ).then(m => m.MonitoringShellComponent), children: [ { path: '', loadComponent: () => import( /* webpackChunkName: "page-monitoring" */ './pages/monitoring/monitoring.component' ).then(m => m.MonitoringComponent), }, { path: 'profiler', loadComponent: () => import( /* webpackChunkName: "page-profiler" */ './pages/profiler/profiler.component' ).then(m => m.ProfilerComponent), }, { path: 'pubsub', loadComponent: () => import( /* webpackChunkName: "page-pubsub" */ './pages/profiler/pubsub.component' ).then(m => m.PubsubComponent), }, { path: 'analysis', loadComponent: () => import( /* webpackChunkName: "page-memory-analysis" */ './pages/monitoring/memory-analysis.component' ).then(m => m.MemoryAnalysisComponent), }, ], }, { path: 'main', redirectTo: 'database', pathMatch: 'prefix', }, { path: '', redirectTo: 'settings', pathMatch: 'full', }, { path: '**', redirectTo: 'settings', }, ]; src/ng/components/000077500000000000000000000000001517650670600144535ustar00rootroot00000000000000src/ng/components/confirm-dialog.component.ts000066400000000000000000000042261517650670600217220ustar00rootroot00000000000000import { 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.ts000066400000000000000000000036731517650670600230300ustar00rootroot00000000000000import { 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.ts000066400000000000000000000202701517650670600207330ustar00rootroot00000000000000import { 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.ts000066400000000000000000000116631517650670600216660ustar00rootroot00000000000000import { 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 (collapsible) { }
@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 = ''; @Input() collapsible: boolean = true; 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.ts000066400000000000000000000071571517650670600212430ustar00rootroot00000000000000import { 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.ts000066400000000000000000000063161517650670600210550ustar00rootroot00000000000000import { 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.ts000066400000000000000000000061121517650670600210550ustar00rootroot00000000000000import { 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.ts000066400000000000000000000047221517650670600234310ustar00rootroot00000000000000import { 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/000077500000000000000000000000001517650670600137105ustar00rootroot00000000000000src/ng/dialogs/ai-settings-dialog.component.ts000066400000000000000000000114701517650670600217500ustar00rootroot00000000000000import { Component, Inject, ViewEncapsulation, ChangeDetectorRef, ChangeDetectionStrategy } 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'; import { SocketService } from '../services/socket.service'; import { CommonService } from '../services/common.service'; declare const p3xr: any; @Component({ selector: 'p3xr-ai-settings-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatToolbarModule, DialogCancelButtonComponent, ], template: `
{{ strings().label?.aiSettings || 'AI Settings' }}
{{ strings().label?.aiGroqApiKeyInfo || 'Optional. Your own Groq API key for better performance. Get a free key from' }} console.groq.com
{{ strings().label?.aiGroqApiKey || 'Groq API Key' }}
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class AiSettingsDialogComponent { strings; apiKey = ''; saving = false; constructor( @Inject(MatDialogRef) private dialogRef: MatDialogRef, @Inject(I18nService) private i18n: I18nService, @Inject(SocketService) private socket: SocketService, @Inject(CommonService) private common: CommonService, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) { this.strings = this.i18n.strings; } cancel(): void { this.dialogRef.close(); } async save(): Promise { this.saving = true; this.cdr.markForCheck(); try { const key = this.apiKey.trim(); if (key) { const validation = await this.socket.request({ action: 'validate-groq-api-key', payload: { apiKey: key }, }); if (!validation.valid) { this.common.toast({ message: this.strings().label?.aiGroqApiKeyInvalid || 'Invalid Groq API key' }); return; } } await this.socket.request({ action: 'set-groq-api-key', payload: { apiKey: key, aiEnabled: p3xr.state.cfg?.aiEnabled !== false, aiUseOwnKey: p3xr.state.cfg?.aiUseOwnKey === true }, }); p3xr.state.cfg.groqApiKey = key || ''; this.common.toast({ message: this.strings().label?.aiGroqApiKeySaved || 'AI settings saved' }); this.dialogRef.close(); } catch (e: any) { this.common.generalHandleError(e); } finally { this.saving = false; this.cdr.markForCheck(); } } } src/ng/dialogs/ai-settings-dialog.service.ts000066400000000000000000000014541517650670600214070ustar00rootroot00000000000000import { Injectable, Inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { createDialogPopupSettings } from './dialog-popup'; @Injectable({ providedIn: 'root' }) export class AiSettingsDialogService { constructor(@Inject(MatDialog) private dialog: MatDialog) {} async show(): Promise { const { AiSettingsDialogComponent } = await import( /* webpackChunkName: "dialog-ai-settings" */ './ai-settings-dialog.component' ); const dialogRef = this.dialog.open(AiSettingsDialogComponent, createDialogPopupSettings({ width: '75vw', maxWidth: '75vw', })); return new Promise((resolve) => { dialogRef.afterClosed().subscribe(() => resolve()); }); } } src/ng/dialogs/ask-authorization-dialog.component.ts000066400000000000000000000063631517650670600232020ustar00rootroot00000000000000import { 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.ts000066400000000000000000000022211517650670600226250ustar00rootroot00000000000000import { 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.ts000066400000000000000000000122471517650670600225760ustar00rootroot00000000000000import { 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.ts000066400000000000000000000015731517650670600222340ustar00rootroot00000000000000import { 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.ts000066400000000000000000001064361517650670600216670ustar00rootroot00000000000000import { 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. */ @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 (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 }}
{{ model.cluster ? strings().label?.cluster?.on : strings().label?.cluster?.off }}
{{ model.sentinel ? strings().label?.sentinel?.on : strings().label?.sentinel?.off }}
@if ((model.cluster === true || model.sentinel === true) && !readonlyConnections) {
{{ strings().label?.addNode }}
}
@if (model.sentinel === true) { {{ strings().label?.sentinel?.name }} @if (p3xrConnectionForm.controls['sentinelName']?.hasError('required') && p3xrConnectionForm.controls['sentinelName']?.touched) { {{ strings().form?.error?.required }} } } @if (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; } // --- 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; } 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.ts000066400000000000000000000033001517650670600213070ustar00rootroot00000000000000import { 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.ts000066400000000000000000000051471517650670600166670ustar00rootroot00000000000000import { 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.ts000066400000000000000000000263711517650670600217640ustar00rootroot00000000000000import { 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.ts000066400000000000000000000032271517650670600214150ustar00rootroot00000000000000import { 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.ts000066400000000000000000000077521517650670600214520ustar00rootroot00000000000000import { 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.ts000066400000000000000000000017371517650670600211050ustar00rootroot00000000000000import { 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.ts000066400000000000000000000121611517650670600216170ustar00rootroot00000000000000import { 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.ts000066400000000000000000000020731517650670600212560ustar00rootroot00000000000000import { 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.ts000066400000000000000000000640231517650670600223110ustar00rootroot00000000000000import { 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 }}
} @case ('timeseries') { @if (options.type === 'add') { {{ strings().page?.key?.timeseries?.retention || 'Retention' }} (ms) {{ strings().page?.key?.timeseries?.retentionHint || '0 = no expiry, or milliseconds' }} {{ strings().page?.key?.timeseries?.duplicatePolicy || 'Duplicate policy' }} LAST FIRST MIN MAX SUM BLOCK } {{ strings().page?.key?.timeseries?.labels || 'Labels' }} {{ strings().page?.key?.timeseries?.labelsHint || 'key1 value1 key2 value2' }} @if (!model.tsBulkMode) { {{ strings().page?.key?.timeseries?.timestamp || 'Timestamp' }} {{ strings().page?.key?.timeseries?.timestampHint || "'*' means auto generated, or milliseconds timestamp" }} } {{ strings().page?.key?.timeseries?.bulkMode || 'Bulk generate' }} } } @if (model.type !== 'stream' && model.type !== 'timeseries') { } @if (model.type !== 'timeseries') { }
@if (model.type !== 'timeseries') { {{ strings().label?.validateJson || 'Validate JSON' }} @if (model.type === 'stream') {
{{ strings().label?.streamValue }}
} @if (isBuffer) {
{{ strings().label?.isBuffer?.({ maxValueAsBuffer: getMaxValueAsBufferText() }) }} {{ bufferDisplay(model.value) }}
} } @if (model.type === 'timeseries' && (model.tsEditAll || model.tsBulkMode)) {
{{ strings().page?.key?.timeseries?.autoSpread || 'Auto * spread' }} 1 {{ strings().time?.second || 'second' }} 30 {{ strings().time?.seconds || 'seconds' }} 1 {{ strings().time?.minute || 'minute' }} 30 {{ strings().time?.minutes || 'minutes' }} 1 {{ strings().time?.hour || 'hour' }} 24 {{ strings().time?.hours || 'hours' }} {{ strings().page?.key?.timeseries?.formula || 'Formula' }} {{ strings().page?.key?.timeseries?.none || 'None' }} sin cos {{ strings().page?.key?.timeseries?.formulaLinear || 'Linear' }} {{ strings().page?.key?.timeseries?.formulaRandom || 'Random' }} {{ strings().page?.key?.timeseries?.formulaSawtooth || 'Sawtooth' }}
@if (model.tsFormula) {
{{ strings().page?.key?.timeseries?.formulaPoints || 'Points' }} {{ strings().page?.key?.timeseries?.formulaAmplitude || 'Amplitude' }} {{ strings().page?.key?.timeseries?.formulaOffset || 'Offset' }}
} {{ strings().page?.key?.timeseries?.dataPoints || 'data points' }} {{ strings().page?.key?.timeseries?.editAllHint || 'One data point per line: timestamp value (timestamp can be * for auto)' }} @if (keyForm.controls['value']?.invalid && keyForm.controls['value']?.touched) { {{ strings().form?.key?.error?.value }} } } @else if (model.type === 'timeseries' && !model.tsBulkMode) { {{ strings().page?.key?.timeseries?.value || 'Value' }} @if (keyForm.controls['value']?.invalid && keyForm.controls['value']?.touched) { {{ strings().form?.key?.error?.value }} } } @else { {{ 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?.hasTimeSeries) { base.push('timeseries'); } if (p3xr?.state?.hasReJSON) { 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: '*', tsTimestamp: '*', tsRetention: 0, tsDuplicatePolicy: 'LAST', tsLabels: '', tsBulkMode: false, tsSpread: 60000, tsFormula: '', tsFormulaPoints: 25, tsFormulaAmplitude: 100, tsFormulaOffset: 0, 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'; } getMaxValueAsBufferText(): string { try { return p3xr.settings.prettyBytes(p3xr.settings.maxValueAsBuffer); } catch { return `${p3xr?.settings?.maxValueAsBuffer ?? 256000} bytes`; } } bufferDisplay(value: any): string { if (value?.byteLength !== undefined) { return '(' + p3xr?.settings?.prettyBytes(value.byteLength) + ')'; } return ''; } async copy(): Promise { let value = this.model.value; if (this.model.type === 'timeseries') { value = `TS.ADD ${this.model.key} ${this.model.tsTimestamp || '*'} ${this.model.value}`; } await p3xr.clipboard({ 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(); } } generateFormula(): void { const points = Math.min(Math.max(parseInt(this.model.tsFormulaPoints) || 25, 1), 10000); const amplitude = parseFloat(this.model.tsFormulaAmplitude) || 100; const offset = parseFloat(this.model.tsFormulaOffset) || 0; const formula = this.model.tsFormula; const lines: string[] = []; for (let i = 0; i < points; i++) { const x = i / points; let value: number; switch (formula) { case 'sin': value = Math.sin(x * Math.PI * 2) * amplitude + offset; break; case 'cos': value = Math.cos(x * Math.PI * 2) * amplitude + offset; break; case 'linear': value = x * amplitude + offset; break; case 'random': value = Math.random() * amplitude + offset; break; case 'sawtooth': value = (x % 0.25) * 4 * amplitude + offset; break; default: value = offset; } lines.push(`* ${parseFloat(value.toFixed(4))}`); } this.model.value = lines.join('\n'); } cancel(): void { this.dialogRef.close(undefined); } } src/ng/dialogs/key-new-or-set-dialog.service.ts000066400000000000000000000023461517650670600217470ustar00rootroot00000000000000import { 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.ts000066400000000000000000000065611517650670600210470ustar00rootroot00000000000000import { 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.ts000066400000000000000000000442661517650670600237300ustar00rootroot00000000000000import { 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.ts000066400000000000000000000020551517650670600233540ustar00rootroot00000000000000import { 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.ts000066400000000000000000000117701517650670600203270ustar00rootroot00000000000000import { 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.ts000066400000000000000000000022131517650670600177550ustar00rootroot00000000000000import { 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/000077500000000000000000000000001517650670600136035ustar00rootroot00000000000000src/ng/layout/layout.component.html000066400000000000000000000304131517650670600200100ustar00rootroot00000000000000
@if (isWide) { } @else { } @if (currentConnection) { @if (isWide) { } @else { } } @if (currentConnection) { @if (isWide) { } @else { } } @if (currentConnection && hasRediSearch) { @if (isWide) { } @else { } } @if (isWide) { } @else { } @if (isWide) { } @else { }
@if (!isElectron && currentVersion && isWide) {
{{ currentVersion }}
}
src/ng/layout/layout.component.scss000066400000000000000000000047461517650670600200310ustar00rootroot00000000000000// 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 { 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; } // Active navigation button highlight .p3xr-nav-active.mat-mdc-button { background-color: rgba(255, 255, 255, 0.1) !important; } // Toolbar icon buttons: fix icon centering and rectangular hover .mat-toolbar .mat-mdc-icon-button { border-radius: 4px !important; .mat-icon { margin: 0 !important; } .mat-mdc-button-persistent-ripple { border-radius: 4px !important; } } // Active navigation button highlight .p3xr-nav-active { background-color: rgba(255, 255, 255, 0.1) !important; border-radius: 4px !important; } #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.ts000066400000000000000000000524511517650670600175000ustar00rootroot00000000000000import { 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 --- isActivePage(page: string): boolean { const url = this.nav.currentUrl; switch (page) { case 'database': return url.startsWith('/database'); case 'search': return url === '/search'; case 'monitoring': return url.startsWith('/monitoring'); case 'info': return url === '/info'; case 'settings': return url === '/settings'; default: return false; } } 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' || 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(() => { 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(); }); this.unsubFns.push( () => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.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.ts000066400000000000000000000026331517650670600135660ustar00rootroot00000000000000import '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/000077500000000000000000000000001517650670600133655ustar00rootroot00000000000000src/ng/pages/console/000077500000000000000000000000001517650670600150275ustar00rootroot00000000000000src/ng/pages/console/console.component.html000066400000000000000000000076221517650670600213670ustar00rootroot00000000000000
@if (type !== 'quick') { {{ strings().label?.console || 'Console' }} } @else { {{ embedded ? (strings().label?.console || 'Console') : (strings().intention?.quickConsole || 'Quick Console') }} @if (!embedded) { } }
@if (type === 'quick' && !embedded) {
}
@if (type !== 'quick') {
}
@for (cmd of filteredCommands; track cmd) { {{ cmd }} }
src/ng/pages/console/console.component.scss000066400000000000000000000077551517650670600214050ustar00rootroot00000000000000p3xr-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; } // 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-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; } .p3xr-console-ai-result { display: block; } // 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 { display: block; width: 100%; box-sizing: border-box; padding: 3px; border-style: solid; border-width: 3px; margin: 0; font-family: 'Roboto Mono', monospace; resize: none; overflow-y: hidden; outline: none; max-height: 90px; } // 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.ts000066400000000000000000000654021517650670600210510ustar00rootroot00000000000000import { Component, Input, Inject, OnInit, OnDestroy, AfterViewInit, NgZone, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef, 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 { 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, 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(''); filteredCommands: string[] = []; aiLoading = false; readonly strings; private contentClicked = false; private readonly unsubs: Array<() => void> = []; private index = 0; private singleLineHeight = 0; private aiCommandPending = false; // 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 inputResizeHandler: 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 { // Filter commands as user types this.searchControl.valueChanges.subscribe((value: string | null) => { this.searchText = value || ''; this.autoResizeTextarea(); 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); if (this.inputResizeHandler) { this.inputEl.removeEventListener('focus', this.inputResizeHandler); this.inputEl.removeEventListener('blur', this.inputResizeHandler); } } window.removeEventListener('resize', this.resizeFn); 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'); this.forceScrollToBottom(); } } onContentMouseDown(event: MouseEvent): void { // Flag that user clicked inside console content (for text selection/copy) // This prevents the blur handler from collapsing the console this.contentClicked = true; setTimeout(() => { this.contentClicked = false; }, 500); } private aiExecuting = false; async actionEnter(): Promise { const fullInput = (this.searchText || '').trim(); if (!fullInput) return; if (this.aiLoading) return; try { // Split into lines for multi-line execution const lines = fullInput.split('\n').map(l => l.trim()).filter(l => l.length > 0); if (lines.length === 0) return; // EVAL/EVALSHA commands may span multiple lines — execute as single command const firstWord = lines[0].split(/\s+/)[0].toUpperCase(); const isSingleCommand = lines.length === 1 || firstWord === 'EVAL' || firstWord === 'EVALSHA'; if (isSingleCommand) { await this.executeSingleLine(fullInput); } else { for (const line of lines) { await this.executeSingleLine(line); } } } finally { this.updateCommandHistory(fullInput); // Don't clear input if AI placed a command for the user to review/execute if (this.aiCommandPending) { this.aiCommandPending = false; } else { this.searchText = ''; this.searchControl.setValue(''); setTimeout(() => this.autoResizeTextarea(), 0); } this.forceScrollToBottom(); if (this.type === 'quick' || this.embedded) { this.cmd.refresh({ withoutParent: true }); } (this.inputEl as HTMLElement)?.focus(); } } private async executeSingleLine(command: string): Promise { const enter = command.trim(); if (!enter) return; // Explicit ai: prefix — go straight to AI (if enabled) if (p3xr.state.cfg?.aiEnabled !== false && /^ai:\s*/i.test(enter)) { const prompt = enter.replace(/^ai:\s*/i, '').trim(); if (prompt) { await this.handleAiQuery(prompt, enter); } return; } try { const response = await this.socket.request({ action: 'console', payload: { command: enter }, }); const result = htmlEncode(String(this.redisParser.consoleParse(response.result))); if (this.aiExecuting) { const trimmed = result.replace(/ /g, '').trim(); if (trimmed.length > 0 && this.outputEl) { this.outputEl.insertAdjacentHTML('beforeend', `
${result}

`); this.persistOutputDebounced?.(); } } else { this.outputAppend(`${htmlEncode(enter)}
${result}
`); } if (response.hasOwnProperty('database')) { p3xr.state.currentDatabase = response.database; p3xr.state.redisChanged = true; this.socket.stateChanged$.next(); } } catch (e: any) { console.error(e); const errorMsg = e.message || ''; // If Redis doesn't recognize the command, silently try AI (if enabled) if (p3xr.state.cfg?.aiEnabled !== false && this.looksLikeNaturalLanguage(enter, errorMsg)) { const aiSuccess = await this.handleAiQuery(enter, enter); if (aiSuccess) return; this.outputAppend(`${htmlEncode(enter)}
${this.i18n.strings().code?.[errorMsg] || errorMsg}
`); return; } this.outputAppend(`${htmlEncode(enter)}
${this.i18n.strings().code?.[errorMsg] || errorMsg}
`); } } private looksLikeNaturalLanguage(input: string, errorMsg: string): boolean { // Only try AI if Redis returned an unknown/wrong command error const isUnknownCmd = /unknown command|wrong number of arguments|ERR unknown/i.test(errorMsg); if (!isUnknownCmd) return false; // If the first word is a known Redis command, it's probably a syntax error, not natural language const firstWord = input.trim().split(/\s+/)[0].toUpperCase(); if (p3xr.state.commands?.includes(firstWord)) return false; return true; } private async handleAiQuery(prompt: string, originalInput: string): Promise { this.aiLoading = true; (this.inputEl as HTMLElement)?.focus(); try { // Gather RediSearch indexes for context let indexes: string[] = []; try { const indexResponse = await this.socket.request({ action: 'search-list', payload: {} }); indexes = indexResponse.data || []; } catch { /* no search module, ignore */ } // Gather Redis server info for context const info = p3xr.state.info || {}; const redisContext: any = { indexes }; if (info.redis_version) redisContext.redisVersion = info.redis_version; if (info.redis_mode) redisContext.redisMode = info.redis_mode; if (info.os) redisContext.os = info.os; if (info.connected_clients) redisContext.connectedClients = info.connected_clients; if (info.used_memory_human) redisContext.usedMemory = info.used_memory_human; if (info.db0 || info.db1) redisContext.databases = Object.keys(info).filter((k: string) => /^db\d+$/.test(k)).map((k: string) => `${k}: ${info[k]}`); if (info.modules) redisContext.modules = info.modules; redisContext.uiLanguage = this.i18n.currentLang(); const response = await this.socket.request({ action: 'ai-redis-query', payload: { prompt, context: redisContext, }, }); const command = response.command || ''; const explanation = response.explanation || ''; this.outputAppend(htmlEncode(originalInput)); this.updateCommandHistory(originalInput); if (command) { let aiLine = `AI → ${htmlEncode(command)}`; if (explanation) { aiLine += `
${htmlEncode(explanation)}`; } this.outputAppend(aiLine + '
'); this.searchText = command; this.searchControl.setValue(command, { emitEvent: false }); this.filteredCommands = []; this.aiCommandPending = true; setTimeout(() => this.autoResizeTextarea(), 0); } return true; } catch (e: any) { console.error('ai-redis-query failed', e); return false; } finally { this.aiLoading = false; this.forceScrollToBottom(); (this.inputEl as HTMLElement)?.focus(); } } onKeyDown(event: KeyboardEvent): void { // Enter handling: Enter = execute, Shift+Enter = newline if (event.key === 'Enter') { if (event.shiftKey) { // Shift+Enter inserts newline, auto-resize after DOM update setTimeout(() => this.autoResizeTextarea(), 0); return; } event.preventDefault(); this.actionEnter(); return; } // Let mat-autocomplete handle ArrowDown/ArrowUp when panel is open if (this.filteredCommands.length > 0 && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) { return; } // Plain ArrowUp/Down = scroll textarea; Shift+ArrowUp/Down = command history if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') { actionHistoryPosition = -1; return; } if (!event.shiftKey) { // Let textarea handle natural cursor/scroll movement 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 }); setTimeout(() => this.autoResizeTextarea(), 0); } 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.forceScrollToBottom(); (this.inputEl as HTMLElement)?.focus(); } 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); // 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.forceScrollToBottom(); } this.rawResize(); // Paste needs a deferred resize (browser hasn't finished layout when valueChanges fires) this.inputEl?.addEventListener('paste', () => { setTimeout(() => this.autoResizeTextarea(), 0); }); // Textarea resize on focus/blur this.inputResizeHandler = () => setTimeout(() => this.autoResizeTextarea(), 0); this.inputEl?.addEventListener('focus', this.inputResizeHandler); this.inputEl?.addEventListener('blur', this.inputResizeHandler); // Embedded focus/blur handlers if (this.embedded) { this.inputFocusHandler = () => { this.emitToAngularJS('p3xr-console-activate'); }; this.inputBlurHandler = () => { setTimeout(() => { // Don't collapse if user clicked inside console content if (this.contentClicked) return; const active = document.activeElement; if (active?.id === 'p3xr-console-input') return; const root = this.elementRef.nativeElement; if (root && active && root.contains(active)) return; // Don't deactivate if user is selecting text in the console output const selection = window.getSelection(); if (selection && selection.toString().length > 0) { const range = selection.getRangeAt?.(0); if (range && root?.contains(range.commonAncestorContainer)) return; } this.emitToAngularJS('p3xr-console-deactivate'); }, 0); }; this.inputEl?.addEventListener('focus', this.inputFocusHandler); this.inputEl?.addEventListener('blur', this.inputBlurHandler); } }); } 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'; } return; } // Non-embedded resize — measure available space directly from DOM positions const containerTop = this.containerEl.getBoundingClientRect().top; const footerTop = this.footerEl?.getBoundingClientRect().top ?? window.innerHeight; const autocompleteHeight = this.autocompleteEl?.offsetHeight || 28; const outputHeight = Math.max(footerTop - containerTop - autocompleteHeight, 0); this.containerEl.style.height = outputHeight + 'px'; this.containerEl.style.maxHeight = outputHeight + 'px'; } private autoResizeTextarea(): void { const el = this.inputEl as HTMLTextAreaElement; if (!el) return; if (!this.singleLineHeight) { this.singleLineHeight = el.offsetHeight; } const isFocused = document.activeElement === el; // Blurred with multi-line: collapse to single line if (!isFocused && (el.value || '').includes('\n')) { el.style.height = this.singleLineHeight + 'px'; el.style.overflowY = 'hidden'; this.rawResize(); return; } el.style.height = this.singleLineHeight + 'px'; el.style.overflowY = 'hidden'; // Only grow when focused and there are actual newlines (max 3 lines) if ((el.value || '').includes('\n') && el.scrollHeight > el.clientHeight) { const maxHeight = this.singleLineHeight * 3; const borderHeight = el.offsetHeight - el.clientHeight; const needed = el.scrollHeight + borderHeight; if (needed > maxHeight) { el.style.height = maxHeight + 'px'; el.style.overflowY = 'auto'; } else { el.style.height = needed + 'px'; } } this.rawResize(); } // --- Output management --- private outputAppend(message: string): void { if (!this.outputEl) return; const stripped = (message || '').replace(/<[^>]*>/g, '').replace(/&[a-z]+;/g, '').trim(); if (!stripped) return; this.outputEl.insertAdjacentHTML('beforeend', `${message}
`); this.trimOutputToLimit(consoleOutputMaxBytes); this.persistOutputDebounced?.(); this.scrollOutputToBottom(); } private scrollOutputToBottom(): void { setTimeout(() => { if (!this.scrollers) return; // Only auto-scroll if user is near the bottom (within 100px) const threshold = 100; const isNearBottom = this.scrollers.scrollHeight - this.scrollers.scrollTop - this.scrollers.clientHeight < threshold; if (isNearBottom) { this.scrollers.scrollTop = this.scrollers.scrollHeight; if (this.outputEl) this.outputEl.scrollTop = this.outputEl.scrollHeight; } }, 0); } private forceScrollToBottom(): 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/000077500000000000000000000000001517650670600151315ustar00rootroot00000000000000src/ng/pages/database/database-header.component.ts000066400000000000000000000254571517650670600225110ustar00rootroot00000000000000import { 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.stateChanged$.subscribe(() => this.syncFromGlobal()); this.unsubs.push(() => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.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.html000066400000000000000000000172731517650670600223640ustar00rootroot00000000000000@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 }} }
@if (response.type !== 'timeseries') {
{{ strings()?.label?.format || 'Format' }}: Raw JSON Hex Base64
}
@switch (response.type) { @case ('string') { } @case ('list') { } @case ('hash') { } @case ('set') { } @case ('zset') { } @case ('stream') { } @case ('json') { } @case ('timeseries') { } } } src/ng/pages/database/database-key.component.scss000066400000000000000000000042641517650670600223670ustar00rootroot00000000000000.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; } .p3xr-format-toggle { border-radius: 4px !important; overflow: hidden !important; .mat-button-toggle { height: 32px !important; border-radius: 0 !important; .mat-button-toggle-button { height: 32px !important; font-size: 13px !important; padding: 0 12px !important; display: flex !important; align-items: center !important; justify-content: center !important; border-radius: 0 !important; } } .mat-button-toggle:first-child { border-radius: 4px 0 0 4px !important; } .mat-button-toggle:last-child { border-radius: 0 4px 4px 0 !important; } } src/ng/pages/database/database-key.component.ts000066400000000000000000000350721517650670600220430ustar00rootroot00000000000000import { 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 { MatButtonToggleModule } from '@angular/material/button-toggle'; import { FormsModule } from '@angular/forms'; 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 { KeyTimeseriesComponent } from './key/key-timeseries.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, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, MatProgressSpinnerModule, MatButtonToggleModule, KeyStringComponent, KeyHashComponent, KeyListComponent, KeySetComponent, KeyZsetComponent, KeyStreamComponent, KeyJsonComponent, KeyTimeseriesComponent, ], 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; valueFormat: 'raw' | 'json' | 'hex' | 'base64' = 'raw'; 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; case 'timeseries': // valueBuffer is a JSON-encoded TS.INFO object try { response.value = JSON.parse(td.decode(valueBuffer)); } catch { response.value = {}; } 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.html000066400000000000000000000106151517650670600225240ustar00rootroot00000000000000
@if (node.expandable) { } @if (!isReadonly) { @if (node.type === 'folder') { delete } @else { delete } add }
src/ng/pages/database/database-tree.component.scss000066400000000000000000000062251517650670600225350ustar00rootroot00000000000000// 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.ts000066400000000000000000000372361517650670600222160ustar00rootroot00000000000000import { 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()); const subExpandLevel = this.common.treeExpandToLevel$.subscribe((level: number) => this.ngZone.run(() => { const keys = new Set(); const collect = (nodes: any[], depth: number) => { for (const node of nodes) { if (node.type === 'folder') { if (depth < level) { keys.add(node.key); } collect(node.children ?? [], depth + 1); } } }; collect(this.hierarchicalNodes, 0); this.expandedKeys = keys; this.flattenVisibleNodes(); this.syncExpandedNodesToGlobal(); this.cdr.markForCheck(); })); this.unsubs.push(() => subExpandLevel.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.html000066400000000000000000000177201517650670600257720ustar00rootroot00000000000000
@if (treeDividers.length > 0) { @for (divider of treeDividers; track divider) { } }
@if (pages > 1) { / {{ pages }} } @else { {{ keyCountText() }}  } src/ng/pages/database/database-treecontrol-controls.component.scss000066400000000000000000000111101517650670600257640ustar00rootroot00000000000000: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.ts000066400000000000000000000363751517650670600254630ustar00rootroot00000000000000import { 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(); } treeExpandToLevel(level: number): void { this.common.treeExpandToLevel$.next(level); } 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(); } deleteSearchLabel(): string { const strings = this.strings(); if (this.search.length > 0) { const fn = strings.intention?.deleteSearchKeys; return typeof fn === 'function' ? fn({ count: this.keyCount }) : `Delete ${this.keyCount} matching keys`; } const fn = strings.intention?.deleteAllKeysMenu; return typeof fn === 'function' ? fn({ count: this.keyCount }) : `Delete all ${this.keyCount} keys`; } async deleteSearchKeys(): Promise { let match: string; if (this.search.length > 0) { if (p3xr.settings?.searchStartsWith) { match = this.search + '*'; } else { match = '*' + this.search + '*'; } } else { match = '*'; } try { const confirmFn = this.strings().confirm?.deleteSearchKeys; const confirmMsg = typeof confirmFn === 'function' ? confirmFn({ count: this.keyCount, pattern: match }) : `Are you sure to delete all keys matching "${match}"? Found ${this.keyCount} keys.`; await this.common.confirm({ message: confirmMsg }); p3xr?.ui?.overlay?.show({ message: this.strings().label?.deletingSearchKeys || 'Deleting matching keys...', }); const response = await this.socket.request({ action: 'delete-search-keys', payload: { match }, }); const deletedCount = response.deletedCount || 0; const statusFn = this.strings().status?.deletedSearchKeys; const message = typeof statusFn === 'function' ? statusFn({ count: deletedCount }) : `Deleted ${deletedCount} keys`; this.common.toast({ message }); await this.cmd.refresh(); this.ngZone.run(() => { this.syncFromGlobal(); this.requestViewRefresh(); }); } catch (e: any) { if (e !== undefined && e !== null) { this.common.generalHandleError(e); } } finally { p3xr?.ui?.overlay?.hide(); } } 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.html000066400000000000000000000044751517650670600215760ustar00rootroot00000000000000
{{ strings().title?.main }}
src/ng/pages/database/database.component.scss000066400000000000000000000046111517650670600215750ustar00rootroot00000000000000@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.ts000066400000000000000000000436721517650670600212620ustar00rootroot00000000000000import { 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 get bottomConsoleCollapsedHeight(): number { const panel = document.getElementById('p3xr-database-bottom-console-panel'); if (panel) { const toolbar = panel.querySelector('#p3xr-console-header') as HTMLElement; const autocomplete = panel.querySelector('#p3xr-console-autocomplete') as HTMLElement; if (toolbar && autocomplete) { // +1 for the panel's border-top return toolbar.offsetHeight + autocomplete.offsetHeight + 1; } } return 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/000077500000000000000000000000001517650670600157215ustar00rootroot00000000000000src/ng/pages/database/key/key-hash.component.html000066400000000000000000000037341517650670600223300ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.hashkey || 'Hash Key' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.key) {
{{ item.key }} {{ formatValue(truncateDisplay(item.value)) }}@if (isTruncated(item.value)) {...} @if (!isReadonly) { delete } table_chart content_copy download @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-hash.component.ts000066400000000000000000000105251517650670600220060ustar00rootroot00000000000000import { 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.html000066400000000000000000000075621517650670600223610ustar00rootroot00000000000000
@if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (!isReadonly) { @if (isGtSm) { } @else { } }
@if (jsonObj !== undefined) { } @else {
{{ truncateDisplay(p3xrValue) }}
}
src/ng/pages/database/key/key-json.component.ts000066400000000000000000000106731517650670600220400ustar00rootroot00000000000000import { 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.html000066400000000000000000000036421517650670600223560ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.index || 'Index' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ item.index }} {{ formatValue(truncateDisplay(item.value)) }}@if (isTruncated(item.value)) {...} @if (!isReadonly) { delete } table_chart content_copy download @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-list.component.ts000066400000000000000000000103521517650670600220340ustar00rootroot00000000000000import { 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.ts000066400000000000000000000074211517650670600234360ustar00rootroot00000000000000import { 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.ts000066400000000000000000000024621517650670600203300ustar00rootroot00000000000000/** * 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.html000066400000000000000000000032521517650670600221730ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ formatValue(truncateDisplay(item.value)) }}@if (isTruncated(item.value)) {...} @if (!isReadonly) { delete } table_chart content_copy download @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-set.component.ts000066400000000000000000000103601517650670600216530ustar00rootroot00000000000000import { 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.html000066400000000000000000000046571517650670600227050ustar00rootroot00000000000000
{{ strings?.page?.key?.stream?.table?.timestamp || 'Timestamp ID' }} @if (!isReadonly) { }
@for (entry of pagedEntries; track entry.id) {
{{ entry.id }} {{ showTimestamp(entry.id) }} content_copy download table_chart @if (!isReadonly) { delete }
@for (field of entry.fields; track field[0]) {
{{ field[0] }} {{ formatValue(truncateDisplay(field[1])) }}@if (isTruncated(field[1])) {...}
}
}
src/ng/pages/database/key/key-stream.component.ts000066400000000000000000000213111517650670600223510ustar00rootroot00000000000000import { 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'; declare const p3xr: any; const dayjs = require('dayjs'); @Component({ selector: 'p3xr-key-stream', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule, KeyPagerInlineComponent], 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 }; } downloadEntry(entry: { id: string; fields: Array<[string, string]> }): void { const lines = [entry.id]; for (const [field, value] of entry.fields) { lines.push(field); lines.push(value); } const text = lines.join('\n'); const blob = new Blob([text], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${this.p3xrKey}-${entry.id}.txt`; a.click(); URL.revokeObjectURL(url); } 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.html000066400000000000000000000174331517650670600227140ustar00rootroot00000000000000 @if (!editable) {
@if (!isReadonly) { @if (isGtSm) { } @else { } } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (isGtSm) { } @else { } @if (!isReadonly) { @if (isGtSm) { } @else { } } @if (isGtSm) { } @else { } @if (!isReadonly) { @if (isGtSm) { } @else { } }
} @if (editable) {
@if (!isReadonly) { {{ strings?.label?.validateJson || 'Validate JSON' }} } @if (isGtSm) { } @else { } @if (!isReadonly) { @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 {
{{ formatValue(truncateDisplay(p3xrValue)) }}@if (isTruncated(p3xrValue)) {...}
}
src/ng/pages/database/key/key-string.component.ts000066400000000000000000000160641517650670600223750ustar00rootroot00000000000000import { 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-timeseries.component.html000066400000000000000000000310141517650670600235460ustar00rootroot00000000000000

@if (!isReadonly) { } @if (!autoRefresh) { }
{{ strings?.page?.key?.timeseries?.from || 'From (ms or -)' }} {{ strings?.page?.key?.timeseries?.to || 'To (ms or +)' }} {{ strings?.page?.key?.timeseries?.aggregation || 'Aggregation' }} {{ strings?.page?.key?.timeseries?.none || 'None' }} @for (agg of aggregationTypes; track agg) { {{ agg }} } @if (aggregationType) { {{ strings?.page?.key?.timeseries?.timeBucket || 'Bucket (ms)' }} } {{ strings?.page?.key?.timeseries?.overlay || 'Overlay keys' }} {{ strings?.page?.key?.timeseries?.mrangeFilter || 'Label filter' }}
{{ rangeData.length }} {{ strings?.page?.key?.timeseries?.dataPoints || 'data points' }}
@if (!isReadonly) {
{{ strings?.page?.key?.timeseries?.timestamp || 'Timestamp' }} {{ strings?.page?.key?.timeseries?.value || 'Value' }} @if (isGtSm) { } @else { }
}
@if (rangeData.length > 0) {
{{ strings?.page?.key?.timeseries?.timestamp || 'Timestamp' }} {{ strings?.page?.key?.timeseries?.value || 'Value' }} @if (!isReadonly) { }
{{ formatTimestamp(point.timestamp) }} {{ point.value }} @if (!isReadonly) { delete edit }
}
@if (!isReadonly) {
}
@if (alterMode) {
{{ strings?.page?.key?.timeseries?.retention || 'Retention' }} (ms) {{ strings?.page?.key?.timeseries?.retentionHint || '0 = no expiry, or milliseconds' }} {{ strings?.page?.key?.timeseries?.duplicatePolicy || 'Duplicate policy' }} LAST FIRST MIN MAX SUM BLOCK   {{ strings?.page?.key?.timeseries?.labels || 'Labels' }} {{ strings?.page?.key?.timeseries?.labelsHint || 'key1 value1 key2 value2' }}
} @for (item of infoLabels; track item.key) {
{{ item.key }}{{ item.value }}
} @if (tsLabels.length > 0) {
{{ strings?.page?.key?.timeseries?.labels || 'Labels' }}
@for (label of tsLabels; track label.key) {
{{ label.key }}{{ label.value }}
} } @if (tsRules.length > 0) {
{{ strings?.page?.key?.timeseries?.rules || 'Rules' }}
@for (rule of tsRules; track rule.destKey) {
{{ rule.destKey }}{{ rule.aggregationType }} / {{ rule.bucketDuration }}ms
} }
src/ng/pages/database/key/key-timeseries.component.ts000066400000000000000000000556371517650670600232510ustar00rootroot00000000000000import { Component, Inject, OnInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectorRef, CUSTOM_ELEMENTS_SCHEMA, ViewEncapsulation, ViewChild, ViewChildren, QueryList, ElementRef, AfterViewInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatListModule } from '@angular/material/list'; import { MatDividerModule } from '@angular/material/divider'; 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 { P3xrAccordionComponent } from '../../../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../../../components/p3xr-button.component'; declare const p3xr: any; @Component({ selector: 'p3xr-key-timeseries', standalone: true, imports: [ CommonModule, FormsModule, ScrollingModule, MatButtonModule, MatIconModule, MatTooltipModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatListModule, MatDividerModule, P3xrAccordionComponent, P3xrButtonComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], templateUrl: './key-timeseries.component.html', encapsulation: ViewEncapsulation.None, }) export class KeyTimeseriesComponent extends KeyTypeBase implements OnInit, OnChanges, OnDestroy, AfterViewInit { @ViewChild('tsChart') chartRef!: ElementRef; @ViewChild('tsDataViewport') dataViewport?: CdkVirtualScrollViewport; tsInfo: any = {}; rangeData: Array<{ timestamp: number; value: number }> = []; // Range controls rangeFrom = ''; rangeTo = ''; aggregationType = ''; aggregationBucket = ''; // Add data point addTimestamp = '*'; addValue = ''; autoRefresh = false; alterMode = false; alterRetention = 0; alterDuplicatePolicy = 'LAST'; alterLabels = ''; overlayKeysInput = ''; mrangeFilter = ''; overlaySeries: Array<{ key: string; data: Array<{ timestamp: number; value: number }> }> = []; readonly aggregationTypes = ['avg', 'min', 'max', 'sum', 'count', 'first', 'last', 'range', 'std.p', 'std.s', 'var.p', 'var.s']; private uPlot: any = null; private plot: any = null; private resizeObserver: ResizeObserver | null = null; private themeObserver: MutationObserver | null = null; private langCheckInterval: any = null; private autoRefreshInterval: any = null; private loadRangeDebounceTimer: any = null; 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.tsInfo = this.p3xrValue || {}; this.ensureDefaultLabel(); this.loadRange(); // Re-render chart on theme change this.themeObserver = new MutationObserver(() => { setTimeout(() => this.reinitChart(), 100); }); this.themeObserver.observe(document.body, { attributes: true, attributeFilter: ['class'] }); // Re-render chart on language change let prevLang = this.i18n.currentLang(); this.langCheckInterval = setInterval(() => { const currentLang = this.i18n.currentLang(); if (currentLang !== prevLang) { prevLang = currentLang; setTimeout(() => this.reinitChart(), 100); } }, 500); } ngOnChanges(changes: SimpleChanges): void { if (changes['p3xrValue'] && !changes['p3xrValue'].firstChange) { this.tsInfo = this.p3xrValue || {}; this.loadRange(); } } ngAfterViewInit(): void { this.loadUPlot(); } ngOnDestroy(): void { this.destroyBase(); this.destroyChart(); this.stopAutoRefresh(); this.themeObserver?.disconnect(); if (this.langCheckInterval) clearInterval(this.langCheckInterval); } toggleAutoRefresh(): void { this.autoRefresh = !this.autoRefresh; if (this.autoRefresh) { this.startAutoRefresh(); } else { this.stopAutoRefresh(); } this.cdr.markForCheck(); } private startAutoRefresh(): void { this.stopAutoRefresh(); this.autoRefreshInterval = setInterval(() => { this.loadRange(); }, 10000); } private stopAutoRefresh(): void { if (this.autoRefreshInterval) { clearInterval(this.autoRefreshInterval); this.autoRefreshInterval = null; } } get infoLabels(): Array<{ key: string; value: any }> { if (!this.tsInfo) return []; const skip = new Set(['labels', 'rules', 'sourceKey', 'chunks']); return Object.entries(this.tsInfo) .filter(([k]) => !skip.has(k)) .map(([key, value]) => ({ key, value })); } get tsLabels(): Array<{ key: string; value: string }> { const labels = this.tsInfo?.labels; if (!labels || typeof labels !== 'object') return []; return Object.entries(labels).map(([key, value]) => ({ key, value: String(value) })); } get tsRules(): any[] { return Array.isArray(this.tsInfo?.rules) ? this.tsInfo.rules : []; } capitalize(str: string): string { return str ? str.charAt(0).toUpperCase() + str.slice(1) : ''; } debouncedLoadRange(): void { clearTimeout(this.loadRangeDebounceTimer); this.loadRangeDebounceTimer = setTimeout(() => { this.loadRange(); }, 500); } async loadRange(): Promise { try { const payload: any = { key: this.p3xrKey }; if (this.rangeFrom) payload.from = this.rangeFrom; if (this.rangeTo) payload.to = this.rangeTo; if (this.aggregationType && this.aggregationBucket) { payload.aggregation = { type: this.aggregationType, timeBucket: parseInt(this.aggregationBucket, 10), }; } const response = await this.socket.request({ action: 'timeseries-range', payload, }); this.rangeData = response.data || []; // Load overlay keys this.overlaySeries = []; const overlayKeys = this.overlayKeysInput.split(',').map(k => k.trim()).filter(k => k.length > 0); for (const overlayKey of overlayKeys) { try { const overlayPayload: any = { key: overlayKey }; if (this.rangeFrom) overlayPayload.from = this.rangeFrom; if (this.rangeTo) overlayPayload.to = this.rangeTo; if (this.aggregationType && this.aggregationBucket) { overlayPayload.aggregation = { type: this.aggregationType, timeBucket: parseInt(this.aggregationBucket, 10) }; } const overlayResponse = await this.socket.request({ action: 'timeseries-range', payload: overlayPayload }); this.overlaySeries.push({ key: overlayKey, data: overlayResponse.data || [] }); } catch { /* skip invalid keys */ } } // Load MRANGE by label filter if (this.mrangeFilter.trim().length > 0) { try { const mrangePayload: any = { filter: this.mrangeFilter.trim() }; if (this.rangeFrom) mrangePayload.from = this.rangeFrom; if (this.rangeTo) mrangePayload.to = this.rangeTo; if (this.aggregationType && this.aggregationBucket) { mrangePayload.aggregation = { type: this.aggregationType, timeBucket: parseInt(this.aggregationBucket, 10) }; } const mrangeResponse = await this.socket.request({ action: 'timeseries-mrange', payload: mrangePayload }); for (const entry of (mrangeResponse.data || [])) { if (entry.key !== this.p3xrKey) { this.overlaySeries.push({ key: entry.key, data: entry.data }); } } } catch { /* skip mrange errors */ } } this.updateChart(); this.cdr.markForCheck(); // Keep checking viewport size until accordion is opened const checkInterval = setInterval(() => { if (this.dataViewport) { this.dataViewport.checkViewportSize(); const el = this.dataViewport.elementRef.nativeElement; if (el.clientHeight > 0) { clearInterval(checkInterval); } } }, 200); setTimeout(() => clearInterval(checkInterval), 30000); } catch (e: any) { this.common.generalHandleError(e); } } private async ensureDefaultLabel(): Promise { if (this.isReadonly) return; const labels = this.tsInfo?.labels; const labelCount = labels && typeof labels === 'object' ? Object.keys(labels).length : 0; if (labelCount === 0) { try { await this.socket.request({ action: 'timeseries-alter', payload: { key: this.p3xrKey, labels: `key ${this.p3xrKey}`, }, }); this.tsInfo.labels = { key: this.p3xrKey }; this.cdr.markForCheck(); } catch { /* ignore errors */ } } } exportChartPng(): void { if (!this.plot) return; const el = this.chartRef?.nativeElement; if (!el) return; const chartCanvas = el.querySelector('canvas') as HTMLCanvasElement; if (!chartCanvas) return; const isDark = document.body.classList.contains('p3xr-theme-dark'); const bgColor = isDark ? '#1e1e1e' : '#ffffff'; const textColor = isDark ? 'rgba(255,255,255,0.87)' : 'rgba(0,0,0,0.87)'; const padding = 20; const titleHeight = 30; const legendHeight = 30; const totalWidth = chartCanvas.width + padding * 2; const totalHeight = chartCanvas.height + padding * 2 + titleHeight + legendHeight; const exportCanvas = document.createElement('canvas'); exportCanvas.width = totalWidth; exportCanvas.height = totalHeight; const ctx = exportCanvas.getContext('2d')!; // Background ctx.fillStyle = bgColor; ctx.fillRect(0, 0, totalWidth, totalHeight); // Title ctx.fillStyle = textColor; ctx.font = 'bold 14px Roboto, sans-serif'; ctx.fillText(this.p3xrKey, padding, padding + 16); // Chart ctx.drawImage(chartCanvas, padding, padding + titleHeight); // Legend const series = [this.p3xrKey, ...this.overlaySeries.map(s => s.key)]; const colors = [this.getChartColors().primary, ...this.overlaySeries.map((_, i) => this.seriesColors[(i + 1) % this.seriesColors.length])]; let legendX = padding; const legendY = padding + titleHeight + chartCanvas.height + 16; ctx.font = '12px Roboto, sans-serif'; for (let i = 0; i < series.length; i++) { ctx.fillStyle = colors[i]; ctx.fillRect(legendX, legendY - 8, 12, 12); ctx.fillStyle = textColor; ctx.fillText(series[i], legendX + 16, legendY + 2); legendX += ctx.measureText(series[i]).width + 32; } // Download const url = exportCanvas.toDataURL('image/png'); const a = document.createElement('a'); a.href = url; a.download = `${this.p3xrKey}-chart.png`; a.click(); } toggleAlterMode(): void { this.alterMode = !this.alterMode; if (this.alterMode) { this.alterRetention = this.tsInfo?.retentionTime || 0; this.alterDuplicatePolicy = this.tsInfo?.duplicatePolicy || 'LAST'; const labels = this.tsLabels.map(l => `${l.key} ${l.value}`).join(' '); this.alterLabels = labels || `key ${this.p3xrKey}`; } this.cdr.markForCheck(); } async saveAlter(): Promise { try { // Default label if empty: key const labels = this.alterLabels.trim().length > 0 ? this.alterLabels : `key ${this.p3xrKey}`; await this.socket.request({ action: 'timeseries-alter', payload: { key: this.p3xrKey, retention: this.alterRetention, duplicatePolicy: this.alterDuplicatePolicy, labels: labels, }, }); this.common.toast(this.strings?.status?.saved || 'Updated'); this.alterMode = false; this.refreshKey(); } catch (e: any) { this.common.generalHandleError(e); } } async editDataPoint(point: { timestamp: number; value: number }): Promise { try { await this.keyNewOrSetDialog.show({ type: 'edit', model: { type: 'timeseries', key: this.p3xrKey, tsTimestamp: String(point.timestamp), value: point.value, originalTimestamp: point.timestamp, }, }); this.refreshKey(); await this.loadRange(); } catch (e: any) { if (e !== undefined && e !== null) { this.common.generalHandleError(e); } } } async editAllDataPoints(event: Event): Promise { try { const allPoints = this.rangeData.map(p => `${p.timestamp} ${p.value}`).join('\n'); const currentLabels = this.tsLabels.map(l => `${l.key} ${l.value}`).join(' ') || `key ${this.p3xrKey}`; await this.keyNewOrSetDialog.show({ type: 'edit', $event: event, model: { type: 'timeseries', key: this.p3xrKey, value: allPoints, tsEditAll: true, tsLabels: currentLabels, }, }); this.refreshKey(); await this.loadRange(); } catch (e: any) { if (e !== undefined && e !== null) { this.common.generalHandleError(e); } } } async deleteDataPoint(point: { timestamp: number; value: number }): Promise { try { await this.common.confirm({ message: this.i18n.strings().confirm?.delete || 'Delete?', }); await this.socket.request({ action: 'timeseries-del', payload: { key: this.p3xrKey, from: point.timestamp, to: point.timestamp, }, }); this.common.toast(this.strings?.status?.deleted || 'Deleted'); this.refreshKey(); } catch (e: any) { if (e !== undefined && e !== null) { this.common.generalHandleError(e); } } } formatTimestamp(ts: number): string { const lang = this.i18n.currentLang() || 'en'; return new Date(ts).toLocaleString(lang, { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', fractionalSecondDigits: 3 }); } async addDataPoint(): Promise { if (!this.addValue) return; try { await this.socket.request({ action: 'timeseries-add', payload: { key: this.p3xrKey, timestamp: this.addTimestamp || '*', value: parseFloat(this.addValue), }, }); this.common.toast(this.strings?.status?.added || 'Added'); this.addValue = ''; this.refreshKey(); } catch (e: any) { this.common.generalHandleError(e); } } // --- uPlot chart --- private async loadUPlot(): Promise { try { const mod = await import('uplot'); this.uPlot = mod.default; this.initChart(); } catch (e) { console.error('Failed to load uPlot', e); } } private readonly seriesColors = ['#1976d2', '#9c27b0', '#f44336', '#4caf50', '#ff9800', '#00bcd4', '#e91e63', '#8bc34a']; 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(); return { primary: primary || (isDark ? '#90caf9' : '#1976d2'), 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 createOpts(width: number): any { const colors = this.getChartColors(); const s = this.strings?.page?.key?.timeseries || {}; const seriesConfig: any[] = [ { label: this.strings?.label?.time || 'Time', value: (_: any, v: number) => { if (!v) return ''; const lang = this.i18n.currentLang() || 'en'; return new Date(v * 1000).toLocaleString(lang, { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); }, }, { label: this.p3xrKey, stroke: colors.primary, width: 2, fill: colors.primary + '15', }, ]; // Add overlay series for (let i = 0; i < this.overlaySeries.length; i++) { const color = this.seriesColors[(i + 1) % this.seriesColors.length]; seriesConfig.push({ label: this.overlaySeries[i].key, stroke: color, width: 2, }); } return { width, height: 400, cursor: { show: true, drag: { x: false, y: false } }, legend: { show: true, live: true }, 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 => new Date(t * 1000).toLocaleTimeString(this.i18n.currentLang() || 'en', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false })), }, { stroke: colors.text, grid: { stroke: colors.grid, width: 1 }, ticks: { stroke: colors.grid }, font: '11px Roboto Mono', size: 65, }, ], series: seriesConfig, }; } private initChart(): void { if (!this.uPlot) return; const el = this.chartRef?.nativeElement; if (!el) return; this.destroyChart(); const w = el.clientWidth || 400; const chartData = this.buildChartData(); this.plot = new this.uPlot(this.createOpts(w), chartData, el); let resizeTimer: any; this.resizeObserver = new ResizeObserver(() => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { const nw = el.clientWidth; if (nw > 0) this.plot?.setSize({ width: nw, height: 400 }); }, 50); }); this.resizeObserver.observe(el); } private reinitChart(): void { this.destroyChart(); this.initChart(); } private updateChart(): void { // Reinit when series count changes (overlay added/removed) const expectedSeries = 2 + this.overlaySeries.length; if (!this.plot || (this.plot.series?.length !== expectedSeries)) { this.reinitChart(); return; } const chartData = this.buildChartData(); this.plot.setData(chartData, true); if (chartData[0].length > 0) { this.plot.setScale('x', { min: chartData[0][0], max: chartData[0][chartData[0].length - 1] }); } } private buildChartData(): number[][] { if (this.overlaySeries.length === 0) { // Simple case: single series return [ this.rangeData.map(d => d.timestamp / 1000), this.rangeData.map(d => d.value), ]; } // Multiple series: merge all timestamps, align values with nulls for gaps const allSeries = [this.rangeData, ...this.overlaySeries.map(s => s.data)]; const tsSet = new Set(); for (const series of allSeries) { for (const d of series) tsSet.add(d.timestamp); } const sortedTs = Array.from(tsSet).sort((a, b) => a - b); const timestamps = sortedTs.map(t => t / 1000); const result: number[][] = [timestamps]; for (const series of allSeries) { const valueMap = new Map(); for (const d of series) valueMap.set(d.timestamp, d.value); result.push(sortedTs.map(t => valueMap.has(t) ? valueMap.get(t)! : null as any)); } return result; } private destroyChart(): void { this.resizeObserver?.disconnect(); this.resizeObserver = null; this.plot?.destroy(); this.plot = null; } } src/ng/pages/database/key/key-type-base.ts000066400000000000000000000125771517650670600207640ustar00rootroot00000000000000import { 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; /** Value display format */ @Input() valueFormat: 'raw' | 'json' | 'hex' | 'base64' = 'raw'; 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 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); if (this.maxValueDisplay <= 0) return str; if (str.length > this.maxValueDisplay) { return str.substring(0, this.maxValueDisplay); } return str; } protected isTruncated(value: any): boolean { if (value == null || this.maxValueDisplay <= 0) return false; return String(value).length > this.maxValueDisplay; } formatValue(value: any): string { if (value == null) return ''; const str = String(value); switch (this.valueFormat) { case 'json': try { return JSON.stringify(JSON.parse(str), null, 2); } catch { return str; } case 'hex': { const encoder = new TextEncoder(); const encoded = encoder.encode(str); const lines: string[] = []; for (let i = 0; i < encoded.length; i += 16) { const chunk = encoded.slice(i, i + 16); const addr = i.toString(16).padStart(8, '0'); const hexPart = Array.from(chunk).map(b => b.toString(16).padStart(2, '0')).join(' '); lines.push(`${addr} ${hexPart}`); } return lines.join('\n'); } case 'base64': { const raw = new TextEncoder().encode(str); let binary = ''; for (let i = 0; i < raw.length; i++) { binary += String.fromCharCode(raw[i]); } return btoa(binary); } default: 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.scss000066400000000000000000000103501517650670600205470ustar00rootroot00000000000000// 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 !important; 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; } // TimeSeries .p3xr-timeseries-controls { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px; padding: 8px 0; } .p3xr-timeseries-field { min-width: 140px; max-width: 200px; } .p3xr-timeseries-chart-container { width: 100%; min-height: 400px; } .p3xr-timeseries-chart-info { padding: 4px 0; opacity: 0.6; font-size: 13px; } .p3xr-timeseries-info-key { min-width: 180px; flex-shrink: 0; } .p3xr-timeseries-info-value { word-break: break-all; } src/ng/pages/database/key/key-zset.component.html000066400000000000000000000035371517650670600223730ustar00rootroot00000000000000
{{ strings?.page?.key?.label?.score || 'Score' }} {{ strings?.page?.key?.label?.value || 'Value' }} @if (!isReadonly) { }
@for (item of pagedItems; track item.index) {
{{ item.score }} {{ formatValue(truncateDisplay(item.member)) }}@if (isTruncated(item.member)) {...} @if (!isReadonly) { delete } table_chart content_copy download @if (!isReadonly) { edit }
}
src/ng/pages/database/key/key-zset.component.ts000066400000000000000000000111061517650670600220440ustar00rootroot00000000000000import { 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.html000066400000000000000000000030421517650670600222110ustar00rootroot00000000000000 @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.scss000066400000000000000000000035131517650670600222230ustar00rootroot00000000000000// 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.ts000066400000000000000000000133101517650670600216720ustar00rootroot00000000000000import { 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.ts000066400000000000000000000167121517650670600167000ustar00rootroot00000000000000import { 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/000077500000000000000000000000001517650670600155525ustar00rootroot00000000000000src/ng/pages/monitoring/memory-analysis.component.html000066400000000000000000000253521517650670600236010ustar00rootroot00000000000000@if (loading && !data) {
hourglass_empty {{ s().running || 'Analyzing...' }}
} @if (!loading && !data) {
analytics {{ s().noData || 'No data. Click Run Analysis to start.' }}
} @if (data) {
{{ s().keysScanned || 'Keys Scanned' }}
{{ data.totalScanned | number }} / {{ data.dbSize | number }}
{{ s().topN || 'Top N' }}
{{ s().maxScanKeys || 'Max Scan Keys' }}

{{ s().totalMemory || 'Total Memory' }}
{{ data.memoryInfo.usedHuman }}
{{ s().rssMemory || 'RSS Memory' }}
{{ data.memoryInfo.rssHuman }}
{{ s().peakMemory || 'Peak Memory' }}
{{ data.memoryInfo.peakHuman }}
{{ s().overheadMemory || 'Overhead' }}
{{ formatBytes(data.memoryInfo.overhead) }}
{{ s().datasetMemory || 'Dataset' }}
{{ formatBytes(data.memoryInfo.dataset) }}
{{ s().luaMemory || 'Lua Memory' }}
{{ formatBytes(data.memoryInfo.lua) }}
{{ s().fragmentation || 'Fragmentation' }}
{{ data.memoryInfo.fragRatio }}x
{{ s().allocator || 'Allocator' }}
{{ data.memoryInfo.allocator }}

@for (item of typeEntries; track item.type) {
{{ item.type }} {{ item.count }} keys
{{ formatBytes(item.bytes) }}
}

@for (item of data.prefixMemory; track item.prefix; let i = $index) {
#{{ i + 1 }} {{ item.prefix }} {{ item.keyCount }} keys
{{ formatBytes(item.totalBytes) }}
}

{{ s().withTTL || 'With TTL' }}
{{ data.expirationOverview.withTTL | number }}
{{ s().persistent || 'Persistent' }}
{{ data.expirationOverview.persistent | number }}
{{ s().avgTTL || 'Average TTL' }}
{{ formatTTL(data.expirationOverview.avgTTL) }}
}
src/ng/pages/monitoring/memory-analysis.component.scss000066400000000000000000000011451517650670600236020ustar00rootroot00000000000000p3xr-memory-analysis { display: block; padding-bottom: 64px; color: var(--mat-app-text-color, inherit); } .p3xr-analysis-loading { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 64px; opacity: 0.5; font-size: 18px; } .p3xr-analysis-server-info { opacity: 0.6; font-size: 12px; white-space: nowrap; } .p3xr-analysis-sub { opacity: 0.5; font-size: 12px; margin-left: 8px; } .p3xr-analysis-chart { width: 100%; min-height: 200px; overflow: hidden; canvas { width: 100% !important; } } src/ng/pages/monitoring/memory-analysis.component.ts000066400000000000000000000324641517650670600232650ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, ViewChild, AfterViewInit, NgZone } 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 { 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'; import { P3xrInputComponent } from '../../components/p3xr-input.component'; import { RedisStateService } from '../../services/redis-state.service'; require('./memory-analysis.component.scss'); @Component({ selector: 'p3xr-memory-analysis', standalone: true, imports: [ CommonModule, FormsModule, MatIconModule, MatButtonModule, MatTooltipModule, MatDividerModule, MatListModule, P3xrAccordionComponent, P3xrButtonComponent, P3xrInputComponent, ], templateUrl: './memory-analysis.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) export class MemoryAnalysisComponent implements OnInit, OnDestroy, AfterViewInit { strings; data: any = null; loading = false; topN = 20; maxScanKeys = 5000; typeEntries: Array<{ type: string; count: number; bytes: number }> = []; @ViewChild('typeChart') typeChartRef!: ElementRef; @ViewChild('prefixChart') prefixChartRef!: ElementRef; private unsubFns: Array<() => void> = []; private boundRecalcHost: (() => void) | null = null; private themeObserver: MutationObserver | null = null; private resizeTimer: any; 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(ElementRef) private elementRef: ElementRef, @Inject(RedisStateService) private state: RedisStateService, ) { this.strings = this.i18n.strings; } s() { return this.strings().page?.analysis || {}; } get connName(): string { return this.state.connection()?.name || 'redis'; } ngOnInit(): void { this.runAnalysis(); const sub = this.socket.stateChanged$.subscribe(() => { this.data = null; this.runAnalysis(); }); this.unsubFns.push(() => sub.unsubscribe()); } ngAfterViewInit(): void { this.ngZone.runOutsideAngular(() => { this.boundRecalcHost = () => { this.recalcHostHeight(); clearTimeout(this.resizeTimer); this.resizeTimer = setTimeout(() => { if (this.data) this.drawCharts(); }, 150); }; window.addEventListener('resize', this.boundRecalcHost); }); document.body.classList.add('p3xr-no-main-scroll'); this.recalcHostHeight(); this.ngZone.runOutsideAngular(() => { this.themeObserver = new MutationObserver(() => { if (this.data) setTimeout(() => this.drawCharts(), 100); }); this.themeObserver.observe(document.body, { attributes: true, attributeFilter: ['class'] }); }); } ngOnDestroy(): void { document.body.classList.remove('p3xr-no-main-scroll'); this.themeObserver?.disconnect(); if (this.boundRecalcHost) { window.removeEventListener('resize', this.boundRecalcHost); } this.unsubFns.forEach(fn => fn()); } private recalcHostHeight(): void { const el = this.elementRef.nativeElement as HTMLElement; if (!el) return; const rect = el.getBoundingClientRect(); const footerHeight = document.getElementById('p3xr-layout-footer-container')?.offsetHeight || 48; const available = window.innerHeight - rect.top - footerHeight; el.style.height = Math.max(available, 100) + 'px'; el.style.overflowY = 'auto'; } async runAnalysis(): Promise { if (this.loading) return; this.loading = true; this.safeDetectChanges(); try { const response = await this.socket.request({ action: 'memory-analysis', payload: { topN: this.topN, maxScanKeys: this.maxScanKeys }, }); this.data = response.data; this.typeEntries = Object.keys(this.data.typeDistribution).map(type => ({ type, count: this.data.typeDistribution[type], bytes: this.data.typeMemory[type] || 0, })).sort((a, b) => b.bytes - a.bytes); this.loading = false; this.safeDetectChanges(); setTimeout(() => this.drawCharts(), 100); } catch (e) { this.loading = false; this.safeDetectChanges(); this.common.generalHandleError(e); } } formatBytes(bytes: number): string { if (bytes == null || isNaN(bytes)) return '-'; if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB'; } formatTTL(seconds: number): string { if (!seconds || seconds <= 0) return '-'; try { const humanizeDuration = require('humanize-duration'); const hdOpts = (window as any).p3xr?.settings?.getHumanizeDurationOptions?.() ?? {}; return humanizeDuration(seconds * 1000, { ...hdOpts, delimiter: ' ' }); } catch { if (seconds < 60) return seconds + 's'; if (seconds < 3600) return Math.floor(seconds / 60) + 'm ' + (seconds % 60) + 's'; if (seconds < 86400) return Math.floor(seconds / 3600) + 'h ' + Math.floor((seconds % 3600) / 60) + 'm'; return Math.floor(seconds / 86400) + 'd ' + Math.floor((seconds % 86400) / 3600) + 'h'; } } private formatUptime(s: number): string { 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 downloadText(content: string, filename: string): void { const blob = new Blob([content], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } exportOverview(): void { if (!this.data) return; const t = this.s(); this.downloadText([ `${t.keysScanned || 'Keys Scanned'}: ${this.data.totalScanned} / ${this.data.dbSize}`, `${t.topN || 'Top N'}: ${this.topN}`, `${t.maxScanKeys || 'Max Scan Keys'}: ${this.maxScanKeys}`, ].join('\n'), `${this.connName}-analysis-overview.txt`); } exportMemoryBreakdown(): void { if (!this.data) return; const t = this.s(); const m = this.data.memoryInfo; this.downloadText([ `${t.totalMemory || 'Total'}: ${m.usedHuman}`, `${t.rssMemory || 'RSS'}: ${m.rssHuman}`, `${t.peakMemory || 'Peak'}: ${m.peakHuman}`, `${t.overheadMemory || 'Overhead'}: ${this.formatBytes(m.overhead)}`, `${t.datasetMemory || 'Dataset'}: ${this.formatBytes(m.dataset)}`, `${t.luaMemory || 'Lua'}: ${this.formatBytes(m.lua)}`, `${t.fragmentation || 'Fragmentation'}: ${m.fragRatio}x`, `${t.allocator || 'Allocator'}: ${m.allocator}`, ].join('\n'), `${this.connName}-memory-breakdown.txt`); } exportExpiration(): void { if (!this.data) return; const t = this.s(); const e = this.data.expirationOverview; this.downloadText([ `${t.withTTL || 'With TTL'}: ${e.withTTL}`, `${t.persistent || 'Persistent'}: ${e.persistent}`, `${t.avgTTL || 'Average TTL'}: ${this.formatTTL(e.avgTTL)}`, ].join('\n'), `${this.connName}-expiration.txt`); } exportChart(chartRef: ElementRef | undefined, name: string): void { const canvas = chartRef?.nativeElement?.querySelector('canvas') as HTMLCanvasElement; if (!canvas) return; // Create a copy with solid background const exportCanvas = document.createElement('canvas'); exportCanvas.width = canvas.width; exportCanvas.height = canvas.height; const ctx = exportCanvas.getContext('2d')!; ctx.fillStyle = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; ctx.fillRect(0, 0, exportCanvas.width, exportCanvas.height); ctx.drawImage(canvas, 0, 0); const url = exportCanvas.toDataURL('image/png'); const a = document.createElement('a'); a.href = url; a.download = `${this.connName}-${name}.png`; a.click(); } private safeDetectChanges(): void { this.ngZone.run(() => { try { this.cdr.detectChanges(); } catch { /* teardown */ } }); } drawCharts(): void { this.drawBarChart(this.typeChartRef?.nativeElement, this.typeEntries.map(t => ({ label: t.type, value: t.bytes, }))); this.drawBarChart(this.prefixChartRef?.nativeElement, (this.data?.prefixMemory || []).slice(0, 20).map((p: any) => ({ label: p.prefix, value: p.totalBytes, }))); } 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)', isDark, }; } private getBarColors(colors: ReturnType): string[] { const isDark = colors.isDark; return [ colors.primary, colors.accent, colors.warn, isDark ? '#ffb74d' : '#ff9800', isDark ? '#81c784' : '#4caf50', isDark ? '#4dd0e1' : '#00bcd4', isDark ? '#a1887f' : '#795548', isDark ? '#90a4ae' : '#607d8b', ]; } private drawBarChart(container: HTMLDivElement | undefined, items: Array<{ label: string; value: number }>): void { if (!container || items.length === 0) return; container.innerHTML = ''; const colors = this.getChartColors(); const barColors = this.getBarColors(colors); const canvas = document.createElement('canvas'); const dpr = window.devicePixelRatio || 1; const width = container.offsetWidth || 500; const barHeight = 24; const labelWidth = 120; const valueWidth = 80; const chartLeft = labelWidth + 8; const chartRight = width - valueWidth - 8; const chartWidth = chartRight - chartLeft; const topPad = 8; const height = topPad + items.length * (barHeight + 4) + 8; canvas.width = width * dpr; canvas.height = height * dpr; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; const ctx = canvas.getContext('2d')!; ctx.scale(dpr, dpr); const maxVal = Math.max(...items.map(i => i.value), 1); items.forEach((item, i) => { const y = topPad + i * (barHeight + 4); ctx.fillStyle = colors.text; ctx.font = '12px Roboto, sans-serif'; ctx.textAlign = 'right'; ctx.textBaseline = 'middle'; ctx.fillText(item.label.length > 15 ? item.label.substring(0, 14) + '…' : item.label, labelWidth, y + barHeight / 2); ctx.fillStyle = colors.grid; ctx.fillRect(chartLeft, y, chartWidth, barHeight); const barWidth = (item.value / maxVal) * chartWidth; ctx.fillStyle = barColors[i % barColors.length]; ctx.fillRect(chartLeft, y, barWidth, barHeight); ctx.fillStyle = colors.text; ctx.font = '11px Roboto Mono, monospace'; ctx.textAlign = 'left'; ctx.fillText(this.formatBytes(item.value), chartRight + 8, y + barHeight / 2); }); container.appendChild(canvas); } } src/ng/pages/monitoring/monitoring-data.service.ts000066400000000000000000000145771517650670600226730ustar00rootroot00000000000000import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; export interface ProfilerEntry { displayTime: string; fullTimestamp: string; database: string; source: string; command: string; } export interface PubsubEntry { displayTime: string; fullTimestamp: string; channel: string; message: string; } const PROFILER_STORAGE_KEY = 'p3xr-profiler-entries'; const PUBSUB_STORAGE_KEY = 'p3xr-pubsub-entries'; const MAX_ENTRIES = 10000; const MAX_STORAGE_ENTRIES = 100; const SAVE_DEBOUNCE = 2000; @Injectable({ providedIn: 'root' }) export class MonitoringDataService { profilerEntries: ProfilerEntry[] = []; pubsubEntries: PubsubEntry[] = []; readonly profilerEntry$ = new Subject(); readonly pubsubEntry$ = new Subject(); profilerStarted = false; pubsubStarted = false; pubsubPattern = '*'; private socket: any; private langFn: () => string = () => 'en'; private profilerSaveTimeout: any = null; private pubsubSaveTimeout: any = null; private initialized = false; init(socket: any, langFn: () => string): void { this.socket = socket; this.langFn = langFn; if (!this.initialized) { this.restoreFromStorage(); this.initialized = true; } } destroy(): void { this.saveProfilerNow(); this.savePubSubNow(); } async startProfiler(): Promise { if (this.profilerStarted) return; await this.socket.request({ action: 'set-monitor', payload: { enabled: true } }); this.profilerStarted = true; this.socket.getClient()?.on?.('monitor-data', this.onMonitorData); } stopProfiler(): void { if (!this.profilerStarted) return; this.socket.request({ action: 'set-monitor', payload: { enabled: false } }).catch(() => {}); this.socket.getClient()?.removeListener?.('monitor-data', this.onMonitorData); this.profilerStarted = false; this.saveProfilerNow(); } async startPubSub(): Promise { if (this.pubsubStarted) return; await this.socket.request({ action: 'set-subscription', payload: { subscription: true, subscriberPattern: this.pubsubPattern }, }); this.pubsubStarted = true; this.socket.getClient()?.on?.('pubsub-message', this.onPubSubMessage); } stopPubSub(): void { if (!this.pubsubStarted) return; this.socket.request({ action: 'set-subscription', payload: { subscription: false, subscriberPattern: '*' } }).catch(() => {}); this.socket.getClient()?.removeListener?.('pubsub-message', this.onPubSubMessage); this.pubsubStarted = false; this.savePubSubNow(); } async restartPubSub(): Promise { this.stopPubSub(); await this.startPubSub(); } clearProfiler(): void { this.profilerEntries = []; try { localStorage.removeItem(PROFILER_STORAGE_KEY); } catch {} } clearPubSub(): void { this.pubsubEntries = []; try { localStorage.removeItem(PUBSUB_STORAGE_KEY); } catch {} } private onMonitorData = (data: any) => { const lang = this.langFn() || 'en'; const date = new Date(parseFloat(data.time) * 1000); const displayTime = date.toLocaleTimeString(lang, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false, fractionalSecondDigits: 3 } as any); const entry: ProfilerEntry = { displayTime, fullTimestamp: date.toISOString(), database: data.database, source: data.source, command: (data.args || []).join(' '), }; this.profilerEntries.push(entry); if (this.profilerEntries.length > MAX_ENTRIES) { this.profilerEntries = this.profilerEntries.slice(-MAX_ENTRIES); } this.profilerEntry$.next(entry); this.debounceSaveProfiler(); }; private onPubSubMessage = (data: any) => { const lang = this.langFn() || 'en'; const date = new Date(); const displayTime = date.toLocaleTimeString(lang, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); const entry: PubsubEntry = { displayTime, fullTimestamp: date.toISOString(), channel: data.channel, message: String(data.message), }; this.pubsubEntries.push(entry); if (this.pubsubEntries.length > MAX_ENTRIES) { this.pubsubEntries = this.pubsubEntries.slice(-MAX_ENTRIES); } this.pubsubEntry$.next(entry); this.debounceSavePubSub(); }; private debounceSaveProfiler(): void { if (this.profilerSaveTimeout) return; this.profilerSaveTimeout = setTimeout(() => { this.profilerSaveTimeout = null; this.saveProfilerNow(); }, SAVE_DEBOUNCE); } private debounceSavePubSub(): void { if (this.pubsubSaveTimeout) return; this.pubsubSaveTimeout = setTimeout(() => { this.pubsubSaveTimeout = null; this.savePubSubNow(); }, SAVE_DEBOUNCE); } private saveProfilerNow(): void { if (this.profilerSaveTimeout) { clearTimeout(this.profilerSaveTimeout); this.profilerSaveTimeout = null; } this.saveToStorage(PROFILER_STORAGE_KEY, this.profilerEntries); } private savePubSubNow(): void { if (this.pubsubSaveTimeout) { clearTimeout(this.pubsubSaveTimeout); this.pubsubSaveTimeout = null; } this.saveToStorage(PUBSUB_STORAGE_KEY, this.pubsubEntries); } private saveToStorage(key: string, entries: any[]): void { const toSave = entries.slice(-MAX_STORAGE_ENTRIES); try { localStorage.setItem(key, JSON.stringify(toSave)); } catch { try { localStorage.removeItem(key); } catch {} } } private restoreFromStorage(): void { try { const profilerJson = localStorage.getItem(PROFILER_STORAGE_KEY); if (profilerJson) { this.profilerEntries = JSON.parse(profilerJson); } } catch {} try { const pubsubJson = localStorage.getItem(PUBSUB_STORAGE_KEY); if (pubsubJson) { this.pubsubEntries = JSON.parse(pubsubJson); } } catch {} } } src/ng/pages/monitoring/monitoring-shell.component.scss000066400000000000000000000002411517650670600237370ustar00rootroot00000000000000p3xr-monitoring-shell { display: block; } .p3xr-monitoring-tabs > .mat-mdc-tab-header { background-color: var(--p3xr-content-bg, #303030) !important; } src/ng/pages/monitoring/monitoring-shell.component.ts000066400000000000000000000101711517650670600234150ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core'; import { Router, RouterOutlet, NavigationEnd } from '@angular/router'; import { MatTabsModule } from '@angular/material/tabs'; import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; import { I18nService } from '../../services/i18n.service'; import { SocketService } from '../../services/socket.service'; import { CommonService } from '../../services/common.service'; import { MonitoringDataService } from './monitoring-data.service'; require('./monitoring-shell.component.scss'); declare const p3xr: any; @Component({ selector: 'p3xr-monitoring-shell', standalone: true, imports: [RouterOutlet, MatTabsModule], template: ` `, encapsulation: ViewEncapsulation.None, }) export class MonitoringShellComponent implements OnInit, OnDestroy { strings; selectedTab = 0; private readonly routes = ['/monitoring', '/monitoring/profiler', '/monitoring/pubsub', '/monitoring/analysis']; private routerSub?: Subscription; private subs: Subscription[] = []; private servicesStarted = false; constructor( @Inject(I18nService) private readonly i18n: I18nService, @Inject(Router) private readonly router: Router, @Inject(SocketService) private readonly socket: SocketService, @Inject(CommonService) private readonly common: CommonService, @Inject(MonitoringDataService) private readonly data: MonitoringDataService, ) { this.strings = this.i18n.strings; } ngOnInit(): void { this.syncTab(this.router.url); this.routerSub = this.router.events .pipe(filter(e => e instanceof NavigationEnd)) .subscribe((e: NavigationEnd) => this.syncTab(e.urlAfterRedirects)); // Redirect to settings on Redis disconnect this.subs.push(this.socket.redisDisconnected$.subscribe(() => { this.router.navigate(['/settings']); })); // If connected, start immediately; otherwise wait for connection if (p3xr?.state?.connection) { this.initServices(); } else { this.subs.push(this.socket.stateChanged$.subscribe(() => { if (p3xr?.state?.connection && !this.servicesStarted) { this.initServices(); } })); } } ngOnDestroy(): void { this.data.stopProfiler(); this.data.stopPubSub(); this.data.destroy(); this.routerSub?.unsubscribe(); this.subs.forEach(s => s.unsubscribe()); } private initServices(): void { this.servicesStarted = true; this.data.init(this.socket, () => this.i18n.currentLang()); this.startServices(); } private async startServices(): Promise { try { await this.data.startProfiler(); } catch (e) { this.common.generalHandleError(e); } try { await this.data.startPubSub(); } catch (e) { this.common.generalHandleError(e); } } onTabChange(index: number): void { if (index >= 0 && index < this.routes.length) { this.router.navigate([this.routes[index]]); } } private syncTab(url: string): void { if (url.startsWith('/monitoring/profiler')) { this.selectedTab = 1; } else if (url.startsWith('/monitoring/pubsub')) { this.selectedTab = 2; } else if (url.startsWith('/monitoring/analysis')) { this.selectedTab = 3; } else { this.selectedTab = 0; } } } src/ng/pages/monitoring/monitoring.component.html000066400000000000000000000365421517650670600226400ustar00rootroot00000000000000@if (!current) {
hourglass_empty {{ strings().label?.loading || 'Loading...' }}
} @if (current) {
Redis {{ current.server.version }} · {{ current.server.mode }}
{{ uptimeFormatted }}
{{ strings().page?.monitor?.memory || 'Memory' }}
{{ current.memory.usedHuman }}
{{ strings().page?.monitor?.rss || 'RSS' }}
{{ current.memory.rssHuman }}
{{ strings().page?.monitor?.peak || 'Peak' }}
{{ current.memory.peakHuman }}
{{ strings().page?.monitor?.fragmentation || '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 }}%
{{ strings().page?.monitor?.hitsAndMisses || '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.scss000066400000000000000000000035111517650670600226350ustar00rootroot00000000000000p3xr-monitoring { 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.ts000066400000000000000000001327031517650670600223160ustar00rootroot00000000000000import { 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'; import { RedisStateService } from '../../services/redis-state.service'; import { MonitoringDataService } from './monitoring-data.service'; 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> = []; private boundRecalcHost: (() => void) | null = null; 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(ElementRef) private elementRef: ElementRef, @Inject(RedisStateService) private state: RedisStateService, @Inject(MonitoringDataService) private monitorData: MonitoringDataService, ) { 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 { document.body.classList.add('p3xr-no-main-scroll'); this.recalcHostHeight(); this.ngZone.runOutsideAngular(() => { this.boundRecalcHost = () => this.recalcHostHeight(); window.addEventListener('resize', this.boundRecalcHost); }); // Delay chart init to ensure DOM has layout setTimeout(() => this.loadUPlot(), 500); } ngOnDestroy(): void { document.body.classList.remove('p3xr-no-main-scroll'); if (this.boundRecalcHost) { window.removeEventListener('resize', this.boundRecalcHost); } 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(); } private recalcHostHeight(): void { const el = this.elementRef.nativeElement as HTMLElement; if (!el) return; const rect = el.getBoundingClientRect(); const footerHeight = document.getElementById('p3xr-layout-footer-container')?.offsetHeight || 48; const available = window.innerHeight - rect.top - footerHeight; el.style.height = Math.max(available, 100) + 'px'; el.style.overflowY = 'auto'; } 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; } private get connName(): string { return this.state.connection()?.name || 'redis'; } exportOverview(): void { if (!this.current) return; const c = this.current; const mon = this.strings().page?.monitor || {}; const lines = [ `${mon.memory || 'Memory'}: ${c.memory.usedHuman}`, `${mon.rss || 'RSS'}: ${c.memory.rssHuman}`, `${mon.peak || 'Peak'}: ${c.memory.peakHuman}`, `${mon.fragmentation || 'Fragmentation'}: ${c.memory.fragRatio}x`, `${mon.opsPerSec || 'Ops/sec'}: ${c.stats.opsPerSec}`, `${mon.totalCommands || 'Total'}: ${c.stats.totalCommands}`, `${mon.clients || 'Clients'}: ${c.clients.connected}`, `${mon.blocked || 'Blocked'}: ${c.clients.blocked}`, `${mon.hitsMisses || 'Hit Rate'}: ${c.stats.hitRate}%`, `${mon.hitsAndMisses || 'Hits / Misses'}: ${c.stats.hits} / ${c.stats.misses}`, `${mon.networkIo || 'Network I/O'}: ${c.stats.inputKbps.toFixed(1)} / ${c.stats.outputKbps.toFixed(1)} KB/s`, `${mon.expired || 'Expired'}: ${c.stats.expiredKeys}`, `${mon.evicted || 'Evicted'}: ${c.stats.evictedKeys}`, ]; this.downloadText(lines.join('\n'), `${this.connName}-overview.txt`); } exportChart(chartRef: ElementRef | undefined, name: string): void { const canvas = chartRef?.nativeElement?.querySelector('canvas') as HTMLCanvasElement; if (!canvas) return; const exportCanvas = document.createElement('canvas'); exportCanvas.width = canvas.width; exportCanvas.height = canvas.height; const ctx = exportCanvas.getContext('2d')!; ctx.fillStyle = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; ctx.fillRect(0, 0, exportCanvas.width, exportCanvas.height); ctx.drawImage(canvas, 0, 0); const url = exportCanvas.toDataURL('image/png'); const a = document.createElement('a'); a.href = url; a.download = `${this.connName}-${name}.png`; a.click(); } exportSlowLog(): void { if (!this.current) return; const lines = this.current.slowlog.map(e => `${e.duration}µs ${e.command}`); this.downloadText(lines.join('\n'), `${this.connName}-slowlog.txt`); } exportClientList(): void { const lines = this.clientList.map(c => `${c.addr} ${c.name || ''} db${c.db} ${c.cmd} idle:${c.idle}s`); this.downloadText(lines.join('\n'), `${this.connName}-clients.txt`); } exportTopKeys(): void { const lines = this.topKeys.map((e, i) => `#${i + 1} ${e.key} ${this.formatBytes(e.bytes)}`); this.downloadText(lines.join('\n'), `${this.connName}-topkeys.txt`); } async exportAll(): Promise { if (!this.current) return; try { const JSZip = (await import('jszip')).default; const zip = new JSZip(); const c = this.current; const sections: string[] = []; // === PULSE === const mon = this.strings().page?.monitor || {}; const a = this.strings().page?.analysis || {}; sections.push( `============================`, ` PULSE`, `============================`, ``, `--- ${mon.title || 'Monitoring'} ---`, `Redis ${c.server.version} · ${c.server.mode} · Uptime: ${this.uptimeFormatted}`, `${mon.memory || 'Memory'}: ${c.memory.usedHuman}`, `${mon.rss || 'RSS'}: ${c.memory.rssHuman}`, `${mon.peak || 'Peak'}: ${c.memory.peakHuman}`, `${mon.fragmentation || 'Fragmentation'}: ${c.memory.fragRatio}x`, `${mon.opsPerSec || 'Ops/sec'}: ${c.stats.opsPerSec}`, `${mon.totalCommands || 'Total'}: ${c.stats.totalCommands}`, `${mon.clients || 'Clients'}: ${c.clients.connected}`, `${mon.blocked || 'Blocked'}: ${c.clients.blocked}`, `${mon.hitsMisses || 'Hit Rate'}: ${c.stats.hitRate}%`, `${mon.hitsAndMisses || 'Hits / Misses'}: ${c.stats.hits} / ${c.stats.misses}`, `${mon.networkIo || 'Network I/O'}: ${c.stats.inputKbps.toFixed(1)} / ${c.stats.outputKbps.toFixed(1)} KB/s`, `${mon.expired || 'Expired'}: ${c.stats.expiredKeys}`, `${mon.evicted || 'Evicted'}: ${c.stats.evictedKeys}`, ); if (c.slowlog.length > 0) { sections.push(``, `--- ${mon.slowLog || 'Slow Log'} ---`); sections.push(...c.slowlog.map(e => `${e.duration}µs ${e.command}`)); } if (this.clientList.length > 0) { sections.push(``, `--- ${mon.clientList || 'Client List'} ---`); sections.push(...this.clientList.map(cl => `${cl.addr} ${cl.name || ''} db${cl.db} ${cl.cmd} idle:${cl.idle}s`)); } if (this.topKeys.length > 0) { sections.push(``, `--- ${mon.topKeys || 'Top Keys by Memory'} ---`); sections.push(...this.topKeys.map((e, i) => `#${i + 1} ${e.key} ${this.formatBytes(e.bytes)}`)); } // === ANALYSIS === let analysisChartItems: Array<{ name: string; items: Array<{ label: string; value: number }> }> = []; try { const resp = await this.socket.request({ action: 'memory-analysis', payload: { topN: 20, maxScanKeys: 5000 } }); const d = resp.data; if (d) { const m = d.memoryInfo; const exp = d.expirationOverview; const typeEntries = Object.keys(d.typeDistribution || {}).map((t: string) => ({ type: t, count: d.typeDistribution[t], bytes: d.typeMemory?.[t] || 0, })).sort((a: any, b: any) => b.bytes - a.bytes); sections.push(``, ``, `============================`, ` ANALYSIS`, `============================`); sections.push(``, `--- ${a.keysScanned || 'Keys Scanned'} ---`, `${a.keysScanned || 'Keys Scanned'}: ${d.totalScanned} / ${d.dbSize}`); sections.push(``, `--- ${a.memoryBreakdown || 'Memory Breakdown'} ---`); sections.push(`${a.totalMemory || 'Total'}: ${m.usedHuman}`, `${a.rssMemory || 'RSS'}: ${m.rssHuman}`, `${a.peakMemory || 'Peak'}: ${m.peakHuman}`); sections.push(`${a.overheadMemory || 'Overhead'}: ${this.formatBytes(m.overhead)}`, `${a.datasetMemory || 'Dataset'}: ${this.formatBytes(m.dataset)}`); sections.push(`${a.luaMemory || 'Lua'}: ${this.formatBytes(m.lua)}`, `${a.fragmentation || 'Fragmentation'}: ${m.fragRatio}x`, `${a.allocator || 'Allocator'}: ${m.allocator}`); sections.push(``, `--- ${a.typeDistribution || 'Type Distribution'} ---`); sections.push(...typeEntries.map((t: any) => `${t.type}: ${t.count} ${a.keyCount || 'keys'}, ${this.formatBytes(t.bytes)}`)); if (d.prefixMemory?.length > 0) { sections.push(``, `--- ${a.prefixMemory || 'Memory by Prefix'} ---`); sections.push(...d.prefixMemory.map((p: any, i: number) => `#${i + 1} ${p.prefix} \u2014 ${p.keyCount} ${a.keyCount || 'keys'}, ${this.formatBytes(p.totalBytes)}`)); } sections.push(``, `--- ${a.expirationOverview || 'Key Expiration'} ---`); sections.push(`${a.withTTL || 'With TTL'}: ${exp.withTTL}`, `${a.persistent || 'Persistent'}: ${exp.persistent}`, `${a.avgTTL || 'Average TTL'}: ${exp.avgTTL}s`); analysisChartItems = [ { name: a.typeDistribution || 'Type Distribution', items: typeEntries.map((t: any) => ({ label: t.type, value: t.bytes })) }, { name: a.prefixMemory || 'Memory by Prefix', items: (d.prefixMemory || []).slice(0, 20).map((p: any) => ({ label: p.prefix, value: p.totalBytes })) }, ]; } } catch { /* analysis optional */ } // Profiler + PubSub tail sections (long, go last in txt and PDF) // Sanitize: strip null bytes and non-printable control chars from raw Redis data const sanitize = (s: string) => s.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, ''); const tailSections: string[] = []; if (this.monitorData.profilerEntries.length > 0) { tailSections.push(``, ``, `============================`, ` PROFILER`, `============================`, ``); tailSections.push(...this.monitorData.profilerEntries.map( e => sanitize(`${e.fullTimestamp} [${e.database} ${e.source}] ${e.command}`) )); } if (this.monitorData.pubsubEntries.length > 0) { tailSections.push(``, ``, `============================`, ` PUBSUB`, `============================`, ``); tailSections.push(...this.monitorData.pubsubEntries.map( e => sanitize(`${e.fullTimestamp} ${e.channel} ${e.message}`) )); } // Write the single text file: sections + tail (UTF-8 with BOM) const textContent = [...sections, ...tailSections].join('\n'); const textBytes = new TextEncoder().encode(textContent); const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const txtWithBom = new Uint8Array(bom.length + textBytes.length); txtWithBom.set(bom); txtWithBom.set(textBytes, bom.length); zip.file('monitoring.txt', txtWithBom); // Collect all chart canvases and stitch into 1 tall PNG const allCanvases: Array<{ label: string; canvas: HTMLCanvasElement }> = []; // Pulse charts (render offscreen so they work even with collapsed accordions) allCanvases.push(...this.renderPulseChartsForExport()); // Analysis charts (render offscreen) for (const ci of analysisChartItems) { if (ci.items.length === 0) continue; const canvas = this.renderBarChart(ci.items); if (canvas) allCanvases.push({ label: ci.name, canvas }); } // Stitch all canvases into 1 tall image if (allCanvases.length > 0) { const blob = await this.stitchCharts(allCanvases); if (blob) zip.file('charts.png', blob); } // Generate PDF with text + charts try { const pdfBlob = await this.generatePdf(sections, allCanvases, tailSections); if (pdfBlob) zip.file('monitoring.pdf', pdfBlob); } catch { /* pdf optional */ } const content = await zip.generateAsync({ type: 'blob' }); const url = URL.createObjectURL(content); const link = document.createElement('a'); link.href = url; link.download = `${this.connName}-monitoring.zip`; link.click(); URL.revokeObjectURL(url); } catch (e) { this.common.generalHandleError(e); } } private async stitchCharts(items: Array<{ label: string; canvas: HTMLCanvasElement }>): Promise { const padding = 32; const labelHeight = 60; const chartSpacing = 40; // Use full native pixel width of the widest chart, minimum 2400px const width = Math.max(2400, ...items.map(i => i.canvas.width)); // Calculate total height at native pixel resolution let totalHeight = padding; for (const item of items) { const scaledH = item.canvas.height * (width / item.canvas.width); totalHeight += labelHeight + scaledH + chartSpacing; } totalHeight += padding; const stitched = document.createElement('canvas'); stitched.width = width; stitched.height = totalHeight; const ctx = stitched.getContext('2d')!; const bgColor = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; const colors = this.getChartColors(); ctx.fillStyle = bgColor; ctx.fillRect(0, 0, width, totalHeight); let y = padding; for (const item of items) { // Label ctx.fillStyle = colors.text; ctx.font = 'bold 28px Roboto, sans-serif'; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; ctx.fillText(item.label, padding, y); y += labelHeight; // Draw chart at full width const drawW = width - padding * 2; const drawH = item.canvas.height * (drawW / item.canvas.width); ctx.drawImage(item.canvas, padding, y, drawW, drawH); y += drawH + chartSpacing; } return new Promise(resolve => stitched.toBlob(b => resolve(b), 'image/png')); } private renderPulseChartsForExport(): Array<{ label: string; canvas: HTMLCanvasElement }> { // Use history if available, otherwise build a minimal dataset from the current snapshot let data: ReturnType; if (this.history.length >= 2) { data = this.buildChartData(); } else if (this.current) { const c = this.current; const now = Date.now() / 1000; data = { timestamps: [now - 1, now], memUsed: [c.memory.used / (1024 * 1024), c.memory.used / (1024 * 1024)], memRss: [c.memory.rss / (1024 * 1024), c.memory.rss / (1024 * 1024)], ops: [c.stats.opsPerSec, c.stats.opsPerSec], connected: [c.clients.connected, c.clients.connected], blocked: [c.clients.blocked, c.clients.blocked], netIn: [c.stats.inputKbps, c.stats.inputKbps], netOut: [c.stats.outputKbps, c.stats.outputKbps], }; } else { return []; } const colors = this.getChartColors(); const s = this.strings().page?.monitor || {}; const chartConfigs: Array<{ label: string; series: Array<{ label: string; color: string; values: number[]; fill?: boolean }>; }> = [ { label: (s.memory || 'Memory') + ' (MB)', series: [ { label: s.memory || 'Memory', color: colors.primary, values: data.memUsed, fill: true }, { label: 'RSS', color: colors.accent, values: data.memRss }, ], }, { label: s.opsPerSec || 'Ops/sec', series: [ { label: s.opsPerSec || 'Ops/s', color: colors.primary, values: data.ops, fill: true }, ], }, { label: s.clients || 'Clients', series: [ { label: s.clients || 'Connected', color: colors.primary, values: data.connected }, { label: s.blocked || 'Blocked', color: colors.warn, values: data.blocked }, ], }, { label: (s.networkIo || 'Network I/O') + ' (KB/s)', series: [ { label: '\u2193 In', color: colors.primary, values: data.netIn, fill: true }, { label: '\u2191 Out', color: colors.accent, values: data.netOut }, ], }, ]; return chartConfigs.map(config => ({ label: config.label, canvas: this.renderLineChart(data.timestamps, config.series, colors) }) ); } private renderLineChart( timestamps: number[], series: Array<{ label: string; color: string; values: number[]; fill?: boolean }>, colors: ReturnType, ): HTMLCanvasElement { const dpr = 2; const width = 900; const height = 260; const padTop = 32; const padBottom = 40; const padLeft = 60; const padRight = 16; const legendH = 20; const chartW = width - padLeft - padRight; const chartH = height - padTop - padBottom - legendH; const canvas = document.createElement('canvas'); canvas.width = width * dpr; canvas.height = height * dpr; const ctx = canvas.getContext('2d')!; ctx.scale(dpr, dpr); // Background ctx.fillStyle = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; ctx.fillRect(0, 0, width, height); const n = timestamps.length; if (n < 2) return canvas; // Compute Y scale across all series let yMin = Infinity, yMax = -Infinity; for (const s of series) { for (const v of s.values) { if (v < yMin) yMin = v; if (v > yMax) yMax = v; } } if (yMin === yMax) { yMin -= 1; yMax += 1; } const yRange = yMax - yMin; const tMin = timestamps[0], tMax = timestamps[n - 1]; const tRange = tMax - tMin || 1; const toX = (t: number) => padLeft + ((t - tMin) / tRange) * chartW; const toY = (v: number) => padTop + chartH - ((v - yMin) / yRange) * chartH; // Grid lines ctx.strokeStyle = colors.grid; ctx.lineWidth = 1; const ySteps = 5; for (let i = 0; i <= ySteps; i++) { const gy = padTop + (chartH / ySteps) * i; ctx.beginPath(); ctx.moveTo(padLeft, gy); ctx.lineTo(padLeft + chartW, gy); ctx.stroke(); const val = yMax - (yRange / ySteps) * i; ctx.fillStyle = colors.text; ctx.font = '10px Roboto Mono, monospace'; ctx.textAlign = 'right'; ctx.textBaseline = 'middle'; ctx.fillText(val >= 1000 ? (val / 1000).toFixed(1) + 'k' : val.toFixed(1), padLeft - 6, gy); } // Time labels const labelCount = Math.min(6, n); ctx.font = '10px Roboto, sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'top'; ctx.fillStyle = colors.text; for (let i = 0; i < labelCount; i++) { const idx = Math.round((i / (labelCount - 1)) * (n - 1)); const t = timestamps[idx]; const d = new Date(t * 1000); const label = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`; ctx.fillText(label, toX(t), padTop + chartH + 6); } // Draw series for (const s of series) { ctx.strokeStyle = s.color; ctx.lineWidth = 2; ctx.lineJoin = 'round'; ctx.beginPath(); for (let i = 0; i < n; i++) { const x = toX(timestamps[i]); const y = toY(s.values[i]); if (i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y); } ctx.stroke(); if (s.fill) { ctx.fillStyle = s.color + '20'; ctx.beginPath(); ctx.moveTo(toX(timestamps[0]), toY(s.values[0])); for (let i = 1; i < n; i++) ctx.lineTo(toX(timestamps[i]), toY(s.values[i])); ctx.lineTo(toX(timestamps[n - 1]), padTop + chartH); ctx.lineTo(toX(timestamps[0]), padTop + chartH); ctx.closePath(); ctx.fill(); } } // Legend let lx = padLeft; const ly = height - legendH + 4; ctx.font = '11px Roboto, sans-serif'; ctx.textAlign = 'left'; ctx.textBaseline = 'middle'; for (const s of series) { ctx.fillStyle = s.color; ctx.fillRect(lx, ly - 4, 12, 8); ctx.fillStyle = colors.text; ctx.fillText(s.label, lx + 16, ly); lx += ctx.measureText(s.label).width + 32; } return canvas; } private renderBarChart(items: Array<{ label: string; value: number }>): HTMLCanvasElement | null { if (items.length === 0) return null; const colors = this.getChartColors(); const isDark = colors.text.includes('255'); const barColors = [ colors.primary, colors.accent, colors.warn, isDark ? '#ffb74d' : '#ff9800', isDark ? '#81c784' : '#4caf50', isDark ? '#4dd0e1' : '#00bcd4', isDark ? '#a1887f' : '#795548', isDark ? '#90a4ae' : '#607d8b', ]; const dpr = 2; const width = 800; const barHeight = 24; const labelWidth = 120; const valueWidth = 80; const chartLeft = labelWidth + 8; const chartRight = width - valueWidth - 8; const chartWidth = chartRight - chartLeft; const topPad = 8; const height = topPad + items.length * (barHeight + 4) + 8; const canvas = document.createElement('canvas'); canvas.width = width * dpr; canvas.height = height * dpr; const ctx = canvas.getContext('2d')!; ctx.scale(dpr, dpr); ctx.fillStyle = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; ctx.fillRect(0, 0, width, height); const maxVal = Math.max(...items.map(i => i.value), 1); items.forEach((item, i) => { const y = topPad + i * (barHeight + 4); ctx.fillStyle = colors.text; ctx.font = '12px Roboto, sans-serif'; ctx.textAlign = 'right'; ctx.textBaseline = 'middle'; ctx.fillText(item.label.length > 15 ? item.label.substring(0, 14) + '…' : item.label, labelWidth, y + barHeight / 2); ctx.fillStyle = colors.grid; ctx.fillRect(chartLeft, y, chartWidth, barHeight); ctx.fillStyle = barColors[i % barColors.length]; ctx.fillRect(chartLeft, y, (item.value / maxVal) * chartWidth, barHeight); ctx.fillStyle = colors.text; ctx.font = '11px Roboto Mono, monospace'; ctx.textAlign = 'left'; ctx.fillText(this.formatBytes(item.value), chartRight + 8, y + barHeight / 2); }); return canvas; } private async generatePdf(sections: string[], charts: Array<{ label: string; canvas: HTMLCanvasElement }>, tailSections: string[] = []): Promise { const { jsPDF } = await import('jspdf'); const isDark = document.body.classList.contains('p3xr-theme-dark'); const bgColor = getComputedStyle(document.body).getPropertyValue('--p3xr-body-bg').trim() || '#ffffff'; const textColor = isDark ? '#e0e0e0' : '#212121'; const headerColor = isDark ? '#90caf9' : '#1565c0'; const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' }); const pageW = pdf.internal.pageSize.getWidth(); const pageH = pdf.internal.pageSize.getHeight(); const margin = 12; const contentW = pageW - margin * 2; let y = margin; const fillBg = () => { pdf.setFillColor(bgColor); pdf.rect(0, 0, pageW, pageH, 'F'); }; fillBg(); const checkPage = (needed: number) => { if (y + needed > pageH - margin) { pdf.addPage(); fillBg(); y = margin; } }; // Text sections for (const line of sections) { if (line.startsWith('====')) { continue; } const isSectionTitle = line.trim() === 'PULSE' || line.trim() === 'PROFILER' || line.trim() === 'PUBSUB' || line.trim() === 'ANALYSIS'; if (isSectionTitle) { checkPage(14); y += 4; pdf.setFontSize(14); pdf.setTextColor(headerColor); pdf.text(line.trim(), margin, y); y += 8; continue; } if (line.startsWith('---') && line.endsWith('---')) { checkPage(8); const title = line.replace(/^-+\s*/, '').replace(/\s*-+$/, ''); y += 2; pdf.setFontSize(10); pdf.setTextColor(headerColor); pdf.text(title, margin, y); y += 5; continue; } if (line === '') { y += 2; continue; } checkPage(4); pdf.setTextColor(textColor); pdf.setFontSize(8); const wrapped = pdf.splitTextToSize(line, contentW); for (const wl of wrapped) { checkPage(4); pdf.text(wl, margin, y); y += 3.5; } } // Charts — each on its own page for (const chart of charts) { pdf.addPage(); fillBg(); y = margin; pdf.setFontSize(12); pdf.setTextColor(headerColor); pdf.text(chart.label, margin, y); y += 8; const imgData = chart.canvas.toDataURL('image/png'); const ratio = chart.canvas.height / chart.canvas.width; const availH = pageH - y - margin; const imgW = contentW; const imgH = imgW * ratio; if (imgH > availH) { // Scale to fit available height, keep full width const drawH = availH; const drawW = drawH / ratio; pdf.addImage(imgData, 'PNG', margin, y, drawW, drawH); y += drawH; } else { pdf.addImage(imgData, 'PNG', margin, y, imgW, imgH); y += imgH; } } // Tail sections (Profiler / PubSub — after charts, start new page) if (tailSections.length > 0 && charts.length > 0) { pdf.addPage(); fillBg(); y = margin; } for (const line of tailSections) { if (line.startsWith('====')) { continue; } const isSectionTitle = line.trim() === 'PROFILER' || line.trim() === 'PUBSUB'; if (isSectionTitle) { checkPage(14); y += 4; pdf.setFontSize(14); pdf.setTextColor(headerColor); pdf.text(line.trim(), margin, y); y += 8; continue; } if (line === '') { y += 2; continue; } checkPage(4); pdf.setTextColor(textColor); pdf.setFontSize(8); const wrapped = pdf.splitTextToSize(line, contentW); for (const wl of wrapped) { checkPage(4); pdf.text(wl, margin, y); y += 3.5; } } return pdf.output('blob') as unknown as Blob; } private downloadText(content: string, filename: string): void { const blob = new Blob([content], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } 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/profiler/000077500000000000000000000000001517650670600152075ustar00rootroot00000000000000src/ng/pages/profiler/profiler.component.html000066400000000000000000000013001517650670600217120ustar00rootroot00000000000000
src/ng/pages/profiler/profiler.component.ts000066400000000000000000000131471517650670600214100ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, AfterViewInit, ElementRef, ViewChild, NgZone, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { Subscription } from 'rxjs'; import { P3xrAccordionComponent } from '../../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../../components/p3xr-button.component'; import { I18nService } from '../../services/i18n.service'; import { MonitoringDataService, ProfilerEntry } from '../monitoring/monitoring-data.service'; import { RedisStateService } from '../../services/redis-state.service'; @Component({ selector: 'p3xr-profiler', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, P3xrAccordionComponent, P3xrButtonComponent], templateUrl: './profiler.component.html', encapsulation: ViewEncapsulation.None, styles: [` p3xr-profiler { display: block; color: var(--mat-app-text-color, inherit); } .p3xr-profiler-output { font-family: 'Roboto Mono', monospace; font-size: 13px; overflow-y: auto; word-break: break-all; white-space: normal; } .p3xr-profiler-entry { padding: 6px 16px; word-break: break-all; white-space: normal; } .p3xr-profiler-entry-odd { background-color: var(--p3xr-list-odd-bg); } `], }) export class ProfilerComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('profilerOutput') profilerOutputRef?: ElementRef; strings; private readonly maxDomEntries = 66; private entryIndex = 0; private sub?: Subscription; private resizeFn: (() => void) | null = null; constructor( @Inject(I18nService) private readonly i18n: I18nService, @Inject(MonitoringDataService) private readonly data: MonitoringDataService, @Inject(RedisStateService) private readonly state: RedisStateService, @Inject(NgZone) private readonly ngZone: NgZone, ) { this.strings = this.i18n.strings; } ngOnInit(): void { setTimeout(() => { this.renderExistingEntries(); this.sub = this.data.profilerEntry$.subscribe(entry => this.renderEntry(entry)); }); } ngAfterViewInit(): void { document.body.classList.add('p3xr-no-main-scroll'); this.ngZone.runOutsideAngular(() => { this.resizeFn = () => this.recalcHeight(); window.addEventListener('resize', this.resizeFn); setTimeout(() => { this.recalcHeight(); const el = this.profilerOutputRef?.nativeElement; if (el) el.scrollTop = el.scrollHeight; }, 50); }); } ngOnDestroy(): void { document.body.classList.remove('p3xr-no-main-scroll'); this.sub?.unsubscribe(); if (this.resizeFn) window.removeEventListener('resize', this.resizeFn); } clearProfiler(): void { this.data.clearProfiler(); this.entryIndex = 0; if (this.profilerOutputRef?.nativeElement) { this.profilerOutputRef.nativeElement.innerHTML = ''; } } exportProfiler(): void { const connName = this.state.connection()?.name || 'redis'; const lines = this.data.profilerEntries.map(e => `${e.fullTimestamp} [${e.database} ${e.source}] ${e.command}`); this.downloadText(lines.join('\n'), `${connName}-profiler-export.txt`); } private renderExistingEntries(): void { const el = this.profilerOutputRef?.nativeElement; if (!el) return; const entries = this.data.profilerEntries; const start = Math.max(0, entries.length - this.maxDomEntries); this.entryIndex = start; for (let i = start; i < entries.length; i++) { this.renderEntry(entries[i]); } el.scrollTop = el.scrollHeight; } private renderEntry(entry: ProfilerEntry): void { const el = this.profilerOutputRef?.nativeElement; if (!el) return; const odd = this.entryIndex++ % 2 === 1 ? ' p3xr-profiler-entry-odd' : ''; el.insertAdjacentHTML('beforeend', `
${this.escapeHtml(entry.displayTime)} [${this.escapeHtml(entry.database)} ${this.escapeHtml(entry.source)}] ${this.escapeHtml(entry.command)}
`); while (el.children.length > this.maxDomEntries) { el.removeChild(el.firstChild!); } el.scrollTop = el.scrollHeight; } private recalcHeight(): void { const el = this.profilerOutputRef?.nativeElement; if (!el) return; const rect = el.getBoundingClientRect(); const footerHeight = document.getElementById('p3xr-layout-footer-container')?.offsetHeight || 48; const available = window.innerHeight - rect.top - footerHeight - 8; el.style.height = Math.max(available, 100) + 'px'; } private escapeHtml(str: string): string { return str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } private downloadText(content: string, filename: string): void { const blob = new Blob([content], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } } src/ng/pages/profiler/pubsub.component.html000066400000000000000000000017411517650670600214010ustar00rootroot00000000000000
Pattern
src/ng/pages/profiler/pubsub.component.ts000066400000000000000000000137661517650670600210750ustar00rootroot00000000000000import { Component, Inject, OnInit, OnDestroy, AfterViewInit, ElementRef, ViewChild, NgZone, 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 { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { Subscription } from 'rxjs'; import { P3xrAccordionComponent } from '../../components/p3xr-accordion.component'; import { P3xrButtonComponent } from '../../components/p3xr-button.component'; import { I18nService } from '../../services/i18n.service'; import { MonitoringDataService, PubsubEntry } from '../monitoring/monitoring-data.service'; import { RedisStateService } from '../../services/redis-state.service'; @Component({ selector: 'p3xr-pubsub', standalone: true, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, P3xrAccordionComponent, P3xrButtonComponent], templateUrl: './pubsub.component.html', encapsulation: ViewEncapsulation.None, styles: [` p3xr-pubsub { display: block; color: var(--mat-app-text-color, inherit); } .p3xr-pubsub-output { font-family: 'Roboto Mono', monospace; font-size: 13px; overflow-y: auto; word-break: break-all; white-space: normal; } .p3xr-pubsub-entry { padding: 6px 16px; word-break: break-all; white-space: normal; } .p3xr-pubsub-entry-odd { background-color: var(--p3xr-list-odd-bg); } .p3xr-pubsub-pattern { padding: 8px 16px; } `], }) export class PubsubComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('pubsubOutput') pubsubOutputRef?: ElementRef; strings; get pubsubPattern(): string { return this.data.pubsubPattern; } set pubsubPattern(v: string) { this.data.pubsubPattern = v; } private readonly maxDomEntries = 66; private entryIndex = 0; private sub?: Subscription; private resizeFn: (() => void) | null = null; constructor( @Inject(I18nService) private readonly i18n: I18nService, @Inject(MonitoringDataService) private readonly data: MonitoringDataService, @Inject(RedisStateService) private readonly state: RedisStateService, @Inject(NgZone) private readonly ngZone: NgZone, ) { this.strings = this.i18n.strings; } ngOnInit(): void { setTimeout(() => { this.renderExistingEntries(); this.sub = this.data.pubsubEntry$.subscribe(entry => this.renderEntry(entry)); }); } ngAfterViewInit(): void { document.body.classList.add('p3xr-no-main-scroll'); this.ngZone.runOutsideAngular(() => { this.resizeFn = () => this.recalcHeight(); window.addEventListener('resize', this.resizeFn); setTimeout(() => { this.recalcHeight(); const el = this.pubsubOutputRef?.nativeElement; if (el) el.scrollTop = el.scrollHeight; }, 50); }); } ngOnDestroy(): void { document.body.classList.remove('p3xr-no-main-scroll'); this.sub?.unsubscribe(); if (this.resizeFn) window.removeEventListener('resize', this.resizeFn); } async restartPubSub(): Promise { await this.data.restartPubSub(); } clearPubSub(): void { this.data.clearPubSub(); this.entryIndex = 0; if (this.pubsubOutputRef?.nativeElement) { this.pubsubOutputRef.nativeElement.innerHTML = ''; } } exportPubSub(): void { const connName = this.state.connection()?.name || 'redis'; const lines = this.data.pubsubEntries.map(e => `${e.fullTimestamp} ${e.channel} ${e.message}`); this.downloadText(lines.join('\n'), `${connName}-pubsub-export.txt`); } private renderExistingEntries(): void { const el = this.pubsubOutputRef?.nativeElement; if (!el) return; const entries = this.data.pubsubEntries; const start = Math.max(0, entries.length - this.maxDomEntries); this.entryIndex = start; for (let i = start; i < entries.length; i++) { this.renderEntry(entries[i]); } el.scrollTop = el.scrollHeight; } private renderEntry(entry: PubsubEntry): void { const el = this.pubsubOutputRef?.nativeElement; if (!el) return; const odd = this.entryIndex++ % 2 === 1 ? ' p3xr-pubsub-entry-odd' : ''; el.insertAdjacentHTML('beforeend', `
${this.escapeHtml(entry.displayTime)} ${this.escapeHtml(entry.channel)} ${this.escapeHtml(entry.message)}
`); while (el.children.length > this.maxDomEntries) { el.removeChild(el.firstChild!); } el.scrollTop = el.scrollHeight; } private recalcHeight(): void { const el = this.pubsubOutputRef?.nativeElement; if (!el) return; const rect = el.getBoundingClientRect(); const footerHeight = document.getElementById('p3xr-layout-footer-container')?.offsetHeight || 48; const available = window.innerHeight - rect.top - footerHeight - 8; el.style.height = Math.max(available, 100) + 'px'; } private escapeHtml(str: string): string { return str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } private downloadText(content: string, filename: string): void { const blob = new Blob([content], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } } src/ng/pages/search/000077500000000000000000000000001517650670600146325ustar00rootroot00000000000000src/ng/pages/search/search.component.html000066400000000000000000000231131517650670600207660ustar00rootroot00000000000000
@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 }} } @if (!isReadonly && selectedIndex) { }
{{ 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.scss000066400000000000000000000023101517650670600207710ustar00rootroot00000000000000: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.ts000066400000000000000000000236571517650670600204650ustar00rootroot00000000000000import { 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; aiLoading = false; // 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.loadIndexInfo(); } 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.searchDone = false; 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); this.newIndexFields = [...this.newIndexFields]; this.cdr.markForCheck(); } 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); } } async handleSearchEnter(): Promise { const q = (this.query || '').trim(); // Explicit ai: prefix if (/^ai:\s*/i.test(q)) { await this.handleAiQuery(q.replace(/^ai:\s*/i, '').trim()); return; } // Try normal search first try { await this.searchAndRefreshInfo(); } catch (e: any) { // If search failed and query looks like natural language, try AI if (q.length > 2 && q !== '*' && /\s/.test(q)) { p3xr.ui.overlay.show(); try { await this.handleAiQuery(q); } finally { p3xr.ui.overlay.hide(); } } } } private async handleAiQuery(prompt: string): Promise { if (!prompt) return; this.aiLoading = true; this.cdr.markForCheck(); try { let indexSchema: any = undefined; if (this.selectedIndex && this.indexInfo) { indexSchema = this.indexInfo; } const response = await this.socket.request({ action: 'ai-redis-query', payload: { prompt, context: { indexes: this.indexes, schema: indexSchema, }, }, }); this.query = response.command || '*'; if (response.explanation) { this.common.toast({ message: response.explanation }); } this.offset = 0; await this.searchAndRefreshInfo(); } catch (e: any) { this.common.generalHandleError(e); } finally { this.aiLoading = false; this.cdr.markForCheck(); } } getDocKeys(doc: any): string[] { return Object.keys(doc).filter(k => k !== '_key'); } } src/ng/pages/settings.component.ts000066400000000000000000001246551517650670600176130ustar00rootroot00000000000000import { 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 { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatDividerModule } from '@angular/material/divider'; 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 { TreecontrolSettingsDialogService } from '../dialogs/treecontrol-settings-dialog.service'; import { AiSettingsDialogService } from '../dialogs/ai-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, MatSlideToggleModule, 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) { } } }
}

@if (!readonlyConnections && !isGroqApiKeyReadonly()) { }
{{ strings().label?.aiEnabled || 'AI Enabled' }}
@if (isAiEnabled() && hasGroqApiKey()) {
{{ strings().label?.aiRouteViaNetwork || 'Route via network.corifeus.com' }}
{{ isUseOwnKey() ? (strings().label?.aiRoutingDirect || 'Queries go directly to Groq using your own API key, bypassing network.corifeus.com.') : (strings().label?.aiRoutingNetwork || 'AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.') }} @if (!isUseOwnKey()) { console.groq.com }
{{ strings().label?.aiGroqApiKey || 'Groq API Key' }}
{{ getGroqApiKeyDisplay() }}
}

{{ 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; 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(AiSettingsDialogService) private aiSettingsDialog: AiSettingsDialogService, @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.stateChanged$.subscribe(() => this.refreshState()); const sub4 = this.socket.redisStatus$.subscribe(() => this.refreshState()); this.unsubs.push(() => { sub1.unsubscribe(); sub2.unsubscribe(); sub3.unsubscribe(); sub4.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.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; } // --- AI Settings --- isAiEnabled(): boolean { return p3xr.state.cfg?.aiEnabled !== false; } async toggleAiEnabled(enabled: boolean): Promise { try { await this.socket.request({ action: 'set-groq-api-key', payload: { apiKey: p3xr.state.cfg?.groqApiKey || '', aiEnabled: enabled, }, }); p3xr.state.cfg.aiEnabled = enabled; this.cdr.markForCheck(); } catch (e) { this.common.generalHandleError(e); } } hasGroqApiKey(): boolean { const key = p3xr.state.cfg?.groqApiKey || ''; return key.startsWith('gsk_') && key.length > 20; } isUseOwnKey(): boolean { // Can only use own key if one is actually set return p3xr.state.cfg?.aiUseOwnKey === true && this.hasGroqApiKey(); } async toggleUseOwnKey(useOwn: boolean): Promise { // Can't use own key if no key is set if (useOwn && !this.hasGroqApiKey()) { return; } try { await this.socket.request({ action: 'set-groq-api-key', payload: { apiKey: p3xr.state.cfg?.groqApiKey || '', aiEnabled: p3xr.state.cfg?.aiEnabled !== false, aiUseOwnKey: useOwn, }, }); p3xr.state.cfg.aiUseOwnKey = useOwn; this.cdr.markForCheck(); } catch (e) { this.common.generalHandleError(e); } } isAiReadonly(): boolean { return this.readonlyConnections || p3xr.state.cfg?.groqApiKeyReadonly === true; } isGroqApiKeyReadonly(): boolean { return p3xr.state.cfg?.groqApiKeyReadonly === true; } async openAiSettings($event: any): Promise { await this.aiSettingsDialog.show(); this.cdr.markForCheck(); } getGroqApiKeyDisplay(): string { const key = p3xr.state.cfg?.groqApiKey || ''; if (!key) return this.strings().label?.aiGroqApiKeyNotSet || 'Not set'; if (key.length <= 8) return '****'; return `${key.slice(0, 4)}...${key.slice(-4)}`; } // --- Tree Settings --- openTreeSettings($event: any): void { this.treeSettingsDialog.show({ $event }); } } src/ng/pipes/000077500000000000000000000000001517650670600134065ustar00rootroot00000000000000src/ng/pipes/date.pipe.ts000066400000000000000000000026721517650670600156360ustar00rootroot00000000000000import { 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/000077500000000000000000000000001517650670600141115ustar00rootroot00000000000000src/ng/services/common.service.ts000066400000000000000000000217411517650670600174150ustar00rootroot00000000000000import { 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(); readonly treeExpandToLevel$ = 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.ts000066400000000000000000000126101517650670600166770ustar00rootroot00000000000000import { 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); // Notify Electron shell so language persists across restarts try { if (window.parent && window.parent !== window) { window.parent.postMessage({ type: 'p3x-ui-storage-set', key: I18nService.STORAGE_KEY, value: lang }, '*'); } } catch { /* not in iframe */ } // 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.ts000066400000000000000000000162371517650670600204710ustar00rootroot00000000000000import { 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.ts000066400000000000000000000040461517650670600202630ustar00rootroot00000000000000import { 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 * * 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; 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.ts000066400000000000000000000164241517650670600205270ustar00rootroot00000000000000import { 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 = 0; for (const child of node.children) { if (child.type === 'element') { const info = child.keysInfo; if (info && info.type !== 'string' && info.type !== 'json' && info.length != null) { node.childCount += info.length; } else { node.childCount += 1; } } } 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 (responseResult !== null && 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.ts000066400000000000000000000103721517650670600203470ustar00rootroot00000000000000import { 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); // --- 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); } /** * Resets connections to default state. */ resetConnections(): void { this.connections.set({ list: [] }); } } src/ng/services/settings.service.ts000066400000000000000000000104561517650670600177660ustar00rootroot00000000000000import { 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.ts000066400000000000000000000131751517650670600201650ustar00rootroot00000000000000import { 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.ts000066400000000000000000000173521517650670600174200ustar00rootroot00000000000000import { 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 connectErrorWas = false; private disconnected = false; readonly connections$ = new Subject(); readonly redisDisconnected$ = new Subject(); readonly redisStatus$ = new Subject(); readonly configuration$ = 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, reconnection: true, reconnectionAttempts: Infinity, reconnectionDelay: 1000, reconnectionDelayMax: 5000, }; if ((globalThis as any).p3xrDevMode === true) { ioOptions.transports = ['websocket']; } this.ioClient = io.connect(p3xr.api.host, ioOptions); this.ioClient.on('connect', async () => { if (this.disconnected || this.connectErrorWas) { console.log('p3xr-socket RE-connected', this.ioClient.id); this.disconnected = false; this.connectErrorWas = false; location.reload(); return; } if (this.reconnect) { console.log('p3xr-socket RE-connected', this.ioClient.id); } else { console.log('p3xr-socket connected', this.ioClient.id); } this.reconnect = true; }); this.ioClient.on('disconnect', () => { this.disconnected = true; try { p3xr.ui.overlay.show(); } catch {} }); 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(); }); } private handleSocketError(error: any): void { try { p3xr.ui.overlay.show(); } catch {} 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') { 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.ts000066400000000000000000000163501517650670600172270ustar00rootroot00000000000000import { 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.ts000066400000000000000000000237011517650670600205060ustar00rootroot00000000000000import { 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') { const info = node.children[i].keysInfo; if (info && info.type !== 'string' && info.type !== 'json' && info.length != null) { node.childCount += info.length; } else { 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 = 0; for (const child of node.children) { if (child.type === 'element') { const info = child.keysInfo; if (info && info.type !== 'string' && info.type !== 'json' && info.length != null) { node.childCount += info.length; } else { node.childCount += 1; } } } 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/000077500000000000000000000000001517650670600135535ustar00rootroot00000000000000src/ng/themes/_theme-custom.scss000066400000000000000000000375311517650670600172320ustar00rootroot00000000000000// 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.scss000066400000000000000000000133361517650670600202300ustar00rootroot00000000000000// 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.scss000066400000000000000000001451621517650670600211710ustar00rootroot00000000000000// 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 { color: var(--p3xr-toolbar-color) !important; } body.p3xr-mat-theme-matrix #p3xr-layout-header-version { 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 the connections list // 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-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-info .p3xr-settings-pair-row, p3xr-monitoring .p3xr-settings-pair-row, p3xr-memory-analysis .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-memory-analysis .p3xr-settings-pair-row, p3xr-search .p3xr-settings-pair-row { align-items: center; } p3xr-ng-settings .p3xr-settings-row-label, p3xr-info .p3xr-settings-row-label, p3xr-monitoring .p3xr-settings-row-label, p3xr-memory-analysis .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-info .p3xr-settings-row-value, p3xr-monitoring .p3xr-settings-row-value, p3xr-memory-analysis .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; } // ============================================================================ // 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/000077500000000000000000000000001517650670600133435ustar00rootroot00000000000000src/overlay/overlay.js000066400000000000000000000020641517650670600153640ustar00rootroot00000000000000let 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.scss000066400000000000000000000014611517650670600157230ustar00rootroot00000000000000#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/000077500000000000000000000000001517650670600131405ustar00rootroot00000000000000src/public/images/000077500000000000000000000000001517650670600144055ustar00rootroot00000000000000src/public/images/256x256.png000066400000000000000000000303271517650670600160610ustar00rootroot00000000000000PNG  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/000077500000000000000000000000001517650670600126355ustar00rootroot00000000000000src/scss/index.scss000066400000000000000000000140041517650670600146400ustar00rootroot00000000000000@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)); } body.p3xr-no-main-scroll { overflow: hidden; } // 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%; } @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.scss000066400000000000000000000001011517650670600144750ustar00rootroot00000000000000$toolbar-height: 48px; $layout-padding: 5px; $border-radius: 4px;src/strings/000077500000000000000000000000001517650670600133535ustar00rootroot00000000000000src/strings/ar/000077500000000000000000000000001517650670600137555ustar00rootroot00000000000000src/strings/ar/strings.js000066400000000000000000000773271517650670600160240ustar00rootroot00000000000000const strings = { error: { 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 هذه؟", delete: "حذف؟", deleteAllKeys: opts => { return `احذف هذه الشجرة وكل مفاتيحها (${opts.key})؟`; }, deleteSearchKeys: opts => { return `هل أنت متأكد من حذف جميع المفاتيح المطابقة لـ "${opts.pattern}"؟ تم العثور على ${opts.count} مفتاح.`; }, 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" }, }, 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} نتيجة`, deleteAllKeysMenu: (opts) => `حذف جميع ${opts.count}`, importKeys: "استيراد المفاتيح", deleteSearchKeys: (opts) => `حذف ${opts.count} مفتاح مطابق`, saveWithFormatJson: "حفظ مع التنسيق", formatJson: "تنسيق جيسون", wrap: "التفاف", unwrap: "بسط", downloadJson: "تحميل JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", delete: "حذف", remove: "إزالة", sure: "بالتأكيد", testConnection: "اتصال الاختبار", getKey: "جارٍ تحميل مفتاح Redis والبيانات المرتبطة به ...", jsonViewShow: "عرض JSON", jsonViewEditor: "تحرير JSON", quickConsole: "وحدة التحكم السريعة", }, label: { id: { nodeId: "معرف العقدة", id: "معرف الاتصال", info: "إذا كنت لا ترغب في تغيير خصائص: sshPassword، وsshPrivateKey، وpassword، وtlsCrt، وtlsKey، وtlsCa، فيرجى إدخال معرف الاتصال في تلك الخصائص للحفاظ على قيم الخاصية سليمة. إذا كنت تريد نفس المنطق في كلمة مرور العقدة، فأدخل معرف العقدة في كلمة مرور العقدة." }, secureFeature: "إذا رأيت قيمة تبدأ بـ P3X بنفس الشكل، فهذه ميزة آمنة. لتغيير الإعدادات، ما عليك سوى استبدال هذه الإعدادات بفارغة أو أي شيء آخر وسيتم حفظها. إذا لم تقم بتغيير الإعدادات، فسيتم الاحتفاظ بالإعدادات كما هي على الخادم.", aiTranslating: "جاري الترجمة...", aiSettings: "إعدادات AI", aiGroqApiKey: "مفتاح API Groq", aiGroqApiKeyInfo: "اختياري. مفتاح API Groq خاص بك لأداء أفضل. احصل على مفتاح مجاني من", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "تم حفظ مفتاح API AI", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "غير محدد (الافتراضي للخادم)", aiEnabled: "AI مفعّل", aiEnabledYes: "نعم", aiEnabledNo: "لا", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "اتصالات", keysSort: { on: "تشغيل فرز المفاتيح", off: "فرز المفاتيح" }, cluster: { on: "Cluster على", off: "إيقاف تشغيل Cluster" }, sentinel: { on: "Sentinel على", off: "إيقاف تشغيل Sentinel", name: "اسم Sentinel" }, readonly: { on: "تشغيل للقراءة فقط", off: "إيقاف للقراءة فقط" }, 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: "الوقت", type: "النوع", format: "التنسيق", loading: "جارٍ التحميل...", autoRefresh: "تلقائي", exportSearchHint: "تصدير المفاتيح المطابقة للبحث الحالي فقط", importSearchHint: "الاستيراد يطبق على قاعدة البيانات بالكامل وليس نتائج البحث فقط", deleteSearchHint: "يحذف جميع المفاتيح المطابقة للبحث الحالي على الخادم", deletingSearchKeys: "جارٍ حذف المفاتيح المطابقة...", importNoKeys: "لم يتم العثور على مفاتيح في الملف", }, status: { dataCopied: "البيانات موجودة في الحافظة", exportDone: "اكتمل التصدير", deletedSearchKeys: (opts) => `تم حذف ${opts.count} مفتاح`, 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": "فهرس القائمة هذا خارج الحدود", "invalid-json-value": "القيمة غير صالحة JSON.", "http_auth_required": "التفويض مطلوب: يرجى المصادقة باستخدام HTTP Basic Auth وإعادة التحميل.", "auto-connection-failed": "ممكن تم حذف الاتصال وفشل الاتصال التلقائي لهذا السبب.", invalid_console_command: "هذا الأمر لا يعمل عبر GUI." }, 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: "لا توجد مفاتيح", rss: "RSS", peak: "الذروة", fragmentation: "التجزئة", hitsAndMisses: "الإصابات / الأخطاء", noClients: "لا يوجد عملاء", }, analysis: { title: "تحليل الذاكرة", runAnalysis: "تشغيل التحليل", running: "جارٍ التحليل...", typeDistribution: "توزيع الأنواع", prefixMemory: "الذاكرة حسب البادئة", topKeysByMemory: "أكبر المفاتيح حسب الذاكرة", expirationOverview: "انتهاء صلاحية المفاتيح", memoryBreakdown: "تفصيل الذاكرة", keysScanned: "المفاتيح الممسوحة", totalMemory: "إجمالي الذاكرة", rssMemory: "ذاكرة RSS", peakMemory: "ذروة الذاكرة", luaMemory: "ذاكرة Lua", overheadMemory: "الحِمل الزائد", datasetMemory: "مجموعة البيانات", fragmentation: "التجزئة", allocator: "المُخصِّص", withTTL: "مع TTL", persistent: "دائم", avgTTL: "متوسط TTL", prefix: "البادئة", keyCount: "عدد المفاتيح", memoryUsage: "استخدام الذاكرة", noPrefix: "(بدون بادئة)", topN: "Top N", maxScanKeys: "الحد الأقصى لمسح المفاتيح", type: "النوع", noData: "لا توجد بيانات. انقر على تشغيل التحليل للبدء.", exportAll: "تصدير الكل", }, 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: "القيمة" } }, timeseries: { chart: "مخطط", info: "معلومات", addPoint: "إضافة نقطة بيانات", from: "من (ms أو -)", to: "إلى (ms أو +)", aggregation: "تجميع", timeBucket: "دلو (ms)", none: "لا شيء", dataPoints: "نقاط البيانات", labels: "التسميات", rules: "القواعد", retention: "الاحتفاظ", timestamp: "الطابع الزمني", value: "القيمة", retentionHint: "0 = بدون انتهاء صلاحية، أو بالمللي ثانية", duplicatePolicy: "سياسة التكرار", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' يعني توليد تلقائي، أو طابع زمني بالمللي ثانية", editAllHint: "نقطة بيانات واحدة لكل سطر: طابع_زمني قيمة (الطابع الزمني يمكن أن يكون * للتوليد التلقائي)", autoSpread: "فاصل الانتشار التلقائي *", formula: "صيغة", formulaLinear: "خطي", formulaRandom: "عشوائي", formulaSawtooth: "سن المنشار", formulaPoints: "النقاط", formulaAmplitude: "السعة", formulaOffset: "الإزاحة", generate: "توليد", exportChart: "تصدير PNG", overlay: "تراكب المفاتيح", overlayHint: "مفاتيح مفصولة بفاصلة", mrangeFilter: "فلتر التسميات", bulkMode: "إنشاء مجمع", mrangeHint: "مثال sensor=temp" } }, treeControls: { settings: "إعدادات الشجرة", expandAll: "قم بتوسيع الكل", collapseAll: "طي الكل", level: "المستوى", search: { search: "ابحث في المفاتيح", clear: "مسح البحث الحالي لتعيينه فارغا", placeholderClient: "البحث من جانب العميل", placeholderServer: "بحث جانب الخادم", info: "يعني البحث من جانب العميل أنه يطابق النص الموجود في إدخال البحث. يعني البحث من جانب الخادم أنه يشبه البحث في أنماط المفاتيح مثل *{search-text}*. بالنسبة لمجموعات البحث الكبيرة، من الأفضل استخدام البحث من جانب الخادم. بالنسبة لمجموعات البحث الأصغر، فمن الأفضل استخدام وضع البحث من جانب العميل." + ` إذا انتهى عدد المفاتيح ${p3xr.settings.maxLightKeysCount}، يمكنك البحث فقط على جانب الخادم.`, largeSetInfo: "في مجموعة كبيرة، يتم تعطيل البحث من جانب العميل. لذا، في الوقت الحالي، أصبح البحث من جانب الخادم فقط ممكنًا.", infoDetails: "لمعرفة كيفية عمل البحث، يرجى مراجعة الإعدادات" }, pager: { next: "التالي", prev: "السابق", first: "أولا", last: "الاخير" } } }, time: { type: "النوع", format: "التنسيق", loading: "جارٍ التحميل...", years: "سنوات", months: "أشهر", days: "أيام", year: "سنة", month: "شهر", day: "يوم", second: "ثانية", seconds: "ثوانٍ", minute: "دقيقة", minutes: "دقائق", hour: "ساعة", hours: "ساعات" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/az/000077500000000000000000000000001517650670600137655ustar00rootroot00000000000000src/strings/az/strings.js000066400000000000000000000663721517650670600160320ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Silinsin?", deleteAllKeys: opts => { return `Bu ağacı və onun bütün açarlarını silin (${opts.key})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" ilə uyğun gələn bütün açarları silmək istədiyinizə əminsiniz? ${opts.count} açar tapıldı.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Hamısını sil ${opts.count}`, importKeys: "Açarları idxal et", deleteSearchKeys: (opts) => `${opts.count} uyğun açarı sil`, saveWithFormatJson: "Formatla yadda saxlayın", formatJson: "Json formatı", wrap: "Sarın", unwrap: "Açın", downloadJson: "JSON yükləyin", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Translating...", aiSettings: "AI Parametrlər", aiGroqApiKey: "Groq API açarı", aiGroqApiKeyInfo: "İstəyə bağlı. Daha yaxşı performans üçün öz Groq API açarınız. Pulsuz açar əldə edin", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API açarı saxlanıldı", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Təyin edilməyib (server standartı)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Növ", format: "Format", 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", deleteSearchHint: "Serverdəki cari axtarışa uyğun bütün açarları silir", deletingSearchKeys: "Uyğun açarlar silinir...", importNoKeys: "Faylda açar tapılmadı", }, status: { dataCopied: "Məlumat mübadilə buferindədir", exportDone: "İxrac tamamlandı", deletedSearchKeys: (opts) => `${opts.count} açar silindi`, 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", "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." }, 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", rss: "RSS", peak: "Pik", fragmentation: "Fraqmentasiya", hitsAndMisses: "Uğurlu / Uğursuz", noClients: "Müştəri yoxdur", }, analysis: { title: "Yaddaş Analizi", runAnalysis: "Analizi Başlat", running: "Analiz edilir...", typeDistribution: "Tip Paylanması", prefixMemory: "Prefiksə görə Yaddaş", topKeysByMemory: "Yaddaşa görə Ən Böyük Açarlar", expirationOverview: "Açar Müddəti", memoryBreakdown: "Yaddaş Bölgüsü", keysScanned: "Skan Edilən Açarlar", totalMemory: "Ümumi Yaddaş", rssMemory: "RSS Yaddaş", peakMemory: "Pik Yaddaş", luaMemory: "Lua Yaddaş", overheadMemory: "Əlavə Yük", datasetMemory: "Verilənlər Dəsti", fragmentation: "Fraqmentasiya", allocator: "Ayırıcı", withTTL: "TTL ilə", persistent: "Daimi", avgTTL: "Orta TTL", prefix: "Prefiks", keyCount: "Açar Sayı", memoryUsage: "Yaddaş İstifadəsi", noPrefix: "(prefiks yoxdur)", topN: "Top N", maxScanKeys: "Maks Skan Açarları", type: "Tip", noData: "Verilən yoxdur. Başlamaq üçün Analizi Başlat düyməsinə klikləyin.", exportAll: "Hamısını İxrac Et", }, 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" } }, timeseries: { chart: "Diaqram", info: "Məlumat", addPoint: "Məlumat Nöqtəsi Əlavə Et", from: "Başlanğıc (ms və ya -)", to: "Son (ms və ya +)", aggregation: "Aqreqasiya", timeBucket: "Vedrə (ms)", none: "Heç biri", dataPoints: "məlumat nöqtələri", labels: "Etiketlər", rules: "Qaydalar", retention: "Saxlama", timestamp: "Vaxt möhürü", value: "Dəyər", retentionHint: "0 = müddətsiz, və ya millisaniyə", duplicatePolicy: "Dublikat siyasəti", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' avtomatik yaradılma deməkdir, və ya millisaniyə vaxt möhürü", editAllHint: "Hər sətirdə bir məlumat nöqtəsi: vaxt_möhürü dəyər (vaxt möhürü avtomatik üçün * ola bilər)", autoSpread: "Avtomatik * yayılma intervalı", formula: "Formula", formulaLinear: "Xətti", formulaRandom: "Təsadüfi", formulaSawtooth: "Mişar dişi", formulaPoints: "Nöqtələr", formulaAmplitude: "Amplituda", formulaOffset: "Ofset", generate: "Yarat", exportChart: "PNG ixrac et", overlay: "Üst-üstə düşən açarlar", overlayHint: "Vergüllə ayrılmış açarlar", mrangeFilter: "Etiket filtri", bulkMode: "Toplu yaratma", mrangeHint: "məs. sensor=temp" } }, treeControls: { settings: "Ağac parametrləri", expandAll: "Hamısını genişləndirin", collapseAll: "Hamısını yığışdırın", level: "Səviyyə", 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: { type: "Növ", format: "Format", loading: "Yüklənir...", years: "illər", months: "ay", days: "günlər", year: "il", month: "ay", day: "gün", second: "saniyə", seconds: "saniyə", minute: "dəqiqə", minutes: "dəqiqə", hour: "saat", hours: "saat" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/be/000077500000000000000000000000001517650670600137415ustar00rootroot00000000000000src/strings/be/strings.js000066400000000000000000001054021517650670600157720ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Выдаліць?", deleteAllKeys: opts => { return `Выдаліць гэта дрэва і ўсе яго ключы (${opts.key})?`; }, deleteSearchKeys: opts => { return `Вы ўпэўнены, што хочаце выдаліць усе ключы, якія адпавядаюць "${opts.pattern}"? Знойдзена ${opts.count} ключоў.`; }, 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" }, }, 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} вынікаў`, deleteAllKeysMenu: (opts) => `Выдаліць усе ${opts.count}`, importKeys: "Імпарт ключоў", deleteSearchKeys: (opts) => `Выдаліць ${opts.count} адпаведных ключоў`, saveWithFormatJson: "Захаваць у фармаце", formatJson: "Фармат Json", wrap: "Абгарнуць", unwrap: "Разгарнуць", downloadJson: "Спампаваць JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", delete: "Выдаліць", remove: "Выдаліць", sure: "Вядома", testConnection: "Тэставае злучэнне", getKey: "Загрузка ключа Redis і звязаных з ім даных...", jsonViewShow: "Дысплей JSON", jsonViewEditor: "Рэдагаваць JSON", quickConsole: "Хуткая кансоль", }, label: { id: { nodeId: "Ідэнтыфікатар вузла", id: "Ідэнтыфікатар злучэння", info: "Калі вы не хочаце змяняць уласцівасці: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, увядзіце ідэнтыфікатар злучэння ў гэтыя ўласцівасці, каб захаваць значэнні ўласцівасцей. Калі вы хочаце такую ​​ж логіку ў паролі вузла, увядзіце ідэнтыфікатар вузла ў паролі вузла." }, secureFeature: "Калі вы бачыце значэнне, якое пачынаецца з P3X і выглядае аднолькава, гэта бяспечная функцыя. Каб змяніць налады, проста заменіце гэтыя налады пустымі або іншымі, і яны будуць захаваны. Калі вы не зменіце налады, налады будуць захаваны ў тым выглядзе, у якім яны ёсць на серверы.", aiTranslating: "Translating...", aiSettings: "Налады ШІ", aiGroqApiKey: "Ключ API Groq", aiGroqApiKeyInfo: "Неабавязкова. Уласны ключ API Groq для лепшай прадукцыйнасці. Атрымайце бясплатны ключ на", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Ключ API ШІ захаваны", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Не ўстаноўлена (па змаўчанні сервера)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Сувязі", keysSort: { on: "Сартаванне ключоў уключана", off: "Сартаванне ключоў выключана" }, cluster: { on: "Cluster укл", off: "Cluster выключаны" }, sentinel: { on: "Sentinel укл", off: "Sentinel выключаны", name: "Назва Sentinel" }, readonly: { on: "Толькі для чытання ўключана", off: "Толькі чытанне выключана" }, 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: "Час", type: "Тып", format: "Фармат", loading: "Загрузка...", autoRefresh: "Аўта", exportSearchHint: "Экспартуюцца толькі ключы, якія адпавядаюць бягучаму пошуку", importSearchHint: "Імпарт прымяняецца да ўсёй базы дадзеных, а не толькі да вынікаў пошуку", deleteSearchHint: "Выдаляе ўсе ключы, якія адпавядаюць бягучаму пошуку на серверы", deletingSearchKeys: "Выдаленне адпаведных ключоў...", importNoKeys: "Ключы ў файле не знойдзены", }, status: { dataCopied: "Дадзеныя знаходзяцца ў буферы абмену", exportDone: "Экспарт завершаны", deletedSearchKeys: (opts) => `Выдалена ${opts.count} ключоў`, 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": "Гэты індэкс спісу па-за межамі", "invalid-json-value": "Значэнне несапраўднае JSON.", "http_auth_required": "Патрабуецца аўтарызацыя: прайдзіце аўтэнтыфікацыю з дапамогай HTTP Basic Auth і перазагрузіце.", "auto-connection-failed": "Магчыма, з-за гэтага злучэнне было выдалена і аўтаматычнае злучэнне не атрымалася.", invalid_console_command: "Гэтая каманда не працуе праз GUI." }, 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: "Няма ключоў", rss: "RSS", peak: "Пік", fragmentation: "Фрагментацыя", hitsAndMisses: "Трапленні / Промахі", noClients: "Няма кліентаў", }, analysis: { title: "Аналіз памяці", runAnalysis: "Запусціць аналіз", running: "Аналізуецца...", typeDistribution: "Размеркаванне тыпаў", prefixMemory: "Памяць па прэфіксу", topKeysByMemory: "Найбуйнейшыя ключы па памяці", expirationOverview: "Тэрмін дзеяння ключоў", memoryBreakdown: "Разбіўка памяці", keysScanned: "Прасканіравана ключоў", totalMemory: "Агульная памяць", rssMemory: "RSS памяць", peakMemory: "Пікавая памяць", luaMemory: "Lua памяць", overheadMemory: "Накладныя выдаткі", datasetMemory: "Набор даных", fragmentation: "Фрагментацыя", allocator: "Алакатар", withTTL: "З TTL", persistent: "Пастаянныя", avgTTL: "Сярэдні TTL", prefix: "Прэфікс", keyCount: "Колькасць ключоў", memoryUsage: "Выкарыстанне памяці", noPrefix: "(без прэфікса)", topN: "Top N", maxScanKeys: "Макс. сканіраванне ключоў", type: "Тып", noData: "Няма даных. Націсніце Запусціць аналіз, каб пачаць.", exportAll: "Экспарт усяго", }, 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: "Каштоўнасць" } }, timeseries: { chart: "Графік", info: "Інфармацыя", addPoint: "Дадаць кропку даных", from: "Ад (ms або -)", to: "Да (ms або +)", aggregation: "Агрэгацыя", timeBucket: "Вядро (ms)", none: "Няма", dataPoints: "кропкі даных", labels: "Пазнакі", rules: "Правілы", retention: "Захаванне", timestamp: "Пазнака часу", value: "Значэнне", retentionHint: "0 = без тэрміну, або мілісекунды", duplicatePolicy: "Палітыка дублікатаў", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' азначае аўтаматычную генерацыю, або мілісекундная пазнака часу", editAllHint: "Адна кропка даных на радок: пазнака_часу значэнне (пазнака часу можа быць * для аўтаматычнай)", autoSpread: "Аўтаматычны інтэрвал размеркавання *", formula: "Формула", formulaLinear: "Лінейная", formulaRandom: "Выпадковая", formulaSawtooth: "Піла", formulaPoints: "Кропкі", formulaAmplitude: "Амплітуда", formulaOffset: "Зрушэнне", generate: "Генераваць", exportChart: "Экспарт PNG", overlay: "Накладанне ключоў", overlayHint: "Ключы праз коску", mrangeFilter: "Фільтр пазнак", bulkMode: "Масавая генерацыя", mrangeHint: "напр. sensor=temp" } }, treeControls: { settings: "Налады дрэва", expandAll: "Разгарнуць усе", collapseAll: "Згарнуць усё", level: "Узровень", search: { search: "Пошук па ключах", clear: "Ачысціць бягучы пошук, каб зрабіць пустым", placeholderClient: "Пошук на баку кліента", placeholderServer: "Пошук на баку сервера", info: "Пошук на баку кліента азначае, што ён адпа��ядае тэксту ўводу пошуку. Пошук на баку сервера азначае, што ён падобны да пошуку ў шаблонах ключоў *{search-text}*. Для вялікіх пошукавых набораў лепш выкарыстоўваць пошук на серверы. Для меншых набораў пошуку лепш выкарыстоўваць рэжым пошуку на баку кліента." + ` Калі падлік ключоў скончыўся ${p3xr.settings.maxLightKeysCount}, вы можаце шукаць толькі на баку сервера.`, largeSetInfo: "У вялікім наборы пошук на баку кліента адключаны. таму зараз магчымы толькі пошук на серверы.", infoDetails: "Каб даведацца, як працуе пошук, праверце налады" }, pager: { next: "Далей", prev: "Папярэдні", first: "Першы", last: "Апошні" } } }, time: { type: "Тып", format: "Фармат", loading: "Загрузка...", years: "гадоў", months: "месяцаў", days: "дзён", year: "год", month: "месяц", day: "дзень", second: "секунда", seconds: "секунды", minute: "хвіліна", minutes: "хвіліны", hour: "гадзіна", hours: "гадзіны" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/bg/000077500000000000000000000000001517650670600137435ustar00rootroot00000000000000src/strings/bg/strings.js000066400000000000000000001065471517650670600160070ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Сигурни ли сте, че искате да изтриете всички ключове, съответстващи на "${opts.pattern}"? Намерени ${opts.count} ключа.`; }, socketioConnectError: "Socket.IO не може да се свърже със сървъра, можете да презаредите и да опитате да разрешите грешката при свързването сами, клиентът не знае как да я разреши сам.", socketioAuthRequired: "Необходима е оторизация чрез Socket.IO. Моля, удостоверете се с HTTP Basic Auth (потребителско име/парола) и презаредете.", delete: "Изтриване?", deleteKey: "Сигурни ли сте, че искате да изтриете този ключ?", rename: { title: "Сигурни ли сте, че искате да преименувате този ключ?", textContent: "Това действие преименува ключа окончателно.", placeholder: "Redis ключ (задължителен)" }, ttl: { title: "Сигурни ли сте, че искате да промените TTL на този ключ?", textContent: "Промяната на TTL обновява времето за живот на този ключ. Оставете празно, за да запазите ключа завинаги.", placeholder: "TTL на Redis ключа (цяло число или празно)", placeholderPlaceholder: "Празно означава, че се запазва завинаги; в противен случай въведете цяло число.", convertTextToTime: "Преобразуване на текст във време", convertTextToTimePlaceholder: "Напр. 1d ще бъде 86400" }, }, 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} резултата`, deleteAllKeysMenu: (opts) => `Изтрий всички ${opts.count}`, importKeys: "Импортиране на ключове", deleteSearchKeys: (opts) => `Изтриване на ${opts.count} съвпадащи ключа`, saveWithFormatJson: "Запази с форматиране", formatJson: "Форматирай Json", wrap: "Обвиване", unwrap: "Развиване", downloadJson: "Изтегли JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 и изглежда еднаква, това е защитна функция. За да промените настройките, просто заменете тези настройки с празни или нещо друго и те ще бъдат запазени. Ако не промените настройките, те ще бъдат запазени така, както са на сървъра.', aiTranslating: "Превод...", aiSettings: "AI Настройки", aiGroqApiKey: "Groq API ключ", aiGroqApiKeyInfo: "По избор. Собствен Groq API ключ за по-добра производителност. Получете безплатен ключ от", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API ключът е запазен", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Не е зададен (по подразбиране на сървъра)", aiEnabled: "AI активирано", aiEnabledYes: "Да", aiEnabledNo: "Не", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Връзки", keysSort: { on: "Сортиране на ключове включено", off: "Сортиране на ключове изключено" }, cluster: { on: "Клъстер включен", off: "Клъстер изключен" }, sentinel: { on: "Sentinel включен", off: "Sentinel изключен", name: "Sentinel име" }, readonly: { on: "Readonly включен", off: "Readonly изключен" }, 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: "Време", type: "Тип", format: "Формат", loading: "Зареждане...", autoRefresh: "Авто", exportSearchHint: "Експортиране само на ключове, съвпадащи с текущото търсене", importSearchHint: "Импортът се прилага към цялата база данни, не само към резултатите от търсенето", deleteSearchHint: "Изтрива всички ключове, съответстващи на текущото търсене на сървъра", deletingSearchKeys: "Изтриване на съвпадащи ключове...", importNoKeys: "Не са намерени ключове във файла", }, status: { dataCopied: "Данните са в клипборда", exportDone: "Експортът е завършен", deletedSearchKeys: (opts) => `Изтрити ${opts.count} ключа`, 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": "Индексът на списъка е извън обхвата", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Необходима е оторизация: моля, удостоверете се с HTTP Basic Auth и презаредете.", "auto-connection-failed": "Възможно е връзката да е била премахната и автоматичното свързване е неуспешно поради това.", invalid_console_command: "Тази команда не работи чрез GUI." }, 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: "Няма ключове", rss: "RSS", peak: "Пик", fragmentation: "Фрагментация", hitsAndMisses: "Попадения / Пропуски", noClients: "Няма клиенти", }, analysis: { title: "Анализ на паметта", runAnalysis: "Стартирай анализ", running: "Анализиране...", typeDistribution: "Разпределение по типове", prefixMemory: "Памет по префикс", topKeysByMemory: "Най-големи ключове по памет", expirationOverview: "Изтичане на ключове", memoryBreakdown: "Разбивка на паметта", keysScanned: "Сканирани ключове", totalMemory: "Обща памет", rssMemory: "RSS памет", peakMemory: "Пикова памет", luaMemory: "Lua памет", overheadMemory: "Допълнителни разходи", datasetMemory: "Набор данни", fragmentation: "Фрагментация", allocator: "Алокатор", withTTL: "С TTL", persistent: "Постоянни", avgTTL: "Среден TTL", prefix: "Префикс", keyCount: "Брой ключове", memoryUsage: "Използване на памет", noPrefix: "(без префикс)", topN: "Top N", maxScanKeys: "Макс. сканирани ключове", type: "Тип", noData: "Няма данни. Кликнете Стартирай анализ, за да започнете.", exportAll: "Експорт на всичко", }, 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: "Стойност" } }, timeseries: { chart: "Графика", info: "Информация", addPoint: "Добавяне на точка от данни", from: "От (мс или -)", to: "До (мс или +)", aggregation: "Агрегация", timeBucket: "Интервал (мс)", none: "Няма", dataPoints: "точки от данни", labels: "Етикети", rules: "Правила", retention: "Задържане", timestamp: "Времева марка", value: "Стойност", retentionHint: "0 = без изтичане, или милисекунди", duplicatePolicy: "Политика за дубликати", labelsHint: "ключ1 стойност1 ключ2 стойност2", timestampHint: "'*' означава автоматично генериране, или времева марка в милисекунди", editAllHint: "Една точка от данни на ред: времева_марка стойност (времева_марка може да е * за авто)", autoSpread: "Автоматичен интервал на разпределение *", formula: "Формула", formulaLinear: "Линейна", formulaRandom: "Случайна", formulaSawtooth: "Трионовидна", formulaPoints: "Точки", formulaAmplitude: "Амплитуда", formulaOffset: "Отместване", generate: "Генериране", exportChart: "Експорт PNG", overlay: "Наслагване на ключове", overlayHint: "Ключове, разделени със запетая", mrangeFilter: "Филтър по етикети", bulkMode: "Масово генериране", mrangeHint: "напр. sensor=temp" } }, treeControls: { settings: "Настройки на дървото", expandAll: "Разгъни всичко", collapseAll: "Свий всичко", level: "Ниво", search: { search: "Търсене в ключовете", clear: "Изчисти текущото търсене", placeholderClient: "Търсене от страната на клиента", placeholderServer: "Търсене от страната на сървъра", info: "Търсенето от страната на клиента означава, че съвпада текстът във входното поле за търсене. Търсенето от страната на сървъра означава, че се търси в шаблоните на ключовете като *{текст-за-търсене}*. За големи набори от данни е по-добре да се използва търсене от страната на сървъра. За по-малки набори от данни е по-добре да се използва режим на търсене от страната на клиента." + ` Ако броят на ключовете е над ${p3xr.settings.maxLightKeysCount}, можете да търсите само от страната на сървъра.`, largeSetInfo: "При голям набор от данни търсенето от страната на клиента е деактивирано, така че в момента е възможно само търсене от страната на сървъра.", infoDetails: "За да разберете как работи търсенето, моля проверете настройките" }, pager: { next: "Следващ", prev: "Предишен", first: "Първи", last: "Последен" } } }, time: { type: "Тип", format: "Формат", loading: "Зареждане...", years: "години", months: "месеци", days: "дни", year: "година", month: "месец", day: "ден", second: "секунда", seconds: "секунди", minute: "минута", minutes: "минути", hour: "час", hours: "часа" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/bn/000077500000000000000000000000001517650670600137525ustar00rootroot00000000000000src/strings/bn/strings.js000066400000000000000000001236201517650670600160050ustar00rootroot00000000000000const strings = { error: { 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 নোড মুছে ফেলার বিষয়ে নিশ্চিত?", delete: "মুছে ফেলবেন?", deleteAllKeys: opts => { return `এই গাছ এবং এর সমস্ত কীগুলি মুছুন (${opts.key})?`; }, deleteSearchKeys: opts => { return `আপনি কি "${opts.pattern}" এর সাথে মিলে যাওয়া সমস্ত কী মুছে ফেলতে চান? ${opts.count} টি কী পাওয়া গেছে।`; }, 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" }, }, 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} ফলাফল রপ্তানি করুন`, deleteAllKeysMenu: (opts) => `সব মুছুন ${opts.count}`, importKeys: "কী আমদানি করুন", deleteSearchKeys: (opts) => `${opts.count} টি মিলে যাওয়া কী মুছুন`, saveWithFormatJson: "বিন্যাস সঙ্গে সংরক্ষণ করুন", formatJson: "ফরম্যাট Json", wrap: "মোড়ানো", unwrap: "মোড়ক খুলুন", downloadJson: "JSON ডাউনলোড করুন", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 সেট করুন", delete: "মুছে দিন", remove: "সরান", sure: "নিশ্চিত", testConnection: "পরীক্ষা সংযোগ", getKey: "Redis কী এবং সংশ্লিষ্ট ডেটা লোড হচ্ছে...", jsonViewShow: "JSON প্রদর্শন করুন", jsonViewEditor: "JSON সম্পাদনা করুন", quickConsole: "দ্রুত কনসোল", }, label: { id: { nodeId: "নোড আইডি", id: "সংযোগ আইডি", info: "আপনি যদি এর বৈশিষ্ট্যগুলি পরিবর্তন করতে না চান: sshPassword, sshPrivateKey, পাসওয়ার্ড, tlsCrt, tlsKey, tlsCa, অনুগ্রহ করে সম্পত্তির মানগুলি অক্ষুণ্ণ রাখতে সেই বৈশিষ্ট্যগুলিতে সংযোগের আইডি লিখুন৷ আপনি যদি নোড পাসওয়ার্ডে একই যুক্তি চান তবে নোড পাসওয়ার্ডে নোড আইডি দিন।" }, secureFeature: "আপনি যদি P3X দিয়ে শুরু হয় এমন একটি মান দেখতে দেখতে একই রকম দেখতে পান তবে এটি একটি সুরক্ষিত বৈশিষ্ট্য। সেটিংস পরিবর্তন করতে, এই সেটিংসগুলিকে খালি বা অন্য কিছু দিয়ে প্রতিস্থাপন করুন এবং সেগুলি সংরক্ষণ করা হবে। আপনি যদি সেটিংস পরিবর্তন না করেন তবে সেটিংস সার্ভারে যেমন আছে তেমনই রাখা হবে।", aiTranslating: "Translating...", aiSettings: "AI সেটিংস", aiGroqApiKey: "Groq API কী", aiGroqApiKeyInfo: "ঐচ্ছিক। ভালো পারফরম্যান্সের জন্য নিজের Groq API কী। বিনামূল্যে কী পান", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API কী সংরক্ষিত", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "সেট করা হয়নি (সার্ভার ডিফল্ট)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "সংযোগ", keysSort: { on: "কি বাছাই উপর", off: "কী বাছাই বন্ধ" }, cluster: { on: "Cluster চালু", off: "Cluster বন্ধ" }, sentinel: { on: "Sentinel চালু", off: "Sentinel বন্ধ", name: "Sentinel নাম" }, readonly: { on: "শুধুমাত্র পঠনযোগ্য", off: "শুধুমাত্র পঠন বন্ধ" }, 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: "সময়", type: "ধরন", format: "ফরম্যাট", loading: "লোড হচ্ছে...", autoRefresh: "স্বয়ংক্রিয়", exportSearchHint: "শুধুমাত্র বর্তমান অনুসন্ধানের সাথে মিলে যাওয়া কী রপ্তানি হচ্ছে", importSearchHint: "আমদানি সম্পূর্ণ ডাটাবেসে প্রযোজ্য, শুধু অনুসন্ধান ফলাফলে নয়", deleteSearchHint: "সার্ভারে বর্তমান অনুসন্ধানের সাথে মিলে যাওয়া সমস্ত কী মুছে ফেলে", deletingSearchKeys: "মিলে যাওয়া কী মুছে ফেলা হচ্ছে...", importNoKeys: "ফাইলে কোনো কী পাওয়া যায়নি", }, status: { dataCopied: "ডেটা ক্লিপবোর্ডে রয়েছে", exportDone: "রপ্তানি সম্পন্ন", deletedSearchKeys: (opts) => `${opts.count} টি কী মুছে ফেলা হয়েছে`, 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": "এই তালিকা সূচক সীমার বাইরে", "invalid-json-value": "মানটি বৈধ নয় JSON৷", "http_auth_required": "অনুমোদন প্রয়োজন: অনুগ্রহ করে HTTP Basic Auth দিয়ে প্রমাণীকরণ করুন এ��ং পুনরায় লোড করুন।", "auto-connection-failed": "সম্ভব, সংযোগ সরানো হয়েছে এবং স্বয়ংক্রিয় সংযোগ ব্যর্থ হয়েছে, এই কারণে।", invalid_console_command: "এই কমান্ডটি GUI এর মাধ্যমে কাজ করছে না।" }, 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: "কোনো কী নেই", rss: "RSS", peak: "সর্বোচ্চ", fragmentation: "ফ্র্যাগমেন্টেশন", hitsAndMisses: "হিট / মিস", noClients: "কোনো ক্লায়েন্ট নেই", }, analysis: { title: "মেমোরি বিশ্লেষণ", runAnalysis: "বিশ্লেষণ চালান", running: "বিশ্লেষণ হচ্ছে...", typeDistribution: "টাইপ বিতরণ", prefixMemory: "প্রিফিক্স অনুযায়ী মেমোরি", topKeysByMemory: "মেমোরি অনুযায়ী শীর্ষ কী", expirationOverview: "কী মেয়াদোত্তীর্ণ", memoryBreakdown: "মেমোরি বিভাজন", keysScanned: "স্ক্যান করা কী", totalMemory: "মোট মেমোরি", rssMemory: "RSS মেমোরি", peakMemory: "সর্বোচ্চ মেমোরি", luaMemory: "Lua মেমোরি", overheadMemory: "ওভারহেড", datasetMemory: "ডেটাসেট", fragmentation: "ফ্র্যাগমেন্টেশন", allocator: "অ্যালোকেটর", withTTL: "TTL সহ", persistent: "স্থায়ী", avgTTL: "গড় TTL", prefix: "প্রিফিক্স", keyCount: "কী সংখ্যা", memoryUsage: "মেমোরি ব্যবহার", noPrefix: "(প্রিফিক্স নেই)", topN: "Top N", maxScanKeys: "সর্বোচ্চ স্ক্যান কী", type: "টাইপ", noData: "কোনো ডেটা নেই। শুরু করতে বিশ্লেষণ চালান ক্লিক করুন।", exportAll: "সব রপ্তানি", }, 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: "মান" } }, timeseries: { chart: "চার্ট", info: "তথ্য", addPoint: "ডেটা পয়েন্ট যোগ করুন", from: "থেকে (ms বা -)", to: "পর্যন্ত (ms বা +)", aggregation: "সমষ্টি", timeBucket: "বালতি (ms)", none: "কিছুই না", dataPoints: "ডেটা পয়েন্ট", labels: "লেবেল", rules: "নিয়ম", retention: "ধারণ", timestamp: "টাইমস্ট্যাম্প", value: "মান", retentionHint: "0 = মেয়াদোত্তীর্ণ হবে না, অথবা মিলিসেকেন্ড", duplicatePolicy: "ডুপ্লিকেট নীতি", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' মানে স্বয়ংক্রিয়ভাবে তৈরি, অথবা মিলিসেকেন্ড টাইমস্ট্যাম্প", editAllHint: "প্রতি লাইনে একটি ডেটা পয়েন্ট: টাইমস্ট্যাম্প মান (টাইমস্ট্যাম্প স্বয়ংক্রিয়ের জন্য * হতে পারে)", autoSpread: "স্বয়ংক্রিয় * বিস্তার ব্যবধান", formula: "সূত্র", formulaLinear: "রৈখিক", formulaRandom: "এলোমেলো", formulaSawtooth: "করাতের দাঁত", formulaPoints: "পয়েন্ট", formulaAmplitude: "প্রশস্ততা", formulaOffset: "অফসেট", generate: "তৈরি করুন", exportChart: "PNG রপ্তানি করুন", overlay: "ওভারলে কী", overlayHint: "কমা-বিভক্ত কী", mrangeFilter: "লেবেল ফিল্টার", bulkMode: "বাল্ক জেনারেট", mrangeHint: "যেমন sensor=temp" } }, treeControls: { settings: "গাছের সেটিংস", expandAll: "সব প্রসারিত", collapseAll: "সব সঙ্কুচিত করুন", level: "স্তর", search: { search: "কীগুলিতে অনুসন্ধান করুন", clear: "খালি সেট করতে বর্তমান অনুসন্ধান সাফ করুন", placeholderClient: "ক্লায়েন্ট সাইড অনুসন্ধান করুন", placeholderServer: "সার্ভার সাইড সার্চ করুন", info: "ক্লায়েন্ট সাইড সার্চ মানে, যে এটি সার্চ ইনপুটের লেখার সাথে মেলে। সার্ভার সাইড সার্চের মানে হল, এটি কী প্যাটার্নে *{search-text}* হিসাবে সার্চ করার মত। বড় সার্চ সেটের জন্য, সার্ভার সাইড সার্চিং ব্যবহার করা ভালো। ছোট অনুসন্ধান সেটের জন্য, ক্লায়েন্ট সাইড অনুসন্ধান মোড ব্যবহার করা ভাল।" + ` চাবি গণনা শেষ হলে ${p3xr.settings.maxLightKeysCount}, আপনি শুধুমাত্র সার্ভার সাইডে অনুসন্ধান করতে পারেন.`, largeSetInfo: "একটি বড় সেটে, ক্লায়েন্ট সাইড অনুসন্ধান অক্ষম করা হয়। তাই এই মুহূর্তে শুধুমাত্র সার্ভার সাইড সার্চ করা সম্ভব।", infoDetails: "অনুসন্ধান কিভাবে কাজ করে তা জানতে, অনুগ্রহ করে সেটিংস দেখুন" }, pager: { next: "পরবর্তী", prev: "আগের", first: "প্���থম", last: "শেষ" } } }, time: { type: "ধরন", format: "ফরম্যাট", loading: "লোড হচ্ছে...", years: "বছর", months: "মাস", days: "দিন", year: "বছর", month: "মাস", day: "দিন", second: "সেকেন্ড", seconds: "সেকেন্ড", minute: "মিনিট", minutes: "মিনিট", hour: "ঘন্টা", hours: "ঘন্টা" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/bs/000077500000000000000000000000001517650670600137575ustar00rootroot00000000000000src/strings/bs/strings.js000066400000000000000000000634631517650670600160220ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Obrisati?", deleteAllKeys: opts => { return `Obrisati ovo stablo i sve njegove ključeve (${opts.key})?`; }, deleteSearchKeys: opts => { return `Jeste li sigurni da želite obrisati sve ključeve koji odgovaraju "${opts.pattern}"? Pronađeno ${opts.count} ključeva.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Obriši sve ${opts.count}`, importKeys: "Uvezi ključeve", deleteSearchKeys: (opts) => `Obriši ${opts.count} odgovarajućih ključeva`, saveWithFormatJson: "Sačuvaj sa formatom", formatJson: "Formatiraj Json", wrap: "Prelomi", unwrap: "Raspakuj", downloadJson: "Preuzmi JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Translating...", aiSettings: "AI Postavke", aiGroqApiKey: "Groq API ključ", aiGroqApiKeyInfo: "Opcionalno. Vlastiti Groq API ključ za bolje performanse. Nabavite besplatni ključ na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API ključ sačuvan", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Nije postavljeno (zadano servera)", aiEnabled: "AI omogućeno", aiEnabledYes: "Da", aiEnabledNo: "Ne", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tip", format: "Format", 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", deleteSearchHint: "Briše sve ključeve koji odgovaraju trenutnom pretraživanju na serveru", deletingSearchKeys: "Brisanje odgovarajućih ključeva...", importNoKeys: "Nisu pronađeni ključevi u datoteci", }, status: { dataCopied: "Podaci su u međuspremniku", exportDone: "Izvoz završen", deletedSearchKeys: (opts) => `Obrisano ${opts.count} ključeva`, 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", "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." }, 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", rss: "RSS", peak: "Vrh", fragmentation: "Fragmentacija", hitsAndMisses: "Pogoci / Promašaji", noClients: "Nema klijenata", }, analysis: { title: "Analiza memorije", runAnalysis: "Pokreni analizu", running: "Analiziranje...", typeDistribution: "Distribucija tipova", prefixMemory: "Memorija po prefiksu", topKeysByMemory: "Najveći ključevi po memoriji", expirationOverview: "Istek ključeva", memoryBreakdown: "Raspodjela memorije", keysScanned: "Skenirani ključevi", totalMemory: "Ukupna memorija", rssMemory: "RSS memorija", peakMemory: "Vršna memorija", luaMemory: "Lua memorija", overheadMemory: "Dodatno opterećenje", datasetMemory: "Skup podataka", fragmentation: "Fragmentacija", allocator: "Alokator", withTTL: "Sa TTL", persistent: "Trajni", avgTTL: "Prosječni TTL", prefix: "Prefiks", keyCount: "Broj ključeva", memoryUsage: "Korištenje memorije", noPrefix: "(bez prefiksa)", topN: "Top N", maxScanKeys: "Maks. skeniranih ključeva", type: "Tip", noData: "Nema podataka. Kliknite Pokreni analizu za početak.", exportAll: "Izvezi sve", }, 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" } }, timeseries: { chart: "Grafikon", info: "Informacije", addPoint: "Dodaj tačku podataka", from: "Od (ms ili -)", to: "Do (ms ili +)", aggregation: "Agregacija", timeBucket: "Kanta (ms)", none: "Nema", dataPoints: "tačke podataka", labels: "Oznake", rules: "Pravila", retention: "Zadržavanje", timestamp: "Vremenski pečat", value: "Vrijednost", retentionHint: "0 = bez isteka, ili milisekunde", duplicatePolicy: "Politika duplikata", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' znači automatski generisano, ili vremenski pečat u milisekundama", editAllHint: "Jedna tačka podataka po liniji: vremenski_pečat vrijednost (vremenski pečat može biti * za automatsko)", autoSpread: "Automatski * interval širenja", formula: "Formula", formulaLinear: "Linearno", formulaRandom: "Nasumično", formulaSawtooth: "Pilasti", formulaPoints: "Tačke", formulaAmplitude: "Amplituda", formulaOffset: "Pomak", generate: "Generiši", exportChart: "Izvezi PNG", overlay: "Preklapanje ključeva", overlayHint: "Ključevi odvojeni zarezom", mrangeFilter: "Filter oznaka", bulkMode: "Masovno generisanje", mrangeHint: "npr. sensor=temp" } }, treeControls: { settings: "Postavke stabla", expandAll: "Proširi sve", collapseAll: "Skupi sve", level: "Nivo", 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: { type: "Tip", format: "Format", loading: "Učitavanje...", years: "godina", months: "mjeseci", days: "dana", year: "godina", month: "mjesec", day: "dan", second: "sekunda", seconds: "sekunde", minute: "minuta", minutes: "minute", hour: "sat", hours: "sati" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/cs/000077500000000000000000000000001517650670600137605ustar00rootroot00000000000000src/strings/cs/strings.js000066400000000000000000000645461517650670600160260ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Opravdu chcete smazat všechny klíče odpovídající "${opts.pattern}"? Nalezeno ${opts.count} klíčů.`; }, 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.", delete: "Smazat?", 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" }, }, 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ů`, deleteAllKeysMenu: (opts) => `Smazat vše ${opts.count}`, importKeys: "Importovat klíče", deleteSearchKeys: (opts) => `Smazat ${opts.count} odpovídajících klíčů`, saveWithFormatJson: "Uložit s formátováním", formatJson: "Formátovat Json", wrap: "Zalamovat", unwrap: "Nezalamovat", downloadJson: "Stáhnout JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Překládání...", aiSettings: "Nastavení AI", aiGroqApiKey: "Groq API klíč", aiGroqApiKeyInfo: "Volitelné. Vlastní Groq API klíč pro lepší výkon. Získejte bezplatný klíč na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API klíč uložen", aiGroqApiKeyInvalid: "Neplatný klíč API Groq", aiGroqApiKeyNotSet: "Nenastaveno (výchozí serveru)", aiEnabled: "AI povoleno", aiEnabledYes: "Ano", aiEnabledNo: "Ne", aiRouteViaNetwork: "Trasa přes network.corifeus.com", aiRoutingDirect: "Dotazy jdou přímo do Groq s vaším vlastním API klíčem, bez network.corifeus.com.", aiRoutingNetwork: "AI dotazy jsou směrovány přes network.corifeus.com. Pokud máte vlastní bezplatný klíč API Groq, můžete tento přepínač vypnout.", 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í", 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" }, 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", type: "Typ", format: "Formát", 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í", deleteSearchHint: "Smaže všechny klíče odpovídající aktuálnímu vyhledávání na serveru", deletingSearchKeys: "Mazání odpovídajících klíčů...", importNoKeys: "V souboru nebyly nalezeny žádné klíče", }, status: { dataCopied: "Data jsou ve schránce", exportDone: "Export dokončen", deletedSearchKeys: (opts) => `Smazáno ${opts.count} klíčů`, 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", "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." }, 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", rss: "RSS", peak: "Špička", fragmentation: "Fragmentace", hitsAndMisses: "Zásahy / Minutí", noClients: "Žádní klienti", }, analysis: { title: "Analýza paměti", runAnalysis: "Spustit analýzu", running: "Analyzování...", typeDistribution: "Distribuce typů", prefixMemory: "Paměť podle prefixu", topKeysByMemory: "Největší klíče podle paměti", expirationOverview: "Expirace klíčů", memoryBreakdown: "Rozdělení paměti", keysScanned: "Prohledané klíče", totalMemory: "Celková paměť", rssMemory: "RSS paměť", peakMemory: "Špičková paměť", luaMemory: "Lua paměť", overheadMemory: "Režie", datasetMemory: "Datová sada", fragmentation: "Fragmentace", allocator: "Alokátor", withTTL: "S TTL", persistent: "Trvalé", avgTTL: "Průměrné TTL", prefix: "Prefix", keyCount: "Počet klíčů", memoryUsage: "Využití paměti", noPrefix: "(bez prefixu)", topN: "Top N", maxScanKeys: "Max. prohledaných klíčů", type: "Typ", noData: "Žádná data. Klikněte na Spustit analýzu pro zahájení.", exportAll: "Exportovat vše", }, 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" } }, timeseries: { chart: "Graf", info: "Informace", addPoint: "Přidat datový bod", from: "Od (ms nebo -)", to: "Do (ms nebo +)", aggregation: "Agregace", timeBucket: "Interval (ms)", none: "Žádný", dataPoints: "datové body", labels: "Štítky", rules: "Pravidla", retention: "Retence", timestamp: "Časová značka", value: "Hodnota", retentionHint: "0 = bez expirace, nebo milisekundy", duplicatePolicy: "Politika duplikátů", labelsHint: "klíč1 hodnota1 klíč2 hodnota2", timestampHint: "'*' znamená automatické generování, nebo časová značka v milisekundách", editAllHint: "Jeden datový bod na řádek: časová_značka hodnota (časová_značka může být * pro auto)", autoSpread: "Automatický interval rozptylu *", formula: "Vzorec", formulaLinear: "Lineární", formulaRandom: "Náhodný", formulaSawtooth: "Pilovitý", formulaPoints: "Body", formulaAmplitude: "Amplituda", formulaOffset: "Posun", generate: "Generovat", exportChart: "Exportovat PNG", overlay: "Překryv klíčů", overlayHint: "Klíče oddělené čárkou", mrangeFilter: "Filtr štítků", bulkMode: "Hromadné generování", mrangeHint: "např. sensor=temp" } }, treeControls: { settings: "Nastavení stromě", expandAll: "Rozbalit vše", collapseAll: "Sbalit vše", level: "Úroveň", 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: { type: "Typ", format: "Formát", loading: "Načítání...", years: "let", months: "měsíců", days: "dní", year: "rok", month: "měsíc", day: "den", second: "sekunda", seconds: "sekundy", minute: "minuta", minutes: "minuty", hour: "hodina", hours: "hodiny" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/da/000077500000000000000000000000001517650670600137375ustar00rootroot00000000000000src/strings/da/strings.js000066400000000000000000000632351517650670600157770ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Er du sikker på, at du vil slette alle nøgler, der matcher "${opts.pattern}"? Fandt ${opts.count} nøgler.`; }, 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.", delete: "Slet?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Slet alle ${opts.count}`, importKeys: "Importér nøgler", deleteSearchKeys: (opts) => `Slet ${opts.count} matchende nøgler`, saveWithFormatJson: "Gem med format", formatJson: "Formater Json", wrap: "Indpakning", unwrap: "Pak ud", downloadJson: "Download JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Oversætter...", aiSettings: "AI-indstillinger", aiGroqApiKey: "Groq API-nøgle", aiGroqApiKeyInfo: "Valgfrit. Egen Groq API-nøgle for bedre ydeevne. Få en gratis nøgle på", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-nøgle gemt", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Ikke indstillet (serverstandard)", aiEnabled: "AI aktiveret", aiEnabledYes: "Ja", aiEnabledNo: "Nej", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Type", format: "Format", 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", deleteSearchHint: "Sletter alle nøgler, der matcher den aktuelle søgning på serveren", deletingSearchKeys: "Sletter matchende nøgler...", importNoKeys: "Ingen nøgler fundet i filen", }, status: { dataCopied: "Dataene er i udklipsholderen", exportDone: "Eksport fuldført", deletedSearchKeys: (opts) => `${opts.count} nøgler slettet`, 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", "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." }, 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", rss: "RSS", peak: "Maksimal", fragmentation: "Fragmentering", hitsAndMisses: "Træffere / Misser", noClients: "Ingen klienter", }, analysis: { title: "Hukommelsesanalyse", runAnalysis: "Kør analyse", running: "Analyserer...", typeDistribution: "Typefordeling", prefixMemory: "Hukommelse efter præfiks", topKeysByMemory: "Største nøgler efter hukommelse", expirationOverview: "Nøgleudløb", memoryBreakdown: "Hukommelsesopdeling", keysScanned: "Scannede nøgler", totalMemory: "Samlet hukommelse", rssMemory: "RSS-hukommelse", peakMemory: "Maksimal hukommelse", luaMemory: "Lua-hukommelse", overheadMemory: "Overhead", datasetMemory: "Datasæt", fragmentation: "Fragmentering", allocator: "Allokator", withTTL: "Med TTL", persistent: "Permanente", avgTTL: "Gennemsnitlig TTL", prefix: "Præfiks", keyCount: "Antal nøgler", memoryUsage: "Hukommelsesforbrug", noPrefix: "(intet præfiks)", topN: "Top N", maxScanKeys: "Maks. scannede nøgler", type: "Type", noData: "Ingen data. Klik Kør analyse for at starte.", exportAll: "Eksportér alt", }, 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" } }, timeseries: { chart: "Diagram", info: "Info", addPoint: "Tilføj datapunkt", from: "Fra (ms eller -)", to: "Til (ms eller +)", aggregation: "Aggregering", timeBucket: "Tidsinterval (ms)", none: "Ingen", dataPoints: "datapunkter", labels: "Etiketter", rules: "Regler", retention: "Opbevaring", timestamp: "Tidsstempel", value: "Værdi", retentionHint: "0 = ingen udløb, eller millisekunder", duplicatePolicy: "Dubletpolitik", labelsHint: "nøgle1 værdi1 nøgle2 værdi2", timestampHint: "'*' betyder automatisk generering, eller tidsstempel i millisekunder", editAllHint: "Et datapunkt per linje: tidsstempel værdi (tidsstempel kan være * for auto)", autoSpread: "Automatisk * spredningsinterval", formula: "Formel", formulaLinear: "Lineær", formulaRandom: "Tilfældig", formulaSawtooth: "Savtand", formulaPoints: "Punkter", formulaAmplitude: "Amplitude", formulaOffset: "Forskydning", generate: "Generer", exportChart: "Eksporter PNG", overlay: "Overlejr nøgler", overlayHint: "Kommaseparerede nøgler", mrangeFilter: "Etiketfilter", bulkMode: "Massegenerering", mrangeHint: "f.eks. sensor=temp" } }, treeControls: { settings: "Træindstillinger", expandAll: "Udvid alle", collapseAll: "Skjul alle sammen", level: "Niveau", 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: { type: "Type", format: "Format", loading: "Indlæser...", years: "år", months: "måneder", days: "dage", year: "år", month: "måned", day: "dag", second: "sekund", seconds: "sekunder", minute: "minut", minutes: "minutter", hour: "time", hours: "timer" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/de/000077500000000000000000000000001517650670600137435ustar00rootroot00000000000000src/strings/de/strings.js000066400000000000000000000667361517650670600160140ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Löschen?", deleteAllKeys: opts => { return `Diesen Baum und alle seine Schlüssel löschen (${opts.key})?`; }, deleteSearchKeys: opts => { return `Sind Sie sicher, dass Sie alle Schlüssel löschen möchten, die "${opts.pattern}" entsprechen? ${opts.count} Schlüssel gefunden.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Alle löschen ${opts.count}`, importKeys: "Schlüssel importieren", deleteSearchKeys: (opts) => `${opts.count} übereinstimmende Schlüssel löschen`, saveWithFormatJson: "Mit Formatierung speichern", formatJson: "Json formatieren", wrap: "Umbrechen", unwrap: "Nicht umbrechen", downloadJson: "JSON herunterladen", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Übersetze...", aiSettings: "AI Einstellungen", aiGroqApiKey: "Groq API-Schlüssel", aiGroqApiKeyInfo: "Optional. Eigener Groq API-Schlüssel für bessere Leistung. Kostenlosen Schlüssel erhalten von", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-Schlüssel gespeichert", aiGroqApiKeyInvalid: "Ungültiger Groq API-Schlüssel", aiGroqApiKeyNotSet: "Nicht gesetzt (Server-Standard)", aiEnabled: "AI aktiviert", aiEnabledYes: "Ja", aiEnabledNo: "Nein", aiRouteViaNetwork: "Route über network.corifeus.com", aiRoutingDirect: "Anfragen gehen direkt an Groq mit Ihrem eigenen API-Schlüssel, ohne network.corifeus.com.", aiRoutingNetwork: "AI-Anfragen werden über network.corifeus.com weitergeleitet. Wenn Sie Ihren eigenen kostenlosen Groq API-Schlüssel haben, können Sie diesen Schalter ausschalten.", 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", 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" }, 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", type: "Typ", format: "Format", 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", deleteSearchHint: "Alle Schlüssel löschen, die der aktuellen Suche entsprechen", deletingSearchKeys: "Übereinstimmende Schlüssel werden gelöscht...", importNoKeys: "Keine Schlüssel in der Datei gefunden", }, status: { dataCopied: "Die Daten sind in der Zwischenablage", exportDone: "Export abgeschlossen", deletedSearchKeys: (opts) => `${opts.count} Schlüssel gelöscht`, 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", "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." }, 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", rss: "RSS", peak: "Spitze", fragmentation: "Fragmentierung", hitsAndMisses: "Treffer / Fehlschläge", noClients: "Keine Clients", }, analysis: { title: "Speicheranalyse", runAnalysis: "Analyse starten", running: "Wird analysiert...", typeDistribution: "Typverteilung", prefixMemory: "Speicher nach Präfix", topKeysByMemory: "Größte Schlüssel nach Speicher", expirationOverview: "Schlüsselablauf", memoryBreakdown: "Speicheraufschlüsselung", keysScanned: "Gescannte Schlüssel", totalMemory: "Gesamtspeicher", rssMemory: "RSS-Speicher", peakMemory: "Spitzenspeicher", luaMemory: "Lua-Speicher", overheadMemory: "Overhead", datasetMemory: "Datensatz", fragmentation: "Fragmentierung", allocator: "Allokator", withTTL: "Mit TTL", persistent: "Permanent", avgTTL: "Durchschnittliche TTL", prefix: "Präfix", keyCount: "Schlüsselanzahl", memoryUsage: "Speicherverbrauch", noPrefix: "(kein Präfix)", topN: "Top N", maxScanKeys: "Max. gescannte Schlüssel", type: "Typ", noData: "Keine Daten. Klicken Sie auf Analyse starten, um zu beginnen.", exportAll: "Alles exportieren", }, 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" } }, timeseries: { chart: "Diagramm", info: "Info", addPoint: "Punkt hinzufügen", from: "Von (ms oder -)", to: "Bis (ms oder +)", aggregation: "Aggregation", timeBucket: "Bucket (ms)", none: "Keine", dataPoints: "Datenpunkte", labels: "Labels", rules: "Regeln", retention: "Aufbewahrung", timestamp: "Zeitstempel", value: "Wert", retentionHint: "0 = kein Ablauf, oder Millisekunden", duplicatePolicy: "Duplikatrichtlinie", labelsHint: "Schlüssel1 Wert1 Schlüssel2 Wert2", timestampHint: "'*' bedeutet automatisch generiert, oder Millisekunden-Zeitstempel", editAllHint: "Ein Datenpunkt pro Zeile: Zeitstempel Wert (Zeitstempel kann * für automatisch sein)", autoSpread: "Automatisches * Streuintervall", formula: "Formel", formulaLinear: "Linear", formulaRandom: "Zufällig", formulaSawtooth: "Sägezahn", formulaPoints: "Punkte", formulaAmplitude: "Amplitude", formulaOffset: "Offset", generate: "Generieren", exportChart: "PNG exportieren", overlay: "Schlüssel überlagern", overlayHint: "Kommagetrennte Schlüssel", mrangeFilter: "Label-Filter", bulkMode: "Massengenerierung", mrangeHint: "z.B. sensor=temp" } }, treeControls: { settings: "Baumeinstellungen", expandAll: "Alle aufklappen", collapseAll: "Alle zuklappen", level: "Ebene", 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: { type: "Typ", format: "Format", loading: "Laden...", years: "Jahre", months: "Monate", days: "Tage", year: "Jahr", month: "Monat", day: "Tag", second: "Sekunde", seconds: "Sekunden", minute: "Minute", minutes: "Minuten", hour: "Stunde", hours: "Stunden" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/el/000077500000000000000000000000001517650670600137535ustar00rootroot00000000000000src/strings/el/strings.js000066400000000000000000001123211517650670600160020ustar00rootroot00000000000000const strings = { error: { 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});`; }, deleteSearchKeys: opts => { return `Είστε σίγουροι ότι θέλετε να διαγράψετε όλα τα κλειδιά που ταιριάζουν με "${opts.pattern}"; Βρέθηκαν ${opts.count} κλειδιά.`; }, socketioConnectError: "Το Socket.IO δεν μπορεί να συνδεθεί στον διακομιστή, μπορείτε να κάνετε επαναφόρτωση και να προσπαθήσετε να επιλύσετε το σφάλμα σύνδεσης μόνοι σας, ο πελάτης δεν γνωρίζει πώς να το λύσει μόνος του.", socketioAuthRequired: "Απαιτείται εξουσιοδότηση Socket.IO. Παρακαλώ πιστοποιηθείτε με HTTP Basic Auth (όνομα χρήστη/κωδικό πρόσβασης) και κάντε επαναφόρτωση.", delete: "Διαγραφή;", deleteKey: "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το κλειδί;", rename: { title: "Είστε σίγουροι ότι θέλετε να μετονομάσετε αυτό το κλειδί;", textContent: "Αυτή η ενέργεια μετονομάζει το κλειδί μόνιμα.", placeholder: "Το κλειδί Redis (υποχρεωτικό)" }, ttl: { title: "Είστε σίγουροι ότι θέλετε να αλλάξετε το TTL αυτού του κλειδιού;", textContent: "Η αλλαγή του TTL ενημερώνει τον χρόνο ζωής αυτού του κλειδιού. Αφήστε κενό για να διατηρήσετε αυτό το κλειδί για πάντα.", placeholder: "Το TTL του κλειδιού Redis (ακέραιος ή κενό)", placeholderPlaceholder: "Κενό σημαίνει ότι παραμένει για πάντα· διαφορετικά εισάγετε έναν ακέραιο.", convertTextToTime: "Μετατροπή κειμένου σε χρόνο", convertTextToTimePlaceholder: "Π.χ. 1d θα γίνει 86400" }, }, 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} αποτελεσμάτων`, deleteAllKeysMenu: (opts) => `Διαγραφή όλων ${opts.count}`, importKeys: "Εισαγωγή κλειδιών", deleteSearchKeys: (opts) => `Διαγραφή ${opts.count} αντίστοιχων κλειδιών`, saveWithFormatJson: "Αποθήκευση με μορφοποίηση", formatJson: "Μορφοποίηση Json", wrap: "Αναδίπλωση", unwrap: "Χωρίς αναδίπλωση", downloadJson: "Λήψη JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 και μοιάζει η ίδια, πρόκειται για δυνατότητα ασφαλείας. Για να αλλάξετε τις ρυθμίσεις, απλά αντικαταστήστε αυτές τις ρυθμίσεις με κενό ή κάτι άλλο και θα αποθηκευτούν. Αν δεν αλλάξετε τις ρυθμίσεις, θα διατηρηθούν ως έχουν στον διακομιστή.', aiTranslating: "Μετάφραση...", aiSettings: "Ρυθμίσεις AI", aiGroqApiKey: "Κλειδί API Groq", aiGroqApiKeyInfo: "Προαιρετικό. Δικό σας κλειδί API Groq για καλύτερη απόδοση. Αποκτήστε δωρεάν κλειδί από", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Το κλειδί API AI αποθηκεύτηκε", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Δεν έχει οριστεί (προεπιλογή διακομιστή)", aiEnabled: "AI ενεργοποιημένο", aiEnabledYes: "Ναι", aiEnabledNo: "Όχι", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Συνδέσεις", keysSort: { on: "Ταξινόμηση κλειδιών ενεργή", off: "Ταξινόμηση κλειδιών ανενεργή" }, cluster: { on: "Cluster ενεργό", off: "Cluster ανενεργό" }, sentinel: { on: "Sentinel ενεργό", off: "Sentinel ανενεργό", name: "Όνομα Sentinel" }, readonly: { on: "Μόνο ανάγνωση ενεργό", off: "Μόνο ανάγνωση ανενεργό" }, 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: "Χρόνος", type: "Τύπος", format: "Μορφή", loading: "Φόρτωση...", autoRefresh: "Αυτόματο", exportSearchHint: "Εξαγωγή μόνο κλειδιών που ταιριάζουν με την τρέχουσα αναζήτηση", importSearchHint: "Η εισαγωγή εφαρμόζεται σε ολόκληρη τη βάση δεδομένων, όχι μόνο στα αποτελέσματα αναζήτησης", deleteSearchHint: "Διαγράφει όλα τα κλειδιά που ταιριάζουν με την τρέχουσα αναζήτηση στον διακομιστή", deletingSearchKeys: "Διαγραφή αντίστοιχων κλειδιών...", importNoKeys: "Δεν βρέθηκαν κλειδιά στο αρχείο", }, status: { dataCopied: "Τα δεδομένα βρίσκονται στο πρόχειρο", exportDone: "Η εξαγωγή ολοκληρώθηκε", deletedSearchKeys: (opts) => `Διαγράφηκαν ${opts.count} κλειδιά`, 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": "Αυτός ο δείκτης λίστας είναι εκτός ορίων", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Απαιτείται εξουσιοδότηση: παρακαλώ πιστοποιηθείτε με HTTP Basic Auth και κάντε επαναφόρτωση.", "auto-connection-failed": "Πιθανόν, η σύνδεση αφαιρέθηκε και η αυτόματη σύνδεση απέτυχε εξαιτίας αυτού.", invalid_console_command: "Αυτή η εντολή δεν λειτουργεί μέσω του GUI." }, 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: "Χωρίς κλειδιά", rss: "RSS", peak: "Μέγιστο", fragmentation: "Κατακερματισμός", hitsAndMisses: "Επιτυχίες / Αποτυχίες", noClients: "Χωρίς πελάτες", }, analysis: { title: "Ανάλυση Μνήμης", runAnalysis: "Εκτέλεση Ανάλυσης", running: "Ανάλυση...", typeDistribution: "Κατανομή Τύπων", prefixMemory: "Μνήμη ανά Πρόθεμα", topKeysByMemory: "Μεγαλύτερα Κλειδιά ανά Μνήμη", expirationOverview: "Λήξη Κλειδιών", memoryBreakdown: "Ανάλυση Μνήμης", keysScanned: "Σαρωμένα Κλειδιά", totalMemory: "Συνολική Μνήμη", rssMemory: "Μνήμη RSS", peakMemory: "Μέγιστη Μνήμη", luaMemory: "Μνήμη Lua", overheadMemory: "Επιβάρυνση", datasetMemory: "Σύνολο Δεδομένων", fragmentation: "Κατακερματισμός", allocator: "Κατανεμητής", withTTL: "Με TTL", persistent: "Μόνιμα", avgTTL: "Μέσο TTL", prefix: "Πρόθεμα", keyCount: "Αριθμός Κλειδιών", memoryUsage: "Χρήση Μνήμης", noPrefix: "(χωρίς πρόθεμα)", topN: "Top N", maxScanKeys: "Μέγ. Σαρωμένα Κλειδιά", type: "Τύπος", noData: "Δεν υπάρχουν δεδομένα. Κάντε κλικ στο Εκτέλεση Ανάλυσης για να ξεκινήσετε.", exportAll: "Εξαγωγή Όλων", }, 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: "Τιμή" } }, timeseries: { chart: "Γράφημα", info: "Πληροφορίες", addPoint: "Προσθήκη σημείου δεδομένων", from: "Από (ms ή -)", to: "Έως (ms ή +)", aggregation: "Συνάθροιση", timeBucket: "Χρονικό διάστημα (ms)", none: "Κανένα", dataPoints: "σημεία δεδομένων", labels: "Ετικέτες", rules: "Κανόνες", retention: "Διατήρηση", timestamp: "Χρονοσήμανση", value: "Τιμή", retentionHint: "0 = χωρίς λήξη, ή χιλιοστά του δευτερολέπτου", duplicatePolicy: "Πολιτική διπλοτύπων", labelsHint: "κλειδί1 τιμή1 κλειδί2 τιμή2", timestampHint: "'*' σημαίνει αυτόματη δημιουργία, ή χρονοσήμανση σε χιλιοστά του δευτερολέπτου", editAllHint: "Ένα σημείο δεδομένων ανά γραμμή: χρονοσήμανση τιμή (η χρονοσήμανση μπορεί να είναι * για αυτόματο)", autoSpread: "Αυτόματο διάστημα κατανομής *", formula: "Τύπος", formulaLinear: "Γραμμικός", formulaRandom: "Τυχαίος", formulaSawtooth: "Πριονωτός", formulaPoints: "Σημεία", formulaAmplitude: "Πλάτος", formulaOffset: "Μετατόπιση", generate: "Δημιουργία", exportChart: "Εξαγωγή PNG", overlay: "Επικάλυψη κλειδιών", overlayHint: "Κλειδιά χωρισμένα με κόμμα", mrangeFilter: "Φίλτρο ετικετών", bulkMode: "Μαζική δημιουργία", mrangeHint: "π.χ. sensor=temp" } }, treeControls: { settings: "Ρυθμίσεις δέντρου", expandAll: "Ανάπτυξη όλων", collapseAll: "Σύμπτυξη όλων", level: "Επίπεδο", search: { search: "Αναζήτηση στα κλειδιά", clear: "Εκκαθάριση τρέχουσας αναζήτησης", placeholderClient: "Αναζήτηση στον πελάτη", placeholderServer: "Αναζήτηση στον διακομιστή", info: "Η αναζήτηση στον πελάτη σημαίνει ότι αντιστοιχίζει το κείμενο στην είσοδο αναζήτησης. Η αναζήτηση στον διακομιστή σημαίνει ότι αναζητά στα μοτίβα κλειδιών ως *{κείμενο-αναζήτησης}*. Για μεγάλα σύνολα αναζήτησης, είναι καλύτερα να χρησιμοποιείτε αναζήτηση στον διακομιστή. Για μικρότερα σύνολα, είναι καλύτερα να χρησιμοποιείτε αναζήτηση στον πελάτη." + ` Αν ο αριθμός κλειδιών ξεπερνά τα ${p3xr.settings.maxLightKeysCount}, μπορείτε να αναζητήσετε μόνο στον διακομιστή.`, largeSetInfo: "Σε μεγάλο σύνολο, η αναζήτηση στον πελάτη είναι απενεργοποιημένη. Αυτή τη στιγμή είναι δυνατή μόνο η αναζήτηση στον διακομιστή.", infoDetails: "Για να μάθετε πώς λειτουργεί η αναζήτηση, ελέγξτε τις ρυθμίσεις" }, pager: { next: "Επόμενο", prev: "Προηγούμενο", first: "Πρώτο", last: "Τελευταίο" } } }, time: { type: "Τύπος", format: "Μορφή", loading: "Φόρτωση...", years: "χρόνια", months: "μήνες", days: "ημέρες", year: "χρόνος", month: "μήνας", day: "ημέρα", second: "δευτερόλεπτο", seconds: "δευτερόλεπτα", minute: "λεπτό", minutes: "λεπτά", hour: "ώρα", hours: "ώρες" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/en/000077500000000000000000000000001517650670600137555ustar00rootroot00000000000000src/strings/en/strings.js000066400000000000000000000607431517650670600160160ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Are you sure to delete all keys matching "${opts.pattern}"? Found ${opts.count} keys.`; }, 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.", delete: "Delete?", 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" }, }, 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", deleteSearchKeys: (opts) => `Delete ${opts.count} matching keys`, deleteAllKeysMenu: (opts) => `Delete all ${opts.count} keys`, saveWithFormatJson: "Save with format", formatJson: "Format Json", wrap: "Wrap", unwrap: "Unwrap", downloadJson: "Download JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Translating...", aiSettings: "AI Settings", aiGroqApiKey: "Groq API Key", aiGroqApiKeyInfo: "Optional. Your own Groq API key for better performance. Get a free key from", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI settings saved", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Not set (using server default)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", format: "Format", 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", deleteSearchHint: "Deletes all keys matching the current search on the server", deletingSearchKeys: "Deleting matching keys...", }, status: { dataCopied: "The data is in the clipboard", exportDone: "Export complete", deletedSearchKeys: (opts) => `Deleted ${opts.count} keys`, 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", "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." }, 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", rss: "RSS", peak: "Peak", fragmentation: "Fragmentation", hitsAndMisses: "Hits / Misses", noClients: "No clients", }, analysis: { title: "Memory Analysis", runAnalysis: "Run Analysis", running: "Analyzing...", typeDistribution: "Type Distribution", prefixMemory: "Memory by Prefix", topKeysByMemory: "Top Keys by Memory", expirationOverview: "Key Expiration", memoryBreakdown: "Memory Breakdown", keysScanned: "Keys Scanned", totalMemory: "Total Memory", rssMemory: "RSS Memory", peakMemory: "Peak Memory", luaMemory: "Lua Memory", overheadMemory: "Overhead", datasetMemory: "Dataset", fragmentation: "Fragmentation", allocator: "Allocator", withTTL: "With TTL", persistent: "Persistent", avgTTL: "Average TTL", prefix: "Prefix", keyCount: "Key Count", memoryUsage: "Memory Usage", noPrefix: "(no prefix)", topN: "Top N", maxScanKeys: "Max Scan Keys", type: "Type", noData: "No data. Click Run Analysis to start.", exportAll: "Export All", }, 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" } }, timeseries: { chart: "Chart", info: "Info", addPoint: "Add Data Point", from: "From (ms or -)", to: "To (ms or +)", aggregation: "Aggregation", timeBucket: "Bucket (ms)", none: "None", dataPoints: "data points", labels: "Labels", rules: "Rules", retention: "Retention", timestamp: "Timestamp", value: "Value", retentionHint: "0 = no expiry, or milliseconds", duplicatePolicy: "Duplicate policy", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' means auto generated, or milliseconds timestamp", editAllHint: "One data point per line: timestamp value (timestamp can be * for auto)", autoSpread: "Auto * spread interval", formula: "Formula", formulaLinear: "Linear", formulaRandom: "Random", formulaSawtooth: "Sawtooth", formulaPoints: "Points", formulaAmplitude: "Amplitude", formulaOffset: "Offset", generate: "Generate", overlay: "Overlay keys", overlayHint: "Comma-separated keys", exportChart: "Export PNG", mrangeFilter: "Label filter", mrangeHint: "e.g. sensor=temp", bulkMode: "Bulk generate" } }, treeControls: { settings: "Tree settings", expandAll: "Expand all", collapseAll: "Collapse all", level: "Level", 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", second: "second", seconds: "seconds", minute: "minute", minutes: "minutes", hour: "hour", hours: "hours" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/es/000077500000000000000000000000001517650670600137625ustar00rootroot00000000000000src/strings/es/strings.js000066400000000000000000000655471517650670600160320ustar00rootroot00000000000000const strings = { error: { 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?", delete: "¿Eliminar?", deleteAllKeys: opts => { return `¿Eliminar este árbol y todas sus claves (${opts.key})?`; }, deleteSearchKeys: opts => { return `¿Está seguro de eliminar todas las claves que coinciden con "${opts.pattern}"? Se encontraron ${opts.count} claves.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Eliminar todo ${opts.count}`, importKeys: "Importar claves", deleteSearchKeys: (opts) => `Eliminar ${opts.count} claves coincidentes`, saveWithFormatJson: "Guardar con formato", formatJson: "Formatear Json", wrap: "Ajustar", unwrap: "No ajustar", downloadJson: "Descargar JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Traduciendo...", aiSettings: "Configuración IA", aiGroqApiKey: "Clave API Groq", aiGroqApiKeyInfo: "Opcional. Su propia clave API Groq para mejor rendimiento. Obtenga una clave gratuita en", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Clave API IA guardada", aiGroqApiKeyInvalid: "Clave API Groq no válida", aiGroqApiKeyNotSet: "No configurado (predeterminado del servidor)", aiEnabled: "IA habilitada", aiEnabledYes: "Sí", aiEnabledNo: "No", aiRouteViaNetwork: "Ruta vía network.corifeus.com", aiRoutingDirect: "Las consultas van directamente a Groq usando su propia clave API, sin pasar por network.corifeus.com.", aiRoutingNetwork: "Las consultas de IA se enrutan a través de network.corifeus.com. Si tiene su propia clave API Groq gratuita, puede desactivar este interruptor.", 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", 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" }, 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", type: "Tipo", format: "Formato", 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", deleteSearchHint: "Eliminar todas las claves que coinciden con la búsqueda actual", deletingSearchKeys: "Eliminando claves coincidentes...", importNoKeys: "No se encontraron claves en el archivo", }, status: { dataCopied: "Los datos están en el portapapeles", exportDone: "Exportación completada", deletedSearchKeys: (opts) => `${opts.count} claves eliminadas`, 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", "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." }, 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", rss: "RSS", peak: "Máximo", fragmentation: "Fragmentación", hitsAndMisses: "Aciertos / Fallos", noClients: "Sin clientes", }, analysis: { title: "Análisis de Memoria", runAnalysis: "Ejecutar Análisis", running: "Analizando...", typeDistribution: "Distribución de Tipos", prefixMemory: "Memoria por Prefijo", topKeysByMemory: "Claves Más Grandes por Memoria", expirationOverview: "Expiración de Claves", memoryBreakdown: "Desglose de Memoria", keysScanned: "Claves Escaneadas", totalMemory: "Memoria Total", rssMemory: "Memoria RSS", peakMemory: "Memoria Máxima", luaMemory: "Memoria Lua", overheadMemory: "Sobrecarga", datasetMemory: "Conjunto de Datos", fragmentation: "Fragmentación", allocator: "Asignador", withTTL: "Con TTL", persistent: "Persistentes", avgTTL: "TTL Promedio", prefix: "Prefijo", keyCount: "Cantidad de Claves", memoryUsage: "Uso de Memoria", noPrefix: "(sin prefijo)", topN: "Top N", maxScanKeys: "Máx. Claves Escaneadas", type: "Tipo", noData: "Sin datos. Haga clic en Ejecutar Análisis para comenzar.", exportAll: "Exportar Todo", }, 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" } }, timeseries: { chart: "Gráfico", info: "Info", addPoint: "Agregar punto", from: "Desde (ms o -)", to: "Hasta (ms o +)", aggregation: "Agregación", timeBucket: "Bucket (ms)", none: "Ninguno", dataPoints: "puntos de datos", labels: "Etiquetas", rules: "Reglas", retention: "Retención", timestamp: "Marca de tiempo", value: "Valor", retentionHint: "0 = sin expiración, o milisegundos", duplicatePolicy: "Política de duplicados", labelsHint: "clave1 valor1 clave2 valor2", timestampHint: "'*' significa generado automáticamente, o marca de tiempo en milisegundos", editAllHint: "Un punto de datos por línea: marca_de_tiempo valor (la marca de tiempo puede ser * para automático)", autoSpread: "Intervalo de dispersión automático *", formula: "Fórmula", formulaLinear: "Lineal", formulaRandom: "Aleatorio", formulaSawtooth: "Diente de sierra", formulaPoints: "Puntos", formulaAmplitude: "Amplitud", formulaOffset: "Desplazamiento", generate: "Generar", exportChart: "Exportar PNG", overlay: "Superponer claves", overlayHint: "Claves separadas por comas", mrangeFilter: "Filtro de etiquetas", bulkMode: "Generación masiva", mrangeHint: "ej. sensor=temp" } }, treeControls: { settings: "Configuración del árbol", expandAll: "Expandir todo", collapseAll: "Colapsar todo", level: "Nivel", 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: { type: "Tipo", format: "Formato", loading: "Cargando...", years: "años", months: "meses", days: "días", year: "año", month: "mes", day: "día", second: "segundo", seconds: "segundos", minute: "minuto", minutes: "minutos", hour: "hora", hours: "horas" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/et/000077500000000000000000000000001517650670600137635ustar00rootroot00000000000000src/strings/et/strings.js000066400000000000000000000630431517650670600160200ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Kustutada?", deleteAllKeys: opts => { return `Kustuta see puu ja kõik selle võtmed (${opts.key})?`; }, deleteSearchKeys: opts => { return `Kas olete kindel, et soovite kustutada kõik mustrile "${opts.pattern}" vastavad võtmed? Leiti ${opts.count} võtit.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Kustuta kõik ${opts.count}`, importKeys: "Impordi võtmed", deleteSearchKeys: (opts) => `Kustuta ${opts.count} vastavat võtit`, saveWithFormatJson: "Salvestage vorminguga", formatJson: "Vorming Json", wrap: "Mähi", unwrap: "Lahti pakkida", downloadJson: "Laadige alla JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Translating...", aiSettings: "AI seaded", aiGroqApiKey: "Groq API võti", aiGroqApiKeyInfo: "Valikuline. Oma Groq API võti parema jõudluse jaoks. Hankige tasuta võti", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API võti salvestatud", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Pole seatud (serveri vaikeväärtus)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tüüp", format: "Formaat", loading: "Laadimine...", autoRefresh: "Auto", exportSearchHint: "Eksporditakse ainult praegusele otsingule vastavad võtmed", importSearchHint: "Import kehtib kogu andmebaasile, mitte ainult otsingutulemustele", deleteSearchHint: "Kustutab kõik serveris praegusele otsingule vastavad võtmed", deletingSearchKeys: "Vastavate võtmete kustutamine...", importNoKeys: "Failis ei leitud võtmeid", }, status: { dataCopied: "Andmed on lõikepuhvril", exportDone: "Eksport lõpetatud", deletedSearchKeys: (opts) => `Kustutatud ${opts.count} võtit`, 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", "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." }, 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", rss: "RSS", peak: "Tipp", fragmentation: "Fragmenteerumine", hitsAndMisses: "Tabamused / Möödapanekud", noClients: "Kliente pole", }, analysis: { title: "Mälu analüüs", runAnalysis: "Käivita analüüs", running: "Analüüsimine...", typeDistribution: "Tüübi jaotus", prefixMemory: "Mälu prefiksi järgi", topKeysByMemory: "Suurimad võtmed mälu järgi", expirationOverview: "Võtmete aegumine", memoryBreakdown: "Mälu jaotus", keysScanned: "Skannitud võtmed", totalMemory: "Kogumälu", rssMemory: "RSS mälu", peakMemory: "Tippmälu", luaMemory: "Lua mälu", overheadMemory: "Üldkulu", datasetMemory: "Andmestik", fragmentation: "Fragmenteerumine", allocator: "Eraldaja", withTTL: "TTL-iga", persistent: "Püsivad", avgTTL: "Keskmine TTL", prefix: "Prefiks", keyCount: "Võtmete arv", memoryUsage: "Mälukasutus", noPrefix: "(prefiksita)", topN: "Top N", maxScanKeys: "Maks. skannitud võtmed", type: "Tüüp", noData: "Andmed puuduvad. Klõpsake Käivita analüüs alustamiseks.", exportAll: "Ekspordi kõik", }, 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" } }, timeseries: { chart: "Diagramm", info: "Teave", addPoint: "Lisa andmepunkt", from: "Alates (ms või -)", to: "Kuni (ms või +)", aggregation: "Agregatsioon", timeBucket: "Ämber (ms)", none: "Puudub", dataPoints: "andmepunktid", labels: "Sildid", rules: "Reeglid", retention: "Säilitamine", timestamp: "Ajatempel", value: "Väärtus", retentionHint: "0 = ei aegu, või millisekundid", duplicatePolicy: "Duplikaatide poliitika", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' tähendab automaatselt genereeritud, või millisekundite ajatempel", editAllHint: "Üks andmepunkt rea kohta: ajatempel väärtus (ajatempel võib olla * automaatse jaoks)", autoSpread: "Automaatne * leviku intervall", formula: "Valem", formulaLinear: "Lineaarne", formulaRandom: "Juhuslik", formulaSawtooth: "Saehamba", formulaPoints: "Punktid", formulaAmplitude: "Amplituud", formulaOffset: "Nihe", generate: "Genereeri", exportChart: "Ekspordi PNG", overlay: "Kattuvad võtmed", overlayHint: "Komadega eraldatud võtmed", mrangeFilter: "Siltide filter", bulkMode: "Hulgi genereerimine", mrangeHint: "nt. sensor=temp" } }, treeControls: { settings: "Puu seaded", expandAll: "Laienda kõik", collapseAll: "Ahenda kõik", level: "Tase", 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: { type: "Tüüp", format: "Formaat", loading: "Laadimine...", years: "aastat", months: "kuud", days: "päevadel", year: "aastal", month: "kuu", day: "päeval", second: "sekund", seconds: "sekundit", minute: "minut", minutes: "minutit", hour: "tund", hours: "tundi" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/fi/000077500000000000000000000000001517650670600137515ustar00rootroot00000000000000src/strings/fi/strings.js000066400000000000000000000633561517650670600160150ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Haluatko varmasti poistaa kaikki hakua "${opts.pattern}" vastaavat avaimet? Löytyi ${opts.count} avainta.`; }, 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.", delete: "Poista?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Poista kaikki ${opts.count}`, importKeys: "Tuo avaimet", deleteSearchKeys: (opts) => `Poista ${opts.count} vastaavaa avainta`, saveWithFormatJson: "Tallenna muodossa", formatJson: "Muotoile Json", wrap: "Kääri", unwrap: "Avaa pakkaus", downloadJson: "Lataa JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Käännetään...", aiSettings: "AI-asetukset", aiGroqApiKey: "Groq API-avain", aiGroqApiKeyInfo: "Valinnainen. Oma Groq API-avain parempaan suorituskykyyn. Hanki ilmainen avain", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-avain tallennettu", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Ei asetettu (palvelimen oletus)", aiEnabled: "AI käytössä", aiEnabledYes: "Kyllä", aiEnabledNo: "Ei", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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ä" }, 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", type: "Tyyppi", format: "Muoto", loading: "Ladataan...", autoRefresh: "Auto", exportSearchHint: "Viedään vain nykyistä hakua vastaavat avaimet", importSearchHint: "Tuonti koskee koko tietokantaa, ei vain hakutuloksia", deleteSearchHint: "Poistaa kaikki palvelimen nykyistä hakua vastaavat avaimet", deletingSearchKeys: "Poistetaan vastaavia avaimia...", importNoKeys: "Tiedostosta ei löytynyt avaimia", }, status: { dataCopied: "Tiedot ovat leikepöydällä", exportDone: "Vienti valmis", deletedSearchKeys: (opts) => `${opts.count} avainta poistettu`, 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", "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." }, 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", rss: "RSS", peak: "Huippu", fragmentation: "Fragmentoituminen", hitsAndMisses: "Osumat / Ohitukset", noClients: "Ei asiakkaita", }, analysis: { title: "Muistianalyysi", runAnalysis: "Suorita analyysi", running: "Analysoidaan...", typeDistribution: "Tyyppien jakauma", prefixMemory: "Muisti etuliitteen mukaan", topKeysByMemory: "Suurimmat avaimet muistin mukaan", expirationOverview: "Avainten vanheneminen", memoryBreakdown: "Muistin erittely", keysScanned: "Skannatut avaimet", totalMemory: "Kokonaismuisti", rssMemory: "RSS-muisti", peakMemory: "Huippumuisti", luaMemory: "Lua-muisti", overheadMemory: "Yleisrasite", datasetMemory: "Tietojoukko", fragmentation: "Fragmentoituminen", allocator: "Varaaja", withTTL: "TTL:llä", persistent: "Pysyvät", avgTTL: "Keskimääräinen TTL", prefix: "Etuliite", keyCount: "Avainten määrä", memoryUsage: "Muistin käyttö", noPrefix: "(ei etuliitettä)", topN: "Top N", maxScanKeys: "Maks. skannatut avaimet", type: "Tyyppi", noData: "Ei tietoja. Napsauta Suorita analyysi aloittaaksesi.", exportAll: "Vie kaikki", }, 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" } }, timeseries: { chart: "Kaavio", info: "Tiedot", addPoint: "Lisää datapiste", from: "Alkaen (ms tai -)", to: "Asti (ms tai +)", aggregation: "Aggregointi", timeBucket: "Aikaväli (ms)", none: "Ei mitään", dataPoints: "datapistettä", labels: "Tunnisteet", rules: "Säännöt", retention: "Säilytys", timestamp: "Aikaleima", value: "Arvo", retentionHint: "0 = ei vanhene, tai millisekunteja", duplicatePolicy: "Duplikaattikäytäntö", labelsHint: "avain1 arvo1 avain2 arvo2", timestampHint: "'*' tarkoittaa automaattista luontia, tai aikaleima millisekunteina", editAllHint: "Yksi datapiste per rivi: aikaleima arvo (aikaleima voi olla * automaattiselle)", autoSpread: "Automaattinen * hajontaväli", formula: "Kaava", formulaLinear: "Lineaarinen", formulaRandom: "Satunnainen", formulaSawtooth: "Sahalaita", formulaPoints: "Pisteet", formulaAmplitude: "Amplitudi", formulaOffset: "Siirtymä", generate: "Luo", exportChart: "Vie PNG", overlay: "Päällekkäiset avaimet", overlayHint: "Pilkuilla erotetut avaimet", mrangeFilter: "Tunnistesuodatin", bulkMode: "Massagenerointi", mrangeHint: "esim. sensor=temp" } }, treeControls: { settings: "Puun asetukset", expandAll: "Laajenna kaikki", collapseAll: "Kutista kaikki", level: "Taso", 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: { type: "Tyyppi", format: "Muoto", loading: "Ladataan...", years: "vuotta", months: "kuukautta", days: "päivää", year: "vuosi", month: "kuukausi", day: "päivä", second: "sekunti", seconds: "sekuntia", minute: "minuutti", minutes: "minuuttia", hour: "tunti", hours: "tuntia" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/fil/000077500000000000000000000000001517650670600141255ustar00rootroot00000000000000src/strings/fil/strings.js000066400000000000000000000664261517650670600161720ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Tanggalin?", deleteAllKeys: opts => { return `Tanggalin ang punong ito at lahat ng susi nito (${opts.key})?`; }, deleteSearchKeys: opts => { return `Sigurado ka bang gusto mong tanggalin ang lahat ng key na tumutugma sa "${opts.pattern}"? Nahanap ang ${opts.count} 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Tanggalin lahat ${opts.count}`, importKeys: "I-import ang mga key", deleteSearchKeys: (opts) => `Tanggalin ang ${opts.count} tumutugmang key`, saveWithFormatJson: "I-save gamit ang format", formatJson: "I-format si Json", wrap: "Balutin", unwrap: "I-unwrap", downloadJson: "I-download ang JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Translating...", aiSettings: "Mga Setting ng AI", aiGroqApiKey: "Groq API Key", aiGroqApiKeyInfo: "Opsyonal. Sariling Groq API key para sa mas magandang performance. Kumuha ng libreng key mula sa", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Na-save ang AI API key", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Hindi nakatakda (server default)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Uri", format: "Format", 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", deleteSearchHint: "Tinatanggal ang lahat ng key na tumutugma sa kasalukuyang paghahanap sa server", deletingSearchKeys: "Tinatanggal ang mga tumutugmang key...", importNoKeys: "Walang nahanap na key sa file", }, status: { dataCopied: "Ang data ay nasa clipboard", exportDone: "Kumpleto na ang export", deletedSearchKeys: (opts) => `Natanggal ang ${opts.count} key`, 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", "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." }, 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", rss: "RSS", peak: "Pinakamataas", fragmentation: "Fragmentation", hitsAndMisses: "Hits / Misses", noClients: "Walang client", }, analysis: { title: "Pagsusuri ng Memory", runAnalysis: "Patakbuhin ang Pagsusuri", running: "Sinusuri...", typeDistribution: "Distribusyon ng Uri", prefixMemory: "Memory ayon sa Prefix", topKeysByMemory: "Pinakamalaking Key ayon sa Memory", expirationOverview: "Pag-expire ng Key", memoryBreakdown: "Paghahati ng Memory", keysScanned: "Na-scan na Key", totalMemory: "Kabuuang Memory", rssMemory: "RSS Memory", peakMemory: "Pinakamataas na Memory", luaMemory: "Lua Memory", overheadMemory: "Overhead", datasetMemory: "Dataset", fragmentation: "Fragmentation", allocator: "Allocator", withTTL: "May TTL", persistent: "Permanente", avgTTL: "Average na TTL", prefix: "Prefix", keyCount: "Bilang ng Key", memoryUsage: "Paggamit ng Memory", noPrefix: "(walang prefix)", topN: "Top N", maxScanKeys: "Maks. na-scan na Key", type: "Uri", noData: "Walang data. I-click ang Patakbuhin ang Pagsusuri para magsimula.", exportAll: "I-export Lahat", }, 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" } }, timeseries: { chart: "Tsart", info: "Impormasyon", addPoint: "Magdagdag ng Data Point", from: "Mula (ms o -)", to: "Hanggang (ms o +)", aggregation: "Pagsasama-sama", timeBucket: "Timba (ms)", none: "Wala", dataPoints: "mga data point", labels: "Mga Label", rules: "Mga Panuntunan", retention: "Pagpapanatili", timestamp: "Timestamp", value: "Halaga", retentionHint: "0 = walang expiry, o milliseconds", duplicatePolicy: "Patakaran sa duplicate", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' ay nangangahulugang auto generated, o milliseconds timestamp", editAllHint: "Isang data point bawat linya: timestamp halaga (timestamp ay maaaring * para sa auto)", autoSpread: "Auto * spread interval", formula: "Formula", formulaLinear: "Linear", formulaRandom: "Random", formulaSawtooth: "Sawtooth", formulaPoints: "Mga Punto", formulaAmplitude: "Amplitude", formulaOffset: "Offset", generate: "I-generate", exportChart: "I-export ang PNG", overlay: "I-overlay ang mga susi", overlayHint: "Mga susi na pinaghihiwalay ng kuwit", mrangeFilter: "Filter ng label", bulkMode: "Bulk generate", mrangeHint: "hal. sensor=temp" } }, treeControls: { settings: "Mga setting ng puno", expandAll: "Palawakin lahat", collapseAll: "I-collapse lahat", level: "Antas", 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: { type: "Uri", format: "Format", loading: "Naglo-load...", years: "taon", months: "buwan", days: "araw", year: "taon", month: "buwan", day: "araw", second: "segundo", seconds: "mga segundo", minute: "minuto", minutes: "mga minuto", hour: "oras", hours: "mga oras" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/fr/000077500000000000000000000000001517650670600137625ustar00rootroot00000000000000src/strings/fr/strings.js000066400000000000000000000666711517650670600160310ustar00rootroot00000000000000const strings = { error: { 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 ?", delete: "Supprimer ?", deleteAllKeys: opts => { return `Supprimer cet arbre et toutes ses clés (${opts.key}) ?`; }, deleteSearchKeys: opts => { return `Êtes-vous sûr de vouloir supprimer toutes les clés correspondant à "${opts.pattern}" ? ${opts.count} clés trouvées.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Supprimer tout ${opts.count}`, importKeys: "Importer les clés", deleteSearchKeys: (opts) => `Supprimer ${opts.count} clés correspondantes`, saveWithFormatJson: "Enregistrer avec formatage", formatJson: "Formater Json", wrap: "Retour à la ligne", unwrap: "Sans retour à la ligne", downloadJson: "Télécharger JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Traduction...", aiSettings: "Paramètres IA", aiGroqApiKey: "Clé API Groq", aiGroqApiKeyInfo: "Optionnel. Votre propre clé API Groq pour de meilleures performances. Obtenez une clé gratuite sur", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Clé API IA enregistrée", aiGroqApiKeyInvalid: "Clé API Groq invalide", aiGroqApiKeyNotSet: "Non défini (par défaut du serveur)", aiEnabled: "IA activée", aiEnabledYes: "Oui", aiEnabledNo: "Non", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Les requêtes vont directement à Groq avec votre propre clé API, sans passer par network.corifeus.com.", aiRoutingNetwork: "Les requêtes IA sont acheminées via network.corifeus.com. Si vous avez votre propre clé API Groq gratuite, vous pouvez désactiver ce commutateur.", 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", 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" }, 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", type: "Type", format: "Format", 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", deleteSearchHint: "Supprimer toutes les clés correspondant à la recherche actuelle", deletingSearchKeys: "Suppression des clés correspondantes...", importNoKeys: "Aucune clé trouvée dans le fichier", }, status: { dataCopied: "Les données sont dans le presse-papiers", exportDone: "Exportation terminée", deletedSearchKeys: (opts) => `${opts.count} clés supprimées`, 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", "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." }, 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é", rss: "RSS", peak: "Maximum", fragmentation: "Fragmentation", hitsAndMisses: "Succès / Échecs", noClients: "Aucun client", }, analysis: { title: "Analyse Mémoire", runAnalysis: "Lancer l'analyse", running: "Analyse en cours...", typeDistribution: "Distribution des Types", prefixMemory: "Mémoire par Préfixe", topKeysByMemory: "Plus Grandes Clés par Mémoire", expirationOverview: "Expiration des Clés", memoryBreakdown: "Répartition Mémoire", keysScanned: "Clés Analysées", totalMemory: "Mémoire Totale", rssMemory: "Mémoire RSS", peakMemory: "Mémoire Maximale", luaMemory: "Mémoire Lua", overheadMemory: "Surcharge", datasetMemory: "Jeu de Données", fragmentation: "Fragmentation", allocator: "Allocateur", withTTL: "Avec TTL", persistent: "Persistantes", avgTTL: "TTL Moyen", prefix: "Préfixe", keyCount: "Nombre de Clés", memoryUsage: "Utilisation Mémoire", noPrefix: "(sans préfixe)", topN: "Top N", maxScanKeys: "Max. Clés Analysées", type: "Type", noData: "Aucune donnée. Cliquez sur Lancer l'analyse pour commencer.", exportAll: "Tout Exporter", }, 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" } }, timeseries: { chart: "Graphique", info: "Info", addPoint: "Ajouter un point", from: "De (ms ou -)", to: "À (ms ou +)", aggregation: "Agrégation", timeBucket: "Bucket (ms)", none: "Aucun", dataPoints: "points de données", labels: "Étiquettes", rules: "Règles", retention: "Rétention", timestamp: "Horodatage", value: "Valeur", retentionHint: "0 = pas d'expiration, ou millisecondes", duplicatePolicy: "Politique de doublons", labelsHint: "clé1 valeur1 clé2 valeur2", timestampHint: "'*' signifie généré automatiquement, ou horodatage en millisecondes", editAllHint: "Un point de données par ligne : horodatage valeur (l'horodatage peut être * pour automatique)", autoSpread: "Intervalle de diffusion automatique *", formula: "Formule", formulaLinear: "Linéaire", formulaRandom: "Aléatoire", formulaSawtooth: "Dent de scie", formulaPoints: "Points", formulaAmplitude: "Amplitude", formulaOffset: "Décalage", generate: "Générer", exportChart: "Exporter PNG", overlay: "Superposer les clés", overlayHint: "Clés séparées par des virgules", mrangeFilter: "Filtre d'étiquettes", bulkMode: "Génération en masse", mrangeHint: "ex. sensor=temp" } }, treeControls: { settings: "Paramètres de l'arbre", expandAll: "Tout développer", collapseAll: "Tout réduire", level: "Niveau", 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: { type: "Type", format: "Format", loading: "Chargement...", years: "ans", months: "mois", days: "jours", year: "an", month: "mois", day: "jour", second: "seconde", seconds: "secondes", minute: "minute", minutes: "minutes", hour: "heure", hours: "heures" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/he/000077500000000000000000000000001517650670600137475ustar00rootroot00000000000000src/strings/he/strings.js000066400000000000000000000721571517650670600160120ustar00rootroot00000000000000const strings = { error: { 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 זה?", delete: "למחוק?", deleteAllKeys: opts => { return `מחק את העץ הזה ואת כל המפתחות שלו (${opts.key})?`; }, deleteSearchKeys: opts => { return `האם אתה בטוח שברצונך למחוק את כל המפתחות התואמים ל-"${opts.pattern}"? נמצאו ${opts.count} מפתחות.`; }, 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" }, }, 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} תוצאות`, deleteAllKeysMenu: (opts) => `מחק הכל ${opts.count}`, importKeys: "ייבוא מפתחות", deleteSearchKeys: (opts) => `מחק ${opts.count} מפתחות תואמים`, saveWithFormatJson: "שמור עם פורמט", formatJson: "פורמט Json", wrap: "לעטוף", unwrap: "פתח את העטיפה", downloadJson: "הורד את JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", delete: "מחק", remove: "הסר", sure: "בטח", testConnection: "בדיקת חיבור", getKey: "טוען מפתח Redis ונתונים קשורים...", jsonViewShow: "הצג את JSON", jsonViewEditor: "ערוך את JSON", quickConsole: "קונסולה מהירה", }, label: { id: { nodeId: "מזהה צומת", id: "מזה�� חיבור", info: "אם אינך רוצה לשנות את המאפיינים של: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, אנא הזן את מזהה החיבור במאפיינים אלה כדי לשמור על ערכי הנכס ללא פגע. אם אתה רוצה את אותו היגיון בסיסמת הצומת, הזן את מזהה הצומת בסיסמת הצומת." }, secureFeature: "אם אתה רואה ערך שמתחיל ב-P3X במראה זהה, זוהי תכונה מאובטחת. כדי לשנות את ההגדרות, פשוט החליפו את ההגדרות הללו בריקות או במשהו אחר והן יישמרו. אם לא תשנה את ההגדרות, ההגדרות יישמרו כפי שהן בשרת.", aiTranslating: "מתרגם...", aiSettings: "הגדרות AI", aiGroqApiKey: "מפתח API של Groq", aiGroqApiKeyInfo: "אופציונלי. מפתח API Groq משלך לביצועים טובים יותר. קבל מפתח חינמי מ", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "מפתח API AI נשמר", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "לא הוגדר (ברירת מחדל של השרת)", aiEnabled: "AI מופעל", aiEnabledYes: "כן", aiEnabledNo: "לא", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "חיבורים", keysSort: { on: "מיון מפתחות על", off: "מיון מפתחות" }, cluster: { on: "Cluster פועל", off: "Cluster כבוי" }, sentinel: { on: "Sentinel פועל", off: "Sentinel כבוי", name: "שם Sentinel" }, readonly: { on: "המשך לקריאה בלבד", off: "כבוי לקריאה בלבד" }, 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: "זמן", type: "סוג", format: "פורמט", loading: "טוען...", autoRefresh: "אוטומטי", exportSearchHint: "מייצא רק מפתחות התואמים לחיפוש הנוכחי", importSearchHint: "הייבוא חל על כל מסד הנתונים, לא רק על תוצאות החיפוש", deleteSearchHint: "מוחק את כל המפתחות התואמים לחיפוש הנוכחי בשרת", deletingSearchKeys: "מוחק מפתחות תואמים...", importNoKeys: "לא נמצאו מפתחות בקובץ", }, status: { dataCopied: "הנתונים נמצאים בלוח", exportDone: "הייצוא הושלם", deletedSearchKeys: (opts) => `נמחקו ${opts.count} מפתחות`, 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": "אינדקס רשימה זה מחוץ לתחום", "invalid-json-value": "הערך אינו חוקי JSON.", "http_auth_required": "נדרשת הרשאה: נא לאמת עם HTTP Basic Auth וטען מחדש.", "auto-connection-failed": "ייתכן, החיבור הוסר והחיבור האוטומטי נכשל, בגלל זה.", invalid_console_command: "פקודה זו אינה פועלת דרך ה-GUI." }, 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: "אין מפתחות", rss: "RSS", peak: "שיא", fragmentation: "פרגמנטציה", hitsAndMisses: "פגיעות / החטאות", noClients: "אין לקוחות", }, analysis: { title: "ניתוח זיכרון", runAnalysis: "הפעל ניתוח", running: "מנתח...", typeDistribution: "התפלגות סוגים", prefixMemory: "זיכרון לפי קידומת", topKeysByMemory: "מפתחות גדולים לפי זיכרון", expirationOverview: "תפוגת מפתחות", memoryBreakdown: "פירוט זיכרון", keysScanned: "מפתחות שנסרקו", totalMemory: "זיכרון כולל", rssMemory: "זיכרון RSS", peakMemory: "זיכרון שיא", luaMemory: "זיכרון Lua", overheadMemory: "עלות נוספת", datasetMemory: "מערך נתונים", fragmentation: "פרגמנטציה", allocator: "מקצה", withTTL: "עם TTL", persistent: "קבועים", avgTTL: "TTL ממוצע", prefix: "קידומת", keyCount: "מספר מפתחות", memoryUsage: "שימוש בזיכרון", noPrefix: "(ללא קידומת)", topN: "Top N", maxScanKeys: "מקס. מפתחות לסריקה", type: "סוג", noData: "אין נתונים. לחץ על הפעל ניתוח כדי להתחיל.", exportAll: "ייצוא הכל", }, 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: "ערך" } }, timeseries: { chart: "תרשים", info: "מידע", addPoint: "הוסף נקודת נתונים", from: "מ- (ms או -)", to: "עד (ms או +)", aggregation: "צבירה", timeBucket: "דלי (ms)", none: "ללא", dataPoints: "נקודות נתונים", labels: "תוויות", rules: "כללים", retention: "שמירה", timestamp: "חותמת זמן", value: "ערך", retentionHint: "0 = ללא תפוגה, או מילישניות", duplicatePolicy: "מדיניות כפילויות", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' פירושו נוצר אוטומטית, או חותמת זמן במילישניות", editAllHint: "נקודת נתונים אחת בכל שורה: חותמת_זמן ערך (חותמת הזמן יכולה להיות * לאוטומטי)", autoSpread: "מרווח פיזור אוטומטי *", formula: "נוסחה", formulaLinear: "ליניארי", formulaRandom: "אקראי", formulaSawtooth: "שן מסור", formulaPoints: "נקודות", formulaAmplitude: "משרעת", formulaOffset: "היסט", generate: "צור", exportChart: "ייצא PNG", overlay: "שכבות מפתחות", overlayHint: "מפתחות מופרדים בפסיק", mrangeFilter: "סינון תוויות", bulkMode: "יצירה המונית", mrangeHint: "לדוגמה sensor=temp" } }, treeControls: { settings: "הגדרות עץ", expandAll: "הרחב הכל", collapseAll: "כווץ הכל", level: "רמה", search: { search: "חפש במפתחות", clear: "נקה את החיפוש הנוכחי כדי להגדיר ריק", placeholderClient: "חפש בצד הלקוח", placeholderServer: "חפש בצד השרת", info: "החיפוש בצד הלקוח אומר שהוא מתאים לטקסט בקלט החיפוש. פירוש החיפוש בצד השרת הוא, כלומר כמו חיפוש בתבניות המפתחות כמו *{חיפוש-טקסט}*. עבור מערכי חיפוש גדולים, עדיף להשתמש בחיפוש בצד השרת. עבור קבוצות חיפוש קטנות יותר, עדיף להשתמש במצב חיפוש בצד הלקוח." + ` אם ספירת המפתחות הסתיימה ${p3xr.settings.maxLightKeysCount}, אתה יכול לחפש רק בצד השרת.`, largeSetInfo: "בקבוצה גדולה, החיפוש בצד הלקוח מושבת. אז כרגע רק חיפוש בצד השרת אפשרי.", infoDetails: "כדי לגלות כיצד פועל החיפוש, אנא עיין בהגדרות" }, pager: { next: "הבא", prev: "הקודם", first: "ראשית", last: "אחרון" } } }, time: { type: "סוג", format: "פורמט", loading: "טוען...", years: "שנים", months: "חודשים", days: "ימים", year: "שנה", month: "חודש", day: "יום", second: "שנייה", seconds: "שניות", minute: "דקה", minutes: "דקות", hour: "שעה", hours: "שעות" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/hr/000077500000000000000000000000001517650670600137645ustar00rootroot00000000000000src/strings/hr/strings.js000066400000000000000000000642101517650670600160160ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Izbrisati?", deleteAllKeys: opts => { return `Izbriši ovo stablo i sve njegove ključeve (${opts.key})?`; }, deleteSearchKeys: opts => { return `Jeste li sigurni da želite izbrisati sve ključeve koji odgovaraju "${opts.pattern}"? Pronađeno ${opts.count} ključeva.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Izbriši sve ${opts.count}`, importKeys: "Uvezi ključeve", deleteSearchKeys: (opts) => `Izbriši ${opts.count} odgovarajućih ključeva`, saveWithFormatJson: "Spremi s formatom", formatJson: "Format Json", wrap: "Zamotati", unwrap: "Odmotajte", downloadJson: "Preuzmite JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Prevođenje...", aiSettings: "AI Postavke", aiGroqApiKey: "Groq API ključ", aiGroqApiKeyInfo: "Opcionalno. Vlastiti Groq API ključ za bolju izvedbu. Nabavite besplatni ključ na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API ključ spremljen", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Nije postavljeno (zadano poslužitelja)", aiEnabled: "AI omogućeno", aiEnabledYes: "Da", aiEnabledNo: "Ne", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tip", format: "Format", 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", deleteSearchHint: "Briše sve ključeve koji odgovaraju trenutnom pretraživanju na poslužitelju", deletingSearchKeys: "Brisanje odgovarajućih ključeva...", importNoKeys: "Nisu pronađeni ključevi u datoteci", }, status: { dataCopied: "Podaci su u međuspremniku", exportDone: "Izvoz završen", deletedSearchKeys: (opts) => `Izbrisano ${opts.count} ključeva`, 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", "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." }, 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", rss: "RSS", peak: "Vrh", fragmentation: "Fragmentacija", hitsAndMisses: "Pogoci / Promašaji", noClients: "Nema klijenata", }, analysis: { title: "Analiza memorije", runAnalysis: "Pokreni analizu", running: "Analiziranje...", typeDistribution: "Distribucija tipova", prefixMemory: "Memorija po prefiksu", topKeysByMemory: "Najveći ključevi po memoriji", expirationOverview: "Istek ključeva", memoryBreakdown: "Raspodjela memorije", keysScanned: "Skenirani ključevi", totalMemory: "Ukupna memorija", rssMemory: "RSS memorija", peakMemory: "Vršna memorija", luaMemory: "Lua memorija", overheadMemory: "Dodatno opterećenje", datasetMemory: "Skup podataka", fragmentation: "Fragmentacija", allocator: "Alokator", withTTL: "S TTL", persistent: "Trajni", avgTTL: "Prosječni TTL", prefix: "Prefiks", keyCount: "Broj ključeva", memoryUsage: "Korištenje memorije", noPrefix: "(bez prefiksa)", topN: "Top N", maxScanKeys: "Maks. skeniranih ključeva", type: "Tip", noData: "Nema podataka. Kliknite Pokreni analizu za početak.", exportAll: "Izvezi sve", }, 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" } }, timeseries: { chart: "Grafikon", info: "Informacije", addPoint: "Dodaj podatkovnu točku", from: "Od (ms ili -)", to: "Do (ms ili +)", aggregation: "Agregacija", timeBucket: "Spremnik (ms)", none: "Nema", dataPoints: "podatkovne točke", labels: "Oznake", rules: "Pravila", retention: "Zadržavanje", timestamp: "Vremenska oznaka", value: "Vrijednost", retentionHint: "0 = bez isteka, ili milisekunde", duplicatePolicy: "Pravilo dupliciranja", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' znači automatski generirano, ili milisekundna vremenska oznaka", editAllHint: "Jedna podatkovna točka po retku: vremenska_oznaka vrijednost (vremenska oznaka može biti * za automatsko)", autoSpread: "Automatski * interval širenja", formula: "Formula", formulaLinear: "Linearna", formulaRandom: "Nasumična", formulaSawtooth: "Pilasta", formulaPoints: "Točke", formulaAmplitude: "Amplituda", formulaOffset: "Pomak", generate: "Generiraj", exportChart: "Izvezi PNG", overlay: "Preklapanje ključeva", overlayHint: "Ključevi odvojeni zarezom", mrangeFilter: "Filter oznaka", bulkMode: "Masovno generiranje", mrangeHint: "npr. sensor=temp" } }, treeControls: { settings: "Postavke stabla", expandAll: "Proširi sve", collapseAll: "Sažmi sve", level: "Razina", 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: { type: "Tip", format: "Format", loading: "Učitavanje...", years: "godina", months: "mjeseca", days: "dana", year: "godine", month: "mjesec", day: "dan", second: "sekunda", seconds: "sekunde", minute: "minuta", minutes: "minute", hour: "sat", hours: "sati" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/hu/000077500000000000000000000000001517650670600137675ustar00rootroot00000000000000src/strings/hu/strings.js000066400000000000000000000647201517650670600160270ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Biztosan törölni szeretné az összes "${opts.pattern}" mintának megfelelő kulcsot? ${opts.count} kulcs található.`; }, 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.", delete: "Törlés?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Összes törlése ${opts.count}`, importKeys: "Kulcsok importálása", deleteSearchKeys: (opts) => `${opts.count} egyező kulcs törlése`, 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", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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.', aiTranslating: "Fordítás...", aiSettings: "AI Beállítások", aiGroqApiKey: "Groq API Kulcs", aiGroqApiKeyInfo: "Opcionális. Saját Groq API kulcs a jobb teljesítményért. Ingyenes kulcs beszerzése:", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI beállítások mentve", aiGroqApiKeyInvalid: "Érvénytelen Groq API kulcs", aiGroqApiKeyNotSet: "Nincs beállítva (szerver alapértelmezett)", aiEnabled: "AI engedélyezve", aiEnabledYes: "Igen", aiEnabledNo: "Nem", aiRouteViaNetwork: "Útvonal a network.corifeus.com-on keresztül", aiRoutingDirect: "A lekérdezések közvetlenül a Groq-hoz mennek a saját API kulcsoddal, megkerülve a network.corifeus.com-ot.", aiRoutingNetwork: "Az AI lekérdezések a network.corifeus.com-on keresztül kerülnek továbbításra. Ha van saját ingyenes Groq API kulcsod, kikapcsolhatod ezt a kapcsolót, hogy közvetlenül a Groq-ot használd a network.corifeus.com nélkül.", 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", 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" }, 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ő", type: "Típus", format: "Formátum", 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", deleteSearchHint: "Törli az összes kulcsot, amely megfelel az aktuális keresésnek a szerveren", deletingSearchKeys: "Egyező kulcsok törlése...", importNoKeys: "Nem található kulcs a fájlban", }, status: { dataCopied: "Az adat a vágólapon van", exportDone: "Exportálás kész", deletedSearchKeys: (opts) => `${opts.count} kulcs törölve`, 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", "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." }, 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", rss: "RSS", peak: "Csúcs", fragmentation: "Töredezettség", hitsAndMisses: "Találatok / Tévesztések", noClients: "Nincsenek kliensek", }, analysis: { title: "Memória analízis", runAnalysis: "Analízis futtatása", running: "Elemzés...", typeDistribution: "Típus eloszlás", prefixMemory: "Memória prefix szerint", topKeysByMemory: "Legnagyobb kulcsok memória szerint", expirationOverview: "Kulcs lejárat", memoryBreakdown: "Memória bontás", keysScanned: "Vizsgált kulcsok", totalMemory: "Összes memória", rssMemory: "RSS memória", peakMemory: "Csúcs memória", luaMemory: "Lua memória", overheadMemory: "Többletterhelés", datasetMemory: "Adathalmaz", fragmentation: "Töredezettség", allocator: "Allokátor", withTTL: "TTL-lel", persistent: "Állandó", avgTTL: "Átlagos TTL", prefix: "Prefix", keyCount: "Kulcsok száma", memoryUsage: "Memória használat", noPrefix: "(nincs prefix)", topN: "Top N", maxScanKeys: "Max. vizsgált kulcsok", type: "Típus", noData: "Nincs adat. Kattintson az Analízis futtatása gombra a kezdéshez.", exportAll: "Összes exportálása", }, 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" } }, timeseries: { chart: "Diagram", info: "Információ", addPoint: "Adatpont hozzáadása", from: "Ettől (ms vagy -)", to: "Eddig (ms vagy +)", aggregation: "Aggregáció", timeBucket: "Időszelet (ms)", none: "Nincs", dataPoints: "adatpontok", labels: "Címkék", rules: "Szabályok", retention: "Megőrzés", timestamp: "Időbélyeg", value: "Érték", retentionHint: "0 = nincs lejárat, vagy ezredmásodperc", duplicatePolicy: "Duplikátum-kezelés", labelsHint: "kulcs1 érték1 kulcs2 érték2", timestampHint: "'*' automatikus generálást jelent, vagy ezredmásodperc időbélyeg", editAllHint: "Soronként egy adatpont: időbélyeg érték (az időbélyeg lehet * az automatikushoz)", autoSpread: "Automatikus * szórási intervallum", formula: "Képlet", formulaLinear: "Lineáris", formulaRandom: "Véletlenszerű", formulaSawtooth: "Fűrészfog", formulaPoints: "Pontok", formulaAmplitude: "Amplitúdó", formulaOffset: "Eltolás", generate: "Generálás", exportChart: "Exportálás PNG", overlay: "Kulcsok átfedése", overlayHint: "Vesszővel elválasztott kulcsok", mrangeFilter: "Címke szűrő", bulkMode: "Tömeges generálás", mrangeHint: "pl. sensor=temp" } }, treeControls: { settings: "Fa beállítások", expandAll: "Összes kibontása", collapseAll: "Összes összecsukása", level: "Szint", 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", second: "másodperc", seconds: "másodperc", minute: "perc", minutes: "perc", hour: "óra", hours: "óra" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/hy/000077500000000000000000000000001517650670600137735ustar00rootroot00000000000000src/strings/hy/strings.js000066400000000000000000001211311517650670600160210ustar00rootroot00000000000000const strings = { error: { 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 կապը:", delete: "Ջնջե՞լ:", deleteNode: "Վստա՞հ եք ջնջելու այս Redis հանգույցը:", deleteAllKeys: opts => { return `Ջնջել այս ծառը և դրա բոլոր բանալիները (${opts.key})?`; }, deleteSearchKeys: opts => { return `Վստա՞հ եք ջնջելու բոլոր բանալիները, որոնք համապատասխանում են "${opts.pattern}"-ին? Գտնվել է ${opts.count} բանալի.`; }, 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" }, }, 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} արդյունք`, deleteAllKeysMenu: (opts) => `Delete all ${opts.count}`, importKeys: "Ներմուծել բանալիներ", deleteSearchKeys: (opts) => `Ջնջել ${opts.count} համապատասխող բանալիներ`, saveWithFormatJson: "Պահպանել ձևաչափով", formatJson: "Ձևաչափեք Json", wrap: "Փաթաթել", unwrap: "Փաթաթել", downloadJson: "Ներբեռնեք JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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: "Տատաբազա", 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", 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-ով և նման է նույն տեսքին, դա ապահով հատկություն է: Պարամետրերը փոխելու համար պարզապես փոխարինեք այս կարգավորումները դատարկ կամ այլ բանով, և դրանք կպահպանվեն: Եթե ​​դուք չեք փոխում կարգավորումները, կարգավորումները կպահվեն այնպես, ինչպես կան սերվերում:", aiTranslating: "\u0539\u0561\u0580\u0563\u0574\u0561\u0576\u0578\u0582\u0574...", aiSettings: "AI \u053f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574\u0576\u0565\u0580", aiGroqApiKey: "Groq API \u0562\u0561\u0576\u0561\u056c\u056b", aiGroqApiKeyInfo: "\u0538\u0576\u057f\u0580\u0578\u057e\u056b\u0589 \u0541\u0565\u0580 Groq API \u0562\u0561\u0576\u0561\u056c\u056b\u0576\u0589 \u0531\u0576\u057e\u0573\u0561\u0580 \u0562\u0561\u0576\u0561\u056c\u056b \u057d\u057f\u0561\u0576\u0561\u056c\u0578\u0582", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API \u0562\u0561\u0576\u0561\u056c\u056b\u0576 \u057a\u0561\u0570\u057a\u0561\u0576\u057e\u0565\u056c \u0567", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "\u054d\u0561\u0570\u0574\u0561\u0576\u057e\u0561\u056e \u0579\u0567 (\u057d\u0565\u0580\u057e\u0565\u0580\u056b \u056c\u0580\u0561\u0581\u0578\u0582\u0574)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Միացումներ", keysSort: { on: "Բանալների տեսակավորումը միացված է", off: "Բանալին դասավորվում է" }, cluster: { on: "Cluster միացված է", off: "Cluster անջատված է" }, sentinel: { on: "Sentinel միացված է", off: "Sentinel անջատված է", name: "Sentinel անունը" }, readonly: { on: "Միայն կարդալու միացված է", off: "Միայն կարդալու անջատված է" }, 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: "Ners բdelay...", importPreview: "Նախադիտարկում", importOverwrite: "Delays", importSkip: "Delays", importConflict: "Եթե բանալին արդեն գոյություն ունի:", noKeysToExport: "Արտահանման բանալիներ չկան", time: "Ժamanak", type: "Type", format: "Format", loading: "Բեռնվում է...", autoRefresh: "Ավտո", exportSearchHint: "Արտահանվում են միայն ընթացիկ որոնմանը համապատասխող բանալիները", importSearchHint: "Ներմուծումը կիրառվում է ամբողջ տվյալների բազային", deleteSearchHint: "Ջնջում է սերվերի վրա ընթացիկ որոնման համապատասխող բոլոր բանալիները", deletingSearchKeys: "Համապատասխող բանալիների ջնջում...", importNoKeys: "Ֆայլում բանալիներ չկան", }, status: { dataCopied: "Տվյալները սեղմատախտակում են", exportDone: "Արտահանումն ավարտվել է", deletedSearchKeys: (opts) => `Ջնջվել է ${opts.count} բանալի`, indexCreated: "Index ստeghts", indexDropped: "Index ջnjved", 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": "Ցուցակի այս ցուցանիշը սահմաններից դուրս է", "invalid-json-value": "Արժեքը վավեր չէ JSON:", "http_auth_required": "Պահանջվում է թույլտվություն. խնդրում ենք նույնականացնել HTTP Basic Auth-ով և վերաբեռնել:", "auto-connection-failed": "Հնարավոր է, որ կապը հեռացվել է, և ավտոմատ միացումը ձախողվել է, դրա պատճառով:", invalid_console_command: "Այս հրամանը չի աշխատում GUI-ի միջոցով:" }, 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: "Ops/վ", clients: "Հաճախորդներ", blocked: "Արգելափակված", hitsMisses: "Հարվածների տոկոս", networkIo: "Ցանց I/O", slowLog: "Դանդաղ գրանցում", totalCommands: "Ընդհանուր", expired: "Լրացած", evicted: "Հեռացված", clientList: "Հաճախորդների ցանկ", topKeys: "Մեծ բանալիներ ըստ հիշողության", killClient: "Դադարեցնել հաճախորդը", clientKilled: "Հաճախորդը դադարեցված է", confirmKillClient: "Vստah eq klientin?", noKeys: "Բանալիներ չկան", rss: "RSS", peak: "Գագաթնակետ", fragmentation: "Մասնատվածում", hitsAndMisses: "Հարվածներ / Վրիպներ", noClients: "Հաճախորդներ չկան", }, analysis: { title: "Հիշողություն վերլուծություն", runAnalysis: "Գործարկել վերլուծությունը", running: "Վերլուծում...", typeDistribution: "Տիպերի բաշսվածում", prefixMemory: "Հիշողություն ըստ նախածանցի", topKeysByMemory: "Մեծ բանալիներ ըստ հիշողության", expirationOverview: "Բանալիների ժամկետ", memoryBreakdown: "Հիշողությունի բաշսում", keysScanned: "Սկանավորված բանալիներ", totalMemory: "Ընդհանուր հիշողություն", rssMemory: "RSS հիշողություն", peakMemory: "Գագաթնակետ հիշողություն", luaMemory: "Lua հիշողություն", overheadMemory: "Լրացուցիչ ծանրաբեռնվածություն", datasetMemory: "Տվյալների հավաքածու", fragmentation: "Մասնատվածում", allocator: "Հատկացնող", withTTL: "TTL-ով", persistent: "Մշտապես", avgTTL: "Միջին TTL", prefix: "Նախածանց", keyCount: "Բանալիների քանակը", memoryUsage: "Հիշողությունի օգտագործում", noPrefix: "(առանց նախածանցի)", topN: "Top N", maxScanKeys: "Առավելագույն սկանավորման բանալիներ", type: "Տիպ", noData: "Տվյալներ չկան։ Սեղմեք Գործարկել վերլուծությունը սկսելու համար։", exportAll: "Արտահանել ամբողջը", }, 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: "Ժամdelays ID", field: "Դdelays", value: "Delays" } }, timeseries: { chart: "\u0533\u0580\u0561\u0586\u056b\u056f", info: "\u054f\u0565\u0572\u0565\u056f\u0561\u057f\u057e\u0578\u0582\u0569\u0575\u0578\u0582\u0576", addPoint: "\u0531\u057e\u0565\u056c\u0561\u0581\u0576\u0565\u056c \u057f\u057e\u0575\u0561\u056c\u0576\u0565\u0580\u056b \u056f\u0565\u057f", from: "\u054d\u056f\u0566\u0562\u056b\u0581 (ms \u056f\u0561\u0574 -)", to: "\u0544\u056b\u0576\u0579\u0587 (ms \u056f\u0561\u0574 +)", aggregation: "\u0540\u0561\u057e\u0561\u0584\u0561\u056f\u0581\u0578\u0582\u0574", timeBucket: "\u054d\u057e\u0565\u0564 (ms)", none: "\u0548\u0579", dataPoints: "\u057f\u057e\u0575\u0561\u056c\u0576\u0565\u0580\u056b \u056f\u0565\u057f\u0565\u0580", labels: "\u054a\u056b\u057f\u0561\u056f\u0576\u0565\u0580", rules: "\u053f\u0561\u0576\u0578\u0576\u0576\u0565\u0580", retention: "\u054a\u0561\u0570\u057a\u0561\u0576\u0578\u0582\u0574", timestamp: "\u053a\u0561\u0574\u0561\u0576\u0561\u056f\u0561\u057e\u0578\u0580 \u0564\u0580\u0578\u0577\u0574\u0561\u056f", value: "\u0531\u0580\u056a\u0565\u0584", retentionHint: "0 = \u0561\u057c\u0561\u0576\u0581 \u056a\u0561\u0574\u056f\u0565\u057f\u056b \u0561\u057e\u0561\u0580\u057f\u056b, \u056f\u0561\u0574 \u0574\u056b\u056c\u056b\u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576\u0576\u0565\u0580", duplicatePolicy: "\u053f\u0580\u056f\u0576\u0585\u0580\u056b\u0576\u0561\u056f\u0576\u0565\u0580\u056b \u0584\u0561\u0572\u0561\u0584\u0561\u056f\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' \u0576\u0577\u0561\u0576\u0561\u056f\u0578\u0582\u0574 \u0567 \u056b\u0576\u0584\u0576\u0561\u0563\u0565\u0576\u0565\u0580\u0561\u0581\u057e\u0561\u056e, \u056f\u0561\u0574 \u0574\u056b\u056c\u056b\u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576\u0576\u0565\u0580\u056b \u056a\u0561\u0574\u0561\u0576\u0561\u056f\u0561\u057e\u0578\u0580 \u0564\u0580\u0578\u0577\u0574\u0561\u056f", editAllHint: "\u0544\u0565\u056f \u057f\u057e\u0575\u0561\u056c\u0576\u0565\u0580\u056b \u056f\u0565\u057f \u0574\u0565\u056f \u057f\u0578\u0572\u0578\u0582\u0574\u0589 \u056a\u0561\u0574\u0561\u0576\u0561\u056f\u0561\u057e\u0578\u0580_\u0564\u0580\u0578\u0577\u0574\u0561\u056f \u0561\u0580\u056a\u0565\u0584 (\u056a\u0561\u0574\u0561\u0576\u0561\u056f\u0561\u057e\u0578\u0580 \u0564\u0580\u0578\u0577\u0574\u0561\u056f\u0568 \u056f\u0561\u0580\u0578\u0572 \u0567 \u056c\u056b\u0576\u0565\u056c * \u056b\u0576\u0584\u0576\u0561\u0563\u0565\u0576\u0565\u0580\u0561\u0581\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580)", autoSpread: "\u053b\u0576\u0584\u0576\u0561 * \u057f\u0561\u0580\u0561\u056e\u0574\u0561\u0576 \u0574\u056b\u057b\u0561\u056f\u0561\u0575\u0584", formula: "\u0532\u0561\u0576\u0561\u0571\u0587", formulaLinear: "\u0533\u056e\u0561\u0575\u056b\u0576", formulaRandom: "\u054a\u0561\u057f\u0561\u0570\u0561\u056f\u0561\u0576", formulaSawtooth: "\u054d\u0572\u0578\u0581\u0561\u0571\u0587", formulaPoints: "\u053f\u0565\u057f\u0565\u0580", formulaAmplitude: "\u0531\u0574\u057a\u056c\u056b\u057f\u0578\u0582\u0564", formulaOffset: "\u054f\u0565\u0572\u0561\u0577\u0561\u0580\u056a", generate: "\u0533\u0565\u0576\u0565\u0580\u0561\u0581\u0576\u0565\u056c", exportChart: "\u0531\u0580\u057f\u0561\u0570\u0561\u0576\u0565\u056c PNG", overlay: "\u054e\u0580\u0561\u0564\u0580\u0565\u056c \u057d\u057f\u0565\u0572\u0576\u0565\u0580\u0568", overlayHint: "\u054d\u057f\u0565\u0572\u0576\u0565\u0580\u0568 \u057d\u057f\u0578\u0580\u0561\u056f\u0565\u057f\u0578\u057e \u0561\u0576\u057b\u0561\u057f\u057e\u0561\u056e", mrangeFilter: "\u054a\u056b\u057f\u0561\u056f\u0576\u0565\u0580\u056b \u0566\u057f\u056b\u0579", bulkMode: "Bulk generate", mrangeHint: "\u0585\u0580. sensor=temp" } }, treeControls: { settings: "\u053e\u0561\u057c\u056b \u056f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574\u0576\u0565\u0580\u0568", expandAll: "\u0538\u0576\u0564\u056c\u0561\u0575\u0576\u0565\u056c \u0562\u0578\u056c\u0578\u0580\u0568", collapseAll: "\u0553\u056c\u0578\u0582\u0566\u0565\u056c \u0562\u0578\u056c\u0578\u0580\u0568", level: "Մակdelays", search: { search: "\u0548\u0580\u0578\u0576\u0565\u056c \u057d\u057f\u0565\u0572\u0576\u0565\u0580\u056b \u0574\u0565\u057b", clear: "\u0544\u0561\u0584\u0580\u0565\u056c \u0568\u0576\u0569\u0561\u0581\u056b\u056f \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0568 \u0564\u0561\u057f\u0561\u0580\u056f \u057f\u0565\u0572\u0561\u0564\u0580\u0565\u056c\u0578\u0582 \u0570\u0561\u0574\u0561\u0580", placeholderClient: "\u0548\u0580\u0578\u0576\u0565\u056c \u0570\u0561\u0573\u0561\u056d\u0578\u0580\u0564\u056b \u056f\u0578\u0572\u0574\u0568", placeholderServer: "\u0548\u0580\u0578\u0576\u0565\u056c \u057d\u0565\u0580\u057e\u0565\u0580\u056b \u056f\u0578\u0572\u0574\u0568", info: "\u0540\u0561\u0573\u0561\u056d\u0578\u0580\u0564\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0568 \u0576\u0577\u0561\u0576\u0561\u056f\u0578\u0582\u0574 \u0567, \u0578\u0580 \u0561\u0575\u0576 \u0570\u0561\u0574\u0561\u057a\u0561\u057f\u0561\u057d\u056d\u0561\u0576\u0578\u0582\u0574 \u0567 \u0578\u0580\u0578\u0576\u0574\u0561\u0576 \u0574\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u0574\u0561\u0576 \u057f\u0565\u0584\u057d\u057f\u056b\u0576: \u054d\u0565\u0580\u057e\u0565\u0580\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0568 \u0576\u0577\u0561\u0576\u0561\u056f\u0578\u0582\u0574 \u0567, \u0578\u0580 \u0564\u0561 \u0576\u0574\u0561\u0576 \u0567 \u057d\u057f\u0565\u0572\u0576\u0565\u0580\u056b \u0585\u0580\u056b\u0576\u0561\u0579\u0561\u0583\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0576\u0565\u0580\u056b \u0578\u0580\u0578\u0576\u0574\u0561\u0576\u0568 \u0578\u0580\u057a\u0565\u057d *{search-text}*: \u0544\u0565\u056e \u0578\u0580\u0578\u0576\u0574\u0561\u0576 \u056d\u0574\u0562\u0565\u0580\u056b \u0570\u0561\u0574\u0561\u0580 \u0561\u057e\u0565\u056c\u056b \u056c\u0561\u057e \u0567 \u0585\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u056c \u057d\u0565\u0580\u057e\u0565\u0580\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0568: \u0531\u057e\u0565\u056c\u056b \u0583\u0578\u0584\u0580 \u0578\u0580\u0578\u0576\u0574\u0561\u0576 \u056d\u0574\u0562\u0565\u0580\u056b \u0570\u0561\u0574\u0561\u0580 \u0561\u057e\u0565\u056c\u056b \u056c\u0561\u057e \u0567 \u0585\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u056c \u0570\u0561\u0573\u0561\u056d\u0578\u0580\u0564\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0574\u0561\u0576 \u057c\u0565\u056a\u056b\u0574\u0568:" + ` \u0535\u0569\u0565 \u0562\u0561\u0576\u0561\u056c\u056b\u0576\u0565\u0580\u056b \u0570\u0561\u0577\u057e\u0561\u0580\u056f\u0576 \u0561\u057e\u0561\u0580\u057f\u057e\u0561\u056e \u0567 ${p3xr.settings.maxLightKeysCount}, \u056f\u0561\u0580\u0578\u0572 \u0565\u0584 \u0578\u0580\u0578\u0576\u0565\u056c \u0574\u056b\u0561\u0575\u0576 \u057d\u0565\u0580\u057e\u0565\u0580\u056b \u056f\u0578\u0572\u0574\u056b\u0581:`, largeSetInfo: "\u0544\u0565\u056e \u0570\u0561\u057e\u0561\u0584\u0561\u056e\u0578\u0582\u0578\u0582\u0574 \u0570\u0561\u0573\u0561\u056d\u0578\u0580\u0564\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0576 \u0561\u0576\u057b\u0561\u057f\u057e\u0561\u056e \u0567: \u0561\u0575\u0576\u057a\u0565\u057d \u0578\u0580 \u0561\u0575\u057d \u057a\u0561\u0570\u056b\u0576 \u0570\u0576\u0561\u0580\u0561\u057e\u0578\u0580 \u0567 \u0574\u056b\u0561\u0575\u0576 \u057d\u0565\u0580\u057e\u0565\u0580\u056b \u056f\u0578\u0572\u0574\u056b\u0581 \u0578\u0580\u0578\u0576\u0578\u0582\u0574:", infoDetails: "\u054a\u0561\u0580\u0566\u0565\u056c\u0578\u0582 \u0570\u0561\u0574\u0561\u0580, \u0569\u0565 \u056b\u0576\u0579\u057a\u0565\u057d \u0567 \u0561\u0577\u056d\u0561\u057f\u0578\u0582\u0574 \u0578\u0580\u0578\u0576\u0578\u0582\u0574\u0568, \u056d\u0576\u0564\u0580\u0578\u0582\u0574 \u0565\u0576\u0584 \u057d\u057f\u0578\u0582\u0563\u0565\u056c \u056f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574\u0576\u0565\u0580\u0568" }, pager: { next: "\u0540\u0561\u057b\u0578\u0580\u0564\u0568", prev: "\u0546\u0561\u056d\u0578\u0580\u0564", first: "\u0531\u057c\u0561\u057b\u056b\u0576", last: "\u054e\u0565\u0580\u057b\u056b\u0576" } } }, time: { type: "Type", format: "Format", loading: "\u0532\u0565\u057c\u0576\u057e\u0578\u0582\u0574 \u0567...", years: "\u057f\u0561\u0580\u056b\u0576\u0565\u0580", months: "\u0561\u0574\u056b\u057d\u0576\u0565\u0580", days: "\u0585\u0580\u0565\u0580", year: "\u057f\u0561\u0580\u056b\u0576", month: "\u0561\u0574\u056b\u057d", day: "\u0585\u0580", second: "\u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576", seconds: "\u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576\u0576\u0565\u0580", minute: "\u0580\u0578\u057a\u0565", minutes: "\u0580\u0578\u057a\u0565\u0576\u0565\u0580", hour: "\u056a\u0561\u0574", hours: "\u056a\u0561\u0574\u0565\u0580" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/id/000077500000000000000000000000001517650670600137475ustar00rootroot00000000000000src/strings/id/strings.js000066400000000000000000000631721517650670600160070ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Hapus?", deleteAllKeys: opts => { return `Hapus pohon ini dan semua kuncinya (${opts.key})?`; }, deleteSearchKeys: opts => { return `Apakah Anda yakin ingin menghapus semua kunci yang cocok dengan "${opts.pattern}"? Ditemukan ${opts.count} kunci.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Hapus semua ${opts.count}`, importKeys: "Impor kunci", deleteSearchKeys: (opts) => `Hapus ${opts.count} kunci yang cocok`, saveWithFormatJson: "Simpan dengan format", formatJson: "Format JSON", wrap: "Bungkus", unwrap: "Buka bungkusnya", downloadJson: "Unduh JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Menerjemahkan...", aiSettings: "Pengaturan AI", aiGroqApiKey: "Kunci API Groq", aiGroqApiKeyInfo: "Opsional. Kunci API Groq sendiri untuk performa lebih baik. Dapatkan kunci gratis dari", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Kunci API AI tersimpan", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Belum diatur (bawaan server)", aiEnabled: "AI diaktifkan", aiEnabledYes: "Ya", aiEnabledNo: "Tidak", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tipe", format: "Format", loading: "Memuat...", autoRefresh: "Otomatis", exportSearchHint: "Mengekspor hanya kunci yang cocok dengan pencarian saat ini", importSearchHint: "Impor berlaku untuk seluruh database, bukan hanya hasil pencarian", deleteSearchHint: "Menghapus semua kunci yang cocok dengan pencarian saat ini di server", deletingSearchKeys: "Menghapus kunci yang cocok...", importNoKeys: "Tidak ditemukan kunci dalam file", }, status: { dataCopied: "Datanya ada di clipboard", exportDone: "Ekspor selesai", deletedSearchKeys: (opts) => `${opts.count} kunci dihapus`, 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", "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." }, 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", rss: "RSS", peak: "Puncak", fragmentation: "Fragmentasi", hitsAndMisses: "Hit / Miss", noClients: "Tidak ada klien", }, analysis: { title: "Analisis Memori", runAnalysis: "Jalankan Analisis", running: "Menganalisis...", typeDistribution: "Distribusi Tipe", prefixMemory: "Memori berdasarkan Prefiks", topKeysByMemory: "Kunci Terbesar berdasarkan Memori", expirationOverview: "Kedaluwarsa Kunci", memoryBreakdown: "Rincian Memori", keysScanned: "Kunci Dipindai", totalMemory: "Total Memori", rssMemory: "Memori RSS", peakMemory: "Memori Puncak", luaMemory: "Memori Lua", overheadMemory: "Overhead", datasetMemory: "Dataset", fragmentation: "Fragmentasi", allocator: "Pengalokasi", withTTL: "Dengan TTL", persistent: "Permanen", avgTTL: "Rata-rata TTL", prefix: "Prefiks", keyCount: "Jumlah Kunci", memoryUsage: "Penggunaan Memori", noPrefix: "(tanpa prefiks)", topN: "Top N", maxScanKeys: "Maks. Kunci Dipindai", type: "Tipe", noData: "Tidak ada data. Klik Jalankan Analisis untuk memulai.", exportAll: "Ekspor Semua", }, 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" } }, timeseries: { chart: "Grafik", info: "Info", addPoint: "Tambah Titik Data", from: "Dari (ms atau -)", to: "Ke (ms atau +)", aggregation: "Agregasi", timeBucket: "Ember (ms)", none: "Tidak ada", dataPoints: "titik data", labels: "Label", rules: "Aturan", retention: "Retensi", timestamp: "Stempel waktu", value: "Nilai", retentionHint: "0 = tidak kedaluwarsa, atau milidetik", duplicatePolicy: "Kebijakan duplikat", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' berarti dibuat otomatis, atau stempel waktu milidetik", editAllHint: "Satu titik data per baris: stempel_waktu nilai (stempel waktu bisa * untuk otomatis)", autoSpread: "Interval penyebaran otomatis *", formula: "Rumus", formulaLinear: "Linier", formulaRandom: "Acak", formulaSawtooth: "Gigi gergaji", formulaPoints: "Titik", formulaAmplitude: "Amplitudo", formulaOffset: "Offset", generate: "Hasilkan", exportChart: "Ekspor PNG", overlay: "Overlay kunci", overlayHint: "Kunci dipisahkan koma", mrangeFilter: "Filter label", bulkMode: "Pembuatan massal", mrangeHint: "mis. sensor=temp" } }, treeControls: { settings: "Pengaturan pohon", expandAll: "Perluas semuanya", collapseAll: "Ciutkan semuanya", level: "Tingkat", 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: { type: "Tipe", format: "Format", loading: "Memuat...", years: "tahun", months: "bulan", days: "hari", year: "tahun", month: "bulan", day: "hari", second: "detik", seconds: "detik", minute: "menit", minutes: "menit", hour: "jam", hours: "jam" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/it/000077500000000000000000000000001517650670600137675ustar00rootroot00000000000000src/strings/it/strings.js000066400000000000000000000641761517650670600160340ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Eliminare?", deleteAllKeys: opts => { return `Eliminare questo albero e tutte le sue chiavi (${opts.key})?`; }, deleteSearchKeys: opts => { return `Sei sicuro di voler eliminare tutte le chiavi corrispondenti a "${opts.pattern}"? Trovate ${opts.count} chiavi.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Elimina tutto ${opts.count}`, importKeys: "Importa chiavi", deleteSearchKeys: (opts) => `Elimina ${opts.count} chiavi corrispondenti`, saveWithFormatJson: "Salva con formato", formatJson: "Formatta JSON", wrap: "A capo", unwrap: "Non a capo", downloadJson: "Scarica JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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.', aiTranslating: "Traduzione...", aiSettings: "Impostazioni IA", aiGroqApiKey: "Chiave API Groq", aiGroqApiKeyInfo: "Opzionale. La propria chiave API Groq per prestazioni migliori. Ottieni una chiave gratuita da", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Chiave API IA salvata", aiGroqApiKeyInvalid: "Chiave API Groq non valida", aiGroqApiKeyNotSet: "Non impostato (predefinito del server)", aiEnabled: "IA abilitata", aiEnabledYes: "Sì", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Le query vanno direttamente a Groq usando la propria chiave API, senza passare per network.corifeus.com.", aiRoutingNetwork: "Le query AI vengono instradate tramite network.corifeus.com. Se hai la tua chiave API Groq gratuita, puoi disattivare questo interruttore.", 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", 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" }, 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", type: "Tipo", format: "Formato", 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", deleteSearchHint: "Elimina tutte le chiavi corrispondenti alla ricerca corrente", deletingSearchKeys: "Eliminazione delle chiavi corrispondenti...", importNoKeys: "Nessuna chiave trovata nel file", }, status: { dataCopied: "I dati sono negli appunti", exportDone: "Esportazione completata", deletedSearchKeys: (opts) => `${opts.count} chiavi eliminate`, 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", "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." }, 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", rss: "RSS", peak: "Picco", fragmentation: "Frammentazione", hitsAndMisses: "Successi / Mancati", noClients: "Nessun client", }, analysis: { title: "Analisi Memoria", runAnalysis: "Esegui Analisi", running: "Analisi in corso...", typeDistribution: "Distribuzione Tipi", prefixMemory: "Memoria per Prefisso", topKeysByMemory: "Chiavi Più Grandi per Memoria", expirationOverview: "Scadenza Chiavi", memoryBreakdown: "Dettaglio Memoria", keysScanned: "Chiavi Analizzate", totalMemory: "Memoria Totale", rssMemory: "Memoria RSS", peakMemory: "Memoria di Picco", luaMemory: "Memoria Lua", overheadMemory: "Overhead", datasetMemory: "Dataset", fragmentation: "Frammentazione", allocator: "Allocatore", withTTL: "Con TTL", persistent: "Persistenti", avgTTL: "TTL Medio", prefix: "Prefisso", keyCount: "Conteggio Chiavi", memoryUsage: "Utilizzo Memoria", noPrefix: "(senza prefisso)", topN: "Top N", maxScanKeys: "Max. Chiavi Analizzate", type: "Tipo", noData: "Nessun dato. Clicca Esegui Analisi per iniziare.", exportAll: "Esporta Tutto", }, 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" } }, timeseries: { chart: "Grafico", info: "Info", addPoint: "Aggiungi punto", from: "Da (ms o -)", to: "A (ms o +)", aggregation: "Aggregazione", timeBucket: "Bucket (ms)", none: "Nessuno", dataPoints: "punti dati", labels: "Etichette", rules: "Regole", retention: "Conservazione", timestamp: "Timestamp", value: "Valore", retentionHint: "0 = nessuna scadenza, o millisecondi", duplicatePolicy: "Politica duplicati", labelsHint: "chiave1 valore1 chiave2 valore2", timestampHint: "'*' significa generato automaticamente, o timestamp in millisecondi", editAllHint: "Un punto dati per riga: timestamp valore (il timestamp può essere * per automatico)", autoSpread: "Intervallo di diffusione automatico *", formula: "Formula", formulaLinear: "Lineare", formulaRandom: "Casuale", formulaSawtooth: "Dente di sega", formulaPoints: "Punti", formulaAmplitude: "Ampiezza", formulaOffset: "Offset", generate: "Genera", exportChart: "Esporta PNG", overlay: "Sovrapponi chiavi", overlayHint: "Chiavi separate da virgola", mrangeFilter: "Filtro etichette", bulkMode: "Generazione di massa", mrangeHint: "es. sensor=temp" } }, treeControls: { settings: "Impostazioni albero", expandAll: "Espandi tutto", collapseAll: "Comprimi tutto", level: "Livello", 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: { type: "Tipo", format: "Formato", loading: "Caricamento...", years: "anni", months: "mesi", days: "giorni", year: "anno", month: "mese", day: "giorno", second: "secondo", seconds: "secondi", minute: "minuto", minutes: "minuti", hour: "ora", hours: "ore" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ja/000077500000000000000000000000001517650670600137455ustar00rootroot00000000000000src/strings/ja/strings.js000066400000000000000000000713761517650670600160120ustar00rootroot00000000000000const strings = { error: { 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ノードを削除してもよろしいですか?", delete: "削除しますか?", deleteAllKeys: opts => { return `このツリーとすべてのキーを削除しますか (${opts.key})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" に一致するすべてのキーを削除してもよろしいですか? ${opts.count} 件のキーが見つかりました。`; }, 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になります" }, }, 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} 件の結果をエクスポート`, deleteAllKeysMenu: (opts) => `すべて削除 ${opts.count}`, importKeys: "キーをインポート", deleteSearchKeys: (opts) => `一致する ${opts.count} 件のキーを削除`, saveWithFormatJson: "フォーマット付きで保存", formatJson: "JSONをフォーマット", wrap: "折り返し", unwrap: "折り返しなし", downloadJson: "JSONダウンロード", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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を設定", 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で始まる同じように見える値がある場合、それはセキュリティ機能です。設定を変更するには、これらの設定を空または他の値に置き換えると保存されます。設定を変更しない場合、サーバー上のまま維持されます。', aiTranslating: "翻訳中...", aiSettings: "AI 設定", aiGroqApiKey: "Groq API キー", aiGroqApiKeyInfo: "任意。自分のGroq APIキーでパフォーマンス向上。無料キーの取得先", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI APIキーを保存しました", aiGroqApiKeyInvalid: "無効なGroq APIキー", aiGroqApiKeyNotSet: "未設定(サーバーデフォルト)", aiEnabled: "AI 有効", aiEnabledYes: "はい", aiEnabledNo: "いいえ", aiRouteViaNetwork: "network.corifeus.com経由", aiRoutingDirect: "自分のAPIキーを使用してGroqに直接クエリを送信します。network.corifeus.comを経由しません。", aiRoutingNetwork: "AIクエリはnetwork.corifeus.comを経由します。無料のGroq APIキーをお持ちの場合、このスイッチをオフにして直接Groqを使用できます。", 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: "接続", keysSort: { on: "キーソート オン", off: "キーソート オフ" }, cluster: { on: "クラスター オン", off: "クラスター オフ" }, sentinel: { on: "Sentinel オン", off: "Sentinel オフ", name: "Sentinel名" }, readonly: { on: "読み取り専用 オン", off: "読み取り専用 オフ" }, 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: "時間", type: "タイプ", format: "フォーマット", loading: "読み込み中...", autoRefresh: "自動", exportSearchHint: "現在の検索に一致するキーのみをエクスポート", importSearchHint: "インポートは検索結果だけでなくデータベース全体に適用されます", deleteSearchHint: "現在の検索に一致するすべてのキーを削除", deletingSearchKeys: "一致するキーを削除中...", importNoKeys: "ファイルにキーが見つかりません", }, status: { dataCopied: "データがクリップボードにコピーされました", exportDone: "エクスポート完了", deletedSearchKeys: (opts) => `${opts.count} 件のキーを削除しました`, 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": "このリストインデックスは範囲外です", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "認証が必要です。HTTP Basic Authで認証し、再読み込みしてください。", "auto-connection-failed": "接続が削除された可能性があり、そのため自動接続に失敗しました。", invalid_console_command: "このコマンドはGUIでは動作しません。" }, 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: "キーがありません", rss: "RSS", peak: "ピーク", fragmentation: "フラグメンテーション", hitsAndMisses: "ヒット / ミス", noClients: "クライアントがありません", }, analysis: { title: "メモリ分析", runAnalysis: "分析を実行", running: "分析中...", typeDistribution: "タイプ分布", prefixMemory: "プレフィックス別メモリ", topKeysByMemory: "メモリ上位キー", expirationOverview: "キー有効期限", memoryBreakdown: "メモリ内訳", keysScanned: "スキャン済みキー", totalMemory: "合計メモリ", rssMemory: "RSSメモリ", peakMemory: "ピークメモリ", luaMemory: "Luaメモリ", overheadMemory: "オーバーヘッド", datasetMemory: "データセット", fragmentation: "フラグメンテーション", allocator: "アロケータ", withTTL: "TTLあり", persistent: "永続", avgTTL: "平均TTL", prefix: "プレフィックス", keyCount: "キー数", memoryUsage: "メモリ使用量", noPrefix: "(プレフィックスなし)", topN: "Top N", maxScanKeys: "最大スキャンキー数", type: "タイプ", noData: "データがありません。分析を実行をクリックして開始してください。", exportAll: "すべてエクスポート", }, 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: "値" } }, timeseries: { chart: "チャート", info: "情報", addPoint: "ポイント追加", from: "開始 (ms または -)", to: "終了 (ms または +)", aggregation: "集計", timeBucket: "バケット (ms)", none: "なし", dataPoints: "データポイント", labels: "ラベル", rules: "ルール", retention: "保持期間", timestamp: "タイムスタンプ", value: "値", retentionHint: "0 = 有効期限なし、またはミリ秒", duplicatePolicy: "重複ポリシー", labelsHint: "キー1 値1 キー2 値2", timestampHint: "'*' は自動生成、またはミリ秒タイムスタンプ", editAllHint: "1行に1データポイント: タイムスタンプ 値 (タイムスタンプは自動の場合 * を使用)", autoSpread: "自動 * 分散間隔", formula: "数式", formulaLinear: "リニア", formulaRandom: "ランダム", formulaSawtooth: "ノコギリ波", formulaPoints: "ポイント", formulaAmplitude: "振幅", formulaOffset: "オフセット", generate: "生成", exportChart: "PNG エクスポート", overlay: "キーを重ねる", overlayHint: "カンマ区切りのキー", mrangeFilter: "ラベルフィルター", bulkMode: "一括生成", mrangeHint: "例: sensor=temp" } }, treeControls: { settings: "ツリー設定", expandAll: "すべて展開", collapseAll: "すべて折りたたむ", level: "レベル", search: { search: "キー内を検索", clear: "現在の検索をクリア", placeholderClient: "クライアント側で検索", placeholderServer: "サーバー側で検索", info: "クライアント側検索は、検索入力のテキストに一致します。サーバー側検索は、*{検索テキスト}*のようなキーパターンで検索します。大きな検索セットではサーバー側検索が適しています。小さな検索セットではクライアント側検索が適しています。" + ` キー数が${p3xr.settings.maxLightKeysCount}を超える場合、サーバー側でのみ検索できます。`, largeSetInfo: "大きなデータセットでは、クライアント側検索は無効になっており、現在サーバー側検索のみ可能です。", infoDetails: "検索の仕組みについては、設定を確認してください" }, pager: { next: "次へ", prev: "前へ", first: "最初", last: "最後" } } }, time: { type: "タイプ", format: "フォーマット", loading: "読み込み中...", years: "年", months: "ヶ月", days: "日", year: "年", month: "ヶ月", day: "日", second: "秒", seconds: "秒", minute: "分", minutes: "分", hour: "時間", hours: "時間" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ka/000077500000000000000000000000001517650670600137465ustar00rootroot00000000000000src/strings/ka/strings.js000066400000000000000000001332211517650670600157770ustar00rootroot00000000000000const strings = { error: { 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 კავშირი?", delete: "\u10ec\u10d0\u10e8\u10da\u10d0?", deleteNode: "დარწმუნებული ხართ, რომ წაშლით ამ Redis კვანძს?", deleteAllKeys: opts => { return `წაშალე ეს ხე და მისი ყველა გასაღები (${opts.key})?`; }, deleteSearchKeys: opts => { return `დარწმუნებული ხართ, რომ წაშლით ყველა გასაღებს, რომლებიც ემთხვევა "${opts.pattern}"-ს? ნაპოვნია ${opts.count} გასაღები.`; }, 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" }, }, 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} შედეგის ექსპორტი`, deleteAllKeysMenu: (opts) => `ყველას წაშლა ${opts.count}`, importKeys: "გასაღებების იმპორტი", deleteSearchKeys: (opts) => `${opts.count} შესაბამისი გასაღების წაშლა`, saveWithFormatJson: "შეინახეთ ფორმატით", formatJson: "ფორმატი Json", wrap: "შეფუთვა", unwrap: "გაშალეთ", downloadJson: "ჩამოტვირთეთ JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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-ით, იგივე გამოიყურება, ეს უსაფრთხო ფუნქციაა. პარამეტრების შესაცვლელად, უბრალოდ შეცვალეთ ეს პარამეტრები ცარიელი ან ს��ვა რამით და ისინი შეინახება. თუ არ შეცვლით პარამეტრებს, პარამეტრები შენარჩუნდება როგორც სერვერზეა.", aiTranslating: "Translating...", aiSettings: "AI პარამეტრები", aiGroqApiKey: "Groq API გასაღები", aiGroqApiKeyInfo: "არასავალდებულო. თქვენი Groq API გასაღები უკეთესი წარმადობისთვის. მიიღეთ უფასო გასაღები", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API გასაღები შენახულია", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "არ არის დაყენებული (სერვერის ნაგულისხმევი)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "კავშირები", keysSort: { on: "გასაღების დახარისხება ჩართულია", off: "გასაღების დახარისხება" }, cluster: { on: "Cluster ჩართულია", off: "Cluster გამორთულია" }, sentinel: { on: "Sentinel ჩართულია", off: "Sentinel გამორთულია", name: "Sentinel სახელი" }, readonly: { on: "მხოლოდ წაკითხვაზე", off: "მხოლოდ წასაკითხად გამორთულია" }, 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: "დრო", type: "ტიპი", format: "ფორმატი", loading: "იტvirtheba...", autoRefresh: "ავტო", exportSearchHint: "ექსპორტი მხოლოდ მიმდინარე ძიებას შესაბამისი გასაღebebis", importSearchHint: "იმპორტი ვრცeldeba მთელ მონაცემთა ბაზაზე", deleteSearchHint: "სერვერზე მიმდინარე ძიების შესაბამისი ყველა გასაღების წაშლა", deletingSearchKeys: "შესაბამისი გასაღebebis წdelays...", importNoKeys: "ფაილში გასაღebebi ვერ მოიძებna", }, status: { dataCopied: "მონაცემები ბუფერშია", exportDone: "ექსპორტი დასრულda", deletedSearchKeys: (opts) => `წაშლილია ${opts.count} გასაღები`, 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": "ეს სიის ინდექსი საზღვრებს გარეთაა", "invalid-json-value": "მნიშვნელობა არ არის სწორი JSON.", "http_auth_required": "საჭიროა ავტორიზაცია: გთხოვთ, გადაამოწმოთ ავთენტიფიკაცია HTTP Basic Auth-ით და გადატვირთეთ.", "auto-connection-failed": "შესაძლებელია, კავშირი წაიშალა და ავტომატური კავშირი ვერ მოხერხდა ამის გამო.", invalid_console_command: "ეს ბრძანება არ მუშაობს GUI-ით." }, 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 არ არის", rss: "RSS", peak: "პიკი", fragmentation: "ფრაგმენტაცია", hitsAndMisses: "მოხვედრები / გაცდენები", noClients: "კლიენტebi არ არის", }, analysis: { title: "მეხსიერების ანალიზი", runAnalysis: "ანალიზის გაშვება", running: "ანალიზდება...", typeDistribution: "ტიპების განაწილება", prefixMemory: "მეხსიერება პრეფიქსით", topKeysByMemory: "უდიდესი გასაღებები მეხსიერებით", expirationOverview: "გასაღებების ვადა", memoryBreakdown: "მეხსიერების დეტალები", keysScanned: "სკანირებული გასაღებები", totalMemory: "სრული მეხსიერება", rssMemory: "RSS მეხსიერება", peakMemory: "პიკური მეხსიერება", luaMemory: "Lua მეხსიერება", overheadMemory: "ზედნადები", datasetMemory: "მონაცემთა ნაკრები", fragmentation: "ფრაგმენტაცია", allocator: "ალოკატორი", withTTL: "TTL-ით", persistent: "მუდმივი", avgTTL: "საშუალო TTL", prefix: "პრეფიქსი", keyCount: "გასაღებების რაოდენობა", memoryUsage: "მეხსიერების მოხმარება", noPrefix: "(პრეფიქსის გარეშე)", topN: "Top N", maxScanKeys: "მაქს. სკანირებული გასაღებები", type: "ტიპი", noData: "მონაცემები არ არის. დააწკაპუნეთ ანალიზის გაშვება დასაწყებად.", exportAll: "ყველას ექსპორტი", }, 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: "��ირებულება" } }, timeseries: { chart: "\u10d3\u10d8\u10d0\u10d2\u10e0\u10d0\u10db\u10d0", info: "\u10d8\u10dc\u10e4\u10dd\u10e0\u10db\u10d0\u10ea\u10d8\u10d0", addPoint: "\u10db\u10dd\u10dc\u10d0\u10ea\u10d4\u10db\u10d7\u10d0 \u10ec\u10d4\u10e0\u10e2\u10d8\u10da\u10d8\u10e1 \u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d0", from: "\u10e1\u10d0\u10d8\u10d3\u10d0\u10dc (ms \u10d0\u10dc -)", to: "\u10db\u10d3\u10d4 (ms \u10d0\u10dc +)", aggregation: "\u10d0\u10d2\u10e0\u10d4\u10d2\u10d0\u10ea\u10d8\u10d0", timeBucket: "\u10d7\u10d0\u10e1\u10d8 (ms)", none: "\u10d0\u10e0\u10ea\u10d4\u10e0\u10d7\u10d8", dataPoints: "\u10db\u10dd\u10dc\u10d0\u10ea\u10d4\u10db\u10d7\u10d0 \u10ec\u10d4\u10e0\u10e2\u10d8\u10da\u10d4\u10d1\u10d8", labels: "\u10d8\u10d0\u10e0\u10da\u10d8\u10e7\u10d4\u10d1\u10d8", rules: "\u10ec\u10d4\u10e1\u10d4\u10d1\u10d8", retention: "\u10e8\u10d4\u10dc\u10d0\u10ee\u10d5\u10d0", timestamp: "\u10d3\u10e0\u10dd\u10d8\u10e1 \u10d0\u10dc\u10d0\u10d1\u10d4\u10ed\u10d3\u10d8", value: "\u10e6\u10d8\u10e0\u10d4\u10d1\u10e3\u10da\u10d4\u10d1\u10d0", retentionHint: "0 = \u10d5\u10d0\u10d3\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4, \u10d0\u10dc \u10db\u10d8\u10da\u10d8\u10ec\u10d0\u10db\u10d4\u10d1\u10d8", duplicatePolicy: "\u10d3\u10e3\u10d1\u10da\u10d8\u10e0\u10d4\u10d1\u10d8\u10e1 \u10de\u10dd\u10da\u10d8\u10e2\u10d8\u10d9\u10d0", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' \u10dc\u10d8\u10e8\u10dc\u10d0\u10d5\u10e1 \u10d0\u10d5\u10e2\u10dd\u10db\u10d0\u10e2\u10e3\u10e0\u10d0\u10d3 \u10d2\u10d4\u10dc\u10d4\u10e0\u10d8\u10e0\u10d4\u10d1\u10e3\u10da\u10e1, \u10d0\u10dc \u10db\u10d8\u10da\u10d8\u10ec\u10d0\u10db\u10d4\u10d1\u10d8\u10e1 \u10d3\u10e0\u10dd\u10d8\u10e1 \u10d0\u10dc\u10d0\u10d1\u10d4\u10ed\u10d3\u10d8", editAllHint: "\u10d4\u10e0\u10d7\u10d8 \u10db\u10dd\u10dc\u10d0\u10ea\u10d4\u10db\u10d7\u10d0 \u10ec\u10d4\u10e0\u10e2\u10d8\u10da\u10d8 \u10d7\u10d8\u10d7\u10dd \u10ee\u10d0\u10d6\u10d6\u10d4: \u10d3\u10e0\u10dd\u10d8\u10e1_\u10d0\u10dc\u10d0\u10d1\u10d4\u10ed\u10d3\u10d8 \u10e6\u10d8\u10e0\u10d4\u10d1\u10e3\u10da\u10d4\u10d1\u10d0 (\u10d3\u10e0\u10dd\u10d8\u10e1 \u10d0\u10dc\u10d0\u10d1\u10d4\u10ed\u10d3\u10d8 \u10e8\u10d4\u10d8\u10eb\u10da\u10d4\u10d1\u10d0 \u10d8\u10e7\u10dd\u10e1 * \u10d0\u10d5\u10e2\u10dd\u10db\u10d0\u10e2\u10e3\u10e0\u10d8\u10e1\u10d7\u10d5\u10d8\u10e1)", autoSpread: "\u10d0\u10d5\u10e2\u10dd\u10db\u10d0\u10e2\u10e3\u10e0\u10d8 * \u10d2\u10d0\u10dc\u10d0\u10ec\u10d8\u10da\u10d4\u10d1\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10d5\u10d0\u10da\u10d8", formula: "\u10e4\u10dd\u10e0\u10db\u10e3\u10da\u10d0", formulaLinear: "\u10ec\u10e0\u10e4\u10d8\u10d5\u10d8", formulaRandom: "\u10e8\u10d4\u10db\u10d7\u10ee\u10d5\u10d4\u10d5\u10d8\u10d7\u10d8", formulaSawtooth: "\u10ee\u10d4\u10e0\u10ee\u10d8\u10e1\u10db\u10d0\u10d2\u10d5\u10d0\u10e0\u10d8", formulaPoints: "\u10ec\u10d4\u10e0\u10e2\u10d8\u10da\u10d4\u10d1\u10d8", formulaAmplitude: "\u10d0\u10db\u10de\u10da\u10d8\u10e2\u10e3\u10d3\u10d0", formulaOffset: "\u10ec\u10d0\u10dc\u10d0\u10ea\u10d5\u10da\u10d4\u10d1\u10d0", generate: "\u10d2\u10d4\u10dc\u10d4\u10e0\u10d8\u10e0\u10d4\u10d1\u10d0", exportChart: "PNG \u10d4\u10e5\u10e1\u10de\u10dd\u10e0\u10e2\u10d8", overlay: "\u10d2\u10d0\u10e1\u10d0\u10e6\u10d4\u10d1\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10d3\u10d0\u10e4\u10d0\u10e0\u10d5\u10d0", overlayHint: "\u10db\u10eb\u10d8\u10db\u10d8\u10d7 \u10d2\u10d0\u10db\u10dd\u10e7\u10dd\u10e4\u10d8\u10da\u10d8 \u10d2\u10d0\u10e1\u10d0\u10e6\u10d4\u10d1\u10d4\u10d1\u10d8", mrangeFilter: "\u10d8\u10d0\u10e0\u10da\u10d8\u10e7\u10d4\u10d1\u10d8\u10e1 \u10e4\u10d8\u10da\u10e2\u10e0\u10d8", bulkMode: "მასიური გენერაცია", mrangeHint: "\u10db\u10d0\u10d2. sensor=temp" } }, treeControls: { settings: "ხის პარამეტრები", expandAll: "გააფართოვეთ ყველა", collapseAll: "ყველა ჩაშალე", level: "დონე", search: { search: "ძიება გასაღებებში", clear: "წაშალეთ მიმდინარე ძიება ცარიელის დასაყენებლად", placeholderClient: "მოძებნეთ კლიენტის მხარე", placeholderServer: "მოძებნეთ სერვერის მხარე", info: "კლიენტის მხრიდან ძიება ნიშნავს, რომ იგი ემთხვევა საძიებო შეყვანის ტექსტს. სერვერის მხრიდან ძიება ნიშნავს, რომ ეს არის კლავიშების შაბლონებში ძიება, როგორც *{search-text}*. დიდი საძიებო ნაკრებისთვის, უმჯობესია გამოიყენოთ სერვერის მხრიდან ძებნა. მცირე საძიებო ნაკრებისთვის უმჯობესია გამოიყენოთ კლიენტის მხარის ძიების რეჟიმი." + ` თუ გასაღებების რაოდენობა დასრულდა ${p3xr.settings.maxLightKeysCount}, შეგიძლიათ მოძებნოთ მხოლოდ სერვერის მხარეს.`, largeSetInfo: "დიდ კომპლექტში კლიენტის მხრიდან ძებნა გამორთულია. ასე რომ, ახლა შესაძლებელია მხოლოდ სერვერის მხრიდან ძებნა.", infoDetails: "იმის გასარკვევად, თუ როგორ მუშაობს ძებნა, გთხოვთ, გადახედოთ პარამეტრებს" }, pager: { next: "შემდეგი", prev: "წინა", first: "პირველი", last: "ბოლო" } } }, time: { type: "ტიპი", format: "ფორმატი", loading: "იტvirtheba...", years: "წლები", months: "თვეების", days: "დღეები", year: "წელიწადი", month: "თვე", day: "დღე", second: "\u10ec\u10d0\u10db\u10d8", seconds: "\u10ec\u10d0\u10db\u10d4\u10d1\u10d8", minute: "\u10ec\u10e3\u10d7\u10d8", minutes: "\u10ec\u10e3\u10d7\u10d4\u10d1\u10d8", hour: "\u10e1\u10d0\u10d0\u10d7\u10d8", hours: "\u10e1\u10d0\u10d0\u10d7\u10d4\u10d1\u10d8" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/kk/000077500000000000000000000000001517650670600137605ustar00rootroot00000000000000src/strings/kk/strings.js000066400000000000000000001073371517650670600160220ustar00rootroot00000000000000const strings = { error: { 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 қосылымын жойғыңыз келетініне сенімдісіз бе?", delete: "\u0416\u043e\u044e?", deleteNode: "Осы Redis түйінін жоюға сенімдісіз бе?", deleteAllKeys: opts => { return `Осы ағашты және оның барлық кілттерін жойыңыз (${opts.key})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" сәйкес келетін барлық кілттерді жоюға сенімдісіз бе? ${opts.count} кілт табылды.`; }, 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 болады" }, }, 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} нәтижені экспорттау`, deleteAllKeysMenu: (opts) => `Барлығын жою ${opts.count}`, importKeys: "Кілттерді импорттау", deleteSearchKeys: (opts) => `${opts.count} сәйкес кілтті жою`, saveWithFormatJson: "Пішіммен сақтау", formatJson: "Json пішімі", wrap: "Орау", unwrap: "Орамды ашу", downloadJson: "JSON жүктеп алыңыз", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 орнатыңыз", delete: "Жою", remove: "Жою", sure: "Әрине", testConnection: "Сынақ қосылымы", getKey: "Redis кілті мен байланысты деректер жүктелуде ...", jsonViewShow: "JSON дисплейі", jsonViewEditor: "JSON өңдеу", quickConsole: "Жылдам консоль", }, label: { id: { nodeId: "Түйін идентификаторы", id: "Қосылым идентификаторы", info: "Мыналардың сипаттарын өзгерткіңіз келмесе: sshPassword, sshPrivateKey, құпия сөз, tlsCrt, tlsKey, tlsCa, сипат мәндерін өзгеріссіз сақтау үшін осы сипаттарға қосылым идентификаторын енгізіңіз. Түйін құпия сөзінде бірдей логиканы қаласаңыз, түйін құпия сөзіне түйін идентификаторын енгізіңіз." }, secureFeature: "P3X-тен басталатын мәнді көрсеңіз, ұқсайды, ол қауіпсіз мүмкіндік болып табылады. Параметрлерді өзгерту үшін бұл параметрлерді бос немесе басқа нәрсемен ауыстырыңыз, сонда олар сақталады. Параметрлерді өзгертпесеңіз, параметрлер сервердегідей сақталады.", aiTranslating: "Translating...", aiSettings: "AI Параметрлер", aiGroqApiKey: "Groq API кілті", aiGroqApiKeyInfo: "Міндетті емес. Жақсы өнімділік үшін өз Groq API кілтіңіз. Тегін кілт алыңыз", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API кілті сақталды", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Орнатылмаған (сервер әдепкісі)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Қосылымдар", keysSort: { on: "Кілтті сұрыптау қосулы", off: "Кілтті сұрыптау" }, cluster: { on: "Cluster қосулы", off: "Cluster өшірулі" }, sentinel: { on: "Sentinel қосулы", off: "Sentinel өшірулі", name: "Sentinel атауы" }, readonly: { on: "Тек оқуға арналған", off: "Тек оқу үшін өшірулі" }, 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: "Уақыт", type: "Түрі", format: "Формат", loading: "Жүктелуде...", autoRefresh: "Авто", exportSearchHint: "Тек ағымдағы іздеуге сәйкес кілттер экспортталады", importSearchHint: "Импорт іздеу нәтижелеріне ғана емес, бүкіл дерекқорға қолданылады", deleteSearchHint: "Сервердегі ағымдағы іздеуге сәйкес барлық кілттерді жояды", deletingSearchKeys: "Сәйкес кілттер жойылуда...", importNoKeys: "Файлдан кілттер табылмады", }, status: { dataCopied: "Деректер алмасу буферінде", exportDone: "Экспорт аяқталды", deletedSearchKeys: (opts) => `${opts.count} кілт жойылды`, 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": "Бұл тізім индексі шектен тыс", "invalid-json-value": "Мән жарамсыз JSON.", "http_auth_required": "Авторизация қажет: HTTP Basic Auth көмегімен аутентификациядан өтіп, қайта жүктеңіз.", "auto-connection-failed": "Мүмкін, осыған байланысты қосылым жойылды және автоматты қосылым сәтсіз аяқталды.", invalid_console_command: "Бұл пәрмен GUI арқылы жұмыс істемейді." }, 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: "Кілттер жоқ", rss: "RSS", peak: "Шың", fragmentation: "Фрагментация", hitsAndMisses: "Тапқандар / Жоғалтқандар", noClients: "Клиенттер жоқ", }, analysis: { title: "Жад талдауы", runAnalysis: "Талдауды бастау", running: "Талдануда...", typeDistribution: "Түр бойынша таралуы", prefixMemory: "Префикс бойынша жад", topKeysByMemory: "Жад бойынша ең үлкен кілттер", expirationOverview: "Кілт мерзімі", memoryBreakdown: "Жад бөлінісі", keysScanned: "Сканерленген кілттер", totalMemory: "Жалпы жад", rssMemory: "RSS жады", peakMemory: "Шыңдық жад", luaMemory: "Lua жады", overheadMemory: "Қосымша жүктеме", datasetMemory: "Деректер жиыны", fragmentation: "Фрагментация", allocator: "Бөлгіш", withTTL: "TTL бар", persistent: "Тұрақты", avgTTL: "Орташа TTL", prefix: "Префикс", keyCount: "Кілт саны", memoryUsage: "Жад қолданылуы", noPrefix: "(префикссіз)", topN: "Top N", maxScanKeys: "Макс. сканерлеу кілттері", type: "Түр", noData: "Деректер жоқ. Бастау үшін Талдауды бастау батырмасын басыңыз.", exportAll: "Барлығын экспорттау", }, 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: "Мән" } }, timeseries: { chart: "\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430", info: "\u0410\u049b\u043f\u0430\u0440\u0430\u0442", addPoint: "\u0414\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043d\u04af\u043a\u0442\u0435\u0441\u0456\u043d \u049b\u043e\u0441\u0443", from: "\u0411\u0430\u0441\u0442\u0430\u043f (ms \u043d\u0435\u043c\u0435\u0441\u0435 -)", to: "\u0410\u044f\u049b\u0442\u0430\u043b\u0443 (ms \u043d\u0435\u043c\u0435\u0441\u0435 +)", aggregation: "\u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f", timeBucket: "\u0428\u0435\u043b\u0435\u043a (ms)", none: "\u0416\u043e\u049b", dataPoints: "\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043d\u04af\u043a\u0442\u0435\u043b\u0435\u0440\u0456", labels: "\u0411\u0435\u043b\u0433\u0456\u043b\u0435\u0440", rules: "\u0415\u0440\u0435\u0436\u0435\u043b\u0435\u0440", retention: "\u0421\u0430\u049b\u0442\u0430\u0443", timestamp: "\u0423\u0430\u049b\u044b\u0442 \u0431\u0435\u043b\u0433\u0456\u0441\u0456", value: "\u041c\u04d9\u043d", retentionHint: "0 = \u043c\u0435\u0440\u0437\u0456\u043c\u0456 \u0436\u043e\u049b, \u043d\u0435\u043c\u0435\u0441\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434", duplicatePolicy: "\u041a\u04e9\u0448\u0456\u0440\u043c\u0435 \u0441\u0430\u044f\u0441\u0430\u0442\u044b", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u0430\u0441\u0430\u043b\u0430\u0434\u044b, \u043d\u0435\u043c\u0435\u0441\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0443\u0430\u049b\u044b\u0442 \u0431\u0435\u043b\u0433\u0456\u0441\u0456", editAllHint: "\u04d8\u0440 \u0436\u043e\u043b\u0434\u0430 \u0431\u0456\u0440 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043d\u04af\u043a\u0442\u0435\u0441\u0456: \u0443\u0430\u049b\u044b\u0442_\u0431\u0435\u043b\u0433\u0456\u0441\u0456 \u043c\u04d9\u043d (\u0443\u0430\u049b\u044b\u0442 \u0431\u0435\u043b\u0433\u0456\u0441\u0456 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u04af\u0448\u0456\u043d * \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d)", autoSpread: "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b * \u0442\u0430\u0440\u0430\u043b\u0443 \u0430\u0440\u0430\u043b\u044b\u0493\u044b", formula: "\u0424\u043e\u0440\u043c\u0443\u043b\u0430", formulaLinear: "\u0421\u044b\u0437\u044b\u049b\u0442\u044b\u049b", formulaRandom: "\u041a\u0435\u0437\u0434\u0435\u0439\u0441\u043e\u049b", formulaSawtooth: "\u0410\u0440\u0430 \u0442\u0456\u0441\u0442\u0456", formulaPoints: "\u041d\u04af\u043a\u0442\u0435\u043b\u0435\u0440", formulaAmplitude: "\u0410\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430", formulaOffset: "\u042b\u0493\u044b\u0441\u0443", generate: "\u0416\u0430\u0441\u0430\u0443", exportChart: "PNG \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0442\u0430\u0443", overlay: "\u04ae\u0441\u0442\u0456\u043d\u0435 \u049b\u043e\u044e \u043a\u0456\u043b\u0442\u0442\u0435\u0440", overlayHint: "\u04ae\u0442\u0456\u0440\u043c\u0435\u043d \u0431\u04e9\u043b\u0456\u043d\u0433\u0435\u043d \u043a\u0456\u043b\u0442\u0442\u0435\u0440", mrangeFilter: "\u0411\u0435\u043b\u0433\u0456\u043b\u0435\u0440 \u0441\u04af\u0437\u0433\u0456\u0441\u0456", bulkMode: "Жаппай генерация", mrangeHint: "\u043c\u044b\u0441. sensor=temp" } }, treeControls: { settings: "Ағаш параметрлері", expandAll: "Барлығын кеңейту", collapseAll: "Барлығын жинаңыз", level: "Деңгей", search: { search: "Пернелерден іздеңіз", clear: "Бос орнату үшін ағымдағы іздеуді өшіріңіз", placeholderClient: "Клиент жағынан іздеу", placeholderServer: "Сервер жағынан іздеу", info: "Клиенттік іздеу оның іздеу кірісіндегі мәтінге сәйкес келетінін б��лдіреді. Сервер жағынан іздеу дегеніміз, бұл *{search-text}* сияқты пернелер үлгілеріндегі іздеу сияқты. Үлкен іздеу жиындары үшін серверлік іздеуді қолданған дұрыс. Кішірек іздеу жиындары үшін клиенттік іздеу режимін қолданған дұрыс." + ` Егер кілттерді санау аяқталса ${p3xr.settings.maxLightKeysCount}, тек сервер жағынан іздеуге болады.`, largeSetInfo: "Үлкен жиынтықта клиенттік іздеу өшірілген. сондықтан дәл қазір тек сервер жағынан іздеу мүмкін.", infoDetails: "Іздеу қалай жұмыс істейтінін білу үшін параметрлерді тексеріңіз" }, pager: { next: "Келесі", prev: "Алдыңғы", first: "Бірінші", last: "Соңғы" } } }, time: { type: "Түрі", format: "Формат", loading: "Жүктелуде...", years: "жылдар", months: "айлар", days: "күндер", year: "жыл", month: "ай", day: "күні", second: "\u0441\u0435\u043a\u0443\u043d\u0434", seconds: "\u0441\u0435\u043a\u0443\u043d\u0434", minute: "\u043c\u0438\u043d\u0443\u0442", minutes: "\u043c\u0438\u043d\u0443\u0442", hour: "\u0441\u0430\u0493\u0430\u0442", hours: "\u0441\u0430\u0493\u0430\u0442" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/km/000077500000000000000000000000001517650670600137625ustar00rootroot00000000000000src/strings/km/strings.js000066400000000000000000001317501517650670600160200ustar00rootroot00000000000000const strings = { error: { 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 នេះទេ?", delete: "\u179b\u17bb\u1794?", deleteNode: "តើអ្នកប្រាកដក្នុងការលុបថ្នាំង Redis នេះទេ?", deleteAllKeys: opts => { return `លុបមែកធាងនេះ និងសោទាំងអស់របស់វា (${opts.key})?`; }, deleteSearchKeys: opts => { return `តើអ្នកប្រាកដថាចង់លុបសោទាំងអស់ដែលផ្គូផ្គងនឹង "${opts.pattern}" ទេ? បានរកឃើញ ${opts.count} សោ។`; }, 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" }, }, 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} លទ្ធផល`, deleteAllKeysMenu: (opts) => `លុបទាំងអស់ ${opts.count}`, importKeys: "នាំចូលសោ", deleteSearchKeys: (opts) => `លុប ${opts.count} សោដែលផ្គូផ្គង`, saveWithFormatJson: "រក្សាទុកជាមួយទម្រង់", formatJson: "ទម្រង់ Json", wrap: "រុំ", unwrap: "ដោះរុំ", downloadJson: "ទាញយក JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", delete: "លុប", remove: "ដកចេញ", sure: "ប្រាកដ", testConnection: "ការភ្ជាប់សាកល្បង", getKey: "កំពុងផ្ទុកគ្រាប់ចុច Redis និងទិន្នន័យដែលពាក់ព័ន្ធ...", jsonViewShow: "បង្ហាញ JSON", jsonViewEditor: "កែសម្រួល JSON", quickConsole: "កុងសូលរហ័ស", }, label: { id: { nodeId: "លេខសម្គាល់ថ្នាំង", id: "លេខសម្គាល់ការតភ្ជាប់", info: "ប្រសិនបើអ្នកមិនចង់ផ្លាស់ប្តូរលក្ខណសម្បត្តិរបស់៖ sshPassword, sshPrivateKey, ពាក្យសម្ងាត់, tlsCrt, tlsKey, tlsCa សូមបញ្ចូលលេខសម្គាល់នៃការតភ្ជាប់នៅក្នុង propertes ទាំងនោះ ដើម្បីរក្សាតម្លៃទ្រព្យសម្បត្តិនៅដដែល។ ប្រសិនបើអ្នកចង់បានតក្កវិជ្ជាដូចគ្នានៅក្នុងពាក្យសម្ងាត់ថ្នាំង បន្ទាប់មកបញ្ចូលល���ខសម្គាល់ថ្នាំងក្នុងពាក្យសម្ងាត់ថ្នាំង។" }, secureFeature: "ប្រសិនបើអ្នកឃើញតម្លៃដែលចាប់ផ្តើមដោយ P3X មើលទៅដូចគ្នា វាគឺជាមុខងារសុវត្ថិភាព។ ដើម្បីផ្លាស់ប្តូរការកំណត់ គ្រាន់តែជំនួសការកំណត់ទាំងនេះដោយទទេ ឬអ្វីផ្សេងទៀត ហើយពួកវានឹងត្រូវបានរក្សាទុក។ ប្រសិនបើអ្នកមិនផ្លាស់ប្តូរការកំណត់ទេ ការកំណត់នឹងត្រូវបានរក្សាទុកដូចដែលពួកវាស្ថិតនៅលើម៉ាស៊ីនមេ។", aiTranslating: "Translating...", aiSettings: "ការកំណត់ AI", aiGroqApiKey: "សោ API Groq", aiGroqApiKeyInfo: "ជាជម្រើស។ សោ API Groq ផ្ទាល់ខ្លួនសម្រាប់ដំណើរការកាន់តែប្រសើរ។ ទទួលបានសោឥតគិតថ្លៃពី", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "សោ API AI ត្រូវបានរក្សាទុក", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "មិនទាន់កំណត់ (លំនាំដើមម៉ាស៊ីនមេ)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "ការតភ្ជាប់", keysSort: { on: "ការតម្រៀបគ្រាប់ចុចបើក", off: "ការតម្រៀបគ្រាប់ចុចបិទ" }, cluster: { on: "Cluster បើក", off: "បិទ Cluster" }, sentinel: { on: "Sentinel បើក", off: "បិទ Sentinel", name: "ឈ្មោះ Sentinel" }, readonly: { on: "បានតែអានប៉ុណ្ណោះ។", off: "បិទការអានតែប៉ុណ្ណោះ" }, 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: "ពេលវេលា", type: "ប្រភេទ", format: "ទម្រង់", loading: "កំពុងផ្ទុក...", autoRefresh: "ស្វ័យប្រវត្តិ", exportSearchHint: "នាំចេញតែសោដែលផ្គូផ្គងនឹងការស្វែងរកបច្ចុប្បន្ន", importSearchHint: "ការនាំចូលអនុវត្តចំពោះមូលដ្ឋានទិន្នន័យទាំងមូល មិនមែនតែលទ្ធផលស្វែងរកទេ", deleteSearchHint: "លុបសោទាំងអស់ដែលផ្គូផ្គងនឹងការស្វែងរកបច្ចុប្បន្ននៅលើម៉ាស៊ីនមេ", deletingSearchKeys: "កំពុងលុបសោដែលផ្គូផ្គង...", importNoKeys: "រកមិនឃើញសោក្នុងឯកសារ", }, status: { dataCopied: "ទិន្នន័យគឺនៅក្នុងក្ដារតម្បៀតខ្ទាស់", exportDone: "ការនាំចេញបានបញ្ចប់", deletedSearchKeys: (opts) => `បានលុប ${opts.count} សោ`, 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": "លិបិក្រមបញ្ជីនេះគឺហួសព្រំដែន", "invalid-json-value": "តម្លៃមិនត្រឹមត្រូវ JSON ។", "http_auth_required": "តម្រូវឱ្យមានការអនុញ្ញាត៖ សូមផ្ទៀងផ្ទាត់ជាមួយ HTTP Basic Auth ហើយផ្ទុកឡើងវិញ។", "auto-connection-failed": "អាចធ្វើទៅបាន ការតភ្ជាប់ត្រូវបានដកចេញ ហើយការភ្ជាប់ដោយស្វ័យប្រវត្តិបានបរាជ័យ ដោយសារបញ្ហានេះ។", invalid_console_command: "ពាក្យបញ្ជានេះមិនដំណើរការតាមរយៈ GUI ទេ។" }, 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: "គ្មានសោ", rss: "RSS", peak: "កំពូល", fragmentation: "ការបែកខ្ចាត់ខ្ចាយ", hitsAndMisses: "ទទួលបាន / មិនទទួលបាន", noClients: "គ្មានអតិថិជន", }, analysis: { title: "ការវិភាគអង្គចងចាំ", runAnalysis: "ដំណើរការវិភាគ", running: "កំពុងវិភាគ...", typeDistribution: "ការចែកចាយប្រភេទ", prefixMemory: "អង្គចងចាំតាមបុព្វបទ", topKeysByMemory: "សោធំបំផុតតាមអង្គចងចាំ", expirationOverview: "ការផុតកំណត់សោ", memoryBreakdown: "ការបែងចែកអង្គចងចាំ", keysScanned: "សោដែលបានស្កេន", totalMemory: "អង្គចងចាំសរុប", rssMemory: "អង្គចងចាំ RSS", peakMemory: "អង្គចងចាំកំពូល", luaMemory: "អង្គចងចាំ Lua", overheadMemory: "បន្ទុកបន្ថែម", datasetMemory: "សំណុំទិន្នន័យ", fragmentation: "ការបែកខ្ចាត់ខ្ចាយ", allocator: "អ្នកបែងចែក", withTTL: "មាន TTL", persistent: "អចិន្ត្រៃយ៍", avgTTL: "TTL មធ្យម", prefix: "បុព្វបទ", keyCount: "ចំនួនសោ", memoryUsage: "ការប្រើប្រាស់អង្គចងចាំ", noPrefix: "(គ្មានបុព្វបទ)", topN: "Top N", maxScanKeys: "សោស្កេនអតិបរមា", type: "ប្រភេទ", noData: "គ្មានទិន្នន័យ។ ចុចដំណើរការវិភាគដើម្បីចាប់ផ្តើម។", exportAll: "នាំចេញទាំងអស់", }, 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: "តម្លៃ" } }, timeseries: { chart: "\u1780\u17d2\u179a\u17b6\u17a0\u17d2\u179c\u17b7\u1780", info: "\u1796\u17c0\u178f\u17cc\u1798\u17b6\u1793", addPoint: "\u1794\u1793\u17d2\u1790\u17c2\u1798\u1785\u17c6\u178e\u17bb\u1785\u1791\u17b7\u1793\u17d2\u1793\u1793\u17d0\u1799", from: "\u1796\u17b8 (ms \u17ac -)", to: "\u178a\u179b\u17cb (ms \u17ac +)", aggregation: "\u1780\u17b6\u179a\u1794\u1789\u17d2\u1785\u17bc\u179b\u1782\u17d2\u1793\u17b6", timeBucket: "\u1790\u17bb\u1784 (ms)", none: "\u1782\u17d2\u1798\u17b6\u1793", dataPoints: "\u1785\u17c6\u178e\u17bb\u1785\u1791\u17b7\u1793\u17d2\u1793\u1793\u17d0\u1799", labels: "\u179f\u17d2\u179b\u17b6\u1780\u179f\u1789\u17d2\u1789\u17b6", rules: "\u179c\u17b7\u1793\u17d0\u1799", retention: "\u1780\u17b6\u179a\u179a\u1780\u17d2\u179f\u17b6\u1791\u17bb\u1780", timestamp: "\u179f\u17d2\u178f\u17b6\u1798\u1796\u17c1\u179b\u179c\u17c1\u179b\u17b6", value: "\u178f\u1798\u17d2\u179b\u17c3", retentionHint: "0 = \u1798\u17b7\u1793\u17a2\u179f\u17cb\u17a2\u17b6\u1799\u17bb, \u17ac \u1798\u17b7\u179b\u17d2\u179b\u17b8\u179c\u17b7\u1793\u17b6\u1791\u17b8", duplicatePolicy: "\u1782\u17c4\u179b\u1793\u17b6\u1799\u17d4\u179f\u17c6\u1785\u17c6\u179b\u1784\u179f\u17d2\u1791\u17c0\u179a", labelsHint: "key1 value1 key2 value2", timestampHint: "'*' \u1798\u17b6\u1793\u1793\u17d0\u1799\u1790\u17b6\u1794\u1784\u17d2\u1780\u17be\u178f\u178a\u17c4\u1799\u179f\u17d2\u179c\u17d0\u1799\u1794\u17d2\u179a\u179c\u178f\u17d2\u178f\u17b7, \u17ac \u179f\u17d2\u178f\u17b6\u1798\u1796\u17c1\u179b\u179c\u17c1\u179b\u17b6\u1798\u17b7\u179b\u17d2\u179b\u17b8\u179c\u17b7\u1793\u17b6\u1791\u17b8", editAllHint: "\u1798\u17bd\u1799\u1785\u17c6\u178e\u17bb\u1785\u1791\u17b7\u1793\u17d2\u1793\u1793\u17d0\u1799\u1780\u17d2\u1793\u17bb\u1784\u1798\u17bd\u1799\u1787\u17bd\u179a: \u179f\u17d2\u178f\u17b6\u1798\u1796\u17c1\u179b\u179c\u17c1\u179b\u17b6 \u178f\u1798\u17d2\u179b\u17c3 (\u179f\u17d2\u178f\u17b6\u1798\u1796\u17c1\u179b\u179c\u17c1\u179b\u17b6\u17a2\u17b6\u1785\u1787\u17b6 * \u179f\u1798\u17d2\u179a\u17b6\u1794\u17cb\u179f\u17d2\u179c\u17d0\u1799\u1794\u17d2\u179a\u179c\u178f\u17d2\u178f\u17b7)", autoSpread: "\u1785\u1793\u17d2\u179b\u17c4\u17c7\u1796\u17c1\u179b\u179a\u17b6\u179b\u17a0\u17b6\u1799\u179f\u17d2\u179c\u17d0\u1799\u1794\u17d2\u179a\u179c\u178f\u17d2\u178f\u17b7 *", formula: "\u179a\u17bc\u1794\u1798\u1793\u17d2\u178f", formulaLinear: "\u179b\u17b8\u1793\u17c1\u17a2\u17ca\u17c2\u179a", formulaRandom: "\u1785\u17c3\u178a\u1793\u17d2\u1799", formulaSawtooth: "\u1790\u17d2\u1780\u17c2\u179c\u17a2\u17ca\u17b8", formulaPoints: "\u1785\u17c6\u178e\u17bb\u1785", formulaAmplitude: "\u17a2\u17b6\u17c6\u1797\u17d2\u179b\u17b8\u1792\u17bc\u178a", formulaOffset: "\u17a2\u17bb\u1794\u179f\u17c1\u178f", generate: "\u1794\u1784\u17d2\u1780\u17be\u178f", exportChart: "\u1793\u17b6\u17c6\u1785\u17c1\u1789 PNG", overlay: "\u179f\u17c4\u178f\u17d2\u179a\u17b6\u1794\u17cb\u1782\u17d2\u1793\u17b6", overlayHint: "\u179f\u17c4\u1794\u17c6\u1794\u17c2\u1780\u178a\u17c4\u1799\u179f\u17c0\u1789\u1780\u17c6\u178e\u178f", mrangeFilter: "\u178f\u1798\u17d2\u179a\u1784\u179f\u17d2\u179b\u17b6\u1780\u179f\u1789\u17d2\u1789\u17b6", bulkMode: "បង្កើតច្រើន", mrangeHint: "\u17a7\u1791\u17b6. sensor=temp" } }, treeControls: { settings: "ការកំណត់ដើមឈើ", expandAll: "ពង្រីកទាំងអស់។", collapseAll: "ដួលរលំទាំងអស់។", level: "កម្រិdelays", search: { search: "ស្វែងរកក្នុងសោ", clear: "សម្អាតការស្វែងរកបច្ចុប្បន្នដើម្បីកំណត់ទទេ", placeholderClient: "ស្វែងរកផ្នែកអតិថិជន", placeholderServer: "ស្វែងរកផ្នែកខាងម៉ាស៊ីនមេ", info: "ការស្វែងរកភាគីអតិថិជនមានន័យថា វាត្រូវគ្នានឹងអត្ថបទនៅក្នុងការបញ្ចូលការស្វែងរក។ ការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេមានន័យថា វាដូចជាការស្វែងរកក្នុងទម្រង់សោជា *{search-text}*។ សម្រាប់សំណុំស្វែងរកធំ វាជាការប្រសើរក្នុងការប្រើការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេ។ សម្រាប់​សំណុំ​ការ​ស្វែងរក​តូច​ជាង​នេះ វា​ជា​ការ​ប្រសើរ​ក្នុង​ការ​ប្រើ​របៀប​ស���វែងរក​ខាង​អតិថិជន។" + ` ប្រសិនបើចំនួនសោត្រូវបានបញ្ចប់ ${p3xr.settings.maxLightKeysCount}អ្នកអាចស្វែងរកតែនៅផ្នែកខាងម៉ាស៊ីនមេប៉ុណ្ណោះ។`, largeSetInfo: "នៅក្នុងសំណុំធំ ការស្វែងរកភាគីអតិថិជនត្រូវបានបិទ។ ដូច្នេះឥឡូវនេះមានតែការស្វែងរកផ្នែកខាងម៉ាស៊ីនមេប៉ុណ្ណោះដែលអាចធ្វើទៅបាន។", infoDetails: "ដើម្បីស្វែងយល់ពីរបៀបដែលការស្វែងរកដំណើរការ សូមពិនិត្យមើលការកំណត់" }, pager: { next: "បន្ទាប់", prev: "មុន", first: "ទីមួយ", last: "ចុងក្រោយ" } } }, time: { type: "ប្រភេទ", format: "ទម្រង់", loading: "កំពុងផ្ទុក...", years: "ឆ្នាំ", months: "ខែ", days: "ថ្ងៃ", year: "ឆ្នាំ", month: "ខែ", day: "ថ្ងៃ", second: "\u179c\u17b7\u1793\u17b6\u1791\u17b8", seconds: "\u179c\u17b7\u1793\u17b6\u1791\u17b8", minute: "\u1793\u17b6\u1791\u17b8", minutes: "\u1793\u17b6\u1791\u17b8", hour: "\u1798\u17c9\u17c4\u1784", hours: "\u1798\u17c9\u17c4\u1784" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ko/000077500000000000000000000000001517650670600137645ustar00rootroot00000000000000src/strings/ko/strings.js000066400000000000000000000660001517650670600160150ustar00rootroot00000000000000const strings = { error: { 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 노드를 삭제하시겠습니까?", delete: "삭제하시겠습니까?", deleteAllKeys: opts => { return `이 트리와 모든 키를 삭제합니다(${opts.key})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}"와 일치하는 모든 키를 삭제하시겠습니까? ${opts.count}개의 키가 발견되었습니다.`; }, 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이 됩니다." }, }, 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} 결과 내보내기`, deleteAllKeysMenu: (opts) => `모두 삭제 ${opts.count}`, importKeys: "키 가져오기", deleteSearchKeys: (opts) => `일치하는 ${opts.count}개 키 삭제`, saveWithFormatJson: "형식으로 저장", formatJson: "JSON 형식", wrap: "랩", unwrap: "포장 풀기", downloadJson: "JSON 다운로드", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 설정", 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로 시작하는 값이 동일하게 보이면 이는 보안 기능입니다. 설정을 변경하려면 해당 설정을 ��어 있거나 다른 것으로 바꾸면 저장됩니다. 설정을 변경하지 않으면 설정이 서버에 있는 그대로 유지됩니다.", aiTranslating: "번역 중...", aiSettings: "AI 설정", aiGroqApiKey: "Groq API 키", aiGroqApiKeyInfo: "선택사항. 더 나은 성능을 위한 자체 Groq API 키. 무료 키 받기", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API 키 저장됨", aiGroqApiKeyInvalid: "유효하지 않은 Groq API 키", aiGroqApiKeyNotSet: "미설정 (서버 기본값)", aiEnabled: "AI 활성화", aiEnabledYes: "예", aiEnabledNo: "아니오", aiRouteViaNetwork: "network.corifeus.com 경유", aiRoutingDirect: "자체 API 키를 사용하여 Groq에 직접 쿼리합니다. network.corifeus.com을 거치지 않습니다.", aiRoutingNetwork: "AI 쿼리는 network.corifeus.com을 통해 라우팅됩니다. 무료 Groq API 키가 있으면 이 스위치를 끄고 직접 사용할 수 있습니다.", 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: "연결", keysSort: { on: "키 정렬 켜짐", off: "키 정렬 꺼짐" }, cluster: { on: "Cluster 켜짐", off: "Cluster 꺼짐" }, sentinel: { on: "Sentinel 켜짐", off: "Sentinel 꺼짐", name: "Sentinel 이름" }, readonly: { on: "읽기 전용", off: "읽기 전용 꺼짐" }, 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: "시간", type: "유형", format: "형식", loading: "로딩 중...", autoRefresh: "자동", exportSearchHint: "현재 검색과 일치하는 키만 내보내기", importSearchHint: "가져오기는 검색 결과뿐만 아니라 전체 데이터베이스에 적용됩니다", deleteSearchHint: "현재 검색과 일치하는 모든 키 삭제", deletingSearchKeys: "일치하는 키 삭제 중...", importNoKeys: "파일에서 키를 찾을 수 없습니다", }, status: { dataCopied: "데이터가 클립보드에 있습니다.", exportDone: "내보내기 완료", deletedSearchKeys: (opts) => `${opts.count}개 키 삭제됨`, 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": "이 목록 색인은 범위를 벗어났습니다.", "invalid-json-value": "값이 유효한 JSON가 아닙니다.", "http_auth_required": "승인 필요: HTTP Basic Auth로 인증하고 다시 로드하세요.", "auto-connection-failed": "이로 인해 연결이 제거되고 자동 연결이 실패했을 수도 있습니다.", invalid_console_command: "이 명령은 GUI를 통해 작동하지 않습니다." }, 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: "키 없음", rss: "RSS", peak: "최대", fragmentation: "단편화", hitsAndMisses: "적중 / 미스", noClients: "클라이언트 없음", }, analysis: { title: "메모리 분석", runAnalysis: "분석 실행", running: "분석 중...", typeDistribution: "타입 분포", prefixMemory: "접두사별 메모리", topKeysByMemory: "메모리별 상위 키", expirationOverview: "키 만료", memoryBreakdown: "메모리 분석", keysScanned: "스캔된 키", totalMemory: "전체 메모리", rssMemory: "RSS 메모리", peakMemory: "최대 메모리", luaMemory: "Lua 메모리", overheadMemory: "오버헤드", datasetMemory: "데이터셋", fragmentation: "단편화", allocator: "할당자", withTTL: "TTL 있음", persistent: "영구", avgTTL: "평균 TTL", prefix: "접두사", keyCount: "키 수", memoryUsage: "메모리 사용량", noPrefix: "(접두사 없음)", topN: "Top N", maxScanKeys: "최대 스캔 키 수", type: "타입", noData: "데이터 없음. 분석 실행을 클릭하여 시작하세요.", exportAll: "모두 내보내기", }, 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: "가치" } }, timeseries: { chart: "차트", info: "정보", addPoint: "포인트 추가", from: "시작 (ms 또는 -)", to: "종료 (ms 또는 +)", aggregation: "집계", timeBucket: "버킷 (ms)", none: "없음", dataPoints: "데이터 포인트", labels: "레이블", rules: "규칙", retention: "보존", timestamp: "타임스탬프", value: "값", retentionHint: "0 = 만료 없음, 또는 밀리초", duplicatePolicy: "중복 정책", labelsHint: "키1 값1 키2 값2", timestampHint: "'*'는 자동 생성, 또는 밀리초 타임스탬프", editAllHint: "한 줄에 하나의 데이터 포인트: 타임스탬프 값 (타임스탬프는 자동의 경우 * 사용)", autoSpread: "자동 * 분산 간격", formula: "수식", formulaLinear: "선형", formulaRandom: "랜덤", formulaSawtooth: "톱니파", formulaPoints: "포인트", formulaAmplitude: "진폭", formulaOffset: "오프셋", generate: "생성", exportChart: "PNG 내보내기", overlay: "키 오버레이", overlayHint: "쉼표로 구분된 키", mrangeFilter: "레이블 필터", bulkMode: "대량 생성", mrangeHint: "예: sensor=temp" } }, treeControls: { settings: "트리 설정", expandAll: "모두 펼치기", collapseAll: "모두 접기", level: "레벨", search: { search: "키에서 검색", clear: "비워두려면 현재 검색을 삭제하세요.", placeholderClient: "클라이언트 측 검색", placeholderServer: "검색 서버 측", info: "클라이언트 측 검색은 검색 입력의 텍스트와 일치함을 의미합니다. 서버 측 검색은 *{search-text}*와 같은 키 패턴 검색과 유사함을 의미합니다. 대규모 검색 세트의 경우 서버 측 검색을 사용하는 것이 좋습니다. 더 작은 검색 세트의 경우 클라이언트측 검색 모드를 사용하는 것이 좋습니다." + ` 열쇠 개수가 초과된 경우 ${p3xr.settings.maxLightKeysCount}, 서버 측에서만 검색할 수 있습니다.`, largeSetInfo: "대규모 세트에서는 클라이언트 측 검색이 비활성화됩니다. 그래서 지금은 서버 측 검색만 가능합니다.", infoDetails: "검색이 어떻게 작동하는지 알아보려면 설정을 확인하세요." }, pager: { next: "다음", prev: "이전", first: "첫 번째", last: "마지막" } } }, time: { type: "유형", format: "형식", loading: "로딩 중...", years: "년", months: "개월", days: "일", year: "년", month: "달", day: "일", second: "초", seconds: "초", minute: "분", minutes: "분", hour: "시간", hours: "시간" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ky/000077500000000000000000000000001517650670600137765ustar00rootroot00000000000000src/strings/ky/strings.js000066400000000000000000001046331517650670600160340ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" дал келген бардык ачкычтарды жок кыласызбы? ${opts.count} ачкыч табылды.`; }, socketioConnectError: "Socket.IO серверге туташа албайт, сиз кайра жүктөп, байланыш катасын өзүңүз чечип көрүңүз, кардар аны кантип чечүүнү билбейт.", socketioAuthRequired: "Socket.IO авторизациясы талап кылынат. Сураныч, HTTP Basic Auth (колдонуучунун аты/сырсөз) менен аныктыгын текшерип, кайра жүктөңүз.", delete: "Жок кылуу?", deleteKey: "Бул ачкычты чын эле жок кыласызбы?", rename: { title: "Бул ачкычтын атын чын эле өзгөртөсүзбү?", textContent: "Бул аракет ачкычтын атын биротоло өзгөртөт.", placeholder: "Redis ачкычы (талап кылынат)" }, ttl: { title: "Чын эле бул ачкычтын TTL өзгөрткүңүз келеби?", textContent: "TTL өзгөртүү бул ачкычтын жашоо убактысын жаңыртат. Бул ачкычты түбөлүккө сактоо үчүн бош калтырыңыз.", placeholder: "Redis ачкычынын TTL (бүтүн же бош)", placeholderPlaceholder: "бош дегенди билдирет, ал түбөлүккө сакталат; антпесе бүтүн санды киргизиңиз.", convertTextToTime: "Текстти убакытка айландыруу", convertTextToTimePlaceholder: "Мис. 1d 86400 болот" }, }, 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} натыйжаны экспорттоо`, deleteAllKeysMenu: (opts) => `Баарын жок кылуу ${opts.count}`, importKeys: "Ачкычтарды импорттоо", deleteSearchKeys: (opts) => `${opts.count} дал келген ачкычтарды жок кылуу`, saveWithFormatJson: "Формат менен сактоо", formatJson: "Json форматы", wrap: "Ороо", unwrap: "Оракты ачуу", downloadJson: "JSON жүктөп алыңыз", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 орнотуңуз", 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 менен башталган бир маанини көрсөңүз, анда бул коопсуз функция. Орнотууларды өзгөртүү үчүн, жөн гана бул жөндөөлөрдү бош же башка нерсе менен алмаштырыңыз жана алар сакталат. Эгер сиз орнотууларды өзгөртпөсөңүз, орнотуулар сервердегидей сакталып калат.", aiTranslating: "Translating...", aiSettings: "AI Орнотуулар", aiGroqApiKey: "Groq API ачкычы", aiGroqApiKeyInfo: "Милдеттүү эмес. Жакшыраак иштөө үчүн өзүңүздүн Groq API ачкычы. Акысыз ачкыч алыңыз", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API ачкычы сакталды", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Коюлган эмес (сервер демейки)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Байланыштар", keysSort: { on: "Ачкычтарды иреттөө күйүк", off: "Ачкычты сорттоо" }, cluster: { on: "Cluster күйүк", off: "Cluster өчүк" }, sentinel: { on: "Sentinel күйүк", off: "Sentinel өчүк", name: "Sentinel аты" }, readonly: { on: "Окуу үчүн гана", off: "Окуу үчүн гана өчүрүү" }, 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: "Убакыт", type: "Түрү", format: "Формат", loading: "Жүктөлүүдө...", autoRefresh: "Авто", exportSearchHint: "Учурдагы издөөгө дал келген ачкычтар гана экспортолот", importSearchHint: "Импорт издөө натыйжаларына эмес, бүт маалымат базасына колдонулат", deleteSearchHint: "Серверде учурдагы издөөгө дал келген бардык ачкычтарды жок кылат", deletingSearchKeys: "Дал келген ачкычтарды жок кылуу...", importNoKeys: "Файлдан ачкычтар табылган жок", }, status: { dataCopied: "Маалымат алмашуу буферинде", exportDone: "Экспорт аякталды", deletedSearchKeys: (opts) => `${opts.count} ачкыч жок кылынды`, 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": "Бул тизме индекси чектен чыккан", "invalid-json-value": "Маани жарактуу эмес JSON.", "http_auth_required": "Авторизация талап кылынат: HTTP Basic Auth менен аныктыгын текшерип, кайра жүктөңүз.", "auto-connection-failed": "Мүмкүн, туташуу өчүрүлүп, автоматтык туташуу ишке ашпай калды, ушундан улам.", invalid_console_command: "Бул буйрук GUI аркылуу иштебейт." }, 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: "Ачкычтар жок", rss: "RSS", peak: "Чокусу", fragmentation: "Фрагментация", hitsAndMisses: "Тийгендер / Өтүп кеткендер", noClients: "Кардарлар жок", }, analysis: { title: "Эс тутум талдоосу", runAnalysis: "Талдоону баштоо", running: "Талдануда...", typeDistribution: "Түр боюнча бөлүштүрүү", prefixMemory: "Префикс боюнча эс тутум", topKeysByMemory: "Эс тутум боюнча эң чоң ачкычтар", expirationOverview: "Ачкыч мөөнөтү", memoryBreakdown: "Эс тутум бөлүнүшү", keysScanned: "Сканерленген ачкычтар", totalMemory: "Жалпы эс тутум", rssMemory: "RSS эс тутум", peakMemory: "Чокусу эс тутум", luaMemory: "Lua эс тутум", overheadMemory: "Кошумча жүк", datasetMemory: "Маалымат жыйындысы", fragmentation: "Фрагментация", allocator: "Бөлүштүрүүчү", withTTL: "TTL менен", persistent: "Туруктуу", avgTTL: "Орточо TTL", prefix: "Префикс", keyCount: "Ачкыч саны", memoryUsage: "Эс тутум колдонуу", noPrefix: "(префикссиз)", topN: "Top N", maxScanKeys: "Макс. сканерлөө ачкычтары", type: "Түр", noData: "Маалымат жок. Баштоо үчүн Талдоону баштоо баскычын басыңыз.", exportAll: "Баарын экспорттоо", }, 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: "Нарк" } }, timeseries: { chart: "Диаграмма", info: "Маалымат", addPoint: "Маалымат чекити кошуу", from: "Баштоо (ms же -)", to: "Аяктоо (ms же +)", aggregation: "Агрегация", timeBucket: "Чака (ms)", none: "Жок", dataPoints: "маалымат чекиттери", labels: "Энбелгилер", rules: "Эрежелер", retention: "Сактоо", timestamp: "Убакыт белгиси", value: "Маани", retentionHint: "0 = мөөнөтү жок, же миллисекунд", duplicatePolicy: "Кайталоо саясаты", labelsHint: "ачкыч1 маани1 ачкыч2 маани2", timestampHint: "'*' автоматтык түрдө түзүлөт, же миллисекунд убакыт белгиси", editAllHint: "Бир сапка бир маалымат чекити: убакыт_белгиси маани (убакыт белгиси * авто үчүн болот)", autoSpread: "Авто * жайылтуу аралыгы", formula: "Формула", formulaLinear: "Сызыктуу", formulaRandom: "Кокустук", formulaSawtooth: "Араа тиш", formulaPoints: "Чекиттер", formulaAmplitude: "Амплитуда", formulaOffset: "Оффсет", generate: "Түзүү", exportChart: "PNG экспорттоо", overlay: "Үстүнө коюу ачкычтары", overlayHint: "Үтүр менен бөлүнгөн ачкычтар", mrangeFilter: "Энбелги чыпкасы", bulkMode: "Массалык генерация", mrangeHint: "мис. sensor=temp" } }, treeControls: { settings: "Дарак орнотуулары", expandAll: "Баарын кеңейтүү", collapseAll: "Баарын жыйноо", level: "Деңgeeл", search: { search: "Ачкычтардан издеңиз", clear: "Бош коюу үчүн учурдагы издөөнү тазалаңыз", placeholderClient: "Кардар тарабынан издөө", placeholderServer: "Издөө сервер тарабы", info: "Кардар тарабынан издөө дегенди билдирет, ал издөө киргизүүдөгү тек��тке дал келет. Сервер тарабында издөө, бул *{search-text}* сыяктуу баскычтардын үлгүлөрүндөгү издөө сыяктуу. Чоң издөө топтомдору үчүн сервердик издөөнү колдонуу жакшы. Кичинекей издөө топтомдору үчүн кардар тарабынан издөө режимин колдонуу жакшы." + ` Эгер ачкычтарды эсептөө бүтсө ${p3xr.settings.maxLightKeysCount}, сиз сервер тараптан гана издей аласыз.`, largeSetInfo: "Чоң топтомдо кардар тарабынан издөө өчүрүлгөн. ошондуктан азыр сервер тараптан издөө гана мүмкүн.", infoDetails: "Издөө кандай иштээрин билүү үчүн, жөндөөлөрдү текшериңиз" }, pager: { next: "Кийинки", prev: "Мурунку", first: "Биринчи", last: "Акыркы" } } }, time: { type: "Түрү", format: "Формат", loading: "Жүктөлүүдө...", years: "жыл", months: "айлар", days: "күн", year: "жыл", month: "ай", day: "күн", second: "секунд", seconds: "секунд", minute: "мүнөт", minutes: "мүнөт", hour: "саат", hours: "саат" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/lt/000077500000000000000000000000001517650670600137725ustar00rootroot00000000000000src/strings/lt/strings.js000066400000000000000000000650001517650670600160220ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Ar tikrai norite ištrinti visus raktus, atitinkančius "${opts.pattern}"? Rasta ${opts.count} raktų.`; }, 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.", delete: "Ištrinti?", 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" }, }, 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ų`, deleteAllKeysMenu: (opts) => `Ištrinti viską ${opts.count}`, importKeys: "Importuoti raktus", deleteSearchKeys: (opts) => `Ištrinti ${opts.count} atitinkančių raktų`, saveWithFormatJson: "Išsaugoti naudojant formatą", formatJson: "Json formatas", wrap: "Apvyniokite", unwrap: "Išvynioti", downloadJson: "Atsisiųskite JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Translating...", aiSettings: "AI nustatymai", aiGroqApiKey: "Groq API raktas", aiGroqApiKeyInfo: "Neprivaloma. Savo Groq API raktas geresniam veikimui. Gaukite nemokamą raktą", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API raktas išsaugotas", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Nenustatyta (serverio numatytasis)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tipas", format: "Formatas", loading: "Kraunama...", autoRefresh: "Auto", exportSearchHint: "Eksportuojami tik raktai, atitinkantys dabartinę paiešką", importSearchHint: "Importas taikomas visai duomenų bazei, ne tik paieškos rezultatams", deleteSearchHint: "Ištrina visus raktus, atitinkančius dabartinę paiešką serveryje", deletingSearchKeys: "Trinami atitinkantys raktai...", importNoKeys: "Faile nerasta raktų", }, status: { dataCopied: "Duomenys yra iškarpinėje", exportDone: "Eksportas baigtas", deletedSearchKeys: (opts) => `Ištrinta ${opts.count} raktų`, 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", "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." }, 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ų", rss: "RSS", peak: "Didžiausias", fragmentation: "Fragmentacija", hitsAndMisses: "Pataik. / Praleid.", noClients: "Nėra klientų", }, analysis: { title: "Atminties analizė", runAnalysis: "Paleisti analizę", running: "Analizuojama...", typeDistribution: "Tipų pasiskirstymas", prefixMemory: "Atmintis pagal prefiksą", topKeysByMemory: "Didžiausi raktai pagal atmintį", expirationOverview: "Raktų galiojimas", memoryBreakdown: "Atminties suskirstymas", keysScanned: "Nuskenuoti raktai", totalMemory: "Bendra atmintis", rssMemory: "RSS atmintis", peakMemory: "Didžiausia atmintis", luaMemory: "Lua atmintis", overheadMemory: "Papildomos sąnaudos", datasetMemory: "Duomenų rinkinys", fragmentation: "Fragmentacija", allocator: "Paskirstytojas", withTTL: "Su TTL", persistent: "Nuolatiniai", avgTTL: "Vidutinis TTL", prefix: "Prefiksas", keyCount: "Raktų skaičius", memoryUsage: "Atminties naudojimas", noPrefix: "(be prefikso)", topN: "Top N", maxScanKeys: "Maks. nuskenuotų raktų", type: "Tipas", noData: "Nėra duomenų. Spustelėkite Paleisti analizę, kad pradėtumėte.", exportAll: "Eksportuoti viską", }, 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ė" } }, timeseries: { chart: "Diagrama", info: "Informacija", addPoint: "Pridėti duomenų tašką", from: "Nuo (ms arba -)", to: "Iki (ms arba +)", aggregation: "Agregavimas", timeBucket: "Grupė (ms)", none: "Nėra", dataPoints: "duomenų taškai", labels: "Etiketės", rules: "Taisyklės", retention: "Saugojimas", timestamp: "Laiko žyma", value: "Reikšmė", retentionHint: "0 = nėra galiojimo pabaigos, arba milisekundės", duplicatePolicy: "Dublikatų politika", labelsHint: "raktas1 reikšmė1 raktas2 reikšmė2", timestampHint: "'*' reiškia automatiškai sugeneruota, arba milisekundžių laiko žyma", editAllHint: "Vienas duomenų taškas per eilutę: laiko_žyma reikšmė (laiko žyma gali būti * automatiniam)", autoSpread: "Automatinis * sklaidos intervalas", formula: "Formulė", formulaLinear: "Tiesinė", formulaRandom: "Atsitiktinė", formulaSawtooth: "Pjūklinė", formulaPoints: "Taškai", formulaAmplitude: "Amplitudė", formulaOffset: "Poslinkis", generate: "Generuoti", exportChart: "Eksportuoti PNG", overlay: "Perdangos raktai", overlayHint: "Kableliais atskirti raktai", mrangeFilter: "Etiketės filtras", bulkMode: "Masinis generavimas", mrangeHint: "pvz. sensor=temp" } }, treeControls: { settings: "Medžio nustatymai", expandAll: "Išskleisti viską", collapseAll: "Sutraukti viską", level: "Lygis", 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: { type: "Tipas", format: "Formatas", loading: "Kraunama...", years: "metų", months: "mėnesių", days: "dienų", year: "metų", month: "mėnuo", day: "dieną", second: "sekundė", seconds: "sekundės", minute: "minutė", minutes: "minutės", hour: "valanda", hours: "valandos" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/mk/000077500000000000000000000000001517650670600137625ustar00rootroot00000000000000src/strings/mk/strings.js000066400000000000000000001072761517650670600160260ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Дали сте сигурни дека ќе ги избришете сите клучеви што одговараат на "${opts.pattern}"? Пронајдени ${opts.count} клучеви.`; }, socketioConnectError: "Socket.IO не може да се поврзе со серверот, можете повторно да вчитате и да се обидете сами да ја решите грешката во врската, клиентот не знае како сам да ја реши.", socketioAuthRequired: "Потребна е овластување Socket.IO. Ве молиме проверете ја автентичноста со HTTP Basic Auth (корисничко име/лозинка) и вчитајте повторно.", delete: "Избриши?", deleteKey: "Дали сигурно ќе го избришете овој клуч?", rename: { title: "Дали сигурно ќе го преименувате овој клуч?", textContent: "Оваа акција трајно го преименува клучот.", placeholder: "Копчето Redis (задолжително)" }, ttl: { title: "Дали сте сигурни дека сакате да го промените TTL на овој клуч?", textContent: "Промената на TTL го ажурира времето на живеење на овој клуч. Оставете празен за да го задржите овој клуч засекогаш.", placeholder: "TTL на клучот Redis (цел број или празен)", placeholderPlaceholder: "Празно значи дека опстојува засекогаш; во спротивно внесете цел број.", convertTextToTime: "Претворете го текстот во време", convertTextToTimePlaceholder: "На пр. 1d ќе биде 86400" }, }, 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} резултати`, deleteAllKeysMenu: (opts) => `Избриши ги сите ${opts.count}`, importKeys: "Увези клучеви", deleteSearchKeys: (opts) => `Избриши ${opts.count} совпаѓачки клучеви`, saveWithFormatJson: "Зач��вај со формат", formatJson: "Форматирајте Json", wrap: "Завиткајте", unwrap: "Одвиткајте", downloadJson: "Преземете го JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 и изгледа исто, тоа е безбедна карактеристика. За да ги промените поставките, само заменете ги со празни или нешто друго и тие ќе бидат зачувани. Ако не ги промените поставките, поставките ќе се задржат како што се на серверот.", aiTranslating: "Translating...", aiSettings: "AI Поставки", aiGroqApiKey: "Groq API клуч", aiGroqApiKeyInfo: "Опционално. Сопствен Groq API клуч за подобри перформанси. Добијте бесплатен клуч од", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API клучот е зачуван", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Не е поставено (стандардно на серверот)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Врски", keysSort: { on: "Вклучено е сортирање на копчињата", off: "Сортирање на копчињата" }, cluster: { on: "Cluster вклучен", off: "Cluster исклучено" }, sentinel: { on: "Sentinel вклучен", off: "Sentinel исклучено", name: "Sentinel име" }, readonly: { on: "Вклучено само за читање", off: "Исклучено само за читање" }, 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: "Време", type: "Тип", format: "Формат", loading: "Се вчитува...", autoRefresh: "Авто", exportSearchHint: "Извоз само на клучеви кои одговараат на тековното пребарување", importSearchHint: "Увозот се применува на целата база на податоци, не само на резултатите од пребарувањето", deleteSearchHint: "Ги брише сите клучеви што одговараат на тековното пребарување на серверот", deletingSearchKeys: "Бришење на совпаѓачки клучеви...", importNoKeys: "Не се пронајдени клучеви во датотеката", }, status: { dataCopied: "Податоците се во таблата со исечоци", exportDone: "Извозот е завршен", deletedSearchKeys: (opts) => `Избришани ${opts.count} клучеви`, 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": "Овој индекс на список е надвор од границите", "invalid-json-value": "Вредноста не е валидна JSON.", "http_auth_required": "Потребна е овластување: ве молиме проверете ја автентичноста со HTTP Basic Auth и вчитајте ја повторно.", "auto-connection-failed": "Можно е, врската е отстранета и автоматската врска не успеа, поради ова.", invalid_console_command: "Оваа команда не работи преку GUI." }, 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: "Нема клучеви", rss: "RSS", peak: "Врв", fragmentation: "Фрагментација", hitsAndMisses: "Погодоци / Промашувања", noClients: "Нема клиенти", }, analysis: { title: "Анализа на меморија", runAnalysis: "Стартувај анализа", running: "Се анализира...", typeDistribution: "Дистрибуција на типови", prefixMemory: "Меморија по префикс", topKeysByMemory: "Најголеми клучеви по меморија", expirationOverview: "Истекување на клучеви", memoryBreakdown: "Распределба на меморија", keysScanned: "Скенирани клучеви", totalMemory: "Вкупна меморија", rssMemory: "RSS меморија", peakMemory: "Врвна меморија", luaMemory: "Lua меморија", overheadMemory: "Дополнително оптоварување", datasetMemory: "Податочен сет", fragmentation: "Фрагментација", allocator: "Алокатор", withTTL: "Со TTL", persistent: "Трајни", avgTTL: "Просечен TTL", prefix: "Префикс", keyCount: "Број на клучеви", memoryUsage: "Користење на меморија", noPrefix: "(без префикс)", topN: "Top N", maxScanKeys: "Макс. скенирани клучеви", type: "Тип", noData: "Нема податоци. Кликнете Стартувај анализа за да започнете.", exportAll: "Извези сè", }, 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: "Вредност" } }, timeseries: { chart: "Графикон", info: "Информации", addPoint: "Додај податочна точка", from: "Од (ms или -)", to: "До (ms или +)", aggregation: "Агрегација", timeBucket: "Корпа (ms)", none: "Нема", dataPoints: "податочни точки", labels: "Етикети", rules: "Правила", retention: "Задржување", timestamp: "Временски печат", value: "Вредност", retentionHint: "0 = без истекување, или милисекунди", duplicatePolicy: "Политика за дупликати", labelsHint: "клуч1 вредност1 клуч2 вредност2", timestampHint: "'*' значи автоматски генерирано, или милисекунди временски печат", editAllHint: "Една податочна точка по ред: временски_печат вредност (временскиот печат може да биде * за автоматски)", autoSpread: "Авто * интервал на ширење", formula: "Формула", formulaLinear: "Линеарна", formulaRandom: "Случајна", formulaSawtooth: "Пила", formulaPoints: "Точки", formulaAmplitude: "Амплитуда", formulaOffset: "Поместување", generate: "Генерирај", exportChart: "Извези PNG", overlay: "Преклопи клучеви", overlayHint: "Клучеви одделени со запирка", mrangeFilter: "Филтер за етикети", bulkMode: "Масовно генерирање", mrangeHint: "пр. sensor=temp" } }, treeControls: { settings: "Поставки за дрво", expandAll: "Прошири ги сите", collapseAll: "Собори ги сите", level: "Ниво", search: { search: "Пребарајте во копчињата", clear: "Исчистете го тековното пребарување за да го поставите празно", placeholderClient: "Пребарајте ја страната на клиентот", placeholderServer: "Пребарување на страната на серверот", info: "Пребарувањето од страна на клиентот значи дека се совпаѓа со текстот во влезот за пребарување. Пребарувањето од страна на серверот значи, тоа е како пребарување во шаблоните на копчињата како *{search-text}*. За големи групи на пребарување, подобро е да користите пребарување од страна на серверот. За помали групи за пребарување, подобро е да се користи режимот за пребарување од страна на клиентот." + ` Ако пребројувањето на копчињата заврши ${p3xr.settings.maxLightKeysCount}, можете да пребарувате само на страната на серверот.`, largeSetInfo: "Во голем сет, пребарувањето од страна на клиентот е оневозможено. така што во моментов е можно само пребарување од страна на серверот.", infoDetails: "За да дознаете како функционира пребарувањето, проверете ги поставките" }, pager: { next: "Следно", prev: "Претходна", first: "Прво", last: "Последно" } } }, time: { type: "Тип", format: "Формат", loading: "Се вчитува...", years: "години", months: "месеци", days: "денови", year: "година", month: "месец", day: "ден", second: "секунда", seconds: "секунди", minute: "минута", minutes: "минути", hour: "час", hours: "часови" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ms/000077500000000000000000000000001517650670600137725ustar00rootroot00000000000000src/strings/ms/strings.js000066400000000000000000000632541517650670600160330ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Adakah anda pasti untuk memadamkan semua kunci yang sepadan dengan "${opts.pattern}"? Dijumpai ${opts.count} kunci.`; }, 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.", delete: "Padam?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Padam semua ${opts.count}`, importKeys: "Import kunci", deleteSearchKeys: (opts) => `Padamkan ${opts.count} kunci yang sepadan`, saveWithFormatJson: "Simpan dengan format", formatJson: "Format Json", wrap: "Bungkus", unwrap: "Buka bungkus", downloadJson: "Muat turun JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Translating...", aiSettings: "Tetapan AI", aiGroqApiKey: "Kunci API Groq", aiGroqApiKeyInfo: "Pilihan. Kunci API Groq sendiri untuk prestasi lebih baik. Dapatkan kunci percuma dari", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Kunci API AI disimpan", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Tidak ditetapkan (lalai pelayan)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Jenis", format: "Format", loading: "Memuatkan...", autoRefresh: "Auto", exportSearchHint: "Mengeksport hanya kunci yang sepadan dengan carian semasa", importSearchHint: "Import dikenakan pada keseluruhan pangkalan data, bukan hanya hasil carian", deleteSearchHint: "Memadamkan semua kunci yang sepadan dengan carian semasa di pelayan", deletingSearchKeys: "Memadamkan kunci yang sepadan...", importNoKeys: "Tiada kunci ditemui dalam fail", }, status: { dataCopied: "Data berada dalam papan keratan", exportDone: "Eksport selesai", deletedSearchKeys: (opts) => `${opts.count} kunci dipadamkan`, 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", "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." }, 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", rss: "RSS", peak: "Puncak", fragmentation: "Fragmentasi", hitsAndMisses: "Hit / Miss", noClients: "Tiada pelanggan", }, analysis: { title: "Analisis Memori", runAnalysis: "Jalankan Analisis", running: "Menganalisis...", typeDistribution: "Taburan Jenis", prefixMemory: "Memori mengikut Awalan", topKeysByMemory: "Kunci Terbesar mengikut Memori", expirationOverview: "Tamat Tempoh Kunci", memoryBreakdown: "Pecahan Memori", keysScanned: "Kunci Diimbas", totalMemory: "Jumlah Memori", rssMemory: "Memori RSS", peakMemory: "Memori Puncak", luaMemory: "Memori Lua", overheadMemory: "Overhead", datasetMemory: "Set Data", fragmentation: "Fragmentasi", allocator: "Pengagih", withTTL: "Dengan TTL", persistent: "Kekal", avgTTL: "Purata TTL", prefix: "Awalan", keyCount: "Bilangan Kunci", memoryUsage: "Penggunaan Memori", noPrefix: "(tiada awalan)", topN: "Top N", maxScanKeys: "Maks. Kunci Diimbas", type: "Jenis", noData: "Tiada data. Klik Jalankan Analisis untuk mula.", exportAll: "Eksport Semua", }, 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" } }, timeseries: { chart: "Carta", info: "Maklumat", addPoint: "Tambah Titik Data", from: "Dari (ms atau -)", to: "Hingga (ms atau +)", aggregation: "Pengagregatan", timeBucket: "Baldi (ms)", none: "Tiada", dataPoints: "titik data", labels: "Label", rules: "Peraturan", retention: "Pengekalan", timestamp: "Cap masa", value: "Nilai", retentionHint: "0 = tiada tamat tempoh, atau milisaat", duplicatePolicy: "Dasar pendua", labelsHint: "kunci1 nilai1 kunci2 nilai2", timestampHint: "'*' bermaksud dijana automatik, atau cap masa milisaat", editAllHint: "Satu titik data setiap baris: cap_masa nilai (cap masa boleh * untuk automatik)", autoSpread: "Selang sebaran automatik *", formula: "Formula", formulaLinear: "Linear", formulaRandom: "Rawak", formulaSawtooth: "Gigi gergaji", formulaPoints: "Titik", formulaAmplitude: "Amplitud", formulaOffset: "Ofset", generate: "Jana", exportChart: "Eksport PNG", overlay: "Tindih kunci", overlayHint: "Kunci dipisahkan koma", mrangeFilter: "Penapis label", bulkMode: "Penjanaan pukal", mrangeHint: "cth. sensor=temp" } }, treeControls: { settings: "Tetapan pokok", expandAll: "Kembangkan semua", collapseAll: "Runtuhkan semua", level: "Tahap", 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: { type: "Jenis", format: "Format", loading: "Memuatkan...", years: "tahun", months: "bulan", days: "hari", year: "tahun", month: "bulan", day: "hari", second: "saat", seconds: "saat", minute: "minit", minutes: "minit", hour: "jam", hours: "jam" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ne/000077500000000000000000000000001517650670600137555ustar00rootroot00000000000000src/strings/ne/strings.js000066400000000000000000001247471517650670600160230ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" सँग मिल्ने सबै कुञ्जीहरू मेटाउन निश्चित हुनुहुन्छ? ${opts.count} कुञ्जीहरू फेला परे।`; }, socketioConnectError: "Socket.IO सर्भरमा जडान हुन सक्दैन, तपाइँ पुन: लोड गर्न सक्नुहुन्छ र जडान त्रुटि आफैं समाधान गर्न प्रयास गर्न सक्नुहुन्छ, ग्राहकलाई थाहा छैन कि यसलाई कसरी समाधान गर्ने।", socketioAuthRequired: "Socket.IO प्राधिकरण आवश्यक छ। कृपया HTTP Basic Auth (प्रयोगकर्ता नाम/पासवर्ड) को साथ प्रमाणीकरण गर्नुहोस् र पुन: लोड गर्नुहोस्।", delete: "मेटाउने?", deleteKey: "के तपाइँ यो कुञ्जी मेटाउन निश्चित हुनुहुन्छ?", rename: { title: "के तपाइँ यो कुञ्जी पुन: नामाकरण गर्न निश्चित हुनुहुन्छ?", textContent: "यो कार्यले स्थायी रूपमा कुञ्जीलाई पुन: नामाकरण गर्छ।", placeholder: "Redis कुञ्जी (आवश्यक)" }, ttl: { title: "के तपाइँ यो कुञ्जीको TTL परिवर्तन गर्न निश्चित हुनुहुन्छ?", textContent: "TTL परिवर्तन गर्नाले यो कुञ्जीको बाँच्ने समय अपडेट हुन्छ। यो कुञ्जीलाई सधैंभरि राख्न खाली छोड्नुहोस्।", placeholder: "Redis कुञ्जीको TTL (पूर्णांक वा खाली)", placeholderPlaceholder: "खाली को अर्थ यो सधैंभरि रहन्छ; अन्यथा एक पूर्णांक प्रविष्ट गर्नुहोस्।", convertTextToTime: "पाठलाई समयमा रूपान्तरण गर्नुहोस्", convertTextToTimePlaceholder: "जस्तै। 1d 86400 हुनेछ" }, }, 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} परिणामहरू निर्यात`, deleteAllKeysMenu: (opts) => `सबै मेटाउनुहोस् ${opts.count}`, importKeys: "कुञ्जीहरू आयात गर्नुहोस्", deleteSearchKeys: (opts) => `${opts.count} मिल्ने कुञ्जीहरू मेटाउनुहोस्`, saveWithFormatJson: "ढाँचा संग बचत गर्नुहोस्", formatJson: "ढाँचा Json", wrap: "लपेट्���ुहोस्", unwrap: "खोल्नुहोस्", downloadJson: "JSON डाउनलोड गर्नुहोस्", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 सेट गर्नुहोस्", 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 बाट सुरु हुने मान देख्नुभयो भने, यो एक सुरक्षित सुविधा हो। सेटिङ्हरू परिवर्तन गर्नका लागि, यी सेटिङहरूलाई खाली वा अरू केहीले बदल्नुहोस् र तिनीहरू बचत हुनेछन्। यदि तपाइँ सेटिङहरू परिवर्तन गर्नुहुन्न भने, सेटिङहरू सर्भरमा जस्तै राखिनेछ।", aiTranslating: "Translating...", aiSettings: "AI सेटिङ", aiGroqApiKey: "Groq API कुञ्जी", aiGroqApiKeyInfo: "वैकल्पिक। राम्रो प्रदर्शनको लागि आफ्नो Groq API कुञ्जी। निःशुल्क कुञ्जी प्राप्त गर्नुहोस्", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API कुञ्जी सुरक्षित गरियो", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "सेट गरिएको छैन (सर्भर पूर्वनिर्धारित)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "जडानहरू", keysSort: { on: "कुञ्जी क्रमबद्ध गर्दै", off: "कुञ्जी क्रमबद्ध बन्द" }, cluster: { on: "Cluster सक्रिय", off: "Cluster बन्द" }, sentinel: { on: "Sentinel सक्रिय", off: "Sentinel बन्द", name: "Sentinel नाम" }, readonly: { on: "पढ्न मात्र", off: "पढ्ने मात्र बन्द" }, 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: "समय", type: "प्रकार", format: "ढाँचा", loading: "लोड हुँदैछ...", autoRefresh: "स्वचालित", exportSearchHint: "हालको खोजसँग मिल्ने कुञ्जीहरू मात्र निर्यात हुँदैछ", importSearchHint: "आयात सम्पूर्ण डाटाबेसमा लागू हुन्छ, खोज परिणामहरूमा मात्र होइन", deleteSearchHint: "सर्भरमा हालको खोजसँग मिल्ने सबै कुञ्जीहरू मेटाउँछ", deletingSearchKeys: "मिल्ने कुञ्जीहरू मेटाउँदै...", importNoKeys: "फाइलमा कुञ्जीहरू फेला परेनन्", }, status: { dataCopied: "डाटा क्लिपबोर्डमा छ", exportDone: "निर्यात पूरा भयो", deletedSearchKeys: (opts) => `${opts.count} कुञ्जीहरू मेटाइयो`, 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": "यो सूची सूचकांक सीमा बाहिर छ", "invalid-json-value": "मान मान्य छैन JSON।", "http_auth_required": "प्राधिकरण आवश्यक छ: कृपया HTTP Basic Auth को साथ प्रमाणीकरण गर्नुहोस् र पुन: लोड गर्नुहोस्।", "auto-connection-failed": "सम्भव छ, जडान हटाइयो र स्वत जडान असफल भयो, यस कारण।", invalid_console_command: "यो आदेश GUI मार्फत काम गरिरहेको छैन।" }, 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: "कुञ्जीहरू छैनन्", rss: "RSS", peak: "शिखर", fragmentation: "फ्र्यागमेन्टेसन", hitsAndMisses: "हिट / मिस", noClients: "ग्राहकहरू छैनन्", }, analysis: { title: "मेमोरी विश्लेषण", runAnalysis: "विश्लेषण चलाउनुहोस्", running: "विश्लेषण गर्दै...", typeDistribution: "प्रकार वितरण", prefixMemory: "उपसर्ग अनुसार मेमोरी", topKeysByMemory: "मेमोरी अनुसार शीर्ष कुञ्जी", expirationOverview: "कुञ्जी म्याद", memoryBreakdown: "मेमोरी विभाजन", keysScanned: "स्क्यान गरिएका कुञ्जी", totalMemory: "कुल मेमोरी", rssMemory: "RSS मेमोरी", peakMemory: "शिखर मेमोरी", luaMemory: "Lua मेमोरी", overheadMemory: "ओभरहेड", datasetMemory: "डाटासेट", fragmentation: "फ्र्यागमेन्टेसन", allocator: "एलोकेटर", withTTL: "TTL सहित", persistent: "स्थायी", avgTTL: "औसत TTL", prefix: "उपसर्ग", keyCount: "कुञ्जी संख्या", memoryUsage: "मेमोरी प्रयोग", noPrefix: "(उपसर्ग छैन)", topN: "Top N", maxScanKeys: "अधिकतम स्क्यान कुञ्जी", type: "प्रकार", noData: "कुनै डाटा छैन। सुरु गर्न विश्लेषण चलाउनुहोस् मा क्लिक गर्नुहोस्।", exportAll: "सबै निर्यात", }, 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: "मूल्य" } }, timeseries: { chart: "चार्ट", info: "जानकारी", addPoint: "डाटा बिन्दु थप्नुहोस्", from: "देखि (ms वा -)", to: "सम्म (ms वा +)", aggregation: "एकत्रीकरण", timeBucket: "बाल्टी (ms)", none: "कुनै पनि छैन", dataPoints: "डाटा बिन्दुहरू", labels: "लेबलहरू", rules: "नियमहरू", retention: "धारण", timestamp: "टाइमस्ट्याम्प", value: "मान", retentionHint: "0 = म्याद सकिँदैन, वा मिलिसेकेन्ड", duplicatePolicy: "नक्कल नीति", labelsHint: "कुञ्जी1 मान1 कुञ्जी2 मान2", timestampHint: "'*' स्वचालित रूपमा उत्पन्न हुन्छ, वा मिलिसेकेन्ड टाइमस्ट्याम्प", editAllHint: "प्रति पंक्ति एउटा डाटा बिन्दु: टाइमस्ट्याम्प मान (टाइमस्ट्याम्प स्वचालितको लागि * हुन सक्छ)", autoSpread: "स्वचालित * फैलावट अन्तराल", formula: "सूत्र", formulaLinear: "रैखिक", formulaRandom: "अनियमित", formulaSawtooth: "करौंती दाँत", formulaPoints: "बिन्दुहरू", formulaAmplitude: "आयाम", formulaOffset: "अफसेट", generate: "उत्पन्न गर्नुहोस्", exportChart: "PNG निर्यात गर्नुहोस्", overlay: "ओभरले कुञ्जीहरू", overlayHint: "अल्पविरामले छुट्याइएका कुञ्जीहरू", mrangeFilter: "लेबल फिल्टर", bulkMode: "बल्क जेनरेट", mrangeHint: "उदा. sensor=temp" } }, treeControls: { settings: "रूख सेटिङहरू", expandAll: "सबै विस्तार गर्नुहोस्", collapseAll: "सबै संक्षिप्त गर्नुहोस्", level: "स्तर", search: { search: "कुञ्जीहरूमा खोज्नुहोस्", clear: "खाली सेट गर्न हालको खोज खाली गर्नुहोस्", placeholderClient: "ग्राहक पक्ष खोज्नुहोस्", placeholderServer: "सर्भर साइड खोज्नुहोस्", info: "क्लाइन्ट साइड खोजको अर्थ, यो खोज इनपुटमा पाठसँग मेल खान्छ। सर्भर साइड खोजको अर्थ, यो कुञ्जी ढाँचामा *{search-text}* को रूपमा खोजी जस्तै हो। ठूला खोज सेटहरूको लागि, यो सर्भर साइड खोजी प्रयोग गर्न राम्रो छ। साना खोज सेटहरूको लागि, ग्राहक पक्ष खोज मोड प्रयोग गर्न राम्रो छ।" + ` यदि कुञ्जी गणना सकियो ${p3xr.settings.maxLightKeysCount}, तपाईले सर्भर साइडमा मात्र खोज्न सक्नुहुन्छ।`, largeSetInfo: "ठूलो सेटमा, ग्राहक पक्ष खोज असक्षम गरिएको छ। त्यसैले अहिले मात्र सर्भर साइड खोजी सम्भव छ।", infoDetails: "खोज कसरी काम गर्छ पत्ता लगाउन, कृपया सेटिङहरू जाँच गर्नुहोस्" }, pager: { next: "अर्को", prev: "अघिल्लो", first: "पहिले", last: "अन्तिम" } } }, time: { type: "प्रकार", format: "ढाँचा", loading: "लोड हुँदैछ...", years: "वर्ष", months: "महिना", days: "दिनहरू", year: "वर्ष", month: "महिना", day: "दिन", second: "सेकेन्ड", seconds: "सेकेन्ड", minute: "मिनेट", minutes: "मिनेट", hour: "घण्टा", hours: "घण्टा" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/nl/000077500000000000000000000000001517650670600137645ustar00rootroot00000000000000src/strings/nl/strings.js000066400000000000000000000643401517650670600160220ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Verwijderen?", deleteAllKeys: opts => { return `Deze boom en al zijn sleutels verwijderen (${opts.key})?`; }, deleteSearchKeys: opts => { return `Weet u zeker dat u alle sleutels wilt verwijderen die overeenkomen met "${opts.pattern}"? ${opts.count} sleutels gevonden.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Alles verwijderen ${opts.count}`, importKeys: "Sleutels importeren", deleteSearchKeys: (opts) => `${opts.count} overeenkomende sleutels verwijderen`, saveWithFormatJson: "Opslaan met opmaak", formatJson: "Json opmaken", wrap: "Terugloop", unwrap: "Geen terugloop", downloadJson: "JSON downloaden", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Vertalen...", aiSettings: "AI-instellingen", aiGroqApiKey: "Groq API-sleutel", aiGroqApiKeyInfo: "Optioneel. Eigen Groq API-sleutel voor betere prestaties. Verkrijg een gratis sleutel op", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-sleutel opgeslagen", aiGroqApiKeyInvalid: "Ongeldige Groq API-sleutel", aiGroqApiKeyNotSet: "Niet ingesteld (server standaard)", aiEnabled: "AI ingeschakeld", aiEnabledYes: "Ja", aiEnabledNo: "Nee", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries gaan rechtstreeks naar Groq met uw eigen API-sleutel, zonder network.corifeus.com.", aiRoutingNetwork: "AI-queries worden via network.corifeus.com gerouteerd. Als u uw eigen gratis Groq API-sleutel hebt, kunt u deze schakelaar uitschakelen.", 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", 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" }, 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", type: "Type", format: "Formaat", 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", deleteSearchHint: "Alle sleutels verwijderen die overeenkomen met de huidige zoekopdracht", deletingSearchKeys: "Overeenkomende sleutels worden verwijderd...", importNoKeys: "Geen sleutels gevonden in bestand", }, status: { dataCopied: "De gegevens staan op het klembord", exportDone: "Export voltooid", deletedSearchKeys: (opts) => `${opts.count} sleutels verwijderd`, 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", "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." }, 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", rss: "RSS", peak: "Piek", fragmentation: "Fragmentatie", hitsAndMisses: "Treffers / Missers", noClients: "Geen clients", }, analysis: { title: "Geheugenanalyse", runAnalysis: "Analyse Starten", running: "Analyseren...", typeDistribution: "Typeverdeling", prefixMemory: "Geheugen per Prefix", topKeysByMemory: "Grootste Sleutels per Geheugen", expirationOverview: "Sleutelvervaldatum", memoryBreakdown: "Geheugenopbouw", keysScanned: "Gescande Sleutels", totalMemory: "Totaal Geheugen", rssMemory: "RSS Geheugen", peakMemory: "Piekgeheugen", luaMemory: "Lua Geheugen", overheadMemory: "Overhead", datasetMemory: "Dataset", fragmentation: "Fragmentatie", allocator: "Allocator", withTTL: "Met TTL", persistent: "Permanent", avgTTL: "Gemiddelde TTL", prefix: "Prefix", keyCount: "Aantal Sleutels", memoryUsage: "Geheugengebruik", noPrefix: "(geen prefix)", topN: "Top N", maxScanKeys: "Max. Gescande Sleutels", type: "Type", noData: "Geen gegevens. Klik op Analyse Starten om te beginnen.", exportAll: "Alles Exporteren", }, 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" } }, timeseries: { chart: "Grafiek", info: "Info", addPoint: "Punt toevoegen", from: "Van (ms of -)", to: "Tot (ms of +)", aggregation: "Aggregatie", timeBucket: "Bucket (ms)", none: "Geen", dataPoints: "datapunten", labels: "Labels", rules: "Regels", retention: "Bewaring", timestamp: "Tijdstempel", value: "Waarde", retentionHint: "0 = geen vervaldatum, of milliseconden", duplicatePolicy: "Duplicaatbeleid", labelsHint: "sleutel1 waarde1 sleutel2 waarde2", timestampHint: "'*' betekent automatisch gegenereerd, of tijdstempel in milliseconden", editAllHint: "Eén datapunt per regel: tijdstempel waarde (tijdstempel kan * zijn voor automatisch)", autoSpread: "Automatisch * spreidingsinterval", formula: "Formule", formulaLinear: "Lineair", formulaRandom: "Willekeurig", formulaSawtooth: "Zaagtand", formulaPoints: "Punten", formulaAmplitude: "Amplitude", formulaOffset: "Offset", generate: "Genereren", exportChart: "PNG exporteren", overlay: "Sleutels overlappen", overlayHint: "Door komma's gescheiden sleutels", mrangeFilter: "Labelfilter", bulkMode: "Bulk genereren", mrangeHint: "bijv. sensor=temp" } }, treeControls: { settings: "Boominstellingen", expandAll: "Alles uitvouwen", collapseAll: "Alles invouwen", level: "Niveau", 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: { type: "Type", format: "Formaat", loading: "Laden...", years: "jaren", months: "maanden", days: "dagen", year: "jaar", month: "maand", day: "dag", second: "seconde", seconds: "seconden", minute: "minuut", minutes: "minuten", hour: "uur", hours: "uren" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/no/000077500000000000000000000000001517650670600137675ustar00rootroot00000000000000src/strings/no/strings.js000066400000000000000000000627101517650670600160240ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Er du sikker på at du vil slette alle nøkler som matcher "${opts.pattern}"? Fant ${opts.count} nøkler.`; }, 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.", delete: "Slette?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Slett alle ${opts.count}`, importKeys: "Importer nøkler", deleteSearchKeys: (opts) => `Slett ${opts.count} matchende nøkler`, saveWithFormatJson: "Lagre med format", formatJson: "Format Json", wrap: "Pakk inn", unwrap: "Pakk ut", downloadJson: "Last ned JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Oversetter...", aiSettings: "AI-innstillinger", aiGroqApiKey: "Groq API-nøkkel", aiGroqApiKeyInfo: "Valgfritt. Egen Groq API-nøkkel for bedre ytelse. Skaff en gratis nøkkel på", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-nøkkel lagret", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Ikke satt (serverstandard)", aiEnabled: "AI aktivert", aiEnabledYes: "Ja", aiEnabledNo: "Nei", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Type", format: "Format", loading: "Laster...", autoRefresh: "Auto", exportSearchHint: "Eksporterer kun nøkler som matcher gjeldende søk", importSearchHint: "Import gjelder for hele databasen, ikke bare søkeresultater", deleteSearchHint: "Sletter alle nøkler som matcher gjeldende søk på serveren", deletingSearchKeys: "Sletter matchende nøkler...", importNoKeys: "Ingen nøkler funnet i filen", }, status: { dataCopied: "Dataene er i utklippstavlen", exportDone: "Eksport fullført", deletedSearchKeys: (opts) => `${opts.count} nøkler slettet`, 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", "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." }, 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", rss: "RSS", peak: "Topp", fragmentation: "Fragmentering", hitsAndMisses: "Treff / Bom", noClients: "Ingen klienter", }, analysis: { title: "Minneanalyse", runAnalysis: "Kjør analyse", running: "Analyserer...", typeDistribution: "Typefordeling", prefixMemory: "Minne etter prefiks", topKeysByMemory: "Største nøkler etter minne", expirationOverview: "Nøkkelutløp", memoryBreakdown: "Minnefordeling", keysScanned: "Skannede nøkler", totalMemory: "Totalt minne", rssMemory: "RSS-minne", peakMemory: "Toppminne", luaMemory: "Lua-minne", overheadMemory: "Overhead", datasetMemory: "Datasett", fragmentation: "Fragmentering", allocator: "Allokator", withTTL: "Med TTL", persistent: "Permanente", avgTTL: "Gjennomsnittlig TTL", prefix: "Prefiks", keyCount: "Antall nøkler", memoryUsage: "Minnebruk", noPrefix: "(uten prefiks)", topN: "Top N", maxScanKeys: "Maks. skannede nøkler", type: "Type", noData: "Ingen data. Klikk Kjør analyse for å starte.", exportAll: "Eksporter alt", }, 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" } }, timeseries: { chart: "Diagram", info: "Info", addPoint: "Legg til datapunkt", from: "Fra (ms eller -)", to: "Til (ms eller +)", aggregation: "Aggregering", timeBucket: "Tidsintervall (ms)", none: "Ingen", dataPoints: "datapunkter", labels: "Etiketter", rules: "Regler", retention: "Oppbevaring", timestamp: "Tidsstempel", value: "Verdi", retentionHint: "0 = ingen utlop, eller millisekunder", duplicatePolicy: "Duplikatpolicy", labelsHint: "nokkel1 verdi1 nokkel2 verdi2", timestampHint: "'*' betyr automatisk generering, eller tidsstempel i millisekunder", editAllHint: "Ett datapunkt per linje: tidsstempel verdi (tidsstempel kan vaere * for auto)", autoSpread: "Automatisk * spredningsintervall", formula: "Formel", formulaLinear: "Lineaer", formulaRandom: "Tilfeldig", formulaSawtooth: "Sagtann", formulaPoints: "Punkter", formulaAmplitude: "Amplitude", formulaOffset: "Forskyvning", generate: "Generer", exportChart: "Eksporter PNG", overlay: "Overlegg nokler", overlayHint: "Kommaseparerte nokler", mrangeFilter: "Etikettfilter", bulkMode: "Massegenerering", mrangeHint: "f.eks. sensor=temp" } }, treeControls: { settings: "Treinnstillinger", expandAll: "Utvid alle", collapseAll: "Skjul alle", level: "Nivå", 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: { type: "Type", format: "Format", loading: "Laster...", years: "år", months: "måneder", days: "dager", year: "år", month: "måned", day: "dag", second: "sekund", seconds: "sekunder", minute: "minutt", minutes: "minutter", hour: "time", hours: "timer" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/pl/000077500000000000000000000000001517650670600137665ustar00rootroot00000000000000src/strings/pl/strings.js000066400000000000000000000647711517650670600160340ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Czy na pewno chcesz usunąć wszystkie klucze pasujące do "${opts.pattern}"? Znaleziono ${opts.count} kluczy.`; }, 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ę.", delete: "Usunąć?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Usuń wszystkie ${opts.count}`, importKeys: "Importuj klucze", deleteSearchKeys: (opts) => `Usuń ${opts.count} pasujących kluczy`, saveWithFormatJson: "Zapisz z formatowaniem", formatJson: "Formatuj Json", wrap: "Zawijaj", unwrap: "Nie zawijaj", downloadJson: "Pobierz JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Tłumaczenie...", aiSettings: "Ustawienia AI", aiGroqApiKey: "Klucz API Groq", aiGroqApiKeyInfo: "Opcjonalnie. Własny klucz API Groq dla lepszej wydajności. Uzyskaj darmowy klucz na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Klucz API AI zapisany", aiGroqApiKeyInvalid: "Nieprawidłowy klucz API Groq", aiGroqApiKeyNotSet: "Nie ustawiono (domyślne serwera)", aiEnabled: "AI włączone", aiEnabledYes: "Tak", aiEnabledNo: "Nie", aiRouteViaNetwork: "Trasa przez network.corifeus.com", aiRoutingDirect: "Zapytania kierowane bezpośrednio do Groq z własnym kluczem API, omijając network.corifeus.com.", aiRoutingNetwork: "Zapytania AI kierowane przez network.corifeus.com. Jeśli masz własny darmowy klucz API Groq, możesz wyłączyć ten przełącznik.", 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", 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" }, 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", type: "Typ", format: "Format", 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", deleteSearchHint: "Usuwa wszystkie klucze pasujące do bieżącego wyszukiwania na serwerze", deletingSearchKeys: "Usuwanie pasujących kluczy...", importNoKeys: "Nie znaleziono kluczy w pliku", }, status: { dataCopied: "Dane są w schowku", exportDone: "Eksport zakończony", deletedSearchKeys: (opts) => `Usunięto ${opts.count} kluczy`, 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", "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." }, 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", rss: "RSS", peak: "Szczyt", fragmentation: "Fragmentacja", hitsAndMisses: "Trafienia / Chybienia", noClients: "Brak klientów", }, analysis: { title: "Analiza pamięci", runAnalysis: "Uruchom analizę", running: "Analizowanie...", typeDistribution: "Rozkład typów", prefixMemory: "Pamięć wg prefiksu", topKeysByMemory: "Największe klucze wg pamięci", expirationOverview: "Wygasanie kluczy", memoryBreakdown: "Podział pamięci", keysScanned: "Przeskanowane klucze", totalMemory: "Całkowita pamięć", rssMemory: "Pamięć RSS", peakMemory: "Szczytowa pamięć", luaMemory: "Pamięć Lua", overheadMemory: "Narzut", datasetMemory: "Zbiór danych", fragmentation: "Fragmentacja", allocator: "Alokator", withTTL: "Z TTL", persistent: "Trwałe", avgTTL: "Średni TTL", prefix: "Prefiks", keyCount: "Liczba kluczy", memoryUsage: "Użycie pamięci", noPrefix: "(bez prefiksu)", topN: "Top N", maxScanKeys: "Maks. przeskanowanych kluczy", type: "Typ", noData: "Brak danych. Kliknij Uruchom analizę, aby rozpocząć.", exportAll: "Eksportuj wszystko", }, 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ść" } }, timeseries: { chart: "Wykres", info: "Informacje", addPoint: "Dodaj punkt danych", from: "Od (ms lub -)", to: "Do (ms lub +)", aggregation: "Agregacja", timeBucket: "Przedział (ms)", none: "Brak", dataPoints: "punkty danych", labels: "Etykiety", rules: "Reguły", retention: "Retencja", timestamp: "Znacznik czasu", value: "Wartość", retentionHint: "0 = bez wygaśnięcia, lub milisekundy", duplicatePolicy: "Polityka duplikatów", labelsHint: "klucz1 wartość1 klucz2 wartość2", timestampHint: "'*' oznacza automatyczne generowanie, lub znacznik czasu w milisekundach", editAllHint: "Jeden punkt danych na linię: znacznik_czasu wartość (znacznik_czasu może być * dla auto)", autoSpread: "Automatyczny interwał rozrzutu *", formula: "Formuła", formulaLinear: "Liniowa", formulaRandom: "Losowa", formulaSawtooth: "Piłokształtna", formulaPoints: "Punkty", formulaAmplitude: "Amplituda", formulaOffset: "Przesunięcie", generate: "Generuj", exportChart: "Eksportuj PNG", overlay: "Nakładanie kluczy", overlayHint: "Klucze oddzielone przecinkami", mrangeFilter: "Filtr etykiet", bulkMode: "Generowanie masowe", mrangeHint: "np. sensor=temp" } }, treeControls: { settings: "Ustawienia drzewa", expandAll: "Rozwiń wszystko", collapseAll: "Zwiń wszystko", level: "Poziom", 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: { type: "Typ", format: "Format", loading: "Ładowanie...", years: "lat", months: "miesięcy", days: "dni", year: "rok", month: "miesiąc", day: "dzień", second: "sekunda", seconds: "sekundy", minute: "minuta", minutes: "minuty", hour: "godzina", hours: "godziny" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/pt-BR/000077500000000000000000000000001517650670600142775ustar00rootroot00000000000000src/strings/pt-BR/strings.js000066400000000000000000000653101517650670600163330ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Excluir?", deleteAllKeys: opts => { return `Exclua esta árvore e todas as suas chaves (${opts.key})?`; }, deleteSearchKeys: opts => { return `Tem certeza de que deseja excluir todas as chaves correspondentes a "${opts.pattern}"? ${opts.count} chaves encontradas.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Excluir tudo ${opts.count}`, importKeys: "Importar chaves", deleteSearchKeys: (opts) => `Excluir ${opts.count} chaves correspondentes`, saveWithFormatJson: "Salvar com formato", formatJson: "Formatar JSON", wrap: "Embrulhar", unwrap: "Desembrulhar", downloadJson: "Baixar JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Traduzindo...", aiSettings: "Configurações de IA", aiGroqApiKey: "Chave API Groq", aiGroqApiKeyInfo: "Opcional. Sua própria chave API Groq para melhor desempenho. Obtenha uma chave gratuita em", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Chave API IA salva", aiGroqApiKeyInvalid: "Chave API Groq inválida", aiGroqApiKeyNotSet: "Não definido (padrão do servidor)", aiEnabled: "IA ativada", aiEnabledYes: "Sim", aiEnabledNo: "Não", aiRouteViaNetwork: "Rota via network.corifeus.com", aiRoutingDirect: "Consultas vão diretamente para o Groq usando sua própria chave API, sem passar pelo network.corifeus.com.", aiRoutingNetwork: "Consultas de IA são roteadas via network.corifeus.com. Se você tem sua própria chave API Groq gratuita, pode desativar esta opção.", 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", 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" }, 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", type: "Tipo", format: "Formato", 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", deleteSearchHint: "Excluir todas as chaves correspondentes à pesquisa atual", deletingSearchKeys: "Excluindo chaves correspondentes...", importNoKeys: "Nenhuma chave encontrada no arquivo", }, status: { dataCopied: "Os dados estão na área de transferência", exportDone: "Exportação concluída", deletedSearchKeys: (opts) => `${opts.count} chaves excluídas`, 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", "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." }, 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", rss: "RSS", peak: "Pico", fragmentation: "Fragmentação", hitsAndMisses: "Acertos / Erros", noClients: "Sem clientes", }, analysis: { title: "Análise de Memória", runAnalysis: "Executar Análise", running: "Analisando...", typeDistribution: "Distribuição de Tipos", prefixMemory: "Memória por Prefixo", topKeysByMemory: "Maiores Chaves por Memória", expirationOverview: "Expiração de Chaves", memoryBreakdown: "Detalhamento de Memória", keysScanned: "Chaves Analisadas", totalMemory: "Memória Total", rssMemory: "Memória RSS", peakMemory: "Memória de Pico", luaMemory: "Memória Lua", overheadMemory: "Sobrecarga", datasetMemory: "Conjunto de Dados", fragmentation: "Fragmentação", allocator: "Alocador", withTTL: "Com TTL", persistent: "Persistentes", avgTTL: "TTL Médio", prefix: "Prefixo", keyCount: "Quantidade de Chaves", memoryUsage: "Uso de Memória", noPrefix: "(sem prefixo)", topN: "Top N", maxScanKeys: "Máx. Chaves Analisadas", type: "Tipo", noData: "Sem dados. Clique em Executar Análise para começar.", exportAll: "Exportar Tudo", }, 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" } }, timeseries: { chart: "Gráfico", info: "Informação", addPoint: "Adicionar ponto", from: "De (ms ou -)", to: "Até (ms ou +)", aggregation: "Agregação", timeBucket: "Bucket (ms)", none: "Nenhum", dataPoints: "pontos de dados", labels: "Rótulos", rules: "Regras", retention: "Retenção", timestamp: "Carimbo de data/hora", value: "Valor", retentionHint: "0 = sem expiração, ou milissegundos", duplicatePolicy: "Política de duplicados", labelsHint: "chave1 valor1 chave2 valor2", timestampHint: "'*' significa gerado automaticamente, ou carimbo de data/hora em milissegundos", editAllHint: "Um ponto de dados por linha: carimbo_de_data/hora valor (o carimbo pode ser * para automático)", autoSpread: "Intervalo de dispersão automático *", formula: "Fórmula", formulaLinear: "Linear", formulaRandom: "Aleatório", formulaSawtooth: "Dente de serra", formulaPoints: "Pontos", formulaAmplitude: "Amplitude", formulaOffset: "Deslocamento", generate: "Gerar", exportChart: "Exportar PNG", overlay: "Sobrepor chaves", overlayHint: "Chaves separadas por vírgulas", mrangeFilter: "Filtro de rótulos", bulkMode: "Geração em massa", mrangeHint: "ex. sensor=temp" } }, treeControls: { settings: "Configurações de árvore", expandAll: "Expandir tudo", collapseAll: "Recolher tudo", level: "Nível", 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: { type: "Tipo", format: "Formato", loading: "Carregando...", years: "anos", months: "meses", days: "dias", year: "ano", month: "mês", day: "dia", second: "segundo", seconds: "segundos", minute: "minuto", minutes: "minutos", hour: "hora", hours: "horas" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/pt-PT/000077500000000000000000000000001517650670600143175ustar00rootroot00000000000000src/strings/pt-PT/strings.js000066400000000000000000000652001517650670600163510ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Eliminar?", deleteAllKeys: opts => { return `Eliminar esta árvore e todas as suas chaves (${opts.key})?`; }, deleteSearchKeys: opts => { return `Tem a certeza de que deseja eliminar todas as chaves correspondentes a "${opts.pattern}"? Encontradas ${opts.count} chaves.`; }, 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Eliminar tudo ${opts.count}`, importKeys: "Importar chaves", deleteSearchKeys: (opts) => `Eliminar ${opts.count} chaves correspondentes`, saveWithFormatJson: "Guardar com formatação", formatJson: "Formatar Json", wrap: "Quebrar linha", unwrap: "Não quebrar linha", downloadJson: "Descarregar JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "A traduzir...", aiSettings: "Definições de IA", aiGroqApiKey: "Chave API Groq", aiGroqApiKeyInfo: "Opcional. A sua própria chave API Groq para melhor desempenho. Obtenha uma chave gratuita em", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Chave API IA guardada", aiGroqApiKeyInvalid: "Chave API Groq inválida", aiGroqApiKeyNotSet: "Não definido (predefinição do servidor)", aiEnabled: "IA ativada", aiEnabledYes: "Sim", aiEnabledNo: "Não", aiRouteViaNetwork: "Rota via network.corifeus.com", aiRoutingDirect: "Consultas vão diretamente para o Groq usando sua própria chave API, sem passar pelo network.corifeus.com.", aiRoutingNetwork: "Consultas de IA são roteadas via network.corifeus.com. Se você tem sua própria chave API Groq gratuita, pode desativar esta opção.", 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", 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" }, 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", type: "Tipo", format: "Formato", 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", deleteSearchHint: "Eliminar todas as chaves correspondentes à pesquisa atual", deletingSearchKeys: "A eliminar chaves correspondentes...", importNoKeys: "Nenhuma chave encontrada no ficheiro", }, status: { dataCopied: "Os dados estão na área de transferência", exportDone: "Exportação concluída", deletedSearchKeys: (opts) => `${opts.count} chaves eliminadas`, 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", "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." }, 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", rss: "RSS", peak: "Pico", fragmentation: "Fragmentação", hitsAndMisses: "Acertos / Erros", noClients: "Sem clientes", }, analysis: { title: "Análise de Memória", runAnalysis: "Executar Análise", running: "A analisar...", typeDistribution: "Distribuição de Tipos", prefixMemory: "Memória por Prefixo", topKeysByMemory: "Maiores Chaves por Memória", expirationOverview: "Expiração de Chaves", memoryBreakdown: "Discriminação de Memória", keysScanned: "Chaves Analisadas", totalMemory: "Memória Total", rssMemory: "Memória RSS", peakMemory: "Memória de Pico", luaMemory: "Memória Lua", overheadMemory: "Sobrecarga", datasetMemory: "Conjunto de Dados", fragmentation: "Fragmentação", allocator: "Alocador", withTTL: "Com TTL", persistent: "Persistentes", avgTTL: "TTL Médio", prefix: "Prefixo", keyCount: "Contagem de Chaves", memoryUsage: "Utilização de Memória", noPrefix: "(sem prefixo)", topN: "Top N", maxScanKeys: "Máx. Chaves Analisadas", type: "Tipo", noData: "Sem dados. Clique em Executar Análise para começar.", exportAll: "Exportar Tudo", }, 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" } }, timeseries: { chart: "Gráfico", info: "Informação", addPoint: "Adicionar ponto", from: "De (ms ou -)", to: "Até (ms ou +)", aggregation: "Agregação", timeBucket: "Bucket (ms)", none: "Nenhum", dataPoints: "pontos de dados", labels: "Etiquetas", rules: "Regras", retention: "Retenção", timestamp: "Carimbo temporal", value: "Valor", retentionHint: "0 = sem expiração, ou milissegundos", duplicatePolicy: "Política de duplicados", labelsHint: "chave1 valor1 chave2 valor2", timestampHint: "'*' significa gerado automaticamente, ou carimbo temporal em milissegundos", editAllHint: "Um ponto de dados por linha: carimbo_temporal valor (o carimbo temporal pode ser * para automático)", autoSpread: "Intervalo de dispersão automático *", formula: "Fórmula", formulaLinear: "Linear", formulaRandom: "Aleatório", formulaSawtooth: "Dente de serra", formulaPoints: "Pontos", formulaAmplitude: "Amplitude", formulaOffset: "Desvio", generate: "Gerar", exportChart: "Exportar PNG", overlay: "Sobrepor chaves", overlayHint: "Chaves separadas por vírgulas", mrangeFilter: "Filtro de etiquetas", bulkMode: "Geração em massa", mrangeHint: "ex. sensor=temp" } }, treeControls: { settings: "Definições da árvore", expandAll: "Expandir tudo", collapseAll: "Recolher tudo", level: "Nível", 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: { type: "Tipo", format: "Formato", loading: "A carregar...", years: "anos", months: "meses", days: "dias", year: "ano", month: "mês", day: "dia", second: "segundo", seconds: "segundos", minute: "minuto", minutes: "minutos", hour: "hora", hours: "horas" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ro/000077500000000000000000000000001517650670600137735ustar00rootroot00000000000000src/strings/ro/strings.js000066400000000000000000000644471517650670600160410ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Sigur doriți să ștergeți toate cheile care corespund "${opts.pattern}"? S-au găsit ${opts.count} chei.`; }, 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.", delete: "Stergeti?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Șterge tot ${opts.count}`, importKeys: "Importă chei", deleteSearchKeys: (opts) => `Șterge ${opts.count} chei corespunzătoare`, saveWithFormatJson: "Salvare cu formatare", formatJson: "Formatare Json", wrap: "Încadrare", unwrap: "Fără încadrare", downloadJson: "Descarcă JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Se traduce...", aiSettings: "Setări AI", aiGroqApiKey: "Cheie API Groq", aiGroqApiKeyInfo: "Opțional. Cheia API Groq proprie pentru performanță mai bună. Obțineți o cheie gratuită de la", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Cheie API AI salvată", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Nesetat (implicit server)", aiEnabled: "AI activat", aiEnabledYes: "Da", aiEnabledNo: "Nu", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tip", format: "Format", 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", deleteSearchHint: "Șterge toate cheile care corespund căutării curente de pe server", deletingSearchKeys: "Se șterg cheile corespunzătoare...", importNoKeys: "Nu s-au găsit chei în fișier", }, status: { dataCopied: "Datele sunt in clipboard", exportDone: "Export finalizat", deletedSearchKeys: (opts) => `${opts.count} chei șterse`, 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", "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." }, 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", rss: "RSS", peak: "Vârf", fragmentation: "Fragmentare", hitsAndMisses: "Reușite / Ratări", noClients: "Fără clienți", }, analysis: { title: "Analiză Memorie", runAnalysis: "Rulează Analiză", running: "Se analizează...", typeDistribution: "Distribuția Tipurilor", prefixMemory: "Memorie după Prefix", topKeysByMemory: "Cele Mai Mari Chei după Memorie", expirationOverview: "Expirarea Cheilor", memoryBreakdown: "Defalcarea Memoriei", keysScanned: "Chei Scanate", totalMemory: "Memorie Totală", rssMemory: "Memorie RSS", peakMemory: "Memorie de Vârf", luaMemory: "Memorie Lua", overheadMemory: "Suprasarcină", datasetMemory: "Set de Date", fragmentation: "Fragmentare", allocator: "Alocator", withTTL: "Cu TTL", persistent: "Permanente", avgTTL: "TTL Mediu", prefix: "Prefix", keyCount: "Număr de Chei", memoryUsage: "Utilizare Memorie", noPrefix: "(fără prefix)", topN: "Top N", maxScanKeys: "Max. Chei Scanate", type: "Tip", noData: "Fără date. Faceți clic pe Rulează Analiză pentru a începe.", exportAll: "Exportă Tot", }, 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" } }, timeseries: { chart: "Grafic", info: "Informatii", addPoint: "Adauga punct de date", from: "De la (ms sau -)", to: "Pana la (ms sau +)", aggregation: "Agregare", timeBucket: "Interval (ms)", none: "Niciunul", dataPoints: "puncte de date", labels: "Etichete", rules: "Reguli", retention: "Retentie", timestamp: "Marca temporala", value: "Valoare", retentionHint: "0 = fara expirare, sau milisecunde", duplicatePolicy: "Politica de duplicate", labelsHint: "cheie1 valoare1 cheie2 valoare2", timestampHint: "'*' inseamna generare automata, sau marca temporala in milisecunde", editAllHint: "Un punct de date pe linie: marca_temporala valoare (marca_temporala poate fi * pentru auto)", autoSpread: "Interval de distribuire automata *", formula: "Formula", formulaLinear: "Liniar", formulaRandom: "Aleatoriu", formulaSawtooth: "Dinte de fierastrau", formulaPoints: "Puncte", formulaAmplitude: "Amplitudine", formulaOffset: "Decalaj", generate: "Genereaza", exportChart: "Exporta PNG", overlay: "Suprapunere chei", overlayHint: "Chei separate prin virgula", mrangeFilter: "Filtru etichete", bulkMode: "Generare în masă", mrangeHint: "ex. sensor=temp" } }, treeControls: { settings: "Setari arbore", expandAll: "Extinde tot", collapseAll: "Restrange tot", level: "Nivel", 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: { type: "Tip", format: "Format", loading: "Se încarcă...", years: "ani", months: "luni", days: "zile", year: "an", month: "luna", day: "zi", second: "secunda", seconds: "secunde", minute: "minut", minutes: "minute", hour: "ora", hours: "ore" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ru/000077500000000000000000000000001517650670600140015ustar00rootroot00000000000000src/strings/ru/strings.js000066400000000000000000001063661517650670600160440ustar00rootroot00000000000000const strings = { error: { 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?", delete: "Удалить?", deleteAllKeys: opts => { return `Удалить это дерево и все его ключи (${opts.key})?`; }, deleteSearchKeys: opts => { return `Вы уверены, что хотите удалить все ключи, соответствующие "${opts.pattern}"? Найдено ${opts.count} ключей.`; }, 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" }, }, 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} результатов`, deleteAllKeysMenu: (opts) => `Удалить все ${opts.count}`, importKeys: "Импорт ключей", deleteSearchKeys: (opts) => `Удалить ${opts.count} совпадающих ключей`, saveWithFormatJson: "Сохранить с форматом", formatJson: "Форматировать Json", wrap: "Перенос", unwrap: "Без переноса", downloadJson: "Скачать JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", delete: "Удалить", remove: "Убрать", sure: "Хорошо", testConnection: "Проверка соединения", getKey: "Загрузка ключа Redis и асоциированных данных ...", jsonViewShow: "Показать JSON", jsonViewEditor: "Редактировать JSON", quickConsole: "Быстрый", }, label: { id: { nodeId: 'Идентификатор узла', id: "Идентификатор соединения", info: "Если вы не хотите изменять свойства: sshPassword, sshPrivateKey, пароля, tlsCrt, tlsKey, tlsCa, введите идентификатор соединения в эти свойства, чтобы сохранить значения свойств нетронутыми. Если вы хотите использовать ту же логику в пароле узла, введите идентификатор узла в пароле узла." }, secureFeature: 'Если вы видите значение, которое начинается с P3X и выглядит похоже, это функция безопасности. Чтобы изменить настройки, просто замените эти настройки на пустые или что-то другое, и они будут сохранены. Если вы не измените настройки, настройки останутся такими, какие они есть на сервере.', aiTranslating: "Перевод...", aiSettings: "Настройки ИИ", aiGroqApiKey: "Ключ API Groq", aiGroqApiKeyInfo: "Необязательно. Собственный ключ API Groq для лучшей производительности. Получите бесплатный ключ на", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Ключ API ИИ сохранён", aiGroqApiKeyInvalid: "Недействительный ключ API Groq", aiGroqApiKeyNotSet: "Не задан (по умолчанию сервера)", aiEnabled: "ИИ включён", aiEnabledYes: "Да", aiEnabledNo: "Нет", aiRouteViaNetwork: "Маршрут через network.corifeus.com", aiRoutingDirect: "Запросы идут напрямую в Groq с вашим собственным API-ключом, минуя network.corifeus.com.", aiRoutingNetwork: "AI-запросы маршрутизируются через network.corifeus.com. Если у вас есть собственный бесплатный ключ API Groq, вы можете отключить этот переключатель.", 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: "Соединения", keysSort: { on: "Сортировка ключей включена", off: "Сортировка ключей выключена" }, cluster: { on: "Кластеризация активирована", off: "Кластеризация деактивирована" }, sentinel: { on: "Сентинел включен", off: "Сентинел выключен", name: "Имя дозорного" }, readonly: { on: 'Режим "только чтение"', off: 'Режим "редактирование"' }, 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: "Время", type: "Тип", format: "Формат", loading: "Загрузка...", autoRefresh: "Авто", exportSearchHint: "Экспортируются только ключи, соответствующие текущему поиску", importSearchHint: "Импорт применяется ко всей базе данных, а не только к результатам поиска", deleteSearchHint: "Удалить все ключи, соответствующие текущему поиску", deletingSearchKeys: "Удаление совпадающих ключей...", importNoKeys: "Ключи не найдены в файле", }, status: { dataCopied: "Данные скопированы в буфер обмена", exportDone: "Экспорт завершён", deletedSearchKeys: (opts) => `${opts.count} ключей удалено`, 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": "Индекс этого списка вышел за границы", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Требуется авторизация: выполните вход через HTTP Basic Auth и перезагрузите страницу.", "auto-connection-failed": "Вероятно, соединение было удалено и авто-соединение провалилось по таковой причине.", invalid_console_command: "Эта команда не работает через GUI." }, 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: "Нет ключей", rss: "RSS", peak: "Пик", fragmentation: "Фрагментация", hitsAndMisses: "Попадания / Промахи", noClients: "Нет клиентов", }, analysis: { title: "Анализ памяти", runAnalysis: "Запустить анализ", running: "Анализ...", typeDistribution: "Распределение типов", prefixMemory: "Память по префиксу", topKeysByMemory: "Крупнейшие ключи по памяти", expirationOverview: "Срок действия ключей", memoryBreakdown: "Разбивка памяти", keysScanned: "Просканировано ключей", totalMemory: "Общая память", rssMemory: "RSS память", peakMemory: "Пиковая память", luaMemory: "Lua память", overheadMemory: "Накладные расходы", datasetMemory: "Набор данных", fragmentation: "Фрагментация", allocator: "Аллокатор", withTTL: "С TTL", persistent: "Постоянные", avgTTL: "Средний TTL", prefix: "Префикс", keyCount: "Количество ключей", memoryUsage: "Использование памяти", noPrefix: "(без префикса)", topN: "Top N", maxScanKeys: "Макс. сканируемых ключей", type: "Тип", noData: "Нет данных. Нажмите Запустить анализ, чтобы начать.", exportAll: "Экспорт всего", }, 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: "Значение" } }, timeseries: { chart: "График", info: "Информация", addPoint: "Добавить точку", from: "От (мс или -)", to: "До (мс или +)", aggregation: "Агрегация", timeBucket: "Bucket (мс)", none: "Нет", dataPoints: "точки данных", labels: "Метки", rules: "Правила", retention: "Хранение", timestamp: "Временная метка", value: "Значение", retentionHint: "0 = без срока действия, или миллисекунды", duplicatePolicy: "Политика дубликатов", labelsHint: "ключ1 значение1 ключ2 значение2", timestampHint: "'*' означает автогенерацию, или метка времени в миллисекундах", editAllHint: "Одна точка данных на строку: метка_времени значение (метка времени может быть * для автоматической)", autoSpread: "Автоматический интервал разброса *", formula: "Формула", formulaLinear: "Линейная", formulaRandom: "Случайная", formulaSawtooth: "Пилообразная", formulaPoints: "Точки", formulaAmplitude: "Амплитуда", formulaOffset: "Смещение", generate: "Сгенерировать", exportChart: "Экспорт PNG", overlay: "Наложение ключей", overlayHint: "Ключи через запятую", mrangeFilter: "Фильтр меток", bulkMode: "Массовая генерация", mrangeHint: "напр. sensor=temp" } }, treeControls: { settings: "Настройки дерева", expandAll: "Развернуть все", collapseAll: "Свернуть все", level: "Уровень", 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: { type: "Тип", format: "Формат", loading: "Загрузка...", years: "года", months: "месяца", days: "дни", year: "год", month: "месяц", day: "день", second: "секунда", seconds: "секунды", minute: "минута", minutes: "минуты", hour: "час", hours: "часы" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/si/000077500000000000000000000000001517650670600137665ustar00rootroot00000000000000src/strings/si/strings.js000066400000000000000000001235121517650670600160210ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" සමඟ ගැළපෙන සියලුම යතුරු මකා දැමීමට අවශ්‍ය බව විශ්වාසද? යතුරු ${opts.count}ක් හමු විය.`; }, socketioConnectError: "Socket.IO සේවාදායකයට සම්බන්ධ විය නොහැක, ඔබට නැවත පූරණය කර සම්බන්ධතා දෝෂය විසඳීමට උත්සාහ කළ හැක, සේවාලාභියාට එය තනිවම විසඳන්නේ කෙසේදැයි නොදනී.", socketioAuthRequired: "Socket.IO අවසරය අවශ්\u200dයයි. කරුණාකර HTTP Basic Auth (පරිශීලක නාමය/මුරපදය) සමඟ සත්\u200dයාපනය කර නැවත පූරණය කරන්න.", delete: "මකන්නද?", 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 වනු ඇත" }, }, 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} ප්‍රතිඵල අපනයනය`, deleteAllKeysMenu: (opts) => `සියල්ල මකන්න ${opts.count}`, importKeys: "යතුරු ආනයනය", deleteSearchKeys: (opts) => `ගැළපෙන යතුරු ${opts.count}ක් මකන්න`, saveWithFormatJson: "ආකෘතිය සමඟ සුරකින්න", formatJson: "Json ආකෘතිකරණය", wrap: "ඔතන්න", unwrap: "ලිහන්න", downloadJson: "JSON බාගත කරන්න", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 සකසන්න", 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 සමඟ ආරම්භ වන අගයක් පෙනෙන්නේ නම් සහ සියල්ල සමානව පෙනේ නම්, එය ආරක්ෂිත විශේෂාංගයකි. සැකසුම් වෙනස් කිරීමට, මෙම සැකසුම් හිස් හෝ වෙනත් දෙයකින් ආදේශ කරන්න, ඒවා සුරැකෙනු ඇත. ඔබ සැකසුම් වෙනස් නොකරන්නේ නම්, සැකසුම් සේවාදායකයේ ඇති ආකාරයටම පවතිනු ඇත.', aiTranslating: "Translating...", aiSettings: "AI සැකසුම්", aiGroqApiKey: "Groq API යතුර", aiGroqApiKeyInfo: "විකල්ප. වඩා හොඳ ක්‍රියාකාරීත්වය සඳහා ඔබේම Groq API යතුර. නොමිලේ යතුරක් ලබා ගන්න", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API යතුර සුරකින ලදී", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "සකසා නැත (සේවාදායක පෙරනිමිය)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "සම්බන්ධතා", 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රීයයි" }, 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: "කාලය", type: "වර්ගය", format: "ආකෘතිය", loading: "පූරණය වෙමින්...", autoRefresh: "ස්වයං", exportSearchHint: "වත්මන් සෙවීමට ගැළපෙන යතුරු පමණක් අපනයනය කරයි", importSearchHint: "ආනයනය සෙවුම් ප්‍රතිඵලවලට පමණක් නොව සම්පූර්ණ දත්ත සමුදායට අදාළ වේ", deleteSearchHint: "සේවාදායකයේ වත්මන් සෙවීමට ගැළපෙන සියලුම යතුරු මකා දමයි", deletingSearchKeys: "ගැළපෙන යතුරු මකා දමමින්...", importNoKeys: "ගොනුවේ යතුරු හමු නොවීය", }, status: { dataCopied: "දත්ත පසුරු පුවරුවේ ඇත", exportDone: "අපනයනය සම්පූර්ණයි", deletedSearchKeys: (opts) => `යතුරු ${opts.count}ක් මකා දමන ලදී`, 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": "මෙම ලැයිස්තු දර්ශකය සීමාවෙන් පිටතය", "invalid-json-value": "අගය වලංගු JSON නොවේ.", "http_auth_required": "අවසරය අවශ්\u200dයයි: කරුණාකර HTTP Basic Auth සමඟ සත්\u200dයාපනය කර නැවත පූරණය කරන්න.", "auto-connection-failed": "සම්බන්ධතාවය ඉවත් කර ඇති විය හැකි අතර ස්වයංක්\u200dරීය සම්බන්ධතාවය මේ නිසා අසාර්ථක විය.", invalid_console_command: "මෙම විධානය GUI හරහා ක්\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: "යතුරු නැත", rss: "RSS", peak: "උපරිම", fragmentation: "ඛණ්ඩනය", hitsAndMisses: "වාර / මග හැරීම්", noClients: "සේවාදායකයින් නැත", }, analysis: { title: "මතක විශ්ලේෂණය", runAnalysis: "විශ්ලේෂණය ක්‍රියාත්මක කරන්න", running: "විශ්ලේෂණය වෙමින්...", typeDistribution: "වර්ග බෙදීම", prefixMemory: "උපසර්ගය අනුව මතකය", topKeysByMemory: "මතකය අනුව විශාලතම යතුරු", expirationOverview: "යතුරු කල් ඉකුත්වීම", memoryBreakdown: "මතක බෙදීම", keysScanned: "ස්කෑන් කළ යතුරු", totalMemory: "මුළු මතකය", rssMemory: "RSS මතකය", peakMemory: "උපරිම මතකය", luaMemory: "Lua මතකය", overheadMemory: "අතිරේක බර", datasetMemory: "දත්ත කට්ටලය", fragmentation: "ඛණ්ඩනය", allocator: "වෙන් කරන්නා", withTTL: "TTL සමඟ", persistent: "ස්ථිර", avgTTL: "සාමාන්‍ය TTL", prefix: "උපසර්ගය", keyCount: "යතුරු ගණන", memoryUsage: "මතක භාවිතය", noPrefix: "(උපසර්ගයක් නැත)", topN: "Top N", maxScanKeys: "උපරිම ස්කෑන් යතුරු", type: "වර්ගය", noData: "දත්ත නැත. ආරම්භ කිරීමට විශ්ලේෂණය ක්‍රියාත්මක කරන්න ක්ලික් කරන්න.", exportAll: "සියල්ල අපනයනය", }, 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: "අගය" } }, timeseries: { chart: "ප්\u200dරස්තාරය", info: "තොරතුරු", addPoint: "දත්ත ලක්ෂ්\u200dයක් එක් කරන්න", from: "සිට (ms හෝ -)", to: "දක්වා (ms හෝ +)", aggregation: "එකතු කිරීම", timeBucket: "බාල්දිය (ms)", none: "කිසිවක් නැත", dataPoints: "දත්ත ලක්ෂ්\u200dය", labels: "ලේබල", rules: "නීති", retention: "රඳවා තබා ගැනීම", retentionHint: "0 = කල් ඉකුත් වීමක් නැත, හෝ මිලිතත්පර", duplicatePolicy: "අනුපිටපත් ප්‍රතිපත්තිය", labelsHint: "යතුර1 අගය1 යතුර2 අගය2", timestampHint: "'*' යනු ස්වයංක්‍රීයව ජනනය වූ, හෝ මිලිතත්පර කාල මුද්‍රාව", editAllHint: "පේළියකට එක දත්ත ලක්ෂ්‍යයක්: කාල_මුද්‍රාව අගය (කාල මුද්‍රාව ස්වයංක්‍රීය සඳහා * විය හැක)", autoSpread: "ස්වයංක්‍රීය * පැතිරීමේ පරතරය", formula: "සූත්‍රය", formulaLinear: "රේඛීය", formulaRandom: "අහඹු", formulaSawtooth: "කියත් දත්", formulaPoints: "ලක්ෂ්‍ය", formulaAmplitude: "විස්තාරය", formulaOffset: "ඕෆ්සෙට්", generate: "ජනනය කරන්න", exportChart: "PNG අපනයනය", overlay: "අතිච්ඡාදනය යතුරු", overlayHint: "කොමාවෙන් වෙන් කළ යතුරු", mrangeFilter: "ලේබල පෙරහන", bulkMode: "තොග ජනනය", mrangeHint: "උදා. sensor=temp", timestamp: "කාල මුද්\u200dරාව", value: "අගය" } }, treeControls: { settings: "ගස් සැකසුම්", expandAll: "සියල්ල පුළුල් කරන්න", collapseAll: "සියල්ල හකුළන්න", level: "මටdelays", search: { search: "යතුරු තුළ සොයන්න", clear: "වත්මන් සෙවුම හිස් කිරීමට මකන්න", placeholderClient: "සේවාලාභී පැත්තෙන් සොයන්න", placeholderServer: "සේවාදායක පැත්තෙන් සොයන්න", info: "සේවාලාභී පැත්තේ සෙවුම යනු සෙවුම් ආදානයේ පෙළට ගැළපීමයි. සේවාදායක පැත්තේ සෙවුම යනු *{search-text}* ලෙස යතුරු රටා තුළ සෙවීමයි. විශාල සෙවුම් කට්ටල සඳහා, සේවාදායක පැත්තේ සෙවුම භාවිතා කිරීම වඩා හොඳය. කුඩා සෙවුම් කට්ටල සඳහා, සේවාලාභී පැත්තේ සෙවුම් ප්\u200dරකාරය භාවිතා කිරීම වඩා හොඳය." + ` යතුරු ගණන ${p3xr.settings.maxLightKeysCount} ට වඩා වැඩි නම්, ඔබට සේවාදායක පැත්තෙන් පමණක් සෙවිය හැක.`, largeSetInfo: "විශාල කට්ටලයක, සේවාලාභී පැත්තේ සෙවුම අක්\u200dරීය කර ඇත. එබැවින් දැන් සේවාදායක පැත්තේ සෙවුම පමණක් හැකිය.", infoDetails: "සෙවුම ක්\u200dරියා කරන ආකාරය දැන ගැනීමට, කරුණාකර සැකසුම් පරීක්ෂා කරන්න" }, pager: { next: "ඊළඟ", prev: "පෙර", first: "පළමු", last: "අවසාන" } } }, time: { type: "වර්ගය", format: "ආකෘතිය", loading: "පූරණය වෙමින්...", years: "අවුරුදු", months: "මාස", days: "දින", year: "අවුරුද්ද", month: "මාසය", day: "දිනය", second: "තත්පරය", seconds: "තත්පර", minute: "මිනිත්තුව", minutes: "මිනිත්තු", hour: "පැය", hours: "පැය" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/sk/000077500000000000000000000000001517650670600137705ustar00rootroot00000000000000src/strings/sk/strings.js000066400000000000000000000634751517650670600160360ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Naozaj chcete vymazať všetky kľúče zodpovedajúce "${opts.pattern}"? Nájdených ${opts.count} kľúčov.`; }, 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.", delete: "Vymazat?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Vymazať všetko ${opts.count}`, importKeys: "Importovať kľúče", deleteSearchKeys: (opts) => `Vymazať ${opts.count} zodpovedajúcich kľúčov`, saveWithFormatJson: "Ulozit s formatovanim", formatJson: "Formatovat Json", wrap: "Zalamovať", unwrap: "Nezalamovať", downloadJson: "Stiahnuť JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Prekladanie...", aiSettings: "Nastavenia AI", aiGroqApiKey: "Groq API kľúč", aiGroqApiKeyInfo: "Voliteľné. Vlastný Groq API kľúč pre lepší výkon. Získajte bezplatný kľúč na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API kľúč uložený", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Nenastavené (predvolené servera)", aiEnabled: "AI povolené", aiEnabledYes: "Áno", aiEnabledNo: "Nie", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Typ", format: "Formát", 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", deleteSearchHint: "Vymaže všetky kľúče zodpovedajúce aktuálnemu vyhľadávaniu na serveri", deletingSearchKeys: "Mazanie zodpovedajúcich kľúčov...", importNoKeys: "V súbore neboli nájdené žiadne kľúče", }, status: { dataCopied: "Data su v schranke", exportDone: "Export dokončený", deletedSearchKeys: (opts) => `Vymazaných ${opts.count} kľúčov`, 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", "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." }, 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", rss: "RSS", peak: "Špička", fragmentation: "Fragmentácia", hitsAndMisses: "Zásahy / Minutia", noClients: "Žiadni klienti", }, analysis: { title: "Analýza pamäte", runAnalysis: "Spustiť analýzu", running: "Analyzovanie...", typeDistribution: "Distribúcia typov", prefixMemory: "Pamäť podľa prefixu", topKeysByMemory: "Najväčšie kľúče podľa pamäte", expirationOverview: "Expirácia kľúčov", memoryBreakdown: "Rozdelenie pamäte", keysScanned: "Prehľadané kľúče", totalMemory: "Celková pamäť", rssMemory: "RSS pamäť", peakMemory: "Špičková pamäť", luaMemory: "Lua pamäť", overheadMemory: "Réžia", datasetMemory: "Dátová sada", fragmentation: "Fragmentácia", allocator: "Alokátor", withTTL: "S TTL", persistent: "Trvalé", avgTTL: "Priemerné TTL", prefix: "Prefix", keyCount: "Počet kľúčov", memoryUsage: "Využitie pamäte", noPrefix: "(bez prefixu)", topN: "Top N", maxScanKeys: "Max. prehľadaných kľúčov", type: "Typ", noData: "Žiadne dáta. Kliknite na Spustiť analýzu pre začatie.", exportAll: "Exportovať všetko", }, 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" } }, timeseries: { chart: "Graf", info: "Informacie", addPoint: "Pridat datovy bod", from: "Od (ms alebo -)", to: "Do (ms alebo +)", aggregation: "Agregacia", timeBucket: "Interval (ms)", none: "Ziadny", dataPoints: "datove body", labels: "Stitky", rules: "Pravidla", retention: "Retencia", timestamp: "Casova znacka", value: "Hodnota", retentionHint: "0 = bez expiracie, alebo milisekundy", duplicatePolicy: "Politika duplikatov", labelsHint: "kluc1 hodnota1 kluc2 hodnota2", timestampHint: "'*' znamena automaticke generovanie, alebo casova znacka v milisekundach", editAllHint: "Jeden datovy bod na riadok: casova_znacka hodnota (casova_znacka moze byt * pre auto)", autoSpread: "Automaticky interval rozptylu *", formula: "Vzorec", formulaLinear: "Linearny", formulaRandom: "Nahodny", formulaSawtooth: "Pilovity", formulaPoints: "Body", formulaAmplitude: "Amplituda", formulaOffset: "Posun", generate: "Generovat", exportChart: "Exportovat PNG", overlay: "Prekrytie klucov", overlayHint: "Kluce oddelene ciarkou", mrangeFilter: "Filter stitkov", bulkMode: "Hromadné generovanie", mrangeHint: "napr. sensor=temp" } }, treeControls: { settings: "Nastavenia stromu", expandAll: "Rozbalit vsetko", collapseAll: "Zbalit vsetko", level: "Úroveň", 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: { type: "Typ", format: "Formát", loading: "Načítavanie...", years: "rokov", months: "mesiacov", days: "dni", year: "rok", month: "mesiac", day: "den", second: "sekunda", seconds: "sekundy", minute: "minuta", minutes: "minuty", hour: "hodina", hours: "hodiny" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/sl/000077500000000000000000000000001517650670600137715ustar00rootroot00000000000000src/strings/sl/strings.js000066400000000000000000000637501517650670600160330ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Ali ste prepričani, da želite izbrisati vse ključe, ki ustrezajo "${opts.pattern}"? Najdenih ${opts.count} ključev.`; }, 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.", delete: "Izbrisati?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Izbriši vse ${opts.count}`, importKeys: "Uvozi ključe", deleteSearchKeys: (opts) => `Izbriši ${opts.count} ujemajočih ključev`, saveWithFormatJson: "Shrani z obliko", formatJson: "Format Json", wrap: "Ovitek", unwrap: "Odvij", downloadJson: "Prenesite JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.", aiTranslating: "Prevajanje...", aiSettings: "AI Nastavitve", aiGroqApiKey: "Groq API ključ", aiGroqApiKeyInfo: "Izbirno. Lasten Groq API ključ za boljše delovanje. Pridobite brezplačen ključ na", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API ključ shranjen", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Ni nastavljeno (privzeto strežnika)", aiEnabled: "AI omogućeno", aiEnabledYes: "Da", aiEnabledNo: "Ne", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Tip", format: "Format", 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", deleteSearchHint: "Izbriše vse ključe, ki ustrezajo trenutnemu iskanju na strežniku", deletingSearchKeys: "Brisanje ujemajočih ključev...", importNoKeys: "V datoteki ni bilo najdenih ključev", }, status: { dataCopied: "Podatki so v odložišču", exportDone: "Izvoz zaključen", deletedSearchKeys: (opts) => `Izbrisanih ${opts.count} ključev`, 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", "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." }, 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", rss: "RSS", peak: "Vrhunec", fragmentation: "Fragmentacija", hitsAndMisses: "Zadetki / Zgrešitve", noClients: "Ni odjemalcev", }, analysis: { title: "Analiza pomnilnika", runAnalysis: "Zaženi analizo", running: "Analiziranje...", typeDistribution: "Porazdelitev tipov", prefixMemory: "Pomnilnik po predponi", topKeysByMemory: "Največji ključi po pomnilniku", expirationOverview: "Potek ključev", memoryBreakdown: "Razčlenitev pomnilnika", keysScanned: "Pregledani ključi", totalMemory: "Skupni pomnilnik", rssMemory: "RSS pomnilnik", peakMemory: "Vrhunec pomnilnika", luaMemory: "Lua pomnilnik", overheadMemory: "Dodatna obremenitev", datasetMemory: "Podatkovni niz", fragmentation: "Fragmentacija", allocator: "Alokator", withTTL: "S TTL", persistent: "Trajni", avgTTL: "Povprečni TTL", prefix: "Predpona", keyCount: "Število ključev", memoryUsage: "Uporaba pomnilnika", noPrefix: "(brez predpone)", topN: "Top N", maxScanKeys: "Maks. pregledanih ključev", type: "Tip", noData: "Ni podatkov. Kliknite Zaženi analizo za začetek.", exportAll: "Izvozi vse", }, 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" } }, timeseries: { chart: "Grafikon", info: "Informacije", addPoint: "Dodaj podatkovno točko", from: "Od (ms ali -)", to: "Do (ms ali +)", aggregation: "Združevanje", timeBucket: "Vedro (ms)", none: "Brez", dataPoints: "podatkovne točke", labels: "Oznake", rules: "Pravila", retention: "Zadrževanje", timestamp: "Časovni žig", value: "Vrednost", retentionHint: "0 = brez poteka, ali milisekunde", duplicatePolicy: "Politika podvojenih", labelsHint: "ključ1 vrednost1 ključ2 vrednost2", timestampHint: "'*' pomeni samodejno generirano, ali milisekundni časovni žig", editAllHint: "Ena podatkovna točka na vrstico: časovni_žig vrednost (časovni žig je lahko * za samodejno)", autoSpread: "Samodejni * interval razpršitve", formula: "Formula", formulaLinear: "Linearna", formulaRandom: "Naključna", formulaSawtooth: "Žagasta", formulaPoints: "Točke", formulaAmplitude: "Amplituda", formulaOffset: "Odmik", generate: "Generiraj", exportChart: "Izvozi PNG", overlay: "Prekrivni ključi", overlayHint: "Z vejico ločeni ključi", mrangeFilter: "Filter oznak", bulkMode: "Masovno generiranje", mrangeHint: "npr. sensor=temp" } }, treeControls: { settings: "Nastavitve drevesa", expandAll: "Razširi vse", collapseAll: "Strni vse", level: "Raven", 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: { type: "Tip", format: "Format", loading: "Nalaganje...", years: "leta", months: "mesecih", days: "dni", year: "leto", month: "mesec", day: "dan", second: "sekunda", seconds: "sekunde", minute: "minuta", minutes: "minute", hour: "ura", hours: "ure" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/sr/000077500000000000000000000000001517650670600137775ustar00rootroot00000000000000src/strings/sr/strings.js000066400000000000000000001703311517650670600160330ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Да ли сте сигурни да желите да обришете све кључеве који одговарају "${opts.pattern}"? Пронађено ${opts.count} кључева.`; }, 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.", delete: "Обрисати?", 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" }, }, 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} резултата`, deleteAllKeysMenu: (opts) => `Обриши све ${opts.count}`, importKeys: "Увези кључеве", deleteSearchKeys: (opts) => `Обриши ${opts.count} одговарајућих кључева`, 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: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Превођење...", aiSettings: "AI Подешавања", aiGroqApiKey: "Groq API кључ", aiGroqApiKeyInfo: "Опционално. Сопствени Groq API кључ за боље перформансе. Набавите бесплатан кључ на", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API кључ сачуван", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Није подешено (подразумевано сервера)", aiEnabled: "AI omogućeno", aiEnabledYes: "Da", aiEnabledNo: "Ne", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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: "Време", type: "Тип", format: "Формат", loading: "Учитавање...", autoRefresh: "Ауто", exportSearchHint: "Извозе се само кључеви који одговарају тренутној претрази", importSearchHint: "Увоз се примењује на целу базу података, не само на резултате претраге", deleteSearchHint: "Брише све кључеве који одговарају тренутној претрази на серверу", deletingSearchKeys: "Брисање одговарајућих кључева...", 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", exportDone: "Извоз завршен", deletedSearchKeys: (opts) => `Обрисано ${opts.count} кључева`, 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", "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." }, 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: "Нема кључева", rss: "RSS", peak: "Врх", fragmentation: "Фрагментација", hitsAndMisses: "Погоци / Промашаји", noClients: "Нема клијената", }, analysis: { title: "Анализа меморије", runAnalysis: "Покрени анализу", running: "Анализирање...", typeDistribution: "Дистрибуција типова", prefixMemory: "Меморија по префиксу", topKeysByMemory: "Највећи кључеви по меморији", expirationOverview: "Истицање кључева", memoryBreakdown: "Расподела меморије", keysScanned: "Скенирани кључеви", totalMemory: "Укупна меморија", rssMemory: "RSS меморија", peakMemory: "Вршна меморија", luaMemory: "Lua меморија", overheadMemory: "Додатно оптерећење", datasetMemory: "Скуп података", fragmentation: "Фрагментација", allocator: "Алокатор", withTTL: "Са TTL", persistent: "Трајни", avgTTL: "Просечан TTL", prefix: "Префикс", keyCount: "Број кључева", memoryUsage: "Коришћење меморије", noPrefix: "(без префикса)", topN: "Top N", maxScanKeys: "Макс. скенираних кључева", type: "Тип", noData: "Нема података. Кликните Покрени анализу за почетак.", exportAll: "Извези све", }, 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" } }, timeseries: { chart: "Графикон", info: "Информације", addPoint: "Додај тачку података", from: "Од (ms или -)", to: "До (ms или +)", aggregation: "Агрегација", timeBucket: "Корпа (ms)", none: "Ниједан", dataPoints: "тачке података", labels: "Ознаке", rules: "Правила", retention: "Задржавање", timestamp: "Временска ознака", value: "Вредност", retentionHint: "0 = без истека, или милисекунде", duplicatePolicy: "Политика дупликата", labelsHint: "кључ1 вредност1 кључ2 вредност2", timestampHint: "'*' значи аутоматски генерисано, или милисекундна временска ознака", editAllHint: "Једна тачка података по реду: временска_ознака вредност (временска ознака може бити * за аутоматски)", autoSpread: "Аутоматски * интервал распростирања", formula: "Формула", formulaLinear: "Линеарна", formulaRandom: "Случајна", formulaSawtooth: "Тестераста", formulaPoints: "Тачке", formulaAmplitude: "Амплитуда", formulaOffset: "Помак", generate: "Генериши", exportChart: "Извези PNG", overlay: "Преклапајући кључеви", overlayHint: "Кључеви раздвојени зарезом", mrangeFilter: "Филтер ознака", bulkMode: "Масовно генерисање", mrangeHint: "нпр. sensor=temp" } }, 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", level: "Ниво", 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: { type: "Тип", format: "Формат", 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", second: "\u0441\u0435\u043A\u0443\u043D\u0434\u0430", seconds: "\u0441\u0435\u043A\u0443\u043D\u0434\u0435", minute: "\u043C\u0438\u043D\u0443\u0442", minutes: "\u043C\u0438\u043D\u0443\u0442\u0430", hour: "\u0441\u0430\u0442", hours: "\u0441\u0430\u0442\u0438" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/sv/000077500000000000000000000000001517650670600140035ustar00rootroot00000000000000src/strings/sv/strings.js000066400000000000000000000626011517650670600160370ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Är du säker på att du vill radera alla nycklar som matchar "${opts.pattern}"? Hittade ${opts.count} nycklar.`; }, 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.", delete: "Radera?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Radera alla ${opts.count}`, importKeys: "Importera nycklar", deleteSearchKeys: (opts) => `Radera ${opts.count} matchande nycklar`, saveWithFormatJson: "Spara med formatering", formatJson: "Formatera Json", wrap: "Radbrytning", unwrap: "Ingen radbrytning", downloadJson: "Ladda ner JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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.', aiTranslating: "Översätter...", aiSettings: "AI-inställningar", aiGroqApiKey: "Groq API-nyckel", aiGroqApiKeyInfo: "Valfritt. Egen Groq API-nyckel för bättre prestanda. Skaffa en gratis nyckel på", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API-nyckel sparad", aiGroqApiKeyInvalid: "Ogiltig Groq API-nyckel", aiGroqApiKeyNotSet: "Ej inställd (serverstandard)", aiEnabled: "AI aktiverad", aiEnabledYes: "Ja", aiEnabledNo: "Nej", aiRouteViaNetwork: "Dirigera via network.corifeus.com", aiRoutingDirect: "Frågor går direkt till Groq med din egen API-nyckel, utan network.corifeus.com.", aiRoutingNetwork: "AI-frågor dirigeras via network.corifeus.com. Om du har din egen gratis Groq API-nyckel kan du stänga av denna växel.", 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", 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" }, 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", type: "Typ", format: "Format", loading: "Laddar...", autoRefresh: "Auto", exportSearchHint: "Exporterar bara nycklar som matchar aktuell sökning", importSearchHint: "Import gäller hela databasen, inte bara sökresultat", deleteSearchHint: "Raderar alla nycklar som matchar den aktuella sökningen på servern", deletingSearchKeys: "Raderar matchande nycklar...", importNoKeys: "Inga nycklar hittades i filen", }, status: { dataCopied: "Datan finns i urklipp", exportDone: "Export klar", deletedSearchKeys: (opts) => `${opts.count} nycklar raderade`, 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", "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." }, 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", rss: "RSS", peak: "Topp", fragmentation: "Fragmentering", hitsAndMisses: "Träffar / Missar", noClients: "Inga klienter", }, analysis: { title: "Minnesanalys", runAnalysis: "Kör analys", running: "Analyserar...", typeDistribution: "Typfördelning", prefixMemory: "Minne per prefix", topKeysByMemory: "Största nycklar per minne", expirationOverview: "Nyckelutgång", memoryBreakdown: "Minnesfördelning", keysScanned: "Skannade nycklar", totalMemory: "Totalt minne", rssMemory: "RSS-minne", peakMemory: "Toppminne", luaMemory: "Lua-minne", overheadMemory: "Overhead", datasetMemory: "Datauppsättning", fragmentation: "Fragmentering", allocator: "Allokator", withTTL: "Med TTL", persistent: "Permanenta", avgTTL: "Genomsnittlig TTL", prefix: "Prefix", keyCount: "Antal nycklar", memoryUsage: "Minnesanvändning", noPrefix: "(inget prefix)", topN: "Top N", maxScanKeys: "Max. skannade nycklar", type: "Typ", noData: "Ingen data. Klicka Kör analys för att starta.", exportAll: "Exportera allt", }, 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" } }, timeseries: { chart: "Diagram", info: "Info", addPoint: "Lägg till datapunkt", from: "Från (ms eller -)", to: "Till (ms eller +)", aggregation: "Aggregering", timeBucket: "Tidsintervall (ms)", none: "Ingen", dataPoints: "datapunkter", labels: "Etiketter", rules: "Regler", retention: "Lagring", timestamp: "Tidsstämpel", value: "Värde", retentionHint: "0 = ingen utgång, eller millisekunder", duplicatePolicy: "Dubblettpolicy", labelsHint: "nyckel1 värde1 nyckel2 värde2", timestampHint: "'*' betyder automatisk generering, eller tidsstämpel i millisekunder", editAllHint: "En datapunkt per rad: tidsstämpel värde (tidsstämpel kan vara * för auto)", autoSpread: "Automatiskt * spridningsintervall", formula: "Formel", formulaLinear: "Linjär", formulaRandom: "Slumpmässig", formulaSawtooth: "Sågtand", formulaPoints: "Punkter", formulaAmplitude: "Amplitud", formulaOffset: "Förskjutning", generate: "Generera", exportChart: "Exportera PNG", overlay: "Överlagra nycklar", overlayHint: "Kommaseparerade nycklar", mrangeFilter: "Etikettfilter", bulkMode: "Massgenerering", mrangeHint: "t.ex. sensor=temp" } }, treeControls: { settings: "Trädinställningar", expandAll: "Expandera alla", collapseAll: "Komprimera alla", level: "Nivå", 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: { type: "Typ", format: "Format", loading: "Laddar...", years: "år", months: "månader", days: "dagar", year: "år", month: "månad", day: "dag", second: "sekund", seconds: "sekunder", minute: "minut", minutes: "minuter", hour: "timme", hours: "timmar" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/sw/000077500000000000000000000000001517650670600140045ustar00rootroot00000000000000src/strings/sw/strings.js000066400000000000000000000637361517650670600160520ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Una uhakika wa kufuta funguo zote zinazolingana na "${opts.pattern}"? Funguo ${opts.count} zimepatikana.`; }, 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.", delete: "Futa?", 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" }, }, 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}`, deleteAllKeysMenu: (opts) => `Futa zote ${opts.count}`, importKeys: "Ingiza funguo", deleteSearchKeys: (opts) => `Futa funguo ${opts.count} zinazolingana`, saveWithFormatJson: "Hifadhi na muundo", formatJson: "Umbiza Json", wrap: "Funga", unwrap: "Fungua", downloadJson: "Pakua JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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.', aiTranslating: "Translating...", aiSettings: "Mipangilio ya AI", aiGroqApiKey: "Ufunguo wa API Groq", aiGroqApiKeyInfo: "Hiari. Ufunguo wako wa API Groq kwa utendaji bora. Pata ufunguo bila malipo kutoka", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Ufunguo wa API AI umehifadhiwa", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Haijawekwa (chaguo-msingi la seva)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Aina", format: "Muundo", loading: "Inapakia...", autoRefresh: "Otomatiki", exportSearchHint: "Kuhamisha funguo zinazolingana na utafutaji wa sasa pekee", importSearchHint: "Uingizaji unatumika kwa hifadhidata nzima, si matokeo ya utafutaji pekee", deleteSearchHint: "Hufuta funguo zote zinazolingana na utafutaji wa sasa kwenye seva", deletingSearchKeys: "Inafuta funguo zinazolingana...", importNoKeys: "Hakuna funguo zilizopatikana kwenye faili", }, status: { dataCopied: "Data iko kwenye ubao wa kunakili", exportDone: "Uhamishaji umekamilika", deletedSearchKeys: (opts) => `Funguo ${opts.count} zimefutwa`, 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", "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." }, 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", rss: "RSS", peak: "Kilele", fragmentation: "Mgawanyiko", hitsAndMisses: "Mapigo / Kukosa", noClients: "Hakuna wateja", }, analysis: { title: "Uchambuzi wa Kumbukumbu", runAnalysis: "Endesha Uchambuzi", running: "Inachambuza...", typeDistribution: "Ugawaji wa Aina", prefixMemory: "Kumbukumbu kwa Kiambishi", topKeysByMemory: "Funguo Kubwa kwa Kumbukumbu", expirationOverview: "Muda wa Funguo", memoryBreakdown: "Mgawanyo wa Kumbukumbu", keysScanned: "Funguo Zilizoskanwa", totalMemory: "Kumbukumbu Jumla", rssMemory: "Kumbukumbu RSS", peakMemory: "Kumbukumbu ya Kilele", luaMemory: "Kumbukumbu Lua", overheadMemory: "Mzigo wa Ziada", datasetMemory: "Seti ya Data", fragmentation: "Mgawanyiko", allocator: "Mgawaji", withTTL: "Yenye TTL", persistent: "Ya Kudumu", avgTTL: "TTL ya Wastani", prefix: "Kiambishi", keyCount: "Idadi ya Funguo", memoryUsage: "Matumizi ya Kumbukumbu", noPrefix: "(hakuna kiambishi)", topN: "Top N", maxScanKeys: "Upeo wa Funguo Zilizoskanwa", type: "Aina", noData: "Hakuna data. Bofya Endesha Uchambuzi kuanza.", exportAll: "Hamisha Zote", }, 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" } }, timeseries: { chart: "Chati", info: "Taarifa", addPoint: "Ongeza Sehemu ya Data", from: "Kutoka (ms au -)", to: "Hadi (ms au +)", aggregation: "Mkusanyiko", timeBucket: "Ndoo (ms)", none: "Hakuna", dataPoints: "pointi za data", labels: "Lebo", rules: "Sheria", retention: "Uhifadhi", timestamp: "Muhuri wa wakati", value: "Thamani", retentionHint: "0 = hakuna muda wa kuisha, au milisekunde", duplicatePolicy: "Sera ya nakala pacha", labelsHint: "ufunguo1 thamani1 ufunguo2 thamani2", timestampHint: "'*' inamaanisha inazalishwa kiotomatiki, au muhuri wa wakati wa milisekunde", editAllHint: "Sehemu moja ya data kwa kila mstari: muhuri_wa_wakati thamani (muhuri wa wakati unaweza kuwa * kwa otomatiki)", autoSpread: "Muda wa kuenea * otomatiki", formula: "Fomula", formulaLinear: "Mstari", formulaRandom: "Nasibu", formulaSawtooth: "Jino la msumeno", formulaPoints: "Pointi", formulaAmplitude: "Amplitude", formulaOffset: "Ofiseti", generate: "Zalisha", exportChart: "Hamisha PNG", overlay: "Funguo za kupachika", overlayHint: "Funguo zilizotengwa kwa koma", mrangeFilter: "Kichujio cha lebo", bulkMode: "Uzalishaji wa wingi", mrangeHint: "mf. sensor=temp" } }, treeControls: { settings: "Mipangilio ya mti", expandAll: "Panua yote", collapseAll: "Kunja yote", level: "Kiwango", 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: { type: "Aina", format: "Muundo", loading: "Inapakia...", years: "miaka", months: "miezi", days: "siku", year: "mwaka", month: "mwezi", day: "siku", second: "sekunde", seconds: "sekunde", minute: "dakika", minutes: "dakika", hour: "saa", hours: "masaa" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/ta/000077500000000000000000000000001517650670600137575ustar00rootroot00000000000000src/strings/ta/strings.js000066400000000000000000001346531517650670600160220ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" உடன் பொருந்தும் அனைத்து விசைகளையும் நீக்க விரும்புகிறீர்களா? ${opts.count} விசைகள் கண்டறியப்பட்டன.`; }, socketioConnectError: "Socket.IO சேவையகத்துடன் இணைக்க முடியவில்லை, நீங்கள் மீளேற்றம் செய்து இணைப்புப் பிழையை தீர்க்க முயற்சிக்கலாம், வாடிக்கையாளருக்கு அதை தானே தீர்க்கத் தெரியவில்லை.", socketioAuthRequired: "Socket.IO அங்கீகாரம் தேவை. தயவுசெய்து HTTP Basic Auth (பயனர்பெயர்/கடவுச்சொல்) மூலம் அங்கீகரித்து மீளேற்றம் செய்யவும்.", delete: "நீக்கவா?", deleteKey: "இந்த விசையை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", rename: { title: "இந்த விசையை நிச்சயமாக மறுபெயரிட விரும்புகிறீர்களா?", textContent: "இந்த செயல் விசையை நிரந்தரமாக மறுபெயரிடும்.", placeholder: "Redis விசை (தேவை)" }, ttl: { title: "இந்த விசையின் TTL ஐ மாற்ற விரும்புகிறீர்களா?", textContent: "TTL ஐ மாற்றுவது இந்த விசையின் வாழ்நாளை புதுப்பிக்கும். இந்த விசையை எப்போதும் வைக்க காலியாக விடவும்.", placeholder: "Redis விசையின் TTL (முழு எண் அல்லது காலி)", placeholderPlaceholder: "காலி என்றால் நிரந்தரமாக இருக்கும்; இல்லையெனில் முழு எண்ணை உள்ளிடவும்.", convertTextToTime: "உரையை நேரமாக மாற்றவும்", convertTextToTimePlaceholder: "எ.கா. 1d 86400 ஆக இருக்கும்" }, }, 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} முடிவுகளை ஏற்றுமதி செய்`, deleteAllKeysMenu: (opts) => `அனைத்தையும் நீக்கு ${opts.count}`, importKeys: "விசைகளை இறக்குமதி செய்", deleteSearchKeys: (opts) => `${opts.count} பொருந்தும் விசைகளை நீக்கு`, saveWithFormatJson: "வடிவமைப்புடன் சேமி", formatJson: "Json வடிவமை", wrap: "மடி", unwrap: "விரி", downloadJson: "JSON பதிவிறக்கம்", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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 அமை", 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 உடன் தொடங்கும் மதிப்பை நீங்கள் கண்டால் மற்றும் அனைத்தும் ஒரே மாதிரியாக தெரிந்தால், அது ஒரு பாதுகாப்பு அம்சம். அமைப்புகளை மாற்ற, இந்த அமைப்புகளை காலி அல்லது வேறு ஏதாவது மாற்றவும், அவை சேமிக்கப்படும். அமைப்புகளை மாற்றவில்லை என்றால், சேவையகத்தில் உள்ளபடியே இருக்கும்.', aiTranslating: "Translating...", aiSettings: "AI அமைப்புகள்", aiGroqApiKey: "Groq API விசை", aiGroqApiKeyInfo: "விருப்பத்தேர்வு. சிறந்த செயல்திறனுக்கு உங்கள் Groq API விசை. இலவச விசையைப் பெறுங்கள்", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API விசை சேமிக்கப்பட்டது", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "அமைக்கப்படவில்லை (சேவையக இயல்புநிலை)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "இணைப்புகள்", keysSort: { on: "விசை வரிசைப்படுத்தல் இயக்கப்பட்டது", off: "விசை வரிசைப்படுத்தல் முடக்கப்பட்டது" }, cluster: { on: "Cluster இயக்கப்பட்டது", off: "Cluster முடக்கப்பட்டது" }, sentinel: { on: "Sentinel இயக்கப்பட்டது", off: "Sentinel முடக்கப்பட்டது", name: "Sentinel பெயர்" }, readonly: { on: "படிக்க மட்டும் இயக்கப்பட்டது", off: "படிக்க மட்டும் முடக்கப்பட்டது" }, 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: "நேரம்", type: "வகை", format: "வடிவம்", loading: "ஏற்றுகிறது...", autoRefresh: "தானி", exportSearchHint: "தற்போதைய தேடலுடன் பொருந்தும் விசைகளை மட்டும் ஏற்றுமதி செய்கிறது", importSearchHint: "இறக்குமதி தேடல் முடிவுகளுக்கு மட்டுமல்ல, முழு தரவுத்தளத்திற்கும் பொருந்தும்", deleteSearchHint: "சேவையகத்தில் தற்போதைய தேடலுடன் பொருந்தும் அனைத்து விசைகளையும் நீக்குகிறது", deletingSearchKeys: "பொருந்தும் விசைகளை நீக்குகிறது...", importNoKeys: "கோப்பில் விசைகள் காணப்படவில்லை", }, status: { dataCopied: "தரவு கிளிப்போர்டில் உள்ளது", exportDone: "ஏற்றுமதி முடிந்தது", deletedSearchKeys: (opts) => `${opts.count} விசைகள் நீக்கப்பட்டன`, 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": "இந்த பட்டியல் குறியீடு எல்லைக்கு அப்பாற்பட்டது", "invalid-json-value": "மதிப்பு செல்லுபடியான JSON அல்ல.", "http_auth_required": "அங்கீகாரம் தேவை: தயவுசெய்து HTTP Basic Auth மூலம் அங்கீகரித்து மீளேற்றம் செய்யவும்.", "auto-connection-failed": "இணைப்பு அகற்றப்பட்டிருக்கலாம் மற்றும் தானியங்கி இணைப்பு இதனால் தோல்வியடைந்தது.", invalid_console_command: "இந்த கட்டளை GUI வழியாக வேலை செய்யாது." }, 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: "விசைகள் இல்லை", rss: "RSS", peak: "உச்சம்", fragmentation: "துண்டாக்கம்", hitsAndMisses: "வெற்றி / தோல்வி", noClients: "வாடிக்கையாளர்கள் இல்லை", }, analysis: { title: "நினைவக பகுப்பாய்வு", runAnalysis: "பகுப்பாய்வை இயக்கு", running: "பகுப்பாய்வு நடைபெறுகிறது...", typeDistribution: "வகை விநியோகம்", prefixMemory: "முன்னொட்டு வழி நினைவகம்", topKeysByMemory: "நினைவக அடிப்படையில் மிகப்பெரிய விசைகள்", expirationOverview: "விசை காலாவதி", memoryBreakdown: "நினைவக பிரிவு", keysScanned: "ஸ்கேன் செய்யப்பட்ட விசைகள்", totalMemory: "மொத்த நினைவகம்", rssMemory: "RSS நினைவகம்", peakMemory: "உச்ச நினைவகம்", luaMemory: "Lua நினைவகம்", overheadMemory: "மேல்நிலை", datasetMemory: "தரவுத்தொகுப்பு", fragmentation: "துண்டாக்கம்", allocator: "ஒதுக்கி", withTTL: "TTL உடன்", persistent: "நிரந்தர", avgTTL: "சராசரி TTL", prefix: "முன்னொட்டு", keyCount: "விசை எண்ணிக்கை", memoryUsage: "நினைவக பயன்பாடு", noPrefix: "(முன்னொட்டு இல்லை)", topN: "Top N", maxScanKeys: "அதிகபட்ச ஸ்கேன் விசைகள்", type: "வகை", noData: "தரவு இல்லை. தொடங்க பகுப்பாய்வை இயக்கு என்பதைக் கிளிக் செய்யவும்.", exportAll: "அனைத்தையும் ஏற்றுமதி", }, 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: "மதிப்பு" } }, timeseries: { chart: "வரைபடம்", info: "தகவல்", addPoint: "தரவுப் புள்ளியைச் சேர்", from: "இருந்து (ms அல்லது -)", to: "வரை (ms அல்லது +)", aggregation: "தொகுப்பு", timeBucket: "வாளி (ms)", none: "எதுவுமில்லை", dataPoints: "தரவுப் புள்ளிகள்", labels: "லேபிள்கள்", rules: "விதிகள்", retention: "தக்கவைப்பு", timestamp: "நேர முத்திரை", value: "மதிப்பு", retentionHint: "0 = காலாவதி இல்லை, அல்லது மில்லிவினாடிகள்", duplicatePolicy: "நகல் கொள்கை", labelsHint: "சாவி1 மதிப்பு1 சாவி2 மதிப்பு2", timestampHint: "'*' தானாக உருவாக்கப்படும், அல்லது மில்லிவினாடி நேர முத்திரை", editAllHint: "ஒவ்வொரு வரிக்கும் ஒரு தரவுப் புள்ளி: நேர_முத்திரை மதிப்பு (நேர முத்திரை தானியங்கிக்கு * ஆக இருக்கலாம்)", autoSpread: "தானியங்கி * பரவல் இடைவெளி", formula: "சூத்திரம்", formulaLinear: "நேரியல்", formulaRandom: "சீரற்ற", formulaSawtooth: "ரம்பப் பல்", formulaPoints: "புள்ளிகள்", formulaAmplitude: "வீச்சு", formulaOffset: "ஆஃப்செட்", generate: "உருவாக்கு", exportChart: "PNG ஏற்றுமதி", overlay: "மேற்பொருத்து விசைகள்", overlayHint: "கமாவால் பிரிக்கப்பட்ட விசைகள்", mrangeFilter: "லேபிள் வடிகட்டி", bulkMode: "மொத்த உருவாக்கம்", mrangeHint: "எ.கா. sensor=temp" } }, treeControls: { settings: "மர அமைப்புகள்", expandAll: "அனைத்தையும் விரிவாக்கு", collapseAll: "அனைத்தையும் சுருக்கு", level: "நிdelays", search: { search: "விசைகளில் தேடு", clear: "தற்போதைய தேடலை காலியாக்க அழி", placeholderClient: "வாடிக்கையாளர் பக்கம் தேடு", placeholderServer: "சேவையக பக்கம் தேடு", info: "வாடிக்கையாளர் பக்க தேடல் என்பது தேடல் உள்ளீட்டில் உள்ள உரையுடன் பொருத்துவது. சேவையக பக்க தேடல் என்பது *{search-text}* போன்ற விசை வடிவங்களில் தேடுவது. பெரிய தேடல் தொகுப்புகளுக்கு, சேவையக பக்க தேடலைப் பயன்படுத்துவது நல்லது. சிறிய தேடல் தொகுப்புகளுக்கு, வாடிக்கையாளர் பக்க தேடல் முறையைப் பயன்படுத்துவது நல்லது." + ` விசைகளின் எண்ணிக்கை ${p3xr.settings.maxLightKeysCount} ஐ விட அதிகமாக இருந்தால், சேவையக பக்கத்தில் மட்டுமே தேடலாம்.`, largeSetInfo: "பெரிய தொகுப்பில், வாடிக்கையாளர் பக்க தேடல் முடக்கப்பட்டுள்ளது. எனவே தற்போது சேவையக பக்க தேடல் மட்டுமே சாத்தியம்.", infoDetails: "தேடல் எவ்வாறு வேலை செய்கிறது என்பதை அறிய, அமைப்புகளைப் பார்க்கவும்" }, pager: { next: "அடுத்தது", prev: "முந்தையது", first: "முதல்", last: "கடைசி" } } }, time: { type: "வகை", format: "வடிவம்", loading: "ஏற்றுகிறது...", years: "ஆண்டுகள்", months: "மாதங்கள்", days: "நாட்கள்", year: "ஆண்டு", month: "மாதம்", day: "நாள்", second: "வினாடி", seconds: "வினாடிகள்", minute: "நிமிடம்", minutes: "நிமிடங்கள்", hour: "மணி நேரம்", hours: "மணி நேரங்கள்" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/tg/000077500000000000000000000000001517650670600137655ustar00rootroot00000000000000src/strings/tg/strings.js000066400000000000000000001071341517650670600160220ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Оё мутмаин ҳастед, ки ҳамаи калидҳои мувофиқи "${opts.pattern}"-ро нест кунед? ${opts.count} калид ёфт шуд.`; }, socketioConnectError: "Socket.IO ба сервер пайваст шуда наметавонад, шумо метавонед аз нав бор кунед ва кӯшиш кунед, ки хатои пайвастшавиро худатон ҳал кунед, муштарӣ намедонад худаш чӣ гуна онро ҳал кунад.", socketioAuthRequired: "Иҷозатномаи Socket.IO лозим аст. Лутфан бо HTTP Basic Auth (номи корбар/парол) тасдиқ кунед ва аз нав бор кунед.", delete: "Нест кардан?", deleteKey: "Оё мутмаин ҳастед, ки ин калидро нест кунед?", rename: { title: "Оё мутмаин ҳастед, ки ин калидро тағир диҳед?", textContent: "Ин амал калидро ба таври доимӣ иваз мекунад.", placeholder: "Калиди Redis (талаб)" }, ttl: { title: "Шумо мутмаин ҳастед, ки мехоҳед ин калиди TTL-ро иваз кунед?", textContent: "Тағйир додани TTL вақти зинда мондани ин калидро нав мекунад. Барои то абад нигоҳ доштани ин калид холӣ гузоред.", placeholder: "Калиди Redis TTL (шумораи бутун ё холӣ)", placeholderPlaceholder: "Холӣ маънои онро дорад, ки он то абад боқӣ мемонад; дар акси ҳол адади бутун ворид ку��ед.", convertTextToTime: "Матнро ба вақт табдил диҳед", convertTextToTimePlaceholder: "Масалан. 1d 86400 хоҳад буд" }, }, 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} натиҷа`, deleteAllKeysMenu: (opts) => `Ҳамаро нест кардан ${opts.count}`, importKeys: "Воридот кардани калидҳо", deleteSearchKeys: (opts) => `${opts.count} калиди мувофиқро нест кунед`, saveWithFormatJson: "Бо формат захира кунед", formatJson: "Формат Json", wrap: "печонед", unwrap: "Кушодан", downloadJson: "Download JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 оғоз мешавад ва ба як намуди он монанд аст, он хусусияти бехатар аст. Барои тағир додани танзимот, танҳо ин танзимотҳоро бо холӣ ё чизи дигар иваз кунед ва онҳо захира карда мешаванд. Агар шумо танзимотро тағир надиҳед, танзимот ҳамчунон дар сервер нигоҳ дошта мешаванд.", aiTranslating: "Translating...", aiSettings: "Танзимоти AI", aiGroqApiKey: "Калиди API Groq", aiGroqApiKeyInfo: "Ихтиёрӣ. Калиди API Groq-и шахсӣ барои иҷроиши беҳтар. Калиди ройгонро гиред аз", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Калиди API AI нигоҳ дошта шуд", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Муқаррар нашудааст (пешфарзи сервер)", aiEnabled: "AI Enabled", aiEnabledYes: "Yes", aiEnabledNo: "No", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "Пайвастшавӣ", keysSort: { on: "Ҷудокунии калид фаъол аст", off: "Хомӯш кардани калид" }, cluster: { on: "Cluster дар", off: "Cluster хомӯш" }, sentinel: { on: "Sentinel дар", off: "Sentinel хомӯш", name: "Номи Sentinel" }, readonly: { on: "Танҳо хондан дар", off: "Танҳо барои хондан хомӯш" }, 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: "Вақт", type: "Намуд", format: "Формат", loading: "Бор мешавад...", autoRefresh: "Авто", exportSearchHint: "Танҳо калидҳои мувофиқи ҷустуҷӯи ҷорӣ содирот мешаванд", importSearchHint: "Воридот ба тамоми пойгоҳи додаҳо татбиқ мешавад, на танҳо ба натиҷаҳои ҷустуҷӯ", deleteSearchHint: "Ҳамаи калидҳои мувофиқи ҷустуҷӯи ҷориро дар сервер нест мекунад", deletingSearchKeys: "Калидҳои мувофиқ нест карда мешаванд...", importNoKeys: "Дар файл калидҳо ёфт нашуд", }, status: { dataCopied: "Маълумот дар буфер аст", exportDone: "Содирот анҷом ёфт", deletedSearchKeys: (opts) => `${opts.count} калид нест карда шуд`, 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": "Ин шохиси рӯйхат берун аз ҳудуди аст", "invalid-json-value": "Қимат JSON эътибор надорад.", "http_auth_required": "Иҷозатнома талаб карда мешавад: лутфан б�� HTTP Basic Auth аутентификатсия кунед ва аз нав бор кунед.", "auto-connection-failed": "Эҳтимол аст, ки пайвастшавӣ хориҷ карда шуд ва пайвасти худкор аз ин сабаб ноком шуд.", invalid_console_command: "Ин фармон тавассути GUI кор намекунад." }, 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: "Калидҳо нест", rss: "RSS", peak: "Қулла", fragmentation: "Фрагментатсия", hitsAndMisses: "Ҳамлаҳо / Хатоҳо", noClients: "Муштариён нест", }, analysis: { title: "Таҳлили хотира", runAnalysis: "Таҳлилро оғоз кунед", running: "Таҳлил мешавад...", typeDistribution: "Тақсимоти навъҳо", prefixMemory: "Хотира аз рӯи префикс", topKeysByMemory: "Калидҳои калонтарин аз рӯи хотира", expirationOverview: "Мӯҳлати калидҳо", memoryBreakdown: "Тақсимоти хотира", keysScanned: "Калидҳои сканшуда", totalMemory: "Хотираи умумӣ", rssMemory: "Хотираи RSS", peakMemory: "Хотираи қуллаи", luaMemory: "Хотираи Lua", overheadMemory: "Борикунӣ", datasetMemory: "Маҷмӯаи маълумот", fragmentation: "Фрагментатсия", allocator: "Тақсимкунанда", withTTL: "Бо TTL", persistent: "Доимӣ", avgTTL: "TTL-и миёна", prefix: "Префикс", keyCount: "Шумораи калидҳо", memoryUsage: "Истифодаи хотира", noPrefix: "(бе префикс)", topN: "Top N", maxScanKeys: "Ҳадди аксари калидҳои скан", type: "Навъ", noData: "Маълумот нест. Барои оғоз Таҳлилро оғоз кунед-ро пахш кунед.", exportAll: "Содироти ҳама", }, 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: "Арзиш" } }, timeseries: { chart: "Диаграмма", info: "Маълумот", addPoint: "Нуқтаи маълумот илова кунед", from: "Аз (ms ё -)", to: "То (ms ё +)", aggregation: "Агрегатсия", timeBucket: "Сатил (ms)", none: "Ҳеҷ", dataPoints: "нуқтаҳои маълумот", labels: "Тамғаҳо", rules: "Қоидаҳо", retention: "Нигоҳдорӣ", timestamp: "Тамғаи вақт", value: "Арзиш", retentionHint: "0 = бе мӯҳлат, ё миллисония", duplicatePolicy: "Сиёсати такрорӣ", labelsHint: "калид1 арзиш1 калид2 арзиш2", timestampHint: "'*' маънои худкор тавлидшуда, ё тамғаи вақти миллисония", editAllHint: "Дар як сатр як нуқтаи маълумот: тамғаи_вақт арзиш (тамғаи вақт метавонад * барои худкор бошад)", autoSpread: "Фосилаи паҳншавии худкор *", formula: "Формула", formulaLinear: "Хаттӣ", formulaRandom: "Тасодуфӣ", formulaSawtooth: "Дандонаи арра", formulaPoints: "Нуқтаҳо", formulaAmplitude: "Амплитуда", formulaOffset: "Ҷойгузинӣ", generate: "Тавлид кунед", exportChart: "Содирот PNG", overlay: "Калидҳои рӯйгузорӣ", overlayHint: "Калидҳои бо вергул ҷудошуда", mrangeFilter: "Филтри тамғаҳо", bulkMode: "Эҷоди оммавӣ", mrangeHint: "мас. sensor=temp" } }, treeControls: { settings: "Танзимоти дарахт", expandAll: "Ҳамаро васеъ кунед", collapseAll: "Ҳамаро вайрон кунед", level: "Сатdelays", search: { search: "Дар калидҳо ҷустуҷӯ кунед", clear: "Ҷустуҷӯи ҷориро тоза кунед, то холӣ таъин кунед", placeholderClient: "Ҷустуҷӯи тарафи муштарӣ", placeholderServer: "Ҷустуҷӯи тарафи сервер", info: "Ҷустуҷӯи ҷониби муштарӣ маънои онро дорад, ки он ба матни вуруди ҷустуҷӯ мувофиқат мекунад. Ҷустуҷӯи тарафи сервер маънои онро дорад, ки он мисли ҷустуҷӯ дар намунаҳои калидҳо ҳамчун *{search-text}* аст. Барои маҷмӯаҳои ҷустуҷӯии калон, беҳтар аст, ки ҷустуҷӯи серверро истифода баред. Барои маҷмӯаҳои ҷустуҷӯии хурдтар, беҳтар аст, ки режими ҷустуҷӯи муштарӣ истифода шавад." + ` Агар шумори калидҳо тамом шавад ${p3xr.settings.maxLightKeysCount}, шумо метавонед танҳо дар тарафи сервер ҷустуҷӯ кунед.`, largeSetInfo: "Дар маҷмӯи калон ҷустуҷӯи муштарӣ ғайрифаъол аст. бинобар ин ҳоло танҳо ҷустуҷӯи сервер имконпазир аст.", infoDetails: "Барои фаҳмидани он ки ҷустуҷӯ чӣ гуна кор мекунад, лутфан танзимотро тафтиш кунед" }, pager: { next: "Оянда", prev: "Гузашта", first: "Аввал", last: "Охирин" } } }, time: { type: "Намуд", format: "Формат", loading: "Бор мешавад...", years: "сол", months: "моҳҳо", days: "рӯз", year: "сол", month: "моҳ", day: "рӯз", second: "сония", seconds: "сонияҳо", minute: "дақиқа", minutes: "дақиқаҳо", hour: "соат", hours: "соатҳо" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/th/000077500000000000000000000000001517650670600137665ustar00rootroot00000000000000src/strings/th/strings.js000066400000000000000000001235371517650670600160300ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `คุณแน่ใจหรือไม่ว่าจะลบคีย์ทั้งหมดที่ตรงกับ "${opts.pattern}"? พบ ${opts.count} คีย์`; }, socketioConnectError: "Socket.IO ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ คุณสามารถโหลดซ้ำและลองแ��้ไขข้อผิดพลาดในการเชื่อมต่อด้วยตนเอง ไคลเอ็นต์ไม่ทราบวิธีแก้ปัญหาด้วยตนเอง", socketioAuthRequired: "ต้องมีการอนุญาต Socket.IO โปรดตรวจสอบสิทธิ์ด้วย HTTP Basic Auth (ชื่อผู้ใช้/รหัสผ่าน) แล้วโหลดซ้ำ", delete: "ลบ?", deleteKey: "คุณแน่ใจหรือว่าจะลบคีย์นี้", rename: { title: "คุณแน่ใจหรือว่าจะเปลี่ยนชื่อคีย์นี้", textContent: "การดำเนินการนี้จะเปลี่ยนชื่อคีย์อย่างถาวร", placeholder: "คีย์ Redis (จำเป็น)" }, ttl: { title: "คุณแน่ใจหรือไม่ว่าต้องการเปลี่ยน TTL ของคีย์นี้", textContent: "การเปลี่ยน TTL จะอัปเดตเวลาใช้งานของคีย์นี้ เว้นว่างไว้เพื่อเก็บคีย์นี้ไว้ตลอดไป", placeholder: "TTL ของคีย์ TTL (จำนวนเต็มหรือว่าง)", placeholderPlaceholder: "ความว่างเปล่าหมายความว่ามันคงอยู่ตลอดไป มิฉะนั้นให้ป้อนจำนวนเต็ม", convertTextToTime: "แปลงข้อความเป็นเวลา", convertTextToTimePlaceholder: "เช่น 1d จะเป็น 86400" }, }, 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} ผลลัพธ์`, deleteAllKeysMenu: (opts) => `ลบทั้งหมด ${opts.count}`, importKeys: "นำเข้าคีย์", deleteSearchKeys: (opts) => `ลบคีย์ที่ตรงกัน ${opts.count} รายการ`, saveWithFormatJson: "บันทึกด้วยรูปแบบ", formatJson: "จัดรูปแบบ Json", wrap: "ห่อ", unwrap: "แกะห่อ", downloadJson: "ดาวน์โหลด JSON.dll", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 และมีลักษณะเหมือนกัน แสดงว่าเป็นคุณสมบัติที่ปลอดภัย หากต้องการเปลี่ยนการตั้งค่า เพียงแทนที่การตั้งค่าเหล่านี้ด้วยค่าว่างหรืออย่างอื่น จากนั้นระบบจะบันทึกการตั้งค่าเหล่านั้น หากคุณไม่เปลี่ยนการตั้งค่า การตั้งค่าจะถูกเก็บไว้เหมือนเดิมบนเซิร์ฟเวอร์", aiTranslating: "กำลังแปล...", aiSettings: "ตั้งค่า AI", aiGroqApiKey: "คีย์ API Groq", aiGroqApiKeyInfo: "ไม่บังคับ คีย์ API Groq ของคุณเองเพื่อประสิทธิภาพที่ดีขึ้น รับคีย์ฟรีจาก", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "บันทึกคีย์ API AI แล้ว", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "ยังไม่ตั้งค่า (ค่าเริ่มต้นเซิร์ฟเวอร์)", aiEnabled: "AI เปิดใช้งาน", aiEnabledYes: "ใช่", aiEnabledNo: "ไม่", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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: "การเชื่อมต่อ", keysSort: { on: "เปิดการเรียงลำดับคีย์", off: "การเรียงลำดับคีย์ออก" }, cluster: { on: "เปิด Cluster", off: "ปิด Cluster" }, sentinel: { on: "เปิด Sentinel", off: "ปิด Sentinel", name: "ชื่อ Sentinel" }, readonly: { on: "เปิดอ่านอย่างเดียว", off: "ปิดอ่านอย่างเดียว" }, 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: "เวลา", type: "ประเภท", format: "รูปแบบ", loading: "กำลังโหลด...", autoRefresh: "อัตโนมัติ", exportSearchHint: "ส่งออกเฉพาะคีย์ที่ตรงกับการค้นหาปัจจุบัน", importSearchHint: "การนำเข้าจะใช้กับฐานข้อมูลทั้งหมด ไม่ใช่แค่ผลการค้นหา", deleteSearchHint: "ลบคีย์ทั้งหมดที่ตรงกับการค้นหาปัจจุบันบนเซิร์ฟเวอร์", deletingSearchKeys: "กำลังลบคีย์ที่ตรงกัน...", importNoKeys: "ไม่พบคีย์ในไฟล์", }, status: { dataCopied: "ข้อมูลอยู่ในคลิปบอร์ด", exportDone: "ส่งออกเสร็จสิ้น", deletedSearchKeys: (opts) => `ลบ ${opts.count} คีย์แล้ว`, 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": "ดัชนีรายการนี้อยู่นอกขอบเขต", "invalid-json-value": "ค่านี้ไม่ถูกต้อง JSON", "http_auth_required": "ต้องมีการอนุญาต: โปรดตรวจสอบสิทธิ์กับ HTTP Basic Auth และโหลดซ้ำ", "auto-connection-failed": "เป็นไปได้ การเชื่อมต่อถูกลบออก และการเชื่อมต่ออัตโนมัติล้มเหลวด้วยเหตุนี้", invalid_console_command: "คำสั่งนี้ใช้ไม่ได้กับ GUI" }, 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: "ไม่มีคีย์", rss: "RSS", peak: "สูงสุด", fragmentation: "การแตกกระจาย", hitsAndMisses: "สำเร็จ / พลาด", noClients: "ไม่มีไคลเอนต์", }, analysis: { title: "การวิเคราะห์หน่วยความจำ", runAnalysis: "เริ่มวิเคราะห์", running: "กำลังวิเคราะห์...", typeDistribution: "การกระจายตามชนิด", prefixMemory: "หน่วยความจำตามคำนำหน้า", topKeysByMemory: "คีย์ใหญ่สุดตามหน่วยความจำ", expirationOverview: "การหมดอายุของคีย์", memoryBreakdown: "รายละเอียดหน่วยความจำ", keysScanned: "คีย์ที่สแกน", totalMemory: "หน่วยความจำทั้งหมด", rssMemory: "หน่วยความจำ RSS", peakMemory: "หน่วยความจำสูงสุด", luaMemory: "หน่วยความจำ Lua", overheadMemory: "ค่าใช้จ่ายเพิ่มเติม", datasetMemory: "ชุดข้อมูล", fragmentation: "การแตกกระจาย", allocator: "ตัวจัดสรร", withTTL: "มี TTL", persistent: "ถาวร", avgTTL: "TTL เฉลี่ย", prefix: "คำนำหน้า", keyCount: "จำนวนคีย์", memoryUsage: "การใช้หน่วยความจำ", noPrefix: "(ไม่มีคำนำหน้า)", topN: "Top N", maxScanKeys: "คีย์สแกนสูงสุด", type: "ชนิด", noData: "ไม่มีข้อมูล คลิกเริ่มวิเคราะห์เพื่อเริ่มต้น", exportAll: "ส่งออกทั้งหมด", }, 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: "ความคุ้มค่า" } }, timeseries: { chart: "แผนภูมิ", info: "ข้อมูล", addPoint: "เพิ่มจุดข้อมูล", from: "จาก (ms หรือ -)", to: "ถึง (ms หรือ +)", aggregation: "การรวม", timeBucket: "ถัง (ms)", none: "ไม่มี", dataPoints: "จุดข้อมูล", labels: "ป้ายกำกับ", rules: "กฎ", retention: "การเก็บรักษา", timestamp: "การประทับเวลา", value: "ค่า", retentionHint: "0 = ไม่หมดอายุ, หรือมิลลิวินาที", duplicatePolicy: "นโยบายรายการซ้ำ", labelsHint: "คีย์1 ค่า1 คีย์2 ค่า2", timestampHint: "'*' หมายถึงสร้างอัตโนมัติ, หรือการประทับเวลาเป็นมิลลิวินาที", editAllHint: "หนึ่งจุดข้อมูลต่อบรรทัด: การประทับเวลา ค่า (การประทับเวลาสามารถเป็น * สำหรับอัตโนมัติ)", autoSpread: "ช่วงกระจายอัตโนมัติ *", formula: "สูตร", formulaLinear: "เชิงเส้น", formulaRandom: "สุ่ม", formulaSawtooth: "ฟันเลื่อย", formulaPoints: "จุด", formulaAmplitude: "แอมพลิจูด", formulaOffset: "ออฟเซ็ต", generate: "สร้าง", exportChart: "ส่งออก PNG", overlay: "ซ้อนทับคีย์", overlayHint: "คีย์คั่นด้วยเครื่องหมายจุลภาค", mrangeFilter: "ตัวกรองป้ายกำกับ", bulkMode: "สร้างจำนวนมาก", mrangeHint: "เช่น sensor=temp" } }, treeControls: { settings: "การตั้งค่าต้นไม้", expandAll: "ขยายทั้งหมด", collapseAll: "ยุบทั้งหมด", level: "ระดับ", search: { search: "ค้นหาในคีย์", clear: "ล้างการค้นหาปัจจุบันเพื่อตั้งค่าว่าง", placeholderClient: "ค้นหาฝั่งไคลเอ็นต์", placeholderServer: "ค้นหาฝั่งเซิร์ฟเวอร์", info: "การค้นหาฝั่งไคลเอ็นต์หมายความว่าตรงกับข้อความในการป้อนข้อมูลการค้นหา การค้นหาฝั่งเซิร์ฟเวอร์หมายความว่าเหมือนกับการค้นหาในรูปแบบคีย์เป็น *{search-text}* สำหรับชุดการค้นหาขนาดใหญ่ ควรใช้การค้นหาฝั่งเซิร์ฟเวอร์จะดีกว่า สำหรับชุดการค้นหาที่มีขนาดเล็ก ควรใช้โหมดการค้นหาฝั่งไคลเอ็นต์จะดีกว่า" + ` หากนับคีย์หมด ${p3xr.settings.maxLightKeysCount}คุณสามารถค้นหาได้เฉพาะฝั่งเซิร์ฟเวอร์เท่านั้น`, largeSetInfo: "ในชุดใหญ่ การค้นหาฝั่งไคลเอ็นต์จะถูกปิดใช้งาน ดังนั้นตอนนี้ทำได้เฉพาะการค้นหาฝั่งเซิร์ฟเวอร์เท่านั้น", infoDetails: "หากต้องการทราบว่าการค้นหาทำงานอย่างไร โปรดตรวจสอบการตั้งค่า" }, pager: { next: "ถัดไป", prev: "ก่อนหน้า", first: "อันดับแรก", last: "สุดท้าย" } } }, time: { type: "ประเภท", format: "รูปแบบ", loading: "กำลังโหลด...", years: "ปี", months: "เดือน", days: "วัน", year: "ปี", month: "เดือน", day: "วัน", second: "วินาที", seconds: "วินาที", minute: "นาที", minutes: "นาที", hour: "ชั่วโมง", hours: "ชั่วโมง" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/tr/000077500000000000000000000000001517650670600140005ustar00rootroot00000000000000src/strings/tr/strings.js000066400000000000000000000645441517650670600160440ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `"${opts.pattern}" ile eşleşen tüm anahtarları silmek istediğinizden emin misiniz? ${opts.count} anahtar bulundu.`; }, 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.", delete: "Silinsin mi?", 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" }, }, 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`, deleteAllKeysMenu: (opts) => `Tümünü sil ${opts.count}`, importKeys: "Anahtarları içe aktar", deleteSearchKeys: (opts) => `${opts.count} eşleşen anahtarı sil`, saveWithFormatJson: "Biçimle kaydet", formatJson: "Json Biçimle", wrap: "Kaydır", unwrap: "Kaydırma", downloadJson: "JSON indir", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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.', aiTranslating: "Çevriliyor...", aiSettings: "AI Ayarları", aiGroqApiKey: "Groq API Anahtarı", aiGroqApiKeyInfo: "İsteğe bağlı. Daha iyi performans için kendi Groq API anahtarınız. Ücretsiz anahtar alın", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API anahtarı kaydedildi", aiGroqApiKeyInvalid: "Geçersiz Groq API anahtarı", aiGroqApiKeyNotSet: "Ayarlanmamış (sunucu varsayılanı)", aiEnabled: "AI etkin", aiEnabledYes: "Evet", aiEnabledNo: "Hayır", aiRouteViaNetwork: "network.corifeus.com üzerinden yönlendir", aiRoutingDirect: "Sorgular kendi API anahtarınızla doğrudan Groq'a gider, network.corifeus.com kullanılmaz.", aiRoutingNetwork: "AI sorguları network.corifeus.com üzerinden yönlendirilir. Kendi ücretsiz Groq API anahtarınız varsa bu anahtarı kapatabilirsiniz.", 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", 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ı" }, 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", type: "Tür", format: "Biçim", 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", deleteSearchHint: "Sunucudaki geçerli aramayla eşleşen tüm anahtarları siler", deletingSearchKeys: "Eşleşen anahtarlar siliniyor...", importNoKeys: "Dosyada anahtar bulunamadı", }, status: { dataCopied: "Veri panoya kopyalandı", exportDone: "Dışa aktarma tamamlandı", deletedSearchKeys: (opts) => `${opts.count} anahtar silindi`, 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", "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." }, 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", rss: "RSS", peak: "Tepe", fragmentation: "Parçalanma", hitsAndMisses: "İsabet / Kaçırma", noClients: "İstemci yok", }, analysis: { title: "Bellek Analizi", runAnalysis: "Analizi Başlat", running: "Analiz ediliyor...", typeDistribution: "Tip Dağılımı", prefixMemory: "Ön Eke göre Bellek", topKeysByMemory: "Belleğe göre En Büyük Anahtarlar", expirationOverview: "Anahtar Süresi", memoryBreakdown: "Bellek Dağılımı", keysScanned: "Taranan Anahtarlar", totalMemory: "Toplam Bellek", rssMemory: "RSS Bellek", peakMemory: "Tepe Bellek", luaMemory: "Lua Bellek", overheadMemory: "Ek Yük", datasetMemory: "Veri Seti", fragmentation: "Parçalanma", allocator: "Ayırıcı", withTTL: "TTL ile", persistent: "Kalıcı", avgTTL: "Ortalama TTL", prefix: "Ön Ek", keyCount: "Anahtar Sayısı", memoryUsage: "Bellek Kullanımı", noPrefix: "(ön ek yok)", topN: "Top N", maxScanKeys: "Maks. Taranan Anahtarlar", type: "Tip", noData: "Veri yok. Başlamak için Analizi Başlat'a tıklayın.", exportAll: "Tümünü Dışa Aktar", }, 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" } }, timeseries: { chart: "Grafik", info: "Bilgi", addPoint: "Veri Noktası Ekle", from: "Başlangıç (ms veya -)", to: "Bitiş (ms veya +)", aggregation: "Toplama", timeBucket: "Zaman Aralığı (ms)", none: "Yok", dataPoints: "veri noktası", labels: "Etiketler", rules: "Kurallar", retention: "Saklama", timestamp: "Zaman damgası", value: "Değer", retentionHint: "0 = süre sonu yok veya milisaniye", duplicatePolicy: "Yineleme politikası", labelsHint: "anahtar1 değer1 anahtar2 değer2", timestampHint: "'*' otomatik oluşturma anlamına gelir veya milisaniye zaman damgası", editAllHint: "Satır başına bir veri noktası: zaman_damgası değer (zaman_damgası otomatik için * olabilir)", autoSpread: "Otomatik * yayılma aralığı", formula: "Formül", formulaLinear: "Doğrusal", formulaRandom: "Rastgele", formulaSawtooth: "Testere dişi", formulaPoints: "Noktalar", formulaAmplitude: "Genlik", formulaOffset: "Ofset", generate: "Oluştur", exportChart: "PNG olarak dışa aktar", overlay: "Anahtarları üst üste bindirme", overlayHint: "Virgülle ayrılmış anahtarlar", mrangeFilter: "Etiket filtresi", bulkMode: "Toplu oluşturma", mrangeHint: "örn. sensor=temp" } }, treeControls: { settings: "Ağaç ayarları", expandAll: "Tümünü genişlet", collapseAll: "Tümünü daralt", level: "Seviye", 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: { type: "Tür", format: "Biçim", loading: "Yükleniyor...", years: "yıl", months: "ay", days: "gün", year: "yıl", month: "ay", day: "gün", second: "saniye", seconds: "saniye", minute: "dakika", minutes: "dakika", hour: "saat", hours: "saat" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/uk/000077500000000000000000000000001517650670600137725ustar00rootroot00000000000000src/strings/uk/strings.js000066400000000000000000001056031517650670600160260ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Ви впевнені, що хочете видалити всі ключі, які відповідають "${opts.pattern}"? Знайдено ${opts.count} ключів.`; }, socketioConnectError: "Socket.IO не може підключитися до сервера, ви можете перезавантажити та спробувати вирішити помилку підключення самостійно, клієнт не знає, як її вирішити.", socketioAuthRequired: "Потрібна авторизація Socket.IO. Будь ласка, автентифікуйтесь за допомогою HTTP Basic Auth (ім'я користувача/пароль) та перезавантажте.", delete: "Видалити?", deleteKey: "Ви впевнені, що хочете видалити цей ключ?", rename: { title: "Ви впевнені, що хочете перейменувати цей ключ?", textContent: "Ця дія перейменовує ключ назавжди.", placeholder: "Redis-ключ (обов'язковий)" }, ttl: { title: "Ви впевнені, що хочете змінити TTL цього ключа?", textContent: "Зміна TTL оновлює час життя цього ключа. Залиште порожнім, щоб зберегти ключ назавжди.", placeholder: "TTL Redis-ключа (ціле число або порожнє)", placeholderPlaceholder: "Порожнє означає, що він зберігається назавжди; інакше введіть ціле число.", convertTextToTime: "Конвертувати текст у час", convertTextToTimePlaceholder: "Напр. 1d буде 86400" }, }, 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} результатів`, deleteAllKeysMenu: (opts) => `Видалити все ${opts.count}`, importKeys: "Імпорт ключів", deleteSearchKeys: (opts) => `Видалити ${opts.count} відповідних ключів`, saveWithFormatJson: "Зберегти з форматуванням", formatJson: "Форматувати Json", wrap: "Перенос", unwrap: "Без переносу", downloadJson: "Завантажити JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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 і виглядає однаково, це функція безпеки. Щоб змінити налаштування, замініть їх порожніми або чимось іншим, і вони будуть збережені. Якщо ви не зміните налаштування, вони залишаться такими, як є на сервері.', aiTranslating: "Переклад...", aiSettings: "Налаштування ШІ", aiGroqApiKey: "Ключ API Groq", aiGroqApiKeyInfo: "Необов'язково. Власний ключ API Groq для кращої продуктивності. Отримайте безкоштовний ключ на", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Ключ API ШІ збережено", aiGroqApiKeyInvalid: "Недійсний ключ API Groq", aiGroqApiKeyNotSet: "Не встановлено (за замовчуванням сервера)", aiEnabled: "ШІ увімкнено", aiEnabledYes: "Так", aiEnabledNo: "Ні", aiRouteViaNetwork: "Маршрут через network.corifeus.com", aiRoutingDirect: "Запити йдуть напряму до Groq з вашим власним API-ключем, оминаючи network.corifeus.com.", aiRoutingNetwork: "AI-запити маршрутизуються через network.corifeus.com. Якщо у вас є власний безкоштовний ключ API Groq, ви можете вимкнути цей перемикач.", 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: "З'єднання", keysSort: { on: "Сортування ключів увімкнено", off: "Сортування ключів вимкнено" }, cluster: { on: "Cluster увімкнено", off: "Cluster вимкнено" }, sentinel: { on: "Sentinel увімкнено", off: "Sentinel вимкнено", name: "Назва Sentinel" }, readonly: { on: "Лише для читання увімкнено", off: "Лише для читання вимкнено" }, 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: "Час", type: "Тип", format: "Формат", loading: "Завантаження...", autoRefresh: "Авто", exportSearchHint: "Експортуються лише ключі, що відповідають поточному пошуку", importSearchHint: "Імпорт застосовується до всієї бази даних, а не лише до результатів пошуку", deleteSearchHint: "Видаляє всі ключі, що відповідають поточному пошуку на сервері", deletingSearchKeys: "Видалення відповідних ключів...", importNoKeys: "Ключі не знайдено у файлі", }, status: { dataCopied: "Дані скопійовано в буфер обміну", exportDone: "Експорт завершено", deletedSearchKeys: (opts) => `Видалено ${opts.count} ключів`, 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": "Цей індекс списку виходить за межі", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "Потрібна авторизація: будь ласка, автентифікуйтесь за допомогою HTTP Basic Auth та перезавантажте.", "auto-connection-failed": "Можливо, з'єднання було видалено і через це автоматичне підключення не вдалося.", invalid_console_command: "Ця команда не працює через GUI." }, 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: "Немає ключів", rss: "RSS", peak: "Пік", fragmentation: "Фрагментація", hitsAndMisses: "Влучання / Промахи", noClients: "Немає клієнтів", }, analysis: { title: "Аналіз пам'яті", runAnalysis: "Запустити аналіз", running: "Аналіз...", typeDistribution: "Розподіл типів", prefixMemory: "Пам'ять за префіксом", topKeysByMemory: "Найбільші ключі за пам'яттю", expirationOverview: "Термін дії ключів", memoryBreakdown: "Розбивка пам'яті", keysScanned: "Проскановано ключів", totalMemory: "Загальна пам'ять", rssMemory: "RSS пам'ять", peakMemory: "Пікова пам'ять", luaMemory: "Lua пам'ять", overheadMemory: "Накладні витрати", datasetMemory: "Набір даних", fragmentation: "Фрагментація", allocator: "Алокатор", withTTL: "З TTL", persistent: "Постійні", avgTTL: "Середній TTL", prefix: "Префікс", keyCount: "Кількість ключів", memoryUsage: "Використання пам'яті", noPrefix: "(без префікса)", topN: "Top N", maxScanKeys: "Макс. сканованих ключів", type: "Тип", noData: "Немає даних. Натисніть Запустити аналіз, щоб почати.", exportAll: "Експорт усього", }, 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: "Значення" } }, timeseries: { chart: "Графік", info: "Інформація", addPoint: "Додати точку даних", from: "Від (мс або -)", to: "До (мс або +)", aggregation: "Агрегація", timeBucket: "Інтервал (мс)", none: "Немає", dataPoints: "точки даних", labels: "Мітки", rules: "Правила", retention: "Зберігання", timestamp: "Мітка часу", value: "Значення", retentionHint: "0 = без закінчення терміну, або мілісекунди", duplicatePolicy: "Політика дублікатів", labelsHint: "ключ1 значення1 ключ2 значення2", timestampHint: "'*' означає автоматичне генерування, або мітка часу в мілісекундах", editAllHint: "Один запис на рядок: мітка_часу значення (мітка_часу може бути * для авто)", autoSpread: "Автоматичний інтервал розподілу *", formula: "Формула", formulaLinear: "Лінійна", formulaRandom: "Випадкова", formulaSawtooth: "Пилоподібна", formulaPoints: "Точки", formulaAmplitude: "Амплітуда", formulaOffset: "Зміщення", generate: "Згенерувати", exportChart: "Експорт PNG", overlay: "Накладання ключів", overlayHint: "Ключі через кому", mrangeFilter: "Фільтр міток", bulkMode: "Масова генерація", mrangeHint: "напр. sensor=temp" } }, treeControls: { settings: "Налаштування дерева", expandAll: "Розгорнути все", collapseAll: "Згорнути все", level: "Рівень", search: { search: "Пошук серед ключів", clear: "Очистити поточний пошук", placeholderClient: "Пошук на стороні клієнта", placeholderServer: "Пошук на стороні сервера", info: "Пошук на стороні клієнта означає, що текст збігається з введеним у пошуковому полі. Пошук на стороні сервера означає пошук у шаблонах ключів як *{текст-пошуку}*. Для великих наборів даних краще використовувати пошук на стороні сервера. Для менших наборів даних краще використовувати пошук на стороні клієнта." + ` Якщо кількість ключів перевищує ${p3xr.settings.maxLightKeysCount}, ви можете шукати лише на стороні сервера.`, largeSetInfo: "У великому наборі даних пошук на стороні клієнта вимкнено, тому зараз можливий лише пошук на стороні сервера.", infoDetails: "Щоб дізнатися, як працює пошук, перегляньте налаштування" }, pager: { next: "Наступна", prev: "Попередня", first: "Перша", last: "Остання" } } }, time: { type: "Тип", format: "Формат", loading: "Завантаження...", years: "років", months: "місяців", days: "днів", year: "рік", month: "місяць", day: "день", second: "секунда", seconds: "секунди", minute: "хвилина", minutes: "хвилини", hour: "година", hours: "години" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/vi/000077500000000000000000000000001517650670600137715ustar00rootroot00000000000000src/strings/vi/strings.js000066400000000000000000000716321517650670600160310ustar00rootroot00000000000000const strings = { error: { 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})?`; }, deleteSearchKeys: opts => { return `Bạn có chắc chắn muốn xóa tất cả các khóa khớp với "${opts.pattern}" không? Tìm thấy ${opts.count} khóa.`; }, 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.", delete: "Xóa?", 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" }, }, 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ả`, deleteAllKeysMenu: (opts) => `Xóa tất cả ${opts.count}`, importKeys: "Nhập khóa", deleteSearchKeys: (opts) => `Xóa ${opts.count} khóa khớp`, 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: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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ủ.", aiTranslating: "Đang dịch...", aiSettings: "Cài đặt AI", aiGroqApiKey: "Khóa API Groq", aiGroqApiKeyInfo: "Tùy chọn. Khóa API Groq riêng để có hiệu suất tốt hơn. Nhận khóa miễn phí từ", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "Đã lưu khóa API AI", aiGroqApiKeyInvalid: "Invalid Groq API key", aiGroqApiKeyNotSet: "Chưa đặt (mặc định máy chủ)", aiEnabled: "AI đã bật", aiEnabledYes: "Có", aiEnabledNo: "Không", aiRouteViaNetwork: "Route via network.corifeus.com", aiRoutingDirect: "Queries go directly to Groq using your own API key, bypassing network.corifeus.com.", aiRoutingNetwork: "AI queries are routed through network.corifeus.com. If you have your own free Groq API key, you can turn off this switch to route directly to Groq without network.corifeus.com.", 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", 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" }, 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", type: "Loại", format: "Định dạng", 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", deleteSearchHint: "Xóa tất cả các khóa khớp với tìm kiếm hiện tại trên máy chủ", deletingSearchKeys: "Đang xóa các khóa khớp...", importNoKeys: "Không tìm thấy khóa trong tệp", }, status: { dataCopied: "Dữ liệu nằm trong clipboard", exportDone: "Xuất hoàn tất", deletedSearchKeys: (opts) => `Đã xóa ${opts.count} khóa`, 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", "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." }, 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", rss: "RSS", peak: "Đỉnh", fragmentation: "Phân Mảnh", hitsAndMisses: "Trúng / Trượt", noClients: "Không có kết nối", }, analysis: { title: "Phân Tích Bộ Nhớ", runAnalysis: "Chạy Phân Tích", running: "Đang phân tích...", typeDistribution: "Phân Bố Loại", prefixMemory: "Bộ Nhớ theo Tiền Tố", topKeysByMemory: "Khóa Lớn Nhất theo Bộ Nhớ", expirationOverview: "Hết Hạn Khóa", memoryBreakdown: "Chi Tiết Bộ Nhớ", keysScanned: "Khóa Đã Quét", totalMemory: "Tổng Bộ Nhớ", rssMemory: "Bộ Nhớ RSS", peakMemory: "Bộ Nhớ Đỉnh", luaMemory: "Bộ Nhớ Lua", overheadMemory: "Chi Phí Phụ", datasetMemory: "Tập Dữ Liệu", fragmentation: "Phân Mảnh", allocator: "Bộ Cấp Phát", withTTL: "Có TTL", persistent: "Vĩnh Viễn", avgTTL: "TTL Trung Bình", prefix: "Tiền Tố", keyCount: "Số Lượng Khóa", memoryUsage: "Sử Dụng Bộ Nhớ", noPrefix: "(không có tiền tố)", topN: "Top N", maxScanKeys: "Tối Đa Khóa Quét", type: "Loại", noData: "Không có dữ liệu. Nhấp Chạy Phân Tích để bắt đầu.", exportAll: "Xuất Tất Cả", }, 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ị" } }, timeseries: { chart: "Biểu đồ", info: "Thông tin", addPoint: "Thêm điểm dữ liệu", from: "Từ (ms hoặc -)", to: "Đến (ms hoặc +)", aggregation: "Tổng hợp", timeBucket: "Nhóm (ms)", none: "Không có", dataPoints: "điểm dữ liệu", labels: "Nhãn", rules: "Quy tắc", retention: "Lưu giữ", timestamp: "Dấu thời gian", value: "Giá trị", retentionHint: "0 = không hết hạn, hoặc mili giây", duplicatePolicy: "Chính sách trùng lặp", labelsHint: "khóa1 giá_trị1 khóa2 giá_trị2", timestampHint: "'*' nghĩa là tự động tạo, hoặc dấu thời gian mili giây", editAllHint: "Một điểm dữ liệu mỗi dòng: dấu_thời_gian giá_trị (dấu thời gian có thể là * để tự động)", autoSpread: "Khoảng cách phân tán tự động *", formula: "Công thức", formulaLinear: "Tuyến tính", formulaRandom: "Ngẫu nhiên", formulaSawtooth: "Răng cưa", formulaPoints: "Điểm", formulaAmplitude: "Biên độ", formulaOffset: "Độ lệch", generate: "Tạo", exportChart: "Xuất PNG", overlay: "Chồng lấp khóa", overlayHint: "Các khóa phân cách bằng dấu phẩy", mrangeFilter: "Bộ lọc nhãn", bulkMode: "Tạo hàng loạt", mrangeHint: "vd. sensor=temp" } }, treeControls: { settings: "Cài đặt cây", expandAll: "Mở rộng tất cả", collapseAll: "Thu gọn tất cả", level: "Cấp", 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: { type: "Loại", format: "Định dạng", loading: "Đang tải...", years: "năm", months: "tháng", days: "ngày", year: "năm", month: "tháng", day: "ngày", second: "giây", seconds: "giây", minute: "phút", minutes: "phút", hour: "giờ", hours: "giờ" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/zh-HK/000077500000000000000000000000001517650670600142745ustar00rootroot00000000000000src/strings/zh-HK/strings.js000066400000000000000000000602031517650670600163240ustar00rootroot00000000000000const strings = { error: { 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節點嗎?", delete: "刪除?", deleteAllKeys: opts => { return `刪除這棵樹及其所有鍵(${opts.key})?`; }, deleteSearchKeys: opts => { return `確定要刪除所有符合 "${opts.pattern}" 嘅金鑰嗎?搵到 ${opts.count} 個金鑰。`; }, 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" }, }, 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} 個結果`, deleteAllKeysMenu: (opts) => `刪除全部 ${opts.count}`, importKeys: "匯入金鑰", deleteSearchKeys: (opts) => `刪除 ${opts.count} 個符合嘅金鑰`, saveWithFormatJson: "以格式儲存", formatJson: "格式化Json", wrap: "包裹", unwrap: "展開", downloadJson: "��載JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 開頭的值並且看起來相似,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改設置,這些設置將保留在伺服器上的原樣。", aiTranslating: "翻譯中...", aiSettings: "AI 設定", aiGroqApiKey: "Groq API 金鑰", aiGroqApiKeyInfo: "選填。使用自己嘅 Groq API 金鑰以獲得更好效能。免費取得金鑰", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API 金鑰已儲存", aiGroqApiKeyInvalid: "無效的 Groq API 金鑰", aiGroqApiKeyNotSet: "未設定(使用伺服器預設)", aiEnabled: "AI 已啟用", aiEnabledYes: "是", aiEnabledNo: "否", aiRouteViaNetwork: "透過 network.corifeus.com 路由", aiRoutingDirect: "使用您自己的 API 金鑰直接向 Groq 發送查詢,繞過 network.corifeus.com。", aiRoutingNetwork: "AI 查詢透過 network.corifeus.com 路由。如果您有自己的免費 Groq API 金鑰,可以關閉此開關直接使用 Groq。", 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: "連接", keysSort: { on: "键排序开启", off: "鑰匙分類" }, cluster: { on: "Cluster 開啟", off: "Cluster 關閉" }, sentinel: { on: "Sentinel 開啟", off: "Sentinel 關閉", name: "Sentinel 名称" }, readonly: { on: "只读开启", off: "只讀關閉" }, 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: "時間", type: "類型", format: "格式", loading: "載入中...", autoRefresh: "自動", exportSearchHint: "僅匯出與當前搜尋匹配的金鑰", importSearchHint: "匯入適用於整個資料庫,而不僅僅是搜尋結果", deleteSearchHint: "刪除所有符合當前搜尋嘅金鑰", deletingSearchKeys: "正在刪除符合嘅金鑰...", importNoKeys: "檔案中未找到金鑰", }, status: { dataCopied: "資料在剪貼簿中", exportDone: "匯出完成", deletedSearchKeys: (opts) => `已刪除 ${opts.count} 個金鑰`, 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": "此列表索引超出範圍", "invalid-json-value": "該值無效 JSON。", "http_auth_required": "需要授權:請使用HTTP Basic Auth進行身份驗證並重新載入。", "auto-connection-failed": "可能是因為這個原因,連線被刪除並且自動連線失敗。", invalid_console_command: "該命令無法透過 GUI 運行。" }, 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: "沒有金鑰", rss: "RSS", peak: "峰值", fragmentation: "碎片化", hitsAndMisses: "命中 / 未中", noClients: "沒有用戶端", }, analysis: { title: "記憶體分析", runAnalysis: "執行分析", running: "分析中...", typeDistribution: "類型分佈", prefixMemory: "按前綴分記憶體", topKeysByMemory: "按記憶體排名的金鑰", expirationOverview: "金鑰過期", memoryBreakdown: "記憶體明細", keysScanned: "已掃描金鑰", totalMemory: "總記憶體", rssMemory: "RSS 記憶體", peakMemory: "峰值記憶體", luaMemory: "Lua 記憶體", overheadMemory: "額外開銷", datasetMemory: "數據集", fragmentation: "碎片化", allocator: "分配器", withTTL: "有 TTL", persistent: "永久", avgTTL: "平均 TTL", prefix: "前綴", keyCount: "金鑰數量", memoryUsage: "記憶體使用量", noPrefix: "(無前綴)", topN: "Top N", maxScanKeys: "最大掃描金鑰數", type: "類型", noData: "無數據。點擊執行分析開始。", exportAll: "匯出全部", }, 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: "價值" } }, timeseries: { chart: "圖表", info: "資訊", addPoint: "新增資料點", from: "起始 (ms 或 -)", to: "結束 (ms 或 +)", aggregation: "聚合", timeBucket: "桶 (ms)", none: "無", dataPoints: "資料點", labels: "標籤", rules: "規則", retention: "保留", timestamp: "時間戳", value: "值", retentionHint: "0 = 不過期,或毫秒", duplicatePolicy: "重複策略", labelsHint: "鍵1 值1 鍵2 值2", timestampHint: "'*' 表示自動產生,或毫秒時間戳", editAllHint: "每行一個資料點:時間戳 值(時間戳可以用 * 表示自動)", autoSpread: "自動 * 分散間隔", formula: "公式", formulaLinear: "線性", formulaRandom: "隨機", formulaSawtooth: "鋸齒波", formulaPoints: "點數", formulaAmplitude: "振幅", formulaOffset: "偏移", generate: "產生", exportChart: "匯出 PNG", overlay: "疊加鍵", overlayHint: "逗號分隔的鍵", mrangeFilter: "標籤篩選器", bulkMode: "批量生成", mrangeHint: "例如 sensor=temp" } }, treeControls: { settings: "樹設定", expandAll: "全部展開", collapseAll: "全部折疊", level: "層級", search: { search: "在鍵中搜尋", clear: "清除目前搜尋以設定為空", placeholderClient: "搜尋客戶端", placeholderServer: "搜尋伺服器端", info: "客戶端搜尋意味著它與搜尋輸入中的文字相符。伺服器端搜尋意味著,就像在 *{search-text}* 這樣的鍵模式中進行搜尋。對於大型搜尋集,最好使用伺服器端搜尋。對於較小的搜尋集,最好使用客戶端搜尋模式。" + ` 如果鑰匙數已結束${p3xr.settings.maxLightKeysCount},只能在伺服器端搜尋。`, largeSetInfo: "在大型集合中,停用客戶端搜尋。所以現在只能進行伺服器端搜尋。", infoDetails: "要了解搜尋的工作原理,請檢查設置" }, pager: { next: "下一步", prev: "上一頁", first: "第一", last: "最後" } } }, time: { type: "類型", format: "格式", loading: "載入中...", years: "年", months: "月", days: "天", year: "年", month: "月", day: "日", second: "秒", seconds: "秒", minute: "分鐘", minutes: "分鐘", hour: "小時", hours: "小時" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/zh-TW/000077500000000000000000000000001517650670600143245ustar00rootroot00000000000000src/strings/zh-TW/strings.js000066400000000000000000000602021517650670600163530ustar00rootroot00000000000000const strings = { error: { 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節點嗎?", delete: "刪除?", deleteAllKeys: opts => { return `刪除這棵樹及其所有鍵(${opts.key})?`; }, deleteSearchKeys: opts => { return `確定要刪除所有符合 "${opts.pattern}" 的金鑰嗎?找到 ${opts.count} 個金鑰。`; }, 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" }, }, 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} 個結果`, deleteAllKeysMenu: (opts) => `刪除全部 ${opts.count}`, importKeys: "匯入金鑰", deleteSearchKeys: (opts) => `刪除 ${opts.count} 個符合的金鑰`, saveWithFormatJson: "以格式儲存", formatJson: "格式化Json", wrap: "包裹", unwrap: "展開", downloadJson: "��載JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", // 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", 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 開頭的值並且看起來相似,則這是一項安全功能。要更改設置,只需將這些設置替換為空或其他內容即可保存它們。如果您不更改設置,這些設置將保留在伺服器上的原樣。", aiTranslating: "翻譯中...", aiSettings: "AI 設定", aiGroqApiKey: "Groq API 金鑰", aiGroqApiKeyInfo: "選填。使用自己的 Groq API 金鑰以獲得更好效能。免費取得金鑰", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API 金鑰已儲存", aiGroqApiKeyInvalid: "無效的 Groq API 金鑰", aiGroqApiKeyNotSet: "未設定(使用伺服器預設)", aiEnabled: "AI 已啟用", aiEnabledYes: "是", aiEnabledNo: "否", aiRouteViaNetwork: "透過 network.corifeus.com 路由", aiRoutingDirect: "使用您自己的 API 金鑰直接向 Groq 發送查詢,繞過 network.corifeus.com。", aiRoutingNetwork: "AI 查詢透過 network.corifeus.com 路由。如果您有自己的免費 Groq API 金鑰,可以關閉此開關直接使用 Groq。", 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: "連接", keysSort: { on: "鍵排序開啟", off: "鑰匙分類" }, cluster: { on: "Cluster 開啟", off: "Cluster 關閉" }, sentinel: { on: "Sentinel 開啟", off: "Sentinel 關閉", name: "Sentinel 名稱" }, readonly: { on: "唯讀開啟", off: "只讀關閉" }, 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: "時間", type: "類型", format: "格式", loading: "載入中...", autoRefresh: "自動", exportSearchHint: "僅匯出與當前搜尋匹配的金鑰", importSearchHint: "匯入適用於整個資料庫,而不僅僅是搜尋結果", deleteSearchHint: "刪除所有符合當前搜尋的金鑰", deletingSearchKeys: "正在刪除符合的金鑰...", importNoKeys: "檔案中未找到金鑰", }, status: { dataCopied: "資料在剪貼簿中", exportDone: "匯出完成", deletedSearchKeys: (opts) => `已刪除 ${opts.count} 個金鑰`, 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": "此列表索引超出範圍", "invalid-json-value": "該值無效 JSON。", "http_auth_required": "需要授權:請使用HTTP Basic Auth進行身份驗證並重新載入。", "auto-connection-failed": "可能是因為這個原因,連線被刪除並且自動連線失敗。", invalid_console_command: "該命令無法透過 GUI 運行。" }, 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: "沒有金鑰", rss: "RSS", peak: "峰值", fragmentation: "碎片化", hitsAndMisses: "命中 / 未中", noClients: "沒有用戶端", }, analysis: { title: "記憶體分析", runAnalysis: "執行分析", running: "分析中...", typeDistribution: "類型分佈", prefixMemory: "按前綴分記憶體", topKeysByMemory: "按記憶體排名的金鑰", expirationOverview: "金鑰過期", memoryBreakdown: "記憶體明細", keysScanned: "已掃描金鑰", totalMemory: "總記憶體", rssMemory: "RSS 記憶體", peakMemory: "峰值記憶體", luaMemory: "Lua 記憶體", overheadMemory: "額外開銷", datasetMemory: "資料集", fragmentation: "碎片化", allocator: "分配器", withTTL: "有 TTL", persistent: "永久", avgTTL: "平均 TTL", prefix: "前綴", keyCount: "金鑰數量", memoryUsage: "記憶體使用量", noPrefix: "(無前綴)", topN: "Top N", maxScanKeys: "最大掃描金鑰數", type: "類型", noData: "無資料。點擊執行分析開始。", exportAll: "匯出全部", }, 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: "價值" } }, timeseries: { chart: "圖表", info: "資訊", addPoint: "新增資料點", from: "起始 (ms 或 -)", to: "結束 (ms 或 +)", aggregation: "聚合", timeBucket: "桶 (ms)", none: "無", dataPoints: "資料點", labels: "標籤", rules: "規則", retention: "保留", timestamp: "時間戳", value: "值", retentionHint: "0 = 不過期,或毫秒", duplicatePolicy: "重複策略", labelsHint: "鍵1 值1 鍵2 值2", timestampHint: "'*' 表示自動產生,或毫秒時間戳", editAllHint: "每行一個資料點:時間戳 值(時間戳可以用 * 表示自動)", autoSpread: "自動 * 分散間隔", formula: "公式", formulaLinear: "線性", formulaRandom: "隨機", formulaSawtooth: "鋸齒波", formulaPoints: "點數", formulaAmplitude: "振幅", formulaOffset: "偏移", generate: "產生", exportChart: "匯出 PNG", overlay: "疊加鍵", overlayHint: "逗號分隔的鍵", mrangeFilter: "標籤篩選器", bulkMode: "批量生成", mrangeHint: "例如 sensor=temp" } }, treeControls: { settings: "樹設定", expandAll: "全部展開", collapseAll: "全部折疊", level: "層級", search: { search: "在鍵中搜尋", clear: "清除目前搜尋以設定為空", placeholderClient: "搜尋客戶端", placeholderServer: "搜尋伺服器端", info: "客戶端搜尋意味著它與搜尋輸入中的文字相符。伺服器端搜尋意味著,就像在 *{search-text}* 這樣的鍵模式中進行搜尋。對於大型搜尋集,最好使用伺服器端搜尋。對於較小的搜尋集,最好使用客戶端搜尋模式。" + ` 如果鑰匙數已結束${p3xr.settings.maxLightKeysCount},只能在伺服器端搜尋。`, largeSetInfo: "在大型集合中,停用客戶端搜尋。所以現在只能進行伺服器端搜尋。", infoDetails: "要了解搜尋的工作原理,請檢查設置" }, pager: { next: "下一步", prev: "上一頁", first: "第一", last: "最後" } } }, time: { type: "類型", format: "格式", loading: "載入中...", years: "年", months: "月", days: "天", year: "年", month: "月", day: "日", second: "秒", seconds: "秒", minute: "分鐘", minutes: "分鐘", hour: "小時", hours: "小時" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/strings/zn/000077500000000000000000000000001517650670600140025ustar00rootroot00000000000000src/strings/zn/strings.js000066400000000000000000000572271517650670600160460ustar00rootroot00000000000000const strings = { error: { 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节点吗?", delete: "删除?", deleteAllKeys: opts => { return `删除此树及其所有键 (${opts.key})?`; }, deleteSearchKeys: opts => { return `确定要删除所有匹配 "${opts.pattern}" 的键吗?找到 ${opts.count} 个键。`; }, 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" }, }, 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} 个结果`, deleteAllKeysMenu: (opts) => `删除全部 ${opts.count}`, importKeys: "导入键", deleteSearchKeys: (opts) => `删除 ${opts.count} 个匹配的键`, saveWithFormatJson: "保存格式", formatJson: "格式化Json", wrap: "自动换行", unwrap: "不换行", downloadJson: "下载 JSON", pubsubMonitor: "PubSub", pulse: "Pulse", profiler: "Profiler", memoryAnalysis: "Analysis", 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", 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 开头的值并且看起来相似,则这是一项安全功能。 要更改设置,只需将这些设置替换为空或其他内容即可保存它们。 如果您不更改设置,这些设置将保留在服务器上的原样。', aiTranslating: "翻译中...", aiSettings: "AI 设置", aiGroqApiKey: "Groq API 密钥", aiGroqApiKeyInfo: "可选。使用自己的 Groq API 密钥获得更好性能。免费获取密钥", aiGroqApiKeyPlaceholder: "gsk_...", aiGroqApiKeySaved: "AI API 密钥已保存", aiGroqApiKeyInvalid: "无效的 Groq API 密钥", aiGroqApiKeyNotSet: "未设置(使用服务器默认)", aiEnabled: "AI 已启用", aiEnabledYes: "是", aiEnabledNo: "否", aiRouteViaNetwork: "通过 network.corifeus.com 路由", aiRoutingDirect: "使用您自己的 API 密钥直接向 Groq 发送查询,绕过 network.corifeus.com。", aiRoutingNetwork: "AI 查询通过 network.corifeus.com 路由。如果您有自己的免费 Groq API 密钥,可以关闭此开关直接使用 Groq。", 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: "连接", keysSort: { on: "开启键排序", off: "关闭键排序" }, cluster: { on: "群集", off: "集群关闭" }, sentinel: { on: "哨兵開啟", off: "哨兵關閉", name: '哨兵名称' }, readonly: { on: "只读", off: "只读关闭" }, 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: "时间", type: "类型", format: "格式", loading: "加载中...", autoRefresh: "自动", exportSearchHint: "仅导出与当前搜索匹配的键", importSearchHint: "导入适用于整个数据库,而不仅仅是搜索结果", deleteSearchHint: "删除所有匹配当前搜索的键", deletingSearchKeys: "正在删除匹配的键...", importNoKeys: "文件中未找到键", }, status: { dataCopied: "数据在剪贴板中", exportDone: "导出完成", deletedSearchKeys: (opts) => `已删除 ${opts.count} 个键`, 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": "此列表索引超出范围", "invalid-json-value": "The value is not valid JSON.", "http_auth_required": "需要授权:请先完成 HTTP Basic Auth 登录后再刷新页面。", "auto-connection-failed": "因此,可能导致连接被删除并且自动连接失败。", invalid_console_command: "此命令无法通过 GUI 运行。" }, 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: "没有键", rss: "RSS", peak: "峰值", fragmentation: "碎片化", hitsAndMisses: "命中 / 未命中", noClients: "没有客户端", }, analysis: { title: "内存分析", runAnalysis: "运行分析", running: "分析中...", typeDistribution: "类型分布", prefixMemory: "按前缀分内存", topKeysByMemory: "按内存排名的键", expirationOverview: "键过期", memoryBreakdown: "内存明细", keysScanned: "已扫描键", totalMemory: "总内存", rssMemory: "RSS 内存", peakMemory: "峰值内存", luaMemory: "Lua 内存", overheadMemory: "额外开销", datasetMemory: "数据集", fragmentation: "碎片化", allocator: "分配器", withTTL: "有 TTL", persistent: "永久", avgTTL: "平均 TTL", prefix: "前缀", keyCount: "键数量", memoryUsage: "内存使用量", noPrefix: "(无前缀)", topN: "Top N", maxScanKeys: "最大扫描键数", type: "类型", noData: "无数据。点击运行分析开始。", exportAll: "导出全部", }, 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: "值" } }, timeseries: { chart: "图表", info: "信息", addPoint: "添加数据点", from: "起始 (ms 或 -)", to: "结束 (ms 或 +)", aggregation: "聚合", timeBucket: "桶 (ms)", none: "无", dataPoints: "数据点", labels: "标签", rules: "规则", retention: "保留", timestamp: "时间戳", value: "值", retentionHint: "0 = 不过期,或毫秒", duplicatePolicy: "重复策略", labelsHint: "键1 值1 键2 值2", timestampHint: "'*' 表示自动生成,或毫秒时间戳", editAllHint: "每行一个数据点:时间戳 值(时间戳可以用 * 表示自动)", autoSpread: "自动 * 分散间隔", formula: "公式", formulaLinear: "线性", formulaRandom: "随机", formulaSawtooth: "锯齿波", formulaPoints: "点数", formulaAmplitude: "振幅", formulaOffset: "偏移", generate: "生成", exportChart: "导出 PNG", overlay: "叠加键", overlayHint: "逗号分隔的键", mrangeFilter: "标签过滤器", bulkMode: "批量生成", mrangeHint: "例如 sensor=temp" } }, treeControls: { settings: "树设置", expandAll: "展开所有", collapseAll: "折叠所有", level: "级别", search: { search: "在键中搜索", clear: "清空当前搜索结果", placeholderClient: "客户端搜索", placeholderServer: "服务端搜索", info: `客户端搜索是匹配输入的文本,服务端搜索则遵循*{search-text}*模式搜索.对于大量数据的搜索最好在服务端进行搜索,而较小数据量可以考虑客户端搜索。如果键数超过 ${p3xr.settings.maxLightKeysCount}个的则只能在服务端搜索`, largeSetInfo: "在大型集合中,禁用客户端搜索。 所以现在只能进行服务器端搜索。", infoDetails: "要了解搜索的工作原理,请查看设置" }, pager: { next: "下一页", prev: "上一页", first: "首页", last: "末页" } } }, time: { type: "类型", format: "格式", loading: "加载中...", years: "年份", months: "个月", days: "天", year: "年", month: "月", day: "天", second: "秒", seconds: "秒", minute: "分钟", minutes: "分钟", hour: "小时", hours: "小时" }, redisTypes: { string: "String", list: "List", hash: "Hash table", set: "Set", zset: "Sorted set - zset", stream: "Stream", json: "JSON", timeseries: "Time Series" } }; module.exports = strings; src/vendor.js000066400000000000000000000036671517650670600135310ustar00rootroot00000000000000require('./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.scss000066400000000000000000000013521517650670600140550ustar00rootroot00000000000000// 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.json000066400000000000000000000012661517650670600136070ustar00rootroot00000000000000{ "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.lock000066400000000000000000016734621517650670600127410ustar00rootroot00000000000000# 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.6": version "0.2102.6" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.2102.6.tgz#65eae4f7a9e422ade7c5e9d9e5d9b811aecf12d5" integrity sha512-h4qybKypR7OuwcTHPQI1zRm7abXgmPiV49vI2UeMtVVY/GKzru9gMexcYmWabzEyBY8w6VSfWjV2X+eit2EhDQ== dependencies: "@angular-devkit/core" "21.2.6" rxjs "7.8.2" "@angular-devkit/build-angular@^21.2.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-21.2.6.tgz#0c467353fb364d6f3cfc11aa75822b661e8350af" integrity sha512-eUWcWiMOUg01QyJkaO/csyTy8ZecW2HrMvOlgM+IWLagDyqFQVcSwcx9/NJy/42YA+EtpBcCnXPK3vk5NVob7w== dependencies: "@ampproject/remapping" "2.3.0" "@angular-devkit/architect" "0.2102.6" "@angular-devkit/build-webpack" "0.2102.6" "@angular-devkit/core" "21.2.6" "@angular/build" "21.2.6" "@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.6" 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.6": version "0.2102.6" resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.2102.6.tgz#6668353e0cf0da6f5cf96d355db6a397cf752dc6" integrity sha512-IN0xUlFTOmDt+UrW1X7ymYgp94Y/HfMj4zNahplBEbBl72WmqQdJGiDMThGgFY+RzJJMyAbqD7RDyiimsVkfOA== dependencies: "@angular-devkit/architect" "0.2102.6" rxjs "7.8.2" "@angular-devkit/core@21.2.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-21.2.6.tgz#96b864e5e1b7e718c0c20f45a9847fde8d1dcda2" integrity sha512-u5gPTAY7MC02uACQE39xxiFcm1hslF+ih/f2borMWnhER0JNTpHjLiLRXFkq7or7+VVHU30zfhK4XNAuO4WTIg== 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.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@angular/build/-/build-21.2.6.tgz#064df623cb1b6ee0fb7c691897eff6b9b6dd5c1a" integrity sha512-PJltYl9/INfz8nZ/KHf39nqlmt3c9PR0jJaZt6hhCPENyAf4PwQpm28erkJmbOYO864goIuws41lduYXyDqQ0Q== dependencies: "@ampproject/remapping" "2.3.0" "@angular-devkit/architect" "0.2102.6" "@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.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-21.2.5.tgz#0c2cf43b36b6ac5574623aebfa58ac3310e357c8" integrity sha512-F1sVqMAGYoiJNYYaR2cerqTo7IqpxQ3ZtMDxR3rtB0rSSd5UPOIQoqpsfSd6uH8FVnuzKaBII8Mg6YrjClFsng== 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.7": version "21.2.7" resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-21.2.7.tgz#f9549bf7af7f8839b111f367cc9f2b0a4b6eb4dc" integrity sha512-r76vKBM7Wu0N8PTeec7340Gtv1wC7IBQGJOQnukshPgzaabgNKxmUiChGxi+RJNo/Tsdiw9ZfddcBgBjq79ZIg== 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.5": version "21.2.5" resolved "https://registry.yarnpkg.com/@angular/material/-/material-21.2.5.tgz#fe8f6f26f7ce1440f934fb54903b7a22ea5643eb" integrity sha512-hSil2QUKObjF73EbhUEA5xAZx0/o9r/AFrkRsxa2z9e11jSjlKJHrYuY1tMIFv3SpzK33EYf58IXOBJVwt0iIw== 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.7": version "21.2.7" resolved "https://registry.yarnpkg.com/@angular/router/-/router-21.2.7.tgz#dafea84dffad78c85aa5760108365703fa8fec02" integrity sha512-Ina6XgtpvXT1OsLAomURHJGQDOkIVGrguWAOZ7+gOjsJEjUfpxTktFter+/K59KMC2yv6yneLvYSn3AswTYx7A== 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/runtime@^7.12.5", "@babel/runtime@^7.28.6": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== "@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", "@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.6", "@ngtools/webpack@^21.2.6": version "21.2.6" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-21.2.6.tgz#d54dbfda1f5da851173f86faf9a99a680d5f2aed" integrity sha512-SU6aMvFz/0uM2WhIGrZ/QexEIqT/VdLfcmy7OYAxOd3w7u2wqQao/1uSOEJo+BR+B48QYf7Z5LLpS8t1mWZYKQ== "@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.1": version "1.59.1" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.59.1.tgz#5c4d38eac84a61527af466602ae20277685a02d6" integrity sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg== dependencies: playwright "1.59.1" "@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/pako@^2.0.3": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.4.tgz#c3575ef8125e176c345fa0e7b301c1db41170c15" integrity sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw== "@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/raf@^3.4.0": version "3.4.3" resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== "@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/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@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-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== 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== canvg@^3.0.11: version "3.0.11" resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== dependencies: "@babel/runtime" "^7.12.5" "@types/raf" "^3.4.0" core-js "^3.8.3" raf "^3.4.1" regenerator-runtime "^0.13.7" rgbcolor "^1.0.1" stackblur-canvas "^2.0.0" svg-pathdata "^6.0.3" 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-js@^3.6.0, core-js@^3.8.3: version "3.49.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.49.0.tgz#8b4d520ac034311fa21aa616f017ada0e0dbbddd" integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg== 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-line-break@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== dependencies: utrie "^1.0.2" 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" dompurify@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.3.3.tgz#680cae8af3e61320ddf3666a3bc843f7b291b2b6" integrity sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA== optionalDependencies: "@types/trusted-types" "^2.0.7" 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-png@^6.2.0: version "6.4.0" resolved "https://registry.yarnpkg.com/fast-png/-/fast-png-6.4.0.tgz#807fc353ccab060d09151b7d082786e02d8e92d6" integrity sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q== dependencies: "@types/pako" "^2.0.3" iobuffer "^5.3.2" pako "^2.1.0" 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== fflate@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== 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" html2canvas@^1.0.0-rc.5: version "1.4.1" resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== dependencies: css-line-break "^2.1.0" text-segmentation "^1.0.3" 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== immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 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" iobuffer@^5.3.2: version "5.4.0" resolved "https://registry.yarnpkg.com/iobuffer/-/iobuffer-5.4.0.tgz#f85dff957fd0579257472f0a4cfe5ed3430e63e1" integrity sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA== 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== jspdf@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-4.2.1.tgz#6ba0d263999313f91f369ee80ecf235046b2acd8" integrity sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ== dependencies: "@babel/runtime" "^7.28.6" fast-png "^6.2.0" fflate "^0.8.1" optionalDependencies: canvg "^3.0.11" core-js "^3.6.0" dompurify "^3.3.1" html2canvas "^1.0.0-rc.5" jszip@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" pako "~1.0.2" readable-stream "~2.3.6" setimmediate "^1.0.5" 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" lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" 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.1: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== 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" pako@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== pako@~1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 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== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== 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.1: version "1.59.1" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.59.1.tgz#d8a2b28bcb8f2bd08ef3df93b02ae83c813244b2" integrity sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg== playwright@1.59.1, playwright@^1.59.1: version "1.59.1" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.59.1.tgz#f7b0ca61637ae25264cec370df671bbe1f368a4a" integrity sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw== dependencies: playwright-core "1.59.1" 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" raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.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, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 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== regenerator-runtime@^0.13.7: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 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== rgbcolor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== 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" setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 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" stackblur-canvas@^2.0.0: version "2.7.0" resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== "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== svg-pathdata@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== 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-segmentation@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== dependencies: utrie "^1.0.2" 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.7: version "9.5.7" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.7.tgz#582663e853646e18506cd5cc79feb354952731c0" integrity sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg== 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== utrie@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== dependencies: base64-arraybuffer "^1.0.2" 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==