diff --git a/.githooks/_/pre-commit b/.githooks/_/pre-commit index c4a7cba0..387f0eb4 100755 --- a/.githooks/_/pre-commit +++ b/.githooks/_/pre-commit @@ -9,4 +9,4 @@ if [ -f "$SIMPLE_GIT_HOOKS_RC" ]; then . "$SIMPLE_GIT_HOOKS_RC" fi -cd packages/web && deno task lint:fix && deno task format \ No newline at end of file +# cd packages/web && bun run lint && bun run format \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 507c260a..575cfaec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,29 +16,29 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup Deno - uses: denoland/setup-deno@v2 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - deno-version: v2.x + bun-version: latest - name: Install Dependencies - run: deno install + run: bun install - - name: Cache Deno dependencies + - name: Cache Bun dependencies uses: actions/cache@v4 with: path: | - ~/.cache/deno - packages/web/deno.lock - key: ${{ runner.os }}-deno-${{ hashFiles('packages/web/deno.lock') }} + ~/.bun/install/cache + packages/web/node_modules + key: ${{ runner.os }}-bun-${{ hashFiles('packages/web/bun.lockb') }} restore-keys: | - ${{ runner.os }}-deno- + ${{ runner.os }}-bun- - - name: Run linter - run: deno lint + # - name: Run linter + # run: bun run lint - - name: Check formatter - run: deno fmt --check + # - name: Check formatter + # run: bun run check - name: Build Package - run: deno task --filter web build + run: bun run build diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 61df9ed2..d6963bc4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,18 +15,20 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Deno - uses: denoland/setup-deno@v2 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - deno-version: v2.x + bun-version: latest - - name: Cache Deno dependencies + - name: Cache Bun dependencies uses: actions/cache@v4 with: - path: ${{ steps.setup-deno.outputs.deno-cache-path }} - key: deno-cache-${{ runner.os }}-${{ hashFiles('**/deno.lock') }} + path: | + ~/.bun/install/cache + packages/web/node_modules + key: ${{ runner.os }}-bun-${{ hashFiles('packages/web/bun.lockb') }} restore-keys: | - deno-cache-${{ runner.os }}-* + ${{ runner.os }}-bun- # - name: Run tests # working-directory: packages/web @@ -34,15 +36,15 @@ jobs: - name: Install Dependencies working-directory: packages/web - run: deno install + run: bun install - name: Build Package working-directory: packages/web - run: deno task build + run: bun run build - name: Package Output working-directory: packages/web - run: deno task package + run: bun run package - name: Archive compressed build uses: actions/upload-artifact@v4 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 459ca916..36f86754 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,34 +13,34 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup Deno - uses: denoland/setup-deno@v2 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - deno-version: v2.x + bun-version: latest - name: Install Dependencies # Commands will run from 'packages/web' working-directory: packages/web - run: deno install + run: bun install - - name: Cache Deno dependencies + - name: Cache Bun dependencies uses: actions/cache@v4 with: path: | - ~/.cache/deno - packages/web/deno.lock - key: ${{ runner.os }}-deno-${{ hashFiles('packages/web/deno.lock') }} + ~/.bun/install/cache + packages/web/node_modules + key: ${{ runner.os }}-bun-${{ hashFiles('packages/web/bun.lockb') }} restore-keys: | - ${{ runner.os }}-deno- + ${{ runner.os }}-bun- - - name: Run linter - working-directory: packages/web - run: deno lint + # - name: Run linter + # working-directory: packages/web + # run: bun run lint - - name: Check formatter - working-directory: packages/web - run: deno fmt --check + # - name: Check formatter + # working-directory: packages/web + # run: bun run check - name: Build Package working-directory: packages/web - run: deno task --filter web build + run: bun run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4b4c4e04..55cbc4fa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,19 +19,27 @@ jobs: with: fetch-depth: 0 - # --- Setup Deno --- + # --- Setup Bun --- + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + # --- Setup Deno (for NPM package building) --- - name: Setup Deno uses: denoland/setup-deno@v2 with: deno-version: v2.x - - name: Cache Deno Dependencies + - name: Cache Bun Dependencies uses: actions/cache@v4 with: - path: ~/.cache/deno - key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }} + path: | + ~/.bun/install/cache + packages/web/node_modules + key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} restore-keys: | - ${{ runner.os }}-deno- + ${{ runner.os }}-bun- # --- Determine Changed Packages --- - name: Get Changed Package Directories @@ -98,12 +106,12 @@ jobs: - name: Run Web App Tests if: steps.web_changes.outputs.web_changed == 'true' working-directory: packages/web - run: deno task test + run: bun run test - name: Create Web App Release Archive if: steps.web_changes.outputs.web_changed == 'true' working-directory: packages/web - run: deno task package # Generates dist/build.tar + run: bun run package # Generates dist/build.tar - name: Upload Web App Archive if: steps.web_changes.outputs.web_changed == 'true' diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 15b1f6c5..559fad6f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["bradlc.vscode-tailwindcss", "denoland.vscode-deno"] + "recommendations": ["bradlc.vscode-tailwindcss", "denoland.vscode-deno"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 04d2f6e1..1624cd2e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,6 @@ { - "deno.enable": true, - "deno.suggest.imports.autoDiscover": true, "editor.formatOnSave": true, - "editor.defaultFormatter": "denoland.vscode-deno", - "[typescript]": { - "editor.defaultFormatter": "denoland.vscode-deno" + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit", } } diff --git a/README.md b/README.md index 75440fb6..d591a06d 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ All `Meshtastic JS` packages (core and transports) are published both to This monorepo leverages the following technologies: -- **Runtime:** Deno +- **Runtime:** Bun - **Web Client:** React.js - **Styling:** Tailwind CSS - **Bundling:** Vite @@ -56,7 +56,7 @@ This monorepo leverages the following technologies: ### Prerequisites -You'll need to have [Deno](https://deno.com/) installed to work with this +You'll need to have [Bun](https://bun.sh/) installed to work with this monorepo. Follow the installation instructions on their home page. ### Development Setup @@ -68,7 +68,7 @@ monorepo. Follow the installation instructions on their home page. ``` 2. **Install dependencies for all packages:** ```bash - deno task install:all + bun install ``` This command installs all necessary dependencies for all packages within the monorepo. @@ -80,7 +80,7 @@ monorepo. Follow the installation instructions on their home page. To start the development server for the web client: ```bash -deno task --filter web dev +bun run --filter web dev ``` This will typically run the web client on http://localhost:3000 and requires a @@ -89,11 +89,11 @@ Chromium browser ## Meshtastic JS Packages While the js packages are primarily libraries, you can run their tests or -specific development scripts if defined within their deno.json files. For +specific development scripts if defined within their package.json files. For example, to run tests for a specific package: ```bash -deno task --filter core test +bun run --filter core test ``` ### Feedback @@ -102,24 +102,24 @@ If you encounter any issues with nightly builds, please report them in our [issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps improve the stability of future releases -### Why Deno? +### Why Bun? -Meshtastic Web uses Deno as its development platform for several compelling +Meshtastic Web uses Bun as its development platform for several compelling reasons: -- **Built-in Security**: Deno's security-first approach requires explicit - permissions for file, network, and environment access, reducing vulnerability - risks. +- **Fast Performance**: Bun is built from the ground up for speed, offering + significantly faster package installation and bundling compared to other + JavaScript runtimes. - **TypeScript Support**: Native TypeScript support without additional configuration, enhancing code quality and developer experience. - **Modern JavaScript**: First-class support for ESM imports, top-level await, and other modern JavaScript features. -- **Simplified Tooling**: Built-in formatter, linter, test runner, and bundler - eliminate the need for multiple third-party tools. +- **All-in-One Tooling**: Built-in package manager, bundler, test runner, and + transpiler eliminate the need for multiple third-party tools. +- **Node.js Compatibility**: Drop-in replacement for Node.js with better + performance and built-in tooling. - **Reproducible Builds**: Lockfile ensures consistent builds across all environments. -- **Web Standard APIs**: Uses browser-compatible APIs, making code more portable - between server and client environments. ### Contributing diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..b05e7d7f --- /dev/null +++ b/bun.lock @@ -0,0 +1,1716 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "meshtastic-web", + "devDependencies": { + "@biomejs/biome": "^1.8.3", + "bun": "^1.1.18", + "typescript": "^5.8.3", + }, + }, + "packages/web": { + "name": "meshtastic-web", + "version": "2.7.0-0", + "dependencies": { + "@bufbuild/protobuf": "^2.6.0", + "@hookform/resolvers": "^5.1.1", + "@meshtastic/core": "npm:@jsr/meshtastic__core@2.6.4", + "@meshtastic/transport-http": "npm:@jsr/meshtastic__transport-http", + "@meshtastic/transport-web-bluetooth": "npm:@jsr/meshtastic__transport-web-bluetooth", + "@meshtastic/transport-web-serial": "npm:@jsr/meshtastic__transport-web-serial", + "@noble/curves": "^1.9.2", + "@radix-ui/react-accordion": "^1.2.11", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-menubar": "^1.1.15", + "@radix-ui/react-popover": "^1.1.14", + "@radix-ui/react-scroll-area": "^1.2.9", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slider": "^1.3.5", + "@radix-ui/react-switch": "^1.2.5", + "@radix-ui/react-tabs": "^1.1.12", + "@radix-ui/react-toast": "^1.2.14", + "@radix-ui/react-toggle-group": "^1.1.10", + "@radix-ui/react-tooltip": "^1.2.7", + "@tailwindcss/vite": "^4.1.11", + "@tanstack/react-router": "^1.127.9", + "@tanstack/react-router-devtools": "^1.127.9", + "@tanstack/router-cli": "^1.127.8", + "@tanstack/router-devtools": "^1.127.9", + "@turf/turf": "^7.2.0", + "@types/node": "^24.0.14", + "@types/web-bluetooth": "^0.0.21", + "base64-js": "^1.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "crypto-random-string": "^5.0.0", + "i18next": "^25.3.2", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", + "idb-keyval": "^6.2.2", + "immer": "^10.1.1", + "js-cookie": "^3.0.5", + "lucide-react": "^0.525.0", + "maplibre-gl": "5.6.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-error-boundary": "^6.0.0", + "react-hook-form": "^7.60.0", + "react-i18next": "^15.6.0", + "react-map-gl": "8.0.4", + "react-qrcode-logo": "^3.0.0", + "rfc4648": "^1.5.4", + "zod": "^4.0.5", + "zustand": "5.0.6", + }, + "devDependencies": { + "@biomejs/biome": "2.0.6", + "@tanstack/router-plugin": "^1.127.9", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/chrome": "^0.1.0", + "@types/js-cookie": "^3.0.6", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@types/serviceworker": "^0.0.142", + "@types/w3c-web-serial": "^1.0.8", + "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.21", + "gzipper": "^8.2.1", + "happy-dom": "^18.0.1", + "simple-git-hooks": "^2.13.0", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.11", + "tailwindcss-animate": "^1.0.7", + "tar": "^7.4.3", + "testing-library": "^0.0.2", + "typescript": "^5.8.3", + "vite": "^7.0.4", + "vitest": "^3.2.4", + }, + }, + }, + "packages": { + "@adobe/css-tools": ["@adobe/css-tools@4.4.3", "", {}, "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@angular/common": ["@angular/common@6.1.10", "", { "dependencies": { "tslib": "^1.9.0" }, "peerDependencies": { "@angular/core": "6.1.10", "rxjs": "^6.0.0" } }, "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ=="], + + "@angular/core": ["@angular/core@6.1.10", "", { "dependencies": { "tslib": "^1.9.0" }, "peerDependencies": { "rxjs": "^6.0.0", "zone.js": "~0.8.26" } }, "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + + "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], + + "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "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" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], + + "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="], + + "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], + + "@babel/types": ["@babel/types@7.28.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ=="], + + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.6.0", "", {}, "sha512-6cuonJVNOIL7lTj5zgo/Rc2bKAo4/GvN+rKCrUj7GdEHRzCk8zKOfFwUsL9nAVk5rSIsRmlgcpLzTRysopEeeg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.6", "", { "os": "aix", "cpu": "ppc64" }, "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.6", "", { "os": "android", "cpu": "arm" }, "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.6", "", { "os": "android", "cpu": "arm64" }, "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.6", "", { "os": "android", "cpu": "x64" }, "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.6", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.6", "", { "os": "linux", "cpu": "arm" }, "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.6", "", { "os": "linux", "cpu": "ia32" }, "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.6", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.6", "", { "os": "linux", "cpu": "s390x" }, "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.6", "", { "os": "linux", "cpu": "x64" }, "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.6", "", { "os": "none", "cpu": "arm64" }, "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.6", "", { "os": "none", "cpu": "x64" }, "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.6", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.6", "", { "os": "openbsd", "cpu": "x64" }, "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.6", "", { "os": "none", "cpu": "arm64" }, "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.6", "", { "os": "sunos", "cpu": "x64" }, "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.6", "", { "os": "win32", "cpu": "x64" }, "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.2", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.2", "", { "dependencies": { "@floating-ui/core": "^1.7.2", "@floating-ui/utils": "^0.2.10" } }, "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.4", "", { "dependencies": { "@floating-ui/dom": "^1.7.2" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + + "@gfx/zopfli": ["@gfx/zopfli@1.0.15", "", { "dependencies": { "base64-js": "^1.3.0" } }, "sha512-7mBgpi7UD82fsff5ThQKet0uBTl4BYerQuc+/qA1ELTwWEiIedRTcD3JgiUu9wwZ2kytW8JOb165rSdAt8PfcQ=="], + + "@hookform/resolvers": ["@hookform/resolvers@5.1.1", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], + + "@jsr/meshtastic__core": ["@jsr/meshtastic__core@2.6.4", "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.4.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.2", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-1Kz5DK6peFxluHOJR38vFwfgeJzMXTz+3p6TvibjILVhSQC2U1nu8aJbn6w5zhRqS+j79OmtrRvdzL6VNsTkkQ=="], + + "@jsr/meshtastic__protobufs": ["@jsr/meshtastic__protobufs@2.7.0", "https://npm.jsr.io/~/11/@jsr/meshtastic__protobufs/2.7.0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3" } }, "sha512-ndZhUyB/ADSyjJI+iSeSOoIKqNGZ2+ERVjfY0qnh4jgF740tFTwefC5mzZhOqDLbreGFYS79+429NtH5Ujdzdg=="], + + "@mapbox/geojson-rewind": ["@mapbox/geojson-rewind@0.5.2", "", { "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" }, "bin": { "geojson-rewind": "geojson-rewind" } }, "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA=="], + + "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="], + + "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="], + + "@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@2.0.6", "", {}, "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA=="], + + "@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.1", "", {}, "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="], + + "@mapbox/vector-tile": ["@mapbox/vector-tile@1.3.1", "", { "dependencies": { "@mapbox/point-geometry": "~0.1.0" } }, "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw=="], + + "@mapbox/whoots-js": ["@mapbox/whoots-js@3.1.0", "", {}, "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="], + + "@maplibre/maplibre-gl-style-spec": ["@maplibre/maplibre-gl-style-spec@23.3.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", "quickselect": "^3.0.0", "rw": "^1.3.3", "tinyqueue": "^3.0.0" }, "bin": { "gl-style-format": "dist/gl-style-format.mjs", "gl-style-migrate": "dist/gl-style-migrate.mjs", "gl-style-validate": "dist/gl-style-validate.mjs" } }, "sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA=="], + + "@meshtastic/core": ["@jsr/meshtastic__core@2.6.4", "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.4.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.2", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-1Kz5DK6peFxluHOJR38vFwfgeJzMXTz+3p6TvibjILVhSQC2U1nu8aJbn6w5zhRqS+j79OmtrRvdzL6VNsTkkQ=="], + + "@meshtastic/transport-http": ["@jsr/meshtastic__transport-http@0.2.1", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-http/0.2.1.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0" } }, "sha512-lmQKr3aIINKvtGROU4HchmSVqbZSbkIHqajowRRC8IAjsnR0zNTyxz210QyY4pFUF9hpcW3GRjwq5h/VO2JuGg=="], + + "@meshtastic/transport-web-bluetooth": ["@jsr/meshtastic__transport-web-bluetooth@0.1.2", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-bluetooth/0.1.2.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.4" } }, "sha512-Z+5pv9RXNgY0/crKExOH3pZ6LT0HIXFmnBL7NX5AO2knOFRn+4lmxQEhhmiTTlkUfqyEfAvbjuY5u4mq9TPTdQ=="], + + "@meshtastic/transport-web-serial": ["@jsr/meshtastic__transport-web-serial@0.2.1", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-serial/0.2.1.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0" } }, "sha512-yumjEGLkAuJYOC3aWKvZzbQqi/LnqaKfNpVCY7Ki7oLtAshNiZrBLiwiFhN7+ZR9FfMdJThyBMqREBDRRWTO1Q=="], + + "@noble/curves": ["@noble/curves@1.9.2", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GNxVh9VUOQ6S0aDp4Qe80MGadGbh8BS6p3jEHXIboRoTrb/80oR0csMjGUpdwGa2hX1zTvpPBwOFXvVP9UaB0Q=="], + + "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.2.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-/oxsG7eIkvw3rxt3V9gqY23i0ajk8m1cG/FedRj8b15GW2TgA+F9F6FQNLqxc/59SBkcrbTLoqk5EtAQwuwi/w=="], + + "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.2.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-LT/MF4DySLjskZf4mUgVXhpDBCuGXI7+uHJTiAjinddglh7ENbrSRuM01cjlJ/dxivvekq5+w6k9gdYpHUibuw=="], + + "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.2.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-0uTiUZJFS69LbYPCw963BAdP4wvUXEozbNf7vrB/3rT82x+fPZKF3C+4nfFScm+6UYusjH468vG7/g9x38jBIg=="], + + "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.2.18", "", { "os": "linux", "cpu": "none" }, "sha512-hk58uY6LSvDn2WDB8o/WAVCOZERYZPShUujI8rCwcDXkQRI4pbm5B5RJP5wEF0fClRI+WXxyyoBFsTKb7lbgyQ=="], + + "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.2.18", "", { "os": "linux", "cpu": "x64" }, "sha512-okHdy9+Yov5BvI19FynnvsmQUP477SNJRv33TIHxs9cpj/ClgaYXMihS+yH0LCzYDFIeojfABiIHdBVUFmxqtQ=="], + + "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.2.18", "", { "os": "linux", "cpu": "x64" }, "sha512-ERnR7gZz/YYpo/ZhRKXvY9qtsJNQnTrp5HayExfvD1achoHcYEvf3TarajRLVC7gDi7BxlaOPZyJjgdo5g0tUg=="], + + "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.2.18", "", { "os": "linux", "cpu": "x64" }, "sha512-Oqj8yDkObDWMlxzbhOefb+B75tgKEP4uGEFcBHXjVxSEL0lB7B7LYTvTpeDm8QPldhLs1xAN4FtzZlPUn6qI+Q=="], + + "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.2.18", "", { "os": "linux", "cpu": "x64" }, "sha512-u4sqExX5gdcMRdwzL16qP/xJlnxVR+fF43GGQJNopOTXDrsK33BXw3aUObHRtVkqRiK3cyubJUgTtz2ykQ4Dng=="], + + "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.2.18", "", { "os": "win32", "cpu": "x64" }, "sha512-jklsKWT9zfh8wXewKPfO7Uq8vo72esaQoGzCTTt0NKY+juXvyKaiMHEfT7v4o7cmrql3QPeVtsbp9uNAiuotgw=="], + + "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.2.18", "", { "os": "win32", "cpu": "x64" }, "sha512-n5XF3N0Kr53z4NnVWfTqS72U2rSHJlFafO70SOSzgiu26ylKTGOC9BBsvEQhKld4nKAsbp8YjpOViomrtC6bCQ=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.11", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew=="], + + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.7", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.9", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.5", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], + + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.5", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw=="], + + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-toggle": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.19", "", {}, "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.1", "", { "os": "android", "cpu": "arm" }, "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.1", "", { "os": "android", "cpu": "arm64" }, "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.1", "", { "os": "win32", "cpu": "x64" }, "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], + + "@tanstack/history": ["@tanstack/history@1.121.34", "", {}, "sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.127.9", "", { "dependencies": { "@tanstack/history": "1.121.34", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.127.8", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-/CKSrJV2sI0/fCSB7VsTl8YcT9bBTiQssIxmnPEkxfeaeVmkbtJ4OSeXs6y3iYAyPMpTuQ1K2BjyV2FjGqEFVw=="], + + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.127.9", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.127.8" }, "peerDependencies": { "@tanstack/react-router": "^1.127.9", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-Vw8Q1SsLwmQm6yhJvEgbzz2jlj183/vP4aM0cZ6nhp+q7wz67+cvvi64cVp2GwRltC0WJWvFsUDPmp+Bwmls2g=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.7.3", "", { "dependencies": { "@tanstack/store": "0.7.2", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q=="], + + "@tanstack/router-cli": ["@tanstack/router-cli@1.127.8", "", { "dependencies": { "@tanstack/router-generator": "1.127.8", "chokidar": "^3.6.0", "yargs": "^17.7.2" }, "bin": { "tsr": "bin/tsr.cjs" } }, "sha512-uanqjc3CvDy7+jDC/HC0m4b4LgY7FCSSb/VMKKPLY9slaFB4F8U15HH8S5b3yeOonKXIvuI34SoeMFeDQ1EAbQ=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.127.8", "", { "dependencies": { "@tanstack/history": "1.121.34", "@tanstack/store": "^0.7.0", "cookie-es": "^1.2.2", "seroval": "^1.3.2", "seroval-plugins": "^1.3.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-GYRmuvU9mcqu68GF56pNSE8TLGQ8jI0CsxuJXLwhwlawmnWGWeVo2L3g4ZOoK/lW6Mc5pr9OefkbEcyB/SFFNw=="], + + "@tanstack/router-devtools": ["@tanstack/router-devtools@1.127.9", "", { "dependencies": { "@tanstack/react-router-devtools": "^1.127.9", "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.127.9", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-+YPEixI2T32MhHi1AZeXurBD6i2M5GCfdPDA46D3+l+CM/W8KhQgSuJvDCnANr9lW5fDIBVIFsWZHxtDEn01eA=="], + + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.127.8", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/router-core": "^1.127.8", "csstype": "^3.0.10", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-8rRqZ5AiTVUMLFkmFX5pyYe4NyC7vr5NJvpMz2QLXvFH/dkK1WONxEqkjE0VJ3p+ZI8CAjzgu5+KaQ+QFBIQsA=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.127.8", "", { "dependencies": { "@tanstack/router-core": "^1.127.8", "@tanstack/router-utils": "1.121.21", "@tanstack/virtual-file-routes": "^1.121.21", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-46gXnlBUWR4/MUbfZoiO2YNwKlySVEC6IYPzC33qIh4suXsOP9ovAJVGLxXHLB+1FtwQs6NfIoDR0nGsP18dBg=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.127.9", "", { "dependencies": { "@babel/core": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/router-core": "^1.127.8", "@tanstack/router-generator": "1.127.8", "@tanstack/router-utils": "1.121.21", "@tanstack/virtual-file-routes": "^1.121.21", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.127.9", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-Cu2zJTVJCvwoukGnhJy4r02U30WmgiT/7cGhARzOzhlfd3QXVdgj3jYi1DFh4nNMHHlJQQEz7zA1/0cX990sGA=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.121.21", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.5", "@babel/preset-typescript": "^7.27.1", "ansis": "^4.1.0", "diff": "^8.0.2" } }, "sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A=="], + + "@tanstack/store": ["@tanstack/store@0.7.2", "", {}, "sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg=="], + + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.121.21", "", {}, "sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw=="], + + "@testing-library/dom": ["@testing-library/dom@10.4.0", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" } }, "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ=="], + + "@testing-library/jest-dom": ["@testing-library/jest-dom@6.6.3", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.21", "redent": "^3.0.0" } }, "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA=="], + + "@testing-library/react": ["@testing-library/react@16.3.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw=="], + + "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + + "@turf/along": ["@turf/along@7.2.0", "", { "dependencies": { "@turf/bearing": "^7.2.0", "@turf/destination": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw=="], + + "@turf/angle": ["@turf/angle@7.2.0", "", { "dependencies": { "@turf/bearing": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ=="], + + "@turf/area": ["@turf/area@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA=="], + + "@turf/bbox": ["@turf/bbox@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA=="], + + "@turf/bbox-clip": ["@turf/bbox-clip@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA=="], + + "@turf/bbox-polygon": ["@turf/bbox-polygon@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA=="], + + "@turf/bearing": ["@turf/bearing@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg=="], + + "@turf/bezier-spline": ["@turf/bezier-spline@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA=="], + + "@turf/boolean-clockwise": ["@turf/boolean-clockwise@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ=="], + + "@turf/boolean-concave": ["@turf/boolean-concave@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA=="], + + "@turf/boolean-contains": ["@turf/boolean-contains@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/boolean-point-on-line": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg=="], + + "@turf/boolean-crosses": ["@turf/boolean-crosses@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@turf/polygon-to-line": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA=="], + + "@turf/boolean-disjoint": ["@turf/boolean-disjoint@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/polygon-to-line": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ=="], + + "@turf/boolean-equal": ["@turf/boolean-equal@7.2.0", "", { "dependencies": { "@turf/clean-coords": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "geojson-equality-ts": "^1.0.2", "tslib": "^2.8.1" } }, "sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw=="], + + "@turf/boolean-intersects": ["@turf/boolean-intersects@7.2.0", "", { "dependencies": { "@turf/boolean-disjoint": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow=="], + + "@turf/boolean-overlap": ["@turf/boolean-overlap@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@turf/line-overlap": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "geojson-equality-ts": "^1.0.2", "tslib": "^2.8.1" } }, "sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw=="], + + "@turf/boolean-parallel": ["@turf/boolean-parallel@7.2.0", "", { "dependencies": { "@turf/clean-coords": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/line-segment": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w=="], + + "@turf/boolean-point-in-polygon": ["@turf/boolean-point-in-polygon@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "point-in-polygon-hao": "^1.1.0", "tslib": "^2.8.1" } }, "sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA=="], + + "@turf/boolean-point-on-line": ["@turf/boolean-point-on-line@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q=="], + + "@turf/boolean-touches": ["@turf/boolean-touches@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/boolean-point-on-line": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w=="], + + "@turf/boolean-valid": ["@turf/boolean-valid@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/boolean-crosses": "^7.2.0", "@turf/boolean-disjoint": "^7.2.0", "@turf/boolean-overlap": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/boolean-point-on-line": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@types/geojson": "^7946.0.10", "geojson-polygon-self-intersections": "^1.2.1", "tslib": "^2.8.1" } }, "sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA=="], + + "@turf/boolean-within": ["@turf/boolean-within@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/boolean-point-on-line": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g=="], + + "@turf/buffer": ["@turf/buffer@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/center": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/jsts": "^2.7.1", "@turf/meta": "^7.2.0", "@turf/projection": "^7.2.0", "@types/geojson": "^7946.0.10", "d3-geo": "1.7.1" } }, "sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q=="], + + "@turf/center": ["@turf/center@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw=="], + + "@turf/center-mean": ["@turf/center-mean@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A=="], + + "@turf/center-median": ["@turf/center-median@7.2.0", "", { "dependencies": { "@turf/center-mean": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A=="], + + "@turf/center-of-mass": ["@turf/center-of-mass@7.2.0", "", { "dependencies": { "@turf/centroid": "^7.2.0", "@turf/convex": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ=="], + + "@turf/centroid": ["@turf/centroid@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw=="], + + "@turf/circle": ["@turf/circle@7.2.0", "", { "dependencies": { "@turf/destination": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA=="], + + "@turf/clean-coords": ["@turf/clean-coords@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ=="], + + "@turf/clone": ["@turf/clone@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g=="], + + "@turf/clusters": ["@turf/clusters@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw=="], + + "@turf/clusters-dbscan": ["@turf/clusters-dbscan@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw=="], + + "@turf/clusters-kmeans": ["@turf/clusters-kmeans@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "skmeans": "0.9.7", "tslib": "^2.8.1" } }, "sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ=="], + + "@turf/collect": ["@turf/collect@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA=="], + + "@turf/combine": ["@turf/combine@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ=="], + + "@turf/concave": ["@turf/concave@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/tin": "^7.2.0", "@types/geojson": "^7946.0.10", "topojson-client": "3.x", "topojson-server": "3.x", "tslib": "^2.8.1" } }, "sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw=="], + + "@turf/convex": ["@turf/convex@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "concaveman": "^1.2.1", "tslib": "^2.8.1" } }, "sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA=="], + + "@turf/destination": ["@turf/destination@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ=="], + + "@turf/difference": ["@turf/difference@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA=="], + + "@turf/dissolve": ["@turf/dissolve@7.2.0", "", { "dependencies": { "@turf/flatten": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA=="], + + "@turf/distance": ["@turf/distance@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q=="], + + "@turf/distance-weight": ["@turf/distance-weight@7.2.0", "", { "dependencies": { "@turf/centroid": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg=="], + + "@turf/ellipse": ["@turf/ellipse@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/rhumb-destination": "^7.2.0", "@turf/transform-rotate": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g=="], + + "@turf/envelope": ["@turf/envelope@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/bbox-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA=="], + + "@turf/explode": ["@turf/explode@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A=="], + + "@turf/flatten": ["@turf/flatten@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA=="], + + "@turf/flip": ["@turf/flip@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ=="], + + "@turf/geojson-rbush": ["@turf/geojson-rbush@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1" } }, "sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw=="], + + "@turf/great-circle": ["@turf/great-circle@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw=="], + + "@turf/helpers": ["@turf/helpers@7.2.0", "", { "dependencies": { "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw=="], + + "@turf/hex-grid": ["@turf/hex-grid@7.2.0", "", { "dependencies": { "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/intersect": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA=="], + + "@turf/interpolate": ["@turf/interpolate@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/hex-grid": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/point-grid": "^7.2.0", "@turf/square-grid": "^7.2.0", "@turf/triangle-grid": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA=="], + + "@turf/intersect": ["@turf/intersect@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw=="], + + "@turf/invariant": ["@turf/invariant@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q=="], + + "@turf/isobands": ["@turf/isobands@7.2.0", "", { "dependencies": { "@turf/area": "^7.2.0", "@turf/bbox": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/explode": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "marchingsquares": "^1.3.3", "tslib": "^2.8.1" } }, "sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg=="], + + "@turf/isolines": ["@turf/isolines@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "marchingsquares": "^1.3.3", "tslib": "^2.8.1" } }, "sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg=="], + + "@turf/jsts": ["@turf/jsts@2.7.2", "", { "dependencies": { "jsts": "2.7.1" } }, "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg=="], + + "@turf/kinks": ["@turf/kinks@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA=="], + + "@turf/length": ["@turf/length@7.2.0", "", { "dependencies": { "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig=="], + + "@turf/line-arc": ["@turf/line-arc@7.2.0", "", { "dependencies": { "@turf/circle": "^7.2.0", "@turf/destination": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw=="], + + "@turf/line-chunk": ["@turf/line-chunk@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/length": "^7.2.0", "@turf/line-slice-along": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g=="], + + "@turf/line-intersect": ["@turf/line-intersect@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "sweepline-intersections": "^1.5.0", "tslib": "^2.8.1" } }, "sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA=="], + + "@turf/line-offset": ["@turf/line-offset@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw=="], + + "@turf/line-overlap": ["@turf/line-overlap@7.2.0", "", { "dependencies": { "@turf/boolean-point-on-line": "^7.2.0", "@turf/geojson-rbush": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-segment": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/nearest-point-on-line": "^7.2.0", "@types/geojson": "^7946.0.10", "fast-deep-equal": "^3.1.3", "tslib": "^2.8.1" } }, "sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw=="], + + "@turf/line-segment": ["@turf/line-segment@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA=="], + + "@turf/line-slice": ["@turf/line-slice@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/nearest-point-on-line": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ=="], + + "@turf/line-slice-along": ["@turf/line-slice-along@7.2.0", "", { "dependencies": { "@turf/bearing": "^7.2.0", "@turf/destination": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A=="], + + "@turf/line-split": ["@turf/line-split@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/geojson-rbush": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@turf/line-segment": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/nearest-point-on-line": "^7.2.0", "@turf/square": "^7.2.0", "@turf/truncate": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ=="], + + "@turf/line-to-polygon": ["@turf/line-to-polygon@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA=="], + + "@turf/mask": ["@turf/mask@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA=="], + + "@turf/meta": ["@turf/meta@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10" } }, "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw=="], + + "@turf/midpoint": ["@turf/midpoint@7.2.0", "", { "dependencies": { "@turf/bearing": "^7.2.0", "@turf/destination": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw=="], + + "@turf/moran-index": ["@turf/moran-index@7.2.0", "", { "dependencies": { "@turf/distance-weight": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA=="], + + "@turf/nearest-neighbor-analysis": ["@turf/nearest-neighbor-analysis@7.2.0", "", { "dependencies": { "@turf/area": "^7.2.0", "@turf/bbox": "^7.2.0", "@turf/bbox-polygon": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/nearest-point": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA=="], + + "@turf/nearest-point": ["@turf/nearest-point@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q=="], + + "@turf/nearest-point-on-line": ["@turf/nearest-point-on-line@7.2.0", "", { "dependencies": { "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA=="], + + "@turf/nearest-point-to-line": ["@turf/nearest-point-to-line@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/point-to-line-distance": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw=="], + + "@turf/planepoint": ["@turf/planepoint@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g=="], + + "@turf/point-grid": ["@turf/point-grid@7.2.0", "", { "dependencies": { "@turf/boolean-within": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q=="], + + "@turf/point-on-feature": ["@turf/point-on-feature@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/center": "^7.2.0", "@turf/explode": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/nearest-point": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q=="], + + "@turf/point-to-line-distance": ["@turf/point-to-line-distance@7.2.0", "", { "dependencies": { "@turf/bearing": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/nearest-point-on-line": "^7.2.0", "@turf/projection": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@turf/rhumb-distance": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg=="], + + "@turf/point-to-polygon-distance": ["@turf/point-to-polygon-distance@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/point-to-line-distance": "^7.2.0", "@turf/polygon-to-line": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA=="], + + "@turf/points-within-polygon": ["@turf/points-within-polygon@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w=="], + + "@turf/polygon-smooth": ["@turf/polygon-smooth@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg=="], + + "@turf/polygon-tangents": ["@turf/polygon-tangents@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/boolean-within": "^7.2.0", "@turf/explode": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/nearest-point": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g=="], + + "@turf/polygon-to-line": ["@turf/polygon-to-line@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA=="], + + "@turf/polygonize": ["@turf/polygonize@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/envelope": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng=="], + + "@turf/projection": ["@turf/projection@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ=="], + + "@turf/quadrat-analysis": ["@turf/quadrat-analysis@7.2.0", "", { "dependencies": { "@turf/area": "^7.2.0", "@turf/bbox": "^7.2.0", "@turf/bbox-polygon": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/point-grid": "^7.2.0", "@turf/random": "^7.2.0", "@turf/square-grid": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w=="], + + "@turf/random": ["@turf/random@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w=="], + + "@turf/rectangle-grid": ["@turf/rectangle-grid@7.2.0", "", { "dependencies": { "@turf/boolean-intersects": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A=="], + + "@turf/rewind": ["@turf/rewind@7.2.0", "", { "dependencies": { "@turf/boolean-clockwise": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA=="], + + "@turf/rhumb-bearing": ["@turf/rhumb-bearing@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug=="], + + "@turf/rhumb-destination": ["@turf/rhumb-destination@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ=="], + + "@turf/rhumb-distance": ["@turf/rhumb-distance@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw=="], + + "@turf/sample": ["@turf/sample@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA=="], + + "@turf/sector": ["@turf/sector@7.2.0", "", { "dependencies": { "@turf/circle": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/line-arc": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w=="], + + "@turf/shortest-path": ["@turf/shortest-path@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/bbox-polygon": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/clean-coords": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/transform-scale": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA=="], + + "@turf/simplify": ["@turf/simplify@7.2.0", "", { "dependencies": { "@turf/clean-coords": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ=="], + + "@turf/square": ["@turf/square@7.2.0", "", { "dependencies": { "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA=="], + + "@turf/square-grid": ["@turf/square-grid@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/rectangle-grid": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA=="], + + "@turf/standard-deviational-ellipse": ["@turf/standard-deviational-ellipse@7.2.0", "", { "dependencies": { "@turf/center-mean": "^7.2.0", "@turf/ellipse": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/points-within-polygon": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w=="], + + "@turf/tag": ["@turf/tag@7.2.0", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA=="], + + "@turf/tesselate": ["@turf/tesselate@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "earcut": "^2.2.4", "tslib": "^2.8.1" } }, "sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q=="], + + "@turf/tin": ["@turf/tin@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg=="], + + "@turf/transform-rotate": ["@turf/transform-rotate@7.2.0", "", { "dependencies": { "@turf/centroid": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@turf/rhumb-destination": "^7.2.0", "@turf/rhumb-distance": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw=="], + + "@turf/transform-scale": ["@turf/transform-scale@7.2.0", "", { "dependencies": { "@turf/bbox": "^7.2.0", "@turf/center": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@turf/rhumb-destination": "^7.2.0", "@turf/rhumb-distance": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A=="], + + "@turf/transform-translate": ["@turf/transform-translate@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/rhumb-destination": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug=="], + + "@turf/triangle-grid": ["@turf/triangle-grid@7.2.0", "", { "dependencies": { "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/intersect": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw=="], + + "@turf/truncate": ["@turf/truncate@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg=="], + + "@turf/turf": ["@turf/turf@7.2.0", "", { "dependencies": { "@turf/along": "^7.2.0", "@turf/angle": "^7.2.0", "@turf/area": "^7.2.0", "@turf/bbox": "^7.2.0", "@turf/bbox-clip": "^7.2.0", "@turf/bbox-polygon": "^7.2.0", "@turf/bearing": "^7.2.0", "@turf/bezier-spline": "^7.2.0", "@turf/boolean-clockwise": "^7.2.0", "@turf/boolean-concave": "^7.2.0", "@turf/boolean-contains": "^7.2.0", "@turf/boolean-crosses": "^7.2.0", "@turf/boolean-disjoint": "^7.2.0", "@turf/boolean-equal": "^7.2.0", "@turf/boolean-intersects": "^7.2.0", "@turf/boolean-overlap": "^7.2.0", "@turf/boolean-parallel": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/boolean-point-on-line": "^7.2.0", "@turf/boolean-touches": "^7.2.0", "@turf/boolean-valid": "^7.2.0", "@turf/boolean-within": "^7.2.0", "@turf/buffer": "^7.2.0", "@turf/center": "^7.2.0", "@turf/center-mean": "^7.2.0", "@turf/center-median": "^7.2.0", "@turf/center-of-mass": "^7.2.0", "@turf/centroid": "^7.2.0", "@turf/circle": "^7.2.0", "@turf/clean-coords": "^7.2.0", "@turf/clone": "^7.2.0", "@turf/clusters": "^7.2.0", "@turf/clusters-dbscan": "^7.2.0", "@turf/clusters-kmeans": "^7.2.0", "@turf/collect": "^7.2.0", "@turf/combine": "^7.2.0", "@turf/concave": "^7.2.0", "@turf/convex": "^7.2.0", "@turf/destination": "^7.2.0", "@turf/difference": "^7.2.0", "@turf/dissolve": "^7.2.0", "@turf/distance": "^7.2.0", "@turf/distance-weight": "^7.2.0", "@turf/ellipse": "^7.2.0", "@turf/envelope": "^7.2.0", "@turf/explode": "^7.2.0", "@turf/flatten": "^7.2.0", "@turf/flip": "^7.2.0", "@turf/geojson-rbush": "^7.2.0", "@turf/great-circle": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/hex-grid": "^7.2.0", "@turf/interpolate": "^7.2.0", "@turf/intersect": "^7.2.0", "@turf/invariant": "^7.2.0", "@turf/isobands": "^7.2.0", "@turf/isolines": "^7.2.0", "@turf/kinks": "^7.2.0", "@turf/length": "^7.2.0", "@turf/line-arc": "^7.2.0", "@turf/line-chunk": "^7.2.0", "@turf/line-intersect": "^7.2.0", "@turf/line-offset": "^7.2.0", "@turf/line-overlap": "^7.2.0", "@turf/line-segment": "^7.2.0", "@turf/line-slice": "^7.2.0", "@turf/line-slice-along": "^7.2.0", "@turf/line-split": "^7.2.0", "@turf/line-to-polygon": "^7.2.0", "@turf/mask": "^7.2.0", "@turf/meta": "^7.2.0", "@turf/midpoint": "^7.2.0", "@turf/moran-index": "^7.2.0", "@turf/nearest-neighbor-analysis": "^7.2.0", "@turf/nearest-point": "^7.2.0", "@turf/nearest-point-on-line": "^7.2.0", "@turf/nearest-point-to-line": "^7.2.0", "@turf/planepoint": "^7.2.0", "@turf/point-grid": "^7.2.0", "@turf/point-on-feature": "^7.2.0", "@turf/point-to-line-distance": "^7.2.0", "@turf/point-to-polygon-distance": "^7.2.0", "@turf/points-within-polygon": "^7.2.0", "@turf/polygon-smooth": "^7.2.0", "@turf/polygon-tangents": "^7.2.0", "@turf/polygon-to-line": "^7.2.0", "@turf/polygonize": "^7.2.0", "@turf/projection": "^7.2.0", "@turf/quadrat-analysis": "^7.2.0", "@turf/random": "^7.2.0", "@turf/rectangle-grid": "^7.2.0", "@turf/rewind": "^7.2.0", "@turf/rhumb-bearing": "^7.2.0", "@turf/rhumb-destination": "^7.2.0", "@turf/rhumb-distance": "^7.2.0", "@turf/sample": "^7.2.0", "@turf/sector": "^7.2.0", "@turf/shortest-path": "^7.2.0", "@turf/simplify": "^7.2.0", "@turf/square": "^7.2.0", "@turf/square-grid": "^7.2.0", "@turf/standard-deviational-ellipse": "^7.2.0", "@turf/tag": "^7.2.0", "@turf/tesselate": "^7.2.0", "@turf/tin": "^7.2.0", "@turf/transform-rotate": "^7.2.0", "@turf/transform-scale": "^7.2.0", "@turf/transform-translate": "^7.2.0", "@turf/triangle-grid": "^7.2.0", "@turf/truncate": "^7.2.0", "@turf/union": "^7.2.0", "@turf/unkink-polygon": "^7.2.0", "@turf/voronoi": "^7.2.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw=="], + + "@turf/union": ["@turf/union@7.2.0", "", { "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g=="], + + "@turf/unkink-polygon": ["@turf/unkink-polygon@7.2.0", "", { "dependencies": { "@turf/area": "^7.2.0", "@turf/boolean-point-in-polygon": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ=="], + + "@turf/voronoi": ["@turf/voronoi@7.2.0", "", { "dependencies": { "@turf/clone": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/invariant": "^7.2.0", "@types/d3-voronoi": "^1.1.12", "@types/geojson": "^7946.0.10", "d3-voronoi": "1.1.2", "tslib": "^2.8.1" } }, "sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw=="], + + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + + "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + + "@types/chrome": ["@types/chrome@0.1.0", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-Mq712O2Ykw+EVAC5D1wt4Ot4v2rfp7nDosmxhIMKULJAa8o7ELeO88rWzRasaB+AYnqayzfX/XSWaDKBfk1rYQ=="], + + "@types/d3-voronoi": ["@types/d3-voronoi@1.1.12", "", {}, "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], + + "@types/filewriter": ["@types/filewriter@0.0.33", "", {}, "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/geojson-vt": ["@types/geojson-vt@3.2.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g=="], + + "@types/har-format": ["@types/har-format@1.2.16", "", {}, "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A=="], + + "@types/js-cookie": ["@types/js-cookie@3.0.6", "", {}, "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ=="], + + "@types/mapbox__point-geometry": ["@types/mapbox__point-geometry@0.1.4", "", {}, "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="], + + "@types/mapbox__vector-tile": ["@types/mapbox__vector-tile@1.3.4", "", { "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", "@types/pbf": "*" } }, "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg=="], + + "@types/node": ["@types/node@24.0.14", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw=="], + + "@types/pbf": ["@types/pbf@3.0.5", "", {}, "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="], + + "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], + + "@types/react-dom": ["@types/react-dom@19.1.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="], + + "@types/serviceworker": ["@types/serviceworker@0.0.142", "", {}, "sha512-OdziWMTLuM+orvUfsA66/5PDS6Q/EQrhhS/48F5UB9bZuNvvVcifgiu+uhJtrxM1HUb7jndVaVlG3emCCHTuSw=="], + + "@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="], + + "@types/w3c-web-serial": ["@types/w3c-web-serial@1.0.8", "", {}, "sha512-QQOT+bxQJhRGXoZDZGLs3ksLud1dMNnMiSQtBA0w8KXvLpXX4oM4TZb6J0GgJ8UbCaHo5s9/4VQT8uXy9JER2A=="], + + "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], + + "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], + + "@vis.gl/react-mapbox": ["@vis.gl/react-mapbox@8.0.4", "", { "peerDependencies": { "mapbox-gl": ">=3.5.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["mapbox-gl"] }, "sha512-NFk0vsWcNzSs0YCsVdt2100Zli9QWR+pje8DacpLkkGEAXFaJsFtI1oKD0Hatiate4/iAIW39SQHhgfhbeEPfQ=="], + + "@vis.gl/react-maplibre": ["@vis.gl/react-maplibre@8.0.4", "", { "dependencies": { "@maplibre/maplibre-gl-style-spec": "^19.2.1" }, "peerDependencies": { "maplibre-gl": ">=4.0.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["maplibre-gl"] }, "sha512-HwZyfLjEu+y1mUFvwDAkVxinGm8fEegaWN+O8np/WZ2Sqe5Lv6OXFpV6GWz9LOEvBYMbGuGk1FQdejo+4HCJ5w=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.6.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ=="], + + "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@4.1.0", "", {}, "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "arr-union": ["arr-union@3.1.0", "", {}, "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "assign-symbols": ["assign-symbols@1.0.0", "", {}, "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="], + + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bun": ["bun@1.2.18", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.18", "@oven/bun-darwin-x64": "1.2.18", "@oven/bun-darwin-x64-baseline": "1.2.18", "@oven/bun-linux-aarch64": "1.2.18", "@oven/bun-linux-aarch64-musl": "1.2.18", "@oven/bun-linux-x64": "1.2.18", "@oven/bun-linux-x64-baseline": "1.2.18", "@oven/bun-linux-x64-musl": "1.2.18", "@oven/bun-linux-x64-musl-baseline": "1.2.18", "@oven/bun-windows-x64": "1.2.18", "@oven/bun-windows-x64-baseline": "1.2.18" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-OR+EpNckoJN4tHMVZPaTPxDj2RgpJgJwLruTIFYbO3bQMguLd0YrmkWKYqsiihcLgm2ehIjF/H1RLfZiRa7+qQ=="], + + "bytewise": ["bytewise@1.1.0", "", { "dependencies": { "bytewise-core": "^1.2.2", "typewise": "^1.0.3" } }, "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ=="], + + "bytewise-core": ["bytewise-core@1.2.3", "", { "dependencies": { "typewise-core": "^1.2" } }, "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001727", "", {}, "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q=="], + + "chai": ["chai@5.2.1", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A=="], + + "chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + + "chokidar": ["chokidar@3.6.0", "", { "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" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "concaveman": ["concaveman@1.2.1", "", { "dependencies": { "point-in-polygon": "^1.1.0", "rbush": "^3.0.1", "robust-predicates": "^2.0.4", "tinyqueue": "^2.0.3" } }, "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc": ["crc@4.3.2", "", { "peerDependencies": { "buffer": ">=6.0.3" }, "optionalPeers": ["buffer"] }, "sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A=="], + + "cross-fetch": ["cross-fetch@4.0.0", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g=="], + + "crypto-random-string": ["crypto-random-string@5.0.0", "", { "dependencies": { "type-fest": "^2.12.2" } }, "sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ=="], + + "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "d3-array": ["d3-array@1.2.4", "", {}, "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="], + + "d3-geo": ["d3-geo@1.7.1", "", { "dependencies": { "d3-array": "1" } }, "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw=="], + + "d3-voronoi": ["d3-voronoi@1.1.2", "", {}, "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + + "duplex-maker": ["duplex-maker@1.0.0", "", {}, "sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA=="], + + "duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="], + + "earcut": ["earcut@3.0.1", "", {}, "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.183", "", {}, "sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "esbuild": ["esbuild@0.25.6", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.6", "@esbuild/android-arm": "0.25.6", "@esbuild/android-arm64": "0.25.6", "@esbuild/android-x64": "0.25.6", "@esbuild/darwin-arm64": "0.25.6", "@esbuild/darwin-x64": "0.25.6", "@esbuild/freebsd-arm64": "0.25.6", "@esbuild/freebsd-x64": "0.25.6", "@esbuild/linux-arm": "0.25.6", "@esbuild/linux-arm64": "0.25.6", "@esbuild/linux-ia32": "0.25.6", "@esbuild/linux-loong64": "0.25.6", "@esbuild/linux-mips64el": "0.25.6", "@esbuild/linux-ppc64": "0.25.6", "@esbuild/linux-riscv64": "0.25.6", "@esbuild/linux-s390x": "0.25.6", "@esbuild/linux-x64": "0.25.6", "@esbuild/netbsd-arm64": "0.25.6", "@esbuild/netbsd-x64": "0.25.6", "@esbuild/openbsd-arm64": "0.25.6", "@esbuild/openbsd-x64": "0.25.6", "@esbuild/openharmony-arm64": "0.25.6", "@esbuild/sunos-x64": "0.25.6", "@esbuild/win32-arm64": "0.25.6", "@esbuild/win32-ia32": "0.25.6", "@esbuild/win32-x64": "0.25.6" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "geojson-equality-ts": ["geojson-equality-ts@1.0.2", "", { "dependencies": { "@types/geojson": "^7946.0.14" } }, "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ=="], + + "geojson-polygon-self-intersections": ["geojson-polygon-self-intersections@1.2.1", "", { "dependencies": { "rbush": "^2.0.1" } }, "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA=="], + + "geojson-vt": ["geojson-vt@4.0.2", "", {}, "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "get-value": ["get-value@2.0.6", "", {}, "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="], + + "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "global-prefix": ["global-prefix@4.0.0", "", { "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", "which": "^4.0.0" } }, "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA=="], + + "goober": ["goober@2.1.16", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gzipper": ["gzipper@8.2.1", "", { "dependencies": { "@gfx/zopfli": "^1.0.15", "commander": "^12.1.0", "simple-zstd": "^1.4.2" }, "bin": { "gzipper": "bin/index.js" } }, "sha512-Vp2vDpwU4xKtWxTaLPfNTR4euqHJamB6aKCfSEbSd/CrgqihwNxrjihJcWJG1+3Ku1ROsfF6fPXRoytTFLhFlw=="], + + "happy-dom": ["happy-dom@18.0.1", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + + "i18next": ["i18next@25.3.2", "", { "dependencies": { "@babel/runtime": "^7.27.6" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA=="], + + "i18next-browser-languagedetector": ["i18next-browser-languagedetector@8.2.0", "", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g=="], + + "i18next-http-backend": ["i18next-http-backend@3.0.2", "", { "dependencies": { "cross-fetch": "4.0.0" } }, "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g=="], + + "idb-keyval": ["idb-keyval@6.2.2", "", {}, "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "immer": ["immer@10.1.1", "", {}, "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-zst": ["is-zst@1.0.0", "", {}, "sha512-ZA5lvshKAl8z30dX7saXLpVhpsq3d2EHK9uf7qtUjnOtdw4XBpAoWb2RvZ5kyoaebdoidnGI0g2hn9Z7ObPbww=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isbot": ["isbot@5.1.28", "", {}, "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw=="], + + "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-cookie": ["js-cookie@3.0.5", "", {}, "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-stringify-pretty-compact": ["json-stringify-pretty-compact@4.0.0", "", {}, "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsts": ["jsts@2.7.1", "", {}, "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg=="], + + "kdbush": ["kdbush@4.0.2", "", {}, "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.isequal": ["lodash.isequal@4.5.0", "", {}, "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="], + + "loupe": ["loupe@3.1.4", "", {}, "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.525.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ=="], + + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "maplibre-gl": ["maplibre-gl@5.6.1", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^2.0.6", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^23.3.0", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.1", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "global-prefix": "^4.0.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.3.0", "potpack": "^2.0.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0", "vt-pbf": "^3.1.3" } }, "sha512-TTSfoTaF7RqKUR9wR5qDxCHH2J1XfZ1E85luiLOx0h8r50T/LnwAwwfV0WVNh9o8dA7rwt57Ucivf1emyeukXg=="], + + "marchingsquares": ["marchingsquares@1.3.3", "", {}, "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg=="], + + "meshtastic-web": ["meshtastic-web@workspace:packages/web"], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], + + "pbf": ["pbf@3.3.0", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q=="], + + "peek-stream": ["peek-stream@1.1.3", "", { "dependencies": { "buffer-from": "^1.0.0", "duplexify": "^3.5.0", "through2": "^2.0.3" } }, "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "point-in-polygon": ["point-in-polygon@1.1.0", "", {}, "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw=="], + + "point-in-polygon-hao": ["point-in-polygon-hao@1.2.4", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ=="], + + "polyclip-ts": ["polyclip-ts@0.16.8", "", { "dependencies": { "bignumber.js": "^9.1.0", "splaytree-ts": "^1.0.2" } }, "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "potpack": ["potpack@2.1.0", "", {}, "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "process-streams": ["process-streams@1.0.3", "", { "dependencies": { "duplex-maker": "^1.0.0" } }, "sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA=="], + + "protocol-buffers-schema": ["protocol-buffers-schema@3.6.0", "", {}, "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="], + + "qrcode-generator": ["qrcode-generator@1.5.2", "", {}, "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw=="], + + "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], + + "rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + + "react-error-boundary": ["react-error-boundary@6.0.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA=="], + + "react-hook-form": ["react-hook-form@7.60.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A=="], + + "react-i18next": ["react-i18next@15.6.0", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { "i18next": ">= 23.2.3", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-W135dB0rDfiFmbMipC17nOhGdttO5mzH8BivY+2ybsQBbXvxWIwl3cmeH3T9d+YPBSJu/ouyJKFJTtkK7rJofw=="], + + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "react-map-gl": ["react-map-gl@8.0.4", "", { "dependencies": { "@vis.gl/react-mapbox": "8.0.4", "@vis.gl/react-maplibre": "8.0.4" }, "peerDependencies": { "mapbox-gl": ">=1.13.0", "maplibre-gl": ">=1.13.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["mapbox-gl", "maplibre-gl"] }, "sha512-SHdpvFIvswsZBg6BCPcwY/nbKuCo3sJM1Cj7Sd+gA3gFRFOixD+KtZ2XSuUWq2WySL2emYEXEgrLZoXsV4Ut4Q=="], + + "react-qrcode-logo": ["react-qrcode-logo@3.0.0", "", { "dependencies": { "lodash.isequal": "^4.5.0", "qrcode-generator": "^1.4.4" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-2+vZ3GNBdUpYxIKyt6SFZsDGXa0xniyUQ0wPI4O0hJTzRjttPIx1pPnH9IWQmp/4nDMoN47IBhi3Breu1KudYw=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.1", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + + "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="], + + "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], + + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "rollup": ["rollup@4.45.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.1", "@rollup/rollup-android-arm64": "4.45.1", "@rollup/rollup-darwin-arm64": "4.45.1", "@rollup/rollup-darwin-x64": "4.45.1", "@rollup/rollup-freebsd-arm64": "4.45.1", "@rollup/rollup-freebsd-x64": "4.45.1", "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", "@rollup/rollup-linux-arm-musleabihf": "4.45.1", "@rollup/rollup-linux-arm64-gnu": "4.45.1", "@rollup/rollup-linux-arm64-musl": "4.45.1", "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-musl": "4.45.1", "@rollup/rollup-linux-s390x-gnu": "4.45.1", "@rollup/rollup-linux-x64-gnu": "4.45.1", "@rollup/rollup-linux-x64-musl": "4.45.1", "@rollup/rollup-win32-arm64-msvc": "4.45.1", "@rollup/rollup-win32-ia32-msvc": "4.45.1", "@rollup/rollup-win32-x64-msvc": "4.45.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "seroval": ["seroval@1.3.2", "", {}, "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ=="], + + "seroval-plugins": ["seroval-plugins@1.3.2", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ=="], + + "set-value": ["set-value@2.0.1", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "simple-git-hooks": ["simple-git-hooks@2.13.0", "", { "bin": { "simple-git-hooks": "cli.js" } }, "sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA=="], + + "simple-zstd": ["simple-zstd@1.4.2", "", { "dependencies": { "is-zst": "^1.0.0", "peek-stream": "^1.1.3", "process-streams": "^1.0.1", "through2": "^4.0.2" } }, "sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A=="], + + "skmeans": ["skmeans@0.9.7", "", {}, "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg=="], + + "solid-js": ["solid-js@1.9.7", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw=="], + + "sort-asc": ["sort-asc@0.2.0", "", {}, "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA=="], + + "sort-desc": ["sort-desc@0.2.0", "", {}, "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w=="], + + "sort-object": ["sort-object@3.0.3", "", { "dependencies": { "bytewise": "^1.1.0", "get-value": "^2.0.2", "is-extendable": "^0.1.1", "sort-asc": "^0.2.0", "sort-desc": "^0.2.0", "union-value": "^1.0.1" } }, "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "splaytree-ts": ["splaytree-ts@1.0.2", "", {}, "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA=="], + + "split-string": ["split-string@3.1.0", "", { "dependencies": { "extend-shallow": "^3.0.0" } }, "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "ste-core": ["ste-core@3.0.11", "", {}, "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg=="], + + "ste-simple-events": ["ste-simple-events@3.0.11", "", { "dependencies": { "ste-core": "^3.0.11" } }, "sha512-PDoQajqiTtJLNDWfJCihzACiTVZyFsXi6hNAVNelNJoNmqj+BaWuhJ/NHaAHxzfSRoMbL+hFgfPqFmxiHhAQSQ=="], + + "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + + "supercluster": ["supercluster@8.0.1", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "sweepline-intersections": ["sweepline-intersections@1.5.0", "", { "dependencies": { "tinyqueue": "^2.0.0" } }, "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ=="], + + "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], + + "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "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" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "testing-library": ["testing-library@0.0.2", "", { "dependencies": { "tslib": "^1.9.0" }, "peerDependencies": { "@angular/common": "^6.0.0-rc.0 || ^6.0.0", "@angular/core": "^6.0.0-rc.0 || ^6.0.0" } }, "sha512-KCbqCCllbgiCXOgmh9MdsgdJ05pmimXGuggtC78pzpxpq/40A3bS+NJoqwCIqZbNnMr6KIZ2mlMZoZCkWVnaWw=="], + + "through2": ["through2@4.0.2", "", { "dependencies": { "readable-stream": "3" } }, "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="], + + "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "topojson-client": ["topojson-client@3.1.0", "", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="], + + "topojson-server": ["topojson-server@3.0.1", "", { "dependencies": { "commander": "2" }, "bin": { "geo2topo": "bin/geo2topo" } }, "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tslog": ["tslog@4.9.3", "", {}, "sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw=="], + + "tsx": ["tsx@4.20.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typewise": ["typewise@1.0.3", "", { "dependencies": { "typewise-core": "^1.2.0" } }, "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ=="], + + "typewise-core": ["typewise-core@1.2.0", "", {}, "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "union-value": ["union-value@1.0.1", "", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="], + + "unplugin": ["unplugin@2.3.5", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vite": ["vite@7.0.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA=="], + + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "vt-pbf": ["vt-pbf@3.1.3", "", { "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", "pbf": "^3.2.1" } }, "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "zod": ["zod@4.0.5", "", {}, "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA=="], + + "zone.js": ["zone.js@0.8.29", "", {}, "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ=="], + + "zustand": ["zustand@5.0.6", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.4", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.4", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@tanstack/router-plugin/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + + "@testing-library/dom/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + + "@turf/along/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/angle/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/area/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/bbox/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/bbox-clip/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/bbox-polygon/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/bearing/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/bezier-spline/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-clockwise/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-concave/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-contains/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-crosses/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-disjoint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-equal/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-intersects/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-overlap/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-parallel/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-point-in-polygon/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-point-on-line/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-touches/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-valid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/boolean-within/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/center/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/center-mean/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/center-median/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/center-of-mass/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/centroid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/circle/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/clean-coords/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/clone/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/clusters/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/clusters-dbscan/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/clusters-kmeans/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/collect/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/combine/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/concave/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/convex/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/destination/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/difference/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/dissolve/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/distance/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/distance-weight/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/ellipse/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/envelope/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/explode/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/flatten/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/flip/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/hex-grid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/intersect/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/invariant/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/isobands/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/isolines/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/kinks/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/length/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/line-arc/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/line-intersect/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/line-overlap/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/line-segment/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/line-to-polygon/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/mask/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/midpoint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/moran-index/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/nearest-neighbor-analysis/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/nearest-point/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/nearest-point-on-line/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/nearest-point-to-line/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/planepoint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/point-grid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/point-on-feature/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/point-to-line-distance/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/point-to-polygon-distance/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/points-within-polygon/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/polygon-smooth/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/polygon-tangents/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/polygon-to-line/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/polygonize/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/projection/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/quadrat-analysis/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/random/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/rectangle-grid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/rewind/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/rhumb-bearing/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/rhumb-destination/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/rhumb-distance/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/sample/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/sector/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/shortest-path/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/simplify/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/square/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/square-grid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/standard-deviational-ellipse/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/tag/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/tesselate/earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="], + + "@turf/tesselate/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/tin/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/transform-rotate/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/transform-scale/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/transform-translate/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/triangle-grid/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/truncate/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/turf/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/union/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/unkink-polygon/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@turf/voronoi/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@vis.gl/react-maplibre/@maplibre/maplibre-gl-style-spec": ["@maplibre/maplibre-gl-style-spec@19.3.3", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^3.0.0", "minimist": "^1.2.8", "rw": "^1.3.3", "sort-object": "^3.0.3" }, "bin": { "gl-style-format": "dist/gl-style-format.mjs", "gl-style-migrate": "dist/gl-style-migrate.mjs", "gl-style-validate": "dist/gl-style-validate.mjs" } }, "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "aria-hidden/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "ast-types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "concaveman/robust-predicates": ["robust-predicates@2.0.4", "", {}, "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg=="], + + "concaveman/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "duplexify/readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "geojson-polygon-self-intersections/rbush": ["rbush@2.0.2", "", { "dependencies": { "quickselect": "^1.0.1" } }, "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA=="], + + "happy-dom/@types/node": ["@types/node@20.19.8", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-HzbgCY53T6bfu4tT7Aq3TvViJyHjLjPNaAS3HOuMc9pw97KHsUtXNX4L+wu59g1WnjsZSko35MbEqnO58rihhw=="], + + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "meshtastic-web/@biomejs/biome": ["@biomejs/biome@2.0.6", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.6", "@biomejs/cli-darwin-x64": "2.0.6", "@biomejs/cli-linux-arm64": "2.0.6", "@biomejs/cli-linux-arm64-musl": "2.0.6", "@biomejs/cli-linux-x64": "2.0.6", "@biomejs/cli-linux-x64-musl": "2.0.6", "@biomejs/cli-win32-arm64": "2.0.6", "@biomejs/cli-win32-x64": "2.0.6" }, "bin": { "biome": "bin/biome" } }, "sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA=="], + + "peek-stream/through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "rbush/quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + + "react-remove-scroll/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "react-remove-scroll-bar/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "react-style-singleton/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "recast/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "split-string/extend-shallow": ["extend-shallow@3.0.2", "", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "sweepline-intersections/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "topojson-client/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "topojson-server/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "use-callback-ref/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "use-sidecar/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + + "@vis.gl/react-maplibre/@maplibre/maplibre-gl-style-spec/json-stringify-pretty-compact": ["json-stringify-pretty-compact@3.0.0", "", {}, "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA=="], + + "duplexify/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "geojson-polygon-self-intersections/rbush/quickselect": ["quickselect@1.1.1", "", {}, "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="], + + "happy-dom/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.6", "", { "os": "linux", "cpu": "x64" }, "sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.6", "", { "os": "linux", "cpu": "x64" }, "sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA=="], + + "meshtastic-web/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.6", "", { "os": "win32", "cpu": "x64" }, "sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw=="], + + "peek-stream/through2/readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "split-string/extend-shallow/is-extendable": ["is-extendable@1.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="], + + "peek-stream/through2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + } +} diff --git a/deno.json b/deno.json deleted file mode 100644 index 71604d00..00000000 --- a/deno.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "workspace": [ - "./packages/web", - "./packages/core", - "./packages/transport-deno", - "./packages/transport-node", - "./packages/transport-http", - "./packages/transport-web-bluetooth", - "./packages/transport-web-serial" - ], - "tasks": { - "build:npm": "deno run -A scripts/build_npm_package.ts" - }, - "imports": { - "@bufbuild/protobuf": "npm:@bufbuild/protobuf@^2.2.3", - "@deno/dnt": "jsr:@deno/dnt@^0.42.1", - "@meshtastic/protobufs": "jsr:@meshtastic/protobufs@^2.7.0", - "@types/node": "npm:@types/node@^22.13.10", - "ste-simple-events": "npm:ste-simple-events@^3.0.11", - "tslog": "npm:tslog@^4.9.3" - }, - "nodeModulesDir": "auto", - "lint": { - "exclude": [ - "*routeTree.gen.ts", - "*.test.ts", - "*.test.tsx" - ], - "report": "pretty" - }, - "fmt": { - "exclude": [ - "*routeTree.gen.ts", - "*.test.ts", - "*.test.tsx" - ] - }, - "unstable": [ - "sloppy-imports" - ], - "exclude": [ - "node_modules", - "dist", - "npm", - "build", - "coverage", - "out", - ".vscode-test" - ] -} diff --git a/deno.lock b/deno.lock deleted file mode 100644 index 4d986e3f..00000000 --- a/deno.lock +++ /dev/null @@ -1,5419 +0,0 @@ -{ - "version": "5", - "specifiers": { - "jsr:@david/code-block-writer@^13.0.2": "13.0.3", - "jsr:@deno/cache-dir@0.20": "0.20.1", - "jsr:@deno/dnt@~0.42.1": "0.42.1", - "jsr:@deno/graph@0.86": "0.86.9", - "jsr:@meshtastic/protobufs@^2.7.0": "2.7.0", - "jsr:@std/bytes@^1.0.5": "1.0.6", - "jsr:@std/fmt@1": "1.0.8", - "jsr:@std/fmt@^1.0.3": "1.0.8", - "jsr:@std/fs@1": "1.0.19", - "jsr:@std/fs@^1.0.6": "1.0.19", - "jsr:@std/internal@^1.0.9": "1.0.9", - "jsr:@std/io@0.225": "0.225.2", - "jsr:@std/path@*": "1.1.1", - "jsr:@std/path@1": "1.1.1", - "jsr:@std/path@^1.0.8": "1.1.1", - "jsr:@std/path@^1.1.0": "1.1.1", - "jsr:@std/path@^1.1.1": "1.1.1", - "jsr:@ts-morph/bootstrap@0.25": "0.25.0", - "jsr:@ts-morph/common@0.25": "0.25.0", - "npm:@bufbuild/protobuf@^2.2.3": "2.6.0", - "npm:@bufbuild/protobuf@^2.6.0": "2.6.0", - "npm:@hookform/resolvers@^5.1.1": "5.1.1_react-hook-form@7.60.0__react@19.1.0_react@19.1.0", - "npm:@jsr/meshtastic__core@2.6.4": "2.6.4", - "npm:@jsr/meshtastic__js@2.6.0-0": "2.6.0-0", - "npm:@jsr/meshtastic__transport-http@*": "0.2.1", - "npm:@jsr/meshtastic__transport-web-bluetooth@*": "0.1.2", - "npm:@jsr/meshtastic__transport-web-serial@*": "0.2.1", - "npm:@noble/curves@^1.9.2": "1.9.2", - "npm:@radix-ui/react-accordion@^1.2.11": "1.2.11_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-checkbox@^1.3.2": "1.3.2_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-dialog@^1.1.14": "1.1.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-dropdown-menu@^2.1.15": "2.1.15_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-label@^2.1.7": "2.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-menubar@^1.1.15": "1.1.15_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-popover@^1.1.14": "1.1.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-scroll-area@^1.2.9": "1.2.9_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-select@^2.2.5": "2.2.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-separator@^1.1.7": "1.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-slider@^1.3.5": "1.3.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-switch@^1.2.5": "1.2.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-tabs@^1.1.12": "1.1.12_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-toast@^1.2.14": "1.2.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-toggle-group@^1.1.10": "1.1.10_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@radix-ui/react-tooltip@^1.2.7": "1.2.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@tailwindcss/postcss@^4.1.11": "4.1.11", - "npm:@tanstack/react-router-devtools@^1.125.4": "1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@tanstack/react-router@^1.125.4": "1.125.6_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@tanstack/router-cli@^1.125.4": "1.125.4", - "npm:@tanstack/router-devtools@^1.125.4": "1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@tanstack/router-plugin@^1.125.5": "1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_react@19.1.0_react-dom@19.1.0__react@19.1.0_@types+node@22.16.0_@types+node@22.15.15", - "npm:@testing-library/jest-dom@^6.6.3": "6.6.3", - "npm:@testing-library/react@^16.3.0": "16.3.0_@testing-library+dom@10.4.0_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:@testing-library/user-event@^14.6.1": "14.6.1_@testing-library+dom@10.4.0", - "npm:@turf/turf@^7.2.0": "7.2.0", - "npm:@types/chrome@^0.0.329": "0.0.329", - "npm:@types/js-cookie@^3.0.6": "3.0.6", - "npm:@types/node@*": "22.15.15", - "npm:@types/node@^22.13.10": "22.16.0", - "npm:@types/node@^24.0.10": "24.0.10", - "npm:@types/react-dom@^19.1.6": "19.1.6_@types+react@19.1.8", - "npm:@types/react@^19.1.8": "19.1.8", - "npm:@types/serviceworker@^0.0.140": "0.0.140", - "npm:@types/w3c-web-serial@*": "1.0.8", - "npm:@types/w3c-web-serial@^1.0.7": "1.0.8", - "npm:@types/w3c-web-serial@^1.0.8": "1.0.8", - "npm:@types/web-bluetooth@*": "0.0.20", - "npm:@types/web-bluetooth@^0.0.20": "0.0.20", - "npm:@types/web-bluetooth@^0.0.21": "0.0.21", - "npm:@vitejs/plugin-react@^4.6.0": "4.6.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_@types+node@22.16.0_@types+node@22.15.15", - "npm:autoprefixer@^10.4.21": "10.4.21_postcss@8.5.6", - "npm:base64-js@^1.5.1": "1.5.1", - "npm:class-variance-authority@~0.7.1": "0.7.1", - "npm:clsx@^2.1.1": "2.1.1", - "npm:cmdk@^1.1.1": "1.1.1_react@19.1.0_react-dom@19.1.0__react@19.1.0_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8", - "npm:crc@^4.3.2": "4.3.2", - "npm:crypto-random-string@5": "5.0.0", - "npm:gzipper@^8.2.1": "8.2.1", - "npm:happy-dom@^18.0.1": "18.0.1", - "npm:i18next-browser-languagedetector@^8.2.0": "8.2.0", - "npm:i18next-http-backend@^3.0.2": "3.0.2", - "npm:i18next@^25.3.1": "25.3.1_typescript@5.8.3", - "npm:idb-keyval@^6.2.2": "6.2.2", - "npm:immer@^10.1.1": "10.1.1", - "npm:js-cookie@^3.0.5": "3.0.5", - "npm:lucide-react@0.525": "0.525.0_react@19.1.0", - "npm:maplibre-gl@5.6.1": "5.6.1", - "npm:postcss@^8.5.6": "8.5.6", - "npm:react-dom@^19.1.0": "19.1.0_react@19.1.0", - "npm:react-error-boundary@6": "6.0.0_react@19.1.0", - "npm:react-hook-form@^7.60.0": "7.60.0_react@19.1.0", - "npm:react-i18next@^15.6.0": "15.6.0_i18next@25.3.1__typescript@5.8.3_react@19.1.0_typescript@5.8.3", - "npm:react-map-gl@8.0.4": "8.0.4_maplibre-gl@5.6.1_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:react-qrcode-logo@3": "3.0.0_react@19.1.0_react-dom@19.1.0__react@19.1.0", - "npm:react@^19.1.0": "19.1.0", - "npm:rfc4648@^1.5.4": "1.5.4", - "npm:simple-git-hooks@^2.13.0": "2.13.0", - "npm:ste-simple-events@^3.0.11": "3.0.11", - "npm:tailwind-merge@^3.3.1": "3.3.1", - "npm:tailwindcss-animate@^1.0.7": "1.0.7_tailwindcss@4.1.11", - "npm:tailwindcss@^4.1.11": "4.1.11", - "npm:tar@^7.4.3": "7.4.3", - "npm:testing-library@^0.0.2": "0.0.2_@angular+common@6.1.10__@angular+core@6.1.10___rxjs@6.6.7___zone.js@0.8.29__rxjs@6.6.7_@angular+core@6.1.10__rxjs@6.6.7__zone.js@0.8.29", - "npm:tslog@^4.9.3": "4.9.3", - "npm:typescript@^5.8.3": "5.8.3", - "npm:vite@7": "7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15", - "npm:vitest@^3.2.4": "3.2.4_@types+node@22.16.0_happy-dom@18.0.1_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.15.15", - "npm:zod@^3.25.75": "3.25.75", - "npm:zustand@5.0.6": "5.0.6_@types+react@19.1.8_immer@10.1.1_react@19.1.0" - }, - "jsr": { - "@david/code-block-writer@13.0.3": { - "integrity": "f98c77d320f5957899a61bfb7a9bead7c6d83ad1515daee92dbacc861e13bb7f" - }, - "@deno/cache-dir@0.20.1": { - "integrity": "dc4f3add14307f3ff3b712441ea4acabcbfc9a13f67c5adc78c3aac16ac5e2a0", - "dependencies": [ - "jsr:@deno/graph", - "jsr:@std/fmt@^1.0.3", - "jsr:@std/fs@^1.0.6", - "jsr:@std/io", - "jsr:@std/path@^1.0.8" - ] - }, - "@deno/dnt@0.42.1": { - "integrity": "85322b38eb40d4e8c5216d62536152c35b1bda9dc47c8c60860610397b960223", - "dependencies": [ - "jsr:@david/code-block-writer", - "jsr:@deno/cache-dir", - "jsr:@std/fmt@1", - "jsr:@std/fs@1", - "jsr:@std/path@1", - "jsr:@ts-morph/bootstrap" - ] - }, - "@deno/graph@0.86.9": { - "integrity": "c4f353a695bcc5246c099602977dabc6534eacea9999a35a8cb24e807192e6a1" - }, - "@meshtastic/protobufs@2.7.0": { - "integrity": "38357241bd8a7431c87366dbe12ce9e69f204ebb6ec23da12f7682765b6c8376", - "dependencies": [ - "npm:@bufbuild/protobuf@^2.2.3" - ] - }, - "@std/bytes@1.0.6": { - "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" - }, - "@std/fmt@1.0.8": { - "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" - }, - "@std/fs@1.0.19": { - "integrity": "051968c2b1eae4d2ea9f79a08a3845740ef6af10356aff43d3e2ef11ed09fb06", - "dependencies": [ - "jsr:@std/internal", - "jsr:@std/path@^1.1.1" - ] - }, - "@std/internal@1.0.9": { - "integrity": "bdfb97f83e4db7a13e8faab26fb1958d1b80cc64366501af78a0aee151696eb8" - }, - "@std/io@0.225.2": { - "integrity": "3c740cd4ee4c082e6cfc86458f47e2ab7cb353dc6234d5e9b1f91a2de5f4d6c7", - "dependencies": [ - "jsr:@std/bytes" - ] - }, - "@std/path@1.1.1": { - "integrity": "fe00026bd3a7e6a27f73709b83c607798be40e20c81dde655ce34052fd82ec76", - "dependencies": [ - "jsr:@std/internal" - ] - }, - "@ts-morph/bootstrap@0.25.0": { - "integrity": "3cd33ee80ac0aab8e5d2660c639a02187f0c8abfe454636ce86c00eb7e8407db", - "dependencies": [ - "jsr:@ts-morph/common" - ] - }, - "@ts-morph/common@0.25.0": { - "integrity": "e3ed1771e2fb61fbc3d2cb39ebbc4f89cd686d6d9bc6d91a71372be055ac1967", - "dependencies": [ - "jsr:@std/fs@1", - "jsr:@std/path@1" - ] - } - }, - "npm": { - "@adobe/css-tools@4.4.3": { - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==" - }, - "@alloc/quick-lru@5.2.0": { - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" - }, - "@ampproject/remapping@2.3.0": { - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": [ - "@jridgewell/gen-mapping", - "@jridgewell/trace-mapping" - ] - }, - "@angular/common@6.1.10_@angular+core@6.1.10__rxjs@6.6.7__zone.js@0.8.29_rxjs@6.6.7": { - "integrity": "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ==", - "dependencies": [ - "@angular/core", - "rxjs", - "tslib@1.14.1" - ] - }, - "@angular/core@6.1.10_rxjs@6.6.7_zone.js@0.8.29": { - "integrity": "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg==", - "dependencies": [ - "rxjs", - "tslib@1.14.1", - "zone.js" - ] - }, - "@babel/code-frame@7.27.1": { - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dependencies": [ - "@babel/helper-validator-identifier", - "js-tokens@4.0.0", - "picocolors" - ] - }, - "@babel/compat-data@7.28.0": { - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" - }, - "@babel/core@7.28.0": { - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dependencies": [ - "@ampproject/remapping", - "@babel/code-frame", - "@babel/generator", - "@babel/helper-compilation-targets", - "@babel/helper-module-transforms", - "@babel/helpers", - "@babel/parser", - "@babel/template", - "@babel/traverse", - "@babel/types", - "convert-source-map", - "debug", - "gensync", - "json5", - "semver" - ] - }, - "@babel/generator@7.28.0": { - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dependencies": [ - "@babel/parser", - "@babel/types", - "@jridgewell/gen-mapping", - "@jridgewell/trace-mapping", - "jsesc" - ] - }, - "@babel/helper-annotate-as-pure@7.27.3": { - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dependencies": [ - "@babel/types" - ] - }, - "@babel/helper-compilation-targets@7.27.2": { - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dependencies": [ - "@babel/compat-data", - "@babel/helper-validator-option", - "browserslist", - "lru-cache", - "semver" - ] - }, - "@babel/helper-create-class-features-plugin@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "dependencies": [ - "@babel/core", - "@babel/helper-annotate-as-pure", - "@babel/helper-member-expression-to-functions", - "@babel/helper-optimise-call-expression", - "@babel/helper-replace-supers", - "@babel/helper-skip-transparent-expression-wrappers", - "@babel/traverse", - "semver" - ] - }, - "@babel/helper-globals@7.28.0": { - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" - }, - "@babel/helper-member-expression-to-functions@7.27.1": { - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "dependencies": [ - "@babel/traverse", - "@babel/types" - ] - }, - "@babel/helper-module-imports@7.27.1": { - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dependencies": [ - "@babel/traverse", - "@babel/types" - ] - }, - "@babel/helper-module-transforms@7.27.3_@babel+core@7.28.0": { - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dependencies": [ - "@babel/core", - "@babel/helper-module-imports", - "@babel/helper-validator-identifier", - "@babel/traverse" - ] - }, - "@babel/helper-optimise-call-expression@7.27.1": { - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dependencies": [ - "@babel/types" - ] - }, - "@babel/helper-plugin-utils@7.27.1": { - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" - }, - "@babel/helper-replace-supers@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dependencies": [ - "@babel/core", - "@babel/helper-member-expression-to-functions", - "@babel/helper-optimise-call-expression", - "@babel/traverse" - ] - }, - "@babel/helper-skip-transparent-expression-wrappers@7.27.1": { - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dependencies": [ - "@babel/traverse", - "@babel/types" - ] - }, - "@babel/helper-string-parser@7.27.1": { - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" - }, - "@babel/helper-validator-identifier@7.27.1": { - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" - }, - "@babel/helper-validator-option@7.27.1": { - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" - }, - "@babel/helpers@7.27.6": { - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "dependencies": [ - "@babel/template", - "@babel/types" - ] - }, - "@babel/parser@7.28.0": { - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "dependencies": [ - "@babel/types" - ], - "bin": true - }, - "@babel/plugin-syntax-jsx@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dependencies": [ - "@babel/core", - "@babel/helper-plugin-utils" - ] - }, - "@babel/plugin-syntax-typescript@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dependencies": [ - "@babel/core", - "@babel/helper-plugin-utils" - ] - }, - "@babel/plugin-transform-modules-commonjs@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dependencies": [ - "@babel/core", - "@babel/helper-module-transforms", - "@babel/helper-plugin-utils" - ] - }, - "@babel/plugin-transform-react-jsx-self@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dependencies": [ - "@babel/core", - "@babel/helper-plugin-utils" - ] - }, - "@babel/plugin-transform-react-jsx-source@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dependencies": [ - "@babel/core", - "@babel/helper-plugin-utils" - ] - }, - "@babel/plugin-transform-typescript@7.28.0_@babel+core@7.28.0": { - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", - "dependencies": [ - "@babel/core", - "@babel/helper-annotate-as-pure", - "@babel/helper-create-class-features-plugin", - "@babel/helper-plugin-utils", - "@babel/helper-skip-transparent-expression-wrappers", - "@babel/plugin-syntax-typescript" - ] - }, - "@babel/preset-typescript@7.27.1_@babel+core@7.28.0": { - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", - "dependencies": [ - "@babel/core", - "@babel/helper-plugin-utils", - "@babel/helper-validator-option", - "@babel/plugin-syntax-jsx", - "@babel/plugin-transform-modules-commonjs", - "@babel/plugin-transform-typescript" - ] - }, - "@babel/runtime@7.27.6": { - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==" - }, - "@babel/template@7.27.2": { - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dependencies": [ - "@babel/code-frame", - "@babel/parser", - "@babel/types" - ] - }, - "@babel/traverse@7.28.0": { - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "dependencies": [ - "@babel/code-frame", - "@babel/generator", - "@babel/helper-globals", - "@babel/parser", - "@babel/template", - "@babel/types", - "debug" - ] - }, - "@babel/types@7.28.0": { - "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", - "dependencies": [ - "@babel/helper-string-parser", - "@babel/helper-validator-identifier" - ] - }, - "@bufbuild/protobuf@2.6.0": { - "integrity": "sha512-6cuonJVNOIL7lTj5zgo/Rc2bKAo4/GvN+rKCrUj7GdEHRzCk8zKOfFwUsL9nAVk5rSIsRmlgcpLzTRysopEeeg==" - }, - "@emnapi/core@1.4.4": { - "integrity": "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==", - "dependencies": [ - "@emnapi/wasi-threads", - "tslib@2.8.1" - ] - }, - "@emnapi/runtime@1.4.4": { - "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "@emnapi/wasi-threads@1.0.3": { - "integrity": "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "@esbuild/aix-ppc64@0.25.6": { - "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", - "os": ["aix"], - "cpu": ["ppc64"] - }, - "@esbuild/android-arm64@0.25.6": { - "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@esbuild/android-arm@0.25.6": { - "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", - "os": ["android"], - "cpu": ["arm"] - }, - "@esbuild/android-x64@0.25.6": { - "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", - "os": ["android"], - "cpu": ["x64"] - }, - "@esbuild/darwin-arm64@0.25.6": { - "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@esbuild/darwin-x64@0.25.6": { - "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@esbuild/freebsd-arm64@0.25.6": { - "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@esbuild/freebsd-x64@0.25.6": { - "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@esbuild/linux-arm64@0.25.6": { - "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@esbuild/linux-arm@0.25.6": { - "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@esbuild/linux-ia32@0.25.6": { - "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", - "os": ["linux"], - "cpu": ["ia32"] - }, - "@esbuild/linux-loong64@0.25.6": { - "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@esbuild/linux-mips64el@0.25.6": { - "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", - "os": ["linux"], - "cpu": ["mips64el"] - }, - "@esbuild/linux-ppc64@0.25.6": { - "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@esbuild/linux-riscv64@0.25.6": { - "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@esbuild/linux-s390x@0.25.6": { - "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", - "os": ["linux"], - "cpu": ["s390x"] - }, - "@esbuild/linux-x64@0.25.6": { - "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@esbuild/netbsd-arm64@0.25.6": { - "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", - "os": ["netbsd"], - "cpu": ["arm64"] - }, - "@esbuild/netbsd-x64@0.25.6": { - "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", - "os": ["netbsd"], - "cpu": ["x64"] - }, - "@esbuild/openbsd-arm64@0.25.6": { - "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", - "os": ["openbsd"], - "cpu": ["arm64"] - }, - "@esbuild/openbsd-x64@0.25.6": { - "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", - "os": ["openbsd"], - "cpu": ["x64"] - }, - "@esbuild/openharmony-arm64@0.25.6": { - "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", - "os": ["openharmony"], - "cpu": ["arm64"] - }, - "@esbuild/sunos-x64@0.25.6": { - "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", - "os": ["sunos"], - "cpu": ["x64"] - }, - "@esbuild/win32-arm64@0.25.6": { - "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "@esbuild/win32-ia32@0.25.6": { - "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", - "os": ["win32"], - "cpu": ["ia32"] - }, - "@esbuild/win32-x64@0.25.6": { - "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@floating-ui/core@1.7.2": { - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", - "dependencies": [ - "@floating-ui/utils" - ] - }, - "@floating-ui/dom@1.7.2": { - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", - "dependencies": [ - "@floating-ui/core", - "@floating-ui/utils" - ] - }, - "@floating-ui/react-dom@2.1.4_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", - "dependencies": [ - "@floating-ui/dom", - "react", - "react-dom" - ] - }, - "@floating-ui/utils@0.2.10": { - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" - }, - "@gfx/zopfli@1.0.15": { - "integrity": "sha512-7mBgpi7UD82fsff5ThQKet0uBTl4BYerQuc+/qA1ELTwWEiIedRTcD3JgiUu9wwZ2kytW8JOb165rSdAt8PfcQ==", - "dependencies": [ - "base64-js" - ] - }, - "@hookform/resolvers@5.1.1_react-hook-form@7.60.0__react@19.1.0_react@19.1.0": { - "integrity": "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg==", - "dependencies": [ - "@standard-schema/utils", - "react-hook-form" - ] - }, - "@isaacs/fs-minipass@4.0.1": { - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dependencies": [ - "minipass" - ] - }, - "@jridgewell/gen-mapping@0.3.12": { - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dependencies": [ - "@jridgewell/sourcemap-codec", - "@jridgewell/trace-mapping" - ] - }, - "@jridgewell/resolve-uri@3.1.2": { - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - }, - "@jridgewell/sourcemap-codec@1.5.4": { - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" - }, - "@jridgewell/trace-mapping@0.3.29": { - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dependencies": [ - "@jridgewell/resolve-uri", - "@jridgewell/sourcemap-codec" - ] - }, - "@jsr/meshtastic__core@2.6.4": { - "integrity": "sha512-1Kz5DK6peFxluHOJR38vFwfgeJzMXTz+3p6TvibjILVhSQC2U1nu8aJbn6w5zhRqS+j79OmtrRvdzL6VNsTkkQ==", - "dependencies": [ - "@bufbuild/protobuf", - "@jsr/meshtastic__protobufs", - "crc", - "ste-simple-events", - "tslog" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.4.tgz" - }, - "@jsr/meshtastic__js@2.6.0-0": { - "integrity": "sha512-+xpZpxK6oUIVOuEs7C+LyxRr2druvc7UNNNTK9Rl8ioXj63Jz1uQXlYe2Gj0xjnRAiSQLR7QVaPef21BR/YTxA==", - "dependencies": [ - "@bufbuild/protobuf", - "@jsr/meshtastic__protobufs", - "crc", - "ste-simple-events", - "tslog" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__js/2.6.0-0.tgz" - }, - "@jsr/meshtastic__protobufs@2.7.0": { - "integrity": "sha512-ndZhUyB/ADSyjJI+iSeSOoIKqNGZ2+ERVjfY0qnh4jgF740tFTwefC5mzZhOqDLbreGFYS79+429NtH5Ujdzdg==", - "dependencies": [ - "@bufbuild/protobuf" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__protobufs/2.7.0.tgz" - }, - "@jsr/meshtastic__transport-http@0.2.1": { - "integrity": "sha512-lmQKr3aIINKvtGROU4HchmSVqbZSbkIHqajowRRC8IAjsnR0zNTyxz210QyY4pFUF9hpcW3GRjwq5h/VO2JuGg==", - "dependencies": [ - "@jsr/meshtastic__core" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-http/0.2.1.tgz" - }, - "@jsr/meshtastic__transport-web-bluetooth@0.1.2": { - "integrity": "sha512-Z+5pv9RXNgY0/crKExOH3pZ6LT0HIXFmnBL7NX5AO2knOFRn+4lmxQEhhmiTTlkUfqyEfAvbjuY5u4mq9TPTdQ==", - "dependencies": [ - "@jsr/meshtastic__core" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-bluetooth/0.1.2.tgz" - }, - "@jsr/meshtastic__transport-web-serial@0.2.1": { - "integrity": "sha512-yumjEGLkAuJYOC3aWKvZzbQqi/LnqaKfNpVCY7Ki7oLtAshNiZrBLiwiFhN7+ZR9FfMdJThyBMqREBDRRWTO1Q==", - "dependencies": [ - "@jsr/meshtastic__core" - ], - "tarball": "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-serial/0.2.1.tgz" - }, - "@mapbox/geojson-rewind@0.5.2": { - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dependencies": [ - "get-stream", - "minimist" - ], - "bin": true - }, - "@mapbox/jsonlint-lines-primitives@2.0.2": { - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" - }, - "@mapbox/point-geometry@0.1.0": { - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "@mapbox/tiny-sdf@2.0.6": { - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" - }, - "@mapbox/unitbezier@0.0.1": { - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" - }, - "@mapbox/vector-tile@1.3.1": { - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "dependencies": [ - "@mapbox/point-geometry" - ] - }, - "@mapbox/whoots-js@3.1.0": { - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" - }, - "@maplibre/maplibre-gl-style-spec@19.3.3": { - "integrity": "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==", - "dependencies": [ - "@mapbox/jsonlint-lines-primitives", - "@mapbox/unitbezier", - "json-stringify-pretty-compact@3.0.0", - "minimist", - "rw", - "sort-object" - ], - "bin": true - }, - "@maplibre/maplibre-gl-style-spec@23.3.0": { - "integrity": "sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==", - "dependencies": [ - "@mapbox/jsonlint-lines-primitives", - "@mapbox/unitbezier", - "json-stringify-pretty-compact@4.0.0", - "minimist", - "quickselect@3.0.0", - "rw", - "tinyqueue@3.0.0" - ], - "bin": true - }, - "@napi-rs/wasm-runtime@0.2.11": { - "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", - "dependencies": [ - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util" - ] - }, - "@noble/curves@1.9.2": { - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", - "dependencies": [ - "@noble/hashes" - ] - }, - "@noble/hashes@1.8.0": { - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" - }, - "@radix-ui/number@1.1.1": { - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" - }, - "@radix-ui/primitive@1.1.2": { - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" - }, - "@radix-ui/react-accordion@1.2.11_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-collapsible", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-id", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-arrow@1.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "dependencies": [ - "@radix-ui/react-primitive", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-checkbox@1.3.2_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-previous", - "@radix-ui/react-use-size", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-collapsible@1.1.11_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-id", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-layout-effect", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-collection@1.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "dependencies": [ - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-primitive", - "@radix-ui/react-slot", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-compose-refs@1.1.2_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-context@1.1.2_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-dialog@1.1.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-focus-guards", - "@radix-ui/react-focus-scope", - "@radix-ui/react-id", - "@radix-ui/react-portal", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-slot", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "aria-hidden", - "react", - "react-dom", - "react-remove-scroll" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-direction@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-dismissable-layer@1.1.10_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-escape-keydown", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-dropdown-menu@2.1.15_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-id", - "@radix-ui/react-menu", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-focus-guards@1.1.2_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-focus-scope@1.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "dependencies": [ - "@radix-ui/react-compose-refs", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-id@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "dependencies": [ - "@radix-ui/react-use-layout-effect", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-label@2.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "dependencies": [ - "@radix-ui/react-primitive", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-menu@2.1.15_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-focus-guards", - "@radix-ui/react-focus-scope", - "@radix-ui/react-id", - "@radix-ui/react-popper", - "@radix-ui/react-portal", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-roving-focus", - "@radix-ui/react-slot", - "@radix-ui/react-use-callback-ref", - "@types/react", - "@types/react-dom", - "aria-hidden", - "react", - "react-dom", - "react-remove-scroll" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-menubar@1.1.15_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-id", - "@radix-ui/react-menu", - "@radix-ui/react-primitive", - "@radix-ui/react-roving-focus", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-popover@1.1.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-focus-guards", - "@radix-ui/react-focus-scope", - "@radix-ui/react-id", - "@radix-ui/react-popper", - "@radix-ui/react-portal", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-slot", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "aria-hidden", - "react", - "react-dom", - "react-remove-scroll" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-popper@1.2.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "dependencies": [ - "@floating-ui/react-dom", - "@radix-ui/react-arrow", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-layout-effect", - "@radix-ui/react-use-rect", - "@radix-ui/react-use-size", - "@radix-ui/rect", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-portal@1.1.9_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "dependencies": [ - "@radix-ui/react-primitive", - "@radix-ui/react-use-layout-effect", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-presence@1.1.4_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "dependencies": [ - "@radix-ui/react-compose-refs", - "@radix-ui/react-use-layout-effect", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-primitive@2.1.3_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dependencies": [ - "@radix-ui/react-slot", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-roving-focus@1.1.10_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-id", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-scroll-area@1.2.9_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==", - "dependencies": [ - "@radix-ui/number", - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-layout-effect", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-select@2.2.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "dependencies": [ - "@radix-ui/number", - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-focus-guards", - "@radix-ui/react-focus-scope", - "@radix-ui/react-id", - "@radix-ui/react-popper", - "@radix-ui/react-portal", - "@radix-ui/react-primitive", - "@radix-ui/react-slot", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-layout-effect", - "@radix-ui/react-use-previous", - "@radix-ui/react-visually-hidden", - "@types/react", - "@types/react-dom", - "aria-hidden", - "react", - "react-dom", - "react-remove-scroll" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-separator@1.1.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "dependencies": [ - "@radix-ui/react-primitive", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-slider@1.3.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==", - "dependencies": [ - "@radix-ui/number", - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-layout-effect", - "@radix-ui/react-use-previous", - "@radix-ui/react-use-size", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-slot@1.2.3_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dependencies": [ - "@radix-ui/react-compose-refs", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-switch@1.2.5_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-previous", - "@radix-ui/react-use-size", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-tabs@1.1.12_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-id", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-roving-focus", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-toast@1.2.14_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-collection", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-portal", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-use-callback-ref", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-use-layout-effect", - "@radix-ui/react-visually-hidden", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-toggle-group@1.1.10_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-context", - "@radix-ui/react-direction", - "@radix-ui/react-primitive", - "@radix-ui/react-roving-focus", - "@radix-ui/react-toggle", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-toggle@1.1.9_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-primitive", - "@radix-ui/react-use-controllable-state", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-tooltip@1.2.7_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "dependencies": [ - "@radix-ui/primitive", - "@radix-ui/react-compose-refs", - "@radix-ui/react-context", - "@radix-ui/react-dismissable-layer", - "@radix-ui/react-id", - "@radix-ui/react-popper", - "@radix-ui/react-portal", - "@radix-ui/react-presence", - "@radix-ui/react-primitive", - "@radix-ui/react-slot", - "@radix-ui/react-use-controllable-state", - "@radix-ui/react-visually-hidden", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/react-use-callback-ref@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-controllable-state@1.2.2_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "dependencies": [ - "@radix-ui/react-use-effect-event", - "@radix-ui/react-use-layout-effect", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-effect-event@0.0.2_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dependencies": [ - "@radix-ui/react-use-layout-effect", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-escape-keydown@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "dependencies": [ - "@radix-ui/react-use-callback-ref", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-layout-effect@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-previous@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "dependencies": [ - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-rect@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "dependencies": [ - "@radix-ui/rect", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-use-size@1.1.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "dependencies": [ - "@radix-ui/react-use-layout-effect", - "@types/react", - "react" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "@radix-ui/react-visually-hidden@1.2.3_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "dependencies": [ - "@radix-ui/react-primitive", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@radix-ui/rect@1.1.1": { - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" - }, - "@rolldown/pluginutils@1.0.0-beta.19": { - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==" - }, - "@rollup/rollup-android-arm-eabi@4.44.2": { - "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==", - "os": ["android"], - "cpu": ["arm"] - }, - "@rollup/rollup-android-arm64@4.44.2": { - "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@rollup/rollup-darwin-arm64@4.44.2": { - "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@rollup/rollup-darwin-x64@4.44.2": { - "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@rollup/rollup-freebsd-arm64@4.44.2": { - "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@rollup/rollup-freebsd-x64@4.44.2": { - "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@rollup/rollup-linux-arm-gnueabihf@4.44.2": { - "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@rollup/rollup-linux-arm-musleabihf@4.44.2": { - "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@rollup/rollup-linux-arm64-gnu@4.44.2": { - "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@rollup/rollup-linux-arm64-musl@4.44.2": { - "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@rollup/rollup-linux-loongarch64-gnu@4.44.2": { - "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@rollup/rollup-linux-powerpc64le-gnu@4.44.2": { - "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@rollup/rollup-linux-riscv64-gnu@4.44.2": { - "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-riscv64-musl@4.44.2": { - "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-s390x-gnu@4.44.2": { - "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==", - "os": ["linux"], - "cpu": ["s390x"] - }, - "@rollup/rollup-linux-x64-gnu@4.44.2": { - "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@rollup/rollup-linux-x64-musl@4.44.2": { - "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@rollup/rollup-win32-arm64-msvc@4.44.2": { - "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "@rollup/rollup-win32-ia32-msvc@4.44.2": { - "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==", - "os": ["win32"], - "cpu": ["ia32"] - }, - "@rollup/rollup-win32-x64-msvc@4.44.2": { - "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@standard-schema/utils@0.3.0": { - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" - }, - "@tailwindcss/node@4.1.11": { - "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", - "dependencies": [ - "@ampproject/remapping", - "enhanced-resolve", - "jiti", - "lightningcss", - "magic-string", - "source-map-js", - "tailwindcss" - ] - }, - "@tailwindcss/oxide-android-arm64@4.1.11": { - "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@tailwindcss/oxide-darwin-arm64@4.1.11": { - "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@tailwindcss/oxide-darwin-x64@4.1.11": { - "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@tailwindcss/oxide-freebsd-x64@4.1.11": { - "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11": { - "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@tailwindcss/oxide-linux-arm64-gnu@4.1.11": { - "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@tailwindcss/oxide-linux-arm64-musl@4.1.11": { - "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@tailwindcss/oxide-linux-x64-gnu@4.1.11": { - "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@tailwindcss/oxide-linux-x64-musl@4.1.11": { - "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@tailwindcss/oxide-wasm32-wasi@4.1.11": { - "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", - "dependencies": [ - "@emnapi/core", - "@emnapi/runtime", - "@emnapi/wasi-threads", - "@napi-rs/wasm-runtime", - "@tybys/wasm-util", - "tslib@2.8.1" - ], - "cpu": ["wasm32"] - }, - "@tailwindcss/oxide-win32-arm64-msvc@4.1.11": { - "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "@tailwindcss/oxide-win32-x64-msvc@4.1.11": { - "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@tailwindcss/oxide@4.1.11": { - "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", - "dependencies": [ - "detect-libc", - "tar" - ], - "optionalDependencies": [ - "@tailwindcss/oxide-android-arm64", - "@tailwindcss/oxide-darwin-arm64", - "@tailwindcss/oxide-darwin-x64", - "@tailwindcss/oxide-freebsd-x64", - "@tailwindcss/oxide-linux-arm-gnueabihf", - "@tailwindcss/oxide-linux-arm64-gnu", - "@tailwindcss/oxide-linux-arm64-musl", - "@tailwindcss/oxide-linux-x64-gnu", - "@tailwindcss/oxide-linux-x64-musl", - "@tailwindcss/oxide-wasm32-wasi", - "@tailwindcss/oxide-win32-arm64-msvc", - "@tailwindcss/oxide-win32-x64-msvc" - ], - "scripts": true - }, - "@tailwindcss/postcss@4.1.11": { - "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", - "dependencies": [ - "@alloc/quick-lru", - "@tailwindcss/node", - "@tailwindcss/oxide", - "postcss", - "tailwindcss" - ] - }, - "@tanstack/history@1.121.34": { - "integrity": "sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==" - }, - "@tanstack/react-router-devtools@1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-3+Np/HPQ1jpdai58xY6fScnjJz08iIG6aKhCVVy8tfPC76jTyXc+ygqM9wtUt3kJYy9/Lf7j3dAJlbtxF+TIXg==", - "dependencies": [ - "@tanstack/react-router", - "@tanstack/router-devtools-core", - "react", - "react-dom" - ] - }, - "@tanstack/react-router@1.125.6_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==", - "dependencies": [ - "@tanstack/history", - "@tanstack/react-store", - "@tanstack/router-core", - "isbot", - "jsesc", - "react", - "react-dom", - "tiny-invariant", - "tiny-warning" - ] - }, - "@tanstack/react-store@0.7.3_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==", - "dependencies": [ - "@tanstack/store", - "react", - "react-dom", - "use-sync-external-store" - ] - }, - "@tanstack/router-cli@1.125.4": { - "integrity": "sha512-09DGnwDKsRdLmbAwstN2biJ7P37PeD/Fv2uDDIOfc+AlBw6gfq8byy0zIYFXmQCjSBmHwmS9A4XOmfzaDkfQng==", - "dependencies": [ - "@tanstack/router-generator", - "chokidar", - "yargs" - ], - "bin": true - }, - "@tanstack/router-core@1.125.4": { - "integrity": "sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==", - "dependencies": [ - "@tanstack/history", - "@tanstack/store", - "cookie-es", - "jsesc", - "tiny-invariant", - "tiny-warning" - ] - }, - "@tanstack/router-devtools-core@1.125.4_@tanstack+router-core@1.125.4_solid-js@1.9.7__seroval@1.3.2_tiny-invariant@1.3.3": { - "integrity": "sha512-5QbCQCcJcN/M0NF2TARKqauJ8QeRuk7kyHQMCqOoSJWWGUVcDHEmcbg1ZCJevfPVZPgnUjV9mqDfCPTYWT8/+w==", - "dependencies": [ - "@tanstack/router-core", - "clsx", - "goober", - "solid-js", - "tiny-invariant" - ] - }, - "@tanstack/router-devtools@1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-Orlf0+5wANehVq5ocxfe3YyJnEtvc5tcNN/ldX20fOKyYeIhVQzR8Oa6RO3Jk2sY31grMwi6q199MTAJ7XshLQ==", - "dependencies": [ - "@tanstack/react-router", - "@tanstack/react-router-devtools", - "clsx", - "goober", - "react", - "react-dom" - ] - }, - "@tanstack/router-generator@1.125.4": { - "integrity": "sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==", - "dependencies": [ - "@tanstack/router-core", - "@tanstack/router-utils", - "@tanstack/virtual-file-routes", - "prettier", - "recast", - "source-map@0.7.4", - "tsx", - "zod" - ] - }, - "@tanstack/router-plugin@1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_react@19.1.0_react-dom@19.1.0__react@19.1.0_@types+node@22.16.0": { - "integrity": "sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==", - "dependencies": [ - "@babel/core", - "@babel/plugin-syntax-jsx", - "@babel/plugin-syntax-typescript", - "@babel/template", - "@babel/traverse", - "@babel/types", - "@tanstack/react-router", - "@tanstack/router-core", - "@tanstack/router-generator", - "@tanstack/router-utils", - "@tanstack/virtual-file-routes", - "babel-dead-code-elimination", - "chokidar", - "unplugin", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2", - "zod" - ], - "optionalPeers": [ - "@tanstack/react-router", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2" - ] - }, - "@tanstack/router-plugin@1.125.6_@tanstack+react-router@1.125.6__react@19.1.0__react-dom@19.1.0___react@19.1.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_react@19.1.0_react-dom@19.1.0__react@19.1.0_@types+node@22.16.0_@types+node@22.15.15": { - "integrity": "sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==", - "dependencies": [ - "@babel/core", - "@babel/plugin-syntax-jsx", - "@babel/plugin-syntax-typescript", - "@babel/template", - "@babel/traverse", - "@babel/types", - "@tanstack/react-router", - "@tanstack/router-core", - "@tanstack/router-generator", - "@tanstack/router-utils", - "@tanstack/virtual-file-routes", - "babel-dead-code-elimination", - "chokidar", - "unplugin", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15", - "zod" - ], - "optionalPeers": [ - "@tanstack/react-router", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15" - ] - }, - "@tanstack/router-utils@1.121.21_@babel+core@7.28.0": { - "integrity": "sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==", - "dependencies": [ - "@babel/core", - "@babel/generator", - "@babel/parser", - "@babel/preset-typescript", - "ansis", - "diff" - ] - }, - "@tanstack/store@0.7.2": { - "integrity": "sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==" - }, - "@tanstack/virtual-file-routes@1.121.21": { - "integrity": "sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==" - }, - "@testing-library/dom@10.4.0": { - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dependencies": [ - "@babel/code-frame", - "@babel/runtime", - "@types/aria-query", - "aria-query@5.3.0", - "chalk@4.1.2", - "dom-accessibility-api@0.5.16", - "lz-string", - "pretty-format" - ] - }, - "@testing-library/jest-dom@6.6.3": { - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", - "dependencies": [ - "@adobe/css-tools", - "aria-query@5.3.2", - "chalk@3.0.0", - "css.escape", - "dom-accessibility-api@0.6.3", - "lodash", - "redent" - ] - }, - "@testing-library/react@16.3.0_@testing-library+dom@10.4.0_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", - "dependencies": [ - "@babel/runtime", - "@testing-library/dom", - "@types/react", - "@types/react-dom", - "react", - "react-dom" - ], - "optionalPeers": [ - "@types/react", - "@types/react-dom" - ] - }, - "@testing-library/user-event@14.6.1_@testing-library+dom@10.4.0": { - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dependencies": [ - "@testing-library/dom" - ] - }, - "@turf/along@7.2.0": { - "integrity": "sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw==", - "dependencies": [ - "@turf/bearing", - "@turf/destination", - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/angle@7.2.0": { - "integrity": "sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ==", - "dependencies": [ - "@turf/bearing", - "@turf/helpers", - "@turf/invariant", - "@turf/rhumb-bearing", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/area@7.2.0": { - "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/bbox-clip@7.2.0": { - "integrity": "sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/bbox-polygon@7.2.0": { - "integrity": "sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/bbox@7.2.0": { - "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/bearing@7.2.0": { - "integrity": "sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/bezier-spline@7.2.0": { - "integrity": "sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-clockwise@7.2.0": { - "integrity": "sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-concave@7.2.0": { - "integrity": "sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-contains@7.2.0": { - "integrity": "sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg==", - "dependencies": [ - "@turf/bbox", - "@turf/boolean-point-in-polygon", - "@turf/boolean-point-on-line", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-crosses@7.2.0": { - "integrity": "sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@turf/invariant", - "@turf/line-intersect", - "@turf/polygon-to-line", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-disjoint@7.2.0": { - "integrity": "sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@turf/line-intersect", - "@turf/meta", - "@turf/polygon-to-line", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-equal@7.2.0": { - "integrity": "sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw==", - "dependencies": [ - "@turf/clean-coords", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "geojson-equality-ts", - "tslib@2.8.1" - ] - }, - "@turf/boolean-intersects@7.2.0": { - "integrity": "sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==", - "dependencies": [ - "@turf/boolean-disjoint", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-overlap@7.2.0": { - "integrity": "sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/line-intersect", - "@turf/line-overlap", - "@turf/meta", - "@types/geojson", - "geojson-equality-ts", - "tslib@2.8.1" - ] - }, - "@turf/boolean-parallel@7.2.0": { - "integrity": "sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w==", - "dependencies": [ - "@turf/clean-coords", - "@turf/helpers", - "@turf/line-segment", - "@turf/rhumb-bearing", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-point-in-polygon@7.2.0": { - "integrity": "sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "point-in-polygon-hao", - "tslib@2.8.1" - ] - }, - "@turf/boolean-point-on-line@7.2.0": { - "integrity": "sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-touches@7.2.0": { - "integrity": "sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/boolean-point-on-line", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/boolean-valid@7.2.0": { - "integrity": "sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA==", - "dependencies": [ - "@turf/bbox", - "@turf/boolean-crosses", - "@turf/boolean-disjoint", - "@turf/boolean-overlap", - "@turf/boolean-point-in-polygon", - "@turf/boolean-point-on-line", - "@turf/helpers", - "@turf/invariant", - "@turf/line-intersect", - "@types/geojson", - "geojson-polygon-self-intersections", - "tslib@2.8.1" - ] - }, - "@turf/boolean-within@7.2.0": { - "integrity": "sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g==", - "dependencies": [ - "@turf/bbox", - "@turf/boolean-point-in-polygon", - "@turf/boolean-point-on-line", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/buffer@7.2.0": { - "integrity": "sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==", - "dependencies": [ - "@turf/bbox", - "@turf/center", - "@turf/helpers", - "@turf/jsts", - "@turf/meta", - "@turf/projection", - "@types/geojson", - "d3-geo" - ] - }, - "@turf/center-mean@7.2.0": { - "integrity": "sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A==", - "dependencies": [ - "@turf/bbox", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/center-median@7.2.0": { - "integrity": "sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A==", - "dependencies": [ - "@turf/center-mean", - "@turf/centroid", - "@turf/distance", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/center-of-mass@7.2.0": { - "integrity": "sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ==", - "dependencies": [ - "@turf/centroid", - "@turf/convex", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/center@7.2.0": { - "integrity": "sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==", - "dependencies": [ - "@turf/bbox", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/centroid@7.2.0": { - "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/circle@7.2.0": { - "integrity": "sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA==", - "dependencies": [ - "@turf/destination", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/clean-coords@7.2.0": { - "integrity": "sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/clone@7.2.0": { - "integrity": "sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/clusters-dbscan@7.2.0": { - "integrity": "sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw==", - "dependencies": [ - "@turf/clone", - "@turf/distance", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "rbush@3.0.1", - "tslib@2.8.1" - ] - }, - "@turf/clusters-kmeans@7.2.0": { - "integrity": "sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "skmeans", - "tslib@2.8.1" - ] - }, - "@turf/clusters@7.2.0": { - "integrity": "sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/collect@7.2.0": { - "integrity": "sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA==", - "dependencies": [ - "@turf/bbox", - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@types/geojson", - "rbush@3.0.1", - "tslib@2.8.1" - ] - }, - "@turf/combine@7.2.0": { - "integrity": "sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/concave@7.2.0": { - "integrity": "sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw==", - "dependencies": [ - "@turf/clone", - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/tin", - "@types/geojson", - "topojson-client", - "topojson-server", - "tslib@2.8.1" - ] - }, - "@turf/convex@7.2.0": { - "integrity": "sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "concaveman", - "tslib@2.8.1" - ] - }, - "@turf/destination@7.2.0": { - "integrity": "sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/difference@7.2.0": { - "integrity": "sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "polyclip-ts", - "tslib@2.8.1" - ] - }, - "@turf/dissolve@7.2.0": { - "integrity": "sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA==", - "dependencies": [ - "@turf/flatten", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "polyclip-ts", - "tslib@2.8.1" - ] - }, - "@turf/distance-weight@7.2.0": { - "integrity": "sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg==", - "dependencies": [ - "@turf/centroid", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/distance@7.2.0": { - "integrity": "sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/ellipse@7.2.0": { - "integrity": "sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/rhumb-destination", - "@turf/transform-rotate", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/envelope@7.2.0": { - "integrity": "sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA==", - "dependencies": [ - "@turf/bbox", - "@turf/bbox-polygon", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/explode@7.2.0": { - "integrity": "sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/flatten@7.2.0": { - "integrity": "sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/flip@7.2.0": { - "integrity": "sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/geojson-rbush@7.2.0": { - "integrity": "sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw==", - "dependencies": [ - "@turf/bbox", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "rbush@3.0.1" - ] - }, - "@turf/great-circle@7.2.0": { - "integrity": "sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson" - ] - }, - "@turf/helpers@7.2.0": { - "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", - "dependencies": [ - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/hex-grid@7.2.0": { - "integrity": "sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA==", - "dependencies": [ - "@turf/distance", - "@turf/helpers", - "@turf/intersect", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/interpolate@7.2.0": { - "integrity": "sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA==", - "dependencies": [ - "@turf/bbox", - "@turf/centroid", - "@turf/clone", - "@turf/distance", - "@turf/helpers", - "@turf/hex-grid", - "@turf/invariant", - "@turf/meta", - "@turf/point-grid", - "@turf/square-grid", - "@turf/triangle-grid", - "@types/geojson" - ] - }, - "@turf/intersect@7.2.0": { - "integrity": "sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "polyclip-ts", - "tslib@2.8.1" - ] - }, - "@turf/invariant@7.2.0": { - "integrity": "sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/isobands@7.2.0": { - "integrity": "sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg==", - "dependencies": [ - "@turf/area", - "@turf/bbox", - "@turf/boolean-point-in-polygon", - "@turf/explode", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "marchingsquares", - "tslib@2.8.1" - ] - }, - "@turf/isolines@7.2.0": { - "integrity": "sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg==", - "dependencies": [ - "@turf/bbox", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "marchingsquares", - "tslib@2.8.1" - ] - }, - "@turf/jsts@2.7.2": { - "integrity": "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==", - "dependencies": [ - "jsts" - ] - }, - "@turf/kinks@7.2.0": { - "integrity": "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/length@7.2.0": { - "integrity": "sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig==", - "dependencies": [ - "@turf/distance", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/line-arc@7.2.0": { - "integrity": "sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw==", - "dependencies": [ - "@turf/circle", - "@turf/destination", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/line-chunk@7.2.0": { - "integrity": "sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g==", - "dependencies": [ - "@turf/helpers", - "@turf/length", - "@turf/line-slice-along", - "@turf/meta", - "@types/geojson" - ] - }, - "@turf/line-intersect@7.2.0": { - "integrity": "sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "sweepline-intersections", - "tslib@2.8.1" - ] - }, - "@turf/line-offset@7.2.0": { - "integrity": "sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson" - ] - }, - "@turf/line-overlap@7.2.0": { - "integrity": "sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw==", - "dependencies": [ - "@turf/boolean-point-on-line", - "@turf/geojson-rbush", - "@turf/helpers", - "@turf/invariant", - "@turf/line-segment", - "@turf/meta", - "@turf/nearest-point-on-line", - "@types/geojson", - "fast-deep-equal", - "tslib@2.8.1" - ] - }, - "@turf/line-segment@7.2.0": { - "integrity": "sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/line-slice-along@7.2.0": { - "integrity": "sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A==", - "dependencies": [ - "@turf/bearing", - "@turf/destination", - "@turf/distance", - "@turf/helpers", - "@types/geojson" - ] - }, - "@turf/line-slice@7.2.0": { - "integrity": "sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/nearest-point-on-line", - "@types/geojson" - ] - }, - "@turf/line-split@7.2.0": { - "integrity": "sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ==", - "dependencies": [ - "@turf/bbox", - "@turf/geojson-rbush", - "@turf/helpers", - "@turf/invariant", - "@turf/line-intersect", - "@turf/line-segment", - "@turf/meta", - "@turf/nearest-point-on-line", - "@turf/square", - "@turf/truncate", - "@types/geojson" - ] - }, - "@turf/line-to-polygon@7.2.0": { - "integrity": "sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA==", - "dependencies": [ - "@turf/bbox", - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/mask@7.2.0": { - "integrity": "sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@types/geojson", - "polyclip-ts", - "tslib@2.8.1" - ] - }, - "@turf/meta@7.2.0": { - "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", - "dependencies": [ - "@turf/helpers", - "@types/geojson" - ] - }, - "@turf/midpoint@7.2.0": { - "integrity": "sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw==", - "dependencies": [ - "@turf/bearing", - "@turf/destination", - "@turf/distance", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/moran-index@7.2.0": { - "integrity": "sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA==", - "dependencies": [ - "@turf/distance-weight", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/nearest-neighbor-analysis@7.2.0": { - "integrity": "sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA==", - "dependencies": [ - "@turf/area", - "@turf/bbox", - "@turf/bbox-polygon", - "@turf/centroid", - "@turf/distance", - "@turf/helpers", - "@turf/meta", - "@turf/nearest-point", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/nearest-point-on-line@7.2.0": { - "integrity": "sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA==", - "dependencies": [ - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/nearest-point-to-line@7.2.0": { - "integrity": "sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/point-to-line-distance", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/nearest-point@7.2.0": { - "integrity": "sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q==", - "dependencies": [ - "@turf/clone", - "@turf/distance", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/planepoint@7.2.0": { - "integrity": "sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/point-grid@7.2.0": { - "integrity": "sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q==", - "dependencies": [ - "@turf/boolean-within", - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/point-on-feature@7.2.0": { - "integrity": "sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/center", - "@turf/explode", - "@turf/helpers", - "@turf/nearest-point", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/point-to-line-distance@7.2.0": { - "integrity": "sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg==", - "dependencies": [ - "@turf/bearing", - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/nearest-point-on-line", - "@turf/projection", - "@turf/rhumb-bearing", - "@turf/rhumb-distance", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/point-to-polygon-distance@7.2.0": { - "integrity": "sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/point-to-line-distance", - "@turf/polygon-to-line", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/points-within-polygon@7.2.0": { - "integrity": "sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/polygon-smooth@7.2.0": { - "integrity": "sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/polygon-tangents@7.2.0": { - "integrity": "sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g==", - "dependencies": [ - "@turf/bbox", - "@turf/boolean-within", - "@turf/explode", - "@turf/helpers", - "@turf/invariant", - "@turf/nearest-point", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/polygon-to-line@7.2.0": { - "integrity": "sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/polygonize@7.2.0": { - "integrity": "sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/envelope", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/projection@7.2.0": { - "integrity": "sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/quadrat-analysis@7.2.0": { - "integrity": "sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w==", - "dependencies": [ - "@turf/area", - "@turf/bbox", - "@turf/bbox-polygon", - "@turf/centroid", - "@turf/helpers", - "@turf/invariant", - "@turf/point-grid", - "@turf/random", - "@turf/square-grid", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/random@7.2.0": { - "integrity": "sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/rectangle-grid@7.2.0": { - "integrity": "sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A==", - "dependencies": [ - "@turf/boolean-intersects", - "@turf/distance", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/rewind@7.2.0": { - "integrity": "sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA==", - "dependencies": [ - "@turf/boolean-clockwise", - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/rhumb-bearing@7.2.0": { - "integrity": "sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/rhumb-destination@7.2.0": { - "integrity": "sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/rhumb-distance@7.2.0": { - "integrity": "sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw==", - "dependencies": [ - "@turf/helpers", - "@turf/invariant", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/sample@7.2.0": { - "integrity": "sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/sector@7.2.0": { - "integrity": "sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w==", - "dependencies": [ - "@turf/circle", - "@turf/helpers", - "@turf/invariant", - "@turf/line-arc", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/shortest-path@7.2.0": { - "integrity": "sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA==", - "dependencies": [ - "@turf/bbox", - "@turf/bbox-polygon", - "@turf/boolean-point-in-polygon", - "@turf/clean-coords", - "@turf/distance", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/transform-scale", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/simplify@7.2.0": { - "integrity": "sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ==", - "dependencies": [ - "@turf/clean-coords", - "@turf/clone", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/square-grid@7.2.0": { - "integrity": "sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA==", - "dependencies": [ - "@turf/helpers", - "@turf/rectangle-grid", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/square@7.2.0": { - "integrity": "sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA==", - "dependencies": [ - "@turf/distance", - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/standard-deviational-ellipse@7.2.0": { - "integrity": "sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w==", - "dependencies": [ - "@turf/center-mean", - "@turf/ellipse", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/points-within-polygon", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/tag@7.2.0": { - "integrity": "sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA==", - "dependencies": [ - "@turf/boolean-point-in-polygon", - "@turf/clone", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/tesselate@7.2.0": { - "integrity": "sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "earcut@2.2.4", - "tslib@2.8.1" - ] - }, - "@turf/tin@7.2.0": { - "integrity": "sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg==", - "dependencies": [ - "@turf/helpers", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/transform-rotate@7.2.0": { - "integrity": "sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw==", - "dependencies": [ - "@turf/centroid", - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/rhumb-bearing", - "@turf/rhumb-destination", - "@turf/rhumb-distance", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/transform-scale@7.2.0": { - "integrity": "sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A==", - "dependencies": [ - "@turf/bbox", - "@turf/center", - "@turf/centroid", - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/rhumb-bearing", - "@turf/rhumb-destination", - "@turf/rhumb-distance", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/transform-translate@7.2.0": { - "integrity": "sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@turf/meta", - "@turf/rhumb-destination", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/triangle-grid@7.2.0": { - "integrity": "sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw==", - "dependencies": [ - "@turf/distance", - "@turf/helpers", - "@turf/intersect", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/truncate@7.2.0": { - "integrity": "sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/turf@7.2.0": { - "integrity": "sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw==", - "dependencies": [ - "@turf/along", - "@turf/angle", - "@turf/area", - "@turf/bbox", - "@turf/bbox-clip", - "@turf/bbox-polygon", - "@turf/bearing", - "@turf/bezier-spline", - "@turf/boolean-clockwise", - "@turf/boolean-concave", - "@turf/boolean-contains", - "@turf/boolean-crosses", - "@turf/boolean-disjoint", - "@turf/boolean-equal", - "@turf/boolean-intersects", - "@turf/boolean-overlap", - "@turf/boolean-parallel", - "@turf/boolean-point-in-polygon", - "@turf/boolean-point-on-line", - "@turf/boolean-touches", - "@turf/boolean-valid", - "@turf/boolean-within", - "@turf/buffer", - "@turf/center", - "@turf/center-mean", - "@turf/center-median", - "@turf/center-of-mass", - "@turf/centroid", - "@turf/circle", - "@turf/clean-coords", - "@turf/clone", - "@turf/clusters", - "@turf/clusters-dbscan", - "@turf/clusters-kmeans", - "@turf/collect", - "@turf/combine", - "@turf/concave", - "@turf/convex", - "@turf/destination", - "@turf/difference", - "@turf/dissolve", - "@turf/distance", - "@turf/distance-weight", - "@turf/ellipse", - "@turf/envelope", - "@turf/explode", - "@turf/flatten", - "@turf/flip", - "@turf/geojson-rbush", - "@turf/great-circle", - "@turf/helpers", - "@turf/hex-grid", - "@turf/interpolate", - "@turf/intersect", - "@turf/invariant", - "@turf/isobands", - "@turf/isolines", - "@turf/kinks", - "@turf/length", - "@turf/line-arc", - "@turf/line-chunk", - "@turf/line-intersect", - "@turf/line-offset", - "@turf/line-overlap", - "@turf/line-segment", - "@turf/line-slice", - "@turf/line-slice-along", - "@turf/line-split", - "@turf/line-to-polygon", - "@turf/mask", - "@turf/meta", - "@turf/midpoint", - "@turf/moran-index", - "@turf/nearest-neighbor-analysis", - "@turf/nearest-point", - "@turf/nearest-point-on-line", - "@turf/nearest-point-to-line", - "@turf/planepoint", - "@turf/point-grid", - "@turf/point-on-feature", - "@turf/point-to-line-distance", - "@turf/point-to-polygon-distance", - "@turf/points-within-polygon", - "@turf/polygon-smooth", - "@turf/polygon-tangents", - "@turf/polygon-to-line", - "@turf/polygonize", - "@turf/projection", - "@turf/quadrat-analysis", - "@turf/random", - "@turf/rectangle-grid", - "@turf/rewind", - "@turf/rhumb-bearing", - "@turf/rhumb-destination", - "@turf/rhumb-distance", - "@turf/sample", - "@turf/sector", - "@turf/shortest-path", - "@turf/simplify", - "@turf/square", - "@turf/square-grid", - "@turf/standard-deviational-ellipse", - "@turf/tag", - "@turf/tesselate", - "@turf/tin", - "@turf/transform-rotate", - "@turf/transform-scale", - "@turf/transform-translate", - "@turf/triangle-grid", - "@turf/truncate", - "@turf/union", - "@turf/unkink-polygon", - "@turf/voronoi", - "@types/geojson", - "tslib@2.8.1" - ] - }, - "@turf/union@7.2.0": { - "integrity": "sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g==", - "dependencies": [ - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "polyclip-ts", - "tslib@2.8.1" - ] - }, - "@turf/unkink-polygon@7.2.0": { - "integrity": "sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ==", - "dependencies": [ - "@turf/area", - "@turf/boolean-point-in-polygon", - "@turf/helpers", - "@turf/meta", - "@types/geojson", - "rbush@3.0.1", - "tslib@2.8.1" - ] - }, - "@turf/voronoi@7.2.0": { - "integrity": "sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw==", - "dependencies": [ - "@turf/clone", - "@turf/helpers", - "@turf/invariant", - "@types/d3-voronoi", - "@types/geojson", - "d3-voronoi", - "tslib@2.8.1" - ] - }, - "@tybys/wasm-util@0.9.0": { - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "@types/aria-query@5.0.4": { - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, - "@types/babel__core@7.20.5": { - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dependencies": [ - "@babel/parser", - "@babel/types", - "@types/babel__generator", - "@types/babel__template", - "@types/babel__traverse" - ] - }, - "@types/babel__generator@7.27.0": { - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dependencies": [ - "@babel/types" - ] - }, - "@types/babel__template@7.4.4": { - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": [ - "@babel/parser", - "@babel/types" - ] - }, - "@types/babel__traverse@7.20.7": { - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dependencies": [ - "@babel/types" - ] - }, - "@types/chai@5.2.2": { - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dependencies": [ - "@types/deep-eql" - ] - }, - "@types/chrome@0.0.329": { - "integrity": "sha512-jAZX4QMnAa1bTSWoQ5/EhhiY1t+1B7a5ZCY5ZEs61tWiQfxXAkfBSxCkQWhGxJoiq/4b4vtcmYEebNEmlLKecg==", - "dependencies": [ - "@types/filesystem", - "@types/har-format" - ] - }, - "@types/d3-voronoi@1.1.12": { - "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==" - }, - "@types/deep-eql@4.0.2": { - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" - }, - "@types/estree@1.0.8": { - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - }, - "@types/filesystem@0.0.36": { - "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", - "dependencies": [ - "@types/filewriter" - ] - }, - "@types/filewriter@0.0.33": { - "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==" - }, - "@types/geojson-vt@3.2.5": { - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "dependencies": [ - "@types/geojson" - ] - }, - "@types/geojson@7946.0.16": { - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" - }, - "@types/har-format@1.2.16": { - "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==" - }, - "@types/js-cookie@3.0.6": { - "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==" - }, - "@types/mapbox__point-geometry@0.1.4": { - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" - }, - "@types/mapbox__vector-tile@1.3.4": { - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "dependencies": [ - "@types/geojson", - "@types/mapbox__point-geometry", - "@types/pbf" - ] - }, - "@types/node@20.19.4": { - "integrity": "sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA==", - "dependencies": [ - "undici-types@6.21.0" - ] - }, - "@types/node@22.15.15": { - "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", - "dependencies": [ - "undici-types@6.21.0" - ] - }, - "@types/node@22.16.0": { - "integrity": "sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==", - "dependencies": [ - "undici-types@6.21.0" - ] - }, - "@types/node@24.0.10": { - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", - "dependencies": [ - "undici-types@7.8.0" - ] - }, - "@types/pbf@3.0.5": { - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" - }, - "@types/react-dom@19.1.6_@types+react@19.1.8": { - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", - "dependencies": [ - "@types/react" - ] - }, - "@types/react@19.1.8": { - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", - "dependencies": [ - "csstype" - ] - }, - "@types/serviceworker@0.0.140": { - "integrity": "sha512-9YBn/87nAamFtRCKEFZh2F+3Hs0UQzrxPgDbiqTgIS+F0LxbcVavgKtLhqSgSVF+OYtQM+fw8r3VXs7P1QpiXg==" - }, - "@types/supercluster@7.1.3": { - "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", - "dependencies": [ - "@types/geojson" - ] - }, - "@types/w3c-web-serial@1.0.8": { - "integrity": "sha512-QQOT+bxQJhRGXoZDZGLs3ksLud1dMNnMiSQtBA0w8KXvLpXX4oM4TZb6J0GgJ8UbCaHo5s9/4VQT8uXy9JER2A==" - }, - "@types/web-bluetooth@0.0.20": { - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" - }, - "@types/web-bluetooth@0.0.21": { - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==" - }, - "@types/whatwg-mimetype@3.0.2": { - "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==" - }, - "@vis.gl/react-mapbox@8.0.4_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-NFk0vsWcNzSs0YCsVdt2100Zli9QWR+pje8DacpLkkGEAXFaJsFtI1oKD0Hatiate4/iAIW39SQHhgfhbeEPfQ==", - "dependencies": [ - "react", - "react-dom" - ] - }, - "@vis.gl/react-maplibre@8.0.4_maplibre-gl@5.6.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-HwZyfLjEu+y1mUFvwDAkVxinGm8fEegaWN+O8np/WZ2Sqe5Lv6OXFpV6GWz9LOEvBYMbGuGk1FQdejo+4HCJ5w==", - "dependencies": [ - "@maplibre/maplibre-gl-style-spec@19.3.3", - "maplibre-gl", - "react", - "react-dom" - ], - "optionalPeers": [ - "maplibre-gl" - ] - }, - "@vitejs/plugin-react@4.6.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_@types+node@22.16.0": { - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", - "dependencies": [ - "@babel/core", - "@babel/plugin-transform-react-jsx-self", - "@babel/plugin-transform-react-jsx-source", - "@rolldown/pluginutils", - "@types/babel__core", - "react-refresh", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2" - ] - }, - "@vitejs/plugin-react@4.6.0_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@babel+core@7.28.0_@types+node@22.16.0_@types+node@22.15.15": { - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", - "dependencies": [ - "@babel/core", - "@babel/plugin-transform-react-jsx-self", - "@babel/plugin-transform-react-jsx-source", - "@rolldown/pluginutils", - "@types/babel__core", - "react-refresh", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15" - ] - }, - "@vitest/expect@3.2.4": { - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dependencies": [ - "@types/chai", - "@vitest/spy", - "@vitest/utils", - "chai", - "tinyrainbow" - ] - }, - "@vitest/mocker@3.2.4_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.16.0": { - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dependencies": [ - "@vitest/spy", - "estree-walker", - "magic-string", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2" - ], - "optionalPeers": [ - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2" - ] - }, - "@vitest/mocker@3.2.4_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.16.0_@types+node@22.15.15": { - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dependencies": [ - "@vitest/spy", - "estree-walker", - "magic-string", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15" - ], - "optionalPeers": [ - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15" - ] - }, - "@vitest/pretty-format@3.2.4": { - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dependencies": [ - "tinyrainbow" - ] - }, - "@vitest/runner@3.2.4": { - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dependencies": [ - "@vitest/utils", - "pathe", - "strip-literal" - ] - }, - "@vitest/snapshot@3.2.4": { - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dependencies": [ - "@vitest/pretty-format", - "magic-string", - "pathe" - ] - }, - "@vitest/spy@3.2.4": { - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dependencies": [ - "tinyspy" - ] - }, - "@vitest/utils@3.2.4": { - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dependencies": [ - "@vitest/pretty-format", - "loupe", - "tinyrainbow" - ] - }, - "acorn@8.15.0": { - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "bin": true - }, - "ansi-regex@5.0.1": { - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles@4.3.0": { - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": [ - "color-convert" - ] - }, - "ansi-styles@5.2.0": { - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - }, - "ansis@4.1.0": { - "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==" - }, - "anymatch@3.1.3": { - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": [ - "normalize-path", - "picomatch@2.3.1" - ] - }, - "aria-hidden@1.2.6": { - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "aria-query@5.3.0": { - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": [ - "dequal" - ] - }, - "aria-query@5.3.2": { - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" - }, - "arr-union@3.1.0": { - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" - }, - "assertion-error@2.0.1": { - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - }, - "assign-symbols@1.0.0": { - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" - }, - "ast-types@0.16.1": { - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "autoprefixer@10.4.21_postcss@8.5.6": { - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dependencies": [ - "browserslist", - "caniuse-lite", - "fraction.js", - "normalize-range", - "picocolors", - "postcss", - "postcss-value-parser" - ], - "bin": true - }, - "babel-dead-code-elimination@1.0.10": { - "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", - "dependencies": [ - "@babel/core", - "@babel/parser", - "@babel/traverse", - "@babel/types" - ] - }, - "base64-js@1.5.1": { - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bignumber.js@9.3.0": { - "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==" - }, - "binary-extensions@2.3.0": { - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" - }, - "braces@3.0.3": { - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": [ - "fill-range" - ] - }, - "browserslist@4.25.1": { - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dependencies": [ - "caniuse-lite", - "electron-to-chromium", - "node-releases", - "update-browserslist-db" - ], - "bin": true - }, - "buffer-from@1.1.2": { - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "bytewise-core@1.2.3": { - "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", - "dependencies": [ - "typewise-core" - ] - }, - "bytewise@1.1.0": { - "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", - "dependencies": [ - "bytewise-core", - "typewise" - ] - }, - "cac@6.7.14": { - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" - }, - "caniuse-lite@1.0.30001727": { - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==" - }, - "chai@5.2.0": { - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dependencies": [ - "assertion-error", - "check-error", - "deep-eql", - "loupe", - "pathval" - ] - }, - "chalk@3.0.0": { - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": [ - "ansi-styles@4.3.0", - "supports-color" - ] - }, - "chalk@4.1.2": { - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": [ - "ansi-styles@4.3.0", - "supports-color" - ] - }, - "check-error@2.1.1": { - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==" - }, - "chokidar@3.6.0": { - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": [ - "anymatch", - "braces", - "glob-parent", - "is-binary-path", - "is-glob", - "normalize-path", - "readdirp" - ], - "optionalDependencies": [ - "fsevents" - ] - }, - "chownr@3.0.0": { - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, - "class-variance-authority@0.7.1": { - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "dependencies": [ - "clsx" - ] - }, - "cliui@8.0.1": { - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": [ - "string-width", - "strip-ansi", - "wrap-ansi" - ] - }, - "clsx@2.1.1": { - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" - }, - "cmdk@1.1.1_react@19.1.0_react-dom@19.1.0__react@19.1.0_@types+react@19.1.8_@types+react-dom@19.1.6__@types+react@19.1.8": { - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "dependencies": [ - "@radix-ui/react-compose-refs", - "@radix-ui/react-dialog", - "@radix-ui/react-id", - "@radix-ui/react-primitive", - "react", - "react-dom" - ] - }, - "color-convert@2.0.1": { - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": [ - "color-name" - ] - }, - "color-name@1.1.4": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "commander@12.1.0": { - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==" - }, - "commander@2.20.3": { - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "concaveman@1.2.1": { - "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", - "dependencies": [ - "point-in-polygon", - "rbush@3.0.1", - "robust-predicates@2.0.4", - "tinyqueue@2.0.3" - ] - }, - "convert-source-map@2.0.0": { - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "cookie-es@1.2.2": { - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" - }, - "core-util-is@1.0.3": { - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "crc@4.3.2": { - "integrity": "sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==" - }, - "cross-fetch@4.0.0": { - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": [ - "node-fetch" - ] - }, - "crypto-random-string@5.0.0": { - "integrity": "sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==", - "dependencies": [ - "type-fest" - ] - }, - "css.escape@1.5.1": { - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "csstype@3.1.3": { - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "d3-array@1.2.4": { - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-geo@1.7.1": { - "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", - "dependencies": [ - "d3-array" - ] - }, - "d3-voronoi@1.1.2": { - "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" - }, - "debug@4.4.1": { - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dependencies": [ - "ms" - ] - }, - "deep-eql@5.0.2": { - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" - }, - "dequal@2.0.3": { - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "detect-libc@2.0.4": { - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" - }, - "detect-node-es@1.1.0": { - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "diff@8.0.2": { - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==" - }, - "dom-accessibility-api@0.5.16": { - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "dom-accessibility-api@0.6.3": { - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" - }, - "duplex-maker@1.0.0": { - "integrity": "sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA==" - }, - "duplexify@3.7.1": { - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": [ - "end-of-stream", - "inherits", - "readable-stream@2.3.8", - "stream-shift" - ] - }, - "earcut@2.2.4": { - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "earcut@3.0.1": { - "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==" - }, - "electron-to-chromium@1.5.180": { - "integrity": "sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==" - }, - "emoji-regex@8.0.0": { - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "end-of-stream@1.4.5": { - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dependencies": [ - "once" - ] - }, - "enhanced-resolve@5.18.2": { - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "dependencies": [ - "graceful-fs", - "tapable" - ] - }, - "es-module-lexer@1.7.0": { - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" - }, - "esbuild@0.25.6": { - "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", - "optionalDependencies": [ - "@esbuild/aix-ppc64", - "@esbuild/android-arm", - "@esbuild/android-arm64", - "@esbuild/android-x64", - "@esbuild/darwin-arm64", - "@esbuild/darwin-x64", - "@esbuild/freebsd-arm64", - "@esbuild/freebsd-x64", - "@esbuild/linux-arm", - "@esbuild/linux-arm64", - "@esbuild/linux-ia32", - "@esbuild/linux-loong64", - "@esbuild/linux-mips64el", - "@esbuild/linux-ppc64", - "@esbuild/linux-riscv64", - "@esbuild/linux-s390x", - "@esbuild/linux-x64", - "@esbuild/netbsd-arm64", - "@esbuild/netbsd-x64", - "@esbuild/openbsd-arm64", - "@esbuild/openbsd-x64", - "@esbuild/openharmony-arm64", - "@esbuild/sunos-x64", - "@esbuild/win32-arm64", - "@esbuild/win32-ia32", - "@esbuild/win32-x64" - ], - "scripts": true, - "bin": true - }, - "escalade@3.2.0": { - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - }, - "esprima@4.0.1": { - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": true - }, - "estree-walker@3.0.3": { - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": [ - "@types/estree" - ] - }, - "expect-type@1.2.2": { - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==" - }, - "extend-shallow@2.0.1": { - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": [ - "is-extendable@0.1.1" - ] - }, - "extend-shallow@3.0.2": { - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dependencies": [ - "assign-symbols", - "is-extendable@1.0.1" - ] - }, - "fast-deep-equal@3.1.3": { - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fdir@6.4.6_picomatch@4.0.2": { - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dependencies": [ - "picomatch@4.0.2" - ], - "optionalPeers": [ - "picomatch@4.0.2" - ] - }, - "fill-range@7.1.1": { - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": [ - "to-regex-range" - ] - }, - "fraction.js@4.3.7": { - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" - }, - "fsevents@2.3.3": { - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "os": ["darwin"], - "scripts": true - }, - "gensync@1.0.0-beta.2": { - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "geojson-equality-ts@1.0.2": { - "integrity": "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==", - "dependencies": [ - "@types/geojson" - ] - }, - "geojson-polygon-self-intersections@1.2.1": { - "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==", - "dependencies": [ - "rbush@2.0.2" - ] - }, - "geojson-vt@4.0.2": { - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" - }, - "get-caller-file@2.0.5": { - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-nonce@1.0.1": { - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" - }, - "get-stream@6.0.1": { - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-tsconfig@4.10.1": { - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "dependencies": [ - "resolve-pkg-maps" - ] - }, - "get-value@2.0.6": { - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" - }, - "gl-matrix@3.4.3": { - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" - }, - "glob-parent@5.1.2": { - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": [ - "is-glob" - ] - }, - "global-prefix@4.0.0": { - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "dependencies": [ - "ini", - "kind-of", - "which" - ] - }, - "goober@2.1.16_csstype@3.1.3": { - "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", - "dependencies": [ - "csstype" - ] - }, - "graceful-fs@4.2.11": { - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "gzipper@8.2.1": { - "integrity": "sha512-Vp2vDpwU4xKtWxTaLPfNTR4euqHJamB6aKCfSEbSd/CrgqihwNxrjihJcWJG1+3Ku1ROsfF6fPXRoytTFLhFlw==", - "dependencies": [ - "@gfx/zopfli", - "commander@12.1.0", - "simple-zstd" - ], - "bin": true - }, - "happy-dom@18.0.1": { - "integrity": "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==", - "dependencies": [ - "@types/node@20.19.4", - "@types/whatwg-mimetype", - "whatwg-mimetype" - ] - }, - "has-flag@4.0.0": { - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "html-parse-stringify@3.0.1": { - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "dependencies": [ - "void-elements" - ] - }, - "i18next-browser-languagedetector@8.2.0": { - "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", - "dependencies": [ - "@babel/runtime" - ] - }, - "i18next-http-backend@3.0.2": { - "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", - "dependencies": [ - "cross-fetch" - ] - }, - "i18next@25.3.1_typescript@5.8.3": { - "integrity": "sha512-S4CPAx8LfMOnURnnJa8jFWvur+UX/LWcl6+61p9VV7SK2m0445JeBJ6tLD0D5SR0H29G4PYfWkEhivKG5p4RDg==", - "dependencies": [ - "@babel/runtime", - "typescript" - ], - "optionalPeers": [ - "typescript" - ] - }, - "idb-keyval@6.2.2": { - "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==" - }, - "ieee754@1.2.1": { - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immer@10.1.1": { - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==" - }, - "indent-string@4.0.0": { - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini@4.1.3": { - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" - }, - "is-binary-path@2.1.0": { - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": [ - "binary-extensions" - ] - }, - "is-extendable@0.1.1": { - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "is-extendable@1.0.1": { - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": [ - "is-plain-object" - ] - }, - "is-extglob@2.1.1": { - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point@3.0.0": { - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob@4.0.3": { - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": [ - "is-extglob" - ] - }, - "is-number@7.0.0": { - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-object@2.0.4": { - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": [ - "isobject" - ] - }, - "is-zst@1.0.0": { - "integrity": "sha512-ZA5lvshKAl8z30dX7saXLpVhpsq3d2EHK9uf7qtUjnOtdw4XBpAoWb2RvZ5kyoaebdoidnGI0g2hn9Z7ObPbww==" - }, - "isarray@1.0.0": { - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isbot@5.1.28": { - "integrity": "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==" - }, - "isexe@3.1.1": { - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" - }, - "isobject@3.0.1": { - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "jiti@2.4.2": { - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": true - }, - "js-cookie@3.0.5": { - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" - }, - "js-tokens@4.0.0": { - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-tokens@9.0.1": { - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "jsesc@3.1.0": { - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "bin": true - }, - "json-stringify-pretty-compact@3.0.0": { - "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" - }, - "json-stringify-pretty-compact@4.0.0": { - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" - }, - "json5@2.2.3": { - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": true - }, - "jsts@2.7.1": { - "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==" - }, - "kdbush@4.0.2": { - "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" - }, - "kind-of@6.0.3": { - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "lightningcss-darwin-arm64@1.30.1": { - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "lightningcss-darwin-x64@1.30.1": { - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "lightningcss-freebsd-x64@1.30.1": { - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "lightningcss-linux-arm-gnueabihf@1.30.1": { - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "os": ["linux"], - "cpu": ["arm"] - }, - "lightningcss-linux-arm64-gnu@1.30.1": { - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "lightningcss-linux-arm64-musl@1.30.1": { - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "lightningcss-linux-x64-gnu@1.30.1": { - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "os": ["linux"], - "cpu": ["x64"] - }, - "lightningcss-linux-x64-musl@1.30.1": { - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "os": ["linux"], - "cpu": ["x64"] - }, - "lightningcss-win32-arm64-msvc@1.30.1": { - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "lightningcss-win32-x64-msvc@1.30.1": { - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "os": ["win32"], - "cpu": ["x64"] - }, - "lightningcss@1.30.1": { - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dependencies": [ - "detect-libc" - ], - "optionalDependencies": [ - "lightningcss-darwin-arm64", - "lightningcss-darwin-x64", - "lightningcss-freebsd-x64", - "lightningcss-linux-arm-gnueabihf", - "lightningcss-linux-arm64-gnu", - "lightningcss-linux-arm64-musl", - "lightningcss-linux-x64-gnu", - "lightningcss-linux-x64-musl", - "lightningcss-win32-arm64-msvc", - "lightningcss-win32-x64-msvc" - ] - }, - "lodash.isequal@4.5.0": { - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": true - }, - "lodash@4.17.21": { - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "loupe@3.1.4": { - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==" - }, - "lru-cache@5.1.1": { - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": [ - "yallist@3.1.1" - ] - }, - "lucide-react@0.525.0_react@19.1.0": { - "integrity": "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==", - "dependencies": [ - "react" - ] - }, - "lz-string@1.5.0": { - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": true - }, - "magic-string@0.30.17": { - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": [ - "@jridgewell/sourcemap-codec" - ] - }, - "maplibre-gl@5.6.1": { - "integrity": "sha512-TTSfoTaF7RqKUR9wR5qDxCHH2J1XfZ1E85luiLOx0h8r50T/LnwAwwfV0WVNh9o8dA7rwt57Ucivf1emyeukXg==", - "dependencies": [ - "@mapbox/geojson-rewind", - "@mapbox/jsonlint-lines-primitives", - "@mapbox/point-geometry", - "@mapbox/tiny-sdf", - "@mapbox/unitbezier", - "@mapbox/vector-tile", - "@mapbox/whoots-js", - "@maplibre/maplibre-gl-style-spec@23.3.0", - "@types/geojson", - "@types/geojson-vt", - "@types/mapbox__point-geometry", - "@types/mapbox__vector-tile", - "@types/pbf", - "@types/supercluster", - "earcut@3.0.1", - "geojson-vt", - "gl-matrix", - "global-prefix", - "kdbush", - "murmurhash-js", - "pbf", - "potpack", - "quickselect@3.0.0", - "supercluster", - "tinyqueue@3.0.0", - "vt-pbf" - ] - }, - "marchingsquares@1.3.3": { - "integrity": "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==" - }, - "min-indent@1.0.1": { - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "minimist@1.2.8": { - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass@7.1.2": { - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - }, - "minizlib@3.0.2": { - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dependencies": [ - "minipass" - ] - }, - "mkdirp@3.0.1": { - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": true - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "murmurhash-js@1.0.0": { - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" - }, - "nanoid@3.3.11": { - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "bin": true - }, - "node-fetch@2.7.0": { - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": [ - "whatwg-url" - ] - }, - "node-releases@2.0.19": { - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "normalize-path@3.0.0": { - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range@0.1.2": { - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, - "once@1.4.0": { - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": [ - "wrappy" - ] - }, - "pathe@2.0.3": { - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "pathval@2.0.1": { - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==" - }, - "pbf@3.3.0": { - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", - "dependencies": [ - "ieee754", - "resolve-protobuf-schema" - ], - "bin": true - }, - "peek-stream@1.1.3": { - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dependencies": [ - "buffer-from", - "duplexify", - "through2@2.0.5" - ] - }, - "picocolors@1.1.1": { - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch@2.3.1": { - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "picomatch@4.0.2": { - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" - }, - "point-in-polygon-hao@1.2.4": { - "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", - "dependencies": [ - "robust-predicates@3.0.2" - ] - }, - "point-in-polygon@1.1.0": { - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" - }, - "polyclip-ts@0.16.8": { - "integrity": "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==", - "dependencies": [ - "bignumber.js", - "splaytree-ts" - ] - }, - "postcss-value-parser@4.2.0": { - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "postcss@8.5.6": { - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dependencies": [ - "nanoid", - "picocolors", - "source-map-js" - ] - }, - "potpack@2.0.0": { - "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" - }, - "prettier@3.6.2": { - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "bin": true - }, - "pretty-format@27.5.1": { - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": [ - "ansi-regex", - "ansi-styles@5.2.0", - "react-is" - ] - }, - "process-nextick-args@2.0.1": { - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "process-streams@1.0.3": { - "integrity": "sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA==", - "dependencies": [ - "duplex-maker" - ] - }, - "protocol-buffers-schema@3.6.0": { - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, - "qrcode-generator@1.5.2": { - "integrity": "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==" - }, - "quickselect@1.1.1": { - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" - }, - "quickselect@2.0.0": { - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "quickselect@3.0.0": { - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" - }, - "rbush@2.0.2": { - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", - "dependencies": [ - "quickselect@1.1.1" - ] - }, - "rbush@3.0.1": { - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "dependencies": [ - "quickselect@2.0.0" - ] - }, - "react-dom@19.1.0_react@19.1.0": { - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "dependencies": [ - "react", - "scheduler" - ] - }, - "react-error-boundary@6.0.0_react@19.1.0": { - "integrity": "sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==", - "dependencies": [ - "@babel/runtime", - "react" - ] - }, - "react-hook-form@7.60.0_react@19.1.0": { - "integrity": "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==", - "dependencies": [ - "react" - ] - }, - "react-i18next@15.6.0_i18next@25.3.1__typescript@5.8.3_react@19.1.0_typescript@5.8.3": { - "integrity": "sha512-W135dB0rDfiFmbMipC17nOhGdttO5mzH8BivY+2ybsQBbXvxWIwl3cmeH3T9d+YPBSJu/ouyJKFJTtkK7rJofw==", - "dependencies": [ - "@babel/runtime", - "html-parse-stringify", - "i18next", - "react", - "typescript" - ], - "optionalPeers": [ - "typescript" - ] - }, - "react-is@17.0.2": { - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "react-map-gl@8.0.4_maplibre-gl@5.6.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-SHdpvFIvswsZBg6BCPcwY/nbKuCo3sJM1Cj7Sd+gA3gFRFOixD+KtZ2XSuUWq2WySL2emYEXEgrLZoXsV4Ut4Q==", - "dependencies": [ - "@vis.gl/react-mapbox", - "@vis.gl/react-maplibre", - "maplibre-gl", - "react", - "react-dom" - ], - "optionalPeers": [ - "maplibre-gl" - ] - }, - "react-qrcode-logo@3.0.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": { - "integrity": "sha512-2+vZ3GNBdUpYxIKyt6SFZsDGXa0xniyUQ0wPI4O0hJTzRjttPIx1pPnH9IWQmp/4nDMoN47IBhi3Breu1KudYw==", - "dependencies": [ - "lodash.isequal", - "qrcode-generator", - "react", - "react-dom" - ] - }, - "react-refresh@0.17.0": { - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==" - }, - "react-remove-scroll-bar@2.3.8_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "dependencies": [ - "@types/react", - "react", - "react-style-singleton", - "tslib@2.8.1" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "react-remove-scroll@2.7.1_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "dependencies": [ - "@types/react", - "react", - "react-remove-scroll-bar", - "react-style-singleton", - "tslib@2.8.1", - "use-callback-ref", - "use-sidecar" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "react-style-singleton@2.2.3_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "dependencies": [ - "@types/react", - "get-nonce", - "react", - "tslib@2.8.1" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "react@19.1.0": { - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==" - }, - "readable-stream@2.3.8": { - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": [ - "core-util-is", - "inherits", - "isarray", - "process-nextick-args", - "safe-buffer@5.1.2", - "string_decoder@1.1.1", - "util-deprecate" - ] - }, - "readable-stream@3.6.2": { - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": [ - "inherits", - "string_decoder@1.3.0", - "util-deprecate" - ] - }, - "readdirp@3.6.0": { - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": [ - "picomatch@2.3.1" - ] - }, - "recast@0.23.11": { - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", - "dependencies": [ - "ast-types", - "esprima", - "source-map@0.6.1", - "tiny-invariant", - "tslib@2.8.1" - ] - }, - "redent@3.0.0": { - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": [ - "indent-string", - "strip-indent" - ] - }, - "require-directory@2.1.1": { - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve-pkg-maps@1.0.0": { - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - }, - "resolve-protobuf-schema@2.1.0": { - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dependencies": [ - "protocol-buffers-schema" - ] - }, - "rfc4648@1.5.4": { - "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==" - }, - "robust-predicates@2.0.4": { - "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" - }, - "robust-predicates@3.0.2": { - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" - }, - "rollup@4.44.2": { - "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==", - "dependencies": [ - "@types/estree" - ], - "optionalDependencies": [ - "@rollup/rollup-android-arm-eabi", - "@rollup/rollup-android-arm64", - "@rollup/rollup-darwin-arm64", - "@rollup/rollup-darwin-x64", - "@rollup/rollup-freebsd-arm64", - "@rollup/rollup-freebsd-x64", - "@rollup/rollup-linux-arm-gnueabihf", - "@rollup/rollup-linux-arm-musleabihf", - "@rollup/rollup-linux-arm64-gnu", - "@rollup/rollup-linux-arm64-musl", - "@rollup/rollup-linux-loongarch64-gnu", - "@rollup/rollup-linux-powerpc64le-gnu", - "@rollup/rollup-linux-riscv64-gnu", - "@rollup/rollup-linux-riscv64-musl", - "@rollup/rollup-linux-s390x-gnu", - "@rollup/rollup-linux-x64-gnu", - "@rollup/rollup-linux-x64-musl", - "@rollup/rollup-win32-arm64-msvc", - "@rollup/rollup-win32-ia32-msvc", - "@rollup/rollup-win32-x64-msvc", - "fsevents" - ], - "bin": true - }, - "rw@1.3.3": { - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "rxjs@6.6.7": { - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": [ - "tslib@1.14.1" - ] - }, - "safe-buffer@5.1.2": { - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "scheduler@0.26.0": { - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" - }, - "semver@6.3.1": { - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": true - }, - "seroval-plugins@1.3.2_seroval@1.3.2": { - "integrity": "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==", - "dependencies": [ - "seroval" - ] - }, - "seroval@1.3.2": { - "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==" - }, - "set-value@2.0.1": { - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": [ - "extend-shallow@2.0.1", - "is-extendable@0.1.1", - "is-plain-object", - "split-string" - ] - }, - "siginfo@2.0.0": { - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "simple-git-hooks@2.13.0": { - "integrity": "sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA==", - "scripts": true, - "bin": true - }, - "simple-zstd@1.4.2": { - "integrity": "sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A==", - "dependencies": [ - "is-zst", - "peek-stream", - "process-streams", - "through2@4.0.2" - ] - }, - "skmeans@0.9.7": { - "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" - }, - "solid-js@1.9.7_seroval@1.3.2": { - "integrity": "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==", - "dependencies": [ - "csstype", - "seroval", - "seroval-plugins" - ] - }, - "sort-asc@0.2.0": { - "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==" - }, - "sort-desc@0.2.0": { - "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==" - }, - "sort-object@3.0.3": { - "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", - "dependencies": [ - "bytewise", - "get-value", - "is-extendable@0.1.1", - "sort-asc", - "sort-desc", - "union-value" - ] - }, - "source-map-js@1.2.1": { - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "source-map@0.6.1": { - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map@0.7.4": { - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "splaytree-ts@1.0.2": { - "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==" - }, - "split-string@3.1.0": { - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": [ - "extend-shallow@3.0.2" - ] - }, - "stackback@0.0.2": { - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "std-env@3.9.0": { - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==" - }, - "ste-core@3.0.11": { - "integrity": "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg==" - }, - "ste-simple-events@3.0.11": { - "integrity": "sha512-PDoQajqiTtJLNDWfJCihzACiTVZyFsXi6hNAVNelNJoNmqj+BaWuhJ/NHaAHxzfSRoMbL+hFgfPqFmxiHhAQSQ==", - "dependencies": [ - "ste-core" - ] - }, - "stream-shift@1.0.3": { - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "string-width@4.2.3": { - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": [ - "emoji-regex", - "is-fullwidth-code-point", - "strip-ansi" - ] - }, - "string_decoder@1.1.1": { - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": [ - "safe-buffer@5.1.2" - ] - }, - "string_decoder@1.3.0": { - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": [ - "safe-buffer@5.2.1" - ] - }, - "strip-ansi@6.0.1": { - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": [ - "ansi-regex" - ] - }, - "strip-indent@3.0.0": { - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": [ - "min-indent" - ] - }, - "strip-literal@3.0.0": { - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dependencies": [ - "js-tokens@9.0.1" - ] - }, - "supercluster@8.0.1": { - "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", - "dependencies": [ - "kdbush" - ] - }, - "supports-color@7.2.0": { - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": [ - "has-flag" - ] - }, - "sweepline-intersections@1.5.0": { - "integrity": "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==", - "dependencies": [ - "tinyqueue@2.0.3" - ] - }, - "tailwind-merge@3.3.1": { - "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==" - }, - "tailwindcss-animate@1.0.7_tailwindcss@4.1.11": { - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "dependencies": [ - "tailwindcss" - ] - }, - "tailwindcss@4.1.11": { - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==" - }, - "tapable@2.2.2": { - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==" - }, - "tar@7.4.3": { - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dependencies": [ - "@isaacs/fs-minipass", - "chownr", - "minipass", - "minizlib", - "mkdirp", - "yallist@5.0.0" - ] - }, - "testing-library@0.0.2_@angular+common@6.1.10__@angular+core@6.1.10___rxjs@6.6.7___zone.js@0.8.29__rxjs@6.6.7_@angular+core@6.1.10__rxjs@6.6.7__zone.js@0.8.29": { - "integrity": "sha512-KCbqCCllbgiCXOgmh9MdsgdJ05pmimXGuggtC78pzpxpq/40A3bS+NJoqwCIqZbNnMr6KIZ2mlMZoZCkWVnaWw==", - "dependencies": [ - "@angular/common", - "@angular/core", - "tslib@1.14.1" - ] - }, - "through2@2.0.5": { - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": [ - "readable-stream@2.3.8", - "xtend" - ] - }, - "through2@4.0.2": { - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": [ - "readable-stream@3.6.2" - ] - }, - "tiny-invariant@1.3.3": { - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "tiny-warning@1.0.3": { - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tinybench@2.9.0": { - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "tinyexec@0.3.2": { - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - }, - "tinyglobby@0.2.14_picomatch@4.0.2": { - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dependencies": [ - "fdir", - "picomatch@4.0.2" - ] - }, - "tinypool@1.1.1": { - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==" - }, - "tinyqueue@2.0.3": { - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "tinyqueue@3.0.0": { - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" - }, - "tinyrainbow@2.0.0": { - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==" - }, - "tinyspy@4.0.3": { - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==" - }, - "to-regex-range@5.0.1": { - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": [ - "is-number" - ] - }, - "topojson-client@3.1.0": { - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "dependencies": [ - "commander@2.20.3" - ], - "bin": true - }, - "topojson-server@3.0.1": { - "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", - "dependencies": [ - "commander@2.20.3" - ], - "bin": true - }, - "tr46@0.0.3": { - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tslib@1.14.1": { - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tslib@2.8.1": { - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "tslog@4.9.3": { - "integrity": "sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==" - }, - "tsx@4.20.3": { - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", - "dependencies": [ - "esbuild", - "get-tsconfig" - ], - "optionalDependencies": [ - "fsevents" - ], - "bin": true - }, - "type-fest@2.19.0": { - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "typescript@5.8.3": { - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "bin": true - }, - "typewise-core@1.2.0": { - "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" - }, - "typewise@1.0.3": { - "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", - "dependencies": [ - "typewise-core" - ] - }, - "undici-types@6.21.0": { - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - }, - "undici-types@7.8.0": { - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" - }, - "union-value@1.0.1": { - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": [ - "arr-union", - "get-value", - "is-extendable@0.1.1", - "set-value" - ] - }, - "unplugin@2.3.5": { - "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", - "dependencies": [ - "acorn", - "picomatch@4.0.2", - "webpack-virtual-modules" - ] - }, - "update-browserslist-db@1.1.3_browserslist@4.25.1": { - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dependencies": [ - "browserslist", - "escalade", - "picocolors" - ], - "bin": true - }, - "use-callback-ref@1.3.3_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "dependencies": [ - "@types/react", - "react", - "tslib@2.8.1" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "use-sidecar@1.1.3_@types+react@19.1.8_react@19.1.0": { - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "dependencies": [ - "@types/react", - "detect-node-es", - "react", - "tslib@2.8.1" - ], - "optionalPeers": [ - "@types/react" - ] - }, - "use-sync-external-store@1.5.0_react@19.1.0": { - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "dependencies": [ - "react" - ] - }, - "util-deprecate@1.0.2": { - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "vite-node@3.2.4_@types+node@22.16.0": { - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dependencies": [ - "cac", - "debug", - "es-module-lexer", - "pathe", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2" - ], - "bin": true - }, - "vite-node@3.2.4_@types+node@22.16.0_@types+node@22.15.15": { - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dependencies": [ - "cac", - "debug", - "es-module-lexer", - "pathe", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15" - ], - "bin": true - }, - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2": { - "integrity": "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==", - "dependencies": [ - "@types/node@22.16.0", - "esbuild", - "fdir", - "picomatch@4.0.2", - "postcss", - "rollup", - "tinyglobby" - ], - "optionalDependencies": [ - "fsevents" - ], - "optionalPeers": [ - "@types/node@22.16.0" - ], - "bin": true - }, - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15": { - "integrity": "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==", - "dependencies": [ - "@types/node@22.15.15", - "esbuild", - "fdir", - "picomatch@4.0.2", - "postcss", - "rollup", - "tinyglobby" - ], - "optionalDependencies": [ - "fsevents" - ], - "optionalPeers": [ - "@types/node@22.15.15" - ], - "bin": true - }, - "vitest@3.2.4_@types+node@22.16.0_happy-dom@18.0.1_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2": { - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dependencies": [ - "@types/chai", - "@types/node@22.16.0", - "@vitest/expect", - "@vitest/mocker@3.2.4_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.16.0", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "chai", - "debug", - "expect-type", - "happy-dom", - "magic-string", - "pathe", - "picomatch@4.0.2", - "std-env", - "tinybench", - "tinyexec", - "tinyglobby", - "tinypool", - "tinyrainbow", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2", - "vite-node@3.2.4_@types+node@22.16.0", - "why-is-node-running" - ], - "optionalPeers": [ - "@types/node@22.16.0", - "happy-dom" - ], - "bin": true - }, - "vitest@3.2.4_@types+node@22.16.0_happy-dom@18.0.1_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.15.15": { - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dependencies": [ - "@types/chai", - "@types/node@22.15.15", - "@vitest/expect", - "@vitest/mocker@3.2.4_vite@7.0.2__@types+node@22.16.0__picomatch@4.0.2_@types+node@22.16.0_@types+node@22.15.15", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "chai", - "debug", - "expect-type", - "happy-dom", - "magic-string", - "pathe", - "picomatch@4.0.2", - "std-env", - "tinybench", - "tinyexec", - "tinyglobby", - "tinypool", - "tinyrainbow", - "vite@7.0.2_@types+node@22.16.0_picomatch@4.0.2_@types+node@22.15.15", - "vite-node@3.2.4_@types+node@22.16.0_@types+node@22.15.15", - "why-is-node-running" - ], - "optionalPeers": [ - "@types/node@22.15.15", - "happy-dom" - ], - "bin": true - }, - "void-elements@3.1.0": { - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" - }, - "vt-pbf@3.1.3": { - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "dependencies": [ - "@mapbox/point-geometry", - "@mapbox/vector-tile", - "pbf" - ] - }, - "webidl-conversions@3.0.1": { - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack-virtual-modules@0.6.2": { - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" - }, - "whatwg-mimetype@3.0.0": { - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" - }, - "whatwg-url@5.0.0": { - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": [ - "tr46", - "webidl-conversions" - ] - }, - "which@4.0.0": { - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dependencies": [ - "isexe" - ], - "bin": true - }, - "why-is-node-running@2.3.0": { - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": [ - "siginfo", - "stackback" - ], - "bin": true - }, - "wrap-ansi@7.0.0": { - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": [ - "ansi-styles@4.3.0", - "string-width", - "strip-ansi" - ] - }, - "wrappy@1.0.2": { - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "xtend@4.0.2": { - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n@5.0.8": { - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist@3.1.1": { - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yallist@5.0.0": { - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - }, - "yargs-parser@21.1.1": { - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - }, - "yargs@17.7.2": { - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": [ - "cliui", - "escalade", - "get-caller-file", - "require-directory", - "string-width", - "y18n", - "yargs-parser" - ] - }, - "zod@3.25.75": { - "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==" - }, - "zone.js@0.8.29": { - "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" - }, - "zustand@5.0.6_@types+react@19.1.8_immer@10.1.1_react@19.1.0": { - "integrity": "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==", - "dependencies": [ - "@types/react", - "immer", - "react" - ], - "optionalPeers": [ - "@types/react", - "immer", - "react" - ] - } - }, - "workspace": { - "dependencies": [ - "jsr:@deno/dnt@~0.42.1", - "jsr:@meshtastic/protobufs@^2.7.0", - "npm:@bufbuild/protobuf@^2.2.3", - "npm:@types/node@^22.13.10", - "npm:ste-simple-events@^3.0.11", - "npm:tslog@^4.9.3" - ], - "members": { - "packages/core": { - "dependencies": [ - "npm:crc@^4.3.2" - ] - }, - "packages/transport-web-bluetooth": { - "dependencies": [ - "npm:@types/web-bluetooth@^0.0.20" - ] - }, - "packages/transport-web-serial": { - "dependencies": [ - "npm:@types/w3c-web-serial@^1.0.7" - ] - }, - "packages/web": { - "dependencies": [ - "jsr:@std/path@^1.1.0", - "npm:@types/w3c-web-serial@*", - "npm:@types/web-bluetooth@*" - ], - "packageJson": { - "dependencies": [ - "npm:@bufbuild/protobuf@^2.6.0", - "npm:@hookform/resolvers@^5.1.1", - "npm:@jsr/meshtastic__core@2.6.4", - "npm:@jsr/meshtastic__js@2.6.0-0", - "npm:@jsr/meshtastic__transport-http@*", - "npm:@jsr/meshtastic__transport-web-bluetooth@*", - "npm:@jsr/meshtastic__transport-web-serial@*", - "npm:@noble/curves@^1.9.2", - "npm:@radix-ui/react-accordion@^1.2.11", - "npm:@radix-ui/react-checkbox@^1.3.2", - "npm:@radix-ui/react-dialog@^1.1.14", - "npm:@radix-ui/react-dropdown-menu@^2.1.15", - "npm:@radix-ui/react-label@^2.1.7", - "npm:@radix-ui/react-menubar@^1.1.15", - "npm:@radix-ui/react-popover@^1.1.14", - "npm:@radix-ui/react-scroll-area@^1.2.9", - "npm:@radix-ui/react-select@^2.2.5", - "npm:@radix-ui/react-separator@^1.1.7", - "npm:@radix-ui/react-slider@^1.3.5", - "npm:@radix-ui/react-switch@^1.2.5", - "npm:@radix-ui/react-tabs@^1.1.12", - "npm:@radix-ui/react-toast@^1.2.14", - "npm:@radix-ui/react-toggle-group@^1.1.10", - "npm:@radix-ui/react-tooltip@^1.2.7", - "npm:@tailwindcss/postcss@^4.1.11", - "npm:@tanstack/react-router-devtools@^1.125.4", - "npm:@tanstack/react-router@^1.125.4", - "npm:@tanstack/router-cli@^1.125.4", - "npm:@tanstack/router-devtools@^1.125.4", - "npm:@tanstack/router-plugin@^1.125.5", - "npm:@testing-library/jest-dom@^6.6.3", - "npm:@testing-library/react@^16.3.0", - "npm:@testing-library/user-event@^14.6.1", - "npm:@turf/turf@^7.2.0", - "npm:@types/chrome@^0.0.329", - "npm:@types/js-cookie@^3.0.6", - "npm:@types/node@^24.0.10", - "npm:@types/react-dom@^19.1.6", - "npm:@types/react@^19.1.8", - "npm:@types/serviceworker@^0.0.140", - "npm:@types/w3c-web-serial@^1.0.8", - "npm:@types/web-bluetooth@^0.0.21", - "npm:@vitejs/plugin-react@^4.6.0", - "npm:autoprefixer@^10.4.21", - "npm:base64-js@^1.5.1", - "npm:class-variance-authority@~0.7.1", - "npm:clsx@^2.1.1", - "npm:cmdk@^1.1.1", - "npm:crypto-random-string@5", - "npm:gzipper@^8.2.1", - "npm:happy-dom@^18.0.1", - "npm:i18next-browser-languagedetector@^8.2.0", - "npm:i18next-http-backend@^3.0.2", - "npm:i18next@^25.3.1", - "npm:idb-keyval@^6.2.2", - "npm:immer@^10.1.1", - "npm:js-cookie@^3.0.5", - "npm:lucide-react@0.525", - "npm:maplibre-gl@5.6.1", - "npm:postcss@^8.5.6", - "npm:react-dom@^19.1.0", - "npm:react-error-boundary@6", - "npm:react-hook-form@^7.60.0", - "npm:react-i18next@^15.6.0", - "npm:react-map-gl@8.0.4", - "npm:react-qrcode-logo@3", - "npm:react@^19.1.0", - "npm:rfc4648@^1.5.4", - "npm:simple-git-hooks@^2.13.0", - "npm:tailwind-merge@^3.3.1", - "npm:tailwindcss-animate@^1.0.7", - "npm:tailwindcss@^4.1.11", - "npm:tar@^7.4.3", - "npm:testing-library@^0.0.2", - "npm:typescript@^5.8.3", - "npm:vite@7", - "npm:vitest@^3.2.4", - "npm:zod@^3.25.75", - "npm:zustand@5.0.6" - ] - } - } - } - } -} diff --git a/package.json b/package.json new file mode 100644 index 00000000..15fb47ca --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "meshtastic-web", + "version": "2.7.0-0", + "type": "module", + "description": "Meshtastic web client monorepo", + "license": "GPL-3.0-only", + "repository": { + "type": "git", + "url": "git+https://github.com/meshtastic/web.git" + }, + "bugs": { + "url": "https://github.com/meshtastic/web/issues" + }, + "homepage": "https://meshtastic.org", + "workspaces": ["packages/web"], + "scripts": { + "build:npm": "deno run -A scripts/build_npm_package.ts" + }, + "devDependencies": { + "@biomejs/biome": "^1.8.3", + "bun": "^1.1.18", + "typescript": "^5.8.3" + } +} diff --git a/packages/core/deno.json b/packages/core/deno.json index 624babd1..b0a4c42a 100644 --- a/packages/core/deno.json +++ b/packages/core/deno.json @@ -1,11 +1,11 @@ { - "name": "@meshtastic/core", - "version": "2.6.4", - "description": "Core functionalities for Meshtastic web applications.", - "exports": { - ".": "./mod.ts" - }, - "imports": { - "crc": "npm:crc@^4.3.2" - } + "name": "@meshtastic/core", + "version": "2.6.4", + "description": "Core functionalities for Meshtastic web applications.", + "exports": { + ".": "./mod.ts" + }, + "imports": { + "crc": "npm:crc@^4.3.2" + } } diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index 01053c3f..f7eee111 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -5,6 +5,6 @@ const broadcastNum = 0xffffffff; const minFwVer = 2.2; export const Constants = { - broadcastNum, - minFwVer, + broadcastNum, + minFwVer, }; diff --git a/packages/core/src/meshDevice.ts b/packages/core/src/meshDevice.ts index 8861c764..d624b7c8 100755 --- a/packages/core/src/meshDevice.ts +++ b/packages/core/src/meshDevice.ts @@ -3,1182 +3,1159 @@ import { Logger } from "tslog"; import { create, fromBinary, toBinary } from "@bufbuild/protobuf"; import * as Protobuf from "@meshtastic/protobufs"; -import { EventSystem, Queue, Xmodem } from "./utils/mod.ts"; -import { decodePacket } from "./utils/transform/decodePacket.ts"; import { Constants } from "./constants.ts"; import type { Destination, PacketMetadata, Transport } from "./types.ts"; import { ChannelNumber, DeviceStatusEnum, Emitter } from "./types.ts"; +import { EventSystem, Queue, Xmodem } from "./utils/mod.ts"; +import { decodePacket } from "./utils/transform/decodePacket.ts"; export class MeshDevice { - public transport: Transport; - - /** Logs to the console and the logging event emitter */ - public log: Logger; - - /** Describes the current state of the device */ - protected deviceStatus: DeviceStatusEnum; - - /** Describes the current state of the device */ - protected isConfigured: boolean; - - /** Are there any settings that have yet to be applied? */ - protected pendingSettingsChanges: boolean; - - /** Device's node number */ - private myNodeInfo: Protobuf.Mesh.MyNodeInfo; - - /** Randomly generated number to ensure confiuration lockstep */ - public configId: number; - - /** - * Packert queue, to space out transmissions and routing handle errors and - * acks - */ - public queue: Queue; - - public events: EventSystem; - - public xModem: Xmodem; - - constructor(transport: Transport, configId?: number) { - this.log = new Logger({ - name: "iMeshDevice", - prettyLogTemplate: - "{{hh}}:{{MM}}:{{ss}}:{{ms}}\t{{logLevelName}}\t[{{name}}]\t", - }); - - this.transport = transport; - this.deviceStatus = DeviceStatusEnum.DeviceDisconnected; - this.isConfigured = false; - this.pendingSettingsChanges = false; - this.myNodeInfo = create(Protobuf.Mesh.MyNodeInfoSchema); - this.configId = configId ?? this.generateRandId(); - this.queue = new Queue(); - this.events = new EventSystem(); - this.xModem = new Xmodem(this.sendRaw.bind(this)); //TODO: try wihtout bind - - this.events.onDeviceStatus.subscribe((status) => { - this.deviceStatus = status; - if (status === DeviceStatusEnum.DeviceConfigured) { - this.isConfigured = true; - } else if (status === DeviceStatusEnum.DeviceConfiguring) { - this.isConfigured = false; - } - }); - - this.events.onMyNodeInfo.subscribe((myNodeInfo) => { - this.myNodeInfo = myNodeInfo; - }); - - this.events.onPendingSettingsChange.subscribe((state) => { - this.pendingSettingsChanges = state; - }); - - this.transport.fromDevice.pipeTo(decodePacket(this)); - } - - /** Abstract method that connects to the radio */ - // protected abstract connect( - // parameters: Types.ConnectionParameters, - // ): Promise; - - /** Abstract method that disconnects from the radio */ - // protected abstract disconnect(): void; - - /** Abstract method that pings the radio */ - // protected abstract ping(): Promise; - - /** - * Sends a text over the radio - */ - public async sendText( - text: string, - destination?: Destination, - wantAck?: boolean, - channel?: ChannelNumber, - replyId?: number, - emoji?: number, - ): Promise { - this.log.debug( - Emitter[Emitter.SendText], - `📤 Sending message to ${destination ?? "broadcast"} on channel ${ - channel?.toString() ?? 0 - }`, - ); - - const enc = new TextEncoder(); - - return await this.sendPacket( - enc.encode(text), - Protobuf.Portnums.PortNum.TEXT_MESSAGE_APP, - destination ?? "broadcast", - channel, - wantAck, - false, - true, - replyId, - emoji, - ); - } - - /** - * Sends a text over the radio - */ - public sendWaypoint( - waypointMessage: Protobuf.Mesh.Waypoint, - destination: Destination, - channel?: ChannelNumber, - ): Promise { - this.log.debug( - Emitter[Emitter.SendWaypoint], - `📤 Sending waypoint to ${destination} on channel ${ - channel?.toString() ?? 0 - }`, - ); - - waypointMessage.id = this.generateRandId(); - - return this.sendPacket( - toBinary(Protobuf.Mesh.WaypointSchema, waypointMessage), - Protobuf.Portnums.PortNum.WAYPOINT_APP, - destination, - channel, - true, - false, - ); - } - - /** - * Sends packet over the radio - */ - public async sendPacket( - byteData: Uint8Array, - portNum: Protobuf.Portnums.PortNum, - destination: Destination, - channel: ChannelNumber = ChannelNumber.Primary, - wantAck = true, - wantResponse = true, - echoResponse = false, - replyId?: number, - emoji?: number, - ): Promise { - this.log.trace( - Emitter[Emitter.SendPacket], - `📤 Sending ${Protobuf.Portnums.PortNum[portNum]} to ${destination}`, - ); - - const meshPacket = create(Protobuf.Mesh.MeshPacketSchema, { - payloadVariant: { - case: "decoded", - value: { - payload: byteData, - portnum: portNum, - wantResponse, - emoji, - replyId, - dest: 0, //change this! - requestId: 0, //change this! - source: 0, //change this! - }, - }, - from: this.myNodeInfo.myNodeNum, - to: destination === "broadcast" - ? Constants.broadcastNum - : destination === "self" - ? this.myNodeInfo.myNodeNum - : destination, - id: this.generateRandId(), - wantAck: wantAck, - channel, - }); - - const toRadioMessage = create(Protobuf.Mesh.ToRadioSchema, { - payloadVariant: { - case: "packet", - value: meshPacket, - }, - }); - - if (echoResponse) { - meshPacket.rxTime = Math.trunc(new Date().getTime() / 1000); - this.handleMeshPacket(meshPacket); - } - return await this.sendRaw( - toBinary(Protobuf.Mesh.ToRadioSchema, toRadioMessage), - meshPacket.id, - ); - } - - /** - * Sends raw packet over the radio - */ - public async sendRaw( - toRadio: Uint8Array, - id: number = this.generateRandId(), - ): Promise { - if (toRadio.length > 512) { - throw new Error("Message longer than 512 bytes, it will not be sent!"); - } - this.queue.push({ - id, - data: toRadio, - }); - - await this.queue.processQueue(this.transport.toDevice); - - return this.queue.wait(id); - } - - /** - * Writes config to device - */ - public async setConfig(config: Protobuf.Config.Config): Promise { - this.log.debug( - Emitter[Emitter.SetConfig], - `⚙️ Setting config, Variant: ${config.payloadVariant.case ?? "Unknown"}`, - ); - - if (!this.pendingSettingsChanges) { - await this.beginEditSettings(); - } - - const configMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setConfig", - value: config, - }, - }); - - return this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, configMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Writes module config to device - */ - public async setModuleConfig( - moduleConfig: Protobuf.ModuleConfig.ModuleConfig, - ): Promise { - this.log.debug( - Emitter[Emitter.SetModuleConfig], - "⚙️ Setting module config", - ); - - const moduleConfigMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setModuleConfig", - value: moduleConfig, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, moduleConfigMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - // Write cannedMessages to device - public async setCannedMessages( - cannedMessages: Protobuf.CannedMessages.CannedMessageModuleConfig, - ): Promise { - this.log.debug( - Emitter[Emitter.SetCannedMessages], - "⚙️ Setting CannedMessages", - ); - - const cannedMessagesMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setCannedMessageModuleMessages", - value: cannedMessages.messages, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, cannedMessagesMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Sets devices owner data - */ - public async setOwner(owner: Protobuf.Mesh.User): Promise { - this.log.debug(Emitter[Emitter.SetOwner], "👤 Setting owner"); - - const setOwnerMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setOwner", - value: owner, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, setOwnerMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Sets devices ChannelSettings - */ - public async setChannel(channel: Protobuf.Channel.Channel): Promise { - this.log.debug( - Emitter[Emitter.SetChannel], - `📻 Setting Channel: ${channel.index}`, - ); - - const setChannelMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setChannel", - value: channel, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, setChannelMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Triggers Device to enter DFU mode - */ - public async enterDfuMode(): Promise { - this.log.debug( - Emitter[Emitter.EnterDfuMode], - "🔌 Entering DFU mode", - ); - - const enterDfuModeRequest = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "enterDfuModeRequest", - value: true, - }, - }); - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, enterDfuModeRequest), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Sets static position of device - */ - public async setPosition( - positionMessage: Protobuf.Mesh.Position, - ): Promise { - return await this.sendPacket( - toBinary(Protobuf.Mesh.PositionSchema, positionMessage), - Protobuf.Portnums.PortNum.POSITION_APP, - "self", - ); - } - - /** - * Gets specified channel information from the radio - */ - public async getChannel(index: number): Promise { - this.log.debug( - Emitter[Emitter.GetChannel], - `📻 Requesting Channel: ${index}`, - ); - - const getChannelRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "getChannelRequest", - value: index + 1, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, getChannelRequestMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Gets devices config - */ - public async getConfig( - configType: Protobuf.Admin.AdminMessage_ConfigType, - ): Promise { - this.log.debug( - Emitter[Emitter.GetConfig], - "⚙️ Requesting config", - ); - - const getRadioRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "getConfigRequest", - value: configType, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, getRadioRequestMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Gets Module config - */ - public async getModuleConfig( - moduleConfigType: Protobuf.Admin.AdminMessage_ModuleConfigType, - ): Promise { - this.log.debug( - Emitter[Emitter.GetModuleConfig], - "⚙️ Requesting module config", - ); - - const getRadioRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "getModuleConfigRequest", - value: moduleConfigType, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, getRadioRequestMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** Gets devices Owner */ - public async getOwner(): Promise { - this.log.debug( - Emitter[Emitter.GetOwner], - "👤 Requesting owner", - ); - - const getOwnerRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "getOwnerRequest", - value: true, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, getOwnerRequestMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Gets devices metadata - */ - public async getMetadata(nodeNum: number): Promise { - this.log.debug( - Emitter[Emitter.GetMetadata], - `🏷️ Requesting metadata from ${nodeNum}`, - ); - - const getDeviceMetricsRequestMessage = create( - Protobuf.Admin.AdminMessageSchema, - { - payloadVariant: { - case: "getDeviceMetadataRequest", - value: true, - }, - }, - ); - - return await this.sendPacket( - toBinary( - Protobuf.Admin.AdminMessageSchema, - getDeviceMetricsRequestMessage, - ), - Protobuf.Portnums.PortNum.ADMIN_APP, - nodeNum, - ChannelNumber.Admin, - ); - } - - /** - * Clears specific channel with the designated index - */ - public async clearChannel(index: number): Promise { - this.log.debug( - Emitter[Emitter.ClearChannel], - `📻 Clearing Channel ${index}`, - ); - - const channel = create(Protobuf.Channel.ChannelSchema, { - index, - role: Protobuf.Channel.Channel_Role.DISABLED, - }); - const setChannelMessage = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "setChannel", - value: channel, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, setChannelMessage), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - private async beginEditSettings(): Promise { - this.events.onPendingSettingsChange.dispatch(true); - - const beginEditSettings = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "beginEditSettings", - value: true, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, beginEditSettings), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - public async commitEditSettings(): Promise { - this.events.onPendingSettingsChange.dispatch(false); - - const commitEditSettings = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "commitEditSettings", - value: true, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, commitEditSettings), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Resets the internal NodeDB of the radio, usefull for removing old nodes - * that no longer exist. - */ - public async resetNodes(): Promise { - this.log.debug( - Emitter[Emitter.ResetNodes], - "📻 Resetting NodeDB", - ); - - const resetNodes = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "nodedbReset", - value: 1, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, resetNodes), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Removes a node from the internal NodeDB of the radio by node number - */ - public async removeNodeByNum(nodeNum: number): Promise { - this.log.debug( - Emitter[Emitter.RemoveNodeByNum], - `📻 Removing Node ${nodeNum} from NodeDB`, - ); - - const removeNodeByNum = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "removeByNodenum", - value: nodeNum, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, removeNodeByNum), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** Shuts down the current node after the specified amount of time has elapsed. */ - public async shutdown(time: number): Promise { - this.log.debug( - Emitter[Emitter.Shutdown], - `🔌 Shutting down ${time > 2 ? "now" : `in ${time} seconds`}`, - ); - - const shutdown = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "shutdownSeconds", - value: time, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, shutdown), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** Reboots the current node after the specified amount of time has elapsed. */ - public async reboot(time: number): Promise { - this.log.debug( - Emitter[Emitter.Reboot], - `🔌 Rebooting node ${time > 0 ? "now" : `in ${time} seconds`}`, - ); - - const reboot = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "rebootSeconds", - value: time, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, reboot), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Reboots the current node into OTA mode after the specified amount of time has elapsed. - */ - public async rebootOta(time: number): Promise { - this.log.debug( - Emitter[Emitter.RebootOta], - `🔌 Rebooting into OTA mode ${time > 0 ? "now" : `in ${time} seconds`}`, - ); - - const rebootOta = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "rebootOtaSeconds", - value: time, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, rebootOta), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Factory resets the current device - */ - public async factoryResetDevice(): Promise { - this.log.debug( - Emitter[Emitter.FactoryReset], - "♻️ Factory resetting device", - ); - - const factoryReset = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "factoryResetDevice", - value: 1, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, factoryReset), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Factory resets the current config - */ - public async factoryResetConfig(): Promise { - this.log.debug( - Emitter[Emitter.FactoryReset], - "♻️ Factory resetting config", - ); - - const factoryReset = create(Protobuf.Admin.AdminMessageSchema, { - payloadVariant: { - case: "factoryResetConfig", - value: 1, - }, - }); - - return await this.sendPacket( - toBinary(Protobuf.Admin.AdminMessageSchema, factoryReset), - Protobuf.Portnums.PortNum.ADMIN_APP, - "self", - ); - } - - /** - * Triggers the device configure process - */ - public configure(): Promise { - this.log.debug( - Emitter[Emitter.Configure], - "⚙️ Requesting device configuration", - ); - this.updateDeviceStatus(DeviceStatusEnum.DeviceConfiguring); - - const toRadio = create(Protobuf.Mesh.ToRadioSchema, { - payloadVariant: { - case: "wantConfigId", - value: this.configId, - }, - }); - - return this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); - } - - /** - * Serial connection requires a heartbeat ping to stay connected, otherwise times out after 15 minutes - */ - public heartbeat(): Promise { - this.log.debug( - Emitter[Emitter.Ping], - "❤️ Send heartbeat ping to radio", - ); - - const toRadio = create(Protobuf.Mesh.ToRadioSchema, { - payloadVariant: { - case: "heartbeat", - value: {}, - }, - }); - - return this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); - } - - /** - * Sends a trace route packet to the designated node - */ - public async traceRoute(destination: number): Promise { - const routeDiscovery = create(Protobuf.Mesh.RouteDiscoverySchema, { - route: [], - }); - - return await this.sendPacket( - toBinary(Protobuf.Mesh.RouteDiscoverySchema, routeDiscovery), - Protobuf.Portnums.PortNum.TRACEROUTE_APP, - destination, - ); - } - - /** - * Requests position from the designated node - */ - public async requestPosition(destination: number): Promise { - return await this.sendPacket( - new Uint8Array(), - Protobuf.Portnums.PortNum.POSITION_APP, - destination, - ); - } - - /** - * Updates the device status eliminating duplicate status events - */ - public updateDeviceStatus(status: DeviceStatusEnum): void { - if (status !== this.deviceStatus) { - this.events.onDeviceStatus.dispatch(status); - } - } - - /** - * Generates random packet identifier - * - * @returns {number} Random packet ID - */ - private generateRandId(): number { - const seed = crypto.getRandomValues(new Uint32Array(1)); - if (!seed[0]) { - throw new Error("Cannot generate CSPRN"); - } - - return Math.floor(seed[0] * 2 ** -32 * 1e9); - } - - /** Completes all Events */ - public complete(): void { - this.queue.clear(); - } - - /** Disconnects from the device **/ - public async disconnect(): Promise { - this.log.debug(Emitter[Emitter.Disconnect], "🔌 Disconnecting from device"); - this.complete(); - await this.transport.toDevice.close(); - } - - /** - * Gets called when a MeshPacket is received from device - */ - public handleMeshPacket(meshPacket: Protobuf.Mesh.MeshPacket): void { - this.events.onMeshPacket.dispatch(meshPacket); - if (meshPacket.from !== this.myNodeInfo.myNodeNum) { - /** - * TODO: this shouldn't be called unless the device interracts with the - * mesh, currently it does. - */ - this.events.onMeshHeartbeat.dispatch(new Date()); - } - - switch (meshPacket.payloadVariant.case) { - case "decoded": { - this.handleDecodedPacket(meshPacket.payloadVariant.value, meshPacket); - break; - } - - case "encrypted": { - this.log.debug( - Emitter[Emitter.HandleMeshPacket], - "🔐 Device received encrypted data packet, ignoring.", - ); - break; - } - - default: - throw new Error(`Unhandled case ${meshPacket.payloadVariant.case}`); - } - } - - private handleDecodedPacket( - dataPacket: Protobuf.Mesh.Data, - meshPacket: Protobuf.Mesh.MeshPacket, - ) { - let adminMessage: Protobuf.Admin.AdminMessage | undefined = undefined; - let routingPacket: Protobuf.Mesh.Routing | undefined = undefined; - - const packetMetadata: Omit, "data"> = { - id: meshPacket.id, - rxTime: new Date(meshPacket.rxTime * 1000), - type: meshPacket.to === Constants.broadcastNum ? "broadcast" : "direct", - from: meshPacket.from, - to: meshPacket.to, - channel: meshPacket.channel, - }; - - this.log.trace( - Emitter[Emitter.HandleMeshPacket], - `📦 Received ${Protobuf.Portnums.PortNum[dataPacket.portnum]} packet`, - ); - - switch (dataPacket.portnum) { - case Protobuf.Portnums.PortNum.TEXT_MESSAGE_APP: { - this.events.onMessagePacket.dispatch({ - ...packetMetadata, - data: new TextDecoder().decode(dataPacket.payload), - }); - break; - } - - case Protobuf.Portnums.PortNum.REMOTE_HARDWARE_APP: { - this.events.onRemoteHardwarePacket.dispatch({ - ...packetMetadata, - data: fromBinary( - Protobuf.RemoteHardware.HardwareMessageSchema, - dataPacket.payload, - ), - }); - break; - } - - case Protobuf.Portnums.PortNum.POSITION_APP: { - this.events.onPositionPacket.dispatch({ - ...packetMetadata, - data: fromBinary(Protobuf.Mesh.PositionSchema, dataPacket.payload), - }); - break; - } - - case Protobuf.Portnums.PortNum.NODEINFO_APP: { - this.events.onUserPacket.dispatch({ - ...packetMetadata, - data: fromBinary(Protobuf.Mesh.UserSchema, dataPacket.payload), - }); - break; - } - - case Protobuf.Portnums.PortNum.ROUTING_APP: { - routingPacket = fromBinary( - Protobuf.Mesh.RoutingSchema, - dataPacket.payload, - ); - - this.events.onRoutingPacket.dispatch({ - ...packetMetadata, - data: routingPacket, - }); - switch (routingPacket.variant.case) { - case "errorReason": { - if ( - routingPacket.variant.value === Protobuf.Mesh.Routing_Error.NONE - ) { - this.queue.processAck(dataPacket.requestId); - } else { - this.queue.processError({ - id: dataPacket.requestId, - error: routingPacket.variant.value, - }); - } - - break; - } - case "routeReply": { - break; - } - case "routeRequest": { - break; - } - - default: { - throw new Error(`Unhandled case ${routingPacket.variant.case}`); - } - } - break; - } - - case Protobuf.Portnums.PortNum.ADMIN_APP: { - adminMessage = fromBinary( - Protobuf.Admin.AdminMessageSchema, - dataPacket.payload, - ); - switch (adminMessage.payloadVariant.case) { - case "getChannelResponse": { - this.events.onChannelPacket.dispatch( - adminMessage.payloadVariant.value, - ); - break; - } - case "getOwnerResponse": { - this.events.onUserPacket.dispatch({ - ...packetMetadata, - data: adminMessage.payloadVariant.value, - }); - break; - } - case "getConfigResponse": { - this.events.onConfigPacket.dispatch( - adminMessage.payloadVariant.value, - ); - break; - } - case "getModuleConfigResponse": { - this.events.onModuleConfigPacket.dispatch( - adminMessage.payloadVariant.value, - ); - break; - } - case "getDeviceMetadataResponse": { - this.log.debug( - Emitter[Emitter.GetMetadata], - `🏷️ Received metadata packet from ${dataPacket.source}`, - ); - - this.events.onDeviceMetadataPacket.dispatch({ - ...packetMetadata, - data: adminMessage.payloadVariant.value, - }); - break; - } - case "getCannedMessageModuleMessagesResponse": { - this.log.debug( - Emitter[Emitter.GetMetadata], - `🥫 Received CannedMessage Module Messages response packet`, - ); - - this.events.onCannedMessageModulePacket.dispatch({ - ...packetMetadata, - data: adminMessage.payloadVariant.value, - }); - break; - } - default: { - this.log.error( - Emitter[Emitter.HandleMeshPacket], - `⚠️ Received unhandled AdminMessage, type ${ - adminMessage.payloadVariant.case ?? "undefined" - }`, - dataPacket.payload, - ); - } - } - break; - } - - case Protobuf.Portnums.PortNum.WAYPOINT_APP: { - this.events.onWaypointPacket.dispatch({ - ...packetMetadata, - data: fromBinary(Protobuf.Mesh.WaypointSchema, dataPacket.payload), - }); - break; - } - - case Protobuf.Portnums.PortNum.AUDIO_APP: { - this.events.onAudioPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.DETECTION_SENSOR_APP: { - this.events.onDetectionSensorPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.REPLY_APP: { - this.events.onPingPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, //TODO: decode - }); - break; - } - - case Protobuf.Portnums.PortNum.IP_TUNNEL_APP: { - this.events.onIpTunnelPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.PAXCOUNTER_APP: { - this.events.onPaxcounterPacket.dispatch({ - ...packetMetadata, - data: fromBinary( - Protobuf.PaxCount.PaxcountSchema, - dataPacket.payload, - ), - }); - break; - } - - case Protobuf.Portnums.PortNum.SERIAL_APP: { - this.events.onSerialPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.STORE_FORWARD_APP: { - this.events.onStoreForwardPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.RANGE_TEST_APP: { - this.events.onRangeTestPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.TELEMETRY_APP: { - this.events.onTelemetryPacket.dispatch({ - ...packetMetadata, - data: fromBinary( - Protobuf.Telemetry.TelemetrySchema, - dataPacket.payload, - ), - }); - break; - } - - case Protobuf.Portnums.PortNum.ZPS_APP: { - this.events.onZpsPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.SIMULATOR_APP: { - this.events.onSimulatorPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.TRACEROUTE_APP: { - this.events.onTraceRoutePacket.dispatch({ - ...packetMetadata, - data: fromBinary( - Protobuf.Mesh.RouteDiscoverySchema, - dataPacket.payload, - ), - }); - break; - } - - case Protobuf.Portnums.PortNum.NEIGHBORINFO_APP: { - this.events.onNeighborInfoPacket.dispatch({ - ...packetMetadata, - data: fromBinary( - Protobuf.Mesh.NeighborInfoSchema, - dataPacket.payload, - ), - }); - break; - } - - case Protobuf.Portnums.PortNum.ATAK_PLUGIN: { - this.events.onAtakPluginPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.MAP_REPORT_APP: { - this.events.onMapReportPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.PRIVATE_APP: { - this.events.onPrivatePacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - case Protobuf.Portnums.PortNum.ATAK_FORWARDER: { - this.events.onAtakForwarderPacket.dispatch({ - ...packetMetadata, - data: dataPacket.payload, - }); - break; - } - - default: - throw new Error(`Unhandled case ${dataPacket.portnum}`); - } - } + public transport: Transport; + + /** Logs to the console and the logging event emitter */ + public log: Logger; + + /** Describes the current state of the device */ + protected deviceStatus: DeviceStatusEnum; + + /** Describes the current state of the device */ + protected isConfigured: boolean; + + /** Are there any settings that have yet to be applied? */ + protected pendingSettingsChanges: boolean; + + /** Device's node number */ + private myNodeInfo: Protobuf.Mesh.MyNodeInfo; + + /** Randomly generated number to ensure confiuration lockstep */ + public configId: number; + + /** + * Packert queue, to space out transmissions and routing handle errors and + * acks + */ + public queue: Queue; + + public events: EventSystem; + + public xModem: Xmodem; + + constructor(transport: Transport, configId?: number) { + this.log = new Logger({ + name: "iMeshDevice", + prettyLogTemplate: + "{{hh}}:{{MM}}:{{ss}}:{{ms}}\t{{logLevelName}}\t[{{name}}]\t", + }); + + this.transport = transport; + this.deviceStatus = DeviceStatusEnum.DeviceDisconnected; + this.isConfigured = false; + this.pendingSettingsChanges = false; + this.myNodeInfo = create(Protobuf.Mesh.MyNodeInfoSchema); + this.configId = configId ?? this.generateRandId(); + this.queue = new Queue(); + this.events = new EventSystem(); + this.xModem = new Xmodem(this.sendRaw.bind(this)); //TODO: try wihtout bind + + this.events.onDeviceStatus.subscribe((status) => { + this.deviceStatus = status; + if (status === DeviceStatusEnum.DeviceConfigured) { + this.isConfigured = true; + } else if (status === DeviceStatusEnum.DeviceConfiguring) { + this.isConfigured = false; + } + }); + + this.events.onMyNodeInfo.subscribe((myNodeInfo) => { + this.myNodeInfo = myNodeInfo; + }); + + this.events.onPendingSettingsChange.subscribe((state) => { + this.pendingSettingsChanges = state; + }); + + this.transport.fromDevice.pipeTo(decodePacket(this)); + } + + /** Abstract method that connects to the radio */ + // protected abstract connect( + // parameters: Types.ConnectionParameters, + // ): Promise; + + /** Abstract method that disconnects from the radio */ + // protected abstract disconnect(): void; + + /** Abstract method that pings the radio */ + // protected abstract ping(): Promise; + + /** + * Sends a text over the radio + */ + public async sendText( + text: string, + destination?: Destination, + wantAck?: boolean, + channel?: ChannelNumber, + replyId?: number, + emoji?: number, + ): Promise { + this.log.debug( + Emitter[Emitter.SendText], + `📤 Sending message to ${destination ?? "broadcast"} on channel ${ + channel?.toString() ?? 0 + }`, + ); + + const enc = new TextEncoder(); + + return await this.sendPacket( + enc.encode(text), + Protobuf.Portnums.PortNum.TEXT_MESSAGE_APP, + destination ?? "broadcast", + channel, + wantAck, + false, + true, + replyId, + emoji, + ); + } + + /** + * Sends a text over the radio + */ + public sendWaypoint( + waypointMessage: Protobuf.Mesh.Waypoint, + destination: Destination, + channel?: ChannelNumber, + ): Promise { + this.log.debug( + Emitter[Emitter.SendWaypoint], + `📤 Sending waypoint to ${destination} on channel ${ + channel?.toString() ?? 0 + }`, + ); + + waypointMessage.id = this.generateRandId(); + + return this.sendPacket( + toBinary(Protobuf.Mesh.WaypointSchema, waypointMessage), + Protobuf.Portnums.PortNum.WAYPOINT_APP, + destination, + channel, + true, + false, + ); + } + + /** + * Sends packet over the radio + */ + public async sendPacket( + byteData: Uint8Array, + portNum: Protobuf.Portnums.PortNum, + destination: Destination, + channel: ChannelNumber = ChannelNumber.Primary, + wantAck = true, + wantResponse = true, + echoResponse = false, + replyId?: number, + emoji?: number, + ): Promise { + this.log.trace( + Emitter[Emitter.SendPacket], + `📤 Sending ${Protobuf.Portnums.PortNum[portNum]} to ${destination}`, + ); + + const meshPacket = create(Protobuf.Mesh.MeshPacketSchema, { + payloadVariant: { + case: "decoded", + value: { + payload: byteData, + portnum: portNum, + wantResponse, + emoji, + replyId, + dest: 0, //change this! + requestId: 0, //change this! + source: 0, //change this! + }, + }, + from: this.myNodeInfo.myNodeNum, + to: + destination === "broadcast" + ? Constants.broadcastNum + : destination === "self" + ? this.myNodeInfo.myNodeNum + : destination, + id: this.generateRandId(), + wantAck: wantAck, + channel, + }); + + const toRadioMessage = create(Protobuf.Mesh.ToRadioSchema, { + payloadVariant: { + case: "packet", + value: meshPacket, + }, + }); + + if (echoResponse) { + meshPacket.rxTime = Math.trunc(new Date().getTime() / 1000); + this.handleMeshPacket(meshPacket); + } + return await this.sendRaw( + toBinary(Protobuf.Mesh.ToRadioSchema, toRadioMessage), + meshPacket.id, + ); + } + + /** + * Sends raw packet over the radio + */ + public async sendRaw( + toRadio: Uint8Array, + id: number = this.generateRandId(), + ): Promise { + if (toRadio.length > 512) { + throw new Error("Message longer than 512 bytes, it will not be sent!"); + } + this.queue.push({ + id, + data: toRadio, + }); + + await this.queue.processQueue(this.transport.toDevice); + + return this.queue.wait(id); + } + + /** + * Writes config to device + */ + public async setConfig(config: Protobuf.Config.Config): Promise { + this.log.debug( + Emitter[Emitter.SetConfig], + `⚙️ Setting config, Variant: ${config.payloadVariant.case ?? "Unknown"}`, + ); + + if (!this.pendingSettingsChanges) { + await this.beginEditSettings(); + } + + const configMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setConfig", + value: config, + }, + }); + + return this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, configMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Writes module config to device + */ + public async setModuleConfig( + moduleConfig: Protobuf.ModuleConfig.ModuleConfig, + ): Promise { + this.log.debug(Emitter[Emitter.SetModuleConfig], "⚙️ Setting module config"); + + const moduleConfigMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setModuleConfig", + value: moduleConfig, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, moduleConfigMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + // Write cannedMessages to device + public async setCannedMessages( + cannedMessages: Protobuf.CannedMessages.CannedMessageModuleConfig, + ): Promise { + this.log.debug( + Emitter[Emitter.SetCannedMessages], + "⚙️ Setting CannedMessages", + ); + + const cannedMessagesMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setCannedMessageModuleMessages", + value: cannedMessages.messages, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, cannedMessagesMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Sets devices owner data + */ + public async setOwner(owner: Protobuf.Mesh.User): Promise { + this.log.debug(Emitter[Emitter.SetOwner], "👤 Setting owner"); + + const setOwnerMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setOwner", + value: owner, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, setOwnerMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Sets devices ChannelSettings + */ + public async setChannel(channel: Protobuf.Channel.Channel): Promise { + this.log.debug( + Emitter[Emitter.SetChannel], + `📻 Setting Channel: ${channel.index}`, + ); + + const setChannelMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setChannel", + value: channel, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, setChannelMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Triggers Device to enter DFU mode + */ + public async enterDfuMode(): Promise { + this.log.debug(Emitter[Emitter.EnterDfuMode], "🔌 Entering DFU mode"); + + const enterDfuModeRequest = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "enterDfuModeRequest", + value: true, + }, + }); + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, enterDfuModeRequest), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Sets static position of device + */ + public async setPosition( + positionMessage: Protobuf.Mesh.Position, + ): Promise { + return await this.sendPacket( + toBinary(Protobuf.Mesh.PositionSchema, positionMessage), + Protobuf.Portnums.PortNum.POSITION_APP, + "self", + ); + } + + /** + * Gets specified channel information from the radio + */ + public async getChannel(index: number): Promise { + this.log.debug( + Emitter[Emitter.GetChannel], + `📻 Requesting Channel: ${index}`, + ); + + const getChannelRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "getChannelRequest", + value: index + 1, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, getChannelRequestMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Gets devices config + */ + public async getConfig( + configType: Protobuf.Admin.AdminMessage_ConfigType, + ): Promise { + this.log.debug(Emitter[Emitter.GetConfig], "⚙️ Requesting config"); + + const getRadioRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "getConfigRequest", + value: configType, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, getRadioRequestMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Gets Module config + */ + public async getModuleConfig( + moduleConfigType: Protobuf.Admin.AdminMessage_ModuleConfigType, + ): Promise { + this.log.debug( + Emitter[Emitter.GetModuleConfig], + "⚙️ Requesting module config", + ); + + const getRadioRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "getModuleConfigRequest", + value: moduleConfigType, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, getRadioRequestMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** Gets devices Owner */ + public async getOwner(): Promise { + this.log.debug(Emitter[Emitter.GetOwner], "👤 Requesting owner"); + + const getOwnerRequestMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "getOwnerRequest", + value: true, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, getOwnerRequestMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Gets devices metadata + */ + public async getMetadata(nodeNum: number): Promise { + this.log.debug( + Emitter[Emitter.GetMetadata], + `🏷️ Requesting metadata from ${nodeNum}`, + ); + + const getDeviceMetricsRequestMessage = create( + Protobuf.Admin.AdminMessageSchema, + { + payloadVariant: { + case: "getDeviceMetadataRequest", + value: true, + }, + }, + ); + + return await this.sendPacket( + toBinary( + Protobuf.Admin.AdminMessageSchema, + getDeviceMetricsRequestMessage, + ), + Protobuf.Portnums.PortNum.ADMIN_APP, + nodeNum, + ChannelNumber.Admin, + ); + } + + /** + * Clears specific channel with the designated index + */ + public async clearChannel(index: number): Promise { + this.log.debug( + Emitter[Emitter.ClearChannel], + `📻 Clearing Channel ${index}`, + ); + + const channel = create(Protobuf.Channel.ChannelSchema, { + index, + role: Protobuf.Channel.Channel_Role.DISABLED, + }); + const setChannelMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "setChannel", + value: channel, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, setChannelMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + private async beginEditSettings(): Promise { + this.events.onPendingSettingsChange.dispatch(true); + + const beginEditSettings = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "beginEditSettings", + value: true, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, beginEditSettings), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + public async commitEditSettings(): Promise { + this.events.onPendingSettingsChange.dispatch(false); + + const commitEditSettings = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "commitEditSettings", + value: true, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, commitEditSettings), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Resets the internal NodeDB of the radio, usefull for removing old nodes + * that no longer exist. + */ + public async resetNodes(): Promise { + this.log.debug(Emitter[Emitter.ResetNodes], "📻 Resetting NodeDB"); + + const resetNodes = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "nodedbReset", + value: 1, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, resetNodes), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Removes a node from the internal NodeDB of the radio by node number + */ + public async removeNodeByNum(nodeNum: number): Promise { + this.log.debug( + Emitter[Emitter.RemoveNodeByNum], + `📻 Removing Node ${nodeNum} from NodeDB`, + ); + + const removeNodeByNum = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "removeByNodenum", + value: nodeNum, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, removeNodeByNum), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** Shuts down the current node after the specified amount of time has elapsed. */ + public async shutdown(time: number): Promise { + this.log.debug( + Emitter[Emitter.Shutdown], + `🔌 Shutting down ${time > 2 ? "now" : `in ${time} seconds`}`, + ); + + const shutdown = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "shutdownSeconds", + value: time, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, shutdown), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** Reboots the current node after the specified amount of time has elapsed. */ + public async reboot(time: number): Promise { + this.log.debug( + Emitter[Emitter.Reboot], + `🔌 Rebooting node ${time > 0 ? "now" : `in ${time} seconds`}`, + ); + + const reboot = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "rebootSeconds", + value: time, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, reboot), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Reboots the current node into OTA mode after the specified amount of time has elapsed. + */ + public async rebootOta(time: number): Promise { + this.log.debug( + Emitter[Emitter.RebootOta], + `🔌 Rebooting into OTA mode ${time > 0 ? "now" : `in ${time} seconds`}`, + ); + + const rebootOta = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "rebootOtaSeconds", + value: time, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, rebootOta), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Factory resets the current device + */ + public async factoryResetDevice(): Promise { + this.log.debug(Emitter[Emitter.FactoryReset], "♻️ Factory resetting device"); + + const factoryReset = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "factoryResetDevice", + value: 1, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, factoryReset), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Factory resets the current config + */ + public async factoryResetConfig(): Promise { + this.log.debug(Emitter[Emitter.FactoryReset], "♻️ Factory resetting config"); + + const factoryReset = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "factoryResetConfig", + value: 1, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, factoryReset), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Triggers the device configure process + */ + public configure(): Promise { + this.log.debug( + Emitter[Emitter.Configure], + "⚙️ Requesting device configuration", + ); + this.updateDeviceStatus(DeviceStatusEnum.DeviceConfiguring); + + const toRadio = create(Protobuf.Mesh.ToRadioSchema, { + payloadVariant: { + case: "wantConfigId", + value: this.configId, + }, + }); + + return this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); + } + + /** + * Serial connection requires a heartbeat ping to stay connected, otherwise times out after 15 minutes + */ + public heartbeat(): Promise { + this.log.debug(Emitter[Emitter.Ping], "❤️ Send heartbeat ping to radio"); + + const toRadio = create(Protobuf.Mesh.ToRadioSchema, { + payloadVariant: { + case: "heartbeat", + value: {}, + }, + }); + + return this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); + } + + /** + * Sends a trace route packet to the designated node + */ + public async traceRoute(destination: number): Promise { + const routeDiscovery = create(Protobuf.Mesh.RouteDiscoverySchema, { + route: [], + }); + + return await this.sendPacket( + toBinary(Protobuf.Mesh.RouteDiscoverySchema, routeDiscovery), + Protobuf.Portnums.PortNum.TRACEROUTE_APP, + destination, + ); + } + + /** + * Requests position from the designated node + */ + public async requestPosition(destination: number): Promise { + return await this.sendPacket( + new Uint8Array(), + Protobuf.Portnums.PortNum.POSITION_APP, + destination, + ); + } + + /** + * Updates the device status eliminating duplicate status events + */ + public updateDeviceStatus(status: DeviceStatusEnum): void { + if (status !== this.deviceStatus) { + this.events.onDeviceStatus.dispatch(status); + } + } + + /** + * Generates random packet identifier + * + * @returns {number} Random packet ID + */ + private generateRandId(): number { + const seed = crypto.getRandomValues(new Uint32Array(1)); + if (!seed[0]) { + throw new Error("Cannot generate CSPRN"); + } + + return Math.floor(seed[0] * 2 ** -32 * 1e9); + } + + /** Completes all Events */ + public complete(): void { + this.queue.clear(); + } + + /** Disconnects from the device **/ + public async disconnect(): Promise { + this.log.debug(Emitter[Emitter.Disconnect], "🔌 Disconnecting from device"); + this.complete(); + await this.transport.toDevice.close(); + } + + /** + * Gets called when a MeshPacket is received from device + */ + public handleMeshPacket(meshPacket: Protobuf.Mesh.MeshPacket): void { + this.events.onMeshPacket.dispatch(meshPacket); + if (meshPacket.from !== this.myNodeInfo.myNodeNum) { + /** + * TODO: this shouldn't be called unless the device interracts with the + * mesh, currently it does. + */ + this.events.onMeshHeartbeat.dispatch(new Date()); + } + + switch (meshPacket.payloadVariant.case) { + case "decoded": { + this.handleDecodedPacket(meshPacket.payloadVariant.value, meshPacket); + break; + } + + case "encrypted": { + this.log.debug( + Emitter[Emitter.HandleMeshPacket], + "🔐 Device received encrypted data packet, ignoring.", + ); + break; + } + + default: + throw new Error(`Unhandled case ${meshPacket.payloadVariant.case}`); + } + } + + private handleDecodedPacket( + dataPacket: Protobuf.Mesh.Data, + meshPacket: Protobuf.Mesh.MeshPacket, + ) { + let adminMessage: Protobuf.Admin.AdminMessage | undefined = undefined; + let routingPacket: Protobuf.Mesh.Routing | undefined = undefined; + + const packetMetadata: Omit, "data"> = { + id: meshPacket.id, + rxTime: new Date(meshPacket.rxTime * 1000), + type: meshPacket.to === Constants.broadcastNum ? "broadcast" : "direct", + from: meshPacket.from, + to: meshPacket.to, + channel: meshPacket.channel, + }; + + this.log.trace( + Emitter[Emitter.HandleMeshPacket], + `📦 Received ${Protobuf.Portnums.PortNum[dataPacket.portnum]} packet`, + ); + + switch (dataPacket.portnum) { + case Protobuf.Portnums.PortNum.TEXT_MESSAGE_APP: { + this.events.onMessagePacket.dispatch({ + ...packetMetadata, + data: new TextDecoder().decode(dataPacket.payload), + }); + break; + } + + case Protobuf.Portnums.PortNum.REMOTE_HARDWARE_APP: { + this.events.onRemoteHardwarePacket.dispatch({ + ...packetMetadata, + data: fromBinary( + Protobuf.RemoteHardware.HardwareMessageSchema, + dataPacket.payload, + ), + }); + break; + } + + case Protobuf.Portnums.PortNum.POSITION_APP: { + this.events.onPositionPacket.dispatch({ + ...packetMetadata, + data: fromBinary(Protobuf.Mesh.PositionSchema, dataPacket.payload), + }); + break; + } + + case Protobuf.Portnums.PortNum.NODEINFO_APP: { + this.events.onUserPacket.dispatch({ + ...packetMetadata, + data: fromBinary(Protobuf.Mesh.UserSchema, dataPacket.payload), + }); + break; + } + + case Protobuf.Portnums.PortNum.ROUTING_APP: { + routingPacket = fromBinary( + Protobuf.Mesh.RoutingSchema, + dataPacket.payload, + ); + + this.events.onRoutingPacket.dispatch({ + ...packetMetadata, + data: routingPacket, + }); + switch (routingPacket.variant.case) { + case "errorReason": { + if ( + routingPacket.variant.value === Protobuf.Mesh.Routing_Error.NONE + ) { + this.queue.processAck(dataPacket.requestId); + } else { + this.queue.processError({ + id: dataPacket.requestId, + error: routingPacket.variant.value, + }); + } + + break; + } + case "routeReply": { + break; + } + case "routeRequest": { + break; + } + + default: { + throw new Error(`Unhandled case ${routingPacket.variant.case}`); + } + } + break; + } + + case Protobuf.Portnums.PortNum.ADMIN_APP: { + adminMessage = fromBinary( + Protobuf.Admin.AdminMessageSchema, + dataPacket.payload, + ); + switch (adminMessage.payloadVariant.case) { + case "getChannelResponse": { + this.events.onChannelPacket.dispatch( + adminMessage.payloadVariant.value, + ); + break; + } + case "getOwnerResponse": { + this.events.onUserPacket.dispatch({ + ...packetMetadata, + data: adminMessage.payloadVariant.value, + }); + break; + } + case "getConfigResponse": { + this.events.onConfigPacket.dispatch( + adminMessage.payloadVariant.value, + ); + break; + } + case "getModuleConfigResponse": { + this.events.onModuleConfigPacket.dispatch( + adminMessage.payloadVariant.value, + ); + break; + } + case "getDeviceMetadataResponse": { + this.log.debug( + Emitter[Emitter.GetMetadata], + `🏷️ Received metadata packet from ${dataPacket.source}`, + ); + + this.events.onDeviceMetadataPacket.dispatch({ + ...packetMetadata, + data: adminMessage.payloadVariant.value, + }); + break; + } + case "getCannedMessageModuleMessagesResponse": { + this.log.debug( + Emitter[Emitter.GetMetadata], + `🥫 Received CannedMessage Module Messages response packet`, + ); + + this.events.onCannedMessageModulePacket.dispatch({ + ...packetMetadata, + data: adminMessage.payloadVariant.value, + }); + break; + } + default: { + this.log.error( + Emitter[Emitter.HandleMeshPacket], + `⚠️ Received unhandled AdminMessage, type ${ + adminMessage.payloadVariant.case ?? "undefined" + }`, + dataPacket.payload, + ); + } + } + break; + } + + case Protobuf.Portnums.PortNum.WAYPOINT_APP: { + this.events.onWaypointPacket.dispatch({ + ...packetMetadata, + data: fromBinary(Protobuf.Mesh.WaypointSchema, dataPacket.payload), + }); + break; + } + + case Protobuf.Portnums.PortNum.AUDIO_APP: { + this.events.onAudioPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.DETECTION_SENSOR_APP: { + this.events.onDetectionSensorPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.REPLY_APP: { + this.events.onPingPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, //TODO: decode + }); + break; + } + + case Protobuf.Portnums.PortNum.IP_TUNNEL_APP: { + this.events.onIpTunnelPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.PAXCOUNTER_APP: { + this.events.onPaxcounterPacket.dispatch({ + ...packetMetadata, + data: fromBinary( + Protobuf.PaxCount.PaxcountSchema, + dataPacket.payload, + ), + }); + break; + } + + case Protobuf.Portnums.PortNum.SERIAL_APP: { + this.events.onSerialPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.STORE_FORWARD_APP: { + this.events.onStoreForwardPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.RANGE_TEST_APP: { + this.events.onRangeTestPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.TELEMETRY_APP: { + this.events.onTelemetryPacket.dispatch({ + ...packetMetadata, + data: fromBinary( + Protobuf.Telemetry.TelemetrySchema, + dataPacket.payload, + ), + }); + break; + } + + case Protobuf.Portnums.PortNum.ZPS_APP: { + this.events.onZpsPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.SIMULATOR_APP: { + this.events.onSimulatorPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.TRACEROUTE_APP: { + this.events.onTraceRoutePacket.dispatch({ + ...packetMetadata, + data: fromBinary( + Protobuf.Mesh.RouteDiscoverySchema, + dataPacket.payload, + ), + }); + break; + } + + case Protobuf.Portnums.PortNum.NEIGHBORINFO_APP: { + this.events.onNeighborInfoPacket.dispatch({ + ...packetMetadata, + data: fromBinary( + Protobuf.Mesh.NeighborInfoSchema, + dataPacket.payload, + ), + }); + break; + } + + case Protobuf.Portnums.PortNum.ATAK_PLUGIN: { + this.events.onAtakPluginPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.MAP_REPORT_APP: { + this.events.onMapReportPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.PRIVATE_APP: { + this.events.onPrivatePacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + case Protobuf.Portnums.PortNum.ATAK_FORWARDER: { + this.events.onAtakForwarderPacket.dispatch({ + ...packetMetadata, + data: dataPacket.payload, + }); + break; + } + + default: + throw new Error(`Unhandled case ${dataPacket.portnum}`); + } + } } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 1130824d..40d1dcb7 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,45 +1,45 @@ import type * as Protobuf from "@meshtastic/protobufs"; interface Packet { - type: "packet"; - data: Uint8Array; + type: "packet"; + data: Uint8Array; } interface DebugLog { - type: "debug"; - data: string; + type: "debug"; + data: string; } export type DeviceOutput = Packet | DebugLog; export interface Transport { - toDevice: WritableStream; - fromDevice: ReadableStream; + toDevice: WritableStream; + fromDevice: ReadableStream; } export interface QueueItem { - id: number; - data: Uint8Array; - sent: boolean; - added: Date; - promise: Promise; + id: number; + data: Uint8Array; + sent: boolean; + added: Date; + promise: Promise; } export interface HttpRetryConfig { - maxRetries: number; - initialDelayMs: number; - maxDelayMs: number; - backoffFactor: number; + maxRetries: number; + initialDelayMs: number; + maxDelayMs: number; + backoffFactor: number; } export enum DeviceStatusEnum { - DeviceRestarting = 1, - DeviceDisconnected = 2, - DeviceConnecting = 3, - DeviceReconnecting = 4, - DeviceConnected = 5, - DeviceConfiguring = 6, - DeviceConfigured = 7, + DeviceRestarting = 1, + DeviceDisconnected = 2, + DeviceConnecting = 3, + DeviceReconnecting = 4, + DeviceConnected = 5, + DeviceConfiguring = 6, + DeviceConfigured = 7, } export type LogEventPacket = LogEvent & { date: Date }; @@ -47,83 +47,83 @@ export type LogEventPacket = LogEvent & { date: Date }; export type PacketDestination = "broadcast" | "direct"; export interface PacketMetadata { - id: number; - rxTime: Date; - type: PacketDestination; - from: number; - to: number; - channel: ChannelNumber; - data: T; + id: number; + rxTime: Date; + type: PacketDestination; + from: number; + to: number; + channel: ChannelNumber; + data: T; } export enum EmitterScope { - MeshDevice = 1, - SerialConnection = 2, - NodeSerialConnection = 3, - BleConnection = 4, - HttpConnection = 5, + MeshDevice = 1, + SerialConnection = 2, + NodeSerialConnection = 3, + BleConnection = 4, + HttpConnection = 5, } export enum Emitter { - Constructor = 0, - SendText = 1, - SendWaypoint = 2, - SendPacket = 3, - SendRaw = 4, - SetConfig = 5, - SetModuleConfig = 6, - ConfirmSetConfig = 7, - SetOwner = 8, - SetChannel = 9, - ConfirmSetChannel = 10, - ClearChannel = 11, - GetChannel = 12, - GetAllChannels = 13, - GetConfig = 14, - GetModuleConfig = 15, - GetOwner = 16, - Configure = 17, - HandleFromRadio = 18, - HandleMeshPacket = 19, - Connect = 20, - Ping = 21, - ReadFromRadio = 22, - WriteToRadio = 23, - SetDebugMode = 24, - GetMetadata = 25, - ResetNodes = 26, - Shutdown = 27, - Reboot = 28, - RebootOta = 29, - FactoryReset = 30, - EnterDfuMode = 31, - RemoveNodeByNum = 32, - SetCannedMessages = 33, - Disconnect = 34, + Constructor = 0, + SendText = 1, + SendWaypoint = 2, + SendPacket = 3, + SendRaw = 4, + SetConfig = 5, + SetModuleConfig = 6, + ConfirmSetConfig = 7, + SetOwner = 8, + SetChannel = 9, + ConfirmSetChannel = 10, + ClearChannel = 11, + GetChannel = 12, + GetAllChannels = 13, + GetConfig = 14, + GetModuleConfig = 15, + GetOwner = 16, + Configure = 17, + HandleFromRadio = 18, + HandleMeshPacket = 19, + Connect = 20, + Ping = 21, + ReadFromRadio = 22, + WriteToRadio = 23, + SetDebugMode = 24, + GetMetadata = 25, + ResetNodes = 26, + Shutdown = 27, + Reboot = 28, + RebootOta = 29, + FactoryReset = 30, + EnterDfuMode = 31, + RemoveNodeByNum = 32, + SetCannedMessages = 33, + Disconnect = 34, } export interface LogEvent { - scope: EmitterScope; - emitter: Emitter; - message: string; - level: Protobuf.Mesh.LogRecord_Level; - packet?: Uint8Array; + scope: EmitterScope; + emitter: Emitter; + message: string; + level: Protobuf.Mesh.LogRecord_Level; + packet?: Uint8Array; } export enum ChannelNumber { - Primary = 0, - Channel1 = 1, - Channel2 = 2, - Channel3 = 3, - Channel4 = 4, - Channel5 = 5, - Channel6 = 6, - Admin = 7, + Primary = 0, + Channel1 = 1, + Channel2 = 2, + Channel3 = 3, + Channel4 = 4, + Channel5 = 5, + Channel6 = 6, + Admin = 7, } export type Destination = number | "self" | "broadcast"; export interface PacketError { - id: number; - error: Protobuf.Mesh.Routing_Error; + id: number; + error: Protobuf.Mesh.Routing_Error; } diff --git a/packages/core/src/utils/eventSystem.ts b/packages/core/src/utils/eventSystem.ts index a2da58c8..31ef2efc 100644 --- a/packages/core/src/utils/eventSystem.ts +++ b/packages/core/src/utils/eventSystem.ts @@ -1,467 +1,381 @@ -import { SimpleEventDispatcher } from "ste-simple-events"; import type * as Protobuf from "@meshtastic/protobufs"; +import { SimpleEventDispatcher } from "ste-simple-events"; import type { PacketMetadata } from "../types.ts"; import type * as Types from "../types.ts"; export class EventSystem { - /** - * Fires when a new FromRadio message has been received from the device - * - * @event onLogEvent - */ - public readonly onLogEvent: SimpleEventDispatcher< - Types.LogEventPacket - > = new SimpleEventDispatcher< - Types.LogEventPacket - >(); + /** + * Fires when a new FromRadio message has been received from the device + * + * @event onLogEvent + */ + public readonly onLogEvent: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new FromRadio message has been received from the device - * - * @event onFromRadio - */ - public readonly onFromRadio: SimpleEventDispatcher< - Protobuf.Mesh.FromRadio - > = new SimpleEventDispatcher< - Protobuf.Mesh.FromRadio - >(); + /** + * Fires when a new FromRadio message has been received from the device + * + * @event onFromRadio + */ + public readonly onFromRadio: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new FromRadio message containing a Data packet has been - * received from the device - * - * @event onMeshPacket - */ - public readonly onMeshPacket: SimpleEventDispatcher< - Protobuf.Mesh.MeshPacket - > = new SimpleEventDispatcher< - Protobuf.Mesh.MeshPacket - >(); + /** + * Fires when a new FromRadio message containing a Data packet has been + * received from the device + * + * @event onMeshPacket + */ + public readonly onMeshPacket: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new MyNodeInfo message has been received from the device - * - * @event onMyNodeInfo - */ - public readonly onMyNodeInfo: SimpleEventDispatcher< - Protobuf.Mesh.MyNodeInfo - > = new SimpleEventDispatcher< - Protobuf.Mesh.MyNodeInfo - >(); + /** + * Fires when a new MyNodeInfo message has been received from the device + * + * @event onMyNodeInfo + */ + public readonly onMyNodeInfo: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new MeshPacket message containing a NodeInfo packet has been - * received from device - * - * @event onNodeInfoPacket - */ - public readonly onNodeInfoPacket: SimpleEventDispatcher< - Protobuf.Mesh.NodeInfo - > = new SimpleEventDispatcher< - Protobuf.Mesh.NodeInfo - >(); + /** + * Fires when a new MeshPacket message containing a NodeInfo packet has been + * received from device + * + * @event onNodeInfoPacket + */ + public readonly onNodeInfoPacket: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new Channel message is received - * - * @event onChannelPacket - */ - public readonly onChannelPacket: SimpleEventDispatcher< - Protobuf.Channel.Channel - > = new SimpleEventDispatcher< - Protobuf.Channel.Channel - >(); + /** + * Fires when a new Channel message is received + * + * @event onChannelPacket + */ + public readonly onChannelPacket: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new Config message is received - * - * @event onConfigPacket - */ - public readonly onConfigPacket: SimpleEventDispatcher< - Protobuf.Config.Config - > = new SimpleEventDispatcher< - Protobuf.Config.Config - >(); + /** + * Fires when a new Config message is received + * + * @event onConfigPacket + */ + public readonly onConfigPacket: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new ModuleConfig message is received - * - * @event onModuleConfigPacket - */ - public readonly onModuleConfigPacket: SimpleEventDispatcher< - Protobuf.ModuleConfig.ModuleConfig - > = new SimpleEventDispatcher< - Protobuf.ModuleConfig.ModuleConfig - >(); + /** + * Fires when a new ModuleConfig message is received + * + * @event onModuleConfigPacket + */ + public readonly onModuleConfigPacket: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new MeshPacket message containing a ATAK packet has been - * received from device - * - * @event onAtakPacket - */ - public readonly onAtakPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a ATAK packet has been + * received from device + * + * @event onAtakPacket + */ + public readonly onAtakPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Text packet has been - * received from device - * - * @event onMessagePacket - */ - public readonly onMessagePacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Text packet has been + * received from device + * + * @event onMessagePacket + */ + public readonly onMessagePacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Remote Hardware packet has - * been received from device - * - * @event onRemoteHardwarePacket - */ - public readonly onRemoteHardwarePacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Remote Hardware packet has + * been received from device + * + * @event onRemoteHardwarePacket + */ + public readonly onRemoteHardwarePacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher< + PacketMetadata + >(); - /** - * Fires when a new MeshPacket message containing a Position packet has been - * received from device - * - * @event onPositionPacket - */ - public readonly onPositionPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Position packet has been + * received from device + * + * @event onPositionPacket + */ + public readonly onPositionPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a User packet has been - * received from device - * - * @event onUserPacket - */ - public readonly onUserPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a User packet has been + * received from device + * + * @event onUserPacket + */ + public readonly onUserPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Routing packet has been - * received from device - * - * @event onRoutingPacket - */ - public readonly onRoutingPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Routing packet has been + * received from device + * + * @event onRoutingPacket + */ + public readonly onRoutingPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when the device receives a Metadata packet - * - * @event onDeviceMetadataPacket - */ - public readonly onDeviceMetadataPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when the device receives a Metadata packet + * + * @event onDeviceMetadataPacket + */ + public readonly onDeviceMetadataPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when the device receives a Canned Message Module message packet - * - * @event onCannedMessageModulePacket - */ - public readonly onCannedMessageModulePacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when the device receives a Canned Message Module message packet + * + * @event onCannedMessageModulePacket + */ + public readonly onCannedMessageModulePacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Waypoint packet has been - * received from device - * - * @event onWaypointPacket - */ - public readonly onWaypointPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Waypoint packet has been + * received from device + * + * @event onWaypointPacket + */ + public readonly onWaypointPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing an Audio packet has been - * received from device - * - * @event onAudioPacket - */ - public readonly onAudioPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing an Audio packet has been + * received from device + * + * @event onAudioPacket + */ + public readonly onAudioPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Detection Sensor packet has been - * received from device - * - * @event onDetectionSensorPacket - */ - public readonly onDetectionSensorPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Detection Sensor packet has been + * received from device + * + * @event onDetectionSensorPacket + */ + public readonly onDetectionSensorPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Ping packet has been - * received from device - * - * @event onPingPacket - */ - public readonly onPingPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Ping packet has been + * received from device + * + * @event onPingPacket + */ + public readonly onPingPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a IP Tunnel packet has been - * received from device - * - * @event onIpTunnelPacket - */ - public readonly onIpTunnelPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a IP Tunnel packet has been + * received from device + * + * @event onIpTunnelPacket + */ + public readonly onIpTunnelPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Paxcounter packet has been - * received from device - * - * @event onPaxcounterPacket - */ - public readonly onPaxcounterPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Paxcounter packet has been + * received from device + * + * @event onPaxcounterPacket + */ + public readonly onPaxcounterPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Serial packet has been - * received from device - * - * @event onSerialPacket - */ - public readonly onSerialPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Serial packet has been + * received from device + * + * @event onSerialPacket + */ + public readonly onSerialPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Store and Forward packet - * has been received from device - * - * @event onStoreForwardPacket - */ - public readonly onStoreForwardPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Store and Forward packet + * has been received from device + * + * @event onStoreForwardPacket + */ + public readonly onStoreForwardPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Store and Forward packet - * has been received from device - * - * @event onRangeTestPacket - */ - public readonly onRangeTestPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Store and Forward packet + * has been received from device + * + * @event onRangeTestPacket + */ + public readonly onRangeTestPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Telemetry packet has been - * received from device - * - * @event onTelemetryPacket - */ - public readonly onTelemetryPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Telemetry packet has been + * received from device + * + * @event onTelemetryPacket + */ + public readonly onTelemetryPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a ZPS packet has been - * received from device - * - * @event onZPSPacket - */ - public readonly onZpsPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a ZPS packet has been + * received from device + * + * @event onZPSPacket + */ + public readonly onZpsPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Simulator packet has been - * received from device - * - * @event onSimulatorPacket - */ - public readonly onSimulatorPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Simulator packet has been + * received from device + * + * @event onSimulatorPacket + */ + public readonly onSimulatorPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Trace Route packet has been - * received from device - * - * @event onTraceRoutePacket - */ - public readonly onTraceRoutePacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Trace Route packet has been + * received from device + * + * @event onTraceRoutePacket + */ + public readonly onTraceRoutePacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Neighbor Info packet has been - * received from device - * - * @event onNeighborInfoPacket - */ - public readonly onNeighborInfoPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Neighbor Info packet has been + * received from device + * + * @event onNeighborInfoPacket + */ + public readonly onNeighborInfoPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing an ATAK packet has been - * received from device - * - * @event onAtakPluginPacket - */ - public readonly onAtakPluginPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing an ATAK packet has been + * received from device + * + * @event onAtakPluginPacket + */ + public readonly onAtakPluginPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Map Report packet has been - * received from device - * - * @event onMapReportPacket - */ - public readonly onMapReportPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Map Report packet has been + * received from device + * + * @event onMapReportPacket + */ + public readonly onMapReportPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing a Private packet has been - * received from device - * - * @event onPrivatePacket - */ - public readonly onPrivatePacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing a Private packet has been + * received from device + * + * @event onPrivatePacket + */ + public readonly onPrivatePacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when a new MeshPacket message containing an ATAK Forwarder packet has been - * received from device - * - * @event onAtakForwarderPacket - */ - public readonly onAtakForwarderPacket: SimpleEventDispatcher< - PacketMetadata - > = new SimpleEventDispatcher< - PacketMetadata - >(); + /** + * Fires when a new MeshPacket message containing an ATAK Forwarder packet has been + * received from device + * + * @event onAtakForwarderPacket + */ + public readonly onAtakForwarderPacket: SimpleEventDispatcher< + PacketMetadata + > = new SimpleEventDispatcher>(); - /** - * Fires when the devices connection or configuration status changes - * - * @event onDeviceStatus - */ - public readonly onDeviceStatus: SimpleEventDispatcher< - Types.DeviceStatusEnum - > = new SimpleEventDispatcher< - Types.DeviceStatusEnum - >(); + /** + * Fires when the devices connection or configuration status changes + * + * @event onDeviceStatus + */ + public readonly onDeviceStatus: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a new FromRadio message containing a LogRecord packet has been - * received from device - * - * @event onLogRecord - */ - public readonly onLogRecord: SimpleEventDispatcher< - Protobuf.Mesh.LogRecord - > = new SimpleEventDispatcher< - Protobuf.Mesh.LogRecord - >(); + /** + * Fires when a new FromRadio message containing a LogRecord packet has been + * received from device + * + * @event onLogRecord + */ + public readonly onLogRecord: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when the device receives a meshPacket, returns a timestamp - * - * @event onMeshHeartbeat - */ - public readonly onMeshHeartbeat: SimpleEventDispatcher = - new SimpleEventDispatcher(); + /** + * Fires when the device receives a meshPacket, returns a timestamp + * + * @event onMeshHeartbeat + */ + public readonly onMeshHeartbeat: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Outputs any debug log data (currently serial connections only) - * - * @event onDeviceDebugLog - */ - public readonly onDeviceDebugLog: SimpleEventDispatcher = - new SimpleEventDispatcher(); + /** + * Outputs any debug log data (currently serial connections only) + * + * @event onDeviceDebugLog + */ + public readonly onDeviceDebugLog: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Outputs status of pending settings changes - * - * @event onpendingSettingsChange - */ - public readonly onPendingSettingsChange: SimpleEventDispatcher< - boolean - > = new SimpleEventDispatcher< - boolean - >(); + /** + * Outputs status of pending settings changes + * + * @event onpendingSettingsChange + */ + public readonly onPendingSettingsChange: SimpleEventDispatcher = + new SimpleEventDispatcher(); - /** - * Fires when a QueueStatus message is generated - * - * @event onQueueStatus - */ - public readonly onQueueStatus: SimpleEventDispatcher< - Protobuf.Mesh.QueueStatus - > = new SimpleEventDispatcher< - Protobuf.Mesh.QueueStatus - >(); + /** + * Fires when a QueueStatus message is generated + * + * @event onQueueStatus + */ + public readonly onQueueStatus: SimpleEventDispatcher = + new SimpleEventDispatcher(); } diff --git a/packages/core/src/utils/queue.ts b/packages/core/src/utils/queue.ts index 4e2f26af..1e24e82c 100644 --- a/packages/core/src/utils/queue.ts +++ b/packages/core/src/utils/queue.ts @@ -1,119 +1,119 @@ -import { SimpleEventDispatcher } from "ste-simple-events"; import { fromBinary } from "@bufbuild/protobuf"; import * as Protobuf from "@meshtastic/protobufs"; +import { SimpleEventDispatcher } from "ste-simple-events"; import type { PacketError, QueueItem } from "../types.ts"; export class Queue { - private queue: QueueItem[] = []; - private lock = false; - private ackNotifier = new SimpleEventDispatcher(); - private errorNotifier = new SimpleEventDispatcher(); - private timeout: number; + private queue: QueueItem[] = []; + private lock = false; + private ackNotifier = new SimpleEventDispatcher(); + private errorNotifier = new SimpleEventDispatcher(); + private timeout: number; - constructor() { - this.timeout = 60000; - } + constructor() { + this.timeout = 60000; + } - public getState(): QueueItem[] { - return this.queue; - } + public getState(): QueueItem[] { + return this.queue; + } - public clear(): void { - this.queue = []; - } + public clear(): void { + this.queue = []; + } - public push(item: Omit): void { - const queueItem: QueueItem = { - ...item, - sent: false, - added: new Date(), - promise: new Promise((resolve, reject) => { - this.ackNotifier.subscribe((id) => { - if (item.id === id) { - this.remove(item.id); - resolve(id); - } - }); - this.errorNotifier.subscribe((e) => { - if (item.id === e.id) { - this.remove(item.id); - reject(e); - } - }); - setTimeout(() => { - if (this.queue.findIndex((qi) => qi.id === item.id) !== -1) { - this.remove(item.id); - const decoded = fromBinary(Protobuf.Mesh.ToRadioSchema, item.data); - console.warn( - `Packet ${item.id} of type ${decoded.payloadVariant.case} timed out`, - ); + public push(item: Omit): void { + const queueItem: QueueItem = { + ...item, + sent: false, + added: new Date(), + promise: new Promise((resolve, reject) => { + this.ackNotifier.subscribe((id) => { + if (item.id === id) { + this.remove(item.id); + resolve(id); + } + }); + this.errorNotifier.subscribe((e) => { + if (item.id === e.id) { + this.remove(item.id); + reject(e); + } + }); + setTimeout(() => { + if (this.queue.findIndex((qi) => qi.id === item.id) !== -1) { + this.remove(item.id); + const decoded = fromBinary(Protobuf.Mesh.ToRadioSchema, item.data); + console.warn( + `Packet ${item.id} of type ${decoded.payloadVariant.case} timed out`, + ); - reject({ - id: item.id, - error: Protobuf.Mesh.Routing_Error.TIMEOUT, - }); - } - }, this.timeout); - }), - }; - this.queue.push(queueItem); - } + reject({ + id: item.id, + error: Protobuf.Mesh.Routing_Error.TIMEOUT, + }); + } + }, this.timeout); + }), + }; + this.queue.push(queueItem); + } - public remove(id: number): void { - if (this.lock) { - setTimeout(() => this.remove(id), 100); - return; - } - this.queue = this.queue.filter((item) => item.id !== id); - } + public remove(id: number): void { + if (this.lock) { + setTimeout(() => this.remove(id), 100); + return; + } + this.queue = this.queue.filter((item) => item.id !== id); + } - public processAck(id: number): void { - this.ackNotifier.dispatch(id); - } + public processAck(id: number): void { + this.ackNotifier.dispatch(id); + } - public processError(e: PacketError): void { - console.error( - `Error received for packet ${e.id}: ${ - Protobuf.Mesh.Routing_Error[e.error] - }`, - ); - this.errorNotifier.dispatch(e); - } + public processError(e: PacketError): void { + console.error( + `Error received for packet ${e.id}: ${ + Protobuf.Mesh.Routing_Error[e.error] + }`, + ); + this.errorNotifier.dispatch(e); + } - public wait(id: number): Promise { - const queueItem = this.queue.find((qi) => qi.id === id); - if (!queueItem) { - throw new Error("Packet does not exist"); - } - return queueItem.promise; - } + public wait(id: number): Promise { + const queueItem = this.queue.find((qi) => qi.id === id); + if (!queueItem) { + throw new Error("Packet does not exist"); + } + return queueItem.promise; + } - public async processQueue( - outputStream: WritableStream, - ): Promise { - if (this.lock) { - return; - } + public async processQueue( + outputStream: WritableStream, + ): Promise { + if (this.lock) { + return; + } - this.lock = true; - const writer = outputStream.getWriter(); + this.lock = true; + const writer = outputStream.getWriter(); - try { - while (this.queue.filter((p) => !p.sent).length > 0) { - const item = this.queue.filter((p) => !p.sent)[0]; - if (item) { - await new Promise((resolve) => setTimeout(resolve, 200)); - try { - await writer.write(item.data); - item.sent = true; - } catch (error) { - console.error(`Error sending packet ${item.id}`, error); - } - } - } - } finally { - writer.releaseLock(); - this.lock = false; - } - } + try { + while (this.queue.filter((p) => !p.sent).length > 0) { + const item = this.queue.filter((p) => !p.sent)[0]; + if (item) { + await new Promise((resolve) => setTimeout(resolve, 200)); + try { + await writer.write(item.data); + item.sent = true; + } catch (error) { + console.error(`Error sending packet ${item.id}`, error); + } + } + } + } finally { + writer.releaseLock(); + this.lock = false; + } + } } diff --git a/packages/core/src/utils/transform/decodePacket.ts b/packages/core/src/utils/transform/decodePacket.ts index 60cecc22..fa7d1611 100644 --- a/packages/core/src/utils/transform/decodePacket.ts +++ b/packages/core/src/utils/transform/decodePacket.ts @@ -1,222 +1,222 @@ import { fromBinary } from "@bufbuild/protobuf"; -import type { DeviceOutput } from "../../types.ts"; import { Constants, Protobuf, Types } from "../../../mod.ts"; import type { MeshDevice } from "../../../mod.ts"; +import type { DeviceOutput } from "../../types.ts"; export const decodePacket = (device: MeshDevice) => - new WritableStream({ - write(chunk) { - switch (chunk.type) { - case "debug": { - break; - } - case "packet": { - const decodedMessage = fromBinary( - Protobuf.Mesh.FromRadioSchema, - chunk.data, - ); - device.events.onFromRadio.dispatch(decodedMessage); + new WritableStream({ + write(chunk) { + switch (chunk.type) { + case "debug": { + break; + } + case "packet": { + const decodedMessage = fromBinary( + Protobuf.Mesh.FromRadioSchema, + chunk.data, + ); + device.events.onFromRadio.dispatch(decodedMessage); - /** @todo Add map here when `all=true` gets fixed. */ - switch (decodedMessage.payloadVariant.case) { - case "packet": { - device.handleMeshPacket(decodedMessage.payloadVariant.value); - break; - } + /** @todo Add map here when `all=true` gets fixed. */ + switch (decodedMessage.payloadVariant.case) { + case "packet": { + device.handleMeshPacket(decodedMessage.payloadVariant.value); + break; + } - case "myInfo": { - device.events.onMyNodeInfo.dispatch( - decodedMessage.payloadVariant.value, - ); - device.log.info( - Types.Emitter[Types.Emitter.HandleFromRadio], - "📱 Received Node info for this device", - ); - break; - } + case "myInfo": { + device.events.onMyNodeInfo.dispatch( + decodedMessage.payloadVariant.value, + ); + device.log.info( + Types.Emitter[Types.Emitter.HandleFromRadio], + "📱 Received Node info for this device", + ); + break; + } - case "nodeInfo": { - device.log.info( - Types.Emitter[Types.Emitter.HandleFromRadio], - `📱 Received Node Info packet for node: ${decodedMessage.payloadVariant.value.num}`, - ); + case "nodeInfo": { + device.log.info( + Types.Emitter[Types.Emitter.HandleFromRadio], + `📱 Received Node Info packet for node: ${decodedMessage.payloadVariant.value.num}`, + ); - device.events.onNodeInfoPacket.dispatch( - decodedMessage.payloadVariant.value, - ); + device.events.onNodeInfoPacket.dispatch( + decodedMessage.payloadVariant.value, + ); - //TODO: HERE - if (decodedMessage.payloadVariant.value.position) { - device.events.onPositionPacket.dispatch({ - id: decodedMessage.id, - rxTime: new Date(), - from: decodedMessage.payloadVariant.value.num, - to: decodedMessage.payloadVariant.value.num, - type: "direct", - channel: Types.ChannelNumber.Primary, - data: decodedMessage.payloadVariant.value.position, - }); - } + //TODO: HERE + if (decodedMessage.payloadVariant.value.position) { + device.events.onPositionPacket.dispatch({ + id: decodedMessage.id, + rxTime: new Date(), + from: decodedMessage.payloadVariant.value.num, + to: decodedMessage.payloadVariant.value.num, + type: "direct", + channel: Types.ChannelNumber.Primary, + data: decodedMessage.payloadVariant.value.position, + }); + } - //TODO: HERE - if (decodedMessage.payloadVariant.value.user) { - device.events.onUserPacket.dispatch({ - id: decodedMessage.id, - rxTime: new Date(), - from: decodedMessage.payloadVariant.value.num, - to: decodedMessage.payloadVariant.value.num, - type: "direct", - channel: Types.ChannelNumber.Primary, - data: decodedMessage.payloadVariant.value.user, - }); - } - break; - } + //TODO: HERE + if (decodedMessage.payloadVariant.value.user) { + device.events.onUserPacket.dispatch({ + id: decodedMessage.id, + rxTime: new Date(), + from: decodedMessage.payloadVariant.value.num, + to: decodedMessage.payloadVariant.value.num, + type: "direct", + channel: Types.ChannelNumber.Primary, + data: decodedMessage.payloadVariant.value.user, + }); + } + break; + } - case "config": { - if (decodedMessage.payloadVariant.value.payloadVariant.case) { - device.log.trace( - Types.Emitter[Types.Emitter.HandleFromRadio], - `💾 Received Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`, - ); - } else { - device.log.warn( - Types.Emitter[Types.Emitter.HandleFromRadio], - `⚠️ Received Config packet of variant: ${"UNK"}`, - ); - } + case "config": { + if (decodedMessage.payloadVariant.value.payloadVariant.case) { + device.log.trace( + Types.Emitter[Types.Emitter.HandleFromRadio], + `💾 Received Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`, + ); + } else { + device.log.warn( + Types.Emitter[Types.Emitter.HandleFromRadio], + `⚠️ Received Config packet of variant: ${"UNK"}`, + ); + } - device.events.onConfigPacket.dispatch( - decodedMessage.payloadVariant.value, - ); - break; - } + device.events.onConfigPacket.dispatch( + decodedMessage.payloadVariant.value, + ); + break; + } - case "logRecord": { - device.log.trace( - Types.Emitter[Types.Emitter.HandleFromRadio], - "Received onLogRecord", - ); - device.events.onLogRecord.dispatch( - decodedMessage.payloadVariant.value, - ); - break; - } + case "logRecord": { + device.log.trace( + Types.Emitter[Types.Emitter.HandleFromRadio], + "Received onLogRecord", + ); + device.events.onLogRecord.dispatch( + decodedMessage.payloadVariant.value, + ); + break; + } - case "configCompleteId": { - if (decodedMessage.payloadVariant.value !== device.configId) { - device.log.error( - Types.Emitter[Types.Emitter.HandleFromRadio], - `❌ Invalid config id received from device, expected ${device.configId} but received ${decodedMessage.payloadVariant.value}`, - ); - } + case "configCompleteId": { + if (decodedMessage.payloadVariant.value !== device.configId) { + device.log.error( + Types.Emitter[Types.Emitter.HandleFromRadio], + `❌ Invalid config id received from device, expected ${device.configId} but received ${decodedMessage.payloadVariant.value}`, + ); + } - device.log.info( - Types.Emitter[Types.Emitter.HandleFromRadio], - `⚙️ Valid config id received from device: ${device.configId}`, - ); + device.log.info( + Types.Emitter[Types.Emitter.HandleFromRadio], + `⚙️ Valid config id received from device: ${device.configId}`, + ); - device.updateDeviceStatus( - Types.DeviceStatusEnum.DeviceConfigured, - ); - break; - } + device.updateDeviceStatus( + Types.DeviceStatusEnum.DeviceConfigured, + ); + break; + } - case "rebooted": { - device.configure().catch(() => { - // TODO: FIX, workaround for `wantConfigId` not getting acks. - }); - break; - } + case "rebooted": { + device.configure().catch(() => { + // TODO: FIX, workaround for `wantConfigId` not getting acks. + }); + break; + } - case "moduleConfig": { - if (decodedMessage.payloadVariant.value.payloadVariant.case) { - device.log.trace( - Types.Emitter[Types.Emitter.HandleFromRadio], - `💾 Received Module Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`, - ); - } else { - device.log.warn( - Types.Emitter[Types.Emitter.HandleFromRadio], - "⚠️ Received Module Config packet of variant: UNK", - ); - } + case "moduleConfig": { + if (decodedMessage.payloadVariant.value.payloadVariant.case) { + device.log.trace( + Types.Emitter[Types.Emitter.HandleFromRadio], + `💾 Received Module Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`, + ); + } else { + device.log.warn( + Types.Emitter[Types.Emitter.HandleFromRadio], + "⚠️ Received Module Config packet of variant: UNK", + ); + } - device.events.onModuleConfigPacket.dispatch( - decodedMessage.payloadVariant.value, - ); - break; - } + device.events.onModuleConfigPacket.dispatch( + decodedMessage.payloadVariant.value, + ); + break; + } - case "channel": { - device.log.trace( - Types.Emitter[Types.Emitter.HandleFromRadio], - `🔐 Received Channel: ${decodedMessage.payloadVariant.value.index}`, - ); + case "channel": { + device.log.trace( + Types.Emitter[Types.Emitter.HandleFromRadio], + `🔐 Received Channel: ${decodedMessage.payloadVariant.value.index}`, + ); - device.events.onChannelPacket.dispatch( - decodedMessage.payloadVariant.value, - ); - break; - } + device.events.onChannelPacket.dispatch( + decodedMessage.payloadVariant.value, + ); + break; + } - case "queueStatus": { - device.log.trace( - Types.Emitter[Types.Emitter.HandleFromRadio], - `🚧 Received Queue Status: ${decodedMessage.payloadVariant.value}`, - ); + case "queueStatus": { + device.log.trace( + Types.Emitter[Types.Emitter.HandleFromRadio], + `🚧 Received Queue Status: ${decodedMessage.payloadVariant.value}`, + ); - device.events.onQueueStatus.dispatch( - decodedMessage.payloadVariant.value, - ); - break; - } + device.events.onQueueStatus.dispatch( + decodedMessage.payloadVariant.value, + ); + break; + } - case "xmodemPacket": { - device.xModem.handlePacket(decodedMessage.payloadVariant.value); - break; - } + case "xmodemPacket": { + device.xModem.handlePacket(decodedMessage.payloadVariant.value); + break; + } - case "metadata": { - if ( - Number.parseFloat( - decodedMessage.payloadVariant.value.firmwareVersion, - ) < Constants.minFwVer - ) { - device.log.fatal( - Types.Emitter[Types.Emitter.HandleFromRadio], - `Device firmware outdated. Min supported: ${Constants.minFwVer} got : ${decodedMessage.payloadVariant.value.firmwareVersion}`, - ); - } - device.log.debug( - Types.Emitter[Types.Emitter.GetMetadata], - "🏷️ Received metadata packet", - ); + case "metadata": { + if ( + Number.parseFloat( + decodedMessage.payloadVariant.value.firmwareVersion, + ) < Constants.minFwVer + ) { + device.log.fatal( + Types.Emitter[Types.Emitter.HandleFromRadio], + `Device firmware outdated. Min supported: ${Constants.minFwVer} got : ${decodedMessage.payloadVariant.value.firmwareVersion}`, + ); + } + device.log.debug( + Types.Emitter[Types.Emitter.GetMetadata], + "🏷️ Received metadata packet", + ); - device.events.onDeviceMetadataPacket.dispatch({ - id: decodedMessage.id, - rxTime: new Date(), - from: 0, - to: 0, - type: "direct", - channel: Types.ChannelNumber.Primary, - data: decodedMessage.payloadVariant.value, - }); - break; - } + device.events.onDeviceMetadataPacket.dispatch({ + id: decodedMessage.id, + rxTime: new Date(), + from: 0, + to: 0, + type: "direct", + channel: Types.ChannelNumber.Primary, + data: decodedMessage.payloadVariant.value, + }); + break; + } - case "mqttClientProxyMessage": { - break; - } + case "mqttClientProxyMessage": { + break; + } - default: { - device.log.warn( - Types.Emitter[Types.Emitter.HandleFromRadio], - `⚠️ Unhandled payload variant: ${decodedMessage.payloadVariant.case}`, - ); - } - } - } - } - }, - }); + default: { + device.log.warn( + Types.Emitter[Types.Emitter.HandleFromRadio], + `⚠️ Unhandled payload variant: ${decodedMessage.payloadVariant.case}`, + ); + } + } + } + } + }, + }); diff --git a/packages/core/src/utils/transform/fromDevice.ts b/packages/core/src/utils/transform/fromDevice.ts index 98e66ac3..e9e6e0dc 100644 --- a/packages/core/src/utils/transform/fromDevice.ts +++ b/packages/core/src/utils/transform/fromDevice.ts @@ -1,73 +1,71 @@ import type { DeviceOutput } from "../../types.ts"; export const fromDeviceStream: () => TransformStream = - ( - // onReleaseEvent: SimpleEventDispatcher, - ) => { - let byteBuffer = new Uint8Array([]); - const textDecoder = new TextDecoder(); - return new TransformStream({ - transform(chunk: Uint8Array, controller): void { - // onReleaseEvent.subscribe(() => { - // controller.terminate(); - // }); - byteBuffer = new Uint8Array([...byteBuffer, ...chunk]); - let processingExhausted = false; - while (byteBuffer.length !== 0 && !processingExhausted) { - const framingIndex = byteBuffer.findIndex((byte) => byte === 0x94); - const framingByte2 = byteBuffer[framingIndex + 1]; - if (framingByte2 === 0xc3) { - if (byteBuffer.subarray(0, framingIndex).length) { - controller.enqueue({ - type: "debug", - data: textDecoder.decode(byteBuffer.subarray(0, framingIndex)), - }); - byteBuffer = byteBuffer.subarray(framingIndex); - } + ( + // onReleaseEvent: SimpleEventDispatcher, + ) => { + let byteBuffer = new Uint8Array([]); + const textDecoder = new TextDecoder(); + return new TransformStream({ + transform(chunk: Uint8Array, controller): void { + // onReleaseEvent.subscribe(() => { + // controller.terminate(); + // }); + byteBuffer = new Uint8Array([...byteBuffer, ...chunk]); + let processingExhausted = false; + while (byteBuffer.length !== 0 && !processingExhausted) { + const framingIndex = byteBuffer.findIndex((byte) => byte === 0x94); + const framingByte2 = byteBuffer[framingIndex + 1]; + if (framingByte2 === 0xc3) { + if (byteBuffer.subarray(0, framingIndex).length) { + controller.enqueue({ + type: "debug", + data: textDecoder.decode(byteBuffer.subarray(0, framingIndex)), + }); + byteBuffer = byteBuffer.subarray(framingIndex); + } - const msb = byteBuffer[2]; - const lsb = byteBuffer[3]; + const msb = byteBuffer[2]; + const lsb = byteBuffer[3]; - if ( - msb !== undefined && - lsb !== undefined && - byteBuffer.length >= 4 + (msb << 8) + lsb - ) { - const packet = byteBuffer.subarray(4, 4 + (msb << 8) + lsb); + if ( + msb !== undefined && + lsb !== undefined && + byteBuffer.length >= 4 + (msb << 8) + lsb + ) { + const packet = byteBuffer.subarray(4, 4 + (msb << 8) + lsb); - const malformedDetectorIndex = packet.findIndex( - (byte) => byte === 0x94, - ); - if ( - malformedDetectorIndex !== -1 && - packet[malformedDetectorIndex + 1] === 0xc3 - ) { - console.warn( - `⚠️ Malformed packet found, discarding: ${ - byteBuffer - .subarray(0, malformedDetectorIndex - 1) - .toString() - }`, - ); + const malformedDetectorIndex = packet.findIndex( + (byte) => byte === 0x94, + ); + if ( + malformedDetectorIndex !== -1 && + packet[malformedDetectorIndex + 1] === 0xc3 + ) { + console.warn( + `⚠️ Malformed packet found, discarding: ${byteBuffer + .subarray(0, malformedDetectorIndex - 1) + .toString()}`, + ); - byteBuffer = byteBuffer.subarray(malformedDetectorIndex); - } else { - byteBuffer = byteBuffer.subarray(3 + (msb << 8) + lsb + 1); + byteBuffer = byteBuffer.subarray(malformedDetectorIndex); + } else { + byteBuffer = byteBuffer.subarray(3 + (msb << 8) + lsb + 1); - controller.enqueue({ - type: "packet", - data: packet, - }); - } - } else { - /** Only partioal message in buffer, wait for the rest */ - processingExhausted = true; - } - } else { - /** Message not complete, only 1 byte in buffer */ - processingExhausted = true; - } - } - }, - }); - }; + controller.enqueue({ + type: "packet", + data: packet, + }); + } + } else { + /** Only partioal message in buffer, wait for the rest */ + processingExhausted = true; + } + } else { + /** Message not complete, only 1 byte in buffer */ + processingExhausted = true; + } + } + }, + }); + }; diff --git a/packages/core/src/utils/transform/toDevice.ts b/packages/core/src/utils/transform/toDevice.ts index ef8e2203..a453a0ed 100644 --- a/packages/core/src/utils/transform/toDevice.ts +++ b/packages/core/src/utils/transform/toDevice.ts @@ -2,15 +2,15 @@ * Pads packets with appropriate framing information before writing to the output stream. */ export const toDeviceStream: TransformStream = - new TransformStream({ - transform(chunk: Uint8Array, controller): void { - const bufLen = chunk.length; - const header = new Uint8Array([ - 0x94, - 0xC3, - (bufLen >> 8) & 0xFF, - bufLen & 0xFF, - ]); - controller.enqueue(new Uint8Array([...header, ...chunk])); - }, - }); + new TransformStream({ + transform(chunk: Uint8Array, controller): void { + const bufLen = chunk.length; + const header = new Uint8Array([ + 0x94, + 0xc3, + (bufLen >> 8) & 0xff, + bufLen & 0xff, + ]); + controller.enqueue(new Uint8Array([...header, ...chunk])); + }, + }); diff --git a/packages/core/src/utils/xmodem.ts b/packages/core/src/utils/xmodem.ts index 47f2c3b1..16c63672 100644 --- a/packages/core/src/utils/xmodem.ts +++ b/packages/core/src/utils/xmodem.ts @@ -1,135 +1,135 @@ -import crc16ccitt from "crc/calculators/crc16ccitt"; import { create, toBinary } from "@bufbuild/protobuf"; import * as Protobuf from "@meshtastic/protobufs"; +import crc16ccitt from "crc/calculators/crc16ccitt"; //if counter > 35 then reset counter/clear/error/reject promise type XmodemProps = (toRadio: Uint8Array, id?: number) => Promise; export class Xmodem { - private sendRaw: XmodemProps; - private rxBuffer: Uint8Array[]; - private txBuffer: Uint8Array[]; - private textEncoder: TextEncoder; - private counter: number; + private sendRaw: XmodemProps; + private rxBuffer: Uint8Array[]; + private txBuffer: Uint8Array[]; + private textEncoder: TextEncoder; + private counter: number; - constructor(sendRaw: XmodemProps) { - this.sendRaw = sendRaw; - this.rxBuffer = []; - this.txBuffer = []; - this.textEncoder = new TextEncoder(); - this.counter = 0; - } + constructor(sendRaw: XmodemProps) { + this.sendRaw = sendRaw; + this.rxBuffer = []; + this.txBuffer = []; + this.textEncoder = new TextEncoder(); + this.counter = 0; + } - async downloadFile(filename: string): Promise { - return await this.sendCommand( - Protobuf.Xmodem.XModem_Control.STX, - this.textEncoder.encode(filename), - 0, - ); - } + async downloadFile(filename: string): Promise { + return await this.sendCommand( + Protobuf.Xmodem.XModem_Control.STX, + this.textEncoder.encode(filename), + 0, + ); + } - async uploadFile(filename: string, data: Uint8Array): Promise { - for (let i = 0; i < data.length; i += 128) { - this.txBuffer.push(data.slice(i, i + 128)); - } + async uploadFile(filename: string, data: Uint8Array): Promise { + for (let i = 0; i < data.length; i += 128) { + this.txBuffer.push(data.slice(i, i + 128)); + } - return await this.sendCommand( - Protobuf.Xmodem.XModem_Control.SOH, - this.textEncoder.encode(filename), - 0, - ); - } + return await this.sendCommand( + Protobuf.Xmodem.XModem_Control.SOH, + this.textEncoder.encode(filename), + 0, + ); + } - async sendCommand( - command: Protobuf.Xmodem.XModem_Control, - buffer?: Uint8Array, - sequence?: number, - crc16?: number, - ): Promise { - const toRadio = create(Protobuf.Mesh.ToRadioSchema, { - payloadVariant: { - case: "xmodemPacket", - value: { - buffer, - control: command, - seq: sequence, - crc16: crc16, - }, - }, - }); - return await this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); - } + async sendCommand( + command: Protobuf.Xmodem.XModem_Control, + buffer?: Uint8Array, + sequence?: number, + crc16?: number, + ): Promise { + const toRadio = create(Protobuf.Mesh.ToRadioSchema, { + payloadVariant: { + case: "xmodemPacket", + value: { + buffer, + control: command, + seq: sequence, + crc16: crc16, + }, + }, + }); + return await this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio)); + } - async handlePacket(packet: Protobuf.Xmodem.XModem): Promise { - await new Promise((resolve) => setTimeout(resolve, 100)); + async handlePacket(packet: Protobuf.Xmodem.XModem): Promise { + await new Promise((resolve) => setTimeout(resolve, 100)); - switch (packet.control) { - case Protobuf.Xmodem.XModem_Control.NUL: { - // nothing - break; - } - case Protobuf.Xmodem.XModem_Control.SOH: { - this.counter = packet.seq; - if (this.validateCrc16(packet)) { - this.rxBuffer[this.counter] = packet.buffer; - return this.sendCommand(Protobuf.Xmodem.XModem_Control.ACK); - } - return await this.sendCommand( - Protobuf.Xmodem.XModem_Control.NAK, - undefined, - packet.seq, - ); - } - case Protobuf.Xmodem.XModem_Control.STX: { - break; - } - case Protobuf.Xmodem.XModem_Control.EOT: { - // end of transmission - break; - } - case Protobuf.Xmodem.XModem_Control.ACK: { - this.counter++; - if (this.txBuffer[this.counter - 1]) { - return this.sendCommand( - Protobuf.Xmodem.XModem_Control.SOH, - this.txBuffer[this.counter - 1], - this.counter, - crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()), - ); - } - if (this.counter === this.txBuffer.length + 1) { - return this.sendCommand(Protobuf.Xmodem.XModem_Control.EOT); - } - this.clear(); - break; - } - case Protobuf.Xmodem.XModem_Control.NAK: { - return this.sendCommand( - Protobuf.Xmodem.XModem_Control.SOH, - this.txBuffer[this.counter], - this.counter, - crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()), - ); - } - case Protobuf.Xmodem.XModem_Control.CAN: { - this.clear(); - break; - } - case Protobuf.Xmodem.XModem_Control.CTRLZ: { - break; - } - } + switch (packet.control) { + case Protobuf.Xmodem.XModem_Control.NUL: { + // nothing + break; + } + case Protobuf.Xmodem.XModem_Control.SOH: { + this.counter = packet.seq; + if (this.validateCrc16(packet)) { + this.rxBuffer[this.counter] = packet.buffer; + return this.sendCommand(Protobuf.Xmodem.XModem_Control.ACK); + } + return await this.sendCommand( + Protobuf.Xmodem.XModem_Control.NAK, + undefined, + packet.seq, + ); + } + case Protobuf.Xmodem.XModem_Control.STX: { + break; + } + case Protobuf.Xmodem.XModem_Control.EOT: { + // end of transmission + break; + } + case Protobuf.Xmodem.XModem_Control.ACK: { + this.counter++; + if (this.txBuffer[this.counter - 1]) { + return this.sendCommand( + Protobuf.Xmodem.XModem_Control.SOH, + this.txBuffer[this.counter - 1], + this.counter, + crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()), + ); + } + if (this.counter === this.txBuffer.length + 1) { + return this.sendCommand(Protobuf.Xmodem.XModem_Control.EOT); + } + this.clear(); + break; + } + case Protobuf.Xmodem.XModem_Control.NAK: { + return this.sendCommand( + Protobuf.Xmodem.XModem_Control.SOH, + this.txBuffer[this.counter], + this.counter, + crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()), + ); + } + case Protobuf.Xmodem.XModem_Control.CAN: { + this.clear(); + break; + } + case Protobuf.Xmodem.XModem_Control.CTRLZ: { + break; + } + } - return Promise.resolve(0); - } + return Promise.resolve(0); + } - validateCrc16(packet: Protobuf.Xmodem.XModem): boolean { - return crc16ccitt(packet.buffer) === packet.crc16; - } + validateCrc16(packet: Protobuf.Xmodem.XModem): boolean { + return crc16ccitt(packet.buffer) === packet.crc16; + } - clear() { - this.counter = 0; - this.rxBuffer = []; - this.txBuffer = []; - } + clear() { + this.counter = 0; + this.rxBuffer = []; + this.txBuffer = []; + } } diff --git a/packages/transport-deno/deno.json b/packages/transport-deno/deno.json index 39a9178a..f9e6e4ab 100644 --- a/packages/transport-deno/deno.json +++ b/packages/transport-deno/deno.json @@ -1,8 +1,8 @@ { - "name": "@meshtastic/transport-deno", - "version": "0.1.1", - "description": "Deno-specific transport layer for Meshtastic web applications.", - "exports": { - ".": "./mod.ts" - } + "name": "@meshtastic/transport-deno", + "version": "0.1.1", + "description": "Deno-specific transport layer for Meshtastic web applications.", + "exports": { + ".": "./mod.ts" + } } diff --git a/packages/transport-deno/src/transport.ts b/packages/transport-deno/src/transport.ts index c5ef2bb7..c778cd30 100644 --- a/packages/transport-deno/src/transport.ts +++ b/packages/transport-deno/src/transport.ts @@ -2,31 +2,31 @@ import { Utils } from "@meshtastic/core"; import type { Types } from "@meshtastic/core"; export class TransportDeno implements Types.Transport { - private _toDevice: WritableStream; - private _fromDevice: ReadableStream; + private _toDevice: WritableStream; + private _fromDevice: ReadableStream; - public static async create(hostname: string): Promise { - const connection = await Deno.connect({ - hostname, - port: 4403, - }); - return new TransportDeno(connection); - } + public static async create(hostname: string): Promise { + const connection = await Deno.connect({ + hostname, + port: 4403, + }); + return new TransportDeno(connection); + } - constructor(connection: Deno.Conn) { - Utils.toDeviceStream.readable.pipeTo(connection.writable); + constructor(connection: Deno.Conn) { + Utils.toDeviceStream.readable.pipeTo(connection.writable); - this._toDevice = Utils.toDeviceStream.writable; - this._fromDevice = connection.readable.pipeThrough( - Utils.fromDeviceStream(), - ); - } + this._toDevice = Utils.toDeviceStream.writable; + this._fromDevice = connection.readable.pipeThrough( + Utils.fromDeviceStream(), + ); + } - get toDevice(): WritableStream { - return this._toDevice; - } + get toDevice(): WritableStream { + return this._toDevice; + } - get fromDevice(): ReadableStream { - return this._fromDevice; - } + get fromDevice(): ReadableStream { + return this._fromDevice; + } } diff --git a/packages/transport-http/deno.json b/packages/transport-http/deno.json index 0c3bf171..ff0419e0 100644 --- a/packages/transport-http/deno.json +++ b/packages/transport-http/deno.json @@ -1,8 +1,8 @@ { - "name": "@meshtastic/transport-http", - "version": "0.2.1", - "description": "A transport layer for Meshtastic applications using HTTP.", - "exports": { - ".": "./mod.ts" - } + "name": "@meshtastic/transport-http", + "version": "0.2.1", + "description": "A transport layer for Meshtastic applications using HTTP.", + "exports": { + ".": "./mod.ts" + } } diff --git a/packages/transport-http/src/transport.ts b/packages/transport-http/src/transport.ts index 03f578aa..ff7825ee 100644 --- a/packages/transport-http/src/transport.ts +++ b/packages/transport-http/src/transport.ts @@ -1,89 +1,89 @@ import type { Types } from "@meshtastic/core"; export class TransportHTTP implements Types.Transport { - private _toDevice: WritableStream; - private _fromDevice: ReadableStream; - private url: string; - private receiveBatchRequests: boolean; - private fetchInterval: number; + private _toDevice: WritableStream; + private _fromDevice: ReadableStream; + private url: string; + private receiveBatchRequests: boolean; + private fetchInterval: number; - public static async create( - address: string, - tls?: boolean, - ): Promise { - const connectionUrl = `${tls ? "https" : "http"}://${address}`; - await fetch(`${connectionUrl}/json/report`); - await Promise.resolve(); - return new TransportHTTP(connectionUrl); - } + public static async create( + address: string, + tls?: boolean, + ): Promise { + const connectionUrl = `${tls ? "https" : "http"}://${address}`; + await fetch(`${connectionUrl}/json/report`); + await Promise.resolve(); + return new TransportHTTP(connectionUrl); + } - constructor(url: string) { - this.url = url; - this.receiveBatchRequests = false; - this.fetchInterval = 3000; + constructor(url: string) { + this.url = url; + this.receiveBatchRequests = false; + this.fetchInterval = 3000; - this._toDevice = new WritableStream({ - write: async (chunk) => { - await this.writeToRadio(chunk); - }, - }); + this._toDevice = new WritableStream({ + write: async (chunk) => { + await this.writeToRadio(chunk); + }, + }); - let controller: ReadableStreamDefaultController; + let controller: ReadableStreamDefaultController; - this._fromDevice = new ReadableStream({ - start: (ctrl) => { - controller = ctrl; - }, - }); + this._fromDevice = new ReadableStream({ + start: (ctrl) => { + controller = ctrl; + }, + }); - setInterval(async () => { - await this.readFromRadio(controller); - }, this.fetchInterval); - } + setInterval(async () => { + await this.readFromRadio(controller); + }, this.fetchInterval); + } - private async readFromRadio( - controller: ReadableStreamDefaultController, - ): Promise { - let readBuffer = new ArrayBuffer(1); - while (readBuffer.byteLength > 0) { - const response = await fetch( - `${this.url}/api/v1/fromradio?all=${ - this.receiveBatchRequests ? "true" : "false" - }`, - { - method: "GET", - headers: { - Accept: "application/x-protobuf", - }, - }, - ); + private async readFromRadio( + controller: ReadableStreamDefaultController, + ): Promise { + let readBuffer = new ArrayBuffer(1); + while (readBuffer.byteLength > 0) { + const response = await fetch( + `${this.url}/api/v1/fromradio?all=${ + this.receiveBatchRequests ? "true" : "false" + }`, + { + method: "GET", + headers: { + Accept: "application/x-protobuf", + }, + }, + ); - readBuffer = await response.arrayBuffer(); + readBuffer = await response.arrayBuffer(); - if (readBuffer.byteLength > 0) { - controller.enqueue({ - type: "packet", - data: new Uint8Array(readBuffer), - }); - } - } - } + if (readBuffer.byteLength > 0) { + controller.enqueue({ + type: "packet", + data: new Uint8Array(readBuffer), + }); + } + } + } - private async writeToRadio(data: Uint8Array): Promise { - await fetch(`${this.url}/api/v1/toradio`, { - method: "PUT", - headers: { - "Content-Type": "application/x-protobuf", - }, - body: data, - }); - } + private async writeToRadio(data: Uint8Array): Promise { + await fetch(`${this.url}/api/v1/toradio`, { + method: "PUT", + headers: { + "Content-Type": "application/x-protobuf", + }, + body: data, + }); + } - get toDevice(): WritableStream { - return this._toDevice; - } + get toDevice(): WritableStream { + return this._toDevice; + } - get fromDevice(): ReadableStream { - return this._fromDevice; - } + get fromDevice(): ReadableStream { + return this._fromDevice; + } } diff --git a/packages/transport-node/deno.json b/packages/transport-node/deno.json index 18f531a6..e3f3698c 100644 --- a/packages/transport-node/deno.json +++ b/packages/transport-node/deno.json @@ -1,8 +1,8 @@ { - "name": "@meshtastic/transport-node", - "version": "0.0.1", - "description": "NodeJS-specific transport layer for Meshtastic web applications.", - "exports": { - ".": "./mod.ts" - } + "name": "@meshtastic/transport-node", + "version": "0.0.1", + "description": "NodeJS-specific transport layer for Meshtastic web applications.", + "exports": { + ".": "./mod.ts" + } } diff --git a/packages/transport-node/src/transport.ts b/packages/transport-node/src/transport.ts index 1f984219..c0c85ef8 100644 --- a/packages/transport-node/src/transport.ts +++ b/packages/transport-node/src/transport.ts @@ -1,77 +1,76 @@ -import { Utils } from "@meshtastic/core"; -import type { Types } from "@meshtastic/core"; import { Socket } from "node:net"; import { Readable, Writable } from "node:stream"; +import { Utils } from "@meshtastic/core"; +import type { Types } from "@meshtastic/core"; export class TransportNode implements Types.Transport { - private readonly _toDevice: WritableStream; - private readonly _fromDevice: ReadableStream; + private readonly _toDevice: WritableStream; + private readonly _fromDevice: ReadableStream; - /** - * Creates and connects a new TransportNode instance. - * @param hostname - The IP address or hostname of the Meshtastic device. - * @param port - The port number for the TCP connection (defaults to 4403). - * @returns A promise that resolves with a connected TransportNode instance. - */ - public static create(hostname: string, port = 4403): Promise { - return new Promise((resolve, reject) => { - const socket = new Socket(); + /** + * Creates and connects a new TransportNode instance. + * @param hostname - The IP address or hostname of the Meshtastic device. + * @param port - The port number for the TCP connection (defaults to 4403). + * @returns A promise that resolves with a connected TransportNode instance. + */ + public static create(hostname: string, port = 4403): Promise { + return new Promise((resolve, reject) => { + const socket = new Socket(); - const onError = (err: Error) => { - socket.destroy(); - reject(err); - }; + const onError = (err: Error) => { + socket.destroy(); + reject(err); + }; - socket.once("error", onError); + socket.once("error", onError); - socket.connect(port, hostname, () => { - socket.removeListener("error", onError); - resolve(new TransportNode(socket)); - }); - }); - } + socket.connect(port, hostname, () => { + socket.removeListener("error", onError); + resolve(new TransportNode(socket)); + }); + }); + } - /** - * Constructs a new TransportNode. - * @param connection - An active Node.js net.Socket connection. - */ - constructor(connection: Socket) { - connection.on("error", (err) => { - console.error("Socket connection error:", err); - }); + /** + * Constructs a new TransportNode. + * @param connection - An active Node.js net.Socket connection. + */ + constructor(connection: Socket) { + connection.on("error", (err) => { + console.error("Socket connection error:", err); + }); - const fromDeviceSource = Readable.toWeb(connection) as ReadableStream< - Uint8Array - >; - this._fromDevice = fromDeviceSource.pipeThrough(Utils.fromDeviceStream()); + const fromDeviceSource = Readable.toWeb( + connection, + ) as ReadableStream; + this._fromDevice = fromDeviceSource.pipeThrough(Utils.fromDeviceStream()); - // Stream for data going FROM the application TO the Meshtastic device. - const toDeviceTransform = new TransformStream(); - this._toDevice = toDeviceTransform.writable; + // Stream for data going FROM the application TO the Meshtastic device. + const toDeviceTransform = new TransformStream(); + this._toDevice = toDeviceTransform.writable; - // The readable end of the transform is then piped to the Node.js socket. - // A similar assertion is needed here because `Writable.toWeb` also returns - // a generically typed stream (`WritableStream`). - toDeviceTransform.readable.pipeTo( - Writable.toWeb(connection) as WritableStream, - ) - .catch((err) => { - console.error("Error piping data to socket:", err); - connection.destroy(err as Error); - }); - } + // The readable end of the transform is then piped to the Node.js socket. + // A similar assertion is needed here because `Writable.toWeb` also returns + // a generically typed stream (`WritableStream`). + toDeviceTransform.readable + .pipeTo(Writable.toWeb(connection) as WritableStream) + .catch((err) => { + console.error("Error piping data to socket:", err); + connection.destroy(err as Error); + }); + } - /** - * The WritableStream to send data to the Meshtastic device. - */ - public get toDevice(): WritableStream { - return this._toDevice; - } + /** + * The WritableStream to send data to the Meshtastic device. + */ + public get toDevice(): WritableStream { + return this._toDevice; + } - /** - * The ReadableStream to receive data from the Meshtastic device. - */ - public get fromDevice(): ReadableStream { - return this._fromDevice; - } + /** + * The ReadableStream to receive data from the Meshtastic device. + */ + public get fromDevice(): ReadableStream { + return this._fromDevice; + } } diff --git a/packages/transport-web-bluetooth/deno.json b/packages/transport-web-bluetooth/deno.json index 169ad310..eb61116a 100644 --- a/packages/transport-web-bluetooth/deno.json +++ b/packages/transport-web-bluetooth/deno.json @@ -1,16 +1,14 @@ { - "name": "@meshtastic/transport-web-bluetooth", - "version": "0.1.2", - "description": "A transport layer for Meshtastic applications using Web Bluetooth.", - "exports": { - ".": "./mod.ts" - }, - "imports": { - "@types/web-bluetooth": "npm:@types/web-bluetooth@^0.0.20" - }, - "compilerOptions": { - "types": [ - "@types/web-bluetooth" - ] - } + "name": "@meshtastic/transport-web-bluetooth", + "version": "0.1.2", + "description": "A transport layer for Meshtastic applications using Web Bluetooth.", + "exports": { + ".": "./mod.ts" + }, + "imports": { + "@types/web-bluetooth": "npm:@types/web-bluetooth@^0.0.20" + }, + "compilerOptions": { + "types": ["@types/web-bluetooth"] + } } diff --git a/packages/transport-web-bluetooth/src/transport.ts b/packages/transport-web-bluetooth/src/transport.ts index d2b9dd61..364e6edc 100644 --- a/packages/transport-web-bluetooth/src/transport.ts +++ b/packages/transport-web-bluetooth/src/transport.ts @@ -1,134 +1,133 @@ import type { Types } from "@meshtastic/core"; export class TransportWebBluetooth implements Types.Transport { - private _toDevice: WritableStream; - private _fromDevice: ReadableStream; - private _fromDeviceController?: ReadableStreamDefaultController< - Types.DeviceOutput - >; - private _isFirstWrite = true; + private _toDevice: WritableStream; + private _fromDevice: ReadableStream; + private _fromDeviceController?: ReadableStreamDefaultController; + private _isFirstWrite = true; - private toRadioCharacteristic: BluetoothRemoteGATTCharacteristic; - private fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic; - private fromNumCharacteristic: BluetoothRemoteGATTCharacteristic; + private toRadioCharacteristic: BluetoothRemoteGATTCharacteristic; + private fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic; + private fromNumCharacteristic: BluetoothRemoteGATTCharacteristic; - static ToRadioUuid = "f75c76d2-129e-4dad-a1dd-7866124401e7"; - static FromRadioUuid = "2c55e69e-4993-11ed-b878-0242ac120002"; - static FromNumUuid = "ed9da18c-a800-4f66-a670-aa7547e34453"; - static ServiceUuid = "6ba1b218-15a8-461f-9fa8-5dcae273eafd"; + static ToRadioUuid = "f75c76d2-129e-4dad-a1dd-7866124401e7"; + static FromRadioUuid = "2c55e69e-4993-11ed-b878-0242ac120002"; + static FromNumUuid = "ed9da18c-a800-4f66-a670-aa7547e34453"; + static ServiceUuid = "6ba1b218-15a8-461f-9fa8-5dcae273eafd"; - public static async create(): Promise { - const device = await navigator.bluetooth.requestDevice({ - filters: [{ services: [this.ServiceUuid] }], - }); - return await this.prepareConnection(device); - } + public static async create(): Promise { + const device = await navigator.bluetooth.requestDevice({ + filters: [{ services: [this.ServiceUuid] }], + }); + return await this.prepareConnection(device); + } - public static async createFromDevice( - device: BluetoothDevice, - ): Promise { - return await this.prepareConnection(device); - } + public static async createFromDevice( + device: BluetoothDevice, + ): Promise { + return await this.prepareConnection(device); + } - public static async prepareConnection( - device: BluetoothDevice, - ): Promise { - const gattServer = await device.gatt?.connect(); + public static async prepareConnection( + device: BluetoothDevice, + ): Promise { + const gattServer = await device.gatt?.connect(); - if (!gattServer) { - throw new Error("Failed to connect to GATT server"); - } + if (!gattServer) { + throw new Error("Failed to connect to GATT server"); + } - const service = await gattServer.getPrimaryService(this.ServiceUuid); + const service = await gattServer.getPrimaryService(this.ServiceUuid); - const toRadioCharacteristic = await service.getCharacteristic( - this.ToRadioUuid, - ); - const fromRadioCharacteristic = await service.getCharacteristic( - this.FromRadioUuid, - ); - const fromNumCharacteristic = await service.getCharacteristic( - this.FromNumUuid, - ); + const toRadioCharacteristic = await service.getCharacteristic( + this.ToRadioUuid, + ); + const fromRadioCharacteristic = await service.getCharacteristic( + this.FromRadioUuid, + ); + const fromNumCharacteristic = await service.getCharacteristic( + this.FromNumUuid, + ); - if ( - !toRadioCharacteristic || !fromRadioCharacteristic || - !fromNumCharacteristic - ) { - throw new Error("Failed to find required characteristics"); - } + if ( + !toRadioCharacteristic || + !fromRadioCharacteristic || + !fromNumCharacteristic + ) { + throw new Error("Failed to find required characteristics"); + } - console.log("Connected to device", device.name); + console.log("Connected to device", device.name); - return new TransportWebBluetooth( - toRadioCharacteristic, - fromRadioCharacteristic, - fromNumCharacteristic, - ); - } + return new TransportWebBluetooth( + toRadioCharacteristic, + fromRadioCharacteristic, + fromNumCharacteristic, + ); + } - constructor( - toRadioCharacteristic: BluetoothRemoteGATTCharacteristic, - fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic, - fromNumCharacteristic: BluetoothRemoteGATTCharacteristic, - ) { - this.toRadioCharacteristic = toRadioCharacteristic; - this.fromRadioCharacteristic = fromRadioCharacteristic; - this.fromNumCharacteristic = fromNumCharacteristic; + constructor( + toRadioCharacteristic: BluetoothRemoteGATTCharacteristic, + fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic, + fromNumCharacteristic: BluetoothRemoteGATTCharacteristic, + ) { + this.toRadioCharacteristic = toRadioCharacteristic; + this.fromRadioCharacteristic = fromRadioCharacteristic; + this.fromNumCharacteristic = fromNumCharacteristic; - this._fromDevice = new ReadableStream({ - start: (ctrl) => { - this._fromDeviceController = ctrl; - }, - }); + this._fromDevice = new ReadableStream({ + start: (ctrl) => { + this._fromDeviceController = ctrl; + }, + }); - this._toDevice = new WritableStream({ - write: async (chunk) => { - await this.toRadioCharacteristic.writeValue(chunk); + this._toDevice = new WritableStream({ + write: async (chunk) => { + await this.toRadioCharacteristic.writeValue(chunk); - if (this._isFirstWrite && this._fromDeviceController) { - this._isFirstWrite = false; - setTimeout(() => { - this.readFromRadio(this._fromDeviceController!); - }, 50); - } - }, - }); + if (this._isFirstWrite && this._fromDeviceController) { + this._isFirstWrite = false; + setTimeout(() => { + this.readFromRadio(this._fromDeviceController!); + }, 50); + } + }, + }); - this.fromNumCharacteristic.addEventListener( - "characteristicvaluechanged", - () => { - if (this._fromDeviceController) { - this.readFromRadio(this._fromDeviceController); - } - }, - ); + this.fromNumCharacteristic.addEventListener( + "characteristicvaluechanged", + () => { + if (this._fromDeviceController) { + this.readFromRadio(this._fromDeviceController); + } + }, + ); - this.fromNumCharacteristic.startNotifications(); - } + this.fromNumCharacteristic.startNotifications(); + } - get toDevice(): WritableStream { - return this._toDevice; - } + get toDevice(): WritableStream { + return this._toDevice; + } - get fromDevice(): ReadableStream { - return this._fromDevice; - } + get fromDevice(): ReadableStream { + return this._fromDevice; + } - protected async readFromRadio( - controller: ReadableStreamDefaultController, - ): Promise { - let hasMoreData = true; - while (hasMoreData && this.fromRadioCharacteristic) { - const value = await this.fromRadioCharacteristic.readValue(); - if (value.byteLength === 0) { - hasMoreData = false; - continue; - } - controller.enqueue({ - type: "packet", - data: new Uint8Array(value.buffer), - }); - } - } + protected async readFromRadio( + controller: ReadableStreamDefaultController, + ): Promise { + let hasMoreData = true; + while (hasMoreData && this.fromRadioCharacteristic) { + const value = await this.fromRadioCharacteristic.readValue(); + if (value.byteLength === 0) { + hasMoreData = false; + continue; + } + controller.enqueue({ + type: "packet", + data: new Uint8Array(value.buffer), + }); + } + } } diff --git a/packages/transport-web-serial/deno.json b/packages/transport-web-serial/deno.json index c6f3ead1..b7fb9e73 100644 --- a/packages/transport-web-serial/deno.json +++ b/packages/transport-web-serial/deno.json @@ -1,16 +1,14 @@ { - "name": "@meshtastic/transport-web-serial", - "version": "0.2.1", - "description": "A transport layer for Meshtastic applications using Web Serial API.", - "exports": { - ".": "./mod.ts" - }, - "imports": { - "@types/w3c-web-serial": "npm:@types/w3c-web-serial@^1.0.7" - }, - "compilerOptions": { - "types": [ - "@types/w3c-web-serial" - ] - } + "name": "@meshtastic/transport-web-serial", + "version": "0.2.1", + "description": "A transport layer for Meshtastic applications using Web Serial API.", + "exports": { + ".": "./mod.ts" + }, + "imports": { + "@types/w3c-web-serial": "npm:@types/w3c-web-serial@^1.0.7" + }, + "compilerOptions": { + "types": ["@types/w3c-web-serial"] + } } diff --git a/packages/transport-web-serial/src/transport.ts b/packages/transport-web-serial/src/transport.ts index 0f445cbe..727dcad6 100644 --- a/packages/transport-web-serial/src/transport.ts +++ b/packages/transport-web-serial/src/transport.ts @@ -2,41 +2,41 @@ import { Utils } from "@meshtastic/core"; import type { Types } from "@meshtastic/core"; export class TransportWebSerial implements Types.Transport { - private _toDevice: WritableStream; - private _fromDevice: ReadableStream; + private _toDevice: WritableStream; + private _fromDevice: ReadableStream; - public static async create(baudRate?: number): Promise { - const port = await navigator.serial.requestPort(); - await port.open({ baudRate: baudRate || 115200 }); - return new TransportWebSerial(port); - } + public static async create(baudRate?: number): Promise { + const port = await navigator.serial.requestPort(); + await port.open({ baudRate: baudRate || 115200 }); + return new TransportWebSerial(port); + } - public static async createFromPort( - port: SerialPort, - baudRate?: number, - ): Promise { - await port.open({ baudRate: baudRate || 115200 }); - return new TransportWebSerial(port); - } + public static async createFromPort( + port: SerialPort, + baudRate?: number, + ): Promise { + await port.open({ baudRate: baudRate || 115200 }); + return new TransportWebSerial(port); + } - constructor(connection: SerialPort) { - if (!connection.readable || !connection.writable) { - throw new Error("Stream not accessible"); - } + constructor(connection: SerialPort) { + if (!connection.readable || !connection.writable) { + throw new Error("Stream not accessible"); + } - Utils.toDeviceStream.readable.pipeTo(connection.writable); + Utils.toDeviceStream.readable.pipeTo(connection.writable); - this._toDevice = Utils.toDeviceStream.writable; - this._fromDevice = connection.readable.pipeThrough( - Utils.fromDeviceStream(), - ); - } + this._toDevice = Utils.toDeviceStream.writable; + this._fromDevice = connection.readable.pipeThrough( + Utils.fromDeviceStream(), + ); + } - get toDevice(): WritableStream { - return this._toDevice; - } + get toDevice(): WritableStream { + return this._toDevice; + } - get fromDevice(): ReadableStream { - return this._fromDevice; - } + get fromDevice(): ReadableStream { + return this._fromDevice; + } } diff --git a/packages/web/README.md b/packages/web/README.md index b64adf57..3bd9f555 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -98,7 +98,7 @@ improve the stability of future releases ## Development & Building You'll need to download the package manager used with this repo. You can install -it by visiting [deno.com](https://deno.com/) and following the installation +it by visiting [bun.sh](https://bun.sh/) and following the installation instructions listed on the home page. ### Development @@ -106,13 +106,13 @@ instructions listed on the home page. Install the dependencies. ```bash -deno i +bun install ``` Start the development server: ```bash -deno task dev +bun run dev ``` ### Building and Packaging @@ -120,33 +120,33 @@ deno task dev Build the project: ```bash -deno task build +bun run build ``` GZip the output: ```bash -deno task package +bun run package ``` -### Why Deno? +### Why Bun? -Meshtastic Web uses Deno as its development platform for several compelling +Meshtastic Web uses Bun as its development platform for several compelling reasons: -- **Built-in Security**: Deno's security-first approach requires explicit - permissions for file, network, and environment access, reducing vulnerability - risks. +- **Fast Performance**: Bun is built from the ground up for speed, offering + significantly faster package installation and bundling compared to other + JavaScript runtimes. - **TypeScript Support**: Native TypeScript support without additional configuration, enhancing code quality and developer experience. - **Modern JavaScript**: First-class support for ESM imports, top-level await, and other modern JavaScript features. -- **Simplified Tooling**: Built-in formatter, linter, test runner, and bundler - eliminate the need for multiple third-party tools. +- **All-in-One Tooling**: Built-in package manager, bundler, test runner, and + transpiler eliminate the need for multiple third-party tools. +- **Node.js Compatibility**: Drop-in replacement for Node.js with better + performance and built-in tooling. - **Reproducible Builds**: Lockfile ensures consistent builds across all environments. -- **Web Standard APIs**: Uses browser-compatible APIs, making code more portable - between server and client environments. ### Contributing diff --git a/packages/web/biome.json b/packages/web/biome.json new file mode 100644 index 00000000..91d7a3e8 --- /dev/null +++ b/packages/web/biome.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.0.5/schema.json", + "files": { + "includes": ["**", "!node_modules/**", "!**/*.css", "!dist/**", "!build/**", "!coverage/**", "!**/*.d.ts"], + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 80, + "attributePosition": "auto" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noExplicitAny": "error", + "noDebugger": "error" + }, + "style": { + "useConst": "error", + "useBlockStatements": "error", + "useSingleVarDeclarator": "off" + }, + "complexity": { + "noForEach": "off" + }, + "correctness": { + "noUnusedVariables": "error", + "noUnusedImports": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "always" + } + }, + "json": { + "formatter": { + "indentStyle": "space", + "indentWidth": 2 + } + } +} diff --git a/packages/web/deno.json b/packages/web/deno.json deleted file mode 100644 index 21f97a4a..00000000 --- a/packages/web/deno.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "imports": { - "@app/": "./src/", - "@public/": "./public/", - "@pages/": "./src/pages/", - "@components/": "./src/components/", - "@core/": "./src/core/", - "@layouts/": "./src/layouts/", - "@std/path": "jsr:@std/path@^1.1.0" - }, - "tasks": { - "build": "vite build", - "build:analyze": "BUNDLE_ANALYZE=true deno task build", - "lint": "deno lint src/", - "lint:fix": "deno lint --fix src/", - "format": "deno fmt src/", - "dev": "deno task dev:ui", - "dev:ui": "VITE_APP_VERSION=development deno run -A npm:vite dev", - "test": "deno run -A npm:vitest", - "check": "deno check", - "preview": "deno run -A npm:vite preview", - "generate:routes": "deno run -A npm:@tanstack/router-cli generate --outDir src/ routes --rootRoutePath /", - "package": "gzipper c -i html,js,css,png,ico,svg,json,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ." - }, - "include": ["src", "./vite-env.d.ts"], - "compilerOptions": { - "lib": [ - "DOM", - "DOM.Iterable", - "ESNext", - "deno.window", - "deno.ns" - ], - "jsx": "react-jsx", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "strictNullChecks": true, - "types": [ - "vite/client", - "node", - "npm:@types/w3c-web-serial", - "npm:@types/web-bluetooth" - ], - "strictPropertyInitialization": false - }, - "exclude": [ - "routeTree.gen.ts", - "node_modules/", - "dist", - "build", - "coverage", - "out", - ".vscode-test" - ] -} diff --git a/packages/web/index.html b/packages/web/index.html index 5c807b35..a3f799e3 100644 --- a/packages/web/index.html +++ b/packages/web/index.html @@ -18,6 +18,11 @@ href="https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/cascadia-code.min.css" crossorigin="anonymous" /> + diff --git a/packages/web/package.json b/packages/web/package.json index 4304fc39..7758275f 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,102 +1,112 @@ { - "name": "meshtastic-web", - "version": "2.7.0-0", - "type": "module", - "description": "Meshtastic web client", - "license": "GPL-3.0-only", - - "repository": { - "type": "git", - "url": "git+https://github.com/meshtastic/web.git" - }, - "bugs": { - "url": "https://github.com/meshtastic/web/issues" - }, - "simple-git-hooks": { - "pre-commit": "deno task lint:fix && deno task format" - }, - "homepage": "https://meshtastic.org", - "dependencies": { - "@bufbuild/protobuf": "^2.6.0", - "@hookform/resolvers": "^5.1.1", - "@meshtastic/core": "npm:@jsr/meshtastic__core@2.6.4", - "@meshtastic/js": "npm:@jsr/meshtastic__js@2.6.0-0", - "@meshtastic/transport-http": "npm:@jsr/meshtastic__transport-http", - "@meshtastic/transport-web-bluetooth": "npm:@jsr/meshtastic__transport-web-bluetooth", - "@meshtastic/transport-web-serial": "npm:@jsr/meshtastic__transport-web-serial", - "@noble/curves": "^1.9.2", - "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-checkbox": "^1.3.2", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-menubar": "^1.1.15", - "@radix-ui/react-popover": "^1.1.14", - "@radix-ui/react-scroll-area": "^1.2.9", - "@radix-ui/react-select": "^2.2.5", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-slider": "^1.3.5", - "@radix-ui/react-switch": "^1.2.5", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-toast": "^1.2.14", - "@radix-ui/react-toggle-group": "^1.1.10", - "@radix-ui/react-tooltip": "^1.2.7", - "@tanstack/react-router": "^1.125.4", - "@tanstack/react-router-devtools": "^1.125.4", - "@tanstack/router-cli": "^1.125.4", - "@tanstack/router-devtools": "^1.125.4", - "@turf/turf": "^7.2.0", - "@types/node": "^24.0.10", - "@types/web-bluetooth": "^0.0.21", - "base64-js": "^1.5.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "crypto-random-string": "^5.0.0", - "i18next": "^25.3.1", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", - "idb-keyval": "^6.2.2", - "immer": "^10.1.1", - "js-cookie": "^3.0.5", - "lucide-react": "^0.525.0", - "maplibre-gl": "5.6.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-error-boundary": "^6.0.0", - "react-hook-form": "^7.60.0", - "react-i18next": "^15.6.0", - "react-map-gl": "8.0.4", - "react-qrcode-logo": "^3.0.0", - "rfc4648": "^1.5.4", - "zod": "^3.25.75", - "zustand": "5.0.6" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.1.11", - "@tanstack/router-plugin": "^1.125.5", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/chrome": "^0.0.329", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@types/serviceworker": "^0.0.140", - "@types/js-cookie": "^3.0.6", - "@types/w3c-web-serial": "^1.0.8", - "@vitejs/plugin-react": "^4.6.0", - "autoprefixer": "^10.4.21", - "gzipper": "^8.2.1", - "happy-dom": "^18.0.1", - "postcss": "^8.5.6", - "simple-git-hooks": "^2.13.0", - "tailwind-merge": "^3.3.1", - "tailwindcss": "^4.1.11", - "tailwindcss-animate": "^1.0.7", - "tar": "^7.4.3", - "testing-library": "^0.0.2", - "typescript": "^5.8.3", - "vite": "^7.0", - "vitest": "^3.2.4" - } + "name": "meshtastic-web", + "version": "2.7.0-0", + "type": "module", + "description": "Meshtastic web client", + "license": "GPL-3.0-only", + "repository": { + "type": "git", + "url": "git+https://github.com/meshtastic/web.git" + }, + "bugs": { + "url": "https://github.com/meshtastic/web/issues" + }, + "simple-git-hooks": { + "pre-commit": "bun run check:fix" + }, + "homepage": "https://meshtastic.org", + "scripts": { + "build": "bunx --bun vite build", + "build:analyze": "BUNDLE_ANALYZE=true bun run build", + "check": "biome check src/", + "check:fix": "biome check --write src/", + "dev": "bunx --bun vite", + "test": "bunx --bun vitest", + "ts:check": "bun run tsc --noEmit", + "preview": "bunx --bun vite preview", + "generate:routes": "bun @tanstack/router-cli generate --outDir src/ routes --rootRoutePath /", + "package": "gzipper c -i html,js,css,png,ico,svg,json,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ." + }, + "dependencies": { + "@bufbuild/protobuf": "^2.6.0", + "@hookform/resolvers": "^5.1.1", + "@meshtastic/core": "npm:@jsr/meshtastic__core@2.6.4", + "@meshtastic/transport-http": "npm:@jsr/meshtastic__transport-http", + "@meshtastic/transport-web-bluetooth": "npm:@jsr/meshtastic__transport-web-bluetooth", + "@meshtastic/transport-web-serial": "npm:@jsr/meshtastic__transport-web-serial", + "@noble/curves": "^1.9.2", + "@radix-ui/react-accordion": "^1.2.11", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-menubar": "^1.1.15", + "@radix-ui/react-popover": "^1.1.14", + "@radix-ui/react-scroll-area": "^1.2.9", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slider": "^1.3.5", + "@radix-ui/react-switch": "^1.2.5", + "@radix-ui/react-tabs": "^1.1.12", + "@radix-ui/react-toast": "^1.2.14", + "@radix-ui/react-toggle-group": "^1.1.10", + "@radix-ui/react-tooltip": "^1.2.7", + "@tailwindcss/vite": "^4.1.11", + "@tanstack/react-router": "^1.127.9", + "@tanstack/react-router-devtools": "^1.127.9", + "@tanstack/router-cli": "^1.127.8", + "@tanstack/router-devtools": "^1.127.9", + "@turf/turf": "^7.2.0", + "@types/node": "^24.0.14", + "@types/web-bluetooth": "^0.0.21", + "base64-js": "^1.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "crypto-random-string": "^5.0.0", + "i18next": "^25.3.2", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", + "idb-keyval": "^6.2.2", + "immer": "^10.1.1", + "js-cookie": "^3.0.5", + "lucide-react": "^0.525.0", + "maplibre-gl": "5.6.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-error-boundary": "^6.0.0", + "react-hook-form": "^7.60.0", + "react-i18next": "^15.6.0", + "react-map-gl": "8.0.4", + "react-qrcode-logo": "^3.0.0", + "rfc4648": "^1.5.4", + "zod": "^4.0.5", + "zustand": "5.0.6" + }, + "devDependencies": { + "@biomejs/biome": "2.0.6", + "@tanstack/router-plugin": "^1.127.9", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/chrome": "^0.1.0", + "@types/js-cookie": "^3.0.6", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@types/serviceworker": "^0.0.142", + "@types/w3c-web-serial": "^1.0.8", + "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.21", + "gzipper": "^8.2.1", + "happy-dom": "^18.0.1", + "simple-git-hooks": "^2.13.0", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.11", + "tailwindcss-animate": "^1.0.7", + "tar": "^7.4.3", + "testing-library": "^0.0.2", + "typescript": "^5.8.3", + "vite": "^7.0.4", + "vitest": "^3.2.4" + } } diff --git a/packages/web/postcss.config.cjs b/packages/web/postcss.config.cjs deleted file mode 100644 index 483f3785..00000000 --- a/packages/web/postcss.config.cjs +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - "@tailwindcss/postcss": {}, - }, -}; diff --git a/packages/web/public/i18n/locales/bg-BG/channels.json b/packages/web/public/i18n/locales/bg-BG/channels.json index 55eb07d9..0771b90d 100644 --- a/packages/web/public/i18n/locales/bg-BG/channels.json +++ b/packages/web/public/i18n/locales/bg-BG/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Канали", - "channelName": "Канал: {{channelName}}", - "broadcastLabel": "Primary", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Настройки на канала", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Роля", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Генериране" - }, - "name": { - "label": "Име", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Местоположение", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Да не се споделя местоположението", - "precise": "Точно местоположение", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Канали", + "channelName": "Канал: {{channelName}}", + "broadcastLabel": "Primary", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Настройки на канала", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Роля", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Генериране" + }, + "name": { + "label": "Име", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Местоположение", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Да не се споделя местоположението", + "precise": "Точно местоположение", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/commandPalette.json b/packages/web/public/i18n/locales/bg-BG/commandPalette.json index a37dbd60..a2e6e7fa 100644 --- a/packages/web/public/i18n/locales/bg-BG/commandPalette.json +++ b/packages/web/public/i18n/locales/bg-BG/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "Няма намерени резултати.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Съобщения", - "map": "Карта", - "config": "Конфигурация", - "channels": "Канали", - "nodes": "Възли" - } - }, - "manage": { - "label": "Управление", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Свързване на нов възел" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR код", - "qrGenerator": "Генератор", - "qrImport": "Импортиране", - "scheduleShutdown": "Планирано изключване", - "scheduleReboot": "Планирано рестартиране", - "rebootToOtaMode": "Рестартиране в режим OTA", - "resetNodeDb": "Нулиране на базата данни с възли", - "factoryResetDevice": "Фабрично нулиране на устройството", - "factoryResetConfig": "Фабрично нулиране на конфигурацията" - } - }, - "debug": { - "label": "Отстраняване на грешки", - "command": { - "reconfigure": "Преконфигуриране", - "clearAllStoredMessages": "Изчистване на всички съхранени съобщения" - } - } + "emptyState": "Няма намерени резултати.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Съобщения", + "map": "Карта", + "config": "Конфигурация", + "channels": "Канали", + "nodes": "Възли" + } + }, + "manage": { + "label": "Управление", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Свързване на нов възел" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR код", + "qrGenerator": "Генератор", + "qrImport": "Импортиране", + "scheduleShutdown": "Планирано изключване", + "scheduleReboot": "Планирано рестартиране", + "rebootToOtaMode": "Рестартиране в режим OTA", + "resetNodeDb": "Нулиране на базата данни с възли", + "factoryResetDevice": "Фабрично нулиране на устройството", + "factoryResetConfig": "Фабрично нулиране на конфигурацията" + } + }, + "debug": { + "label": "Отстраняване на грешки", + "command": { + "reconfigure": "Преконфигуриране", + "clearAllStoredMessages": "Изчистване на всички съхранени съобщения" + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/common.json b/packages/web/public/i18n/locales/bg-BG/common.json index da05c539..bd5886b2 100644 --- a/packages/web/public/i18n/locales/bg-BG/common.json +++ b/packages/web/public/i18n/locales/bg-BG/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Приложи", - "backupKey": "Backup Key", - "cancel": "Отказ", - "clearMessages": "Изчистване на съобщенията", - "close": "Затвори", - "confirm": "Потвърждаване", - "delete": "Изтриване", - "dismiss": "Отхвърляне", - "download": "Изтегляне", - "export": "Експортиране", - "generate": "Генериране", - "regenerate": "Регенериране", - "import": "Импортиране", - "message": "Съобщение", - "now": "Сега", - "ok": "Добре", - "print": "Отпечатване", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Изтрий", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Нулиране", - "save": "Запис", - "scanQr": "Сканиране на QR кода", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web клиент" - }, - "loading": "Зареждане...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Метър", - "plural": "Метри", - "suffix": "m" - }, - "minute": { - "one": "Минута", - "plural": "Минути" - }, - "hour": { - "one": "Час", - "plural": "Часа" - }, - "millisecond": { - "one": "Милисекунда", - "plural": "Милисекунди", - "suffix": "ms" - }, - "second": { - "one": "Секунда", - "plural": "Секунди" - }, - "day": { - "one": "Ден", - "plural": "Дни" - }, - "month": { - "one": "Месец", - "plural": "Месеца" - }, - "year": { - "one": "Година", - "plural": "Години" - }, - "snr": "SNR", - "volt": { - "one": "Волт", - "plural": "Волта", - "suffix": "V" - }, - "record": { - "one": "Записи", - "plural": "Записи" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Неизвестно", - "shortName": "НЕИЗВ.", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "НЕЗАДАДЕН", - "fallbackName": "Meshtastic {{last4}}", - "node": "Възел", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Невалиден формат, очаква се IPv4 адрес.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Невалиден тип, очаква се число." - }, - "pskLength": { - "0bit": "Ключът трябва да е празен.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "Това поле е задължително.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Ключът е задължителен." - } - } + "button": { + "apply": "Приложи", + "backupKey": "Backup Key", + "cancel": "Отказ", + "clearMessages": "Изчистване на съобщенията", + "close": "Затвори", + "confirm": "Потвърждаване", + "delete": "Изтриване", + "dismiss": "Отхвърляне", + "download": "Изтегляне", + "export": "Експортиране", + "generate": "Генериране", + "regenerate": "Регенериране", + "import": "Импортиране", + "message": "Съобщение", + "now": "Сега", + "ok": "Добре", + "print": "Отпечатване", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Изтрий", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Нулиране", + "save": "Запис", + "scanQr": "Сканиране на QR кода", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web клиент" + }, + "loading": "Зареждане...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Метър", + "plural": "Метри", + "suffix": "m" + }, + "minute": { + "one": "Минута", + "plural": "Минути" + }, + "hour": { + "one": "Час", + "plural": "Часа" + }, + "millisecond": { + "one": "Милисекунда", + "plural": "Милисекунди", + "suffix": "ms" + }, + "second": { + "one": "Секунда", + "plural": "Секунди" + }, + "day": { + "one": "Ден", + "plural": "Дни" + }, + "month": { + "one": "Месец", + "plural": "Месеца" + }, + "year": { + "one": "Година", + "plural": "Години" + }, + "snr": "SNR", + "volt": { + "one": "Волт", + "plural": "Волта", + "suffix": "V" + }, + "record": { + "one": "Записи", + "plural": "Записи" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Неизвестно", + "shortName": "НЕИЗВ.", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "НЕЗАДАДЕН", + "fallbackName": "Meshtastic {{last4}}", + "node": "Възел", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Невалиден формат, очаква се IPv4 адрес.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Невалиден тип, очаква се число." + }, + "pskLength": { + "0bit": "Ключът трябва да е празен.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "Това поле е задължително.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Ключът е задължителен." + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/dashboard.json b/packages/web/public/i18n/locales/bg-BG/dashboard.json index 4f1c9d39..f59f4eb4 100644 --- a/packages/web/public/i18n/locales/bg-BG/dashboard.json +++ b/packages/web/public/i18n/locales/bg-BG/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Свързани устройства", - "description": "Управлявайте свързаните си устройства Meshtastic.", - "connectionType_ble": "BLE", - "connectionType_serial": "Серийна", - "connectionType_network": "Мрежа", - "noDevicesTitle": "Няма свързани устройства", - "noDevicesDescription": "Свържете ново устройство, за да започнете.", - "button_newConnection": "Нова връзка" - } + "dashboard": { + "title": "Свързани устройства", + "description": "Управлявайте свързаните си устройства Meshtastic.", + "connectionType_ble": "BLE", + "connectionType_serial": "Серийна", + "connectionType_network": "Мрежа", + "noDevicesTitle": "Няма свързани устройства", + "noDevicesDescription": "Свържете ново устройство, за да започнете.", + "button_newConnection": "Нова връзка" + } } diff --git a/packages/web/public/i18n/locales/bg-BG/deviceConfig.json b/packages/web/public/i18n/locales/bg-BG/deviceConfig.json index f7e707a7..7b1fdbcd 100644 --- a/packages/web/public/i18n/locales/bg-BG/deviceConfig.json +++ b/packages/web/public/i18n/locales/bg-BG/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Конфигурация", - "tabBluetooth": "Bluetooth", - "tabDevice": "Устройство", - "tabDisplay": "Дисплей", - "tabLora": "LoRa", - "tabNetwork": "Мрежа", - "tabPosition": "Позиция", - "tabPower": "Захранване", - "tabSecurity": "Сигурност" - }, - "sidebar": { - "label": "Модули" - }, - "device": { - "title": "Настройки на устройството", - "description": "Настройки за устройството", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX часова зона" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Роля" - } - }, - "bluetooth": { - "title": "Настройки за Bluetooth", - "description": "Настройки за Bluetooth модула", - "note": "Забележка: Някои устройства (ESP32) не могат да използват едновременно Bluetooth и WiFi.", - "enabled": { - "description": "Активиране или дезактивиране на Bluetooth", - "label": "Активиран" - }, - "pairingMode": { - "description": "Поведение при избор на ПИН.", - "label": "Режим на сдвояване" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "ПИН" - } - }, - "display": { - "description": "Настройки за дисплея на устройството", - "title": "Настройки на дисплея", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "Колко бързо да се превключва между прозорците", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Показване на метрични или имперски мерни единици", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Използване на 12-часов формат на часовника", - "label": "12-часов часовник" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Настройки на Mesh", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Широчина на канала в MHz", - "label": "Широчина на честотната лента" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Отместване на честотата" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Честотен слот" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignore MQTT" - }, - "modemPreset": { - "description": "Използване на предварително настроен модем", - "label": "Предварително настроен модем" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Override Duty Cycle", - "label": "Override Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Регион" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Активиране/дезактивиране на предаването (TX) от LoRa радиото", - "label": "Предаването е активирано" - }, - "transmitPower": { - "description": "Максимална мощност на предаване", - "label": "Мощност на предаване" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Използване на предварително зададени настройки" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Настройки на Mesh" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Настройки на радиото", - "description": "Настройки за LoRa радиото" - } - }, - "network": { - "title": "Конфигурация на WiFi", - "description": "Конфигурация на WiFi радиото", - "note": "Забележка: Някои устройства (ESP32) не могат да използват едновременно Bluetooth и WiFi.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS сървър", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Активиране или дезактивиране на Ethernet порта", - "label": "Активиран" - }, - "gateway": { - "description": "Шлюз по подразбиране", - "label": "Шлюз" - }, - "ip": { - "description": "IP адрес", - "label": "IP" - }, - "psk": { - "description": "Парола за мрежата", - "label": "PSK" - }, - "ssid": { - "description": "Име на мрежата", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Активиране или дезактивиране на WiFi радиото", - "label": "Активиран" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP сървър" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Конфигурация на Ethernet " - }, - "ipConfigSettings": { - "description": "Конфигуриране на IP", - "label": "Конфигурация на IP" - }, - "ntpConfigSettings": { - "description": "Конфигуриране на NTP", - "label": "Конфигурация на NTP" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Конфигурация на UDP" - } - }, - "position": { - "title": "Настройки на позицията", - "description": "Настройки за модула за позиция", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Фиксирана позиция" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "Режим на GPS" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "Интервал на актуализиране на GPS" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Интервали" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Надморска височина", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Времево клеймо", - "unset": "Отказ", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Скорост на превозното средство" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Активиране на енергоспестяващ режим" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Конфигурация на захранването" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Насртойки на сигурността", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Частен ключ" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Публичен ключ" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Настройки за Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Конфигурация", + "tabBluetooth": "Bluetooth", + "tabDevice": "Устройство", + "tabDisplay": "Дисплей", + "tabLora": "LoRa", + "tabNetwork": "Мрежа", + "tabPosition": "Позиция", + "tabPower": "Захранване", + "tabSecurity": "Сигурност" + }, + "sidebar": { + "label": "Модули" + }, + "device": { + "title": "Настройки на устройството", + "description": "Настройки за устройството", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX часова зона" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Роля" + } + }, + "bluetooth": { + "title": "Настройки за Bluetooth", + "description": "Настройки за Bluetooth модула", + "note": "Забележка: Някои устройства (ESP32) не могат да използват едновременно Bluetooth и WiFi.", + "enabled": { + "description": "Активиране или дезактивиране на Bluetooth", + "label": "Активиран" + }, + "pairingMode": { + "description": "Поведение при избор на ПИН.", + "label": "Режим на сдвояване" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "ПИН" + } + }, + "display": { + "description": "Настройки за дисплея на устройството", + "title": "Настройки на дисплея", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "Колко бързо да се превключва между прозорците", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Показване на метрични или имперски мерни единици", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Използване на 12-часов формат на часовника", + "label": "12-часов часовник" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Настройки на Mesh", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Широчина на канала в MHz", + "label": "Широчина на честотната лента" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Отместване на честотата" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Честотен слот" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignore MQTT" + }, + "modemPreset": { + "description": "Използване на предварително настроен модем", + "label": "Предварително настроен модем" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Override Duty Cycle", + "label": "Override Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Регион" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Активиране/дезактивиране на предаването (TX) от LoRa радиото", + "label": "Предаването е активирано" + }, + "transmitPower": { + "description": "Максимална мощност на предаване", + "label": "Мощност на предаване" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Използване на предварително зададени настройки" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Настройки на Mesh" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Настройки на радиото", + "description": "Настройки за LoRa радиото" + } + }, + "network": { + "title": "Конфигурация на WiFi", + "description": "Конфигурация на WiFi радиото", + "note": "Забележка: Някои устройства (ESP32) не могат да използват едновременно Bluetooth и WiFi.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS сървър", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Активиране или дезактивиране на Ethernet порта", + "label": "Активиран" + }, + "gateway": { + "description": "Шлюз по подразбиране", + "label": "Шлюз" + }, + "ip": { + "description": "IP адрес", + "label": "IP" + }, + "psk": { + "description": "Парола за мрежата", + "label": "PSK" + }, + "ssid": { + "description": "Име на мрежата", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Активиране или дезактивиране на WiFi радиото", + "label": "Активиран" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP сървър" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Конфигурация на Ethernet " + }, + "ipConfigSettings": { + "description": "Конфигуриране на IP", + "label": "Конфигурация на IP" + }, + "ntpConfigSettings": { + "description": "Конфигуриране на NTP", + "label": "Конфигурация на NTP" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Конфигурация на UDP" + } + }, + "position": { + "title": "Настройки на позицията", + "description": "Настройки за модула за позиция", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Фиксирана позиция" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "Режим на GPS" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "Интервал на актуализиране на GPS" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Интервали" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Надморска височина", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Времево клеймо", + "unset": "Отказ", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Скорост на превозното средство" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Активиране на енергоспестяващ режим" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Конфигурация на захранването" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Насртойки на сигурността", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Частен ключ" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Публичен ключ" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Настройки за Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/dialog.json b/packages/web/public/i18n/locales/bg-BG/dialog.json index 1d9ea3f0..9d0e58ff 100644 --- a/packages/web/public/i18n/locales/bg-BG/dialog.json +++ b/packages/web/public/i18n/locales/bg-BG/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "Това действие ще изчисти цялата история на съобщенията. Това не може да бъде отменено. Сигурни ли сте, че искате да продължите?", - "title": "Изчистване на всички съобщения" - }, - "deviceName": { - "description": "Устройството ще се рестартира, след като конфигурацията бъде запазена.", - "longName": "Дълго име", - "shortName": "Кратко име", - "title": "Промяна на името на устройството" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Невалиден Meshtastic URL" - }, - "channelPrefix": "Канал: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Канали:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Надморска височина: ", - "coordinates": "Координати:", - "title": "Местоположение: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Регенериране" - }, - "newDeviceDialog": { - "title": "Свързване на ново устройство", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Serial", - "useHttps": "Използване на HTTPS", - "connecting": "Свързване...", - "connect": "Свързване", - "connectionFailedAlert": { - "title": "Връзката е неуспешна", - "descriptionPrefix": "Не може да се свърже с устройството.", - "httpsHint": "Ако използвате HTTPS, може да се наложи първо да приемете самоподписан сертификат. ", - "openLinkPrefix": "Моля, отворете", - "openLinkSuffix": "в нов раздел", - "acceptTlsWarningSuffix": "", - "learnMoreLink": "Научете повече" - }, - "httpConnection": { - "label": "IP адрес/Име на хост", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "Все още няма сдвоени устройства.", - "newDeviceButton": "Ново устройство", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "Все още няма сдвоени устройства.", - "newDeviceButton": "Ново устройство" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Съобщение", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Ниво на батерията", - "channelUtilization": "Използване на канала", - "details": "Подробности:", - "deviceMetrics": "Device Metrics:", - "hardware": "Хардуер: ", - "lastHeard": "Последно чут: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Номер на възела: ", - "position": "Позиция:", - "role": "Роля: ", - "uptime": "Време на работа: ", - "voltage": "Напрежение", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "Ако загубите ключовете си, ще трябва да нулирате устройството си.", - "secureBackup": "Важно е да направите резервно копие на публичните и частните си ключове и да съхранявате резервното си копие сигурно!", - "footer": "=== КРАЙ НА КЛЮЧОВЕТЕ ===", - "header": "=== MESHTASTIC КЛЮЧОВЕ ЗА {{longName}} ({{shortName}}) ===", - "privateKey": "Частен ключ:", - "publicKey": "Публичен ключ:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Сигурни ли сте, че искате да регенерирате двойката ключове?", - "title": "Регенериране на двойката ключове" - }, - "qr": { - "addChannels": "Добавяне на канали", - "replaceChannels": "Замяна на канали", - "description": "Текущата конфигурация на LoRa също ще бъде споделена.", - "sharableUrl": "Sharable URL", - "title": "Генериране на QR код" - }, - "rebootOta": { - "title": "Планирано рестартиране", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Въведете забавяне (сек)", - "scheduled": "Насрочено е рестартиране" - }, - "reboot": { - "title": "Планирано рестартиране", - "description": "Рестартиране на свързания възел след x минути." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Сигурни ли сте, че искате да премахнете този възел?", - "title": "Премахване на възела?" - }, - "shutdown": { - "title": "Планирано изключване", - "description": "Изключване на свързания възел след x минути." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Да, знам какво правя", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Сигурни ли сте?" - }, - "managedMode": { - "confirmUnderstanding": "Да, знам какво правя", - "title": "Сигурни ли сте?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "Това действие ще изчисти цялата история на съобщенията. Това не може да бъде отменено. Сигурни ли сте, че искате да продължите?", + "title": "Изчистване на всички съобщения" + }, + "deviceName": { + "description": "Устройството ще се рестартира, след като конфигурацията бъде запазена.", + "longName": "Дълго име", + "shortName": "Кратко име", + "title": "Промяна на името на устройството" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Невалиден Meshtastic URL" + }, + "channelPrefix": "Канал: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Канали:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Надморска височина: ", + "coordinates": "Координати:", + "title": "Местоположение: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Регенериране" + }, + "newDeviceDialog": { + "title": "Свързване на ново устройство", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Serial", + "useHttps": "Използване на HTTPS", + "connecting": "Свързване...", + "connect": "Свързване", + "connectionFailedAlert": { + "title": "Връзката е неуспешна", + "descriptionPrefix": "Не може да се свърже с устройството.", + "httpsHint": "Ако използвате HTTPS, може да се наложи първо да приемете самоподписан сертификат. ", + "openLinkPrefix": "Моля, отворете", + "openLinkSuffix": "в нов раздел", + "acceptTlsWarningSuffix": "", + "learnMoreLink": "Научете повече" + }, + "httpConnection": { + "label": "IP адрес/Име на хост", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "Все още няма сдвоени устройства.", + "newDeviceButton": "Ново устройство", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "Все още няма сдвоени устройства.", + "newDeviceButton": "Ново устройство" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Съобщение", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Ниво на батерията", + "channelUtilization": "Използване на канала", + "details": "Подробности:", + "deviceMetrics": "Device Metrics:", + "hardware": "Хардуер: ", + "lastHeard": "Последно чут: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Номер на възела: ", + "position": "Позиция:", + "role": "Роля: ", + "uptime": "Време на работа: ", + "voltage": "Напрежение", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "Ако загубите ключовете си, ще трябва да нулирате устройството си.", + "secureBackup": "Важно е да направите резервно копие на публичните и частните си ключове и да съхранявате резервното си копие сигурно!", + "footer": "=== КРАЙ НА КЛЮЧОВЕТЕ ===", + "header": "=== MESHTASTIC КЛЮЧОВЕ ЗА {{longName}} ({{shortName}}) ===", + "privateKey": "Частен ключ:", + "publicKey": "Публичен ключ:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Сигурни ли сте, че искате да регенерирате двойката ключове?", + "title": "Регенериране на двойката ключове" + }, + "qr": { + "addChannels": "Добавяне на канали", + "replaceChannels": "Замяна на канали", + "description": "Текущата конфигурация на LoRa също ще бъде споделена.", + "sharableUrl": "Sharable URL", + "title": "Генериране на QR код" + }, + "rebootOta": { + "title": "Планирано рестартиране", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Въведете забавяне (сек)", + "scheduled": "Насрочено е рестартиране" + }, + "reboot": { + "title": "Планирано рестартиране", + "description": "Рестартиране на свързания възел след x минути." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Сигурни ли сте, че искате да премахнете този възел?", + "title": "Премахване на възела?" + }, + "shutdown": { + "title": "Планирано изключване", + "description": "Изключване на свързания възел след x минути." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Да, знам какво правя", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Сигурни ли сте?" + }, + "managedMode": { + "confirmUnderstanding": "Да, знам какво правя", + "title": "Сигурни ли сте?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/bg-BG/messages.json b/packages/web/public/i18n/locales/bg-BG/messages.json index edad2226..aa1bf60f 100644 --- a/packages/web/public/i18n/locales/bg-BG/messages.json +++ b/packages/web/public/i18n/locales/bg-BG/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Съобщения: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Изберете чат", - "text": "Все още няма съобщения." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Въведете Вашето съобщение тук...", - "sendButton": "Изпрати" - }, - "actionsMenu": { - "addReactionLabel": "Добавяне на реакция", - "replyLabel": "Отговор" - }, - "deliveryStatus": { - "delivered": { - "label": "Съобщението е доставено", - "displayText": "Съобщението е доставено" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Статусът на съобщението е неизвестен", - "displayText": "Неизвестно състояние" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Съобщения: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Изберете чат", + "text": "Все още няма съобщения." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Въведете Вашето съобщение тук...", + "sendButton": "Изпрати" + }, + "actionsMenu": { + "addReactionLabel": "Добавяне на реакция", + "replyLabel": "Отговор" + }, + "deliveryStatus": { + "delivered": { + "label": "Съобщението е доставено", + "displayText": "Съобщението е доставено" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Статусът на съобщението е неизвестен", + "displayText": "Неизвестно състояние" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/moduleConfig.json b/packages/web/public/i18n/locales/bg-BG/moduleConfig.json index 1b3eb924..21e0f143 100644 --- a/packages/web/public/i18n/locales/bg-BG/moduleConfig.json +++ b/packages/web/public/i18n/locales/bg-BG/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambient Lighting", - "tabAudio": "Аудио", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detection Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Range Test", - "tabSerial": "Serial", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Телеметрия" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Current", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Червен", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Зелен", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Син", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Настройки на аудиото", - "description": "Настройки за аудио модула", - "codec2Enabled": { - "label": "Codec 2 е активиран", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Модулът е активиран", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Ротационен енкодер #1 е активиран", - "description": "Активиране на ротационния енкодер" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Изберете от: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Активиран", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Приятелско име", - "description": "Използва се за форматиране на съобщението, изпратено до mesh, максимум 20 знака" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Модулът е активиран", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Предупредително съобщение", - "description": "Предупредително съобщение" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "Настройки на MQTT", - "description": "Настройки за MQTT модула", - "enabled": { - "label": "Активиран", - "description": "Активиране или дезактивиране на MQTT" - }, - "address": { - "label": "Адрес на MQTT сървъра", - "description": "Адрес на MQTT сървъра, който да се използва за сървъри по подразбиране/персонализирани сървъри" - }, - "username": { - "label": "Потребителско име за MQTT", - "description": "Потребителско име за MQTT, което да се използва за сървъри по подразбиране/персонализирани сървъри" - }, - "password": { - "label": "Парола за MQTT", - "description": "Парола за MQTT, която да се използва за сървъри по подразбиране/персонализирани сървъри" - }, - "encryptionEnabled": { - "label": "Криптирането е активирано", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON е активиран", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS е активиран", - "description": "Активиране или дезактивиране на TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Приблизително местоположение", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Активиран", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Настройки за модула Paxcounter", - "enabled": { - "label": "Модулът е активиран", - "description": "Активиране на Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "Само ESP32" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Модулът е активиран", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Timeout", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Режим", - "description": "Избор на режим" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Модулът е активиран", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Брой записи", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Настройки на телеметрията", - "description": "Настройки за модула за телеметрия", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Модулът е активиран", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Показване на Фаренхайт", - "description": "Показване на температурата във Фаренхайт" - }, - "airQualityEnabled": { - "label": "Качество на въздуха е активирано", - "description": "Активиране на телеметрията за качеството на въздуха" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambient Lighting", + "tabAudio": "Аудио", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detection Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Range Test", + "tabSerial": "Serial", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Телеметрия" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Current", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Червен", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Зелен", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Син", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Настройки на аудиото", + "description": "Настройки за аудио модула", + "codec2Enabled": { + "label": "Codec 2 е активиран", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Модулът е активиран", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Ротационен енкодер #1 е активиран", + "description": "Активиране на ротационния енкодер" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Изберете от: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Активиран", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Приятелско име", + "description": "Използва се за форматиране на съобщението, изпратено до mesh, максимум 20 знака" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Модулът е активиран", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Предупредително съобщение", + "description": "Предупредително съобщение" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "Настройки на MQTT", + "description": "Настройки за MQTT модула", + "enabled": { + "label": "Активиран", + "description": "Активиране или дезактивиране на MQTT" + }, + "address": { + "label": "Адрес на MQTT сървъра", + "description": "Адрес на MQTT сървъра, който да се използва за сървъри по подразбиране/персонализирани сървъри" + }, + "username": { + "label": "Потребителско име за MQTT", + "description": "Потребителско име за MQTT, което да се използва за сървъри по подразбиране/персонализирани сървъри" + }, + "password": { + "label": "Парола за MQTT", + "description": "Парола за MQTT, която да се използва за сървъри по подразбиране/персонализирани сървъри" + }, + "encryptionEnabled": { + "label": "Криптирането е активирано", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON е активиран", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS е активиран", + "description": "Активиране или дезактивиране на TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Приблизително местоположение", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Активиран", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Настройки за модула Paxcounter", + "enabled": { + "label": "Модулът е активиран", + "description": "Активиране на Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "Само ESP32" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Модулът е активиран", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Timeout", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Режим", + "description": "Избор на режим" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Модулът е активиран", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Брой записи", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Настройки на телеметрията", + "description": "Настройки за модула за телеметрия", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Модулът е активиран", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Показване на Фаренхайт", + "description": "Показване на температурата във Фаренхайт" + }, + "airQualityEnabled": { + "label": "Качество на въздуха е активирано", + "description": "Активиране на телеметрията за качеството на въздуха" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/bg-BG/nodes.json b/packages/web/public/i18n/locales/bg-BG/nodes.json index 760c708d..c591ddee 100644 --- a/packages/web/public/i18n/locales/bg-BG/nodes.json +++ b/packages/web/public/i18n/locales/bg-BG/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Публичният ключ е активиран" - }, - "noPublicKey": { - "label": "Няма публичен ключ" - }, - "directMessage": { - "label": "Директно съобщение {{shortName}}" - }, - "favorite": { - "label": "Любим", - "tooltip": "Добавяне или премахване на този възел от любимите ви" - }, - "notFavorite": { - "label": "Не е любим" - }, - "error": { - "label": "Грешка", - "text": "Възникна грешка при извличането на подробности за възела. Моля, опитайте отново по-късно." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Дълго име", - "connection": "Connection", - "lastHeard": "Последно чут", - "encryption": "Криптиране", - "model": "Модел", - "macAddress": "MAC адрес" - }, - "connectionStatus": { - "direct": "Direct", - "away": "away", - "unknown": "-", - "viaMqtt": ", чрез MQTT" - }, - "lastHeardStatus": { - "never": "Никога" - } - }, - "actions": { - "added": "Добавен", - "removed": "Премахнат", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Публичният ключ е активиран" + }, + "noPublicKey": { + "label": "Няма публичен ключ" + }, + "directMessage": { + "label": "Директно съобщение {{shortName}}" + }, + "favorite": { + "label": "Любим", + "tooltip": "Добавяне или премахване на този възел от любимите ви" + }, + "notFavorite": { + "label": "Не е любим" + }, + "error": { + "label": "Грешка", + "text": "Възникна грешка при извличането на подробности за възела. Моля, опитайте отново по-късно." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Дълго име", + "connection": "Connection", + "lastHeard": "Последно чут", + "encryption": "Криптиране", + "model": "Модел", + "macAddress": "MAC адрес" + }, + "connectionStatus": { + "direct": "Direct", + "away": "away", + "unknown": "-", + "viaMqtt": ", чрез MQTT" + }, + "lastHeardStatus": { + "never": "Никога" + } + }, + "actions": { + "added": "Добавен", + "removed": "Премахнат", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/bg-BG/ui.json b/packages/web/public/i18n/locales/bg-BG/ui.json index e635ba10..0f494610 100644 --- a/packages/web/public/i18n/locales/bg-BG/ui.json +++ b/packages/web/public/i18n/locales/bg-BG/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Навигация", - "messages": "Съобщения", - "map": "Карта", - "config": "Конфигурация", - "radioConfig": "Конфигурация на радиото", - "moduleConfig": "Конфигурация на модула", - "channels": "Канали", - "nodes": "Възли" - }, - "app": { - "title": "Meshtastic", - "logo": "Лого на Meshtastic" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Отваряне на страничната лента", - "close": "Затваряне на страничната лента" - } - }, - "deviceInfo": { - "volts": "{{voltage}} волта", - "firmware": { - "title": "Фърмуер", - "version": "v{{version}}", - "buildDate": "Дата на компилация: {{date}}" - }, - "deviceName": { - "title": "Име на устройството", - "changeName": "Промяна на името на устройството", - "placeholder": "Въвеждане на име на устройството" - }, - "editDeviceName": "Редактиране на името на устройство" - } - }, - "batteryStatus": { - "charging": "{{level}}% зареждане", - "pluggedIn": "Включен в ел. мрежа", - "title": "Батерия" - }, - "search": { - "nodes": "Търсене на възли...", - "channels": "Търсене на канали...", - "commandPalette": "Търсене на команди..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Запазен канал: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Чатът използва PKI криптиране." - }, - "pskEncryption": { - "title": "Чатът използва PSK криптиране." - } - }, - "configSaveError": { - "title": "Грешка при запазване на конфигурацията", - "description": "Възникна грешка при запазване на конфигурацията." - }, - "validationError": { - "title": "Съществуват грешки в конфигурацията", - "description": "Моля, коригирайте грешките в конфигурацията, преди да я запазите." - }, - "saveSuccess": { - "title": "Запазване на конфигурацията", - "description": "Промяната в конфигурацията {{case}} е запазена." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Копирано!" - }, - "copyToClipboard": { - "label": "Копиране в клипборда" - }, - "hidePassword": { - "label": "Скриване на паролата" - }, - "showPassword": { - "label": "Показване на паролата" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Изчакване", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Хардуер" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Роля" - }, - "filter": { - "label": "Филтър" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Нулиране на филтрите" - }, - "nodeName": { - "label": "Име/номер на възел", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Ниво на батерията (%)", - "labelText": "Ниво на батерията (%): {{value}}" - }, - "batteryVoltage": { - "label": "Напрежение на батерията (V)", - "title": "Напрежение" - }, - "channelUtilization": { - "label": "Използване на канала (%)" - }, - "hops": { - "direct": "Direct", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Последно чут", - "labelText": "Last heard: {{value}}", - "nowLabel": "Сега" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Любими" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Свързан чрез MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Език", - "changeLanguage": "Промяна на езика" - }, - "theme": { - "dark": "Тъмна", - "light": "Светла", - "system": "Автоматично", - "changeTheme": "Промяна на цветовата схема" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Моля, включете следната информация в доклада си:", - "reportSteps": { - "step1": "Какво правехте, когато възникна грешката", - "step2": "Какво очаквахте да се случи", - "step3": "Какво всъщност се случи", - "step4": "Всяка друга подходяща информация" - }, - "reportLink": "Можете да съобщите за проблема в нашия <0>GitHub", - "dashboardLink": "Връщане към <0>таблото", - "detailsSummary": "Подробности за грешката", - "errorMessageLabel": "Съобщение за грешка:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Задвижвано от <0>▲ Vercel | Meshtastic® е регистрирана търговска марка на Meshtastic LLC. | <1>Правна информация", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Навигация", + "messages": "Съобщения", + "map": "Карта", + "config": "Конфигурация", + "radioConfig": "Конфигурация на радиото", + "moduleConfig": "Конфигурация на модула", + "channels": "Канали", + "nodes": "Възли" + }, + "app": { + "title": "Meshtastic", + "logo": "Лого на Meshtastic" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Отваряне на страничната лента", + "close": "Затваряне на страничната лента" + } + }, + "deviceInfo": { + "volts": "{{voltage}} волта", + "firmware": { + "title": "Фърмуер", + "version": "v{{version}}", + "buildDate": "Дата на компилация: {{date}}" + }, + "deviceName": { + "title": "Име на устройството", + "changeName": "Промяна на името на устройството", + "placeholder": "Въвеждане на име на устройството" + }, + "editDeviceName": "Редактиране на името на устройство" + } + }, + "batteryStatus": { + "charging": "{{level}}% зареждане", + "pluggedIn": "Включен в ел. мрежа", + "title": "Батерия" + }, + "search": { + "nodes": "Търсене на възли...", + "channels": "Търсене на канали...", + "commandPalette": "Търсене на команди..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Запазен канал: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Чатът използва PKI криптиране." + }, + "pskEncryption": { + "title": "Чатът използва PSK криптиране." + } + }, + "configSaveError": { + "title": "Грешка при запазване на конфигурацията", + "description": "Възникна грешка при запазване на конфигурацията." + }, + "validationError": { + "title": "Съществуват грешки в конфигурацията", + "description": "Моля, коригирайте грешките в конфигурацията, преди да я запазите." + }, + "saveSuccess": { + "title": "Запазване на конфигурацията", + "description": "Промяната в конфигурацията {{case}} е запазена." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Копирано!" + }, + "copyToClipboard": { + "label": "Копиране в клипборда" + }, + "hidePassword": { + "label": "Скриване на паролата" + }, + "showPassword": { + "label": "Показване на паролата" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Изчакване", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Хардуер" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Роля" + }, + "filter": { + "label": "Филтър" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Нулиране на филтрите" + }, + "nodeName": { + "label": "Име/номер на възел", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Ниво на батерията (%)", + "labelText": "Ниво на батерията (%): {{value}}" + }, + "batteryVoltage": { + "label": "Напрежение на батерията (V)", + "title": "Напрежение" + }, + "channelUtilization": { + "label": "Използване на канала (%)" + }, + "hops": { + "direct": "Direct", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Последно чут", + "labelText": "Last heard: {{value}}", + "nowLabel": "Сега" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Любими" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Свързан чрез MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Език", + "changeLanguage": "Промяна на езика" + }, + "theme": { + "dark": "Тъмна", + "light": "Светла", + "system": "Автоматично", + "changeTheme": "Промяна на цветовата схема" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Моля, включете следната информация в доклада си:", + "reportSteps": { + "step1": "Какво правехте, когато възникна грешката", + "step2": "Какво очаквахте да се случи", + "step3": "Какво всъщност се случи", + "step4": "Всяка друга подходяща информация" + }, + "reportLink": "Можете да съобщите за проблема в нашия <0>GitHub", + "dashboardLink": "Връщане към <0>таблото", + "detailsSummary": "Подробности за грешката", + "errorMessageLabel": "Съобщение за грешка:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Задвижвано от <0>▲ Vercel | Meshtastic® е регистрирана търговска марка на Meshtastic LLC. | <1>Правна информация", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/channels.json b/packages/web/public/i18n/locales/cs-CZ/channels.json index 33ae9f54..21fc1eb5 100644 --- a/packages/web/public/i18n/locales/cs-CZ/channels.json +++ b/packages/web/public/i18n/locales/cs-CZ/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanály", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Primární", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Nastavení kanálu", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Role", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Jméno", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Kanály", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Primární", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Nastavení kanálu", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Role", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Jméno", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/commandPalette.json b/packages/web/public/i18n/locales/cs-CZ/commandPalette.json index df166149..40b362da 100644 --- a/packages/web/public/i18n/locales/cs-CZ/commandPalette.json +++ b/packages/web/public/i18n/locales/cs-CZ/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Zprávy", - "map": "Mapa", - "config": "Config", - "channels": "Kanály", - "nodes": "Uzly" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Import", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Zprávy", + "map": "Mapa", + "config": "Config", + "channels": "Kanály", + "nodes": "Uzly" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Import", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/common.json b/packages/web/public/i18n/locales/cs-CZ/common.json index 0d4f47ca..e1ace668 100644 --- a/packages/web/public/i18n/locales/cs-CZ/common.json +++ b/packages/web/public/i18n/locales/cs-CZ/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Použít", - "backupKey": "Backup Key", - "cancel": "Zrušit", - "clearMessages": "Clear Messages", - "close": "Zavřít", - "confirm": "Confirm", - "delete": "Smazat", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Zpráva", - "now": "Now", - "ok": "OK", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Odstranit", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Reset", - "save": "Uložit", - "scanQr": "Naskenovat QR kód", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Použít", + "backupKey": "Backup Key", + "cancel": "Zrušit", + "clearMessages": "Clear Messages", + "close": "Zavřít", + "confirm": "Confirm", + "delete": "Smazat", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Zpráva", + "now": "Now", + "ok": "OK", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Odstranit", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Reset", + "save": "Uložit", + "scanQr": "Naskenovat QR kód", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/dashboard.json b/packages/web/public/i18n/locales/cs-CZ/dashboard.json index f73dc07c..5f482751 100644 --- a/packages/web/public/i18n/locales/cs-CZ/dashboard.json +++ b/packages/web/public/i18n/locales/cs-CZ/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Sériová komunikace", - "connectionType_network": "Síť", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Sériová komunikace", + "connectionType_network": "Síť", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/deviceConfig.json b/packages/web/public/i18n/locales/cs-CZ/deviceConfig.json index 6e5cb4e0..4c0a47f2 100644 --- a/packages/web/public/i18n/locales/cs-CZ/deviceConfig.json +++ b/packages/web/public/i18n/locales/cs-CZ/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Zařízení", - "tabDisplay": "Obrazovka", - "tabLora": "LoRa", - "tabNetwork": "Síť", - "tabPosition": "Pozice", - "tabPower": "Napájení", - "tabSecurity": "Zabezpečení" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Dvojité klepnutí jako stisk tlačítka" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX časové pásmo" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Režim opětovného vysílání" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Role" - } - }, - "bluetooth": { - "title": "Nastavení Bluetooth", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Povoleno" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Režim párování" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Šířka pásma" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignorovat MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Předvolba modemu" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK do MQTT" - }, - "overrideDutyCycle": { - "description": "Přepsat střídu", - "label": "Přepsat střídu" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Region" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Povoleno" - }, - "gateway": { - "description": "Default Gateway", - "label": "Gateway/Brána" - }, - "ip": { - "description": "IP Address", - "label": "IP adresa" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Podsíť" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Povoleno" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP Konfigurace" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Časová značka", - "unset": "Zrušit nastavení", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Povolit úsporný režim" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Nastavení napájení" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Soukromý klíč" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Veřejný klíč" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Zařízení", + "tabDisplay": "Obrazovka", + "tabLora": "LoRa", + "tabNetwork": "Síť", + "tabPosition": "Pozice", + "tabPower": "Napájení", + "tabSecurity": "Zabezpečení" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Dvojité klepnutí jako stisk tlačítka" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX časové pásmo" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Režim opětovného vysílání" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Role" + } + }, + "bluetooth": { + "title": "Nastavení Bluetooth", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Povoleno" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Režim párování" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Šířka pásma" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignorovat MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Předvolba modemu" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK do MQTT" + }, + "overrideDutyCycle": { + "description": "Přepsat střídu", + "label": "Přepsat střídu" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Region" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Povoleno" + }, + "gateway": { + "description": "Default Gateway", + "label": "Gateway/Brána" + }, + "ip": { + "description": "IP Address", + "label": "IP adresa" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Podsíť" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Povoleno" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP Konfigurace" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Časová značka", + "unset": "Zrušit nastavení", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Povolit úsporný režim" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Nastavení napájení" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Soukromý klíč" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Veřejný klíč" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/dialog.json b/packages/web/public/i18n/locales/cs-CZ/dialog.json index dbe2aab6..56c2577c 100644 --- a/packages/web/public/i18n/locales/cs-CZ/dialog.json +++ b/packages/web/public/i18n/locales/cs-CZ/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Sériová komunikace", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Zpráva", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Napětí", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Jste si jistý?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Jste si jistý?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Sériová komunikace", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Zpráva", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Napětí", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Jste si jistý?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Jste si jistý?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/messages.json b/packages/web/public/i18n/locales/cs-CZ/messages.json index e4ddb17d..58688d9f 100644 --- a/packages/web/public/i18n/locales/cs-CZ/messages.json +++ b/packages/web/public/i18n/locales/cs-CZ/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Odeslat" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Odeslat" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/moduleConfig.json b/packages/web/public/i18n/locales/cs-CZ/moduleConfig.json index 69d76cfe..c2319f19 100644 --- a/packages/web/public/i18n/locales/cs-CZ/moduleConfig.json +++ b/packages/web/public/i18n/locales/cs-CZ/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambientní osvětlení", - "tabAudio": "Zvuk", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detekční senzor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Informace o sousedech", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Zkouška dosahu", - "tabSerial": "Sériová komunikace", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetrie" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Proud", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Červená", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Zelená", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Modrá", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Povoleno", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Povoleno", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS povoleno", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Kořenové téma", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Povoleno", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Vypršel čas spojení", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Počet záznamů", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Interval aktualizace měření spotřeby (v sekundách)" - }, - "environmentUpdateInterval": { - "label": "Interval aktualizace měření životního prostředí (v sekundách)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambientní osvětlení", + "tabAudio": "Zvuk", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detekční senzor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Informace o sousedech", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Zkouška dosahu", + "tabSerial": "Sériová komunikace", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetrie" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Proud", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Červená", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Zelená", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Modrá", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Povoleno", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Povoleno", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS povoleno", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Kořenové téma", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Povoleno", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Vypršel čas spojení", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Počet záznamů", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Interval aktualizace měření spotřeby (v sekundách)" + }, + "environmentUpdateInterval": { + "label": "Interval aktualizace měření životního prostředí (v sekundách)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/nodes.json b/packages/web/public/i18n/locales/cs-CZ/nodes.json index df4b4c6a..53a6d1d2 100644 --- a/packages/web/public/i18n/locales/cs-CZ/nodes.json +++ b/packages/web/public/i18n/locales/cs-CZ/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Oblíbené", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Chyba", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Přímý", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Oblíbené", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Chyba", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Přímý", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/cs-CZ/ui.json b/packages/web/public/i18n/locales/cs-CZ/ui.json index 550b2af2..6386e4ee 100644 --- a/packages/web/public/i18n/locales/cs-CZ/ui.json +++ b/packages/web/public/i18n/locales/cs-CZ/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Zprávy", - "map": "Mapa", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Kanály", - "nodes": "Uzly" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Baterie" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Skrýt heslo" - }, - "showPassword": { - "label": "Zobrazit heslo" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metriky" - }, - "role": { - "label": "Role" - }, - "filter": { - "label": "Filtr" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Napětí" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Přímý", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Naposledy slyšen", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Jazyk", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Tmavý", - "light": "Světlý", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Zprávy", + "map": "Mapa", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Kanály", + "nodes": "Uzly" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Baterie" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Skrýt heslo" + }, + "showPassword": { + "label": "Zobrazit heslo" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metriky" + }, + "role": { + "label": "Role" + }, + "filter": { + "label": "Filtr" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Napětí" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Přímý", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Naposledy slyšen", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Jazyk", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Tmavý", + "light": "Světlý", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/de-DE/channels.json b/packages/web/public/i18n/locales/de-DE/channels.json index 7048124e..170b23a5 100644 --- a/packages/web/public/i18n/locales/de-DE/channels.json +++ b/packages/web/public/i18n/locales/de-DE/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanäle", - "channelName": "Kanal {{channelName}}", - "broadcastLabel": "Primär", - "channelIndex": "Kanal {{index}}" - }, - "validation": { - "pskInvalid": "Bitte geben Sie einen gültigen {{bits}} Bit PSK Schlüssel ein." - }, - "settings": { - "label": "Kanaleinstellungen", - "description": "Verschlüsselung, MQTT & sonstige Einstellungen" - }, - "role": { - "label": "Rolle", - "description": "Gerätetelemetrie wird über den PRIMÄR Kanal gesendet. Nur ein PRIMÄR Kanal ist erlaubt.", - "options": { - "primary": "PRIMÄR", - "disabled": "DEAKTIVIERT", - "secondary": "SEKUNDÄR" - } - }, - "psk": { - "label": "Vorher verteilter Schlüssel", - "description": "Unterstützte PSK-Längen: 256-Bit, 128-Bit, 8-Bit, leer (0-Bit)", - "generate": "Erzeugen" - }, - "name": { - "label": "Name", - "description": "Ein eindeutiger Name für den Kanal <12 Bytes. Leer lassen für Standard." - }, - "uplinkEnabled": { - "label": "Uplink aktiviert", - "description": "Nachrichten vom lokalen Netz über MQTT versenden" - }, - "downlinkEnabled": { - "label": "Downlink aktiviert", - "description": "Nachrichten von MQTT im lokalen Netz versenden" - }, - "positionPrecision": { - "label": "Standort", - "description": "Die Genauigkeit des Standorts, die in diesem Kanal geteilt werden soll. Kann deaktiviert werden.", - "options": { - "none": "Standort nicht freigeben", - "precise": "Genauer Standort", - "metric_km23": "Innerhalb von 23 Kilometern", - "metric_km12": "Innerhalb von 12 Kilometern", - "metric_km5_8": "Innerhalb von 5,8 Kilometern", - "metric_km2_9": "Innerhalb von 2,9 Kilometern", - "metric_km1_5": "Innerhalb von 1,5 Kilometern", - "metric_m700": "Innerhalb von 700 Metern", - "metric_m350": "Innerhalb von 350 Metern", - "metric_m200": "Innerhalb von 200 Metern", - "metric_m90": "Innerhalb von 90 Metern", - "metric_m50": "Innerhalb von 50 Metern", - "imperial_mi15": "Innerhalb von 15 Meilen", - "imperial_mi7_3": "Innerhalb von 7,3 Meilen", - "imperial_mi3_6": "Innerhalb von 3,6 Meilen", - "imperial_mi1_8": "Innerhalb von 1,8 Meilen", - "imperial_mi0_9": "Innerhalb von 0,9 Meilen", - "imperial_mi0_5": "Innerhalb von 0,5 Meilen", - "imperial_mi0_2": "Innerhalb von 0,2 Meilen", - "imperial_ft600": "Innerhalb von 600 Fuß", - "imperial_ft300": "Innerhalb von 300 Fuß", - "imperial_ft150": "Innerhalb von 150 Fuß" - } - } + "page": { + "sectionLabel": "Kanäle", + "channelName": "Kanal {{channelName}}", + "broadcastLabel": "Primär", + "channelIndex": "Kanal {{index}}" + }, + "validation": { + "pskInvalid": "Bitte geben Sie einen gültigen {{bits}} Bit PSK Schlüssel ein." + }, + "settings": { + "label": "Kanaleinstellungen", + "description": "Verschlüsselung, MQTT & sonstige Einstellungen" + }, + "role": { + "label": "Rolle", + "description": "Gerätetelemetrie wird über den PRIMÄR Kanal gesendet. Nur ein PRIMÄR Kanal ist erlaubt.", + "options": { + "primary": "PRIMÄR", + "disabled": "DEAKTIVIERT", + "secondary": "SEKUNDÄR" + } + }, + "psk": { + "label": "Vorher verteilter Schlüssel", + "description": "Unterstützte PSK-Längen: 256-Bit, 128-Bit, 8-Bit, leer (0-Bit)", + "generate": "Erzeugen" + }, + "name": { + "label": "Name", + "description": "Ein eindeutiger Name für den Kanal <12 Bytes. Leer lassen für Standard." + }, + "uplinkEnabled": { + "label": "Uplink aktiviert", + "description": "Nachrichten vom lokalen Netz über MQTT versenden" + }, + "downlinkEnabled": { + "label": "Downlink aktiviert", + "description": "Nachrichten von MQTT im lokalen Netz versenden" + }, + "positionPrecision": { + "label": "Standort", + "description": "Die Genauigkeit des Standorts, die in diesem Kanal geteilt werden soll. Kann deaktiviert werden.", + "options": { + "none": "Standort nicht freigeben", + "precise": "Genauer Standort", + "metric_km23": "Innerhalb von 23 Kilometern", + "metric_km12": "Innerhalb von 12 Kilometern", + "metric_km5_8": "Innerhalb von 5,8 Kilometern", + "metric_km2_9": "Innerhalb von 2,9 Kilometern", + "metric_km1_5": "Innerhalb von 1,5 Kilometern", + "metric_m700": "Innerhalb von 700 Metern", + "metric_m350": "Innerhalb von 350 Metern", + "metric_m200": "Innerhalb von 200 Metern", + "metric_m90": "Innerhalb von 90 Metern", + "metric_m50": "Innerhalb von 50 Metern", + "imperial_mi15": "Innerhalb von 15 Meilen", + "imperial_mi7_3": "Innerhalb von 7,3 Meilen", + "imperial_mi3_6": "Innerhalb von 3,6 Meilen", + "imperial_mi1_8": "Innerhalb von 1,8 Meilen", + "imperial_mi0_9": "Innerhalb von 0,9 Meilen", + "imperial_mi0_5": "Innerhalb von 0,5 Meilen", + "imperial_mi0_2": "Innerhalb von 0,2 Meilen", + "imperial_ft600": "Innerhalb von 600 Fuß", + "imperial_ft300": "Innerhalb von 300 Fuß", + "imperial_ft150": "Innerhalb von 150 Fuß" + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/commandPalette.json b/packages/web/public/i18n/locales/de-DE/commandPalette.json index 63114907..b96a1e4c 100644 --- a/packages/web/public/i18n/locales/de-DE/commandPalette.json +++ b/packages/web/public/i18n/locales/de-DE/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "Keine Ergebnisse gefunden.", - "page": { - "title": "Befehlsmenü" - }, - "pinGroup": { - "label": "Befehlsgruppe anheften" - }, - "unpinGroup": { - "label": "Befehlsgruppe lösen" - }, - "goto": { - "label": "Gehe zu", - "command": { - "messages": "Nachrichten", - "map": "Karte", - "config": "Einstellungen", - "channels": "Kanäle", - "nodes": "Knoten" - } - }, - "manage": { - "label": "Verwalten", - "command": { - "switchNode": "Knoten wechseln", - "connectNewNode": "Neuen Knoten verbinden" - } - }, - "contextual": { - "label": "Kontextabhängig", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Importieren", - "scheduleShutdown": "Herunterfahren planen", - "scheduleReboot": "Neustarten planen", - "rebootToOtaMode": "Neustart in den OTA Modus", - "resetNodeDb": "Knotendatenbank zurücksetzen", - "factoryResetDevice": "Gerät auf Werkseinstellungen zurücksetzen", - "factoryResetConfig": "Auf Werkseinstellungen zurücksetzen" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Neu einrichten", - "clearAllStoredMessages": "Alle gespeicherten Nachrichten löschen" - } - } + "emptyState": "Keine Ergebnisse gefunden.", + "page": { + "title": "Befehlsmenü" + }, + "pinGroup": { + "label": "Befehlsgruppe anheften" + }, + "unpinGroup": { + "label": "Befehlsgruppe lösen" + }, + "goto": { + "label": "Gehe zu", + "command": { + "messages": "Nachrichten", + "map": "Karte", + "config": "Einstellungen", + "channels": "Kanäle", + "nodes": "Knoten" + } + }, + "manage": { + "label": "Verwalten", + "command": { + "switchNode": "Knoten wechseln", + "connectNewNode": "Neuen Knoten verbinden" + } + }, + "contextual": { + "label": "Kontextabhängig", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Importieren", + "scheduleShutdown": "Herunterfahren planen", + "scheduleReboot": "Neustarten planen", + "rebootToOtaMode": "Neustart in den OTA Modus", + "resetNodeDb": "Knotendatenbank zurücksetzen", + "factoryResetDevice": "Gerät auf Werkseinstellungen zurücksetzen", + "factoryResetConfig": "Auf Werkseinstellungen zurücksetzen" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Neu einrichten", + "clearAllStoredMessages": "Alle gespeicherten Nachrichten löschen" + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/common.json b/packages/web/public/i18n/locales/de-DE/common.json index b02e09d6..04b11d34 100644 --- a/packages/web/public/i18n/locales/de-DE/common.json +++ b/packages/web/public/i18n/locales/de-DE/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Anwenden", - "backupKey": "Schlüssel sichern", - "cancel": "Abbrechen", - "clearMessages": "Nachrichten löschen", - "close": "Schließen", - "confirm": "Bestätigen", - "delete": "Löschen", - "dismiss": "Tastatur ausblenden", - "download": "Herunterladen", - "export": "Exportieren", - "generate": "Erzeugen", - "regenerate": "Neu erzeugen", - "import": "Importieren", - "message": "Nachricht", - "now": "Jetzt", - "ok": "Ok", - "print": "Drucken", - "rebootOtaNow": "Neustart in den OTA Modus", - "remove": "Entfernen", - "requestNewKeys": "Neue Schlüssel anfordern", - "requestPosition": "Standort anfordern", - "reset": "Zurücksetzen", - "save": "Speichern", - "scanQr": "QR Code scannen", - "traceRoute": "Route verfolgen", - "submit": "Absenden" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web-Applikation" - }, - "loading": "Wird geladen...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Sprung", - "plural": "Sprünge" - }, - "hopsAway": { - "one": "{{count}} Sprung entfernt", - "plural": "{{count}} Sprünge entfernt", - "unknown": "Sprungweite unbekannt" - }, - "megahertz": "MHz", - "raw": "Einheitslos", - "meter": { - "one": "Meter", - "plural": "Meter", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minuten" - }, - "hour": { - "one": "Stunde", - "plural": "Stunden" - }, - "millisecond": { - "one": "Millisekunde", - "plural": "Millisekunden", - "suffix": "ms" - }, - "second": { - "one": "Sekunde", - "plural": "Sekunden" - }, - "day": { - "one": "Tag", - "plural": "Tage" - }, - "month": { - "one": "Monat", - "plural": "Monate" - }, - "year": { - "one": "Jahr", - "plural": "Jahre" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volt", - "suffix": "V" - }, - "record": { - "one": "Datensatz", - "plural": "Datensätze" - } - }, - "security": { - "0bit": "Leer", - "8bit": "8 Bit", - "128bit": "128 Bit", - "256bit": "256 Bit" - }, - "unknown": { - "longName": "Unbekannt", - "shortName": "UNB", - "notAvailable": "Keine Angaben", - "num": "???" - }, - "nodeUnknownPrefix": "!", - "unset": "NICHT GESETZT", - "fallbackName": "Meshtastic {{last4}}", - "node": "Knoten", - "formValidation": { - "unsavedChanges": "Ungespeicherte Änderungen", - "tooBig": { - "string": "Zu lang, erwarte maximal {{maximum}} Zeichen.", - "number": "Zu groß, erwartete eine Zahl kleiner oder gleich {{maximum}}.", - "bytes": "Zu groß, erwarte maximal {{params.maximum}} Bytes." - }, - "tooSmall": { - "string": "Zu kurz, erwartete mindestens {{minimum}} Zeichen.", - "number": "Zu klein, erwartete eine Zahl größer oder gleich {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Ungültiges Format, erwartete eine IPv4 Adresse.", - "key": "Ungültiges Format, erwartet einen Base64-kodierten vor verteilten Schlüssel (PSK)." - }, - "invalidType": { - "number": "Ungültiger Typ, erwartete eine Zahl." - }, - "pskLength": { - "0bit": "Der Schlüssel muss leer sein.", - "8bit": "Der administrative Schlüssel muss ein vor verteilter 8 Bit Schlüssel (PSK) sein.", - "128bit": "Der administrative Schlüssel muss ein vor verteilter 128 Bit Schlüssel (PSK) sein.", - "256bit": "Der administrative Schlüssel muss ein vor verteilter 256 Bit Schlüssel (PSK) sein." - }, - "required": { - "generic": "Dies ist ein Pflichtfeld.", - "managed": "Mindestens ein administrativer Schlüssel wird benötigt, um diesen Knoten zu verwalten", - "key": "Schlüssel erforderlich." - } - } + "button": { + "apply": "Anwenden", + "backupKey": "Schlüssel sichern", + "cancel": "Abbrechen", + "clearMessages": "Nachrichten löschen", + "close": "Schließen", + "confirm": "Bestätigen", + "delete": "Löschen", + "dismiss": "Tastatur ausblenden", + "download": "Herunterladen", + "export": "Exportieren", + "generate": "Erzeugen", + "regenerate": "Neu erzeugen", + "import": "Importieren", + "message": "Nachricht", + "now": "Jetzt", + "ok": "Ok", + "print": "Drucken", + "rebootOtaNow": "Neustart in den OTA Modus", + "remove": "Entfernen", + "requestNewKeys": "Neue Schlüssel anfordern", + "requestPosition": "Standort anfordern", + "reset": "Zurücksetzen", + "save": "Speichern", + "scanQr": "QR Code scannen", + "traceRoute": "Route verfolgen", + "submit": "Absenden" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web-Applikation" + }, + "loading": "Wird geladen...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Sprung", + "plural": "Sprünge" + }, + "hopsAway": { + "one": "{{count}} Sprung entfernt", + "plural": "{{count}} Sprünge entfernt", + "unknown": "Sprungweite unbekannt" + }, + "megahertz": "MHz", + "raw": "Einheitslos", + "meter": { + "one": "Meter", + "plural": "Meter", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minuten" + }, + "hour": { + "one": "Stunde", + "plural": "Stunden" + }, + "millisecond": { + "one": "Millisekunde", + "plural": "Millisekunden", + "suffix": "ms" + }, + "second": { + "one": "Sekunde", + "plural": "Sekunden" + }, + "day": { + "one": "Tag", + "plural": "Tage" + }, + "month": { + "one": "Monat", + "plural": "Monate" + }, + "year": { + "one": "Jahr", + "plural": "Jahre" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volt", + "suffix": "V" + }, + "record": { + "one": "Datensatz", + "plural": "Datensätze" + } + }, + "security": { + "0bit": "Leer", + "8bit": "8 Bit", + "128bit": "128 Bit", + "256bit": "256 Bit" + }, + "unknown": { + "longName": "Unbekannt", + "shortName": "UNB", + "notAvailable": "Keine Angaben", + "num": "???" + }, + "nodeUnknownPrefix": "!", + "unset": "NICHT GESETZT", + "fallbackName": "Meshtastic {{last4}}", + "node": "Knoten", + "formValidation": { + "unsavedChanges": "Ungespeicherte Änderungen", + "tooBig": { + "string": "Zu lang, erwarte maximal {{maximum}} Zeichen.", + "number": "Zu groß, erwartete eine Zahl kleiner oder gleich {{maximum}}.", + "bytes": "Zu groß, erwarte maximal {{params.maximum}} Bytes." + }, + "tooSmall": { + "string": "Zu kurz, erwartete mindestens {{minimum}} Zeichen.", + "number": "Zu klein, erwartete eine Zahl größer oder gleich {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Ungültiges Format, erwartete eine IPv4 Adresse.", + "key": "Ungültiges Format, erwartet einen Base64-kodierten vor verteilten Schlüssel (PSK)." + }, + "invalidType": { + "number": "Ungültiger Typ, erwartete eine Zahl." + }, + "pskLength": { + "0bit": "Der Schlüssel muss leer sein.", + "8bit": "Der administrative Schlüssel muss ein vor verteilter 8 Bit Schlüssel (PSK) sein.", + "128bit": "Der administrative Schlüssel muss ein vor verteilter 128 Bit Schlüssel (PSK) sein.", + "256bit": "Der administrative Schlüssel muss ein vor verteilter 256 Bit Schlüssel (PSK) sein." + }, + "required": { + "generic": "Dies ist ein Pflichtfeld.", + "managed": "Mindestens ein administrativer Schlüssel wird benötigt, um diesen Knoten zu verwalten", + "key": "Schlüssel erforderlich." + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/dashboard.json b/packages/web/public/i18n/locales/de-DE/dashboard.json index 5ec2de3d..2ee805ec 100644 --- a/packages/web/public/i18n/locales/de-DE/dashboard.json +++ b/packages/web/public/i18n/locales/de-DE/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Verbundene Geräte", - "description": "Verwalten Sie Ihre verbundenen Meshtastic Geräte.", - "connectionType_ble": "BLE", - "connectionType_serial": "Seriell", - "connectionType_network": "Netzwerk", - "noDevicesTitle": "Keine Geräte verbunden", - "noDevicesDescription": "Verbinden Sie ein neues Gerät, um zu beginnen.", - "button_newConnection": "Neue Verbindung" - } + "dashboard": { + "title": "Verbundene Geräte", + "description": "Verwalten Sie Ihre verbundenen Meshtastic Geräte.", + "connectionType_ble": "BLE", + "connectionType_serial": "Seriell", + "connectionType_network": "Netzwerk", + "noDevicesTitle": "Keine Geräte verbunden", + "noDevicesDescription": "Verbinden Sie ein neues Gerät, um zu beginnen.", + "button_newConnection": "Neue Verbindung" + } } diff --git a/packages/web/public/i18n/locales/de-DE/deviceConfig.json b/packages/web/public/i18n/locales/de-DE/deviceConfig.json index 12a24450..c14c91a7 100644 --- a/packages/web/public/i18n/locales/de-DE/deviceConfig.json +++ b/packages/web/public/i18n/locales/de-DE/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Einstellungen", - "tabBluetooth": "Bluetooth", - "tabDevice": "Gerät", - "tabDisplay": "Display", - "tabLora": "LoRa", - "tabNetwork": "Netzwerk", - "tabPosition": "Standort", - "tabPower": "Leistung", - "tabSecurity": "Sicherheit" - }, - "sidebar": { - "label": "Module" - }, - "device": { - "title": "Geräteeinstellungen", - "description": "Einstellungen für dieses Gerät", - "buttonPin": { - "description": "GPIO für Taste überschreiben", - "label": "GPIO Taste" - }, - "buzzerPin": { - "description": "GPIO für Summer überschreiben", - "label": "GPIO Summer" - }, - "disableTripleClick": { - "description": "Dreifachklicken deaktivieren", - "label": "Dreifachklicken deaktivieren" - }, - "doubleTapAsButtonPress": { - "description": "Doppeltes Tippen als Taste verwenden", - "label": "Doppelklick als Tastendruck" - }, - "ledHeartbeatDisabled": { - "description": "Die Herzschlag LED deaktivieren", - "label": "Herzschlag LED deaktivieren" - }, - "nodeInfoBroadcastInterval": { - "description": "Häufigkeit der Übertragung von Knoteninformationen", - "label": "Knoteninfo Übertragungsintervall" - }, - "posixTimezone": { - "description": "Zeichenfolge der POSIX Zeitzone für dieses Gerät", - "label": "POSIX Zeitzone" - }, - "rebroadcastMode": { - "description": "Wie Weiterleitungen behandelt werden", - "label": "Weiterleitungsmodus" - }, - "role": { - "description": "In welche Rolle das Gerät im Netz arbeitet", - "label": "Rolle" - } - }, - "bluetooth": { - "title": "Bluetooth Einstellungen", - "description": "Einstellungen für das Bluetooth Modul", - "note": "Hinweis: Einige Geräte (ESP32) können nicht gleichzeitig Bluetooth und WLAN verwenden.", - "enabled": { - "description": "Bluetooth aktivieren oder deaktivieren", - "label": "Aktiviert" - }, - "pairingMode": { - "description": "PIN Nummer Auswahlverhalten", - "label": "Kopplungsmodus" - }, - "pin": { - "description": "PIN Nummer zum Verbinden verwenden", - "label": "PIN Nummer" - } - }, - "display": { - "description": "Einstellungen für die Geräteanzeige", - "title": "Anzeigeeinstellungen", - "headingBold": { - "description": "Überschrifttext fett darstellen", - "label": "Fette Überschrift" - }, - "carouselDelay": { - "description": "Bestimmt wie schnell die Fenster durch gewechselt werden", - "label": "Karussellverzögerung" - }, - "compassNorthTop": { - "description": "Norden im Kompass immer oben anzeigen", - "label": "Kompass Norden oben" - }, - "displayMode": { - "description": "Variante des Anzeigelayout", - "label": "Anzeigemodus" - }, - "displayUnits": { - "description": "Zeige metrische oder imperiale Einheiten", - "label": "Anzeigeeinheiten" - }, - "flipScreen": { - "description": "Anzeige um 180 Grad drehen", - "label": "Anzeige drehen" - }, - "gpsDisplayUnits": { - "description": "Anzeigeformat der Koordinaten", - "label": "GPS Anzeigeformat" - }, - "oledType": { - "description": "Art des OLED Anzeige, die an dem Gerät angeschlossen ist", - "label": "OLED Typ" - }, - "screenTimeout": { - "description": "Anzeige nach dieser Zeit automatisch ausschalten", - "label": "Anzeigeabschaltung" - }, - "twelveHourClock": { - "description": "12-Stunden Format benutzen", - "label": "12-Stunden Uhr" - }, - "wakeOnTapOrMotion": { - "description": "Gerät durch Tippen oder Bewegung aufwecken", - "label": "Aufwachen durch Tippen oder Bewegung" - } - }, - "lora": { - "title": "Netzeinstellungen", - "description": "Einstellungen für das LoRa Netz", - "bandwidth": { - "description": "Kanalbandbreite in MHz", - "label": "Bandbreite" - }, - "boostedRxGain": { - "description": "Erhöhte Empfangsverstärkung", - "label": "Erhöhte Empfangsverstärkung" - }, - "codingRate": { - "description": "Kodierrate", - "label": "Fehlerkorrektur" - }, - "frequencyOffset": { - "description": "Frequenzversatz zur Kalibrierung von Oszillatorfehlern", - "label": "Frequenzversatz" - }, - "frequencySlot": { - "description": "LoRa Frequenzschlitz", - "label": "Frequenzschlitz" - }, - "hopLimit": { - "description": "Maximale Sprungweite", - "label": "Sprungweite" - }, - "ignoreMqtt": { - "description": "MQTT Nachrichten nicht über das Netz weiterleiten", - "label": "MQTT ignorieren" - }, - "modemPreset": { - "description": "Modem Voreinstellung die verwendet wird", - "label": "Modem Voreinstellungen" - }, - "okToMqtt": { - "description": "Wenn auf aktiviert, zeigt diese Einstellung an, dass der Benutzer das Weiterleiten von Nachrichten über MQTT akzeptiert. Wenn deaktiviert, werden entfernte Knoten aufgefordert, Nachrichten nicht über MQTT weiterzuleiten", - "label": "OK für MQTT" - }, - "overrideDutyCycle": { - "description": "Duty-Cycle überschreiben", - "label": "Duty-Cycle überschreiben" - }, - "overrideFrequency": { - "description": "Sendefrequenz überschreiben (MHz)", - "label": "Sendefrequenz überschreiben" - }, - "region": { - "description": "Legt die Region für Ihren Knoten fest", - "label": "Region" - }, - "spreadingFactor": { - "description": "Anzahl der Symbole zur Kodierung der Nutzdaten", - "label": "Spreizfaktor" - }, - "transmitEnabled": { - "description": "Sender (TX) des LoRa Funkgerätes aktivieren/deaktivieren", - "label": "Senden aktiviert" - }, - "transmitPower": { - "description": "Maximale Sendeleistung", - "label": "Sendeleistung" - }, - "usePreset": { - "description": "Eine der vordefinierten Modem Voreinstellungen verwenden", - "label": "Voreinstellung verwenden" - }, - "meshSettings": { - "description": "Einstellungen für das LoRa Netz", - "label": "Netzeinstellungen" - }, - "waveformSettings": { - "description": "Einstellungen für die LoRa Wellenform", - "label": "Einstellungen der Wellenform" - }, - "radioSettings": { - "label": "Radio-Einstellungen", - "description": "Einstellungen für das LoRa Funkgerät" - } - }, - "network": { - "title": "WLAN Einstellungen", - "description": "WLAN Funkeinstellungen", - "note": "Hinweis: Einige Geräte (ESP32) können nicht gleichzeitig Bluetooth und WLAN verwenden.", - "addressMode": { - "description": "Auswahl der IP Adressenzuweisung", - "label": "IP Adressenmodus" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Aktivieren oder deaktivieren sie den Ethernet Anschluss", - "label": "Aktiviert" - }, - "gateway": { - "description": "Standard Gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP Adresse", - "label": "IP" - }, - "psk": { - "description": "Netzwerkpasswort", - "label": "PSK" - }, - "ssid": { - "description": "Netzwerkname", - "label": "SSID" - }, - "subnet": { - "description": "Subnetzmaske", - "label": "Subnetz" - }, - "wifiEnabled": { - "description": "Aktivieren oder deaktivieren Sie die WLAN Übertragung", - "label": "Aktiviert" - }, - "meshViaUdp": { - "label": "Netz über UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Einstellung des Ethernet Ports", - "label": "Ethernet Einstellung" - }, - "ipConfigSettings": { - "description": "Einstellung der IP Adresse", - "label": "IP Adresseinstellungen" - }, - "ntpConfigSettings": { - "description": "NTP Server Einstellungen", - "label": "NTP Einstellungen" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog Einstellung", - "label": "Rsyslog Einstellung" - }, - "udpConfigSettings": { - "description": "UDP über Netz Einstellung", - "label": "UDP Konfiguration" - } - }, - "position": { - "title": "Standorteinstellung", - "description": "Einstellungen für das Standortmodul", - "broadcastInterval": { - "description": "Wie oft Ihr Standort über das Netz gesendet wird", - "label": "Übertragungsintervall" - }, - "enablePin": { - "description": "Überschreiben des GPIO der das GPS-Modul aktiviert", - "label": "GPIO GPS aktivieren" - }, - "fixedPosition": { - "description": "GPS Standort nicht senden, sondern manuell angegeben", - "label": "Fester Standort" - }, - "gpsMode": { - "description": "Einstellung, ob GPS des Geräts aktiviert, deaktiviert oder nicht vorhanden ist", - "label": "GPS Modus" - }, - "gpsUpdateInterval": { - "description": "Wie oft ein GPS Standort ermittelt werden soll", - "label": "GPS Aktualisierungsintervall" - }, - "positionFlags": { - "description": "Optionalen, die bei der Zusammenstellung von Standortnachrichten enthalten sein sollen. Je mehr Optionen ausgewählt werden, desto größer wird die Nachricht und die längere Übertragungszeit erhöht das Risiko für einen Nachrichtenverlust.", - "label": "Standort Optionen" - }, - "receivePin": { - "description": "GPIO Pin für serielles Empfangen (RX) des GPS-Moduls überschreiben", - "label": "GPIO Empfangen" - }, - "smartPositionEnabled": { - "description": "Standort nur verschicken, wenn eine sinnvolle Standortänderung stattgefunden hat", - "label": "Intelligenten Standort aktivieren" - }, - "smartPositionMinDistance": { - "description": "Mindestabstand (in Meter), die vor dem Senden einer Standortaktualisierung zurückgelegt werden muss", - "label": "Minimale Entfernung für intelligenten Standort" - }, - "smartPositionMinInterval": { - "description": "Minimales Intervall (in Sekunden), das vor dem Senden einer Standortaktualisierung vergangen sein muss", - "label": "Minimales Intervall für intelligenten Standort" - }, - "transmitPin": { - "description": "GPIO Pin für serielles Senden (TX) des GPS-Moduls überschreiben", - "label": "GPIO Senden" - }, - "intervalsSettings": { - "description": "Wie oft Standortaktualisierungen gesendet werden", - "label": "Intervalle" - }, - "flags": { - "placeholder": "Standort Optionen auswählen", - "altitude": "Höhe", - "altitudeGeoidalSeparation": "Geoidale Höhentrennung", - "altitudeMsl": "Höhe in Bezug auf Meeresspiegel", - "dop": "Dilution of Präzision (DOP) PDOP standardmäßig verwenden", - "hdopVdop": "Wenn DOP gesetzt ist, wird HDOP / VDOP anstelle von PDOP verwendet", - "numSatellites": "Anzahl Satelliten", - "sequenceNumber": "Sequenznummer", - "timestamp": "Zeitstempel", - "unset": "Nicht konfiguriert", - "vehicleHeading": "Fahrzeugsteuerkurs", - "vehicleSpeed": "Fahrzeuggeschwindigkeit" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Zur Optimierung der Genauigkeit bei der Akkuspannunsmessung", - "label": "ADC Multiplikationsfaktor" - }, - "ina219Address": { - "description": "Adresse des INA219 Stromsensors", - "label": "INA219 Adresse" - }, - "lightSleepDuration": { - "description": "Wie lange das Gerät im leichten Schlafmodus ist", - "label": "Dauer leichter Schlafmodus" - }, - "minimumWakeTime": { - "description": "Minimale Zeitspanne für die das Gerät aktiv bleibt, nachdem es eine Nachricht empfangen hat", - "label": "Minimale Aufwachzeit" - }, - "noConnectionBluetoothDisabled": { - "description": "Wenn das Gerät keine Bluetooth Verbindung erhält, wird der BLE Funk nach dieser Zeit deaktiviert", - "label": "Keine Verbindung, Bluetooth deaktiviert" - }, - "powerSavingEnabled": { - "description": "Auswählen, wenn aus einer Stromquelle mit niedriger Kapazität (z.B Solar) betrieben wird, um den Stromverbrauch so weit wie möglich zu minimieren.", - "label": "Energiesparmodus aktivieren" - }, - "shutdownOnBatteryDelay": { - "description": "Verzögerung bis zum Abschalten der Knoten sich im Akkubetrieb befindet. 0 für unbegrenzt", - "label": "Verzögerung Akkuabschaltung" - }, - "superDeepSleepDuration": { - "description": "Wie lange das Gerät im supertiefen Schlafmodus ist", - "label": "Dauer Supertiefschlaf" - }, - "powerConfigSettings": { - "description": "Einstellungen für das Energiemodul", - "label": "Power Konfiguration" - }, - "sleepSettings": { - "description": "Einstellungen Ruhezustand für das Energiemodul", - "label": "Einstellung Ruhezustand" - } - }, - "security": { - "description": "Sicherheitseinstellungen", - "title": "Sicherheitseinstellungen", - "button_backupKey": "Schlüssel sichern", - "adminChannelEnabled": { - "description": "Erlaubt die Gerätesteuerung über den unsicheren, veralteten administrativen Kanal", - "label": "Veraltete Administrierung erlauben" - }, - "enableDebugLogApi": { - "description": "Ausgabe von Fehlerprotokollen in Echtzeit über die serielle Schnittstelle, Anzeige und Export von Standort reduzierten Geräteprotokollen über Bluetooth", - "label": "Debug-Protokoll API aktivieren" - }, - "managed": { - "description": "Wenn aktiviert, können die Geräteeinstellungen nur von einem entfernten Administratorknoten über administrative Nachrichten geändert werden. Aktivieren Sie diese Option nur, wenn mindestens ein geeigneter Administratorknoten eingerichtet, und desen öffentlicher Schlüssel wird in einem der obigen Felder gespeichert wurde.", - "label": "Verwaltet" - }, - "privateKey": { - "description": "Wird verwendet, um einen gemeinsamen Schlüssel mit einem entfernten Gerät zu erstellen", - "label": "Privater Schlüssel" - }, - "publicKey": { - "description": "Wird an andere Knoten im Netz gesendet, damit diese einen gemeinsamen geheimen Schlüssel berechnen können", - "label": "Öffentlicher Schlüssel" - }, - "primaryAdminKey": { - "description": "Erster öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", - "label": "Erster Admin-Schlüssel" - }, - "secondaryAdminKey": { - "description": "Zweiter öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", - "label": "Zweiter Admin-Schlüssel" - }, - "serialOutputEnabled": { - "description": "Serielle Konsole über die Stream-API", - "label": "Serielle Ausgabe aktiviert" - }, - "tertiaryAdminKey": { - "description": "Dritter öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", - "label": "Dritter Admin-Schlüssel" - }, - "adminSettings": { - "description": "Administrator Einstellungen", - "label": "Administrator Einstellungen" - }, - "loggingSettings": { - "description": "Einstellungen für die Protokollierung", - "label": "Protokolleinstellungen" - } - } + "page": { + "title": "Einstellungen", + "tabBluetooth": "Bluetooth", + "tabDevice": "Gerät", + "tabDisplay": "Display", + "tabLora": "LoRa", + "tabNetwork": "Netzwerk", + "tabPosition": "Standort", + "tabPower": "Leistung", + "tabSecurity": "Sicherheit" + }, + "sidebar": { + "label": "Module" + }, + "device": { + "title": "Geräteeinstellungen", + "description": "Einstellungen für dieses Gerät", + "buttonPin": { + "description": "GPIO für Taste überschreiben", + "label": "GPIO Taste" + }, + "buzzerPin": { + "description": "GPIO für Summer überschreiben", + "label": "GPIO Summer" + }, + "disableTripleClick": { + "description": "Dreifachklicken deaktivieren", + "label": "Dreifachklicken deaktivieren" + }, + "doubleTapAsButtonPress": { + "description": "Doppeltes Tippen als Taste verwenden", + "label": "Doppelklick als Tastendruck" + }, + "ledHeartbeatDisabled": { + "description": "Die Herzschlag LED deaktivieren", + "label": "Herzschlag LED deaktivieren" + }, + "nodeInfoBroadcastInterval": { + "description": "Häufigkeit der Übertragung von Knoteninformationen", + "label": "Knoteninfo Übertragungsintervall" + }, + "posixTimezone": { + "description": "Zeichenfolge der POSIX Zeitzone für dieses Gerät", + "label": "POSIX Zeitzone" + }, + "rebroadcastMode": { + "description": "Wie Weiterleitungen behandelt werden", + "label": "Weiterleitungsmodus" + }, + "role": { + "description": "In welche Rolle das Gerät im Netz arbeitet", + "label": "Rolle" + } + }, + "bluetooth": { + "title": "Bluetooth Einstellungen", + "description": "Einstellungen für das Bluetooth Modul", + "note": "Hinweis: Einige Geräte (ESP32) können nicht gleichzeitig Bluetooth und WLAN verwenden.", + "enabled": { + "description": "Bluetooth aktivieren oder deaktivieren", + "label": "Aktiviert" + }, + "pairingMode": { + "description": "PIN Nummer Auswahlverhalten", + "label": "Kopplungsmodus" + }, + "pin": { + "description": "PIN Nummer zum Verbinden verwenden", + "label": "PIN Nummer" + } + }, + "display": { + "description": "Einstellungen für die Geräteanzeige", + "title": "Anzeigeeinstellungen", + "headingBold": { + "description": "Überschrifttext fett darstellen", + "label": "Fette Überschrift" + }, + "carouselDelay": { + "description": "Bestimmt wie schnell die Fenster durch gewechselt werden", + "label": "Karussellverzögerung" + }, + "compassNorthTop": { + "description": "Norden im Kompass immer oben anzeigen", + "label": "Kompass Norden oben" + }, + "displayMode": { + "description": "Variante des Anzeigelayout", + "label": "Anzeigemodus" + }, + "displayUnits": { + "description": "Zeige metrische oder imperiale Einheiten", + "label": "Anzeigeeinheiten" + }, + "flipScreen": { + "description": "Anzeige um 180 Grad drehen", + "label": "Anzeige drehen" + }, + "gpsDisplayUnits": { + "description": "Anzeigeformat der Koordinaten", + "label": "GPS Anzeigeformat" + }, + "oledType": { + "description": "Art des OLED Anzeige, die an dem Gerät angeschlossen ist", + "label": "OLED Typ" + }, + "screenTimeout": { + "description": "Anzeige nach dieser Zeit automatisch ausschalten", + "label": "Anzeigeabschaltung" + }, + "twelveHourClock": { + "description": "12-Stunden Format benutzen", + "label": "12-Stunden Uhr" + }, + "wakeOnTapOrMotion": { + "description": "Gerät durch Tippen oder Bewegung aufwecken", + "label": "Aufwachen durch Tippen oder Bewegung" + } + }, + "lora": { + "title": "Netzeinstellungen", + "description": "Einstellungen für das LoRa Netz", + "bandwidth": { + "description": "Kanalbandbreite in MHz", + "label": "Bandbreite" + }, + "boostedRxGain": { + "description": "Erhöhte Empfangsverstärkung", + "label": "Erhöhte Empfangsverstärkung" + }, + "codingRate": { + "description": "Kodierrate", + "label": "Fehlerkorrektur" + }, + "frequencyOffset": { + "description": "Frequenzversatz zur Kalibrierung von Oszillatorfehlern", + "label": "Frequenzversatz" + }, + "frequencySlot": { + "description": "LoRa Frequenzschlitz", + "label": "Frequenzschlitz" + }, + "hopLimit": { + "description": "Maximale Sprungweite", + "label": "Sprungweite" + }, + "ignoreMqtt": { + "description": "MQTT Nachrichten nicht über das Netz weiterleiten", + "label": "MQTT ignorieren" + }, + "modemPreset": { + "description": "Modem Voreinstellung die verwendet wird", + "label": "Modem Voreinstellungen" + }, + "okToMqtt": { + "description": "Wenn auf aktiviert, zeigt diese Einstellung an, dass der Benutzer das Weiterleiten von Nachrichten über MQTT akzeptiert. Wenn deaktiviert, werden entfernte Knoten aufgefordert, Nachrichten nicht über MQTT weiterzuleiten", + "label": "OK für MQTT" + }, + "overrideDutyCycle": { + "description": "Duty-Cycle überschreiben", + "label": "Duty-Cycle überschreiben" + }, + "overrideFrequency": { + "description": "Sendefrequenz überschreiben (MHz)", + "label": "Sendefrequenz überschreiben" + }, + "region": { + "description": "Legt die Region für Ihren Knoten fest", + "label": "Region" + }, + "spreadingFactor": { + "description": "Anzahl der Symbole zur Kodierung der Nutzdaten", + "label": "Spreizfaktor" + }, + "transmitEnabled": { + "description": "Sender (TX) des LoRa Funkgerätes aktivieren/deaktivieren", + "label": "Senden aktiviert" + }, + "transmitPower": { + "description": "Maximale Sendeleistung", + "label": "Sendeleistung" + }, + "usePreset": { + "description": "Eine der vordefinierten Modem Voreinstellungen verwenden", + "label": "Voreinstellung verwenden" + }, + "meshSettings": { + "description": "Einstellungen für das LoRa Netz", + "label": "Netzeinstellungen" + }, + "waveformSettings": { + "description": "Einstellungen für die LoRa Wellenform", + "label": "Einstellungen der Wellenform" + }, + "radioSettings": { + "label": "Radio-Einstellungen", + "description": "Einstellungen für das LoRa Funkgerät" + } + }, + "network": { + "title": "WLAN Einstellungen", + "description": "WLAN Funkeinstellungen", + "note": "Hinweis: Einige Geräte (ESP32) können nicht gleichzeitig Bluetooth und WLAN verwenden.", + "addressMode": { + "description": "Auswahl der IP Adressenzuweisung", + "label": "IP Adressenmodus" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Aktivieren oder deaktivieren sie den Ethernet Anschluss", + "label": "Aktiviert" + }, + "gateway": { + "description": "Standard Gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP Adresse", + "label": "IP" + }, + "psk": { + "description": "Netzwerkpasswort", + "label": "PSK" + }, + "ssid": { + "description": "Netzwerkname", + "label": "SSID" + }, + "subnet": { + "description": "Subnetzmaske", + "label": "Subnetz" + }, + "wifiEnabled": { + "description": "Aktivieren oder deaktivieren Sie die WLAN Übertragung", + "label": "Aktiviert" + }, + "meshViaUdp": { + "label": "Netz über UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Einstellung des Ethernet Ports", + "label": "Ethernet Einstellung" + }, + "ipConfigSettings": { + "description": "Einstellung der IP Adresse", + "label": "IP Adresseinstellungen" + }, + "ntpConfigSettings": { + "description": "NTP Server Einstellungen", + "label": "NTP Einstellungen" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog Einstellung", + "label": "Rsyslog Einstellung" + }, + "udpConfigSettings": { + "description": "UDP über Netz Einstellung", + "label": "UDP Konfiguration" + } + }, + "position": { + "title": "Standorteinstellung", + "description": "Einstellungen für das Standortmodul", + "broadcastInterval": { + "description": "Wie oft Ihr Standort über das Netz gesendet wird", + "label": "Übertragungsintervall" + }, + "enablePin": { + "description": "Überschreiben des GPIO der das GPS-Modul aktiviert", + "label": "GPIO GPS aktivieren" + }, + "fixedPosition": { + "description": "GPS Standort nicht senden, sondern manuell angegeben", + "label": "Fester Standort" + }, + "gpsMode": { + "description": "Einstellung, ob GPS des Geräts aktiviert, deaktiviert oder nicht vorhanden ist", + "label": "GPS Modus" + }, + "gpsUpdateInterval": { + "description": "Wie oft ein GPS Standort ermittelt werden soll", + "label": "GPS Aktualisierungsintervall" + }, + "positionFlags": { + "description": "Optionalen, die bei der Zusammenstellung von Standortnachrichten enthalten sein sollen. Je mehr Optionen ausgewählt werden, desto größer wird die Nachricht und die längere Übertragungszeit erhöht das Risiko für einen Nachrichtenverlust.", + "label": "Standort Optionen" + }, + "receivePin": { + "description": "GPIO Pin für serielles Empfangen (RX) des GPS-Moduls überschreiben", + "label": "GPIO Empfangen" + }, + "smartPositionEnabled": { + "description": "Standort nur verschicken, wenn eine sinnvolle Standortänderung stattgefunden hat", + "label": "Intelligenten Standort aktivieren" + }, + "smartPositionMinDistance": { + "description": "Mindestabstand (in Meter), die vor dem Senden einer Standortaktualisierung zurückgelegt werden muss", + "label": "Minimale Entfernung für intelligenten Standort" + }, + "smartPositionMinInterval": { + "description": "Minimales Intervall (in Sekunden), das vor dem Senden einer Standortaktualisierung vergangen sein muss", + "label": "Minimales Intervall für intelligenten Standort" + }, + "transmitPin": { + "description": "GPIO Pin für serielles Senden (TX) des GPS-Moduls überschreiben", + "label": "GPIO Senden" + }, + "intervalsSettings": { + "description": "Wie oft Standortaktualisierungen gesendet werden", + "label": "Intervalle" + }, + "flags": { + "placeholder": "Standort Optionen auswählen", + "altitude": "Höhe", + "altitudeGeoidalSeparation": "Geoidale Höhentrennung", + "altitudeMsl": "Höhe in Bezug auf Meeresspiegel", + "dop": "Dilution of Präzision (DOP) PDOP standardmäßig verwenden", + "hdopVdop": "Wenn DOP gesetzt ist, wird HDOP / VDOP anstelle von PDOP verwendet", + "numSatellites": "Anzahl Satelliten", + "sequenceNumber": "Sequenznummer", + "timestamp": "Zeitstempel", + "unset": "Nicht konfiguriert", + "vehicleHeading": "Fahrzeugsteuerkurs", + "vehicleSpeed": "Fahrzeuggeschwindigkeit" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Zur Optimierung der Genauigkeit bei der Akkuspannunsmessung", + "label": "ADC Multiplikationsfaktor" + }, + "ina219Address": { + "description": "Adresse des INA219 Stromsensors", + "label": "INA219 Adresse" + }, + "lightSleepDuration": { + "description": "Wie lange das Gerät im leichten Schlafmodus ist", + "label": "Dauer leichter Schlafmodus" + }, + "minimumWakeTime": { + "description": "Minimale Zeitspanne für die das Gerät aktiv bleibt, nachdem es eine Nachricht empfangen hat", + "label": "Minimale Aufwachzeit" + }, + "noConnectionBluetoothDisabled": { + "description": "Wenn das Gerät keine Bluetooth Verbindung erhält, wird der BLE Funk nach dieser Zeit deaktiviert", + "label": "Keine Verbindung, Bluetooth deaktiviert" + }, + "powerSavingEnabled": { + "description": "Auswählen, wenn aus einer Stromquelle mit niedriger Kapazität (z.B Solar) betrieben wird, um den Stromverbrauch so weit wie möglich zu minimieren.", + "label": "Energiesparmodus aktivieren" + }, + "shutdownOnBatteryDelay": { + "description": "Verzögerung bis zum Abschalten der Knoten sich im Akkubetrieb befindet. 0 für unbegrenzt", + "label": "Verzögerung Akkuabschaltung" + }, + "superDeepSleepDuration": { + "description": "Wie lange das Gerät im supertiefen Schlafmodus ist", + "label": "Dauer Supertiefschlaf" + }, + "powerConfigSettings": { + "description": "Einstellungen für das Energiemodul", + "label": "Power Konfiguration" + }, + "sleepSettings": { + "description": "Einstellungen Ruhezustand für das Energiemodul", + "label": "Einstellung Ruhezustand" + } + }, + "security": { + "description": "Sicherheitseinstellungen", + "title": "Sicherheitseinstellungen", + "button_backupKey": "Schlüssel sichern", + "adminChannelEnabled": { + "description": "Erlaubt die Gerätesteuerung über den unsicheren, veralteten administrativen Kanal", + "label": "Veraltete Administrierung erlauben" + }, + "enableDebugLogApi": { + "description": "Ausgabe von Fehlerprotokollen in Echtzeit über die serielle Schnittstelle, Anzeige und Export von Standort reduzierten Geräteprotokollen über Bluetooth", + "label": "Debug-Protokoll API aktivieren" + }, + "managed": { + "description": "Wenn aktiviert, können die Geräteeinstellungen nur von einem entfernten Administratorknoten über administrative Nachrichten geändert werden. Aktivieren Sie diese Option nur, wenn mindestens ein geeigneter Administratorknoten eingerichtet, und desen öffentlicher Schlüssel wird in einem der obigen Felder gespeichert wurde.", + "label": "Verwaltet" + }, + "privateKey": { + "description": "Wird verwendet, um einen gemeinsamen Schlüssel mit einem entfernten Gerät zu erstellen", + "label": "Privater Schlüssel" + }, + "publicKey": { + "description": "Wird an andere Knoten im Netz gesendet, damit diese einen gemeinsamen geheimen Schlüssel berechnen können", + "label": "Öffentlicher Schlüssel" + }, + "primaryAdminKey": { + "description": "Erster öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", + "label": "Erster Admin-Schlüssel" + }, + "secondaryAdminKey": { + "description": "Zweiter öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", + "label": "Zweiter Admin-Schlüssel" + }, + "serialOutputEnabled": { + "description": "Serielle Konsole über die Stream-API", + "label": "Serielle Ausgabe aktiviert" + }, + "tertiaryAdminKey": { + "description": "Dritter öffentlicher Schlüssel, der berechtigt ist, administrative Nachrichten an diesen Knoten zu senden", + "label": "Dritter Admin-Schlüssel" + }, + "adminSettings": { + "description": "Administrator Einstellungen", + "label": "Administrator Einstellungen" + }, + "loggingSettings": { + "description": "Einstellungen für die Protokollierung", + "label": "Protokolleinstellungen" + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/dialog.json b/packages/web/public/i18n/locales/de-DE/dialog.json index 1c8e966d..3e42b005 100644 --- a/packages/web/public/i18n/locales/de-DE/dialog.json +++ b/packages/web/public/i18n/locales/de-DE/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "Diese Aktion wird den Nachrichtenverlauf löschen. Dies kann nicht rückgängig gemacht werden. Sind Sie sicher, dass Sie fortfahren möchten?", - "title": "Alle Nachrichten löschen" - }, - "deviceName": { - "description": "Das Gerät wird neu gestartet, sobald die Einstellung gespeichert ist.", - "longName": "Langer Name", - "shortName": "Kurzname", - "title": "Gerätename ändern" - }, - "import": { - "description": "Die aktuelle LoRa Einstellung wird überschrieben.", - "error": { - "invalidUrl": "Ungültige Meshtastic URL" - }, - "channelPrefix": "Kanal: ", - "channelSetUrl": "Kanalsammlung / QR-Code URL", - "channels": "Kanäle:", - "usePreset": "Voreinstellung verwenden?", - "title": "Kanalsammlung importieren" - }, - "locationResponse": { - "altitude": "Höhe: ", - "coordinates": "Koordinaten: ", - "title": "Standort: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Vorab verteilten Schlüssel (PSK) neu erstellen?", - "description": "Sind Sie sicher, dass Sie den vorab verteilten Schlüssel neu erstellen möchten?", - "regenerate": "Neu erstellen" - }, - "newDeviceDialog": { - "title": "Neues Gerät verbinden", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Seriell", - "useHttps": "HTTPS verwenden", - "connecting": "Wird verbunden...", - "connect": "Verbindung herstellen", - "connectionFailedAlert": { - "title": "Verbindung fehlgeschlagen", - "descriptionPrefix": "Verbindung zum Gerät fehlgeschlagen. ", - "httpsHint": "Wenn Sie HTTPS verwenden, müssen Sie möglicherweise zuerst ein selbstsigniertes Zertifikat akzeptieren. ", - "openLinkPrefix": "Öffnen Sie ", - "openLinkSuffix": "in einem neuen Tab", - "acceptTlsWarningSuffix": ", akzeptieren Sie alle TLS-Warnungen, wenn Sie dazu aufgefordert werden, dann versuchen Sie es erneut", - "learnMoreLink": "Mehr erfahren" - }, - "httpConnection": { - "label": "IP Adresse/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "Noch keine Geräte gekoppelt.", - "newDeviceButton": "Neues Gerät", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "Noch keine Geräte gekoppelt.", - "newDeviceButton": "Neues Gerät" - }, - "validation": { - "requiresWebBluetooth": "Dieser Verbindungstyp erfordert <0>Bluetooth im Browser. Bitte verwenden Sie einen unterstützten Browser, wie Chrome oder Edge.", - "requiresWebSerial": "Dieser Verbindungstyp erfordert <0>Serielle Schnittstelle im Browser. Bitte verwenden Sie einen unterstützten Browser, wie Chrome oder Edge.", - "requiresSecureContext": "Diese Anwendung erfordert einen <0>sicheren Kontext. Bitte verbinden Sie sich über HTTPS oder localhost.", - "additionallyRequiresSecureContext": "Zusätzlich erfordert es einen <0>sicheren Kontext. Bitte verbinden Sie sich über HTTPS oder localhost." - } - }, - "nodeDetails": { - "message": "Nachricht", - "requestPosition": "Standort anfordern", - "traceRoute": "Route verfolgen", - "airTxUtilization": "Auslastung Sendezeit", - "allRawMetrics": "Alle Rohdaten", - "batteryLevel": "Akkustand", - "channelUtilization": "Kanalauslastung", - "details": "Details:", - "deviceMetrics": "Gerätekennzahlen:", - "hardware": "Hardware: ", - "lastHeard": "Zuletzt gehört: ", - "nodeHexPrefix": "Knoten ID: !", - "nodeNumber": "Knotennummer: ", - "position": "Standort:", - "role": "Rolle: ", - "uptime": "Laufzeit: ", - "voltage": "Spannung", - "title": "Knotendetails für {{identifier}}", - "ignoreNode": "Knoten ignorieren", - "removeNode": "Knoten entfernen", - "unignoreNode": "Knoten akzeptieren" - }, - "pkiBackup": { - "loseKeysWarning": "Wenn Sie Ihre Schlüssel verlieren, müssen Sie Ihr Gerät zurücksetzen.", - "secureBackup": "Es ist wichtig, dass Sie Ihre öffentlichen und privaten Schlüssel sichern und diese sicher speichern!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Privater Schlüssel:", - "publicKey": "Öffentlicher Schlüssel:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Schlüssel sichern" - }, - "pkiBackupReminder": { - "description": "Wir empfehlen die regelmäßige Sicherung Ihrer Schlüsseldaten. Möchten Sie jetzt sicheren?", - "title": "Erinnerungen für Sicherungen", - "remindLaterPrefix": "Erinnerung in:", - "remindNever": "Nie erinnern", - "backupNow": "Jetzt sichern" - }, - "pkiRegenerate": { - "description": "Sind Sie sicher, dass Sie Schlüsselpaar neu erstellen möchten?", - "title": "Schlüsselpaar neu erstellen" - }, - "qr": { - "addChannels": "Kanäle hinzufügen", - "replaceChannels": "Kanäle ersetzen", - "description": "Die aktuelle LoRa Einstellung wird ebenfalls geteilt.", - "sharableUrl": "Teilbare URL", - "title": "QR Code Erzeugen" - }, - "rebootOta": { - "title": "Neustart planen", - "description": "Startet den verbundenen Knoten nach einer Verzögerung in den OTA (Over-the-Air) Modus.", - "enterDelay": "Verzögerung eingeben (Sek.)", - "scheduled": "Neustart wurde geplant" - }, - "reboot": { - "title": "Neustart planen", - "description": "Startet den verbundenen Knoten nach x Minuten neu." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "Dies entfernt den Knoten vom Gerät und fordert neue Schlüssel an.", - "keyMismatchReasonSuffix": ". Dies liegt daran, dass der aktuelle öffentliche Schlüssel des entfernten Knotens nicht mit dem zuvor gespeicherten Schlüssel für diesen Knoten übereinstimmt.", - "unableToSendDmPrefix": "Ihr Knoten kann keine Direktnachricht an folgenden Knoten senden: " - }, - "acceptNewKeys": "Neue Schlüssel akzeptieren", - "title": "Schlüsselfehler - {{identifier}}" - }, - "removeNode": { - "description": "Sind Sie sicher, dass Sie diesen Knoten entfernen möchten?", - "title": "Knoten entfernen?" - }, - "shutdown": { - "title": "Herunterfahren planen", - "description": "Schaltet den verbundenen Knoten nach x Minuten aus." - }, - "traceRoute": { - "routeToDestination": "Route zum Ziel:", - "routeBack": "Route zurück:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Ja, ich weiß, was ich tue!", - "conjunction": " und der Blog-Beitrag über ", - "postamble": " und verstehen die Auswirkungen einer Veränderung der Rolle.", - "preamble": "Ich habe die", - "choosingRightDeviceRole": "Wahl der richtigen Geräterolle", - "deviceRoleDocumentation": "Dokumentation der Geräterolle", - "title": "Bist Du sicher?" - }, - "managedMode": { - "confirmUnderstanding": "Ja, ich weiß, was ich tue!", - "title": "Bist Du sicher?", - "description": "Das Aktivieren des verwalteten Modus blockiert das Schreiben der Einstellungen in das Funkgerät durch alle Anwendungen (einschließlich der Webanwendung). Einmal aktiviert, können die Einstellungen nur durch administrative Nachrichten geändert werden. Diese Einstellung ist für die Fernverwaltung von abgesetzten Knoten nicht erforderlich." - } + "deleteMessages": { + "description": "Diese Aktion wird den Nachrichtenverlauf löschen. Dies kann nicht rückgängig gemacht werden. Sind Sie sicher, dass Sie fortfahren möchten?", + "title": "Alle Nachrichten löschen" + }, + "deviceName": { + "description": "Das Gerät wird neu gestartet, sobald die Einstellung gespeichert ist.", + "longName": "Langer Name", + "shortName": "Kurzname", + "title": "Gerätename ändern" + }, + "import": { + "description": "Die aktuelle LoRa Einstellung wird überschrieben.", + "error": { + "invalidUrl": "Ungültige Meshtastic URL" + }, + "channelPrefix": "Kanal: ", + "channelSetUrl": "Kanalsammlung / QR-Code URL", + "channels": "Kanäle:", + "usePreset": "Voreinstellung verwenden?", + "title": "Kanalsammlung importieren" + }, + "locationResponse": { + "altitude": "Höhe: ", + "coordinates": "Koordinaten: ", + "title": "Standort: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Vorab verteilten Schlüssel (PSK) neu erstellen?", + "description": "Sind Sie sicher, dass Sie den vorab verteilten Schlüssel neu erstellen möchten?", + "regenerate": "Neu erstellen" + }, + "newDeviceDialog": { + "title": "Neues Gerät verbinden", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Seriell", + "useHttps": "HTTPS verwenden", + "connecting": "Wird verbunden...", + "connect": "Verbindung herstellen", + "connectionFailedAlert": { + "title": "Verbindung fehlgeschlagen", + "descriptionPrefix": "Verbindung zum Gerät fehlgeschlagen. ", + "httpsHint": "Wenn Sie HTTPS verwenden, müssen Sie möglicherweise zuerst ein selbstsigniertes Zertifikat akzeptieren. ", + "openLinkPrefix": "Öffnen Sie ", + "openLinkSuffix": "in einem neuen Tab", + "acceptTlsWarningSuffix": ", akzeptieren Sie alle TLS-Warnungen, wenn Sie dazu aufgefordert werden, dann versuchen Sie es erneut", + "learnMoreLink": "Mehr erfahren" + }, + "httpConnection": { + "label": "IP Adresse/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "Noch keine Geräte gekoppelt.", + "newDeviceButton": "Neues Gerät", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "Noch keine Geräte gekoppelt.", + "newDeviceButton": "Neues Gerät" + }, + "validation": { + "requiresWebBluetooth": "Dieser Verbindungstyp erfordert <0>Bluetooth im Browser. Bitte verwenden Sie einen unterstützten Browser, wie Chrome oder Edge.", + "requiresWebSerial": "Dieser Verbindungstyp erfordert <0>Serielle Schnittstelle im Browser. Bitte verwenden Sie einen unterstützten Browser, wie Chrome oder Edge.", + "requiresSecureContext": "Diese Anwendung erfordert einen <0>sicheren Kontext. Bitte verbinden Sie sich über HTTPS oder localhost.", + "additionallyRequiresSecureContext": "Zusätzlich erfordert es einen <0>sicheren Kontext. Bitte verbinden Sie sich über HTTPS oder localhost." + } + }, + "nodeDetails": { + "message": "Nachricht", + "requestPosition": "Standort anfordern", + "traceRoute": "Route verfolgen", + "airTxUtilization": "Auslastung Sendezeit", + "allRawMetrics": "Alle Rohdaten", + "batteryLevel": "Akkustand", + "channelUtilization": "Kanalauslastung", + "details": "Details:", + "deviceMetrics": "Gerätekennzahlen:", + "hardware": "Hardware: ", + "lastHeard": "Zuletzt gehört: ", + "nodeHexPrefix": "Knoten ID: !", + "nodeNumber": "Knotennummer: ", + "position": "Standort:", + "role": "Rolle: ", + "uptime": "Laufzeit: ", + "voltage": "Spannung", + "title": "Knotendetails für {{identifier}}", + "ignoreNode": "Knoten ignorieren", + "removeNode": "Knoten entfernen", + "unignoreNode": "Knoten akzeptieren" + }, + "pkiBackup": { + "loseKeysWarning": "Wenn Sie Ihre Schlüssel verlieren, müssen Sie Ihr Gerät zurücksetzen.", + "secureBackup": "Es ist wichtig, dass Sie Ihre öffentlichen und privaten Schlüssel sichern und diese sicher speichern!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Privater Schlüssel:", + "publicKey": "Öffentlicher Schlüssel:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Schlüssel sichern" + }, + "pkiBackupReminder": { + "description": "Wir empfehlen die regelmäßige Sicherung Ihrer Schlüsseldaten. Möchten Sie jetzt sicheren?", + "title": "Erinnerungen für Sicherungen", + "remindLaterPrefix": "Erinnerung in:", + "remindNever": "Nie erinnern", + "backupNow": "Jetzt sichern" + }, + "pkiRegenerate": { + "description": "Sind Sie sicher, dass Sie Schlüsselpaar neu erstellen möchten?", + "title": "Schlüsselpaar neu erstellen" + }, + "qr": { + "addChannels": "Kanäle hinzufügen", + "replaceChannels": "Kanäle ersetzen", + "description": "Die aktuelle LoRa Einstellung wird ebenfalls geteilt.", + "sharableUrl": "Teilbare URL", + "title": "QR Code Erzeugen" + }, + "rebootOta": { + "title": "Neustart planen", + "description": "Startet den verbundenen Knoten nach einer Verzögerung in den OTA (Over-the-Air) Modus.", + "enterDelay": "Verzögerung eingeben (Sek.)", + "scheduled": "Neustart wurde geplant" + }, + "reboot": { + "title": "Neustart planen", + "description": "Startet den verbundenen Knoten nach x Minuten neu." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "Dies entfernt den Knoten vom Gerät und fordert neue Schlüssel an.", + "keyMismatchReasonSuffix": ". Dies liegt daran, dass der aktuelle öffentliche Schlüssel des entfernten Knotens nicht mit dem zuvor gespeicherten Schlüssel für diesen Knoten übereinstimmt.", + "unableToSendDmPrefix": "Ihr Knoten kann keine Direktnachricht an folgenden Knoten senden: " + }, + "acceptNewKeys": "Neue Schlüssel akzeptieren", + "title": "Schlüsselfehler - {{identifier}}" + }, + "removeNode": { + "description": "Sind Sie sicher, dass Sie diesen Knoten entfernen möchten?", + "title": "Knoten entfernen?" + }, + "shutdown": { + "title": "Herunterfahren planen", + "description": "Schaltet den verbundenen Knoten nach x Minuten aus." + }, + "traceRoute": { + "routeToDestination": "Route zum Ziel:", + "routeBack": "Route zurück:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Ja, ich weiß, was ich tue!", + "conjunction": " und der Blog-Beitrag über ", + "postamble": " und verstehen die Auswirkungen einer Veränderung der Rolle.", + "preamble": "Ich habe die", + "choosingRightDeviceRole": "Wahl der richtigen Geräterolle", + "deviceRoleDocumentation": "Dokumentation der Geräterolle", + "title": "Bist Du sicher?" + }, + "managedMode": { + "confirmUnderstanding": "Ja, ich weiß, was ich tue!", + "title": "Bist Du sicher?", + "description": "Das Aktivieren des verwalteten Modus blockiert das Schreiben der Einstellungen in das Funkgerät durch alle Anwendungen (einschließlich der Webanwendung). Einmal aktiviert, können die Einstellungen nur durch administrative Nachrichten geändert werden. Diese Einstellung ist für die Fernverwaltung von abgesetzten Knoten nicht erforderlich." + } } diff --git a/packages/web/public/i18n/locales/de-DE/messages.json b/packages/web/public/i18n/locales/de-DE/messages.json index 02f1435c..188071ba 100644 --- a/packages/web/public/i18n/locales/de-DE/messages.json +++ b/packages/web/public/i18n/locales/de-DE/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Nachrichten: {{chatName}}", - "placeholder": "Nachricht eingeben" - }, - "emptyState": { - "title": "Einen Chat auswählen", - "text": "Noch keine Nachrichten." - }, - "selectChatPrompt": { - "text": "Wählen Sie einen Kanal oder Knoten, um Nachrichten zu schreiben." - }, - "sendMessage": { - "placeholder": "Geben Sie hier Ihre Nachricht ein...", - "sendButton": "Senden" - }, - "actionsMenu": { - "addReactionLabel": "Reaktion hinzufügen", - "replyLabel": "Antworten" - }, - "deliveryStatus": { - "delivered": { - "label": "Nachricht zugestellt", - "displayText": "Nachricht zugestellt" - }, - "failed": { - "label": "Nachrichtenübermittlung fehlgeschlagen", - "displayText": "Zustellung fehlgeschlagen" - }, - "unknown": { - "label": "Nachrichtenstatus unbekannt", - "displayText": "Unbekannter Status" - }, - "waiting": { - "label": "Nachricht wird gesendet", - "displayText": "Warte auf Zustellung" - } - } + "page": { + "title": "Nachrichten: {{chatName}}", + "placeholder": "Nachricht eingeben" + }, + "emptyState": { + "title": "Einen Chat auswählen", + "text": "Noch keine Nachrichten." + }, + "selectChatPrompt": { + "text": "Wählen Sie einen Kanal oder Knoten, um Nachrichten zu schreiben." + }, + "sendMessage": { + "placeholder": "Geben Sie hier Ihre Nachricht ein...", + "sendButton": "Senden" + }, + "actionsMenu": { + "addReactionLabel": "Reaktion hinzufügen", + "replyLabel": "Antworten" + }, + "deliveryStatus": { + "delivered": { + "label": "Nachricht zugestellt", + "displayText": "Nachricht zugestellt" + }, + "failed": { + "label": "Nachrichtenübermittlung fehlgeschlagen", + "displayText": "Zustellung fehlgeschlagen" + }, + "unknown": { + "label": "Nachrichtenstatus unbekannt", + "displayText": "Unbekannter Status" + }, + "waiting": { + "label": "Nachricht wird gesendet", + "displayText": "Warte auf Zustellung" + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/moduleConfig.json b/packages/web/public/i18n/locales/de-DE/moduleConfig.json index 6a6e759a..cb4c4c53 100644 --- a/packages/web/public/i18n/locales/de-DE/moduleConfig.json +++ b/packages/web/public/i18n/locales/de-DE/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Umgebungslicht", - "tabAudio": "Audio", - "tabCannedMessage": "Vordefinierte Nachrichten", - "tabDetectionSensor": "Erkennungssensor", - "tabExternalNotification": "Externe Benachrichtigung", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Nachbarinformation", - "tabPaxcounter": "Pax Zähler", - "tabRangeTest": "Reichweitentest", - "tabSerial": "Seriell", - "tabStoreAndForward": "Speichern&Weiterleiten", - "tabTelemetry": "Telemetrie" - }, - "ambientLighting": { - "title": "Einstellung Umgebungsbeleuchtung", - "description": "Einstellungen für das Modul Umgebungsbeleuchtung", - "ledState": { - "label": "LED Status", - "description": "Setzt die LED auf ein oder aus" - }, - "current": { - "label": "Stromstärke", - "description": "Legt den Strom für den LED Ausgang fest. Standard ist 10" - }, - "red": { - "label": "Rot", - "description": "Legt den roten LED Wert fest. Bereich 0-255" - }, - "green": { - "label": "Grün", - "description": "Legt den grünen LED Wert fest. Bereich 0-255" - }, - "blue": { - "label": "Blau", - "description": "Legt den blauen LED Wert fest. Bereich 0-255" - } - }, - "audio": { - "title": "Audioeinstellungen", - "description": "Einstellungen für das Audiomodul", - "codec2Enabled": { - "label": "Codec 2 aktiviert", - "description": "Codec 2 Audiokodierung aktivieren" - }, - "pttPin": { - "label": "GPIO PTT", - "description": "Für PTT verwendeter GPIO Pin" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate zur Audiokodierung" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO Pin für i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO Pin für i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO Pin für i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO Pin für i2S SCK" - } - }, - "cannedMessage": { - "title": "Einstellungen für vordefinierte Nachrichten", - "description": "Einstellungen für das Modul vordefinierte Nachrichten", - "moduleEnabled": { - "label": "Modul aktiviert", - "description": "Vordefinierte Nachrichten aktivieren" - }, - "rotary1Enabled": { - "label": "Drehgeber #1 aktiviert", - "description": "Drehgeber aktivieren" - }, - "inputbrokerPinA": { - "label": "Drehgeber Pin A", - "description": "GPIO Pin Wert (1-39) für Drehgeber Pin A" - }, - "inputbrokerPinB": { - "label": "Drehgeber Pin B", - "description": "GPIO Pin Wert (1-39) für Drehgeber Pin B" - }, - "inputbrokerPinPress": { - "label": "Drehgeber Pin Taste", - "description": "GPIO Pin Wert (1-39) für Drehgeber Pin Taste" - }, - "inputbrokerEventCw": { - "label": "Ereignis im Uhrzeigersinn", - "description": "Eingabeereignis auswählen." - }, - "inputbrokerEventCcw": { - "label": "Ereignis gegen Uhrzeigersinn", - "description": "Eingabeereignis auswählen." - }, - "inputbrokerEventPress": { - "label": "Ereignis Tastendruck", - "description": "Eingabeereignis auswählen." - }, - "updown1Enabled": { - "label": "Geber Hoch/Runter aktiviert", - "description": "Aktiviere Geber Hoch/Runter" - }, - "allowInputSource": { - "label": "Eingabequelle zulassen", - "description": "Wählen Sie aus: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Sende Glocke", - "description": "Sendet ein Klingelzeichen (Glocke) mit jeder Nachricht" - } - }, - "detectionSensor": { - "title": "Sensoreinstellungen für Erkennung", - "description": "Einstellungen für das Erkennungssensormodul", - "enabled": { - "label": "Aktiviert", - "description": "Erkennungssensormodul aktivieren oder deaktivieren" - }, - "minimumBroadcastSecs": { - "label": "Minimale Übertragungszeit alle Sekunden", - "description": "Das Intervall in Sekunden, wie oft eine Nachricht an das Netz gesendet wird, wenn eine Statusänderung erkannt wurde" - }, - "stateBroadcastSecs": { - "label": "Statusübertragung alle Sekunden", - "description": "Das Intervall in Sekunden, wie oft eine Nachricht mit dem aktuellen Status an das Netz gesendet wird, unabhängig von Änderungen" - }, - "sendBell": { - "label": "Sende Glocke", - "description": "ASCII-Glocke mit Warnmeldung senden" - }, - "name": { - "label": "Anzeigename", - "description": "Formatierte Nachricht die an das Netz gesendet wird, maximal 20 Zeichen" - }, - "monitorPin": { - "label": "GPIO Pin überwachen", - "description": "Der GPIO Pin zur Überwachung von Statusänderungen" - }, - "detectionTriggerType": { - "label": "Auslösetyp der Erkennung", - "description": "Die Art des zu verwendenden Auslöseereignisses" - }, - "usePullup": { - "label": "Pullup verwenden", - "description": "Gibt an, ob der INPUT_PULLUP Modus für GPIO Pin verwendet wird oder nicht" - } - }, - "externalNotification": { - "title": "Einstellungen für externe Benachrichtigungen", - "description": "Einstellung für das Modul externe Benachrichtigung", - "enabled": { - "label": "Modul aktiviert", - "description": "Externe Benachrichtigung aktivieren" - }, - "outputMs": { - "label": "Ausgabe MS", - "description": "Ausgabe MS" - }, - "output": { - "label": "Ausgabe", - "description": "Ausgabe" - }, - "outputVibra": { - "label": "Ausgabe Vibration", - "description": "Ausgabe Vibration" - }, - "outputBuzzer": { - "label": "Ausgabe Summer", - "description": "Ausgabe Summer" - }, - "active": { - "label": "Aktiv", - "description": "Aktiv" - }, - "alertMessage": { - "label": "Warnmeldung", - "description": "Warnmeldung" - }, - "alertMessageVibra": { - "label": "Vibration bei Warnmeldung", - "description": "Vibration bei Warnmeldung" - }, - "alertMessageBuzzer": { - "label": "Summer bei Warnmeldung", - "description": "Summer bei Warnmeldung" - }, - "alertBell": { - "label": "Warnglocke", - "description": "Soll beim Empfang eines eingehenden Klingelzeichens (Glocke) eine Warnung ausgelöst werden?" - }, - "alertBellVibra": { - "label": "Vibration bei Klingelzeichen", - "description": "Vibration bei Klingelzeichen" - }, - "alertBellBuzzer": { - "label": "Summer bei Klingelzeichen", - "description": "Summer bei Klingelzeichen" - }, - "usePwm": { - "label": "PWM verwenden", - "description": "PWM verwenden" - }, - "nagTimeout": { - "label": "Nervige Verzögerung", - "description": "Nervige Verzögerung" - }, - "useI2sAsBuzzer": { - "label": "I2S GPIO Pin als Summer verwenden", - "description": "I2S GPIO Pin als Summerausgang definieren" - } - }, - "mqtt": { - "title": "MQTT Einstellungen", - "description": "Einstellungen für das MQTT Modul", - "enabled": { - "label": "Aktiviert", - "description": "MQTT aktivieren oder deaktivieren" - }, - "address": { - "label": "MQTT Server Adresse", - "description": "MQTT Serveradresse für Standard/benutzerdefinierte Server" - }, - "username": { - "label": "MQTT Benutzername", - "description": "MQTT Benutzername für Standard/benutzerdefinierte Server" - }, - "password": { - "label": "MQTT Passwort", - "description": "MQTT Passwort für Standard/benutzerdefinierte Server" - }, - "encryptionEnabled": { - "label": "Verschlüsselung aktiviert", - "description": "MQTT-Verschlüsselung aktivieren oder deaktivieren. Hinweis: Alle Nachrichten werden unverschlüsselt an den MQTT-Broker gesendet, wenn diese Option nicht aktiviert ist. Unabhängig von der eingestellten Kanalverschlüsselung. Einschließlich der Standortdaten." - }, - "jsonEnabled": { - "label": "JSON aktiviert", - "description": "Gibt an, ob JSON Nachrichten über MQTT gesendet oder empfangen werden sollen" - }, - "tlsEnabled": { - "label": "TLS aktiviert", - "description": "TLS aktivieren oder deaktivieren" - }, - "root": { - "label": "Hauptthema", - "description": "MQTT Hauptthema für Standard/Benutzerdefinierte Server" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy aktiviert", - "description": "Verwendet die Netzwerkverbindung zum Austausch von MQTT Nachrichten mit dem Client." - }, - "mapReportingEnabled": { - "label": "Kartenberichte aktiviert", - "description": "Ihr Knoten sendet in regelmäßigen Abständen eine unverschlüsselte Nachricht mit Kartenbericht an den konfigurierten MQTT-Server. Einschließlich ID, langen und kurzen Namen, ungefährer Standort, Hardwaremodell, Geräterolle, Firmware-Version, LoRa Region, Modem-Voreinstellung und Name des Primärkanal." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Veröffentlichungsintervall Kartenbericht (s)", - "description": "Intervall in Sekunden, um Kartenberichte zu veröffentlichen" - }, - "positionPrecision": { - "label": "Ungefährer Standort", - "description": "Der geteilte Standort mit einer Genauigkeit innerhalb dieser Entfernung", - "options": { - "metric_km23": "Innerhalb von 23 km", - "metric_km12": "Innerhalb von 12 km", - "metric_km5_8": "Innerhalb von 5,8 km", - "metric_km2_9": "Innerhalb von 2,9 km", - "metric_km1_5": "Innerhalb von 1,5 km", - "metric_m700": "Innerhalb von 700 m", - "metric_m350": "Innerhalb von 350 m", - "metric_m200": "Innerhalb von 200 m", - "metric_m90": "Innerhalb von 90 m", - "metric_m50": "Innerhalb von 50 m", - "imperial_mi15": "Innerhalb von 15 Meilen", - "imperial_mi7_3": "Innerhalb von 7,3 Meilen", - "imperial_mi3_6": "Innerhalb von 3,6 Meilen", - "imperial_mi1_8": "Innerhalb von 1,8 Meilen", - "imperial_mi0_9": "Innerhalb von 0,9 Meilen", - "imperial_mi0_5": "Innerhalb von 0,5 Meilen", - "imperial_mi0_2": "Innerhalb von 0,2 Meilen", - "imperial_ft600": "Innerhalb von 600 Fuß", - "imperial_ft300": "Innerhalb von 300 Fuß", - "imperial_ft150": "Innerhalb von 150 Fuß" - } - } - } - }, - "neighborInfo": { - "title": "Einstellung Nachbarinformation", - "description": "Einstellungen für das Modul Nachbarinformation", - "enabled": { - "label": "Aktiviert", - "description": "Nachbarinformation Modul aktivieren oder deaktivieren" - }, - "updateInterval": { - "label": "Aktualisierungsintervall", - "description": "Intervall in Sekunden, wie oft die Nachbarinformation an das Netz gesendet wird" - } - }, - "paxcounter": { - "title": "Einstellung für Pax Zähler", - "description": "Einstellungen für das Modul Pax Zähler", - "enabled": { - "label": "Modul aktiviert", - "description": "Aktiviere Pax Zähler" - }, - "paxcounterUpdateInterval": { - "label": "Aktualisierungsintervall (Sekunden)", - "description": "Wie lange soll zwischen dem Senden von Pax Zählernachrichten gewartet werden" - }, - "wifiThreshold": { - "label": "WLAN RSSI Grenzwert", - "description": "Bei welchem WLAN RSSI Grenzwert sollte der Zähler erhöht werden. Standardwert -80" - }, - "bleThreshold": { - "label": "BLE RSSI Grenzwert", - "description": "Bei welchem BLE RSSI Grenzwert sollte der Zähler erhöht werden. Standardwert -80" - } - }, - "rangeTest": { - "title": "Einstellung Reichweitentest", - "description": "Einstellungen für das Modul Reichweitentest", - "enabled": { - "label": "Modul aktiviert", - "description": "Reichweitentest aktivieren" - }, - "sender": { - "label": "Nachrichtenintervall", - "description": "Wie lange soll zwischen dem Senden von Testnachrichten gewartet werden" - }, - "save": { - "label": "CSV im internen Speicher abspeichern", - "description": "Nur für ESP32" - } - }, - "serial": { - "title": "Serielle Einstellungen", - "description": "Einstellungen für das serielle Modul", - "enabled": { - "label": "Modul aktiviert", - "description": "Serielle Ausgabe aktivieren" - }, - "echo": { - "label": "Echo", - "description": "Wenn aktiviert, werden alle Nachrichten, die Sie senden, an Ihr Gerät zurückgesendet" - }, - "rxd": { - "label": "GPIO Empfangen", - "description": "Setzen Sie den GPIO Pin, den Sie eingerichtet haben, als RXD Pin." - }, - "txd": { - "label": "GPIO Senden", - "description": "Setzen Sie den GPIO Pin, den Sie eingerichtet haben, als TXD Pin." - }, - "baud": { - "label": "Baudrate", - "description": "Serielle Baudrate" - }, - "timeout": { - "label": "Zeitlimit erreicht", - "description": "Wartezeit in Sekunden bis eine Nachricht als gesendet angenommen wird" - }, - "mode": { - "label": "Betriebsmodus", - "description": "Modus auswählen" - }, - "overrideConsoleSerialPort": { - "label": "Seriellen Port der Konsole überschreiben", - "description": "Wenn Sie einen seriellen Port an die Konsole angeschlossen haben, wird diese überschrieben." - } - }, - "storeForward": { - "title": "Speichern & Weiterleiten Einstellungen", - "description": "Einstellungen für das Modul Speichern & Weiterleiten", - "enabled": { - "label": "Modul aktiviert", - "description": "Speichern & Weiterleiten aktivieren" - }, - "heartbeat": { - "label": "Herzschlag aktiviert", - "description": "Herzschlag für Speichern & Weiterleiten aktivieren" - }, - "records": { - "label": "Anzahl Einträge", - "description": "Anzahl der zu speichernden Datensätze" - }, - "historyReturnMax": { - "label": "Verlauf Rückgabewert maximal", - "description": "Maximale Anzahl an zurückzugebenden Datensätzen" - }, - "historyReturnWindow": { - "label": "Zeitraum Rückgabewert", - "description": "Maximale Anzahl an zurückzugebenden Datensätzen" - } - }, - "telemetry": { - "title": "Telemetrieeinstellungen", - "description": "Einstellungen für das Telemetriemodul", - "deviceUpdateInterval": { - "label": "Gerätekennzahlen", - "description": "Aktualisierungsintervall für Gerätekennzahlen (Sekunden)" - }, - "environmentUpdateInterval": { - "label": "Aktualisierungsintervall für Umweltdaten (Sekunden)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Modul aktiviert", - "description": "Aktiviert die Telemetrie für Umweltdaten" - }, - "environmentScreenEnabled": { - "label": "OLED Anzeige aktivieren", - "description": "Zeige das Telemetriemodul auf der OLED Anzeige" - }, - "environmentDisplayFahrenheit": { - "label": "Temperatur in Fahrenheit", - "description": "Temperatur in Fahrenheit anzeigen" - }, - "airQualityEnabled": { - "label": "Luftqualität aktiviert", - "description": "Telemetrie für Luftqualität aktivieren" - }, - "airQualityInterval": { - "label": "Aktualisierungsintervall Luftqualität", - "description": "Wie oft werden Luftqualitätsdaten über das Netz gesendet" - }, - "powerMeasurementEnabled": { - "label": "Energiemessung aktiviert", - "description": "Aktiviere die Telemetrie für die Energiemessung" - }, - "powerUpdateInterval": { - "label": "Aktualisierungsintervall Energie", - "description": "Wie oft werden Energiedaten an das Netz gesendet" - }, - "powerScreenEnabled": { - "label": "Energieanzeige aktiviert", - "description": "Aktiviere die Anzeige für Energietelemetrie" - } - } + "page": { + "tabAmbientLighting": "Umgebungslicht", + "tabAudio": "Audio", + "tabCannedMessage": "Vordefinierte Nachrichten", + "tabDetectionSensor": "Erkennungssensor", + "tabExternalNotification": "Externe Benachrichtigung", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Nachbarinformation", + "tabPaxcounter": "Pax Zähler", + "tabRangeTest": "Reichweitentest", + "tabSerial": "Seriell", + "tabStoreAndForward": "Speichern&Weiterleiten", + "tabTelemetry": "Telemetrie" + }, + "ambientLighting": { + "title": "Einstellung Umgebungsbeleuchtung", + "description": "Einstellungen für das Modul Umgebungsbeleuchtung", + "ledState": { + "label": "LED Status", + "description": "Setzt die LED auf ein oder aus" + }, + "current": { + "label": "Stromstärke", + "description": "Legt den Strom für den LED Ausgang fest. Standard ist 10" + }, + "red": { + "label": "Rot", + "description": "Legt den roten LED Wert fest. Bereich 0-255" + }, + "green": { + "label": "Grün", + "description": "Legt den grünen LED Wert fest. Bereich 0-255" + }, + "blue": { + "label": "Blau", + "description": "Legt den blauen LED Wert fest. Bereich 0-255" + } + }, + "audio": { + "title": "Audioeinstellungen", + "description": "Einstellungen für das Audiomodul", + "codec2Enabled": { + "label": "Codec 2 aktiviert", + "description": "Codec 2 Audiokodierung aktivieren" + }, + "pttPin": { + "label": "GPIO PTT", + "description": "Für PTT verwendeter GPIO Pin" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate zur Audiokodierung" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO Pin für i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO Pin für i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO Pin für i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO Pin für i2S SCK" + } + }, + "cannedMessage": { + "title": "Einstellungen für vordefinierte Nachrichten", + "description": "Einstellungen für das Modul vordefinierte Nachrichten", + "moduleEnabled": { + "label": "Modul aktiviert", + "description": "Vordefinierte Nachrichten aktivieren" + }, + "rotary1Enabled": { + "label": "Drehgeber #1 aktiviert", + "description": "Drehgeber aktivieren" + }, + "inputbrokerPinA": { + "label": "Drehgeber Pin A", + "description": "GPIO Pin Wert (1-39) für Drehgeber Pin A" + }, + "inputbrokerPinB": { + "label": "Drehgeber Pin B", + "description": "GPIO Pin Wert (1-39) für Drehgeber Pin B" + }, + "inputbrokerPinPress": { + "label": "Drehgeber Pin Taste", + "description": "GPIO Pin Wert (1-39) für Drehgeber Pin Taste" + }, + "inputbrokerEventCw": { + "label": "Ereignis im Uhrzeigersinn", + "description": "Eingabeereignis auswählen." + }, + "inputbrokerEventCcw": { + "label": "Ereignis gegen Uhrzeigersinn", + "description": "Eingabeereignis auswählen." + }, + "inputbrokerEventPress": { + "label": "Ereignis Tastendruck", + "description": "Eingabeereignis auswählen." + }, + "updown1Enabled": { + "label": "Geber Hoch/Runter aktiviert", + "description": "Aktiviere Geber Hoch/Runter" + }, + "allowInputSource": { + "label": "Eingabequelle zulassen", + "description": "Wählen Sie aus: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Sende Glocke", + "description": "Sendet ein Klingelzeichen (Glocke) mit jeder Nachricht" + } + }, + "detectionSensor": { + "title": "Sensoreinstellungen für Erkennung", + "description": "Einstellungen für das Erkennungssensormodul", + "enabled": { + "label": "Aktiviert", + "description": "Erkennungssensormodul aktivieren oder deaktivieren" + }, + "minimumBroadcastSecs": { + "label": "Minimale Übertragungszeit alle Sekunden", + "description": "Das Intervall in Sekunden, wie oft eine Nachricht an das Netz gesendet wird, wenn eine Statusänderung erkannt wurde" + }, + "stateBroadcastSecs": { + "label": "Statusübertragung alle Sekunden", + "description": "Das Intervall in Sekunden, wie oft eine Nachricht mit dem aktuellen Status an das Netz gesendet wird, unabhängig von Änderungen" + }, + "sendBell": { + "label": "Sende Glocke", + "description": "ASCII-Glocke mit Warnmeldung senden" + }, + "name": { + "label": "Anzeigename", + "description": "Formatierte Nachricht die an das Netz gesendet wird, maximal 20 Zeichen" + }, + "monitorPin": { + "label": "GPIO Pin überwachen", + "description": "Der GPIO Pin zur Überwachung von Statusänderungen" + }, + "detectionTriggerType": { + "label": "Auslösetyp der Erkennung", + "description": "Die Art des zu verwendenden Auslöseereignisses" + }, + "usePullup": { + "label": "Pullup verwenden", + "description": "Gibt an, ob der INPUT_PULLUP Modus für GPIO Pin verwendet wird oder nicht" + } + }, + "externalNotification": { + "title": "Einstellungen für externe Benachrichtigungen", + "description": "Einstellung für das Modul externe Benachrichtigung", + "enabled": { + "label": "Modul aktiviert", + "description": "Externe Benachrichtigung aktivieren" + }, + "outputMs": { + "label": "Ausgabe MS", + "description": "Ausgabe MS" + }, + "output": { + "label": "Ausgabe", + "description": "Ausgabe" + }, + "outputVibra": { + "label": "Ausgabe Vibration", + "description": "Ausgabe Vibration" + }, + "outputBuzzer": { + "label": "Ausgabe Summer", + "description": "Ausgabe Summer" + }, + "active": { + "label": "Aktiv", + "description": "Aktiv" + }, + "alertMessage": { + "label": "Warnmeldung", + "description": "Warnmeldung" + }, + "alertMessageVibra": { + "label": "Vibration bei Warnmeldung", + "description": "Vibration bei Warnmeldung" + }, + "alertMessageBuzzer": { + "label": "Summer bei Warnmeldung", + "description": "Summer bei Warnmeldung" + }, + "alertBell": { + "label": "Warnglocke", + "description": "Soll beim Empfang eines eingehenden Klingelzeichens (Glocke) eine Warnung ausgelöst werden?" + }, + "alertBellVibra": { + "label": "Vibration bei Klingelzeichen", + "description": "Vibration bei Klingelzeichen" + }, + "alertBellBuzzer": { + "label": "Summer bei Klingelzeichen", + "description": "Summer bei Klingelzeichen" + }, + "usePwm": { + "label": "PWM verwenden", + "description": "PWM verwenden" + }, + "nagTimeout": { + "label": "Nervige Verzögerung", + "description": "Nervige Verzögerung" + }, + "useI2sAsBuzzer": { + "label": "I2S GPIO Pin als Summer verwenden", + "description": "I2S GPIO Pin als Summerausgang definieren" + } + }, + "mqtt": { + "title": "MQTT Einstellungen", + "description": "Einstellungen für das MQTT Modul", + "enabled": { + "label": "Aktiviert", + "description": "MQTT aktivieren oder deaktivieren" + }, + "address": { + "label": "MQTT Server Adresse", + "description": "MQTT Serveradresse für Standard/benutzerdefinierte Server" + }, + "username": { + "label": "MQTT Benutzername", + "description": "MQTT Benutzername für Standard/benutzerdefinierte Server" + }, + "password": { + "label": "MQTT Passwort", + "description": "MQTT Passwort für Standard/benutzerdefinierte Server" + }, + "encryptionEnabled": { + "label": "Verschlüsselung aktiviert", + "description": "MQTT-Verschlüsselung aktivieren oder deaktivieren. Hinweis: Alle Nachrichten werden unverschlüsselt an den MQTT-Broker gesendet, wenn diese Option nicht aktiviert ist. Unabhängig von der eingestellten Kanalverschlüsselung. Einschließlich der Standortdaten." + }, + "jsonEnabled": { + "label": "JSON aktiviert", + "description": "Gibt an, ob JSON Nachrichten über MQTT gesendet oder empfangen werden sollen" + }, + "tlsEnabled": { + "label": "TLS aktiviert", + "description": "TLS aktivieren oder deaktivieren" + }, + "root": { + "label": "Hauptthema", + "description": "MQTT Hauptthema für Standard/Benutzerdefinierte Server" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy aktiviert", + "description": "Verwendet die Netzwerkverbindung zum Austausch von MQTT Nachrichten mit dem Client." + }, + "mapReportingEnabled": { + "label": "Kartenberichte aktiviert", + "description": "Ihr Knoten sendet in regelmäßigen Abständen eine unverschlüsselte Nachricht mit Kartenbericht an den konfigurierten MQTT-Server. Einschließlich ID, langen und kurzen Namen, ungefährer Standort, Hardwaremodell, Geräterolle, Firmware-Version, LoRa Region, Modem-Voreinstellung und Name des Primärkanal." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Veröffentlichungsintervall Kartenbericht (s)", + "description": "Intervall in Sekunden, um Kartenberichte zu veröffentlichen" + }, + "positionPrecision": { + "label": "Ungefährer Standort", + "description": "Der geteilte Standort mit einer Genauigkeit innerhalb dieser Entfernung", + "options": { + "metric_km23": "Innerhalb von 23 km", + "metric_km12": "Innerhalb von 12 km", + "metric_km5_8": "Innerhalb von 5,8 km", + "metric_km2_9": "Innerhalb von 2,9 km", + "metric_km1_5": "Innerhalb von 1,5 km", + "metric_m700": "Innerhalb von 700 m", + "metric_m350": "Innerhalb von 350 m", + "metric_m200": "Innerhalb von 200 m", + "metric_m90": "Innerhalb von 90 m", + "metric_m50": "Innerhalb von 50 m", + "imperial_mi15": "Innerhalb von 15 Meilen", + "imperial_mi7_3": "Innerhalb von 7,3 Meilen", + "imperial_mi3_6": "Innerhalb von 3,6 Meilen", + "imperial_mi1_8": "Innerhalb von 1,8 Meilen", + "imperial_mi0_9": "Innerhalb von 0,9 Meilen", + "imperial_mi0_5": "Innerhalb von 0,5 Meilen", + "imperial_mi0_2": "Innerhalb von 0,2 Meilen", + "imperial_ft600": "Innerhalb von 600 Fuß", + "imperial_ft300": "Innerhalb von 300 Fuß", + "imperial_ft150": "Innerhalb von 150 Fuß" + } + } + } + }, + "neighborInfo": { + "title": "Einstellung Nachbarinformation", + "description": "Einstellungen für das Modul Nachbarinformation", + "enabled": { + "label": "Aktiviert", + "description": "Nachbarinformation Modul aktivieren oder deaktivieren" + }, + "updateInterval": { + "label": "Aktualisierungsintervall", + "description": "Intervall in Sekunden, wie oft die Nachbarinformation an das Netz gesendet wird" + } + }, + "paxcounter": { + "title": "Einstellung für Pax Zähler", + "description": "Einstellungen für das Modul Pax Zähler", + "enabled": { + "label": "Modul aktiviert", + "description": "Aktiviere Pax Zähler" + }, + "paxcounterUpdateInterval": { + "label": "Aktualisierungsintervall (Sekunden)", + "description": "Wie lange soll zwischen dem Senden von Pax Zählernachrichten gewartet werden" + }, + "wifiThreshold": { + "label": "WLAN RSSI Grenzwert", + "description": "Bei welchem WLAN RSSI Grenzwert sollte der Zähler erhöht werden. Standardwert -80" + }, + "bleThreshold": { + "label": "BLE RSSI Grenzwert", + "description": "Bei welchem BLE RSSI Grenzwert sollte der Zähler erhöht werden. Standardwert -80" + } + }, + "rangeTest": { + "title": "Einstellung Reichweitentest", + "description": "Einstellungen für das Modul Reichweitentest", + "enabled": { + "label": "Modul aktiviert", + "description": "Reichweitentest aktivieren" + }, + "sender": { + "label": "Nachrichtenintervall", + "description": "Wie lange soll zwischen dem Senden von Testnachrichten gewartet werden" + }, + "save": { + "label": "CSV im internen Speicher abspeichern", + "description": "Nur für ESP32" + } + }, + "serial": { + "title": "Serielle Einstellungen", + "description": "Einstellungen für das serielle Modul", + "enabled": { + "label": "Modul aktiviert", + "description": "Serielle Ausgabe aktivieren" + }, + "echo": { + "label": "Echo", + "description": "Wenn aktiviert, werden alle Nachrichten, die Sie senden, an Ihr Gerät zurückgesendet" + }, + "rxd": { + "label": "GPIO Empfangen", + "description": "Setzen Sie den GPIO Pin, den Sie eingerichtet haben, als RXD Pin." + }, + "txd": { + "label": "GPIO Senden", + "description": "Setzen Sie den GPIO Pin, den Sie eingerichtet haben, als TXD Pin." + }, + "baud": { + "label": "Baudrate", + "description": "Serielle Baudrate" + }, + "timeout": { + "label": "Zeitlimit erreicht", + "description": "Wartezeit in Sekunden bis eine Nachricht als gesendet angenommen wird" + }, + "mode": { + "label": "Betriebsmodus", + "description": "Modus auswählen" + }, + "overrideConsoleSerialPort": { + "label": "Seriellen Port der Konsole überschreiben", + "description": "Wenn Sie einen seriellen Port an die Konsole angeschlossen haben, wird diese überschrieben." + } + }, + "storeForward": { + "title": "Speichern & Weiterleiten Einstellungen", + "description": "Einstellungen für das Modul Speichern & Weiterleiten", + "enabled": { + "label": "Modul aktiviert", + "description": "Speichern & Weiterleiten aktivieren" + }, + "heartbeat": { + "label": "Herzschlag aktiviert", + "description": "Herzschlag für Speichern & Weiterleiten aktivieren" + }, + "records": { + "label": "Anzahl Einträge", + "description": "Anzahl der zu speichernden Datensätze" + }, + "historyReturnMax": { + "label": "Verlauf Rückgabewert maximal", + "description": "Maximale Anzahl an zurückzugebenden Datensätzen" + }, + "historyReturnWindow": { + "label": "Zeitraum Rückgabewert", + "description": "Maximale Anzahl an zurückzugebenden Datensätzen" + } + }, + "telemetry": { + "title": "Telemetrieeinstellungen", + "description": "Einstellungen für das Telemetriemodul", + "deviceUpdateInterval": { + "label": "Gerätekennzahlen", + "description": "Aktualisierungsintervall für Gerätekennzahlen (Sekunden)" + }, + "environmentUpdateInterval": { + "label": "Aktualisierungsintervall für Umweltdaten (Sekunden)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Modul aktiviert", + "description": "Aktiviert die Telemetrie für Umweltdaten" + }, + "environmentScreenEnabled": { + "label": "OLED Anzeige aktivieren", + "description": "Zeige das Telemetriemodul auf der OLED Anzeige" + }, + "environmentDisplayFahrenheit": { + "label": "Temperatur in Fahrenheit", + "description": "Temperatur in Fahrenheit anzeigen" + }, + "airQualityEnabled": { + "label": "Luftqualität aktiviert", + "description": "Telemetrie für Luftqualität aktivieren" + }, + "airQualityInterval": { + "label": "Aktualisierungsintervall Luftqualität", + "description": "Wie oft werden Luftqualitätsdaten über das Netz gesendet" + }, + "powerMeasurementEnabled": { + "label": "Energiemessung aktiviert", + "description": "Aktiviere die Telemetrie für die Energiemessung" + }, + "powerUpdateInterval": { + "label": "Aktualisierungsintervall Energie", + "description": "Wie oft werden Energiedaten an das Netz gesendet" + }, + "powerScreenEnabled": { + "label": "Energieanzeige aktiviert", + "description": "Aktiviere die Anzeige für Energietelemetrie" + } + } } diff --git a/packages/web/public/i18n/locales/de-DE/nodes.json b/packages/web/public/i18n/locales/de-DE/nodes.json index de1e038d..9da7f38e 100644 --- a/packages/web/public/i18n/locales/de-DE/nodes.json +++ b/packages/web/public/i18n/locales/de-DE/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Öffentlicher Schlüssel aktiviert" - }, - "noPublicKey": { - "label": "Kein öffentlicher Schlüssel" - }, - "directMessage": { - "label": "Direktnachricht {{shortName}}" - }, - "favorite": { - "label": "Favorit", - "tooltip": "Diesen Knoten zu Favoriten hinzufügen oder entfernen" - }, - "notFavorite": { - "label": "Kein Favorit" - }, - "error": { - "label": "Fehler", - "text": "Beim Abrufen der Knotendetails ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut." - }, - "status": { - "heard": "Gehört", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Höhe" - }, - "channelUtil": { - "label": "Kanal-Auslastung" - }, - "airtimeUtil": { - "label": "Sendezeit-Auslastung" - } - }, - "nodesTable": { - "headings": { - "longName": "Langer Name", - "connection": "Verbindung", - "lastHeard": "Zuletzt gehört", - "encryption": "Verschlüsselung", - "model": "Modell", - "macAddress": "MAC Adresse" - }, - "connectionStatus": { - "direct": "Direkt", - "away": "abwesend", - "unknown": "-", - "viaMqtt": ", über MQTT" - }, - "lastHeardStatus": { - "never": "Nie" - } - }, - "actions": { - "added": "Hinzugefügt", - "removed": "Entfernt", - "ignoreNode": "Knoten ignorieren", - "unignoreNode": "Knoten akzeptieren", - "requestPosition": "Standort anfordern" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Öffentlicher Schlüssel aktiviert" + }, + "noPublicKey": { + "label": "Kein öffentlicher Schlüssel" + }, + "directMessage": { + "label": "Direktnachricht {{shortName}}" + }, + "favorite": { + "label": "Favorit", + "tooltip": "Diesen Knoten zu Favoriten hinzufügen oder entfernen" + }, + "notFavorite": { + "label": "Kein Favorit" + }, + "error": { + "label": "Fehler", + "text": "Beim Abrufen der Knotendetails ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut." + }, + "status": { + "heard": "Gehört", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Höhe" + }, + "channelUtil": { + "label": "Kanal-Auslastung" + }, + "airtimeUtil": { + "label": "Sendezeit-Auslastung" + } + }, + "nodesTable": { + "headings": { + "longName": "Langer Name", + "connection": "Verbindung", + "lastHeard": "Zuletzt gehört", + "encryption": "Verschlüsselung", + "model": "Modell", + "macAddress": "MAC Adresse" + }, + "connectionStatus": { + "direct": "Direkt", + "away": "abwesend", + "unknown": "-", + "viaMqtt": ", über MQTT" + }, + "lastHeardStatus": { + "never": "Nie" + } + }, + "actions": { + "added": "Hinzugefügt", + "removed": "Entfernt", + "ignoreNode": "Knoten ignorieren", + "unignoreNode": "Knoten akzeptieren", + "requestPosition": "Standort anfordern" + } } diff --git a/packages/web/public/i18n/locales/de-DE/ui.json b/packages/web/public/i18n/locales/de-DE/ui.json index bc7c1853..aa216176 100644 --- a/packages/web/public/i18n/locales/de-DE/ui.json +++ b/packages/web/public/i18n/locales/de-DE/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Nachrichten", - "map": "Karte", - "config": "Einstellungen", - "radioConfig": "Funkgerätekonfiguration", - "moduleConfig": "Moduleinstellungen", - "channels": "Kanäle", - "nodes": "Knoten" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Seitenleiste öffnen", - "close": "Seitenleiste schließen" - } - }, - "deviceInfo": { - "volts": "{{voltage}} Volt", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Erstelldatum: {{date}}" - }, - "deviceName": { - "title": "Gerätename", - "changeName": "Gerätename ändern", - "placeholder": "Gerätename eingeben" - }, - "editDeviceName": "Gerätename bearbeiten" - } - }, - "batteryStatus": { - "charging": "{{level}}% Ladung", - "pluggedIn": "Wird geladen", - "title": "Batterie" - }, - "search": { - "nodes": "Knoten suchen...", - "channels": "Kanäle suchen...", - "commandPalette": "Befehle suchen..." - }, - "toast": { - "positionRequestSent": { - "title": "Standortanfrage gesendet." - }, - "requestingPosition": { - "title": "Standort wird angefordert, bitte warten..." - }, - "sendingTraceroute": { - "title": "Sende Traceroute, bitte warten..." - }, - "tracerouteSent": { - "title": "Traceroute gesendet." - }, - "savedChannel": { - "title": "Gespeicherter Kanal: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Der Chat verwendet PKI-Verschlüsselung." - }, - "pskEncryption": { - "title": "Chat verwendet PSK-Verschlüsselung." - } - }, - "configSaveError": { - "title": "Fehler beim Speichern von Einstellung", - "description": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten." - }, - "validationError": { - "title": "Einstellungsfehler vorhanden", - "description": "Bitte korrigieren Sie die Einstellungsfehler vor dem Speichern." - }, - "saveSuccess": { - "title": "Einstellungen speichern", - "description": "Die Einstellungsänderung {{case}} wurde gespeichert." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} Favoriten.", - "action": { - "added": "Hinzugefügt", - "removed": "Entfernt", - "to": "bis", - "from": "von" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} Ignorierliste", - "action": { - "added": "Hinzugefügt", - "removed": "Entfernt", - "to": "bis", - "from": "von" - } - } - }, - "notifications": { - "copied": { - "label": "Kopiert!" - }, - "copyToClipboard": { - "label": "In die Zwischenablage kopieren" - }, - "hidePassword": { - "label": "Passwort verbergen" - }, - "showPassword": { - "label": "Passwort anzeigen" - }, - "deliveryStatus": { - "delivered": "Zugestellt", - "failed": "Zustellung fehlgeschlagen", - "waiting": "Warte...", - "unknown": "Unbekannt" - } - }, - "general": { - "label": "Allgemein" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Messgrößen" - }, - "role": { - "label": "Rolle" - }, - "filter": { - "label": "Filter" - }, - "advanced": { - "label": "Fortgeschritten" - }, - "clearInput": { - "label": "Eingabe löschen" - }, - "resetFilters": { - "label": "Filter zurücksetzen" - }, - "nodeName": { - "label": "Knotenname/-nummer", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Sendezeit-Auslastung (%)" - }, - "batteryLevel": { - "label": "Akkustand (%)", - "labelText": "Akkustand (%): {{value}}" - }, - "batteryVoltage": { - "label": "Batteriespannung (V)", - "title": "Spannung" - }, - "channelUtilization": { - "label": "Kanalauslastung (%)" - }, - "hops": { - "direct": "Direkt", - "label": "Anzahl Hops", - "text": "Sprungweite: {{value}}" - }, - "lastHeard": { - "label": "Zuletzt gehört", - "labelText": "Zuletzt gehört: {{value}}", - "nowLabel": "Jetzt" - }, - "snr": { - "label": "SNR (dB)" - }, - "favorites": { - "label": "Favoriten" - }, - "hide": { - "label": "Ausblenden" - }, - "showOnly": { - "label": "Zeige nur" - }, - "viaMqtt": { - "label": "Über MQTT verbunden" - }, - "hopsUnknown": { - "label": "Unbekannte Sprungweite" - }, - "showUnheard": { - "label": "Nie gehört" - }, - "language": { - "label": "Sprache", - "changeLanguage": "Sprache ändern" - }, - "theme": { - "dark": "Dunkel", - "light": "Hell", - "system": "Automatisch", - "changeTheme": "Farbschema ändern" - }, - "errorPage": { - "title": "Das ist ein wenig peinlich...", - "description1": "Es tut uns wirklich leid, aber im Webclient ist ein Fehler aufgetreten, der es zum Absturz gebracht hat.
Das soll nicht passieren, und wir arbeiten hart daran, es zu beheben.", - "description2": "Der beste Weg, um zu verhindern, dass sich dies Ihnen oder irgendjemand anderem wiederholt, besteht darin, uns über dieses Problem zu berichten.", - "reportInstructions": "Bitte fügen Sie folgende Informationen in Ihren Bericht ein:", - "reportSteps": { - "step1": "Was haben Sie getan, als der Fehler aufgetreten ist", - "step2": "Was haben Sie erwartet", - "step3": "Was tatsächlich passiert ist", - "step4": "Sonstige relevante Informationen" - }, - "reportLink": "Sie können das Problem auf unserem <0>GitHub melden", - "dashboardLink": "Zurück zum <0>Dashboard", - "detailsSummary": "Fehlerdetails", - "errorMessageLabel": "Fehlermeldungen:", - "stackTraceLabel": "Stapelabzug:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic®️ ist eine eingetragene Marke der Meshtastic LLC. | <1>Rechtliche Informationen", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Nachrichten", + "map": "Karte", + "config": "Einstellungen", + "radioConfig": "Funkgerätekonfiguration", + "moduleConfig": "Moduleinstellungen", + "channels": "Kanäle", + "nodes": "Knoten" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Seitenleiste öffnen", + "close": "Seitenleiste schließen" + } + }, + "deviceInfo": { + "volts": "{{voltage}} Volt", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Erstelldatum: {{date}}" + }, + "deviceName": { + "title": "Gerätename", + "changeName": "Gerätename ändern", + "placeholder": "Gerätename eingeben" + }, + "editDeviceName": "Gerätename bearbeiten" + } + }, + "batteryStatus": { + "charging": "{{level}}% Ladung", + "pluggedIn": "Wird geladen", + "title": "Batterie" + }, + "search": { + "nodes": "Knoten suchen...", + "channels": "Kanäle suchen...", + "commandPalette": "Befehle suchen..." + }, + "toast": { + "positionRequestSent": { + "title": "Standortanfrage gesendet." + }, + "requestingPosition": { + "title": "Standort wird angefordert, bitte warten..." + }, + "sendingTraceroute": { + "title": "Sende Traceroute, bitte warten..." + }, + "tracerouteSent": { + "title": "Traceroute gesendet." + }, + "savedChannel": { + "title": "Gespeicherter Kanal: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Der Chat verwendet PKI-Verschlüsselung." + }, + "pskEncryption": { + "title": "Chat verwendet PSK-Verschlüsselung." + } + }, + "configSaveError": { + "title": "Fehler beim Speichern von Einstellung", + "description": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten." + }, + "validationError": { + "title": "Einstellungsfehler vorhanden", + "description": "Bitte korrigieren Sie die Einstellungsfehler vor dem Speichern." + }, + "saveSuccess": { + "title": "Einstellungen speichern", + "description": "Die Einstellungsänderung {{case}} wurde gespeichert." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} Favoriten.", + "action": { + "added": "Hinzugefügt", + "removed": "Entfernt", + "to": "bis", + "from": "von" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} Ignorierliste", + "action": { + "added": "Hinzugefügt", + "removed": "Entfernt", + "to": "bis", + "from": "von" + } + } + }, + "notifications": { + "copied": { + "label": "Kopiert!" + }, + "copyToClipboard": { + "label": "In die Zwischenablage kopieren" + }, + "hidePassword": { + "label": "Passwort verbergen" + }, + "showPassword": { + "label": "Passwort anzeigen" + }, + "deliveryStatus": { + "delivered": "Zugestellt", + "failed": "Zustellung fehlgeschlagen", + "waiting": "Warte...", + "unknown": "Unbekannt" + } + }, + "general": { + "label": "Allgemein" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Messgrößen" + }, + "role": { + "label": "Rolle" + }, + "filter": { + "label": "Filter" + }, + "advanced": { + "label": "Fortgeschritten" + }, + "clearInput": { + "label": "Eingabe löschen" + }, + "resetFilters": { + "label": "Filter zurücksetzen" + }, + "nodeName": { + "label": "Knotenname/-nummer", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Sendezeit-Auslastung (%)" + }, + "batteryLevel": { + "label": "Akkustand (%)", + "labelText": "Akkustand (%): {{value}}" + }, + "batteryVoltage": { + "label": "Batteriespannung (V)", + "title": "Spannung" + }, + "channelUtilization": { + "label": "Kanalauslastung (%)" + }, + "hops": { + "direct": "Direkt", + "label": "Anzahl Hops", + "text": "Sprungweite: {{value}}" + }, + "lastHeard": { + "label": "Zuletzt gehört", + "labelText": "Zuletzt gehört: {{value}}", + "nowLabel": "Jetzt" + }, + "snr": { + "label": "SNR (dB)" + }, + "favorites": { + "label": "Favoriten" + }, + "hide": { + "label": "Ausblenden" + }, + "showOnly": { + "label": "Zeige nur" + }, + "viaMqtt": { + "label": "Über MQTT verbunden" + }, + "hopsUnknown": { + "label": "Unbekannte Sprungweite" + }, + "showUnheard": { + "label": "Nie gehört" + }, + "language": { + "label": "Sprache", + "changeLanguage": "Sprache ändern" + }, + "theme": { + "dark": "Dunkel", + "light": "Hell", + "system": "Automatisch", + "changeTheme": "Farbschema ändern" + }, + "errorPage": { + "title": "Das ist ein wenig peinlich...", + "description1": "Es tut uns wirklich leid, aber im Webclient ist ein Fehler aufgetreten, der es zum Absturz gebracht hat.
Das soll nicht passieren, und wir arbeiten hart daran, es zu beheben.", + "description2": "Der beste Weg, um zu verhindern, dass sich dies Ihnen oder irgendjemand anderem wiederholt, besteht darin, uns über dieses Problem zu berichten.", + "reportInstructions": "Bitte fügen Sie folgende Informationen in Ihren Bericht ein:", + "reportSteps": { + "step1": "Was haben Sie getan, als der Fehler aufgetreten ist", + "step2": "Was haben Sie erwartet", + "step3": "Was tatsächlich passiert ist", + "step4": "Sonstige relevante Informationen" + }, + "reportLink": "Sie können das Problem auf unserem <0>GitHub melden", + "dashboardLink": "Zurück zum <0>Dashboard", + "detailsSummary": "Fehlerdetails", + "errorMessageLabel": "Fehlermeldungen:", + "stackTraceLabel": "Stapelabzug:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic®️ ist eine eingetragene Marke der Meshtastic LLC. | <1>Rechtliche Informationen", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/en/channels.json b/packages/web/public/i18n/locales/en/channels.json index 535b8e6b..95f64b16 100644 --- a/packages/web/public/i18n/locales/en/channels.json +++ b/packages/web/public/i18n/locales/en/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Channels", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Primary", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Channel Settings", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Role", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Name", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Channels", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Primary", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Channel Settings", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Role", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Name", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/en/common.json b/packages/web/public/i18n/locales/en/common.json index b9ba239e..8f40e7c8 100644 --- a/packages/web/public/i18n/locales/en/common.json +++ b/packages/web/public/i18n/locales/en/common.json @@ -1,112 +1,112 @@ { - "button": { - "apply": "Apply", - "backupKey": "Backup Key", - "cancel": "Cancel", - "clearMessages": "Clear Messages", - "close": "Close", - "confirm": "Confirm", - "delete": "Delete", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Message", - "now": "Now", - "ok": "OK", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Remove", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Reset", - "save": "Save", - "scanQr": "Scan QR Code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { "one": "Meter", "plural": "Meters", "suffix": "m" }, - "minute": { "one": "Minute", "plural": "Minutes" }, - "hour": { "one": "Hour", "plural": "Hours" }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { "one": "Second", "plural": "Seconds" }, - "day": { "one": "Day", "plural": "Days" }, - "month": { "one": "Month", "plural": "Months" }, - "year": { "one": "Year", "plural": "Years" }, - "snr": "SNR", - "volt": { "one": "Volt", "plural": "Volts", "suffix": "V" }, - "record": { "one": "Records", "plural": "Records" } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Apply", + "backupKey": "Backup Key", + "cancel": "Cancel", + "clearMessages": "Clear Messages", + "close": "Close", + "confirm": "Confirm", + "delete": "Delete", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Message", + "now": "Now", + "ok": "OK", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Remove", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Reset", + "save": "Save", + "scanQr": "Scan QR Code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { "one": "Meter", "plural": "Meters", "suffix": "m" }, + "minute": { "one": "Minute", "plural": "Minutes" }, + "hour": { "one": "Hour", "plural": "Hours" }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { "one": "Second", "plural": "Seconds" }, + "day": { "one": "Day", "plural": "Days" }, + "month": { "one": "Month", "plural": "Months" }, + "year": { "one": "Year", "plural": "Years" }, + "snr": "SNR", + "volt": { "one": "Volt", "plural": "Volts", "suffix": "V" }, + "record": { "one": "Records", "plural": "Records" } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/en/dashboard.json b/packages/web/public/i18n/locales/en/dashboard.json index 3a3cd869..8ec37528 100644 --- a/packages/web/public/i18n/locales/en/dashboard.json +++ b/packages/web/public/i18n/locales/en/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Serial", - "connectionType_network": "Network", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Serial", + "connectionType_network": "Network", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/en/deviceConfig.json b/packages/web/public/i18n/locales/en/deviceConfig.json index 193c5494..25319f53 100644 --- a/packages/web/public/i18n/locales/en/deviceConfig.json +++ b/packages/web/public/i18n/locales/en/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Device", - "tabDisplay": "Display", - "tabLora": "LoRa", - "tabNetwork": "Network", - "tabPosition": "Position", - "tabPower": "Power", - "tabSecurity": "Security" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Role" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Pairing mode" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bandwidth" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignore MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Override Duty Cycle", - "label": "Override Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Region" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP Config" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Timestamp", - "unset": "Unset", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Enable power saving mode" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Power Config" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Private Key" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Public Key" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Device", + "tabDisplay": "Display", + "tabLora": "LoRa", + "tabNetwork": "Network", + "tabPosition": "Position", + "tabPower": "Power", + "tabSecurity": "Security" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Role" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Pairing mode" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bandwidth" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignore MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Override Duty Cycle", + "label": "Override Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Region" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP Config" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Timestamp", + "unset": "Unset", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Enable power saving mode" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Power Config" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Private Key" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Public Key" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/en/dialog.json b/packages/web/public/i18n/locales/en/dialog.json index 56fb372b..b443e7e3 100644 --- a/packages/web/public/i18n/locales/en/dialog.json +++ b/packages/web/public/i18n/locales/en/dialog.json @@ -1,183 +1,183 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name", - "validation": { - "longNameMax": "Long name must not be more than 40 characters", - "shortNameMax": "Short name must not be more than 4 characters", - "longNameMin": "Long name must have at least 1 character", - "shortNameMin": "Short name must have at least 1 character" - } - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "title": "Location: {{identifier}}", - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "noCoordinates": "No Coordinates" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Serial", + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name", + "validation": { + "longNameMax": "Long name must not be more than 40 characters", + "shortNameMax": "Short name must not be more than 4 characters", + "longNameMin": "Long name must have at least 1 character", + "shortNameMin": "Short name must have at least 1 character" + } + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "title": "Location: {{identifier}}", + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "noCoordinates": "No Coordinates" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Serial", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "connectionFailed": "Connection failed", - "deviceDisconnected": "Device disconnected", - "unknownDevice": "Unknown Device", - "errorLoadingDevices": "Error loading devices", - "unknownErrorLoadingDevices": "Unknown error loading devices" - }, - "validation": { - "requiresFeatures": "This connection type requires <0>. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Message", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Voltage", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Are you sure?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Are you sure?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "connectionFailed": "Connection failed", + "deviceDisconnected": "Device disconnected", + "unknownDevice": "Unknown Device", + "errorLoadingDevices": "Error loading devices", + "unknownErrorLoadingDevices": "Unknown error loading devices" + }, + "validation": { + "requiresFeatures": "This connection type requires <0>. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Message", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Voltage", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Are you sure?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Are you sure?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/en/messages.json b/packages/web/public/i18n/locales/en/messages.json index 07d60e57..71ddb356 100644 --- a/packages/web/public/i18n/locales/en/messages.json +++ b/packages/web/public/i18n/locales/en/messages.json @@ -1,40 +1,40 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Send" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Send" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/en/moduleConfig.json b/packages/web/public/i18n/locales/en/moduleConfig.json index caacbe17..88066772 100644 --- a/packages/web/public/i18n/locales/en/moduleConfig.json +++ b/packages/web/public/i18n/locales/en/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambient Lighting", - "tabAudio": "Audio", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detection Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Range Test", - "tabSerial": "Serial", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetry" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Current", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Red", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Green", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Blue", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Timeout", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Number of records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambient Lighting", + "tabAudio": "Audio", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detection Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Range Test", + "tabSerial": "Serial", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetry" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Current", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Red", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Green", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Blue", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Timeout", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Number of records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/en/nodes.json b/packages/web/public/i18n/locales/en/nodes.json index b63e90c4..63290da3 100644 --- a/packages/web/public/i18n/locales/en/nodes.json +++ b/packages/web/public/i18n/locales/en/nodes.json @@ -1,64 +1,64 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favorite", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Error", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Direct", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favorite", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Error", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Direct", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/en/ui.json b/packages/web/public/i18n/locales/en/ui.json index daab3891..6b866503 100644 --- a/packages/web/public/i18n/locales/en/ui.json +++ b/packages/web/public/i18n/locales/en/ui.json @@ -1,214 +1,214 @@ { - "navigation": { - "title": "Navigation", - "messages": "Messages", - "map": "Map", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Channels", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Battery" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { "title": "Position request sent." }, - "requestingPosition": { "title": "Requesting position, please wait..." }, - "sendingTraceroute": { "title": "Sending Traceroute, please wait..." }, - "tracerouteSent": { "title": "Traceroute sent." }, - "savedChannel": { "title": "Saved Channel: {{channelName}}" }, - "messages": { - "pkiEncryption": { "title": "Chat is using PKI encryption." }, - "pskEncryption": { "title": "Chat is using PSK encryption." } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Hide password" - }, - "showPassword": { - "label": "Show password" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Role" - }, - "filter": { - "label": "Filter" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Voltage" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Direct", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Last heard", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Language", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Dark", - "light": "Light", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Messages", + "map": "Map", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Channels", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Battery" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { "title": "Position request sent." }, + "requestingPosition": { "title": "Requesting position, please wait..." }, + "sendingTraceroute": { "title": "Sending Traceroute, please wait..." }, + "tracerouteSent": { "title": "Traceroute sent." }, + "savedChannel": { "title": "Saved Channel: {{channelName}}" }, + "messages": { + "pkiEncryption": { "title": "Chat is using PKI encryption." }, + "pskEncryption": { "title": "Chat is using PSK encryption." } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Hide password" + }, + "showPassword": { + "label": "Show password" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Role" + }, + "filter": { + "label": "Filter" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Voltage" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Direct", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Last heard", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Language", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Dark", + "light": "Light", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/es-ES/channels.json b/packages/web/public/i18n/locales/es-ES/channels.json index 12e43673..028e1dc5 100644 --- a/packages/web/public/i18n/locales/es-ES/channels.json +++ b/packages/web/public/i18n/locales/es-ES/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Canales", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Primary", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Ajustes del canal", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Role", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Nombre", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Canales", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Primary", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Ajustes del canal", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Role", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Nombre", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/commandPalette.json b/packages/web/public/i18n/locales/es-ES/commandPalette.json index 12235d7a..87d75220 100644 --- a/packages/web/public/i18n/locales/es-ES/commandPalette.json +++ b/packages/web/public/i18n/locales/es-ES/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Mensajes", - "map": "Mapa", - "config": "Config", - "channels": "Canales", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Import", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Mensajes", + "map": "Mapa", + "config": "Config", + "channels": "Canales", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Import", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/common.json b/packages/web/public/i18n/locales/es-ES/common.json index c566496b..2a0f6b5f 100644 --- a/packages/web/public/i18n/locales/es-ES/common.json +++ b/packages/web/public/i18n/locales/es-ES/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Aplique", - "backupKey": "Backup Key", - "cancel": "Cancelar", - "clearMessages": "Clear Messages", - "close": "Cerrar", - "confirm": "Confirm", - "delete": "Eliminar", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Mensaje", - "now": "Now", - "ok": "Vale", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Quitar", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Reiniciar", - "save": "Guardar", - "scanQr": "Scan QR Code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Aplique", + "backupKey": "Backup Key", + "cancel": "Cancelar", + "clearMessages": "Clear Messages", + "close": "Cerrar", + "confirm": "Confirm", + "delete": "Eliminar", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Mensaje", + "now": "Now", + "ok": "Vale", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Quitar", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Reiniciar", + "save": "Guardar", + "scanQr": "Scan QR Code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/dashboard.json b/packages/web/public/i18n/locales/es-ES/dashboard.json index 9c70e841..c491b078 100644 --- a/packages/web/public/i18n/locales/es-ES/dashboard.json +++ b/packages/web/public/i18n/locales/es-ES/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Serial", - "connectionType_network": "Red", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Serial", + "connectionType_network": "Red", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/es-ES/deviceConfig.json b/packages/web/public/i18n/locales/es-ES/deviceConfig.json index dfa21d26..b066f39a 100644 --- a/packages/web/public/i18n/locales/es-ES/deviceConfig.json +++ b/packages/web/public/i18n/locales/es-ES/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Dispositivo", - "tabDisplay": "Pantalla", - "tabLora": "LoRa", - "tabNetwork": "Red", - "tabPosition": "Posición", - "tabPower": "Energía", - "tabSecurity": "Seguridad" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Role" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Modo de emparejamiento" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bandwidth" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignore MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Override Duty Cycle", - "label": "Override Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Región" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Configuración UDP" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Timestamp", - "unset": "Sin configurar", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Enable power saving mode" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Power Config" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Clave privada" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Clave Pública" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Dispositivo", + "tabDisplay": "Pantalla", + "tabLora": "LoRa", + "tabNetwork": "Red", + "tabPosition": "Posición", + "tabPower": "Energía", + "tabSecurity": "Seguridad" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Role" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Modo de emparejamiento" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bandwidth" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignore MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Override Duty Cycle", + "label": "Override Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Región" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Configuración UDP" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Timestamp", + "unset": "Sin configurar", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Enable power saving mode" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Power Config" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Clave privada" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Clave Pública" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/dialog.json b/packages/web/public/i18n/locales/es-ES/dialog.json index 149e317f..453852e3 100644 --- a/packages/web/public/i18n/locales/es-ES/dialog.json +++ b/packages/web/public/i18n/locales/es-ES/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Serial", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Mensaje", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Tensión", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "¿Estás seguro?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "¿Estás seguro?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Serial", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Mensaje", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Tensión", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "¿Estás seguro?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "¿Estás seguro?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/es-ES/messages.json b/packages/web/public/i18n/locales/es-ES/messages.json index fb7d1fcb..831ad48b 100644 --- a/packages/web/public/i18n/locales/es-ES/messages.json +++ b/packages/web/public/i18n/locales/es-ES/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Enviar" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Enviar" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/moduleConfig.json b/packages/web/public/i18n/locales/es-ES/moduleConfig.json index 2c192219..48dfe111 100644 --- a/packages/web/public/i18n/locales/es-ES/moduleConfig.json +++ b/packages/web/public/i18n/locales/es-ES/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambient Lighting", - "tabAudio": "Audio", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detection Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Range Test", - "tabSerial": "Serial", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetry" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Intensidad", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Red", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Green", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Blue", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Tiempo agotado", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Number of records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambient Lighting", + "tabAudio": "Audio", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detection Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Range Test", + "tabSerial": "Serial", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetry" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Intensidad", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Red", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Green", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Blue", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Tiempo agotado", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Number of records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/es-ES/nodes.json b/packages/web/public/i18n/locales/es-ES/nodes.json index 6d5dec63..81caebf1 100644 --- a/packages/web/public/i18n/locales/es-ES/nodes.json +++ b/packages/web/public/i18n/locales/es-ES/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favorito", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Error", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Directo", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favorito", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Error", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Directo", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/es-ES/ui.json b/packages/web/public/i18n/locales/es-ES/ui.json index 4d4bef7c..3eb3ea83 100644 --- a/packages/web/public/i18n/locales/es-ES/ui.json +++ b/packages/web/public/i18n/locales/es-ES/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Mensajes", - "map": "Mapa", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Canales", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Batería" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Hide password" - }, - "showPassword": { - "label": "Mostrar contraseña" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Role" - }, - "filter": { - "label": "Filtro" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Tensión" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Directo", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Última escucha", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Idioma", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Oscuro", - "light": "Claro", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Mensajes", + "map": "Mapa", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Canales", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Batería" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Hide password" + }, + "showPassword": { + "label": "Mostrar contraseña" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Role" + }, + "filter": { + "label": "Filtro" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Tensión" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Directo", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Última escucha", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Idioma", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Oscuro", + "light": "Claro", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/fi-FI/channels.json b/packages/web/public/i18n/locales/fi-FI/channels.json index f6d20a3e..50026bfe 100644 --- a/packages/web/public/i18n/locales/fi-FI/channels.json +++ b/packages/web/public/i18n/locales/fi-FI/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanavat", - "channelName": "Kanava: {{channelName}}", - "broadcastLabel": "Ensisijainen", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Syötä kelvollinen {{bits}} bittinen PSK." - }, - "settings": { - "label": "Kanava-asetukset", - "description": "Crypto, MQTT ja muut asetukset" - }, - "role": { - "label": "Rooli", - "description": "Laitteen telemetriatiedot lähetetään ENSISIJAISEN kanavan kautta. Vain yksi ENSISIJAINEN kanava sallitaan", - "options": { - "primary": "ENSISIJAISEN", - "disabled": "POIS KÄYTÖSTÄ", - "secondary": "TOISIJAINEN" - } - }, - "psk": { - "label": "Esijaettu avain", - "description": "Tuetut PSK-pituudet: 256-bit, 128-bit, 8-bit, tyhjät (0-bit)", - "generate": "Luo" - }, - "name": { - "label": "Nimi", - "description": "Kanavan yksilöllinen nimi (alle 12 merkkiä), jätä tyhjäksi käyttääksesi oletusta" - }, - "uplinkEnabled": { - "label": "Lähetys käytössä", - "description": "Lähetä viestejä paikallisesta verkosta MQTT-verkkoon" - }, - "downlinkEnabled": { - "label": "Vastaanotto käytössä", - "description": "Lähetä viestejä MQTT:stä paikalliseen verkkoon" - }, - "positionPrecision": { - "label": "Sijainti", - "description": "Kanavalle jaettavan sijainnin tarkkuus. Voi poistaa käytöstä.", - "options": { - "none": "Älä jaa sijaintia", - "precise": "Tarkka Sijainti", - "metric_km23": "23 kilometrin säteellä", - "metric_km12": "12 kilometrin säteellä", - "metric_km5_8": "5,8 kilometrin säteellä", - "metric_km2_9": "2,9 kilometrin säteellä", - "metric_km1_5": "1,5 kilometrin säteellä", - "metric_m700": "700 metrin säteellä", - "metric_m350": "350 metrin säteellä", - "metric_m200": "200 metrin säteellä", - "metric_m90": "90 metrin säteellä", - "metric_m50": "50 metrin säteellä", - "imperial_mi15": "15 mailin säteellä", - "imperial_mi7_3": "7,3 mailin säteellä", - "imperial_mi3_6": "3,6 mailin säteellä", - "imperial_mi1_8": "1,8 mailin säteellä", - "imperial_mi0_9": "0,9 mailin säteellä", - "imperial_mi0_5": "0,5 mailin säteellä", - "imperial_mi0_2": "0,2 mailin säteellä", - "imperial_ft600": "600 jalan säteellä", - "imperial_ft300": "300 jalan säteellä", - "imperial_ft150": "150 jalan säteellä" - } - } + "page": { + "sectionLabel": "Kanavat", + "channelName": "Kanava: {{channelName}}", + "broadcastLabel": "Ensisijainen", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Syötä kelvollinen {{bits}} bittinen PSK." + }, + "settings": { + "label": "Kanava-asetukset", + "description": "Crypto, MQTT ja muut asetukset" + }, + "role": { + "label": "Rooli", + "description": "Laitteen telemetriatiedot lähetetään ENSISIJAISEN kanavan kautta. Vain yksi ENSISIJAINEN kanava sallitaan", + "options": { + "primary": "ENSISIJAISEN", + "disabled": "POIS KÄYTÖSTÄ", + "secondary": "TOISIJAINEN" + } + }, + "psk": { + "label": "Esijaettu avain", + "description": "Tuetut PSK-pituudet: 256-bit, 128-bit, 8-bit, tyhjät (0-bit)", + "generate": "Luo" + }, + "name": { + "label": "Nimi", + "description": "Kanavan yksilöllinen nimi (alle 12 merkkiä), jätä tyhjäksi käyttääksesi oletusta" + }, + "uplinkEnabled": { + "label": "Lähetys käytössä", + "description": "Lähetä viestejä paikallisesta verkosta MQTT-verkkoon" + }, + "downlinkEnabled": { + "label": "Vastaanotto käytössä", + "description": "Lähetä viestejä MQTT:stä paikalliseen verkkoon" + }, + "positionPrecision": { + "label": "Sijainti", + "description": "Kanavalle jaettavan sijainnin tarkkuus. Voi poistaa käytöstä.", + "options": { + "none": "Älä jaa sijaintia", + "precise": "Tarkka Sijainti", + "metric_km23": "23 kilometrin säteellä", + "metric_km12": "12 kilometrin säteellä", + "metric_km5_8": "5,8 kilometrin säteellä", + "metric_km2_9": "2,9 kilometrin säteellä", + "metric_km1_5": "1,5 kilometrin säteellä", + "metric_m700": "700 metrin säteellä", + "metric_m350": "350 metrin säteellä", + "metric_m200": "200 metrin säteellä", + "metric_m90": "90 metrin säteellä", + "metric_m50": "50 metrin säteellä", + "imperial_mi15": "15 mailin säteellä", + "imperial_mi7_3": "7,3 mailin säteellä", + "imperial_mi3_6": "3,6 mailin säteellä", + "imperial_mi1_8": "1,8 mailin säteellä", + "imperial_mi0_9": "0,9 mailin säteellä", + "imperial_mi0_5": "0,5 mailin säteellä", + "imperial_mi0_2": "0,2 mailin säteellä", + "imperial_ft600": "600 jalan säteellä", + "imperial_ft300": "300 jalan säteellä", + "imperial_ft150": "150 jalan säteellä" + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/commandPalette.json b/packages/web/public/i18n/locales/fi-FI/commandPalette.json index 221821eb..4663e4fe 100644 --- a/packages/web/public/i18n/locales/fi-FI/commandPalette.json +++ b/packages/web/public/i18n/locales/fi-FI/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "Tuloksia ei löytynyt.", - "page": { - "title": "Komentovalikko" - }, - "pinGroup": { - "label": "Kiinnitä komentoryhmä" - }, - "unpinGroup": { - "label": "Irroita komentoryhmä" - }, - "goto": { - "label": "Siirry", - "command": { - "messages": "Viestit", - "map": "Kartta", - "config": "Asetukset", - "channels": "Kanavat", - "nodes": "Laitteet" - } - }, - "manage": { - "label": "Hallinnoi", - "command": { - "switchNode": "Vaihda laitetta", - "connectNewNode": "Yhdistä uusi laite" - } - }, - "contextual": { - "label": "Kontekstin mukainen", - "command": { - "qrCode": "QR-koodi", - "qrGenerator": "QR-koodigeneraattori", - "qrImport": "Tuo", - "scheduleShutdown": "Ajasta sammutus", - "scheduleReboot": "Ajasta uudelleenkäynnistys", - "rebootToOtaMode": "Uudelleenkäynnistä OTA-tilaan", - "resetNodeDb": "Nollaa laitteen DB-tietokanta", - "factoryResetDevice": "Palauta tehdasasetukset", - "factoryResetConfig": "Tehdasasetusten palautusasetukset" - } - }, - "debug": { - "label": "Vianetsintä", - "command": { - "reconfigure": "Määritä uudelleen", - "clearAllStoredMessages": "Tyhjennä kaikki tallennetut viesti" - } - } + "emptyState": "Tuloksia ei löytynyt.", + "page": { + "title": "Komentovalikko" + }, + "pinGroup": { + "label": "Kiinnitä komentoryhmä" + }, + "unpinGroup": { + "label": "Irroita komentoryhmä" + }, + "goto": { + "label": "Siirry", + "command": { + "messages": "Viestit", + "map": "Kartta", + "config": "Asetukset", + "channels": "Kanavat", + "nodes": "Laitteet" + } + }, + "manage": { + "label": "Hallinnoi", + "command": { + "switchNode": "Vaihda laitetta", + "connectNewNode": "Yhdistä uusi laite" + } + }, + "contextual": { + "label": "Kontekstin mukainen", + "command": { + "qrCode": "QR-koodi", + "qrGenerator": "QR-koodigeneraattori", + "qrImport": "Tuo", + "scheduleShutdown": "Ajasta sammutus", + "scheduleReboot": "Ajasta uudelleenkäynnistys", + "rebootToOtaMode": "Uudelleenkäynnistä OTA-tilaan", + "resetNodeDb": "Nollaa laitteen DB-tietokanta", + "factoryResetDevice": "Palauta tehdasasetukset", + "factoryResetConfig": "Tehdasasetusten palautusasetukset" + } + }, + "debug": { + "label": "Vianetsintä", + "command": { + "reconfigure": "Määritä uudelleen", + "clearAllStoredMessages": "Tyhjennä kaikki tallennetut viesti" + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/common.json b/packages/web/public/i18n/locales/fi-FI/common.json index 01ef9ed8..3a565dcf 100644 --- a/packages/web/public/i18n/locales/fi-FI/common.json +++ b/packages/web/public/i18n/locales/fi-FI/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Hyväksy", - "backupKey": "Varmuuskopioi avain", - "cancel": "Peruuta", - "clearMessages": "Tyhjennä viestit", - "close": "Sulje", - "confirm": "Vahvista", - "delete": "Poista", - "dismiss": "Hylkää", - "download": "Lataa", - "export": "Vie", - "generate": "Luo", - "regenerate": "Luo uudelleen", - "import": "Tuo", - "message": "Viesti", - "now": "Nyt", - "ok": "OK", - "print": "Tulosta", - "rebootOtaNow": "Käynnistä uudelleen OTA-tilaan nyt", - "remove": "Poista", - "requestNewKeys": "Pyydä uudet avaimet", - "requestPosition": "Pyydä sijaintia", - "reset": "Palauta", - "save": "Tallenna", - "scanQr": "Skannaa QR-koodi", - "traceRoute": "Reitinselvitys", - "submit": "Lähetä" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Ladataan...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hyppy", - "plural": "Hyppyä" - }, - "hopsAway": { - "one": "{{count}} hypyn päässä", - "plural": "{{count}} hypyn päässä", - "unknown": "Hyppyjen määrä tuntematon" - }, - "megahertz": "MHz", - "raw": "raakatieto", - "meter": { - "one": "Metri", - "plural": "Metriä", - "suffix": "m" - }, - "minute": { - "one": "Minuutti", - "plural": "Minuuttia" - }, - "hour": { - "one": "Tunti", - "plural": "Tuntia" - }, - "millisecond": { - "one": "Millisekunti", - "plural": "Millisekuntia", - "suffix": "ms" - }, - "second": { - "one": "Sekunti", - "plural": "Sekuntia" - }, - "day": { - "one": "Päivä", - "plural": "Päivää" - }, - "month": { - "one": "Kuukausi", - "plural": "Kuukautta" - }, - "year": { - "one": "Vuosi", - "plural": "Vuotta" - }, - "snr": "SNR", - "volt": { - "one": "Voltti", - "plural": "Voltit", - "suffix": "V" - }, - "record": { - "one": "Tiedot", - "plural": "Tiedot" - } - }, - "security": { - "0bit": "Tyhjä", - "8bit": "8-bittiä", - "128bit": "128-bittiä", - "256bit": "256 bittiä" - }, - "unknown": { - "longName": "Tuntematon", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "EI ASETETTU", - "fallbackName": "Meshtastic {{last4}}", - "node": "Laite", - "formValidation": { - "unsavedChanges": "Tallentamattomat muutokset", - "tooBig": { - "string": "Teksti on liian pitkä – sallittu enimmäispituus on {{maximum}} merkkiä.", - "number": "Arvo on liian suuri – sallittu enimmäisarvo on {{maximum}}.", - "bytes": "Liian suuri koko – sallittu enimmäismäärä on {{params.maximum}} tavua." - }, - "tooSmall": { - "string": "Teksti on liian lyhyt – vähimmäispituus on {{minimum}} merkkiä.", - "number": "Arvo on liian pieni – pienin sallittu arvo on {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Virheellinen muoto – odotettu muoto on IPv4-osoite.", - "key": "Virheellinen muoto – odotettu muoto on Base64-koodattu jaettu avain (PSK)." - }, - "invalidType": { - "number": "Virheellinen tyyppi – arvon tulee olla numero." - }, - "pskLength": { - "0bit": "Avainkentän on oltava tyhjä.", - "8bit": "Avaimen on oltava 8-bittinen jaettu avain (PSK).", - "128bit": "Avaimen on oltava 128-bittinen jaettu avain (PSK).", - "256bit": "Avaimen on oltava 256-bittinen jaettu avain (PSK)." - }, - "required": { - "generic": "Tämä kenttä on pakollinen.", - "managed": "Vähintään yksi hallinta-avain vaaditaan, jos laitetta hallitaan.", - "key": "Avain on pakollinen." - } - } + "button": { + "apply": "Hyväksy", + "backupKey": "Varmuuskopioi avain", + "cancel": "Peruuta", + "clearMessages": "Tyhjennä viestit", + "close": "Sulje", + "confirm": "Vahvista", + "delete": "Poista", + "dismiss": "Hylkää", + "download": "Lataa", + "export": "Vie", + "generate": "Luo", + "regenerate": "Luo uudelleen", + "import": "Tuo", + "message": "Viesti", + "now": "Nyt", + "ok": "OK", + "print": "Tulosta", + "rebootOtaNow": "Käynnistä uudelleen OTA-tilaan nyt", + "remove": "Poista", + "requestNewKeys": "Pyydä uudet avaimet", + "requestPosition": "Pyydä sijaintia", + "reset": "Palauta", + "save": "Tallenna", + "scanQr": "Skannaa QR-koodi", + "traceRoute": "Reitinselvitys", + "submit": "Lähetä" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Ladataan...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hyppy", + "plural": "Hyppyä" + }, + "hopsAway": { + "one": "{{count}} hypyn päässä", + "plural": "{{count}} hypyn päässä", + "unknown": "Hyppyjen määrä tuntematon" + }, + "megahertz": "MHz", + "raw": "raakatieto", + "meter": { + "one": "Metri", + "plural": "Metriä", + "suffix": "m" + }, + "minute": { + "one": "Minuutti", + "plural": "Minuuttia" + }, + "hour": { + "one": "Tunti", + "plural": "Tuntia" + }, + "millisecond": { + "one": "Millisekunti", + "plural": "Millisekuntia", + "suffix": "ms" + }, + "second": { + "one": "Sekunti", + "plural": "Sekuntia" + }, + "day": { + "one": "Päivä", + "plural": "Päivää" + }, + "month": { + "one": "Kuukausi", + "plural": "Kuukautta" + }, + "year": { + "one": "Vuosi", + "plural": "Vuotta" + }, + "snr": "SNR", + "volt": { + "one": "Voltti", + "plural": "Voltit", + "suffix": "V" + }, + "record": { + "one": "Tiedot", + "plural": "Tiedot" + } + }, + "security": { + "0bit": "Tyhjä", + "8bit": "8-bittiä", + "128bit": "128-bittiä", + "256bit": "256 bittiä" + }, + "unknown": { + "longName": "Tuntematon", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "EI ASETETTU", + "fallbackName": "Meshtastic {{last4}}", + "node": "Laite", + "formValidation": { + "unsavedChanges": "Tallentamattomat muutokset", + "tooBig": { + "string": "Teksti on liian pitkä – sallittu enimmäispituus on {{maximum}} merkkiä.", + "number": "Arvo on liian suuri – sallittu enimmäisarvo on {{maximum}}.", + "bytes": "Liian suuri koko – sallittu enimmäismäärä on {{params.maximum}} tavua." + }, + "tooSmall": { + "string": "Teksti on liian lyhyt – vähimmäispituus on {{minimum}} merkkiä.", + "number": "Arvo on liian pieni – pienin sallittu arvo on {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Virheellinen muoto – odotettu muoto on IPv4-osoite.", + "key": "Virheellinen muoto – odotettu muoto on Base64-koodattu jaettu avain (PSK)." + }, + "invalidType": { + "number": "Virheellinen tyyppi – arvon tulee olla numero." + }, + "pskLength": { + "0bit": "Avainkentän on oltava tyhjä.", + "8bit": "Avaimen on oltava 8-bittinen jaettu avain (PSK).", + "128bit": "Avaimen on oltava 128-bittinen jaettu avain (PSK).", + "256bit": "Avaimen on oltava 256-bittinen jaettu avain (PSK)." + }, + "required": { + "generic": "Tämä kenttä on pakollinen.", + "managed": "Vähintään yksi hallinta-avain vaaditaan, jos laitetta hallitaan.", + "key": "Avain on pakollinen." + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/dashboard.json b/packages/web/public/i18n/locales/fi-FI/dashboard.json index 43ce8a7f..99ba7db3 100644 --- a/packages/web/public/i18n/locales/fi-FI/dashboard.json +++ b/packages/web/public/i18n/locales/fi-FI/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Yhdistetyt laitteet", - "description": "Hallitse yhdistettyjä Meshtastic laitteitasi.", - "connectionType_ble": "BLE", - "connectionType_serial": "Sarjaliitäntä", - "connectionType_network": "Verkko", - "noDevicesTitle": "Ei laitteita yhdistettynä", - "noDevicesDescription": "Yhdistä uusi laite aloittaaksesi.", - "button_newConnection": "Uusi yhteys" - } + "dashboard": { + "title": "Yhdistetyt laitteet", + "description": "Hallitse yhdistettyjä Meshtastic laitteitasi.", + "connectionType_ble": "BLE", + "connectionType_serial": "Sarjaliitäntä", + "connectionType_network": "Verkko", + "noDevicesTitle": "Ei laitteita yhdistettynä", + "noDevicesDescription": "Yhdistä uusi laite aloittaaksesi.", + "button_newConnection": "Uusi yhteys" + } } diff --git a/packages/web/public/i18n/locales/fi-FI/deviceConfig.json b/packages/web/public/i18n/locales/fi-FI/deviceConfig.json index 8b0d01b8..cdbfde2f 100644 --- a/packages/web/public/i18n/locales/fi-FI/deviceConfig.json +++ b/packages/web/public/i18n/locales/fi-FI/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Asetukset", - "tabBluetooth": "Bluetooth", - "tabDevice": "Laite", - "tabDisplay": "Näyttö", - "tabLora": "LoRa", - "tabNetwork": "Verkko", - "tabPosition": "Sijainti", - "tabPower": "Virta", - "tabSecurity": "Turvallisuus" - }, - "sidebar": { - "label": "Moduulit" - }, - "device": { - "title": "Laitteen asetukset", - "description": "Laitteen asetukset", - "buttonPin": { - "description": "Painikkeen pinnin ohitus", - "label": "Painikkeen pinni" - }, - "buzzerPin": { - "description": "Summerin pinnin ohitus", - "label": "Summerin pinni" - }, - "disableTripleClick": { - "description": "Poista kolmoisklikkaus käytöstä", - "label": "Poista kolmoisklikkaus käytöstä" - }, - "doubleTapAsButtonPress": { - "description": "Käsittele kaksoisnapautus painikkeen painalluksena", - "label": "Kaksoisnapautus painikkeen painalluksena" - }, - "ledHeartbeatDisabled": { - "description": "Poista ledin vilkkuminen käytöstä", - "label": "Ledin vilkkuminen poistettu käytöstä" - }, - "nodeInfoBroadcastInterval": { - "description": "Kuinka usein laitteen tiedot lähetetään verkkoon", - "label": "Laitteen tietojen lähetyksen aikaväli" - }, - "posixTimezone": { - "description": "POSIX-aikavyöhykkeen merkkijono laitetta varten", - "label": "POSIX-aikavyöhyke" - }, - "rebroadcastMode": { - "description": "Kuinka uudelleenlähetyksiä käsitellään", - "label": "Uudelleenlähetyksen tila" - }, - "role": { - "description": "Mikä rooli laitteella on mesh-verkossa", - "label": "Rooli" - } - }, - "bluetooth": { - "title": "Bluetooth asetukset", - "description": "Bluetooth moduulin asetukset", - "note": "Huomautus: Jotkin laitteet (ESP32) eivät voi käyttää bluetoothia sekä WiFiä samanaikaisesti.", - "enabled": { - "description": "Ota Bluetooth käyttöön tai poista käytöstä", - "label": "Käytössä" - }, - "pairingMode": { - "description": "PIN-koodin valinnan käyttäytyminen.", - "label": "Paritustila" - }, - "pin": { - "description": "Bluetooth PIN-koodi, jota käytetään pariliitettäessä", - "label": "PIN" - } - }, - "display": { - "description": "Laitteen näytön asetukset", - "title": "Näyttöasetukset", - "headingBold": { - "description": "Lihavoi otsikkoteksti", - "label": "Lihavoitu otsikko" - }, - "carouselDelay": { - "description": "Kuinka nopeasti ikkunat kulkevat", - "label": "Karusellin Viive" - }, - "compassNorthTop": { - "description": "Kiinnitä pohjoinen kompassin yläreunaan", - "label": "Kompassin pohjoinen ylhäällä" - }, - "displayMode": { - "description": "Näytön asettelun vaihtoehdot", - "label": "Näyttötila" - }, - "displayUnits": { - "description": "Näytä metriset tai imperiaaliset yksiköt", - "label": "Näyttöyksiköt" - }, - "flipScreen": { - "description": "Käännä näyttöä 180 astetta", - "label": "Käännä näyttö" - }, - "gpsDisplayUnits": { - "description": "Koordinaattien näyttömuoto", - "label": "GPS näyttöyksiköt" - }, - "oledType": { - "description": "Laitteeseen liitetyn OLED-näytön tyyppi", - "label": "OLED-tyyppi" - }, - "screenTimeout": { - "description": "Sammuta näyttö tämän ajan jälkeen", - "label": "Näytön aikakatkaisu" - }, - "twelveHourClock": { - "description": "Käytä 12 tunnin kelloa", - "label": "12 tunnin kello" - }, - "wakeOnTapOrMotion": { - "description": "Herätä laite napauttamalla tai liikkeestä", - "label": "Herätä napauttamalla tai liikkeellä" - } - }, - "lora": { - "title": "Mesh-verkon asetukset", - "description": "LoRa-verkon asetukset", - "bandwidth": { - "description": "Kanavan kaistanleveys MHz", - "label": "Kaistanleveys" - }, - "boostedRxGain": { - "description": "RX tehostettu vahvistus", - "label": "RX tehostettu vahvistus" - }, - "codingRate": { - "description": "Koodausnopeuden nimittäjä", - "label": "Koodausnopeus" - }, - "frequencyOffset": { - "description": "Taajuuskorjaus kalibrointivirheiden korjaamiseksi", - "label": "Taajuuspoikkeama" - }, - "frequencySlot": { - "description": "LoRa-taajuuden kanavanumero", - "label": "Taajuuspaikka" - }, - "hopLimit": { - "description": "Maksimimäärä hyppyjä", - "label": "Hyppyraja" - }, - "ignoreMqtt": { - "description": "Älä välitä MQTT-viestejä mesh-verkon yli", - "label": "Ohita MQTT" - }, - "modemPreset": { - "description": "Käytössä olevan modeemin esiasetus", - "label": "Modeemin esiasetus" - }, - "okToMqtt": { - "description": "Kun asetetaan arvoksi true, tämä asetus tarkoittaa, että käyttäjä hyväksyy paketin lähettämisen MQTT:lle. Jos asetetaan arvoksi false, etälaitteita pyydetään olemaan välittämättä paketteja MQTT:lle", - "label": "MQTT päällä" - }, - "overrideDutyCycle": { - "description": "Ohita käyttöaste (Duty Cycle)", - "label": "Ohita käyttöaste (Duty Cycle)" - }, - "overrideFrequency": { - "description": "Käytä mukautettua taajuutta", - "label": "Mukautettu taajuus" - }, - "region": { - "description": "Asettaa alueen laitteelle", - "label": "Alue" - }, - "spreadingFactor": { - "description": "Ilmaisee symbolia kohden lähetettävien taajuuksien määrän", - "label": "Levennyskerroin" - }, - "transmitEnabled": { - "description": "LoRa-radion lähetyksen (TX) käyttöönotto tai poiskytkentä", - "label": "Lähetys käytössä" - }, - "transmitPower": { - "description": "Suurin lähetysteho", - "label": "Lähetysteho" - }, - "usePreset": { - "description": "Käytä ennalta määriteltyä modeemin esiasetusta", - "label": "Käytä esiasetusta" - }, - "meshSettings": { - "description": "LoRa-verkon asetukset", - "label": "Mesh-verkon asetukset" - }, - "waveformSettings": { - "description": "LoRa-aaltomuodon asetukset", - "label": "Signaalimuodon asetukset" - }, - "radioSettings": { - "label": "Radioasetukset", - "description": "LoRa-laitteen asetukset" - } - }, - "network": { - "title": "WiFi-asetukset", - "description": "WiFi-radion asetukset", - "note": "Huomautus: Jotkin laitteet (ESP32) eivät voi käyttää sekä Bluetoothia että WiFiä samanaikaisesti.", - "addressMode": { - "description": "Osoitteen määrityksen valinta", - "label": "Osoitetila" - }, - "dns": { - "description": "DNS-palvelin", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Ota käyttöön tai poista käytöstä ethernet-portti", - "label": "Käytössä" - }, - "gateway": { - "description": "Oletusyhdyskäytävä", - "label": "Yhdyskäytävä" - }, - "ip": { - "description": "IP-osoite", - "label": "IP" - }, - "psk": { - "description": "Verkon salasana", - "label": "PSK" - }, - "ssid": { - "description": "Verkon nimi", - "label": "SSID" - }, - "subnet": { - "description": "Aliverkon peite", - "label": "Aliverkko" - }, - "wifiEnabled": { - "description": "Ota WiFi käyttöön tai poista se käytöstä", - "label": "Käytössä" - }, - "meshViaUdp": { - "label": "Mesh UDP:n kautta" - }, - "ntpServer": { - "label": "NTP-palvelin" - }, - "rsyslogServer": { - "label": "Rsyslog-palvelin" - }, - "ethernetConfigSettings": { - "description": "Ethernet-portin asetukset", - "label": "Ethernet-asetukset" - }, - "ipConfigSettings": { - "description": "IP-osoitteen asetukset", - "label": "IP-osoitteen asetukset" - }, - "ntpConfigSettings": { - "description": "NTP-asetukset", - "label": "NTP-asetukset" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog määritykset", - "label": "Rsyslog määritykset" - }, - "udpConfigSettings": { - "description": "UDP-yhdeyden asetukset", - "label": "UDP-asetukset" - } - }, - "position": { - "title": "Sijainnin asetukset", - "description": "Sijaintimoduulin asetukset", - "broadcastInterval": { - "description": "Kuinka usein sijainti lähetetään mesh-verkon yli", - "label": "Lähetyksen aikaväli" - }, - "enablePin": { - "description": "GPS-moduulin käyttöönottopinnin korvaus", - "label": "Ota pinni käytöön" - }, - "fixedPosition": { - "description": "Älä raportoi GPS-sijaintia, vaan käytä manuaalisesti määritettyä sijaintia", - "label": "Kiinteä sijainti" - }, - "gpsMode": { - "description": "Määritä, onko laitteen GPS käytössä, pois päältä vai puuttuuko se kokonaan", - "label": "GSP-tila" - }, - "gpsUpdateInterval": { - "description": "Kuinka usein GPS-paikannus suoritetaan", - "label": "GPS-päivitysväli" - }, - "positionFlags": { - "description": "Valinnaiset kentät, jotka voidaan sisällyttää sijaintiviesteihin. Mitä enemmän kenttiä valitaan, sitä suurempi viesti on, mikä johtaa pidempään lähetysaikaan ja suurempaan pakettihäviöriskiin.", - "label": "Sijaintimerkinnät" - }, - "receivePin": { - "description": "GPS-moduulin käyttöönottopinnin korvaus", - "label": "Vastaanoton pinni" - }, - "smartPositionEnabled": { - "description": "Lähetä sijainti vain, kun sijainnissa on tapahtunut merkittävä muutos", - "label": "Ota älykäs sijainti käyttöön" - }, - "smartPositionMinDistance": { - "description": "Vähimmäisetäisyys (metreinä), joka on kuljettava ennen sijaintipäivityksen lähettämistä", - "label": "Älykkään sijainnin minimietäisyys" - }, - "smartPositionMinInterval": { - "description": "Lyhin aikaväli (sekunteina), joka on kuluttava ennen sijaintipäivityksen lähettämistä", - "label": "Älykkään sijainnin vähimmäisetäisyys" - }, - "transmitPin": { - "description": "GPS-moduulin käyttöönottopinnin korvaus", - "label": "Lähetyksen pinni" - }, - "intervalsSettings": { - "description": "Kuinka usein sijaintipäivitykset lähetetään", - "label": "Aikaväli" - }, - "flags": { - "placeholder": "Valitse sijaintiasetukset...", - "altitude": "Korkeus", - "altitudeGeoidalSeparation": "Korkeuden geoidinen erotus", - "altitudeMsl": "Korkeus on mitattu merenpinnan tasosta", - "dop": "Tarkkuuden heikkenemä (DOP), oletuksena käytetään PDOP-arvoa", - "hdopVdop": "Jos DOP on asetettu, käytä HDOP- ja VDOP-arvoja PDOP:n sijaan", - "numSatellites": "Satelliittien määrä", - "sequenceNumber": "Sekvenssinumero", - "timestamp": "Aikaleima", - "unset": "Ei yhdistetty", - "vehicleHeading": "Ajoneuvon suunta", - "vehicleSpeed": "Ajoneuvon nopeus" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Käytetään akun jännitteen lukeman säätämiseen", - "label": "Korvaava AD-muuntimen kerroin" - }, - "ina219Address": { - "description": "Akkunäytön INA219 osoite", - "label": "INA219 Osoite" - }, - "lightSleepDuration": { - "description": "Kuinka kauan laite on kevyessä lepotilassa", - "label": "Kevyen lepotilan kesto" - }, - "minimumWakeTime": { - "description": "Vähimmäisaika, jonka laite pysyy hereillä paketin vastaanoton jälkeen", - "label": "Minimi heräämisaika" - }, - "noConnectionBluetoothDisabled": { - "description": "Jos laite ei saa Bluetooth-yhteyttä, BLE-radio poistetaan käytöstä tämän ajan kuluttua", - "label": "Ei yhteyttä. Bluetooth on pois käytöstä" - }, - "powerSavingEnabled": { - "description": "Valitse, jos laite saa virtaa matalavirtalähteestä (esim. aurinkopaneeli), jolloin virrankulutusta minimoidaan mahdollisimman paljon.", - "label": "Ota virransäästötila käyttöön" - }, - "shutdownOnBatteryDelay": { - "description": "Sammuta laite automaattisesti tämän ajan kuluttua akkukäytöllä, 0 tarkoittaa toistaiseksi päällä", - "label": "Viive laitteen sammuttamisessa akkukäytöllä" - }, - "superDeepSleepDuration": { - "description": "Kuinka pitkään laite on supersyvässä lepotilassa", - "label": "Supersyvän lepotilan kesto" - }, - "powerConfigSettings": { - "description": "Virtamoduulin asetukset", - "label": "Virran asetukset" - }, - "sleepSettings": { - "description": "Virtamoduulin lepotila-asetukset", - "label": "Lepotilan asetukset" - } - }, - "security": { - "description": "Turvallisuuskokoonpanon asetukset", - "title": "Turvallisuusasetukset", - "button_backupKey": "Varmuuskopioi avain", - "adminChannelEnabled": { - "description": "Salli saapuva laitteen ohjaus suojaamattoman vanhan admin-kanavan kautta", - "label": "Salli vanha admin ylläpitäjä" - }, - "enableDebugLogApi": { - "description": "Lähetä reaaliaikainen debug-loki sarjaportin kautta, katso ja vie laitteen lokitiedostot, joista sijaintitiedot on poistettu, Bluetoothin kautta", - "label": "Ota käyttöön virheenkorjauslokin API-rajapinta" - }, - "managed": { - "description": "Jos tämä on käytössä, laitteen asetuksia voi muuttaa vain etäadmin-laitteen hallintaviestien kautta. Älä ota tätä käyttöön, ellei vähintään yhtä sopivaa etäadmin-laitetta ole määritetty ja julkinen avain ei ole tallennettu johonkin yllä olevista kentistä.", - "label": "Hallinnoitu" - }, - "privateKey": { - "description": "Käytetään jaetun avaimen luomiseen etälaitteen kanssa", - "label": "Yksityinen avain" - }, - "publicKey": { - "description": "Lähetetään muille mesh-verkon laitteille, jotta ne voivat laskea jaetun salaisen avaimen", - "label": "Julkinen avain" - }, - "primaryAdminKey": { - "description": "Ensisijainen julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", - "label": "Ensisijainen järjestelmänvalvojan avain" - }, - "secondaryAdminKey": { - "description": "Toissijainen julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", - "label": "Toissijainen järjestelmänvalvojan avain" - }, - "serialOutputEnabled": { - "description": "Sarjakonsoli Stream API:n yli", - "label": "Sarjaulostulo Käytössä" - }, - "tertiaryAdminKey": { - "description": "Kolmas julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", - "label": "Kolmas järjestelmänvalvojan hallinta-avain" - }, - "adminSettings": { - "description": "Järjestelmänvalvojan asetukset", - "label": "Ylläpitäjän asetukset" - }, - "loggingSettings": { - "description": "Kirjautumisen asetukset", - "label": "Kirjautumisen asetukset" - } - } + "page": { + "title": "Asetukset", + "tabBluetooth": "Bluetooth", + "tabDevice": "Laite", + "tabDisplay": "Näyttö", + "tabLora": "LoRa", + "tabNetwork": "Verkko", + "tabPosition": "Sijainti", + "tabPower": "Virta", + "tabSecurity": "Turvallisuus" + }, + "sidebar": { + "label": "Moduulit" + }, + "device": { + "title": "Laitteen asetukset", + "description": "Laitteen asetukset", + "buttonPin": { + "description": "Painikkeen pinnin ohitus", + "label": "Painikkeen pinni" + }, + "buzzerPin": { + "description": "Summerin pinnin ohitus", + "label": "Summerin pinni" + }, + "disableTripleClick": { + "description": "Poista kolmoisklikkaus käytöstä", + "label": "Poista kolmoisklikkaus käytöstä" + }, + "doubleTapAsButtonPress": { + "description": "Käsittele kaksoisnapautus painikkeen painalluksena", + "label": "Kaksoisnapautus painikkeen painalluksena" + }, + "ledHeartbeatDisabled": { + "description": "Poista ledin vilkkuminen käytöstä", + "label": "Ledin vilkkuminen poistettu käytöstä" + }, + "nodeInfoBroadcastInterval": { + "description": "Kuinka usein laitteen tiedot lähetetään verkkoon", + "label": "Laitteen tietojen lähetyksen aikaväli" + }, + "posixTimezone": { + "description": "POSIX-aikavyöhykkeen merkkijono laitetta varten", + "label": "POSIX-aikavyöhyke" + }, + "rebroadcastMode": { + "description": "Kuinka uudelleenlähetyksiä käsitellään", + "label": "Uudelleenlähetyksen tila" + }, + "role": { + "description": "Mikä rooli laitteella on mesh-verkossa", + "label": "Rooli" + } + }, + "bluetooth": { + "title": "Bluetooth asetukset", + "description": "Bluetooth moduulin asetukset", + "note": "Huomautus: Jotkin laitteet (ESP32) eivät voi käyttää bluetoothia sekä WiFiä samanaikaisesti.", + "enabled": { + "description": "Ota Bluetooth käyttöön tai poista käytöstä", + "label": "Käytössä" + }, + "pairingMode": { + "description": "PIN-koodin valinnan käyttäytyminen.", + "label": "Paritustila" + }, + "pin": { + "description": "Bluetooth PIN-koodi, jota käytetään pariliitettäessä", + "label": "PIN" + } + }, + "display": { + "description": "Laitteen näytön asetukset", + "title": "Näyttöasetukset", + "headingBold": { + "description": "Lihavoi otsikkoteksti", + "label": "Lihavoitu otsikko" + }, + "carouselDelay": { + "description": "Kuinka nopeasti ikkunat kulkevat", + "label": "Karusellin Viive" + }, + "compassNorthTop": { + "description": "Kiinnitä pohjoinen kompassin yläreunaan", + "label": "Kompassin pohjoinen ylhäällä" + }, + "displayMode": { + "description": "Näytön asettelun vaihtoehdot", + "label": "Näyttötila" + }, + "displayUnits": { + "description": "Näytä metriset tai imperiaaliset yksiköt", + "label": "Näyttöyksiköt" + }, + "flipScreen": { + "description": "Käännä näyttöä 180 astetta", + "label": "Käännä näyttö" + }, + "gpsDisplayUnits": { + "description": "Koordinaattien näyttömuoto", + "label": "GPS näyttöyksiköt" + }, + "oledType": { + "description": "Laitteeseen liitetyn OLED-näytön tyyppi", + "label": "OLED-tyyppi" + }, + "screenTimeout": { + "description": "Sammuta näyttö tämän ajan jälkeen", + "label": "Näytön aikakatkaisu" + }, + "twelveHourClock": { + "description": "Käytä 12 tunnin kelloa", + "label": "12 tunnin kello" + }, + "wakeOnTapOrMotion": { + "description": "Herätä laite napauttamalla tai liikkeestä", + "label": "Herätä napauttamalla tai liikkeellä" + } + }, + "lora": { + "title": "Mesh-verkon asetukset", + "description": "LoRa-verkon asetukset", + "bandwidth": { + "description": "Kanavan kaistanleveys MHz", + "label": "Kaistanleveys" + }, + "boostedRxGain": { + "description": "RX tehostettu vahvistus", + "label": "RX tehostettu vahvistus" + }, + "codingRate": { + "description": "Koodausnopeuden nimittäjä", + "label": "Koodausnopeus" + }, + "frequencyOffset": { + "description": "Taajuuskorjaus kalibrointivirheiden korjaamiseksi", + "label": "Taajuuspoikkeama" + }, + "frequencySlot": { + "description": "LoRa-taajuuden kanavanumero", + "label": "Taajuuspaikka" + }, + "hopLimit": { + "description": "Maksimimäärä hyppyjä", + "label": "Hyppyraja" + }, + "ignoreMqtt": { + "description": "Älä välitä MQTT-viestejä mesh-verkon yli", + "label": "Ohita MQTT" + }, + "modemPreset": { + "description": "Käytössä olevan modeemin esiasetus", + "label": "Modeemin esiasetus" + }, + "okToMqtt": { + "description": "Kun asetetaan arvoksi true, tämä asetus tarkoittaa, että käyttäjä hyväksyy paketin lähettämisen MQTT:lle. Jos asetetaan arvoksi false, etälaitteita pyydetään olemaan välittämättä paketteja MQTT:lle", + "label": "MQTT päällä" + }, + "overrideDutyCycle": { + "description": "Ohita käyttöaste (Duty Cycle)", + "label": "Ohita käyttöaste (Duty Cycle)" + }, + "overrideFrequency": { + "description": "Käytä mukautettua taajuutta", + "label": "Mukautettu taajuus" + }, + "region": { + "description": "Asettaa alueen laitteelle", + "label": "Alue" + }, + "spreadingFactor": { + "description": "Ilmaisee symbolia kohden lähetettävien taajuuksien määrän", + "label": "Levennyskerroin" + }, + "transmitEnabled": { + "description": "LoRa-radion lähetyksen (TX) käyttöönotto tai poiskytkentä", + "label": "Lähetys käytössä" + }, + "transmitPower": { + "description": "Suurin lähetysteho", + "label": "Lähetysteho" + }, + "usePreset": { + "description": "Käytä ennalta määriteltyä modeemin esiasetusta", + "label": "Käytä esiasetusta" + }, + "meshSettings": { + "description": "LoRa-verkon asetukset", + "label": "Mesh-verkon asetukset" + }, + "waveformSettings": { + "description": "LoRa-aaltomuodon asetukset", + "label": "Signaalimuodon asetukset" + }, + "radioSettings": { + "label": "Radioasetukset", + "description": "LoRa-laitteen asetukset" + } + }, + "network": { + "title": "WiFi-asetukset", + "description": "WiFi-radion asetukset", + "note": "Huomautus: Jotkin laitteet (ESP32) eivät voi käyttää sekä Bluetoothia että WiFiä samanaikaisesti.", + "addressMode": { + "description": "Osoitteen määrityksen valinta", + "label": "Osoitetila" + }, + "dns": { + "description": "DNS-palvelin", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Ota käyttöön tai poista käytöstä ethernet-portti", + "label": "Käytössä" + }, + "gateway": { + "description": "Oletusyhdyskäytävä", + "label": "Yhdyskäytävä" + }, + "ip": { + "description": "IP-osoite", + "label": "IP" + }, + "psk": { + "description": "Verkon salasana", + "label": "PSK" + }, + "ssid": { + "description": "Verkon nimi", + "label": "SSID" + }, + "subnet": { + "description": "Aliverkon peite", + "label": "Aliverkko" + }, + "wifiEnabled": { + "description": "Ota WiFi käyttöön tai poista se käytöstä", + "label": "Käytössä" + }, + "meshViaUdp": { + "label": "Mesh UDP:n kautta" + }, + "ntpServer": { + "label": "NTP-palvelin" + }, + "rsyslogServer": { + "label": "Rsyslog-palvelin" + }, + "ethernetConfigSettings": { + "description": "Ethernet-portin asetukset", + "label": "Ethernet-asetukset" + }, + "ipConfigSettings": { + "description": "IP-osoitteen asetukset", + "label": "IP-osoitteen asetukset" + }, + "ntpConfigSettings": { + "description": "NTP-asetukset", + "label": "NTP-asetukset" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog määritykset", + "label": "Rsyslog määritykset" + }, + "udpConfigSettings": { + "description": "UDP-yhdeyden asetukset", + "label": "UDP-asetukset" + } + }, + "position": { + "title": "Sijainnin asetukset", + "description": "Sijaintimoduulin asetukset", + "broadcastInterval": { + "description": "Kuinka usein sijainti lähetetään mesh-verkon yli", + "label": "Lähetyksen aikaväli" + }, + "enablePin": { + "description": "GPS-moduulin käyttöönottopinnin korvaus", + "label": "Ota pinni käytöön" + }, + "fixedPosition": { + "description": "Älä raportoi GPS-sijaintia, vaan käytä manuaalisesti määritettyä sijaintia", + "label": "Kiinteä sijainti" + }, + "gpsMode": { + "description": "Määritä, onko laitteen GPS käytössä, pois päältä vai puuttuuko se kokonaan", + "label": "GSP-tila" + }, + "gpsUpdateInterval": { + "description": "Kuinka usein GPS-paikannus suoritetaan", + "label": "GPS-päivitysväli" + }, + "positionFlags": { + "description": "Valinnaiset kentät, jotka voidaan sisällyttää sijaintiviesteihin. Mitä enemmän kenttiä valitaan, sitä suurempi viesti on, mikä johtaa pidempään lähetysaikaan ja suurempaan pakettihäviöriskiin.", + "label": "Sijaintimerkinnät" + }, + "receivePin": { + "description": "GPS-moduulin käyttöönottopinnin korvaus", + "label": "Vastaanoton pinni" + }, + "smartPositionEnabled": { + "description": "Lähetä sijainti vain, kun sijainnissa on tapahtunut merkittävä muutos", + "label": "Ota älykäs sijainti käyttöön" + }, + "smartPositionMinDistance": { + "description": "Vähimmäisetäisyys (metreinä), joka on kuljettava ennen sijaintipäivityksen lähettämistä", + "label": "Älykkään sijainnin minimietäisyys" + }, + "smartPositionMinInterval": { + "description": "Lyhin aikaväli (sekunteina), joka on kuluttava ennen sijaintipäivityksen lähettämistä", + "label": "Älykkään sijainnin vähimmäisetäisyys" + }, + "transmitPin": { + "description": "GPS-moduulin käyttöönottopinnin korvaus", + "label": "Lähetyksen pinni" + }, + "intervalsSettings": { + "description": "Kuinka usein sijaintipäivitykset lähetetään", + "label": "Aikaväli" + }, + "flags": { + "placeholder": "Valitse sijaintiasetukset...", + "altitude": "Korkeus", + "altitudeGeoidalSeparation": "Korkeuden geoidinen erotus", + "altitudeMsl": "Korkeus on mitattu merenpinnan tasosta", + "dop": "Tarkkuuden heikkenemä (DOP), oletuksena käytetään PDOP-arvoa", + "hdopVdop": "Jos DOP on asetettu, käytä HDOP- ja VDOP-arvoja PDOP:n sijaan", + "numSatellites": "Satelliittien määrä", + "sequenceNumber": "Sekvenssinumero", + "timestamp": "Aikaleima", + "unset": "Ei yhdistetty", + "vehicleHeading": "Ajoneuvon suunta", + "vehicleSpeed": "Ajoneuvon nopeus" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Käytetään akun jännitteen lukeman säätämiseen", + "label": "Korvaava AD-muuntimen kerroin" + }, + "ina219Address": { + "description": "Akkunäytön INA219 osoite", + "label": "INA219 Osoite" + }, + "lightSleepDuration": { + "description": "Kuinka kauan laite on kevyessä lepotilassa", + "label": "Kevyen lepotilan kesto" + }, + "minimumWakeTime": { + "description": "Vähimmäisaika, jonka laite pysyy hereillä paketin vastaanoton jälkeen", + "label": "Minimi heräämisaika" + }, + "noConnectionBluetoothDisabled": { + "description": "Jos laite ei saa Bluetooth-yhteyttä, BLE-radio poistetaan käytöstä tämän ajan kuluttua", + "label": "Ei yhteyttä. Bluetooth on pois käytöstä" + }, + "powerSavingEnabled": { + "description": "Valitse, jos laite saa virtaa matalavirtalähteestä (esim. aurinkopaneeli), jolloin virrankulutusta minimoidaan mahdollisimman paljon.", + "label": "Ota virransäästötila käyttöön" + }, + "shutdownOnBatteryDelay": { + "description": "Sammuta laite automaattisesti tämän ajan kuluttua akkukäytöllä, 0 tarkoittaa toistaiseksi päällä", + "label": "Viive laitteen sammuttamisessa akkukäytöllä" + }, + "superDeepSleepDuration": { + "description": "Kuinka pitkään laite on supersyvässä lepotilassa", + "label": "Supersyvän lepotilan kesto" + }, + "powerConfigSettings": { + "description": "Virtamoduulin asetukset", + "label": "Virran asetukset" + }, + "sleepSettings": { + "description": "Virtamoduulin lepotila-asetukset", + "label": "Lepotilan asetukset" + } + }, + "security": { + "description": "Turvallisuuskokoonpanon asetukset", + "title": "Turvallisuusasetukset", + "button_backupKey": "Varmuuskopioi avain", + "adminChannelEnabled": { + "description": "Salli saapuva laitteen ohjaus suojaamattoman vanhan admin-kanavan kautta", + "label": "Salli vanha admin ylläpitäjä" + }, + "enableDebugLogApi": { + "description": "Lähetä reaaliaikainen debug-loki sarjaportin kautta, katso ja vie laitteen lokitiedostot, joista sijaintitiedot on poistettu, Bluetoothin kautta", + "label": "Ota käyttöön virheenkorjauslokin API-rajapinta" + }, + "managed": { + "description": "Jos tämä on käytössä, laitteen asetuksia voi muuttaa vain etäadmin-laitteen hallintaviestien kautta. Älä ota tätä käyttöön, ellei vähintään yhtä sopivaa etäadmin-laitetta ole määritetty ja julkinen avain ei ole tallennettu johonkin yllä olevista kentistä.", + "label": "Hallinnoitu" + }, + "privateKey": { + "description": "Käytetään jaetun avaimen luomiseen etälaitteen kanssa", + "label": "Yksityinen avain" + }, + "publicKey": { + "description": "Lähetetään muille mesh-verkon laitteille, jotta ne voivat laskea jaetun salaisen avaimen", + "label": "Julkinen avain" + }, + "primaryAdminKey": { + "description": "Ensisijainen julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", + "label": "Ensisijainen järjestelmänvalvojan avain" + }, + "secondaryAdminKey": { + "description": "Toissijainen julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", + "label": "Toissijainen järjestelmänvalvojan avain" + }, + "serialOutputEnabled": { + "description": "Sarjakonsoli Stream API:n yli", + "label": "Sarjaulostulo Käytössä" + }, + "tertiaryAdminKey": { + "description": "Kolmas julkinen avain, jolla on oikeus lähettää hallintaviestejä tälle laitteelle", + "label": "Kolmas järjestelmänvalvojan hallinta-avain" + }, + "adminSettings": { + "description": "Järjestelmänvalvojan asetukset", + "label": "Ylläpitäjän asetukset" + }, + "loggingSettings": { + "description": "Kirjautumisen asetukset", + "label": "Kirjautumisen asetukset" + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/dialog.json b/packages/web/public/i18n/locales/fi-FI/dialog.json index 579dacb8..f858e9d4 100644 --- a/packages/web/public/i18n/locales/fi-FI/dialog.json +++ b/packages/web/public/i18n/locales/fi-FI/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "Tämä toiminto poistaa kaiken viestihistorian. Toimintoa ei voi perua. Haluatko varmasti jatkaa?", - "title": "Tyhjennä kaikki viestit" - }, - "deviceName": { - "description": "Laite käynnistyy uudelleen, kun asetus on tallennettu.", - "longName": "Pitkä nimi", - "shortName": "Lyhytnimi", - "title": "Vaihda laitteen nimi" - }, - "import": { - "description": "Nykyinen LoRa-asetus ylikirjoitetaan.", - "error": { - "invalidUrl": "Virheellinen Meshtastic verkko-osoite" - }, - "channelPrefix": "Kanava: ", - "channelSetUrl": "Kanavan asetus / QR-koodin URL-osoite", - "channels": "Kanavat:", - "usePreset": "Käytä esiasetusta?", - "title": "Tuo kanava-asetukset" - }, - "locationResponse": { - "altitude": "Korkeus: ", - "coordinates": "Koordinaatit: ", - "title": "Sijainti: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Luodaanko ennalta jaettu avain uudelleen?", - "description": "Haluatko varmasti luoda ennalta jaetun avaimen uudelleen?", - "regenerate": "Luo uudelleen" - }, - "newDeviceDialog": { - "title": "Yhdistä uuteen laitteeseen", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Sarjaliitäntä", - "useHttps": "Käytä HTTPS", - "connecting": "Yhdistetään...", - "connect": "Yhdistä", - "connectionFailedAlert": { - "title": "Yhteys epäonnistui", - "descriptionPrefix": "Laitteeseen ei saatu yhteyttä. ", - "httpsHint": "Jos käytät HTTPS:ää, sinun on ehkä ensin hyväksyttävä itse allekirjoitettu varmenne. ", - "openLinkPrefix": "Avaa ", - "openLinkSuffix": " uuteen välilehteen", - "acceptTlsWarningSuffix": ", hyväksy mahdolliset TLS-varoitukset, jos niitä ilmenee ja yritä sitten uudelleen.", - "learnMoreLink": "Lue lisää" - }, - "httpConnection": { - "label": "IP-osoite / isäntänimi", - "placeholder": "000.000.000 / meshtastinen.paikallinen" - }, - "serialConnection": { - "noDevicesPaired": "Yhtään laitetta ei ole vielä yhdistetty.", - "newDeviceButton": "Uusi laite", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "Yhtään laitetta ei ole vielä yhdistetty.", - "newDeviceButton": "Uusi laite" - }, - "validation": { - "requiresWebBluetooth": "Tämä yhteystyyppi vaatii <0>Web-sarjaportti bluetooth -tuen. Käytä tuettua selainta, kuten Chromea tai Edgeä.", - "requiresWebSerial": "Tämä yhteystyyppi vaatii <0>Web-sarjaportti -tuen. Käytä tuettua selainta, kuten Chromea tai Edgeä.", - "requiresSecureContext": "Tämä sovellus vaatii <0>suojatun yhteyden. Yhdistä käyttämällä HTTPS:ää tai localhostia.", - "additionallyRequiresSecureContext": "Lisäksi se vaatii <0>suojatun yhteyden. Yhdistä käyttämällä HTTPS:ää tai localhostia." - } - }, - "nodeDetails": { - "message": "Viesti", - "requestPosition": "Pyydä sijaintia", - "traceRoute": "Reitinselvitys", - "airTxUtilization": "Ilmatien TX käyttöaste", - "allRawMetrics": "Kaikki raakatiedot:", - "batteryLevel": "Akun varaus", - "channelUtilization": "Kanavan käyttöaste", - "details": "Tiedot:", - "deviceMetrics": "Laitteen mittausloki:", - "hardware": "Laitteisto: ", - "lastHeard": "Viimeksi kuultu: ", - "nodeHexPrefix": "Laitteen Hex: !", - "nodeNumber": "Laitteen numero: ", - "position": "Sijainti:", - "role": "Rooli: ", - "uptime": "Käyttöaika: ", - "voltage": "Jännite", - "title": "Tiedot laitteelle {{identifier}}", - "ignoreNode": "Älä huomioi laitetta", - "removeNode": "Poista laite", - "unignoreNode": "Poista laitteen ohitus käytöstä" - }, - "pkiBackup": { - "loseKeysWarning": "Jos menetät avaimesi, sinun täytyy palauttaa laite tehdasasetuksiin.", - "secureBackup": "On tärkeää varmuuskopioida julkiset ja yksityiset avaimet ja säilyttää niiden varmuuskopioita turvallisesti!", - "footer": "=== AVAIMIEN LOPPU ===", - "header": "=== MESHTASTIC AVAIMET {{longName}} ({{shortName}}) LAITTEELLE ===", - "privateKey": "Yksityinen avain:", - "publicKey": "Julkinen avain:", - "fileName": "meshtastic_avaimet_{{longName}}_{{shortName}}.txt", - "title": "Varmuuskopioi avaimet" - }, - "pkiBackupReminder": { - "description": "Suosittelemme avaintietojen säännöllistä varmuuskopiointia. Haluatko varmuuskopioida nyt?", - "title": "Varmuuskopion Muistutus", - "remindLaterPrefix": "Muistuta minua", - "remindNever": "Älä muistuta minua koskaan", - "backupNow": "Varmuuskopioi nyt" - }, - "pkiRegenerate": { - "description": "Haluatko varmasti luoda avainparin uudelleen?", - "title": "Luo avainpari uudelleen" - }, - "qr": { - "addChannels": "Lisää kanavia", - "replaceChannels": "Korvaa kanavia", - "description": "Nykyinen LoRa-kokoonpano tullaan myös jakamaan.", - "sharableUrl": "Jaettava URL", - "title": "Generoi QR-koodi" - }, - "rebootOta": { - "title": "Ajasta uudelleenkäynnistys", - "description": "Käynnistä yhdistetty laite uudelleen viiveen jälkeen OTA-tilaan (langaton päivitys).", - "enterDelay": "Anna viive (sekuntia)", - "scheduled": "Uudelleenkäynnistys on ajastettu" - }, - "reboot": { - "title": "Ajasta uudelleenkäynnistys", - "description": "Käynnistä yhdistetty laite x minuutin jälkeen." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "Tämä poistaa laitteen laitteesta ja pyytää uusia avaimia.", - "keyMismatchReasonSuffix": ". Tämä johtuu siitä, että etälaitteen nykyinen julkinen avain ei vastaa aiemmin tallennettua avainta tälle laitteelle.", - "unableToSendDmPrefix": "Laitteesi ei pysty lähettämään suoraa viestiä laitteelle: " - }, - "acceptNewKeys": "Hyväksy uudet avaimet", - "title": "Avaimet eivät täsmää - {{identifier}}" - }, - "removeNode": { - "description": "Haluatko varmasti poistaa tämän laitteen?", - "title": "Poista laite?" - }, - "shutdown": { - "title": "Ajasta sammutus", - "description": "Sammuta yhdistetty laite x minuutin päästä." - }, - "traceRoute": { - "routeToDestination": "Reitin määränpää:", - "routeBack": "Reitti takaisin:" - }, - "tracerouteResponse": { - "title": "Reitinselvitys: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Kyllä, tiedän mitä teen", - "conjunction": " ja blogikirjoitukset ", - "postamble": " ja ymmärrän roolin muuttamisen vaikutukset.", - "preamble": "Olen lukenut ", - "choosingRightDeviceRole": "Valitse laitteelle oikea rooli", - "deviceRoleDocumentation": "Roolien dokumentaatio laitteelle", - "title": "Oletko varma?" - }, - "managedMode": { - "confirmUnderstanding": "Kyllä, tiedän mitä teen", - "title": "Oletko varma?", - "description": "Hallintatilan käyttöönotto estää asiakassovelluksia (mukaan lukien verkkosovellus) kirjoittamasta asetuksia radioon. Kun tila on otettu käyttöön, radion asetuksia voidaan muuttaa vain etähallintaviestien kautta. Tämä asetus ei ole pakollinen etähallittavien laitteiden hallintaan." - } + "deleteMessages": { + "description": "Tämä toiminto poistaa kaiken viestihistorian. Toimintoa ei voi perua. Haluatko varmasti jatkaa?", + "title": "Tyhjennä kaikki viestit" + }, + "deviceName": { + "description": "Laite käynnistyy uudelleen, kun asetus on tallennettu.", + "longName": "Pitkä nimi", + "shortName": "Lyhytnimi", + "title": "Vaihda laitteen nimi" + }, + "import": { + "description": "Nykyinen LoRa-asetus ylikirjoitetaan.", + "error": { + "invalidUrl": "Virheellinen Meshtastic verkko-osoite" + }, + "channelPrefix": "Kanava: ", + "channelSetUrl": "Kanavan asetus / QR-koodin URL-osoite", + "channels": "Kanavat:", + "usePreset": "Käytä esiasetusta?", + "title": "Tuo kanava-asetukset" + }, + "locationResponse": { + "altitude": "Korkeus: ", + "coordinates": "Koordinaatit: ", + "title": "Sijainti: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Luodaanko ennalta jaettu avain uudelleen?", + "description": "Haluatko varmasti luoda ennalta jaetun avaimen uudelleen?", + "regenerate": "Luo uudelleen" + }, + "newDeviceDialog": { + "title": "Yhdistä uuteen laitteeseen", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Sarjaliitäntä", + "useHttps": "Käytä HTTPS", + "connecting": "Yhdistetään...", + "connect": "Yhdistä", + "connectionFailedAlert": { + "title": "Yhteys epäonnistui", + "descriptionPrefix": "Laitteeseen ei saatu yhteyttä. ", + "httpsHint": "Jos käytät HTTPS:ää, sinun on ehkä ensin hyväksyttävä itse allekirjoitettu varmenne. ", + "openLinkPrefix": "Avaa ", + "openLinkSuffix": " uuteen välilehteen", + "acceptTlsWarningSuffix": ", hyväksy mahdolliset TLS-varoitukset, jos niitä ilmenee ja yritä sitten uudelleen.", + "learnMoreLink": "Lue lisää" + }, + "httpConnection": { + "label": "IP-osoite / isäntänimi", + "placeholder": "000.000.000 / meshtastinen.paikallinen" + }, + "serialConnection": { + "noDevicesPaired": "Yhtään laitetta ei ole vielä yhdistetty.", + "newDeviceButton": "Uusi laite", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "Yhtään laitetta ei ole vielä yhdistetty.", + "newDeviceButton": "Uusi laite" + }, + "validation": { + "requiresWebBluetooth": "Tämä yhteystyyppi vaatii <0>Web-sarjaportti bluetooth -tuen. Käytä tuettua selainta, kuten Chromea tai Edgeä.", + "requiresWebSerial": "Tämä yhteystyyppi vaatii <0>Web-sarjaportti -tuen. Käytä tuettua selainta, kuten Chromea tai Edgeä.", + "requiresSecureContext": "Tämä sovellus vaatii <0>suojatun yhteyden. Yhdistä käyttämällä HTTPS:ää tai localhostia.", + "additionallyRequiresSecureContext": "Lisäksi se vaatii <0>suojatun yhteyden. Yhdistä käyttämällä HTTPS:ää tai localhostia." + } + }, + "nodeDetails": { + "message": "Viesti", + "requestPosition": "Pyydä sijaintia", + "traceRoute": "Reitinselvitys", + "airTxUtilization": "Ilmatien TX käyttöaste", + "allRawMetrics": "Kaikki raakatiedot:", + "batteryLevel": "Akun varaus", + "channelUtilization": "Kanavan käyttöaste", + "details": "Tiedot:", + "deviceMetrics": "Laitteen mittausloki:", + "hardware": "Laitteisto: ", + "lastHeard": "Viimeksi kuultu: ", + "nodeHexPrefix": "Laitteen Hex: !", + "nodeNumber": "Laitteen numero: ", + "position": "Sijainti:", + "role": "Rooli: ", + "uptime": "Käyttöaika: ", + "voltage": "Jännite", + "title": "Tiedot laitteelle {{identifier}}", + "ignoreNode": "Älä huomioi laitetta", + "removeNode": "Poista laite", + "unignoreNode": "Poista laitteen ohitus käytöstä" + }, + "pkiBackup": { + "loseKeysWarning": "Jos menetät avaimesi, sinun täytyy palauttaa laite tehdasasetuksiin.", + "secureBackup": "On tärkeää varmuuskopioida julkiset ja yksityiset avaimet ja säilyttää niiden varmuuskopioita turvallisesti!", + "footer": "=== AVAIMIEN LOPPU ===", + "header": "=== MESHTASTIC AVAIMET {{longName}} ({{shortName}}) LAITTEELLE ===", + "privateKey": "Yksityinen avain:", + "publicKey": "Julkinen avain:", + "fileName": "meshtastic_avaimet_{{longName}}_{{shortName}}.txt", + "title": "Varmuuskopioi avaimet" + }, + "pkiBackupReminder": { + "description": "Suosittelemme avaintietojen säännöllistä varmuuskopiointia. Haluatko varmuuskopioida nyt?", + "title": "Varmuuskopion Muistutus", + "remindLaterPrefix": "Muistuta minua", + "remindNever": "Älä muistuta minua koskaan", + "backupNow": "Varmuuskopioi nyt" + }, + "pkiRegenerate": { + "description": "Haluatko varmasti luoda avainparin uudelleen?", + "title": "Luo avainpari uudelleen" + }, + "qr": { + "addChannels": "Lisää kanavia", + "replaceChannels": "Korvaa kanavia", + "description": "Nykyinen LoRa-kokoonpano tullaan myös jakamaan.", + "sharableUrl": "Jaettava URL", + "title": "Generoi QR-koodi" + }, + "rebootOta": { + "title": "Ajasta uudelleenkäynnistys", + "description": "Käynnistä yhdistetty laite uudelleen viiveen jälkeen OTA-tilaan (langaton päivitys).", + "enterDelay": "Anna viive (sekuntia)", + "scheduled": "Uudelleenkäynnistys on ajastettu" + }, + "reboot": { + "title": "Ajasta uudelleenkäynnistys", + "description": "Käynnistä yhdistetty laite x minuutin jälkeen." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "Tämä poistaa laitteen laitteesta ja pyytää uusia avaimia.", + "keyMismatchReasonSuffix": ". Tämä johtuu siitä, että etälaitteen nykyinen julkinen avain ei vastaa aiemmin tallennettua avainta tälle laitteelle.", + "unableToSendDmPrefix": "Laitteesi ei pysty lähettämään suoraa viestiä laitteelle: " + }, + "acceptNewKeys": "Hyväksy uudet avaimet", + "title": "Avaimet eivät täsmää - {{identifier}}" + }, + "removeNode": { + "description": "Haluatko varmasti poistaa tämän laitteen?", + "title": "Poista laite?" + }, + "shutdown": { + "title": "Ajasta sammutus", + "description": "Sammuta yhdistetty laite x minuutin päästä." + }, + "traceRoute": { + "routeToDestination": "Reitin määränpää:", + "routeBack": "Reitti takaisin:" + }, + "tracerouteResponse": { + "title": "Reitinselvitys: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Kyllä, tiedän mitä teen", + "conjunction": " ja blogikirjoitukset ", + "postamble": " ja ymmärrän roolin muuttamisen vaikutukset.", + "preamble": "Olen lukenut ", + "choosingRightDeviceRole": "Valitse laitteelle oikea rooli", + "deviceRoleDocumentation": "Roolien dokumentaatio laitteelle", + "title": "Oletko varma?" + }, + "managedMode": { + "confirmUnderstanding": "Kyllä, tiedän mitä teen", + "title": "Oletko varma?", + "description": "Hallintatilan käyttöönotto estää asiakassovelluksia (mukaan lukien verkkosovellus) kirjoittamasta asetuksia radioon. Kun tila on otettu käyttöön, radion asetuksia voidaan muuttaa vain etähallintaviestien kautta. Tämä asetus ei ole pakollinen etähallittavien laitteiden hallintaan." + } } diff --git a/packages/web/public/i18n/locales/fi-FI/messages.json b/packages/web/public/i18n/locales/fi-FI/messages.json index 7fc4247f..7852a8df 100644 --- a/packages/web/public/i18n/locales/fi-FI/messages.json +++ b/packages/web/public/i18n/locales/fi-FI/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Viestit: {{chatName}}", - "placeholder": "Kirjoita viesti" - }, - "emptyState": { - "title": "Valitse keskustelu", - "text": "Ei vielä viestejä." - }, - "selectChatPrompt": { - "text": "Valitse kanava tai laite aloittaaksesi viestinnän." - }, - "sendMessage": { - "placeholder": "Kirjoita viesti tähän...", - "sendButton": "Lähetä" - }, - "actionsMenu": { - "addReactionLabel": "Lisää reaktio", - "replyLabel": "Vastaa" - }, - "deliveryStatus": { - "delivered": { - "label": "Viesti toimitettu", - "displayText": "Viesti toimitettu" - }, - "failed": { - "label": "Viestin toimitus epäonnistui", - "displayText": "Toimitus epäonnistui" - }, - "unknown": { - "label": "Viestin tila tuntematon", - "displayText": "Tuntematon tila" - }, - "waiting": { - "label": "Lähetetään viestiä", - "displayText": "Odottaa toimitusta" - } - } + "page": { + "title": "Viestit: {{chatName}}", + "placeholder": "Kirjoita viesti" + }, + "emptyState": { + "title": "Valitse keskustelu", + "text": "Ei vielä viestejä." + }, + "selectChatPrompt": { + "text": "Valitse kanava tai laite aloittaaksesi viestinnän." + }, + "sendMessage": { + "placeholder": "Kirjoita viesti tähän...", + "sendButton": "Lähetä" + }, + "actionsMenu": { + "addReactionLabel": "Lisää reaktio", + "replyLabel": "Vastaa" + }, + "deliveryStatus": { + "delivered": { + "label": "Viesti toimitettu", + "displayText": "Viesti toimitettu" + }, + "failed": { + "label": "Viestin toimitus epäonnistui", + "displayText": "Toimitus epäonnistui" + }, + "unknown": { + "label": "Viestin tila tuntematon", + "displayText": "Tuntematon tila" + }, + "waiting": { + "label": "Lähetetään viestiä", + "displayText": "Odottaa toimitusta" + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/moduleConfig.json b/packages/web/public/i18n/locales/fi-FI/moduleConfig.json index 2eb76dfe..01bfa09d 100644 --- a/packages/web/public/i18n/locales/fi-FI/moduleConfig.json +++ b/packages/web/public/i18n/locales/fi-FI/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ympäristövalaistus", - "tabAudio": "Ääni", - "tabCannedMessage": "Ennalta asetettu", - "tabDetectionSensor": "Havaitsemisanturi", - "tabExternalNotification": "Ext-ilmoitus", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Naapuritieto", - "tabPaxcounter": "PAX-laskuri", - "tabRangeTest": "Kuuluvuustesti", - "tabSerial": "Sarjaliitäntä", - "tabStoreAndForward": "S&V", - "tabTelemetry": "Telemetria" - }, - "ambientLighting": { - "title": "Ympäristövalaistuksen asetukset", - "description": "Ympäristövalaistuksen moduulin asetukset", - "ledState": { - "label": "Ledin tila", - "description": "Aseta ledi päälle tai pois päältä" - }, - "current": { - "label": "Virta", - "description": "Asettaa nykyisen ledin ulostulon. Oletus on 10" - }, - "red": { - "label": "Punainen", - "description": "Asettaa punaisen ledin tason. Arvot ovat 0-255" - }, - "green": { - "label": "Vihreä", - "description": "Asettaa vihreän ledin tason. Arvot ovat 0-255" - }, - "blue": { - "label": "Sininen", - "description": "Asettaa sinisen ledin tason. Arvot ovat 0-255" - } - }, - "audio": { - "title": "Ääniasetukset", - "description": "Äänimoduulin asetukset", - "codec2Enabled": { - "label": "Codec 2 käytössä", - "description": "Ota Codec 2 äänenkoodaus käyttöön" - }, - "pttPin": { - "label": "PTT pinni", - "description": "PTT:lle käytettävä GPIO-pinni" - }, - "bitrate": { - "label": "Tiedonsiirtonopeus", - "description": "Tiedonsiirtonopeus äänenkoodaukselle" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO-pinni jota käytetään i2S WS:ssä" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO-pinni jota käytetään i2S SD:ssä" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO-pinni jota käytetään i2S DIN:ssä" - }, - "i2sSck": { - "label": "i2S SD", - "description": "GPIO-pinni jota käytetään i2S SCK:ssa" - } - }, - "cannedMessage": { - "title": "Välitettyjen viestien asetukset", - "description": "Asetukset välitettyjen viestien moduulissa", - "moduleEnabled": { - "label": "Moduuli Käytössä", - "description": "Ota käyttöön välitetyt viestit" - }, - "rotary1Enabled": { - "label": "Kiertovalitsin #1 käytössä", - "description": "Ota kiertovalitsimen kooderi käyttöön" - }, - "inputbrokerPinA": { - "label": "Kooderin pinni A", - "description": "GPIO-pinni (1–39) kooderin portille A" - }, - "inputbrokerPinB": { - "label": "Kooderin pinni B", - "description": "GPIO-pinni (1–39) kooderin portille B" - }, - "inputbrokerPinPress": { - "label": "Kooderin pinni painallukselle", - "description": "GPIO-pinni (1–39) kooderin painallukselle" - }, - "inputbrokerEventCw": { - "label": "Myötäpäiväinen liike", - "description": "Valitse syöttötapahtuma." - }, - "inputbrokerEventCcw": { - "label": "Myötäpäiväisen liikkeen laskuri", - "description": "Valitse syöttötapahtuma." - }, - "inputbrokerEventPress": { - "label": "Painamisen tapahtuma", - "description": "Valitse syöttötapahtuma" - }, - "updown1Enabled": { - "label": "Ylös alas käytössä", - "description": "Ota käyttöön ylös / alas-suuntaa tunnistava kooderi" - }, - "allowInputSource": { - "label": "Salli syöttölaitteen lähde", - "description": "Valitse '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Lähetä äänimerkki", - "description": "Lähettää äänimerkkimerkin jokaisen viestin mukana" - } - }, - "detectionSensor": { - "title": "Tunnistinsensorin asetukset", - "description": "Tunnistinsensori-moduulin asetukset", - "enabled": { - "label": "Käytössä", - "description": "Ota käyttöön tai poista käytöstä tunnistinsensorin moduuli" - }, - "minimumBroadcastSecs": { - "label": "Minimilähetys (sekuntia)", - "description": "Aikaväli sekunteina kuinka usein viestejä voi lähettää mesh-verkkoon tilamuutoksen havaitsemisen jälkeen" - }, - "stateBroadcastSecs": { - "label": "Tilatiedon lähetys (sekuntia)", - "description": "Kuinka usein sekunteina lähetetään viesti mesh-verkkoon nykytilasta, vaikka tilassa ei olisi muutoksia" - }, - "sendBell": { - "label": "Lähetä äänimerkki", - "description": "Lähetä ASCII-äänimerkki hälytyssanoman mukana" - }, - "name": { - "label": "Käyttäjäystävälinen nimi", - "description": "Käytetään muotoilemaan mesh-verkkoon lähetettävä viesti, enintään 20 merkkiä" - }, - "monitorPin": { - "label": "Valvonta pinni", - "description": "GPIO-pinni valvonnan tilan muutoksien seurantaan" - }, - "detectionTriggerType": { - "label": "Tunnistuksen havaintotyyppi", - "description": "Käytettävän tunnistustapahtuman tyyppi" - }, - "usePullup": { - "label": "Käytä vetokytkintä (pullup)", - "description": "Käytetäänkö GPIO-pinnin INPUT_PULLUP-tilaa" - } - }, - "externalNotification": { - "title": "Ulkoisten ilmoituksien asetukset", - "description": "Määritä ulkoisten ilmoitusten moduulin asetukset", - "enabled": { - "label": "Moduuli käytössä", - "description": "Ota ulkoiset ilmoitukset käyttöön" - }, - "outputMs": { - "label": "Ulostulo MS", - "description": "Ulostulo MS" - }, - "output": { - "label": "Ulostulo", - "description": "Ulostulo" - }, - "outputVibra": { - "label": "Värinän ulostulo", - "description": "Värinän ulostulo" - }, - "outputBuzzer": { - "label": "Summerin ulostulo", - "description": "Summerin ulostulo" - }, - "active": { - "label": "Käytössä", - "description": "Käytössä" - }, - "alertMessage": { - "label": "Hälytysviesti", - "description": "Hälytysviesti" - }, - "alertMessageVibra": { - "label": "Hälytysviestin värinä", - "description": "Hälytysviestin värinä" - }, - "alertMessageBuzzer": { - "label": "Hälytysviestin summeri", - "description": "Hälytysviestin summeri" - }, - "alertBell": { - "label": "Hälytysääni", - "description": "Pitäisikö hälytyksen aktivoitua, kun vastaanotetaan äänimerkki?" - }, - "alertBellVibra": { - "label": "Hälytysäänen värinä", - "description": "Hälytysäänen värinä" - }, - "alertBellBuzzer": { - "label": "Hälytysäänen summeri", - "description": "Hälytysäänen summeri" - }, - "usePwm": { - "label": "Käytä PWM", - "description": "Käytä PWM" - }, - "nagTimeout": { - "label": "Toistokehotuksen aikakatkaisu", - "description": "Toistokehotuksen aikakatkaisu" - }, - "useI2sAsBuzzer": { - "label": "Use I²S pinniä summerille", - "description": "Määritä I²S-pinni summerin ulostuloon" - } - }, - "mqtt": { - "title": "MQTT-asetukset", - "description": "MQTT-moduulin asetukset", - "enabled": { - "label": "Käytössä", - "description": "Ota MQTT käyttöön tai poista se käytöstä" - }, - "address": { - "label": "MQTT-palvelimen osoite", - "description": "MQTT-palvelimen osoite, jota käytetään oletus- tai mukautetuissa palvelimissa" - }, - "username": { - "label": "MQTT käyttäjänimi", - "description": "MQTT käyttäjänimi, jota käytetään oletus- tai mukautetuissa palvelimissa" - }, - "password": { - "label": "MQTT salasana", - "description": "MQTT salasana, jota käytetään oletus- tai mukautetuissa palvelimissa" - }, - "encryptionEnabled": { - "label": "Salaus käytössä", - "description": "Ota MQTT-salaus käyttöön tai pois käytöstä. Huom: Jos tämä asetus ei ole käytössä, kaikki viestit lähetetään MQTT-välittäjälle salaamattomina, vaikka lähetyskanavillasi olisi salausavaimet asetettuna. Tämä koskee myös sijaintitietoja." - }, - "jsonEnabled": { - "label": "JSON käytössä", - "description": "Lähetetäänkö / otetaanko vastaan JSON-paketteja MQTT:llä" - }, - "tlsEnabled": { - "label": "TLS käytössä", - "description": "Ota TLS käyttöön tai poista se käytöstä" - }, - "root": { - "label": "Palvelimen osoite (root topic)", - "description": "MQTT-palvelimen osoite, jota käytetään oletus- tai mukautetuissa palvelimissa" - }, - "proxyToClientEnabled": { - "label": "MQTT-välityspalvelin käytössä", - "description": "Käyttää verkkoyhteyttä välittämään MQTT-viestejä asiakkaalle." - }, - "mapReportingEnabled": { - "label": "Karttaraportointi käytössä", - "description": "Laitteesi lähettää säännöllisin väliajoin salaamattoman karttaraporttipaketin määritettyyn MQTT-palvelimeen. Paketti sisältää tunnisteen, lyhyen ja pitkän nimen, likimääräisen sijainnin, laitteistomallin, roolin, laiteohjelmistoversion, LoRa-alueen, modeemin esiasetukset sekä ensisijaisen kanavan nimen." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Karttaraportoinnin aikaväli (s)", - "description": "Aikaväli sekunneissa karttaraporttien julkaisemiseksi" - }, - "positionPrecision": { - "label": "Arvioitu sijainti", - "description": "Jaetun sijainnin tarkkuus on tämän etäisyyden rajoissa", - "options": { - "metric_km23": "23 kilometrin säteellä", - "metric_km12": "12 kilometrin säteellä", - "metric_km5_8": "5,8 kilometrin säteellä", - "metric_km2_9": "2,9 kilometrin säteellä", - "metric_km1_5": "1,5 kilometrin säteellä", - "metric_m700": "700 metrin säteellä", - "metric_m350": "350 metrin säteellä", - "metric_m200": "200 metrin säteellä", - "metric_m90": "90 metrin säteellä", - "metric_m50": "50 metrin säteellä", - "imperial_mi15": "15 mailin säteellä", - "imperial_mi7_3": "7,3 mailin säteellä", - "imperial_mi3_6": "3,6 mailin säteellä", - "imperial_mi1_8": "1,8 mailin säteellä", - "imperial_mi0_9": "0,9 mailin säteellä", - "imperial_mi0_5": "0,5 mailin säteellä", - "imperial_mi0_2": "0,2 mailin säteellä", - "imperial_ft600": "600 jalan säteellä", - "imperial_ft300": "300 jalan säteellä", - "imperial_ft150": "150 jalan säteellä" - } - } - } - }, - "neighborInfo": { - "title": "Naapuritiedon asetukset", - "description": "Naapuritietojen moduulin asetukset", - "enabled": { - "label": "Käytössä", - "description": "Ota käyttöön tai poista käytöstä naapuruustietomoduuli" - }, - "updateInterval": { - "label": "Päivitysväli", - "description": "Aikaväli sekunneissa siitä, kuinka usein mesh-verkossa lähetetään naapuritietoja verkkoon" - } - }, - "paxcounter": { - "title": "Pax-laskurin asetukset", - "description": "Pax-laskurin moduulin asetukset", - "enabled": { - "label": "Moduuli käytössä", - "description": "Ota pax-laskuri käyttöön" - }, - "paxcounterUpdateInterval": { - "label": "Päivityksen aikaväli (sekuntia)", - "description": "Kuinka kauan odotetaan pax-laskurin pakettien lähettämisen välillä" - }, - "wifiThreshold": { - "label": "WiFi-RSSI kynnysarvo", - "description": "Millä WiFi RSSI tasolla laskurin täytyisi kasvaa. Oletus on -80." - }, - "bleThreshold": { - "label": "WiFi-RSSI kynnysarvo", - "description": "Millä BLE RSSI-arvolla laskuri kasvaa. Oletus: -80." - } - }, - "rangeTest": { - "title": "Kuuluvuustestin asetukset", - "description": "Kuuluvuustesti moduulin asetukset", - "enabled": { - "label": "Moduuli käytössä", - "description": "Ota kuuluvuustesti käytöön" - }, - "sender": { - "label": "Viestin aikaväli", - "description": "Kuinka kauan odotetaan testipakettien lähettämisen välillä" - }, - "save": { - "label": "Tallenna CSV tallennustilaan", - "description": "Vain ESP32" - } - }, - "serial": { - "title": "Sarjaliitännän asetukset", - "description": "Sarjaliitäntä-moduulin asetukset", - "enabled": { - "label": "Sarjaliitäntä käytössä", - "description": "Ota sarjaliitäntä käyttöön" - }, - "echo": { - "label": "Toista", - "description": "Kaikki lähettämäsi paketit toistetaan takaisin laitteellesi" - }, - "rxd": { - "label": "Vastaanota PIN-koodi", - "description": "Määritä GPIO-pinni käyttämään aiemmin asetettua RXD-pinniä." - }, - "txd": { - "label": "Lähetä PIN-koodi", - "description": "Määritä GPIO-pinni käyttämään aiemmin asetettua TXD-pinniä." - }, - "baud": { - "label": "Baud-siirtonopeus", - "description": "Sarjaliitännän baud-siirtonopeus" - }, - "timeout": { - "label": "Aikakatkaisu", - "description": "Kuinka monta sekuntia odotetaan, ennen kuin paketti merkitään valmiiksi" - }, - "mode": { - "label": "Tila", - "description": "Valitse tila" - }, - "overrideConsoleSerialPort": { - "label": "Ohita konsolin sarjaliitännän portti", - "description": "Jos sinulla on sarjaportti kytkettynä konsoliin, tämä ohittaa sen." - } - }, - "storeForward": { - "title": "Varastoi & välitä asetukset", - "description": "Varastoi & välitä moduulin asetukset", - "enabled": { - "label": "Moduuli käytössä", - "description": "Ota varastoi & välitä käyttöön" - }, - "heartbeat": { - "label": "Heartbeat käytössä", - "description": "Ota varastoi & välitä heartbeat käyttöön" - }, - "records": { - "label": "Kirjausten määrä", - "description": "Tallennettavien tietueiden määrä" - }, - "historyReturnMax": { - "label": "Historian maksimimäärä", - "description": "Enimmäismäärä tietueita palautettaviksi" - }, - "historyReturnWindow": { - "label": "Historian aikamäärä", - "description": "Enimmäismäärä tietueita palautettaviksi" - } - }, - "telemetry": { - "title": "Telemetrian asetukset", - "description": "Telemetria-moduulin asetukset", - "deviceUpdateInterval": { - "label": "Laitteen mittausloki", - "description": "Laitteen mittaustietojen päivitysväli (sekuntia)" - }, - "environmentUpdateInterval": { - "label": "Ympäristötietojen päivitysväli (sekuntia)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Moduuli käytössä", - "description": "Ota käyttöön ympäristön telemetria" - }, - "environmentScreenEnabled": { - "label": "Näytetään näytöllä", - "description": "Näytä moduulin telemetriatiedot OLED-näytöllä" - }, - "environmentDisplayFahrenheit": { - "label": "Näytä fahrenheitissa", - "description": "Näytä lämpötila fahrenheitissa" - }, - "airQualityEnabled": { - "label": "Ilmanlaatu käytössä", - "description": "Ota ilmanlaadun telemetria käyttöön" - }, - "airQualityInterval": { - "label": "Ilmanlaadun päivitysväli", - "description": "Kuinka usein ilmanlaadun tiedot lähetetään mesh-verkon kautta" - }, - "powerMeasurementEnabled": { - "label": "Tehomittaus käytössä", - "description": "Ota tehomittauksen telemetria käyttöön" - }, - "powerUpdateInterval": { - "label": "Tehomittauksen päivitysväli", - "description": "Kuinka usein tehomittauksen tiedot lähetetään mesh-verkon kautta" - }, - "powerScreenEnabled": { - "label": "Tehomittauksen näyttö käytössä", - "description": "Ota tehomittauksen telemetrian näyttö käyttöön" - } - } + "page": { + "tabAmbientLighting": "Ympäristövalaistus", + "tabAudio": "Ääni", + "tabCannedMessage": "Ennalta asetettu", + "tabDetectionSensor": "Havaitsemisanturi", + "tabExternalNotification": "Ext-ilmoitus", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Naapuritieto", + "tabPaxcounter": "PAX-laskuri", + "tabRangeTest": "Kuuluvuustesti", + "tabSerial": "Sarjaliitäntä", + "tabStoreAndForward": "S&V", + "tabTelemetry": "Telemetria" + }, + "ambientLighting": { + "title": "Ympäristövalaistuksen asetukset", + "description": "Ympäristövalaistuksen moduulin asetukset", + "ledState": { + "label": "Ledin tila", + "description": "Aseta ledi päälle tai pois päältä" + }, + "current": { + "label": "Virta", + "description": "Asettaa nykyisen ledin ulostulon. Oletus on 10" + }, + "red": { + "label": "Punainen", + "description": "Asettaa punaisen ledin tason. Arvot ovat 0-255" + }, + "green": { + "label": "Vihreä", + "description": "Asettaa vihreän ledin tason. Arvot ovat 0-255" + }, + "blue": { + "label": "Sininen", + "description": "Asettaa sinisen ledin tason. Arvot ovat 0-255" + } + }, + "audio": { + "title": "Ääniasetukset", + "description": "Äänimoduulin asetukset", + "codec2Enabled": { + "label": "Codec 2 käytössä", + "description": "Ota Codec 2 äänenkoodaus käyttöön" + }, + "pttPin": { + "label": "PTT pinni", + "description": "PTT:lle käytettävä GPIO-pinni" + }, + "bitrate": { + "label": "Tiedonsiirtonopeus", + "description": "Tiedonsiirtonopeus äänenkoodaukselle" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO-pinni jota käytetään i2S WS:ssä" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO-pinni jota käytetään i2S SD:ssä" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO-pinni jota käytetään i2S DIN:ssä" + }, + "i2sSck": { + "label": "i2S SD", + "description": "GPIO-pinni jota käytetään i2S SCK:ssa" + } + }, + "cannedMessage": { + "title": "Välitettyjen viestien asetukset", + "description": "Asetukset välitettyjen viestien moduulissa", + "moduleEnabled": { + "label": "Moduuli Käytössä", + "description": "Ota käyttöön välitetyt viestit" + }, + "rotary1Enabled": { + "label": "Kiertovalitsin #1 käytössä", + "description": "Ota kiertovalitsimen kooderi käyttöön" + }, + "inputbrokerPinA": { + "label": "Kooderin pinni A", + "description": "GPIO-pinni (1–39) kooderin portille A" + }, + "inputbrokerPinB": { + "label": "Kooderin pinni B", + "description": "GPIO-pinni (1–39) kooderin portille B" + }, + "inputbrokerPinPress": { + "label": "Kooderin pinni painallukselle", + "description": "GPIO-pinni (1–39) kooderin painallukselle" + }, + "inputbrokerEventCw": { + "label": "Myötäpäiväinen liike", + "description": "Valitse syöttötapahtuma." + }, + "inputbrokerEventCcw": { + "label": "Myötäpäiväisen liikkeen laskuri", + "description": "Valitse syöttötapahtuma." + }, + "inputbrokerEventPress": { + "label": "Painamisen tapahtuma", + "description": "Valitse syöttötapahtuma" + }, + "updown1Enabled": { + "label": "Ylös alas käytössä", + "description": "Ota käyttöön ylös / alas-suuntaa tunnistava kooderi" + }, + "allowInputSource": { + "label": "Salli syöttölaitteen lähde", + "description": "Valitse '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Lähetä äänimerkki", + "description": "Lähettää äänimerkkimerkin jokaisen viestin mukana" + } + }, + "detectionSensor": { + "title": "Tunnistinsensorin asetukset", + "description": "Tunnistinsensori-moduulin asetukset", + "enabled": { + "label": "Käytössä", + "description": "Ota käyttöön tai poista käytöstä tunnistinsensorin moduuli" + }, + "minimumBroadcastSecs": { + "label": "Minimilähetys (sekuntia)", + "description": "Aikaväli sekunteina kuinka usein viestejä voi lähettää mesh-verkkoon tilamuutoksen havaitsemisen jälkeen" + }, + "stateBroadcastSecs": { + "label": "Tilatiedon lähetys (sekuntia)", + "description": "Kuinka usein sekunteina lähetetään viesti mesh-verkkoon nykytilasta, vaikka tilassa ei olisi muutoksia" + }, + "sendBell": { + "label": "Lähetä äänimerkki", + "description": "Lähetä ASCII-äänimerkki hälytyssanoman mukana" + }, + "name": { + "label": "Käyttäjäystävälinen nimi", + "description": "Käytetään muotoilemaan mesh-verkkoon lähetettävä viesti, enintään 20 merkkiä" + }, + "monitorPin": { + "label": "Valvonta pinni", + "description": "GPIO-pinni valvonnan tilan muutoksien seurantaan" + }, + "detectionTriggerType": { + "label": "Tunnistuksen havaintotyyppi", + "description": "Käytettävän tunnistustapahtuman tyyppi" + }, + "usePullup": { + "label": "Käytä vetokytkintä (pullup)", + "description": "Käytetäänkö GPIO-pinnin INPUT_PULLUP-tilaa" + } + }, + "externalNotification": { + "title": "Ulkoisten ilmoituksien asetukset", + "description": "Määritä ulkoisten ilmoitusten moduulin asetukset", + "enabled": { + "label": "Moduuli käytössä", + "description": "Ota ulkoiset ilmoitukset käyttöön" + }, + "outputMs": { + "label": "Ulostulo MS", + "description": "Ulostulo MS" + }, + "output": { + "label": "Ulostulo", + "description": "Ulostulo" + }, + "outputVibra": { + "label": "Värinän ulostulo", + "description": "Värinän ulostulo" + }, + "outputBuzzer": { + "label": "Summerin ulostulo", + "description": "Summerin ulostulo" + }, + "active": { + "label": "Käytössä", + "description": "Käytössä" + }, + "alertMessage": { + "label": "Hälytysviesti", + "description": "Hälytysviesti" + }, + "alertMessageVibra": { + "label": "Hälytysviestin värinä", + "description": "Hälytysviestin värinä" + }, + "alertMessageBuzzer": { + "label": "Hälytysviestin summeri", + "description": "Hälytysviestin summeri" + }, + "alertBell": { + "label": "Hälytysääni", + "description": "Pitäisikö hälytyksen aktivoitua, kun vastaanotetaan äänimerkki?" + }, + "alertBellVibra": { + "label": "Hälytysäänen värinä", + "description": "Hälytysäänen värinä" + }, + "alertBellBuzzer": { + "label": "Hälytysäänen summeri", + "description": "Hälytysäänen summeri" + }, + "usePwm": { + "label": "Käytä PWM", + "description": "Käytä PWM" + }, + "nagTimeout": { + "label": "Toistokehotuksen aikakatkaisu", + "description": "Toistokehotuksen aikakatkaisu" + }, + "useI2sAsBuzzer": { + "label": "Use I²S pinniä summerille", + "description": "Määritä I²S-pinni summerin ulostuloon" + } + }, + "mqtt": { + "title": "MQTT-asetukset", + "description": "MQTT-moduulin asetukset", + "enabled": { + "label": "Käytössä", + "description": "Ota MQTT käyttöön tai poista se käytöstä" + }, + "address": { + "label": "MQTT-palvelimen osoite", + "description": "MQTT-palvelimen osoite, jota käytetään oletus- tai mukautetuissa palvelimissa" + }, + "username": { + "label": "MQTT käyttäjänimi", + "description": "MQTT käyttäjänimi, jota käytetään oletus- tai mukautetuissa palvelimissa" + }, + "password": { + "label": "MQTT salasana", + "description": "MQTT salasana, jota käytetään oletus- tai mukautetuissa palvelimissa" + }, + "encryptionEnabled": { + "label": "Salaus käytössä", + "description": "Ota MQTT-salaus käyttöön tai pois käytöstä. Huom: Jos tämä asetus ei ole käytössä, kaikki viestit lähetetään MQTT-välittäjälle salaamattomina, vaikka lähetyskanavillasi olisi salausavaimet asetettuna. Tämä koskee myös sijaintitietoja." + }, + "jsonEnabled": { + "label": "JSON käytössä", + "description": "Lähetetäänkö / otetaanko vastaan JSON-paketteja MQTT:llä" + }, + "tlsEnabled": { + "label": "TLS käytössä", + "description": "Ota TLS käyttöön tai poista se käytöstä" + }, + "root": { + "label": "Palvelimen osoite (root topic)", + "description": "MQTT-palvelimen osoite, jota käytetään oletus- tai mukautetuissa palvelimissa" + }, + "proxyToClientEnabled": { + "label": "MQTT-välityspalvelin käytössä", + "description": "Käyttää verkkoyhteyttä välittämään MQTT-viestejä asiakkaalle." + }, + "mapReportingEnabled": { + "label": "Karttaraportointi käytössä", + "description": "Laitteesi lähettää säännöllisin väliajoin salaamattoman karttaraporttipaketin määritettyyn MQTT-palvelimeen. Paketti sisältää tunnisteen, lyhyen ja pitkän nimen, likimääräisen sijainnin, laitteistomallin, roolin, laiteohjelmistoversion, LoRa-alueen, modeemin esiasetukset sekä ensisijaisen kanavan nimen." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Karttaraportoinnin aikaväli (s)", + "description": "Aikaväli sekunneissa karttaraporttien julkaisemiseksi" + }, + "positionPrecision": { + "label": "Arvioitu sijainti", + "description": "Jaetun sijainnin tarkkuus on tämän etäisyyden rajoissa", + "options": { + "metric_km23": "23 kilometrin säteellä", + "metric_km12": "12 kilometrin säteellä", + "metric_km5_8": "5,8 kilometrin säteellä", + "metric_km2_9": "2,9 kilometrin säteellä", + "metric_km1_5": "1,5 kilometrin säteellä", + "metric_m700": "700 metrin säteellä", + "metric_m350": "350 metrin säteellä", + "metric_m200": "200 metrin säteellä", + "metric_m90": "90 metrin säteellä", + "metric_m50": "50 metrin säteellä", + "imperial_mi15": "15 mailin säteellä", + "imperial_mi7_3": "7,3 mailin säteellä", + "imperial_mi3_6": "3,6 mailin säteellä", + "imperial_mi1_8": "1,8 mailin säteellä", + "imperial_mi0_9": "0,9 mailin säteellä", + "imperial_mi0_5": "0,5 mailin säteellä", + "imperial_mi0_2": "0,2 mailin säteellä", + "imperial_ft600": "600 jalan säteellä", + "imperial_ft300": "300 jalan säteellä", + "imperial_ft150": "150 jalan säteellä" + } + } + } + }, + "neighborInfo": { + "title": "Naapuritiedon asetukset", + "description": "Naapuritietojen moduulin asetukset", + "enabled": { + "label": "Käytössä", + "description": "Ota käyttöön tai poista käytöstä naapuruustietomoduuli" + }, + "updateInterval": { + "label": "Päivitysväli", + "description": "Aikaväli sekunneissa siitä, kuinka usein mesh-verkossa lähetetään naapuritietoja verkkoon" + } + }, + "paxcounter": { + "title": "Pax-laskurin asetukset", + "description": "Pax-laskurin moduulin asetukset", + "enabled": { + "label": "Moduuli käytössä", + "description": "Ota pax-laskuri käyttöön" + }, + "paxcounterUpdateInterval": { + "label": "Päivityksen aikaväli (sekuntia)", + "description": "Kuinka kauan odotetaan pax-laskurin pakettien lähettämisen välillä" + }, + "wifiThreshold": { + "label": "WiFi-RSSI kynnysarvo", + "description": "Millä WiFi RSSI tasolla laskurin täytyisi kasvaa. Oletus on -80." + }, + "bleThreshold": { + "label": "WiFi-RSSI kynnysarvo", + "description": "Millä BLE RSSI-arvolla laskuri kasvaa. Oletus: -80." + } + }, + "rangeTest": { + "title": "Kuuluvuustestin asetukset", + "description": "Kuuluvuustesti moduulin asetukset", + "enabled": { + "label": "Moduuli käytössä", + "description": "Ota kuuluvuustesti käytöön" + }, + "sender": { + "label": "Viestin aikaväli", + "description": "Kuinka kauan odotetaan testipakettien lähettämisen välillä" + }, + "save": { + "label": "Tallenna CSV tallennustilaan", + "description": "Vain ESP32" + } + }, + "serial": { + "title": "Sarjaliitännän asetukset", + "description": "Sarjaliitäntä-moduulin asetukset", + "enabled": { + "label": "Sarjaliitäntä käytössä", + "description": "Ota sarjaliitäntä käyttöön" + }, + "echo": { + "label": "Toista", + "description": "Kaikki lähettämäsi paketit toistetaan takaisin laitteellesi" + }, + "rxd": { + "label": "Vastaanota PIN-koodi", + "description": "Määritä GPIO-pinni käyttämään aiemmin asetettua RXD-pinniä." + }, + "txd": { + "label": "Lähetä PIN-koodi", + "description": "Määritä GPIO-pinni käyttämään aiemmin asetettua TXD-pinniä." + }, + "baud": { + "label": "Baud-siirtonopeus", + "description": "Sarjaliitännän baud-siirtonopeus" + }, + "timeout": { + "label": "Aikakatkaisu", + "description": "Kuinka monta sekuntia odotetaan, ennen kuin paketti merkitään valmiiksi" + }, + "mode": { + "label": "Tila", + "description": "Valitse tila" + }, + "overrideConsoleSerialPort": { + "label": "Ohita konsolin sarjaliitännän portti", + "description": "Jos sinulla on sarjaportti kytkettynä konsoliin, tämä ohittaa sen." + } + }, + "storeForward": { + "title": "Varastoi & välitä asetukset", + "description": "Varastoi & välitä moduulin asetukset", + "enabled": { + "label": "Moduuli käytössä", + "description": "Ota varastoi & välitä käyttöön" + }, + "heartbeat": { + "label": "Heartbeat käytössä", + "description": "Ota varastoi & välitä heartbeat käyttöön" + }, + "records": { + "label": "Kirjausten määrä", + "description": "Tallennettavien tietueiden määrä" + }, + "historyReturnMax": { + "label": "Historian maksimimäärä", + "description": "Enimmäismäärä tietueita palautettaviksi" + }, + "historyReturnWindow": { + "label": "Historian aikamäärä", + "description": "Enimmäismäärä tietueita palautettaviksi" + } + }, + "telemetry": { + "title": "Telemetrian asetukset", + "description": "Telemetria-moduulin asetukset", + "deviceUpdateInterval": { + "label": "Laitteen mittausloki", + "description": "Laitteen mittaustietojen päivitysväli (sekuntia)" + }, + "environmentUpdateInterval": { + "label": "Ympäristötietojen päivitysväli (sekuntia)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Moduuli käytössä", + "description": "Ota käyttöön ympäristön telemetria" + }, + "environmentScreenEnabled": { + "label": "Näytetään näytöllä", + "description": "Näytä moduulin telemetriatiedot OLED-näytöllä" + }, + "environmentDisplayFahrenheit": { + "label": "Näytä fahrenheitissa", + "description": "Näytä lämpötila fahrenheitissa" + }, + "airQualityEnabled": { + "label": "Ilmanlaatu käytössä", + "description": "Ota ilmanlaadun telemetria käyttöön" + }, + "airQualityInterval": { + "label": "Ilmanlaadun päivitysväli", + "description": "Kuinka usein ilmanlaadun tiedot lähetetään mesh-verkon kautta" + }, + "powerMeasurementEnabled": { + "label": "Tehomittaus käytössä", + "description": "Ota tehomittauksen telemetria käyttöön" + }, + "powerUpdateInterval": { + "label": "Tehomittauksen päivitysväli", + "description": "Kuinka usein tehomittauksen tiedot lähetetään mesh-verkon kautta" + }, + "powerScreenEnabled": { + "label": "Tehomittauksen näyttö käytössä", + "description": "Ota tehomittauksen telemetrian näyttö käyttöön" + } + } } diff --git a/packages/web/public/i18n/locales/fi-FI/nodes.json b/packages/web/public/i18n/locales/fi-FI/nodes.json index 40acfbb4..3f0ed0c2 100644 --- a/packages/web/public/i18n/locales/fi-FI/nodes.json +++ b/packages/web/public/i18n/locales/fi-FI/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Julkinen avain käytössä" - }, - "noPublicKey": { - "label": "Ei julkinen avain" - }, - "directMessage": { - "label": "Suora Viesti {{shortName}}" - }, - "favorite": { - "label": "Suosikki", - "tooltip": "Lisää tai poista tämä laite suosikeistasi" - }, - "notFavorite": { - "label": "Ei suosikki" - }, - "error": { - "label": "Virhe", - "text": "Tapahtui virhe haettaessa laitteen tietoja. Yritä uudelleen myöhemmin." - }, - "status": { - "heard": "Kuultu", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Korkeus" - }, - "channelUtil": { - "label": "Kanavan käyttö" - }, - "airtimeUtil": { - "label": "Lähetysajan käyttö" - } - }, - "nodesTable": { - "headings": { - "longName": "Pitkä nimi", - "connection": "Yhteys", - "lastHeard": "Viimeksi kuultu", - "encryption": "Salaus", - "model": "Malli", - "macAddress": "MAC-osoite" - }, - "connectionStatus": { - "direct": "Suora", - "away": "poissa", - "unknown": "-", - "viaMqtt": ", MQTT välityksellä" - }, - "lastHeardStatus": { - "never": "Ei koskaan" - } - }, - "actions": { - "added": "Lisätty", - "removed": "Poistettu", - "ignoreNode": "Älä huomioi laitetta", - "unignoreNode": "Huomioi laite uudelleen", - "requestPosition": "Pyydä sijaintia" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Julkinen avain käytössä" + }, + "noPublicKey": { + "label": "Ei julkinen avain" + }, + "directMessage": { + "label": "Suora Viesti {{shortName}}" + }, + "favorite": { + "label": "Suosikki", + "tooltip": "Lisää tai poista tämä laite suosikeistasi" + }, + "notFavorite": { + "label": "Ei suosikki" + }, + "error": { + "label": "Virhe", + "text": "Tapahtui virhe haettaessa laitteen tietoja. Yritä uudelleen myöhemmin." + }, + "status": { + "heard": "Kuultu", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Korkeus" + }, + "channelUtil": { + "label": "Kanavan käyttö" + }, + "airtimeUtil": { + "label": "Lähetysajan käyttö" + } + }, + "nodesTable": { + "headings": { + "longName": "Pitkä nimi", + "connection": "Yhteys", + "lastHeard": "Viimeksi kuultu", + "encryption": "Salaus", + "model": "Malli", + "macAddress": "MAC-osoite" + }, + "connectionStatus": { + "direct": "Suora", + "away": "poissa", + "unknown": "-", + "viaMqtt": ", MQTT välityksellä" + }, + "lastHeardStatus": { + "never": "Ei koskaan" + } + }, + "actions": { + "added": "Lisätty", + "removed": "Poistettu", + "ignoreNode": "Älä huomioi laitetta", + "unignoreNode": "Huomioi laite uudelleen", + "requestPosition": "Pyydä sijaintia" + } } diff --git a/packages/web/public/i18n/locales/fi-FI/ui.json b/packages/web/public/i18n/locales/fi-FI/ui.json index 77c15c9d..d77363e7 100644 --- a/packages/web/public/i18n/locales/fi-FI/ui.json +++ b/packages/web/public/i18n/locales/fi-FI/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigointi", - "messages": "Viestit", - "map": "Kartta", - "config": "Asetukset", - "radioConfig": "Radion asetukset", - "moduleConfig": "Moduulin asetukset", - "channels": "Kanavat", - "nodes": "Laitteet" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Avaa sivupalkki", - "close": "Sulje sivupalkki" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volttia", - "firmware": { - "title": "Laiteohjelmisto", - "version": "v{{version}}", - "buildDate": "Koontipäivä: {{date}}" - }, - "deviceName": { - "title": "Laitteen nimi", - "changeName": "Vaihda laitteen nimi", - "placeholder": "Anna laitteelle nimi" - }, - "editDeviceName": "Muokkaa laitteen nimeä" - } - }, - "batteryStatus": { - "charging": "{{level}} % latauksessa", - "pluggedIn": "Kytketty verkkovirtaan", - "title": "Akku" - }, - "search": { - "nodes": "Etsi laitteita...", - "channels": "Etsi kanavia...", - "commandPalette": "Etsi komentoja..." - }, - "toast": { - "positionRequestSent": { - "title": "Sijaintipyyntö lähetetty." - }, - "requestingPosition": { - "title": "Pyydetään sijaintia, odota..." - }, - "sendingTraceroute": { - "title": "Reitinselvitys lähetetty, odota..." - }, - "tracerouteSent": { - "title": "Reitinselvitys lähetetty." - }, - "savedChannel": { - "title": "Tallennettu Kanava: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Keskustelu käyttää PKI-salausta." - }, - "pskEncryption": { - "title": "Keskustelu käyttää PKI-salausta." - } - }, - "configSaveError": { - "title": "Virhe asetusten tallentamisessa", - "description": "Asetusten tallennuksessa tapahtui virhe." - }, - "validationError": { - "title": "Asetuksissa on virheitä", - "description": "Ole hyvä ja korjaa asetusvirheet ennen tallentamista." - }, - "saveSuccess": { - "title": "Tallennetaan asetukset", - "description": "Asetuksien muutos {{case}} on tallennettu." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} suosikit.", - "action": { - "added": "Lisätty", - "removed": "Poistettu", - "to": "saakka", - "from": "alkaen" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} estolista", - "action": { - "added": "Lisätty", - "removed": "Poistettu", - "to": "saakka", - "from": "alkaen" - } - } - }, - "notifications": { - "copied": { - "label": "Kopioitu!" - }, - "copyToClipboard": { - "label": "Kopioi leikepöydälle" - }, - "hidePassword": { - "label": "Piilota salasana" - }, - "showPassword": { - "label": "Näytä salasana" - }, - "deliveryStatus": { - "delivered": "Toimitettu", - "failed": "Toimitus epäonnistui", - "waiting": "Odottaa", - "unknown": "Tuntematon" - } - }, - "general": { - "label": "Yleinen" - }, - "hardware": { - "label": "Laite" - }, - "metrics": { - "label": "Mittaustiedot" - }, - "role": { - "label": "Rooli" - }, - "filter": { - "label": "Suodatus" - }, - "advanced": { - "label": "Lisäasetukset" - }, - "clearInput": { - "label": "Tyhjennä kenttä" - }, - "resetFilters": { - "label": "Tyhjennä suodattimet" - }, - "nodeName": { - "label": "Laitteen nimi tai numero", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Ajan käyttöaste (%)" - }, - "batteryLevel": { - "label": "Akun varaus (%)", - "labelText": "Akun varaus (%): {{value}}" - }, - "batteryVoltage": { - "label": "Akun jännite (V)", - "title": "Jännite" - }, - "channelUtilization": { - "label": "Kanavan käyttö (%)" - }, - "hops": { - "direct": "Suora", - "label": "Hyppyjen määrä", - "text": "Hyppyjen määrä: {{value}}" - }, - "lastHeard": { - "label": "Viimeksi kuultu", - "labelText": "Viimeksi kuultu: {{value}}", - "nowLabel": "Nyt" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Suosikit" - }, - "hide": { - "label": "Piilota" - }, - "showOnly": { - "label": "Näytä pelkästään" - }, - "viaMqtt": { - "label": "Yhdistetty MQTT-yhteydellä" - }, - "hopsUnknown": { - "label": "Tuntematon määrä hyppyjä" - }, - "showUnheard": { - "label": "Ei koskaan kuultu" - }, - "language": { - "label": "Kieli", - "changeLanguage": "Vaihda kieli" - }, - "theme": { - "dark": "Tumma", - "light": "Vaalea", - "system": "Automaattinen", - "changeTheme": "Vaihda väriteema" - }, - "errorPage": { - "title": "Tämä on hieman noloa...", - "description1": "Pahoittelemme, mutta verkkosovelluksessa tapahtui virhe, joka aiheutti kaatumisen.
\nTällaista ei pitäisi tapahtua ja me työskentelemme ahkerasti ongelman korjaamiseksi.", - "description2": "Paras tapa estää tämän tapahtuminen uudelleen sinulle tai kenellekään muulle, on ilmoittaa meille ongelmasta.", - "reportInstructions": "Lisääthän raporttiisi seuraavat tiedot:", - "reportSteps": { - "step1": "Mitä olit tekemässä virheen tapahtuessa", - "step2": "Mitä odotit tapahtuvan", - "step3": "Mitä todellisuudessa tapahtui", - "step4": "Muut mahdollisesti oleelliset tiedot" - }, - "reportLink": "Voit raportoida ongelmasta <0>GitHubissa", - "dashboardLink": "Palaa takaisin <0>hallintapaneeliin", - "detailsSummary": "Virheen tiedot", - "errorMessageLabel": "Virheilmoitus:", - "stackTraceLabel": "Virheen jäljityslista:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® on Meshtastic LLC:n rekisteröity tavaramerkki. | <1>Oikeudelliset tiedot", - "commitSha": "Ohjelmistokehitysversion SHA-tunniste: {{sha}}" - } + "navigation": { + "title": "Navigointi", + "messages": "Viestit", + "map": "Kartta", + "config": "Asetukset", + "radioConfig": "Radion asetukset", + "moduleConfig": "Moduulin asetukset", + "channels": "Kanavat", + "nodes": "Laitteet" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Avaa sivupalkki", + "close": "Sulje sivupalkki" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volttia", + "firmware": { + "title": "Laiteohjelmisto", + "version": "v{{version}}", + "buildDate": "Koontipäivä: {{date}}" + }, + "deviceName": { + "title": "Laitteen nimi", + "changeName": "Vaihda laitteen nimi", + "placeholder": "Anna laitteelle nimi" + }, + "editDeviceName": "Muokkaa laitteen nimeä" + } + }, + "batteryStatus": { + "charging": "{{level}} % latauksessa", + "pluggedIn": "Kytketty verkkovirtaan", + "title": "Akku" + }, + "search": { + "nodes": "Etsi laitteita...", + "channels": "Etsi kanavia...", + "commandPalette": "Etsi komentoja..." + }, + "toast": { + "positionRequestSent": { + "title": "Sijaintipyyntö lähetetty." + }, + "requestingPosition": { + "title": "Pyydetään sijaintia, odota..." + }, + "sendingTraceroute": { + "title": "Reitinselvitys lähetetty, odota..." + }, + "tracerouteSent": { + "title": "Reitinselvitys lähetetty." + }, + "savedChannel": { + "title": "Tallennettu Kanava: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Keskustelu käyttää PKI-salausta." + }, + "pskEncryption": { + "title": "Keskustelu käyttää PKI-salausta." + } + }, + "configSaveError": { + "title": "Virhe asetusten tallentamisessa", + "description": "Asetusten tallennuksessa tapahtui virhe." + }, + "validationError": { + "title": "Asetuksissa on virheitä", + "description": "Ole hyvä ja korjaa asetusvirheet ennen tallentamista." + }, + "saveSuccess": { + "title": "Tallennetaan asetukset", + "description": "Asetuksien muutos {{case}} on tallennettu." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} suosikit.", + "action": { + "added": "Lisätty", + "removed": "Poistettu", + "to": "saakka", + "from": "alkaen" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} estolista", + "action": { + "added": "Lisätty", + "removed": "Poistettu", + "to": "saakka", + "from": "alkaen" + } + } + }, + "notifications": { + "copied": { + "label": "Kopioitu!" + }, + "copyToClipboard": { + "label": "Kopioi leikepöydälle" + }, + "hidePassword": { + "label": "Piilota salasana" + }, + "showPassword": { + "label": "Näytä salasana" + }, + "deliveryStatus": { + "delivered": "Toimitettu", + "failed": "Toimitus epäonnistui", + "waiting": "Odottaa", + "unknown": "Tuntematon" + } + }, + "general": { + "label": "Yleinen" + }, + "hardware": { + "label": "Laite" + }, + "metrics": { + "label": "Mittaustiedot" + }, + "role": { + "label": "Rooli" + }, + "filter": { + "label": "Suodatus" + }, + "advanced": { + "label": "Lisäasetukset" + }, + "clearInput": { + "label": "Tyhjennä kenttä" + }, + "resetFilters": { + "label": "Tyhjennä suodattimet" + }, + "nodeName": { + "label": "Laitteen nimi tai numero", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Ajan käyttöaste (%)" + }, + "batteryLevel": { + "label": "Akun varaus (%)", + "labelText": "Akun varaus (%): {{value}}" + }, + "batteryVoltage": { + "label": "Akun jännite (V)", + "title": "Jännite" + }, + "channelUtilization": { + "label": "Kanavan käyttö (%)" + }, + "hops": { + "direct": "Suora", + "label": "Hyppyjen määrä", + "text": "Hyppyjen määrä: {{value}}" + }, + "lastHeard": { + "label": "Viimeksi kuultu", + "labelText": "Viimeksi kuultu: {{value}}", + "nowLabel": "Nyt" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Suosikit" + }, + "hide": { + "label": "Piilota" + }, + "showOnly": { + "label": "Näytä pelkästään" + }, + "viaMqtt": { + "label": "Yhdistetty MQTT-yhteydellä" + }, + "hopsUnknown": { + "label": "Tuntematon määrä hyppyjä" + }, + "showUnheard": { + "label": "Ei koskaan kuultu" + }, + "language": { + "label": "Kieli", + "changeLanguage": "Vaihda kieli" + }, + "theme": { + "dark": "Tumma", + "light": "Vaalea", + "system": "Automaattinen", + "changeTheme": "Vaihda väriteema" + }, + "errorPage": { + "title": "Tämä on hieman noloa...", + "description1": "Pahoittelemme, mutta verkkosovelluksessa tapahtui virhe, joka aiheutti kaatumisen.
\nTällaista ei pitäisi tapahtua ja me työskentelemme ahkerasti ongelman korjaamiseksi.", + "description2": "Paras tapa estää tämän tapahtuminen uudelleen sinulle tai kenellekään muulle, on ilmoittaa meille ongelmasta.", + "reportInstructions": "Lisääthän raporttiisi seuraavat tiedot:", + "reportSteps": { + "step1": "Mitä olit tekemässä virheen tapahtuessa", + "step2": "Mitä odotit tapahtuvan", + "step3": "Mitä todellisuudessa tapahtui", + "step4": "Muut mahdollisesti oleelliset tiedot" + }, + "reportLink": "Voit raportoida ongelmasta <0>GitHubissa", + "dashboardLink": "Palaa takaisin <0>hallintapaneeliin", + "detailsSummary": "Virheen tiedot", + "errorMessageLabel": "Virheilmoitus:", + "stackTraceLabel": "Virheen jäljityslista:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® on Meshtastic LLC:n rekisteröity tavaramerkki. | <1>Oikeudelliset tiedot", + "commitSha": "Ohjelmistokehitysversion SHA-tunniste: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/fr-FR/channels.json b/packages/web/public/i18n/locales/fr-FR/channels.json index 45c4d611..c0f5bb1e 100644 --- a/packages/web/public/i18n/locales/fr-FR/channels.json +++ b/packages/web/public/i18n/locales/fr-FR/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Canaux", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Principal", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Paramètres du canal", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Rôle", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Nom", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Canaux", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Principal", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Paramètres du canal", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Rôle", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Nom", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/commandPalette.json b/packages/web/public/i18n/locales/fr-FR/commandPalette.json index dcf72f2d..15762aba 100644 --- a/packages/web/public/i18n/locales/fr-FR/commandPalette.json +++ b/packages/web/public/i18n/locales/fr-FR/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Messages", - "map": "Carte", - "config": "Config", - "channels": "Canaux", - "nodes": "Noeuds" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Import", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Messages", + "map": "Carte", + "config": "Config", + "channels": "Canaux", + "nodes": "Noeuds" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Import", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/common.json b/packages/web/public/i18n/locales/fr-FR/common.json index 00196840..cb258e15 100644 --- a/packages/web/public/i18n/locales/fr-FR/common.json +++ b/packages/web/public/i18n/locales/fr-FR/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Appliquer", - "backupKey": "Backup Key", - "cancel": "Annuler", - "clearMessages": "Clear Messages", - "close": "Fermer", - "confirm": "Confirm", - "delete": "Effacer", - "dismiss": "Annuler", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Message", - "now": "Now", - "ok": "D'accord", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Supprimer", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Réinitialiser", - "save": "Sauvegarder", - "scanQr": "Scan QR Code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Inconnu", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Appliquer", + "backupKey": "Backup Key", + "cancel": "Annuler", + "clearMessages": "Clear Messages", + "close": "Fermer", + "confirm": "Confirm", + "delete": "Effacer", + "dismiss": "Annuler", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Message", + "now": "Now", + "ok": "D'accord", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Supprimer", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Réinitialiser", + "save": "Sauvegarder", + "scanQr": "Scan QR Code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Inconnu", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/dashboard.json b/packages/web/public/i18n/locales/fr-FR/dashboard.json index 3ad917f9..d4d332e2 100644 --- a/packages/web/public/i18n/locales/fr-FR/dashboard.json +++ b/packages/web/public/i18n/locales/fr-FR/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Série", - "connectionType_network": "Réseau", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Série", + "connectionType_network": "Réseau", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/fr-FR/deviceConfig.json b/packages/web/public/i18n/locales/fr-FR/deviceConfig.json index d98bc2a7..5d5a95ab 100644 --- a/packages/web/public/i18n/locales/fr-FR/deviceConfig.json +++ b/packages/web/public/i18n/locales/fr-FR/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Appareil", - "tabDisplay": "Écran", - "tabLora": "LoRa", - "tabNetwork": "Réseau", - "tabPosition": "Position", - "tabPower": "Alimentation", - "tabSecurity": "Sécurité" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "Zone horaire POSIX" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Rôle" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Activé" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Mode d'appariement" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bande Passante" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignorer MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK vers MQTT" - }, - "overrideDutyCycle": { - "description": "Ne pas prendre en compte la limite d'utilisation", - "label": "Ne pas prendre en compte la limite d'utilisation" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Région" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Activé" - }, - "gateway": { - "description": "Default Gateway", - "label": "Passerelle" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Sous-réseau" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Activé" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Configuration UDP" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Horodatage", - "unset": "Désactivé", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Activer le mode économie d'énergie" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Configuration de l'alimentation" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Clé privée" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Clé publique" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Appareil", + "tabDisplay": "Écran", + "tabLora": "LoRa", + "tabNetwork": "Réseau", + "tabPosition": "Position", + "tabPower": "Alimentation", + "tabSecurity": "Sécurité" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "Zone horaire POSIX" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Rôle" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Activé" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Mode d'appariement" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bande Passante" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignorer MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK vers MQTT" + }, + "overrideDutyCycle": { + "description": "Ne pas prendre en compte la limite d'utilisation", + "label": "Ne pas prendre en compte la limite d'utilisation" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Région" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Activé" + }, + "gateway": { + "description": "Default Gateway", + "label": "Passerelle" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Sous-réseau" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Activé" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Configuration UDP" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Horodatage", + "unset": "Désactivé", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Activer le mode économie d'énergie" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Configuration de l'alimentation" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Clé privée" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Clé publique" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/dialog.json b/packages/web/public/i18n/locales/fr-FR/dialog.json index 3440a37d..a38fb8f9 100644 --- a/packages/web/public/i18n/locales/fr-FR/dialog.json +++ b/packages/web/public/i18n/locales/fr-FR/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Série", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Message", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Tension", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Générer un QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Êtes-vous sûr ?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Êtes-vous sûr ?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Série", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Message", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Tension", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Générer un QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Êtes-vous sûr ?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Êtes-vous sûr ?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/fr-FR/messages.json b/packages/web/public/i18n/locales/fr-FR/messages.json index 0eb7d37b..12ed707d 100644 --- a/packages/web/public/i18n/locales/fr-FR/messages.json +++ b/packages/web/public/i18n/locales/fr-FR/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Envoyer" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Répondre" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Envoyer" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Répondre" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/moduleConfig.json b/packages/web/public/i18n/locales/fr-FR/moduleConfig.json index c9675a27..24297082 100644 --- a/packages/web/public/i18n/locales/fr-FR/moduleConfig.json +++ b/packages/web/public/i18n/locales/fr-FR/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Lumière ambiante", - "tabAudio": "Audio", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Capteur de détection", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Informations sur les voisins", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Test de portée", - "tabSerial": "Série", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Télémetrie (Capteurs)" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Actif", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Rouge", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Vert", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Bleu", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Activé", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Activé", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Sujet principal", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Activé", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Écho", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Délai d'expiration", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Nombre d'enregistrements", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Intervalle de mise à jour des métriques de l'appareil (secondes)" - }, - "environmentUpdateInterval": { - "label": "Intervalle de mise à jour des métriques d'environnement (secondes)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Lumière ambiante", + "tabAudio": "Audio", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Capteur de détection", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Informations sur les voisins", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Test de portée", + "tabSerial": "Série", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Télémetrie (Capteurs)" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Actif", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Rouge", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Vert", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Bleu", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Activé", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Activé", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Sujet principal", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Activé", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Écho", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Délai d'expiration", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Nombre d'enregistrements", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Intervalle de mise à jour des métriques de l'appareil (secondes)" + }, + "environmentUpdateInterval": { + "label": "Intervalle de mise à jour des métriques d'environnement (secondes)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/fr-FR/nodes.json b/packages/web/public/i18n/locales/fr-FR/nodes.json index 07375418..591c7e29 100644 --- a/packages/web/public/i18n/locales/fr-FR/nodes.json +++ b/packages/web/public/i18n/locales/fr-FR/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favoris", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Erreur", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Capté", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Direk", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favoris", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Erreur", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Capté", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Direk", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/fr-FR/ui.json b/packages/web/public/i18n/locales/fr-FR/ui.json index 0d14f2bf..1b6fac74 100644 --- a/packages/web/public/i18n/locales/fr-FR/ui.json +++ b/packages/web/public/i18n/locales/fr-FR/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Messages", - "map": "Carte", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Canaux", - "nodes": "Noeuds" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Batterie" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Masquer le mot de passe" - }, - "showPassword": { - "label": "Afficher le mot de passe" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "En attente . . .", - "unknown": "Inconnu" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Matériel" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Rôle" - }, - "filter": { - "label": "Filtre" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Tension" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Direk", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Dernière écoute", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Langue", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Sombre", - "light": "Clair", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Messages", + "map": "Carte", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Canaux", + "nodes": "Noeuds" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Batterie" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Masquer le mot de passe" + }, + "showPassword": { + "label": "Afficher le mot de passe" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "En attente . . .", + "unknown": "Inconnu" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Matériel" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Rôle" + }, + "filter": { + "label": "Filtre" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Tension" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Direk", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Dernière écoute", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Langue", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Sombre", + "light": "Clair", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/it-IT/channels.json b/packages/web/public/i18n/locales/it-IT/channels.json index 5f3480d9..168490fd 100644 --- a/packages/web/public/i18n/locales/it-IT/channels.json +++ b/packages/web/public/i18n/locales/it-IT/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Canali", - "channelName": "Canale {{channelName}}", - "broadcastLabel": "Principale", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Per favore inserisci un PSK valido di {{bits}} bit." - }, - "settings": { - "label": "Impostazioni Canale", - "description": "Impostazioni di Crypto, MQTT e varie" - }, - "role": { - "label": "Ruolo", - "description": "La telemetria del dispositivo è inviata su PRIMARIO. Solo un PRIMARIO è consentito", - "options": { - "primary": "PRIMARIO", - "disabled": "DISABILITATO", - "secondary": "SECONDARIO" - } - }, - "psk": { - "label": "Chiave Pre-Condivisa", - "description": "Lunghezze PSK supportate: 256-bit, 128-bit, 8-bit, Vuoto (0-bit)", - "generate": "Genera" - }, - "name": { - "label": "Nome", - "description": "Un nome univoco per il canale <12 byte, lascia vuoto per default" - }, - "uplinkEnabled": { - "label": "Uplink Abilitato", - "description": "Invia messaggi dalla mesh locale a MQTT" - }, - "downlinkEnabled": { - "label": "Uplink Abilitato", - "description": "Invia messaggi da MQTT alla mesh locale" - }, - "positionPrecision": { - "label": "Posizione", - "description": "La precisione della posizione da condividere con il canale. Può essere disabilitata.", - "options": { - "none": "Non condividere la posizione", - "precise": "Posizione precisa", - "metric_km23": "Entro 23 chilometri", - "metric_km12": "Entro 12 chilometri", - "metric_km5_8": "Entro 5,8 chilometri", - "metric_km2_9": "Entro 2,9 chilometri", - "metric_km1_5": "Entro 1,5 chilometri", - "metric_m700": "Entro 700 metri", - "metric_m350": "Entro 350 metri", - "metric_m200": "Entro 200 metri", - "metric_m90": "Entro 90 metri", - "metric_m50": "Entro 50 metri", - "imperial_mi15": "Entro 15 miglia", - "imperial_mi7_3": "Entro 7,3 miglia", - "imperial_mi3_6": "Entro 3,6 miglia", - "imperial_mi1_8": "Entro 1,8 miglia", - "imperial_mi0_9": "Entro 0,9 miglia", - "imperial_mi0_5": "Entro 0,5 miglia", - "imperial_mi0_2": "Entro 0,2 miglia", - "imperial_ft600": "Entro 600 piedi", - "imperial_ft300": "Entro 300 piedi", - "imperial_ft150": "Entro 150 piedi" - } - } + "page": { + "sectionLabel": "Canali", + "channelName": "Canale {{channelName}}", + "broadcastLabel": "Principale", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Per favore inserisci un PSK valido di {{bits}} bit." + }, + "settings": { + "label": "Impostazioni Canale", + "description": "Impostazioni di Crypto, MQTT e varie" + }, + "role": { + "label": "Ruolo", + "description": "La telemetria del dispositivo è inviata su PRIMARIO. Solo un PRIMARIO è consentito", + "options": { + "primary": "PRIMARIO", + "disabled": "DISABILITATO", + "secondary": "SECONDARIO" + } + }, + "psk": { + "label": "Chiave Pre-Condivisa", + "description": "Lunghezze PSK supportate: 256-bit, 128-bit, 8-bit, Vuoto (0-bit)", + "generate": "Genera" + }, + "name": { + "label": "Nome", + "description": "Un nome univoco per il canale <12 byte, lascia vuoto per default" + }, + "uplinkEnabled": { + "label": "Uplink Abilitato", + "description": "Invia messaggi dalla mesh locale a MQTT" + }, + "downlinkEnabled": { + "label": "Uplink Abilitato", + "description": "Invia messaggi da MQTT alla mesh locale" + }, + "positionPrecision": { + "label": "Posizione", + "description": "La precisione della posizione da condividere con il canale. Può essere disabilitata.", + "options": { + "none": "Non condividere la posizione", + "precise": "Posizione precisa", + "metric_km23": "Entro 23 chilometri", + "metric_km12": "Entro 12 chilometri", + "metric_km5_8": "Entro 5,8 chilometri", + "metric_km2_9": "Entro 2,9 chilometri", + "metric_km1_5": "Entro 1,5 chilometri", + "metric_m700": "Entro 700 metri", + "metric_m350": "Entro 350 metri", + "metric_m200": "Entro 200 metri", + "metric_m90": "Entro 90 metri", + "metric_m50": "Entro 50 metri", + "imperial_mi15": "Entro 15 miglia", + "imperial_mi7_3": "Entro 7,3 miglia", + "imperial_mi3_6": "Entro 3,6 miglia", + "imperial_mi1_8": "Entro 1,8 miglia", + "imperial_mi0_9": "Entro 0,9 miglia", + "imperial_mi0_5": "Entro 0,5 miglia", + "imperial_mi0_2": "Entro 0,2 miglia", + "imperial_ft600": "Entro 600 piedi", + "imperial_ft300": "Entro 300 piedi", + "imperial_ft150": "Entro 150 piedi" + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/commandPalette.json b/packages/web/public/i18n/locales/it-IT/commandPalette.json index 9f80b57e..c730ffe9 100644 --- a/packages/web/public/i18n/locales/it-IT/commandPalette.json +++ b/packages/web/public/i18n/locales/it-IT/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "Nessun risultato trovato.", - "page": { - "title": "Menu Comandi" - }, - "pinGroup": { - "label": "Fissa gruppo comandi" - }, - "unpinGroup": { - "label": "Rimuovi gruppo comandi" - }, - "goto": { - "label": "Vai a", - "command": { - "messages": "Messaggi", - "map": "Mappa", - "config": "Configurazione", - "channels": "Canali", - "nodes": "Nodi" - } - }, - "manage": { - "label": "Gestisci", - "command": { - "switchNode": "Cambia Nodo", - "connectNewNode": "Connetti Nuovo Nodo" - } - }, - "contextual": { - "label": "Contestuale", - "command": { - "qrCode": "Codice QR", - "qrGenerator": "Generatore", - "qrImport": "Importa", - "scheduleShutdown": "Pianifica Spegnimento", - "scheduleReboot": "Pianifica Riavvio", - "rebootToOtaMode": "Riavvia In Modalità OTA", - "resetNodeDb": "Resetta DB dei Nodi", - "factoryResetDevice": "Factory reset dispositivo", - "factoryResetConfig": "Factory reset impostazioni" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Riconfigura", - "clearAllStoredMessages": "Cancella Tutti i Messaggi Memorizzati" - } - } + "emptyState": "Nessun risultato trovato.", + "page": { + "title": "Menu Comandi" + }, + "pinGroup": { + "label": "Fissa gruppo comandi" + }, + "unpinGroup": { + "label": "Rimuovi gruppo comandi" + }, + "goto": { + "label": "Vai a", + "command": { + "messages": "Messaggi", + "map": "Mappa", + "config": "Configurazione", + "channels": "Canali", + "nodes": "Nodi" + } + }, + "manage": { + "label": "Gestisci", + "command": { + "switchNode": "Cambia Nodo", + "connectNewNode": "Connetti Nuovo Nodo" + } + }, + "contextual": { + "label": "Contestuale", + "command": { + "qrCode": "Codice QR", + "qrGenerator": "Generatore", + "qrImport": "Importa", + "scheduleShutdown": "Pianifica Spegnimento", + "scheduleReboot": "Pianifica Riavvio", + "rebootToOtaMode": "Riavvia In Modalità OTA", + "resetNodeDb": "Resetta DB dei Nodi", + "factoryResetDevice": "Factory reset dispositivo", + "factoryResetConfig": "Factory reset impostazioni" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Riconfigura", + "clearAllStoredMessages": "Cancella Tutti i Messaggi Memorizzati" + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/common.json b/packages/web/public/i18n/locales/it-IT/common.json index f8664c86..e2611036 100644 --- a/packages/web/public/i18n/locales/it-IT/common.json +++ b/packages/web/public/i18n/locales/it-IT/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Applica", - "backupKey": "Backup della chiave", - "cancel": "Annulla", - "clearMessages": "Cancella Messaggi", - "close": "Chiudi", - "confirm": "Conferma", - "delete": "Elimina", - "dismiss": "Annulla", - "download": "Scarica", - "export": "Esporta", - "generate": "Genera", - "regenerate": "Rigenera", - "import": "Importa", - "message": "Messaggio", - "now": "Adesso", - "ok": "Ok", - "print": "Stampa", - "rebootOtaNow": "Riavvia ora in modalità OTA", - "remove": "Elimina", - "requestNewKeys": "Richiedi Nuove Chiavi", - "requestPosition": "Richiedi posizione", - "reset": "Reset", - "save": "Salva", - "scanQr": "Scansiona codice QR", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Caricamento in corso...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "A {{count}} hop di distanza", - "plural": "A {{count}} hop di distanza", - "unknown": "Hop sconosciuti" - }, - "megahertz": "MHz", - "raw": "grezzo", - "meter": { - "one": "Metro", - "plural": "Metri", - "suffix": "m" - }, - "minute": { - "one": "Minuto", - "plural": "Minuti" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecondo", - "plural": "Millisecondi", - "suffix": "ms" - }, - "second": { - "one": "Secondo", - "plural": "Secondi" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volt", - "suffix": "V" - }, - "record": { - "one": "Record", - "plural": "Record" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Sconosciuto", - "shortName": "SCON", - "notAvailable": "N/D", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "ANNULLA", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Troppo lungo, atteso minore o uguale a {{maximum}} caratteri.", - "number": "Troppo grande, ci si aspetta un numero minore o uguale a {{maximum}}.", - "bytes": "Troppo grande, atteso inferiore o uguale a {{params.maximum}} byte." - }, - "tooSmall": { - "string": "Troppo breve, atteso più di o uguale a {{minimum}} caratteri.", - "number": "Troppo piccolo, atteso un numero maggiore o uguale a {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Formato non valido, previsto un indirizzo IPv4.", - "key": "Formato non valido, prevista una chiave pre-condivisa codificata Base64 (PSK)." - }, - "invalidType": { - "number": "Tipo non valido, atteso un numero." - }, - "pskLength": { - "0bit": "La chiave deve essere vuota.", - "8bit": "La chiave deve essere una chiave pre-condivisa a 8 bit (PSK).", - "128bit": "La chiave deve essere una chiave pre-condivisa a 128 bit (PSK).", - "256bit": "La chiave deve essere una chiave pre-condivisa a 256 bit (PSK)." - }, - "required": { - "generic": "Questo campo è obbligatorio.", - "managed": "Se il nodo è gestito, è richiesta almeno una chiave amministrativa.", - "key": "La chiave è obbligatoria." - } - } + "button": { + "apply": "Applica", + "backupKey": "Backup della chiave", + "cancel": "Annulla", + "clearMessages": "Cancella Messaggi", + "close": "Chiudi", + "confirm": "Conferma", + "delete": "Elimina", + "dismiss": "Annulla", + "download": "Scarica", + "export": "Esporta", + "generate": "Genera", + "regenerate": "Rigenera", + "import": "Importa", + "message": "Messaggio", + "now": "Adesso", + "ok": "Ok", + "print": "Stampa", + "rebootOtaNow": "Riavvia ora in modalità OTA", + "remove": "Elimina", + "requestNewKeys": "Richiedi Nuove Chiavi", + "requestPosition": "Richiedi posizione", + "reset": "Reset", + "save": "Salva", + "scanQr": "Scansiona codice QR", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Caricamento in corso...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "A {{count}} hop di distanza", + "plural": "A {{count}} hop di distanza", + "unknown": "Hop sconosciuti" + }, + "megahertz": "MHz", + "raw": "grezzo", + "meter": { + "one": "Metro", + "plural": "Metri", + "suffix": "m" + }, + "minute": { + "one": "Minuto", + "plural": "Minuti" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecondo", + "plural": "Millisecondi", + "suffix": "ms" + }, + "second": { + "one": "Secondo", + "plural": "Secondi" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volt", + "suffix": "V" + }, + "record": { + "one": "Record", + "plural": "Record" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Sconosciuto", + "shortName": "SCON", + "notAvailable": "N/D", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "ANNULLA", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Troppo lungo, atteso minore o uguale a {{maximum}} caratteri.", + "number": "Troppo grande, ci si aspetta un numero minore o uguale a {{maximum}}.", + "bytes": "Troppo grande, atteso inferiore o uguale a {{params.maximum}} byte." + }, + "tooSmall": { + "string": "Troppo breve, atteso più di o uguale a {{minimum}} caratteri.", + "number": "Troppo piccolo, atteso un numero maggiore o uguale a {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Formato non valido, previsto un indirizzo IPv4.", + "key": "Formato non valido, prevista una chiave pre-condivisa codificata Base64 (PSK)." + }, + "invalidType": { + "number": "Tipo non valido, atteso un numero." + }, + "pskLength": { + "0bit": "La chiave deve essere vuota.", + "8bit": "La chiave deve essere una chiave pre-condivisa a 8 bit (PSK).", + "128bit": "La chiave deve essere una chiave pre-condivisa a 128 bit (PSK).", + "256bit": "La chiave deve essere una chiave pre-condivisa a 256 bit (PSK)." + }, + "required": { + "generic": "Questo campo è obbligatorio.", + "managed": "Se il nodo è gestito, è richiesta almeno una chiave amministrativa.", + "key": "La chiave è obbligatoria." + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/dashboard.json b/packages/web/public/i18n/locales/it-IT/dashboard.json index c31423a9..e92dc5ad 100644 --- a/packages/web/public/i18n/locales/it-IT/dashboard.json +++ b/packages/web/public/i18n/locales/it-IT/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Dispositivi Connessi", - "description": "Gestisci i tuoi dispositivi Meshtastic collegati.", - "connectionType_ble": "BLE", - "connectionType_serial": "Seriale", - "connectionType_network": "Rete", - "noDevicesTitle": "Nessun dispositivo connesso", - "noDevicesDescription": "Connetti un nuovo dispositivo per iniziare.", - "button_newConnection": "Nuova connessione" - } + "dashboard": { + "title": "Dispositivi Connessi", + "description": "Gestisci i tuoi dispositivi Meshtastic collegati.", + "connectionType_ble": "BLE", + "connectionType_serial": "Seriale", + "connectionType_network": "Rete", + "noDevicesTitle": "Nessun dispositivo connesso", + "noDevicesDescription": "Connetti un nuovo dispositivo per iniziare.", + "button_newConnection": "Nuova connessione" + } } diff --git a/packages/web/public/i18n/locales/it-IT/deviceConfig.json b/packages/web/public/i18n/locales/it-IT/deviceConfig.json index bd89dd07..24ad462b 100644 --- a/packages/web/public/i18n/locales/it-IT/deviceConfig.json +++ b/packages/web/public/i18n/locales/it-IT/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configurazione", - "tabBluetooth": "Bluetooth", - "tabDevice": "Dispositivo", - "tabDisplay": "Schermo", - "tabLora": "LoRa", - "tabNetwork": "Rete", - "tabPosition": "Posizione", - "tabPower": "Alimentazione", - "tabSecurity": "Sicurezza" - }, - "sidebar": { - "label": "Moduli" - }, - "device": { - "title": "Impostazioni del dispositivo", - "description": "Le impostazioni del dispositivo", - "buttonPin": { - "description": "Sovrascrivi pin pulsante", - "label": "Pulsante Pin" - }, - "buzzerPin": { - "description": "Sovrascrivi pin buzzer", - "label": "Pin Buzzer" - }, - "disableTripleClick": { - "description": "Disabilita triplo-click", - "label": "Disabilita triplo-click" - }, - "doubleTapAsButtonPress": { - "description": "Tratta il doppio tocco come pressione pulsante", - "label": "Doppio tocco come pressione pulsante" - }, - "ledHeartbeatDisabled": { - "description": "Disabilita il LED lampeggiante predefinito", - "label": "LED Heartbeat Disabilitato" - }, - "nodeInfoBroadcastInterval": { - "description": "Quante volte trasmettere informazioni sul nodo", - "label": "Intervallo Di Trasmissione Info Nodo" - }, - "posixTimezone": { - "description": "La stringa di fuso orario POSIX per il dispositivo", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "Come gestire il rebroadcasting", - "label": "Modalità Rebroadcast" - }, - "role": { - "description": "Quale ruolo il dispositivo svolge sulla mesh", - "label": "Ruolo" - } - }, - "bluetooth": { - "title": "Impostazioni Bluetooth", - "description": "Impostazioni per il modulo Bluetooth", - "note": "Nota: alcuni dispositivi (ESP32) non possono utilizzare contemporaneamente Bluetooth e WiFi.", - "enabled": { - "description": "Abilita o disabilita Bluetooth", - "label": "Abilitato" - }, - "pairingMode": { - "description": "Comportamento di selezione pin.", - "label": "Modalità abbinamento" - }, - "pin": { - "description": "Pin da usare durante l'abbinamento", - "label": "Pin" - } - }, - "display": { - "description": "Impostazioni per il display del dispositivo", - "title": "Impostazioni Display", - "headingBold": { - "description": "Metti in grassetto il testo dell'intestazione", - "label": "Intestazione in grassetto" - }, - "carouselDelay": { - "description": "Quanto velocemente scorrere attraverso le finestre", - "label": "Ritardo Carosello" - }, - "compassNorthTop": { - "description": "Fissare il nord fino alla parte superiore della bussola", - "label": "Bussola Nord In Alto" - }, - "displayMode": { - "description": "Variante layout schermo", - "label": "Modalità di visualizzazione" - }, - "displayUnits": { - "description": "Mostra unità metriche o imperiali", - "label": "Mostra Unità" - }, - "flipScreen": { - "description": "Rifletti la visualizzazione di 180 gradi", - "label": "Capovolgi schermo" - }, - "gpsDisplayUnits": { - "description": "Formato coordinate", - "label": "Unità Display GPS" - }, - "oledType": { - "description": "Tipo di schermo OLED collegato al dispositivo", - "label": "Tipo OLED" - }, - "screenTimeout": { - "description": "Spegni lo schermo dopo questo lungo periodo", - "label": "Timeout Schermo" - }, - "twelveHourClock": { - "description": "Usa formato orologio 12 ore", - "label": "Orologio 12 Ore" - }, - "wakeOnTapOrMotion": { - "description": "Risveglia il dispositivo al tocco o al movimento", - "label": "Sveglia al tocco o al movimento" - } - }, - "lora": { - "title": "Impostazioni Mesh", - "description": "Impostazioni per la mesh LoRa", - "bandwidth": { - "description": "Larghezza di banda del canale in MHz", - "label": "Larghezza di banda" - }, - "boostedRxGain": { - "description": "Guadagno RX potenziato", - "label": "Guadagno RX potenziato" - }, - "codingRate": { - "description": "Il denominatore della velocità di codifica", - "label": "Velocità di codifica" - }, - "frequencyOffset": { - "description": "Offset di frequenza per correggere gli errori di calibrazione del cristallo", - "label": "Offset Di Frequenza" - }, - "frequencySlot": { - "description": "Numero canale di frequenza LoRa", - "label": "Slot di frequenza" - }, - "hopLimit": { - "description": "Numero massimo di hop", - "label": "Limite di hop" - }, - "ignoreMqtt": { - "description": "Non inoltrare i messaggi MQTT sulla mesh", - "label": "Ignora MQTT" - }, - "modemPreset": { - "description": "Preimpostazione modem da usare", - "label": "Configurazione Modem" - }, - "okToMqtt": { - "description": "Quando impostato su true, questa configurazione indica che l'utente approva il caricamento del pacchetto su MQTT. Se impostato su false, ai nodi remoti viene richiesto di non inoltrare i pacchetti a MQTT", - "label": "OK per MQTT" - }, - "overrideDutyCycle": { - "description": "Ignora limite di Duty Cycle", - "label": "Ignora limite di Duty Cycle" - }, - "overrideFrequency": { - "description": "Sovrascrivi frequenza", - "label": "Sovrascrivi frequenza" - }, - "region": { - "description": "Imposta la regione del tuo nodo", - "label": "Regione" - }, - "spreadingFactor": { - "description": "Indica il numero di chirp per simbolo", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Abilita/Disabilita la trasmissione (TX) dalla radio LoRa", - "label": "Trasmissione Abilitata" - }, - "transmitPower": { - "description": "Potenza massima di trasmissione", - "label": "Potenza Di Trasmissione" - }, - "usePreset": { - "description": "Usa una delle preimpostazioni predefinite del modem", - "label": "Utilizza il preset" - }, - "meshSettings": { - "description": "Impostazioni per la mesh LoRa", - "label": "Impostazioni Mesh" - }, - "waveformSettings": { - "description": "Impostazioni per la forma d'onda LoRa", - "label": "Impostazioni Forma d'onda" - }, - "radioSettings": { - "label": "Impostazioni Radio", - "description": "Impostazioni per la radio LoRa" - } - }, - "network": { - "title": "Configurazione WiFi", - "description": "Configurazione radio WiFi", - "note": "Nota: alcuni dispositivi (ESP32) non possono utilizzare contemporaneamente Bluetooth e WiFi.", - "addressMode": { - "description": "Selezione assegnazione indirizzo", - "label": "Modalità Indirizzo" - }, - "dns": { - "description": "Server DNS", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Abilita o disabilita la porta Ethernet", - "label": "Abilitato" - }, - "gateway": { - "description": "Gateway predefinito", - "label": "Gateway" - }, - "ip": { - "description": "Indirizzo IP", - "label": "IP" - }, - "psk": { - "description": "Password di rete", - "label": "PSK" - }, - "ssid": { - "description": "Nome rete", - "label": "SSID" - }, - "subnet": { - "description": "Subnet mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Abilita o disabilita la radio WiFi", - "label": "Abilitato" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "Server NTP" - }, - "rsyslogServer": { - "label": "Server rsyslog" - }, - "ethernetConfigSettings": { - "description": "Configurazione porta Ethernet", - "label": "Configurazione Ethernet" - }, - "ipConfigSettings": { - "description": "Configurazione IP", - "label": "Configurazione IP" - }, - "ntpConfigSettings": { - "description": "Configurazione NTP", - "label": "Configurazione NTP" - }, - "rsyslogConfigSettings": { - "description": "Configurazione di Rsyslog", - "label": "Configurazione di Rsyslog" - }, - "udpConfigSettings": { - "description": "Configurazione UDP over Mesh", - "label": "Configurazione UDP" - } - }, - "position": { - "title": "Impostazioni Posizione", - "description": "Impostazioni per il modulo di posizione", - "broadcastInterval": { - "description": "Quante volte la tua posizione viene inviata attraverso la mesh", - "label": "Intervallo Di Trasmissione" - }, - "enablePin": { - "description": "Modulo GPS abilita pin override", - "label": "Abilita Pin" - }, - "fixedPosition": { - "description": "Non segnalare la posizione GPS, ma specificane una manualmente", - "label": "Posizione Fissa" - }, - "gpsMode": { - "description": "Configura se il GPS del dispositivo è abilitato, disabilitato o non presente", - "label": "Modalità GPS" - }, - "gpsUpdateInterval": { - "description": "Quante volte una correzione GPS dovrebbe essere acquisita", - "label": "Intervallo di aggiornamento GPS" - }, - "positionFlags": { - "description": "Campi opzionali da includere quando si assemblano messaggi di posizione. Più i campi sono selezionati, più grande sarà il messaggio porterà a un utilizzo più lungo del tempo di volo e un rischio più elevato di perdite dei pacchetti.", - "label": "Flag Di Posizione" - }, - "receivePin": { - "description": "Sovrascrivi RX pin del Modulo GPS", - "label": "Pin di ricezione" - }, - "smartPositionEnabled": { - "description": "Invia posizione solo quando c'è stato un cambiamento significativo nella posizione", - "label": "Abilita Posizione Intelligente" - }, - "smartPositionMinDistance": { - "description": "Distanza minima (in metri) che deve essere percorsa prima di inviare un aggiornamento di posizione", - "label": "Distanza Minima Posizione Intelligente" - }, - "smartPositionMinInterval": { - "description": "Intervallo minimo (in secondi) che deve passare prima di inviare un aggiornamento della posizione", - "label": "Intervallo Minimo Posizione Intelligente" - }, - "transmitPin": { - "description": "Sovrascrivi TX pin del Modulo GPS", - "label": "Pin di trasmissione" - }, - "intervalsSettings": { - "description": "Quante volte inviare aggiornamenti di posizione", - "label": "Intervalli" - }, - "flags": { - "placeholder": "Seleziona flag di posizione...", - "altitude": "Altitudine", - "altitudeGeoidalSeparation": "Altitudine Separazione Geoidale", - "altitudeMsl": "L'altitudine è riferita al livello medio del mare", - "dop": "Diluizione del PDOP di precisione (DOP) utilizzato per impostazione predefinita", - "hdopVdop": "Se DOP è impostato, usa i valori HDOP / VDOP invece di PDOP", - "numSatellites": "Numero di satelliti", - "sequenceNumber": "Numero sequenza", - "timestamp": "Data e ora", - "unset": "Non impostato", - "vehicleHeading": "Direzione del veicolo", - "vehicleSpeed": "Velocità del veicolo" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Utilizzato per modificare la lettura della tensione della batteria", - "label": "Sovrascrivi rapporto moltiplicatore ADC" - }, - "ina219Address": { - "description": "Indirizzo del monitor batteria INA219", - "label": "Indirizzo INA219" - }, - "lightSleepDuration": { - "description": "Per quanto tempo il dispositivo sarà in light sleep", - "label": "Durata light sleep" - }, - "minimumWakeTime": { - "description": "Quantità minima di tempo che il dispositivo rimarrà attivo per dopo aver ricevuto un pacchetto", - "label": "Tempo Di Risveglio Minimo" - }, - "noConnectionBluetoothDisabled": { - "description": "Se il dispositivo non riceve una connessione Bluetooth, la radio BLE sarà disattivata dopo questo lungo periodo", - "label": "Nessuna Connessione Bluetooth Disabilitata" - }, - "powerSavingEnabled": { - "description": "Selezionare se alimentato da una fonte a bassa corrente (cioè solare) per minimizzare il consumo energetico il più possibile.", - "label": "Abilita modalità risparmio energetico" - }, - "shutdownOnBatteryDelay": { - "description": "Spegnimento automatico del nodo dopo questo lungo quando la batteria, 0 per indefinito", - "label": "Arresto in ritardo della batteria" - }, - "superDeepSleepDuration": { - "description": "Per quanto tempo il dispositivo sarà in deep sleep", - "label": "Durata Super Deep Sleep" - }, - "powerConfigSettings": { - "description": "Impostazioni per il modulo di alimentazione", - "label": "Configurazione Alimentazione" - }, - "sleepSettings": { - "description": "Impostazioni di sospensione per il modulo di alimentazione", - "label": "Impostazioni Sleep" - } - }, - "security": { - "description": "Impostazioni per la configurazione di sicurezza", - "title": "Impostazioni di Sicurezza", - "button_backupKey": "Chiave Di Backup", - "adminChannelEnabled": { - "description": "Consenti il controllo del dispositivo in arrivo sul canale di amministrazione ereditato insicuro", - "label": "Consenti Amministrazione Legacy" - }, - "enableDebugLogApi": { - "description": "Output live debug logging su seriale, visualizza ed esporta i log di posizione dei dispositivi redatti su Bluetooth", - "label": "Abilita Debug Log API" - }, - "managed": { - "description": "Se abilitata, le opzioni di configurazione del dispositivo possono essere modificate solo in remoto da un nodo di amministrazione remota tramite messaggi amministratori. Non abilitare questa opzione a meno che non sia stato configurato almeno un nodo Admin Remoto adatto, e la chiave pubblica è memorizzata in uno dei campi precedenti.", - "label": "Gestito" - }, - "privateKey": { - "description": "Usato per creare una chiave condivisa con un dispositivo remoto", - "label": "Chiave Privata" - }, - "publicKey": { - "description": "Inviato ad altri nodi sulla mesh per consentire loro di calcolare una chiave segreta condivisa", - "label": "Chiave Pubblica" - }, - "primaryAdminKey": { - "description": "La chiave pubblica primaria autorizzata a inviare messaggi di amministrazione a questo nodo", - "label": "Chiave Primaria Dell'Amministratore" - }, - "secondaryAdminKey": { - "description": "La chiave pubblica secondaria autorizzata a inviare messaggi di amministrazione a questo nodo", - "label": "Chiave Secondaria Dell'Amministratore" - }, - "serialOutputEnabled": { - "description": "Console seriale attraverso la Stream API", - "label": "Output Seriale Abilitato" - }, - "tertiaryAdminKey": { - "description": "La chiave pubblica terziaria autorizzata a inviare messaggi di amministrazione a questo nodo", - "label": "Chiave Di Amministrazione Terziaria" - }, - "adminSettings": { - "description": "Impostazioni per Amministratore", - "label": "Impostazioni Amministratore" - }, - "loggingSettings": { - "description": "Impostazioni per il logging", - "label": "Impostazioni Di Logging" - } - } + "page": { + "title": "Configurazione", + "tabBluetooth": "Bluetooth", + "tabDevice": "Dispositivo", + "tabDisplay": "Schermo", + "tabLora": "LoRa", + "tabNetwork": "Rete", + "tabPosition": "Posizione", + "tabPower": "Alimentazione", + "tabSecurity": "Sicurezza" + }, + "sidebar": { + "label": "Moduli" + }, + "device": { + "title": "Impostazioni del dispositivo", + "description": "Le impostazioni del dispositivo", + "buttonPin": { + "description": "Sovrascrivi pin pulsante", + "label": "Pulsante Pin" + }, + "buzzerPin": { + "description": "Sovrascrivi pin buzzer", + "label": "Pin Buzzer" + }, + "disableTripleClick": { + "description": "Disabilita triplo-click", + "label": "Disabilita triplo-click" + }, + "doubleTapAsButtonPress": { + "description": "Tratta il doppio tocco come pressione pulsante", + "label": "Doppio tocco come pressione pulsante" + }, + "ledHeartbeatDisabled": { + "description": "Disabilita il LED lampeggiante predefinito", + "label": "LED Heartbeat Disabilitato" + }, + "nodeInfoBroadcastInterval": { + "description": "Quante volte trasmettere informazioni sul nodo", + "label": "Intervallo Di Trasmissione Info Nodo" + }, + "posixTimezone": { + "description": "La stringa di fuso orario POSIX per il dispositivo", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "Come gestire il rebroadcasting", + "label": "Modalità Rebroadcast" + }, + "role": { + "description": "Quale ruolo il dispositivo svolge sulla mesh", + "label": "Ruolo" + } + }, + "bluetooth": { + "title": "Impostazioni Bluetooth", + "description": "Impostazioni per il modulo Bluetooth", + "note": "Nota: alcuni dispositivi (ESP32) non possono utilizzare contemporaneamente Bluetooth e WiFi.", + "enabled": { + "description": "Abilita o disabilita Bluetooth", + "label": "Abilitato" + }, + "pairingMode": { + "description": "Comportamento di selezione pin.", + "label": "Modalità abbinamento" + }, + "pin": { + "description": "Pin da usare durante l'abbinamento", + "label": "Pin" + } + }, + "display": { + "description": "Impostazioni per il display del dispositivo", + "title": "Impostazioni Display", + "headingBold": { + "description": "Metti in grassetto il testo dell'intestazione", + "label": "Intestazione in grassetto" + }, + "carouselDelay": { + "description": "Quanto velocemente scorrere attraverso le finestre", + "label": "Ritardo Carosello" + }, + "compassNorthTop": { + "description": "Fissare il nord fino alla parte superiore della bussola", + "label": "Bussola Nord In Alto" + }, + "displayMode": { + "description": "Variante layout schermo", + "label": "Modalità di visualizzazione" + }, + "displayUnits": { + "description": "Mostra unità metriche o imperiali", + "label": "Mostra Unità" + }, + "flipScreen": { + "description": "Rifletti la visualizzazione di 180 gradi", + "label": "Capovolgi schermo" + }, + "gpsDisplayUnits": { + "description": "Formato coordinate", + "label": "Unità Display GPS" + }, + "oledType": { + "description": "Tipo di schermo OLED collegato al dispositivo", + "label": "Tipo OLED" + }, + "screenTimeout": { + "description": "Spegni lo schermo dopo questo lungo periodo", + "label": "Timeout Schermo" + }, + "twelveHourClock": { + "description": "Usa formato orologio 12 ore", + "label": "Orologio 12 Ore" + }, + "wakeOnTapOrMotion": { + "description": "Risveglia il dispositivo al tocco o al movimento", + "label": "Sveglia al tocco o al movimento" + } + }, + "lora": { + "title": "Impostazioni Mesh", + "description": "Impostazioni per la mesh LoRa", + "bandwidth": { + "description": "Larghezza di banda del canale in MHz", + "label": "Larghezza di banda" + }, + "boostedRxGain": { + "description": "Guadagno RX potenziato", + "label": "Guadagno RX potenziato" + }, + "codingRate": { + "description": "Il denominatore della velocità di codifica", + "label": "Velocità di codifica" + }, + "frequencyOffset": { + "description": "Offset di frequenza per correggere gli errori di calibrazione del cristallo", + "label": "Offset Di Frequenza" + }, + "frequencySlot": { + "description": "Numero canale di frequenza LoRa", + "label": "Slot di frequenza" + }, + "hopLimit": { + "description": "Numero massimo di hop", + "label": "Limite di hop" + }, + "ignoreMqtt": { + "description": "Non inoltrare i messaggi MQTT sulla mesh", + "label": "Ignora MQTT" + }, + "modemPreset": { + "description": "Preimpostazione modem da usare", + "label": "Configurazione Modem" + }, + "okToMqtt": { + "description": "Quando impostato su true, questa configurazione indica che l'utente approva il caricamento del pacchetto su MQTT. Se impostato su false, ai nodi remoti viene richiesto di non inoltrare i pacchetti a MQTT", + "label": "OK per MQTT" + }, + "overrideDutyCycle": { + "description": "Ignora limite di Duty Cycle", + "label": "Ignora limite di Duty Cycle" + }, + "overrideFrequency": { + "description": "Sovrascrivi frequenza", + "label": "Sovrascrivi frequenza" + }, + "region": { + "description": "Imposta la regione del tuo nodo", + "label": "Regione" + }, + "spreadingFactor": { + "description": "Indica il numero di chirp per simbolo", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Abilita/Disabilita la trasmissione (TX) dalla radio LoRa", + "label": "Trasmissione Abilitata" + }, + "transmitPower": { + "description": "Potenza massima di trasmissione", + "label": "Potenza Di Trasmissione" + }, + "usePreset": { + "description": "Usa una delle preimpostazioni predefinite del modem", + "label": "Utilizza il preset" + }, + "meshSettings": { + "description": "Impostazioni per la mesh LoRa", + "label": "Impostazioni Mesh" + }, + "waveformSettings": { + "description": "Impostazioni per la forma d'onda LoRa", + "label": "Impostazioni Forma d'onda" + }, + "radioSettings": { + "label": "Impostazioni Radio", + "description": "Impostazioni per la radio LoRa" + } + }, + "network": { + "title": "Configurazione WiFi", + "description": "Configurazione radio WiFi", + "note": "Nota: alcuni dispositivi (ESP32) non possono utilizzare contemporaneamente Bluetooth e WiFi.", + "addressMode": { + "description": "Selezione assegnazione indirizzo", + "label": "Modalità Indirizzo" + }, + "dns": { + "description": "Server DNS", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Abilita o disabilita la porta Ethernet", + "label": "Abilitato" + }, + "gateway": { + "description": "Gateway predefinito", + "label": "Gateway" + }, + "ip": { + "description": "Indirizzo IP", + "label": "IP" + }, + "psk": { + "description": "Password di rete", + "label": "PSK" + }, + "ssid": { + "description": "Nome rete", + "label": "SSID" + }, + "subnet": { + "description": "Subnet mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Abilita o disabilita la radio WiFi", + "label": "Abilitato" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "Server NTP" + }, + "rsyslogServer": { + "label": "Server rsyslog" + }, + "ethernetConfigSettings": { + "description": "Configurazione porta Ethernet", + "label": "Configurazione Ethernet" + }, + "ipConfigSettings": { + "description": "Configurazione IP", + "label": "Configurazione IP" + }, + "ntpConfigSettings": { + "description": "Configurazione NTP", + "label": "Configurazione NTP" + }, + "rsyslogConfigSettings": { + "description": "Configurazione di Rsyslog", + "label": "Configurazione di Rsyslog" + }, + "udpConfigSettings": { + "description": "Configurazione UDP over Mesh", + "label": "Configurazione UDP" + } + }, + "position": { + "title": "Impostazioni Posizione", + "description": "Impostazioni per il modulo di posizione", + "broadcastInterval": { + "description": "Quante volte la tua posizione viene inviata attraverso la mesh", + "label": "Intervallo Di Trasmissione" + }, + "enablePin": { + "description": "Modulo GPS abilita pin override", + "label": "Abilita Pin" + }, + "fixedPosition": { + "description": "Non segnalare la posizione GPS, ma specificane una manualmente", + "label": "Posizione Fissa" + }, + "gpsMode": { + "description": "Configura se il GPS del dispositivo è abilitato, disabilitato o non presente", + "label": "Modalità GPS" + }, + "gpsUpdateInterval": { + "description": "Quante volte una correzione GPS dovrebbe essere acquisita", + "label": "Intervallo di aggiornamento GPS" + }, + "positionFlags": { + "description": "Campi opzionali da includere quando si assemblano messaggi di posizione. Più i campi sono selezionati, più grande sarà il messaggio porterà a un utilizzo più lungo del tempo di volo e un rischio più elevato di perdite dei pacchetti.", + "label": "Flag Di Posizione" + }, + "receivePin": { + "description": "Sovrascrivi RX pin del Modulo GPS", + "label": "Pin di ricezione" + }, + "smartPositionEnabled": { + "description": "Invia posizione solo quando c'è stato un cambiamento significativo nella posizione", + "label": "Abilita Posizione Intelligente" + }, + "smartPositionMinDistance": { + "description": "Distanza minima (in metri) che deve essere percorsa prima di inviare un aggiornamento di posizione", + "label": "Distanza Minima Posizione Intelligente" + }, + "smartPositionMinInterval": { + "description": "Intervallo minimo (in secondi) che deve passare prima di inviare un aggiornamento della posizione", + "label": "Intervallo Minimo Posizione Intelligente" + }, + "transmitPin": { + "description": "Sovrascrivi TX pin del Modulo GPS", + "label": "Pin di trasmissione" + }, + "intervalsSettings": { + "description": "Quante volte inviare aggiornamenti di posizione", + "label": "Intervalli" + }, + "flags": { + "placeholder": "Seleziona flag di posizione...", + "altitude": "Altitudine", + "altitudeGeoidalSeparation": "Altitudine Separazione Geoidale", + "altitudeMsl": "L'altitudine è riferita al livello medio del mare", + "dop": "Diluizione del PDOP di precisione (DOP) utilizzato per impostazione predefinita", + "hdopVdop": "Se DOP è impostato, usa i valori HDOP / VDOP invece di PDOP", + "numSatellites": "Numero di satelliti", + "sequenceNumber": "Numero sequenza", + "timestamp": "Data e ora", + "unset": "Non impostato", + "vehicleHeading": "Direzione del veicolo", + "vehicleSpeed": "Velocità del veicolo" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Utilizzato per modificare la lettura della tensione della batteria", + "label": "Sovrascrivi rapporto moltiplicatore ADC" + }, + "ina219Address": { + "description": "Indirizzo del monitor batteria INA219", + "label": "Indirizzo INA219" + }, + "lightSleepDuration": { + "description": "Per quanto tempo il dispositivo sarà in light sleep", + "label": "Durata light sleep" + }, + "minimumWakeTime": { + "description": "Quantità minima di tempo che il dispositivo rimarrà attivo per dopo aver ricevuto un pacchetto", + "label": "Tempo Di Risveglio Minimo" + }, + "noConnectionBluetoothDisabled": { + "description": "Se il dispositivo non riceve una connessione Bluetooth, la radio BLE sarà disattivata dopo questo lungo periodo", + "label": "Nessuna Connessione Bluetooth Disabilitata" + }, + "powerSavingEnabled": { + "description": "Selezionare se alimentato da una fonte a bassa corrente (cioè solare) per minimizzare il consumo energetico il più possibile.", + "label": "Abilita modalità risparmio energetico" + }, + "shutdownOnBatteryDelay": { + "description": "Spegnimento automatico del nodo dopo questo lungo quando la batteria, 0 per indefinito", + "label": "Arresto in ritardo della batteria" + }, + "superDeepSleepDuration": { + "description": "Per quanto tempo il dispositivo sarà in deep sleep", + "label": "Durata Super Deep Sleep" + }, + "powerConfigSettings": { + "description": "Impostazioni per il modulo di alimentazione", + "label": "Configurazione Alimentazione" + }, + "sleepSettings": { + "description": "Impostazioni di sospensione per il modulo di alimentazione", + "label": "Impostazioni Sleep" + } + }, + "security": { + "description": "Impostazioni per la configurazione di sicurezza", + "title": "Impostazioni di Sicurezza", + "button_backupKey": "Chiave Di Backup", + "adminChannelEnabled": { + "description": "Consenti il controllo del dispositivo in arrivo sul canale di amministrazione ereditato insicuro", + "label": "Consenti Amministrazione Legacy" + }, + "enableDebugLogApi": { + "description": "Output live debug logging su seriale, visualizza ed esporta i log di posizione dei dispositivi redatti su Bluetooth", + "label": "Abilita Debug Log API" + }, + "managed": { + "description": "Se abilitata, le opzioni di configurazione del dispositivo possono essere modificate solo in remoto da un nodo di amministrazione remota tramite messaggi amministratori. Non abilitare questa opzione a meno che non sia stato configurato almeno un nodo Admin Remoto adatto, e la chiave pubblica è memorizzata in uno dei campi precedenti.", + "label": "Gestito" + }, + "privateKey": { + "description": "Usato per creare una chiave condivisa con un dispositivo remoto", + "label": "Chiave Privata" + }, + "publicKey": { + "description": "Inviato ad altri nodi sulla mesh per consentire loro di calcolare una chiave segreta condivisa", + "label": "Chiave Pubblica" + }, + "primaryAdminKey": { + "description": "La chiave pubblica primaria autorizzata a inviare messaggi di amministrazione a questo nodo", + "label": "Chiave Primaria Dell'Amministratore" + }, + "secondaryAdminKey": { + "description": "La chiave pubblica secondaria autorizzata a inviare messaggi di amministrazione a questo nodo", + "label": "Chiave Secondaria Dell'Amministratore" + }, + "serialOutputEnabled": { + "description": "Console seriale attraverso la Stream API", + "label": "Output Seriale Abilitato" + }, + "tertiaryAdminKey": { + "description": "La chiave pubblica terziaria autorizzata a inviare messaggi di amministrazione a questo nodo", + "label": "Chiave Di Amministrazione Terziaria" + }, + "adminSettings": { + "description": "Impostazioni per Amministratore", + "label": "Impostazioni Amministratore" + }, + "loggingSettings": { + "description": "Impostazioni per il logging", + "label": "Impostazioni Di Logging" + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/dialog.json b/packages/web/public/i18n/locales/it-IT/dialog.json index 402b6838..d5c14b5b 100644 --- a/packages/web/public/i18n/locales/it-IT/dialog.json +++ b/packages/web/public/i18n/locales/it-IT/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "Questa azione cancellerà tutta la cronologia dei messaggi. Non può essere annullata. Sei sicuro di voler continuare?", - "title": "Cancella Tutti I Messaggi" - }, - "deviceName": { - "description": "Il dispositivo verrà riavviato una volta salvata la configurazione.", - "longName": "Nome Lungo", - "shortName": "Nome Breve", - "title": "Cambia Nome Dispositivo" - }, - "import": { - "description": "La configurazione attuale di LoRa sarà sovrascritta.", - "error": { - "invalidUrl": "URL Meshtastic non valido" - }, - "channelPrefix": "Canale: ", - "channelSetUrl": "URL del Set di Canali/Codice QR", - "channels": "Canali:", - "usePreset": "Utilizza il preset?", - "title": "Importa Set Canale" - }, - "locationResponse": { - "altitude": "Altitudine: ", - "coordinates": "Coordinate: ", - "title": "Posizione: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Rigenerare La Chiave Pre-Condivisa?", - "description": "Sei sicuro di voler rigenerare la chiave pre-condivisa?", - "regenerate": "Rigenera" - }, - "newDeviceDialog": { - "title": "Connetti Nuovo Dispositivo", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Seriale", - "useHttps": "Usa HTTPS", - "connecting": "Connessione in corso...", - "connect": "Connetti", - "connectionFailedAlert": { - "title": "Connessione fallita", - "descriptionPrefix": "Impossibile connettersi al dispositivo.", - "httpsHint": "Se si utilizza HTTPS, potrebbe essere necessario prima accettare un certificato autofirmato. ", - "openLinkPrefix": "Apri per favore ", - "openLinkSuffix": " in una nuova scheda", - "acceptTlsWarningSuffix": ", accetta eventuali avvisi TLS se richiesto, quindi riprova", - "learnMoreLink": "Maggiori informazioni" - }, - "httpConnection": { - "label": "Indirizzo IP/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "Nessun dispositivo ancora abbinato.", - "newDeviceButton": "Nuovo dispositivo", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "Nessun dispositivo ancora abbinato.", - "newDeviceButton": "Nuovo dispositivo" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "Questa applicazione richiede un <0>contesto sicuro. Si prega di connettersi utilizzando HTTPS o localhost.", - "additionallyRequiresSecureContext": "Inoltre, richiede un <0>contesto sicuro. Si prega di connettersi utilizzando HTTPS o localhost." - } - }, - "nodeDetails": { - "message": "Messaggio", - "requestPosition": "Richiedi posizione", - "traceRoute": "Trace Route", - "airTxUtilization": "Tempo di Trasmissione Utilizzato", - "allRawMetrics": "Tutte Le Metriche Grezze:", - "batteryLevel": "Livello batteria", - "channelUtilization": "Utilizzo Canale", - "details": "Dettagli:", - "deviceMetrics": "Metriche Dispositivo:", - "hardware": "Hardware: ", - "lastHeard": "Ultimo Contatto: ", - "nodeHexPrefix": "Nodo Hex: !", - "nodeNumber": "Numero Nodo: ", - "position": "Posizione:", - "role": "Ruolo: ", - "uptime": "Tempo di attività: ", - "voltage": "Tensione", - "title": "Dettagli nodo per {{identifier}}", - "ignoreNode": "Ignora nodo", - "removeNode": "Rimuovi Nodo", - "unignoreNode": "Non ignorare più nodo" - }, - "pkiBackup": { - "loseKeysWarning": "Se perdi le tue chiavi, dovrai reimpostare il tuo dispositivo.", - "secureBackup": "È importante eseguire il backup delle chiavi pubbliche e private e memorizzare il backup in modo sicuro!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Chiave Privata:", - "publicKey": "Chiave Pubblica:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup chiavi" - }, - "pkiBackupReminder": { - "description": "Ti consigliamo di eseguire regolarmente il backup delle tue chiavi. Vuoi eseguire un backup?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Sei sicuro di voler rigenerare la coppia di chiavi?", - "title": "Rigenera Coppia Chiavi" - }, - "qr": { - "addChannels": "Aggiungi canali", - "replaceChannels": "Sostituisci Canali", - "description": "Anche l'attuale configurazione di LoRa verrà condivisa.", - "sharableUrl": "URL Condivisibile", - "title": "Genera codice QR" - }, - "rebootOta": { - "title": "Pianifica Riavvio", - "description": "Riavvia il nodo connesso dopo un ritardo in modalità OTA (Over-the-Air).", - "enterDelay": "Inserisci ritardo (sec)", - "scheduled": "Il riavvio è stato pianificato" - }, - "reboot": { - "title": "Pianifica Riavvio", - "description": "Riavvia il nodo connesso dopo x minuti." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "Questo rimuoverà il nodo dal dispositivo e richiederà nuove chiavi.", - "keyMismatchReasonSuffix": ". Ciò è dovuto alla chiave pubblica corrente del nodo remoto che non corrisponde alla chiave precedentemente memorizzata per questo nodo.", - "unableToSendDmPrefix": "Il nodo non è in grado di inviare un messaggio diretto al nodo: " - }, - "acceptNewKeys": "Accetta Nuove Chiavi", - "title": "Chiavi Non Corrispondenti - {{identifier}}" - }, - "removeNode": { - "description": "Sei sicuro di voler rimuovere questo nodo?", - "title": "Rimuovi Nodo?" - }, - "shutdown": { - "title": "Pianifica Spegnimento", - "description": "Spegni il nodo connesso dopo x minuti." - }, - "traceRoute": { - "routeToDestination": "Percorso di destinazione:", - "routeBack": "Percorso indietro:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Sì, so cosa sto facendo", - "conjunction": " e il blog post su ", - "postamble": " e capisco le implicazioni di un cambiamento di ruolo.", - "preamble": "Dichiaro di aver letto i ", - "choosingRightDeviceRole": "Scegliere il ruolo corretto del dispositivo", - "deviceRoleDocumentation": "Documentazione sul ruolo del dispositivo", - "title": "Sei sicuro?" - }, - "managedMode": { - "confirmUnderstanding": "Sì, so cosa sto facendo", - "title": "Sei sicuro?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "Questa azione cancellerà tutta la cronologia dei messaggi. Non può essere annullata. Sei sicuro di voler continuare?", + "title": "Cancella Tutti I Messaggi" + }, + "deviceName": { + "description": "Il dispositivo verrà riavviato una volta salvata la configurazione.", + "longName": "Nome Lungo", + "shortName": "Nome Breve", + "title": "Cambia Nome Dispositivo" + }, + "import": { + "description": "La configurazione attuale di LoRa sarà sovrascritta.", + "error": { + "invalidUrl": "URL Meshtastic non valido" + }, + "channelPrefix": "Canale: ", + "channelSetUrl": "URL del Set di Canali/Codice QR", + "channels": "Canali:", + "usePreset": "Utilizza il preset?", + "title": "Importa Set Canale" + }, + "locationResponse": { + "altitude": "Altitudine: ", + "coordinates": "Coordinate: ", + "title": "Posizione: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Rigenerare La Chiave Pre-Condivisa?", + "description": "Sei sicuro di voler rigenerare la chiave pre-condivisa?", + "regenerate": "Rigenera" + }, + "newDeviceDialog": { + "title": "Connetti Nuovo Dispositivo", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Seriale", + "useHttps": "Usa HTTPS", + "connecting": "Connessione in corso...", + "connect": "Connetti", + "connectionFailedAlert": { + "title": "Connessione fallita", + "descriptionPrefix": "Impossibile connettersi al dispositivo.", + "httpsHint": "Se si utilizza HTTPS, potrebbe essere necessario prima accettare un certificato autofirmato. ", + "openLinkPrefix": "Apri per favore ", + "openLinkSuffix": " in una nuova scheda", + "acceptTlsWarningSuffix": ", accetta eventuali avvisi TLS se richiesto, quindi riprova", + "learnMoreLink": "Maggiori informazioni" + }, + "httpConnection": { + "label": "Indirizzo IP/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "Nessun dispositivo ancora abbinato.", + "newDeviceButton": "Nuovo dispositivo", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "Nessun dispositivo ancora abbinato.", + "newDeviceButton": "Nuovo dispositivo" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "Questa applicazione richiede un <0>contesto sicuro. Si prega di connettersi utilizzando HTTPS o localhost.", + "additionallyRequiresSecureContext": "Inoltre, richiede un <0>contesto sicuro. Si prega di connettersi utilizzando HTTPS o localhost." + } + }, + "nodeDetails": { + "message": "Messaggio", + "requestPosition": "Richiedi posizione", + "traceRoute": "Trace Route", + "airTxUtilization": "Tempo di Trasmissione Utilizzato", + "allRawMetrics": "Tutte Le Metriche Grezze:", + "batteryLevel": "Livello batteria", + "channelUtilization": "Utilizzo Canale", + "details": "Dettagli:", + "deviceMetrics": "Metriche Dispositivo:", + "hardware": "Hardware: ", + "lastHeard": "Ultimo Contatto: ", + "nodeHexPrefix": "Nodo Hex: !", + "nodeNumber": "Numero Nodo: ", + "position": "Posizione:", + "role": "Ruolo: ", + "uptime": "Tempo di attività: ", + "voltage": "Tensione", + "title": "Dettagli nodo per {{identifier}}", + "ignoreNode": "Ignora nodo", + "removeNode": "Rimuovi Nodo", + "unignoreNode": "Non ignorare più nodo" + }, + "pkiBackup": { + "loseKeysWarning": "Se perdi le tue chiavi, dovrai reimpostare il tuo dispositivo.", + "secureBackup": "È importante eseguire il backup delle chiavi pubbliche e private e memorizzare il backup in modo sicuro!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Chiave Privata:", + "publicKey": "Chiave Pubblica:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup chiavi" + }, + "pkiBackupReminder": { + "description": "Ti consigliamo di eseguire regolarmente il backup delle tue chiavi. Vuoi eseguire un backup?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Sei sicuro di voler rigenerare la coppia di chiavi?", + "title": "Rigenera Coppia Chiavi" + }, + "qr": { + "addChannels": "Aggiungi canali", + "replaceChannels": "Sostituisci Canali", + "description": "Anche l'attuale configurazione di LoRa verrà condivisa.", + "sharableUrl": "URL Condivisibile", + "title": "Genera codice QR" + }, + "rebootOta": { + "title": "Pianifica Riavvio", + "description": "Riavvia il nodo connesso dopo un ritardo in modalità OTA (Over-the-Air).", + "enterDelay": "Inserisci ritardo (sec)", + "scheduled": "Il riavvio è stato pianificato" + }, + "reboot": { + "title": "Pianifica Riavvio", + "description": "Riavvia il nodo connesso dopo x minuti." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "Questo rimuoverà il nodo dal dispositivo e richiederà nuove chiavi.", + "keyMismatchReasonSuffix": ". Ciò è dovuto alla chiave pubblica corrente del nodo remoto che non corrisponde alla chiave precedentemente memorizzata per questo nodo.", + "unableToSendDmPrefix": "Il nodo non è in grado di inviare un messaggio diretto al nodo: " + }, + "acceptNewKeys": "Accetta Nuove Chiavi", + "title": "Chiavi Non Corrispondenti - {{identifier}}" + }, + "removeNode": { + "description": "Sei sicuro di voler rimuovere questo nodo?", + "title": "Rimuovi Nodo?" + }, + "shutdown": { + "title": "Pianifica Spegnimento", + "description": "Spegni il nodo connesso dopo x minuti." + }, + "traceRoute": { + "routeToDestination": "Percorso di destinazione:", + "routeBack": "Percorso indietro:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Sì, so cosa sto facendo", + "conjunction": " e il blog post su ", + "postamble": " e capisco le implicazioni di un cambiamento di ruolo.", + "preamble": "Dichiaro di aver letto i ", + "choosingRightDeviceRole": "Scegliere il ruolo corretto del dispositivo", + "deviceRoleDocumentation": "Documentazione sul ruolo del dispositivo", + "title": "Sei sicuro?" + }, + "managedMode": { + "confirmUnderstanding": "Sì, so cosa sto facendo", + "title": "Sei sicuro?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/it-IT/messages.json b/packages/web/public/i18n/locales/it-IT/messages.json index 7a8cd6bd..645c22df 100644 --- a/packages/web/public/i18n/locales/it-IT/messages.json +++ b/packages/web/public/i18n/locales/it-IT/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messaggi: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Seleziona una chat", - "text": "Ancora nessun messaggio." - }, - "selectChatPrompt": { - "text": "Selezionare un canale o un nodo per iniziare a messaggiare." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Invia" - }, - "actionsMenu": { - "addReactionLabel": "Aggiungi una Reazione", - "replyLabel": "Rispondi" - }, - "deliveryStatus": { - "delivered": { - "label": "Messaggio inviato", - "displayText": "Messaggio inviato" - }, - "failed": { - "label": "Invio messaggio non riuscito", - "displayText": "Invio fallito" - }, - "unknown": { - "label": "Stato messaggio sconosciuto", - "displayText": "Stato sconosciuto" - }, - "waiting": { - "label": "Inviando il messaggio...", - "displayText": "In attesa della consegna" - } - } + "page": { + "title": "Messaggi: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Seleziona una chat", + "text": "Ancora nessun messaggio." + }, + "selectChatPrompt": { + "text": "Selezionare un canale o un nodo per iniziare a messaggiare." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Invia" + }, + "actionsMenu": { + "addReactionLabel": "Aggiungi una Reazione", + "replyLabel": "Rispondi" + }, + "deliveryStatus": { + "delivered": { + "label": "Messaggio inviato", + "displayText": "Messaggio inviato" + }, + "failed": { + "label": "Invio messaggio non riuscito", + "displayText": "Invio fallito" + }, + "unknown": { + "label": "Stato messaggio sconosciuto", + "displayText": "Stato sconosciuto" + }, + "waiting": { + "label": "Inviando il messaggio...", + "displayText": "In attesa della consegna" + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/moduleConfig.json b/packages/web/public/i18n/locales/it-IT/moduleConfig.json index c868c00b..0c0e5d38 100644 --- a/packages/web/public/i18n/locales/it-IT/moduleConfig.json +++ b/packages/web/public/i18n/locales/it-IT/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Luce Ambientale", - "tabAudio": "Audio", - "tabCannedMessage": "Predefiniti", - "tabDetectionSensor": "Sensore Di Rilevamento", - "tabExternalNotification": "Notifica Esterna", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Informazioni Vicinato", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Test Distanza", - "tabSerial": "Seriale", - "tabStoreAndForward": "S&I", - "tabTelemetry": "Telemetria" - }, - "ambientLighting": { - "title": "Configurazione Illuminazione Ambientale", - "description": "Impostazioni per il modulo Illuminazione Ambientale", - "ledState": { - "label": "Stato LED", - "description": "Imposta LED su acceso o spento" - }, - "current": { - "label": "Attuale", - "description": "Imposta la corrente per l'uscita LED. Il valore predefinito è 10" - }, - "red": { - "label": "Rosso", - "description": "Imposta il livello rosso del LED. I valori sono 0-255" - }, - "green": { - "label": "Verde", - "description": "Imposta il livello verde del LED. I valori sono 0-255" - }, - "blue": { - "label": "Blu", - "description": "Imposta il livello blu del LED. I valori sono 0-255" - } - }, - "audio": { - "title": "Impostazioni audio", - "description": "Impostazioni per il modulo audio", - "codec2Enabled": { - "label": "Codec 2 Abilitato", - "description": "Abilita la codifica audio Codec 2" - }, - "pttPin": { - "label": "Pin PTT", - "description": "GPIO pin da utilizzare per PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate da usare per la codifica audio" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin da usare per i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin da usare per i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin da usare per i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin da usare per i2S SCK" - } - }, - "cannedMessage": { - "title": "Impostazioni Messaggi Predefiniti", - "description": "Impostazioni per i Messaggi Predefiniti", - "moduleEnabled": { - "label": "Modulo abilitato", - "description": "Abilita Messaggi Predefiniti" - }, - "rotary1Enabled": { - "label": "Encoder Rotativo #1 Abilitato", - "description": "Abilita l'encoder rotativo" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "Valore Pin GPIO (1-39) Per porta encoder A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "Valore Pin GPIO (1-39) Per porta encoder B" - }, - "inputbrokerPinPress": { - "label": "Pin Pressione Encoder", - "description": "Valore Pin GPIO (1-39) Per la pressione dell'encoder" - }, - "inputbrokerEventCw": { - "label": "Evento in senso orario", - "description": "Seleziona evento in ingresso." - }, - "inputbrokerEventCcw": { - "label": "Evento in senso antiorario", - "description": "Seleziona evento in ingresso." - }, - "inputbrokerEventPress": { - "label": "Evento pressione", - "description": "Seleziona evento in ingresso" - }, - "updown1Enabled": { - "label": "Su Giù abilitato", - "description": "Abilita l'encoder su / giù" - }, - "allowInputSource": { - "label": "Consenti sorgente di input", - "description": "Seleziona da: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Invia Campanella", - "description": "Invia un carattere campanella con ogni messaggio" - } - }, - "detectionSensor": { - "title": "Configurazione Sensore Rilevamento", - "description": "Impostazioni per il modulo sensore di rilevamento", - "enabled": { - "label": "Abilitato", - "description": "Abilita o disabilita il modulo del sensore di rilevamento" - }, - "minimumBroadcastSecs": { - "label": "Secondi Di Trasmissione Minimi", - "description": "L'intervallo in secondi di quanto spesso possiamo inviare un messaggio alla mesh quando viene rilevato un cambiamento di stato" - }, - "stateBroadcastSecs": { - "label": "Secondi Trasmissione di Stato", - "description": "L'intervallo in secondi di quanto spesso dovremmo inviare un messaggio alla mesh con lo stato attuale indipendentemente dai cambiamenti" - }, - "sendBell": { - "label": "Invia Campanella", - "description": "Invia campanella ASCII con messaggio di avviso" - }, - "name": { - "label": "Nome Descrittivo", - "description": "Usato per formattare il messaggio inviato a mesh, max 20 Caratteri" - }, - "monitorPin": { - "label": "Pin Monitor", - "description": "Il pin GPIO da monitorare per i cambiamenti di stato" - }, - "detectionTriggerType": { - "label": "Tipo di trigger di rilevamento", - "description": "Il tipo di evento di trigger da usare" - }, - "usePullup": { - "label": "Usa Pullup", - "description": "Indica se usare o meno la modalità INPUT_PULLUP per il pin GPIO" - } - }, - "externalNotification": { - "title": "Configurazione Notifiche Esterne", - "description": "Configura il modulo notifiche esterno", - "enabled": { - "label": "Modulo abilitato", - "description": "Abilita Notifiche Esterne" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Vibrazione Output", - "description": "Vibrazione Output" - }, - "outputBuzzer": { - "label": "Buzzer Output", - "description": "Buzzer Output" - }, - "active": { - "label": "Attivo", - "description": "Attivo" - }, - "alertMessage": { - "label": "Messaggio di allerta", - "description": "Messaggio di allerta" - }, - "alertMessageVibra": { - "label": "Vibrazione Messaggio Di Allerta", - "description": "Vibrazione Messaggio Di Allerta" - }, - "alertMessageBuzzer": { - "label": "Buzzer Messaggio Di Allerta", - "description": "Buzzer Messaggio Di Allerta" - }, - "alertBell": { - "label": "Campanella Di Allarme", - "description": "Occorre attivare una segnalazione quando si riceve un campanello in entrata?" - }, - "alertBellVibra": { - "label": "Vibrazione campanella di allarme", - "description": "Vibrazione campanella di allarme" - }, - "alertBellBuzzer": { - "label": "Buzzer campanella di allarme", - "description": "Buzzer campanella di allarme" - }, - "usePwm": { - "label": "Usa PWM", - "description": "Usa PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Usa I2S come buzzer", - "description": "Designa il Pin I²S come Uscita Buzzer" - } - }, - "mqtt": { - "title": "Impostazioni MQTT", - "description": "Impostazioni per il modulo MQTT", - "enabled": { - "label": "Abilitato", - "description": "Abilita o disabilita MQTT" - }, - "address": { - "label": "Indirizzo Server MQTT", - "description": "Indirizzo server MQTT da usare per i server predefiniti/personalizzati" - }, - "username": { - "label": "Username MQTT", - "description": "Username MQTT da usare per i server predefiniti/personalizzati" - }, - "password": { - "label": "Password MQTT", - "description": "Password MQTT da usare per server predefiniti/personalizzati" - }, - "encryptionEnabled": { - "label": "Crittografia Abilitata", - "description": "Abilita o disabilita la crittografia MQTT. Nota: Tutti i messaggi sono inviati al broker MQTT non cifrati se questa opzione non è abilitata, anche quando i canali uplink hanno chiavi di crittografia impostate. Ciò include i dati di posizione." - }, - "jsonEnabled": { - "label": "JSON Abilitato", - "description": "Indica se inviare/consumare pacchetti JSON su MQTT" - }, - "tlsEnabled": { - "label": "TLS abilitato", - "description": "Abilita o disabilita MQTT" - }, - "root": { - "label": "Root topic", - "description": "Topic root MQTT da utilizzare per server predefiniti/personalizzati" - }, - "proxyToClientEnabled": { - "label": "Proxy Client MQTT Abilitato", - "description": "Utilizza la connessione di rete per fare da proxy ai messaggi MQTT verso il client." - }, - "mapReportingEnabled": { - "label": "Segnalazione sulla Mappa Abilitata", - "description": "Il tuo nodo invierà periodicamente un pacchetto di segnalazione mappa non criptato al server MQTT configurato, questo include id, nome breve e lungo, posizione approssimativa, modello hardware, ruolo, versione del firmware, regione LoRa, preset del modem e nome del canale primario." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Intervallo di Pubblicazione Segnalazione Mappa (s)", - "description": "Intervallo in secondi per pubblicare le segnalazioni mappa" - }, - "positionPrecision": { - "label": "Posizione Approssimativa", - "description": "La posizione condivisa sarà accurata entro questa distanza", - "options": { - "metric_km23": "Entro 23 km", - "metric_km12": "Entro 12 km", - "metric_km5_8": "Entro 5,8 km", - "metric_km2_9": "Entro 2,9 km", - "metric_km1_5": "Entro 1,5 km", - "metric_m700": "Entro 700 m", - "metric_m350": "Entro 350 m", - "metric_m200": "Entro 200 m", - "metric_m90": "Entro 90 m", - "metric_m50": "Entro 50 m", - "imperial_mi15": "Entro 15 miglia", - "imperial_mi7_3": "Entro 7,3 miglia", - "imperial_mi3_6": "Entro 3,6 miglia", - "imperial_mi1_8": "Entro 1,8 miglia", - "imperial_mi0_9": "Entro 0,9 miglia", - "imperial_mi0_5": "Entro 0,5 miglia", - "imperial_mi0_2": "Entro 0,2 miglia", - "imperial_ft600": "Entro 600 piedi", - "imperial_ft300": "Entro 300 piedi", - "imperial_ft150": "Entro 150 piedi" - } - } - } - }, - "neighborInfo": { - "title": "Impostazioni Informazioni Vicini", - "description": "Impostazioni per il modulo Informazioni Vicini", - "enabled": { - "label": "Abilitato", - "description": "Abilita o disabilita Modulo Info Vicini" - }, - "updateInterval": { - "label": "Intervallo di Aggiornamento", - "description": "Intervallo in secondi di quanto spesso dovremmo cercare di inviare le nostre Info Vicini alla mesh" - } - }, - "paxcounter": { - "title": "Impostazioni Paxcounter", - "description": "Impostazioni per il modulo Paxcounter", - "enabled": { - "label": "Modulo abilitato", - "description": "Abilita Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Intervallo di aggiornamento (secondi)", - "description": "Per quanto tempo attendere tra l'invio di pacchetti paxcounter" - }, - "wifiThreshold": { - "label": "Soglia RSSI WiFi", - "description": "A quale livello RSSI WiFi dovrebbe aumentare il contatore. Predefinito a -80." - }, - "bleThreshold": { - "label": "Soglia RSSI BLE", - "description": "A quale livello RSSI BLE dovrebbe aumentare il contatore. Predefinito a -80." - } - }, - "rangeTest": { - "title": "Impostazioni Di Range Test", - "description": "Impostazioni per il modulo Range Test", - "enabled": { - "label": "Modulo abilitato", - "description": "Abilita Range Test" - }, - "sender": { - "label": "Intervallo Dei Messaggi", - "description": "Per quanto tempo attendere tra l'invio dei pacchetti di test" - }, - "save": { - "label": "Salva CSV nella memoria", - "description": "Solo ESP32" - } - }, - "serial": { - "title": "Impostazioni Seriale", - "description": "Impostazioni per il modulo seriale", - "enabled": { - "label": "Modulo abilitato", - "description": "Abilita output seriale" - }, - "echo": { - "label": "Echo", - "description": "Tutti i pacchetti che invii verranno rimandati indietro al tuo dispositivo" - }, - "rxd": { - "label": "Pin di ricezione", - "description": "Imposta il pin GPIO al pin RXD che hai configurato." - }, - "txd": { - "label": "Pin di trasmissione", - "description": "Imposta il pin GPIO al pin TXD che hai configurato." - }, - "baud": { - "label": "Baud rate", - "description": "La velocità di trasmissione seriale" - }, - "timeout": { - "label": "Timeout", - "description": "Secondi da attesa prima di considerare il tuo pacchetto come 'fatto'" - }, - "mode": { - "label": "Modalità", - "description": "Seleziona modalità" - }, - "overrideConsoleSerialPort": { - "label": "Sovrascrivi La Porta Seriale Della Console", - "description": "Se si dispone di una porta seriale collegata alla console, questa verrà sostituita." - } - }, - "storeForward": { - "title": "Configurazione Salva & Inoltra", - "description": "Impostazioni per il modulo Salva & Inoltra", - "enabled": { - "label": "Modulo abilitato", - "description": "Abilita Salva & Inoltra" - }, - "heartbeat": { - "label": "Heartbeat Abilitato", - "description": "Abilita heartbeat Store & Forward" - }, - "records": { - "label": "Numero di record", - "description": "Numero di record da memorizzare" - }, - "historyReturnMax": { - "label": "Cronologia ritorno max", - "description": "Numero massimo di record da restituire" - }, - "historyReturnWindow": { - "label": "Finestra di ritorno cronologia", - "description": "Numero massimo di record da restituire" - } - }, - "telemetry": { - "title": "Impostazioni Telemetria", - "description": "Impostazioni per il modulo Telemetria", - "deviceUpdateInterval": { - "label": "Metriche Dispositivo", - "description": "Intervallo aggiornamento metriche dispositivo (secondi)" - }, - "environmentUpdateInterval": { - "label": "Intervallo aggiornamento metriche ambientali (secondi)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Modulo abilitato", - "description": "Abilita la telemetria Ambiente" - }, - "environmentScreenEnabled": { - "label": "Visualizzato sullo schermo", - "description": "Mostra il modulo di telemetria sull'OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Mostra Fahrenheit", - "description": "Mostra la temperatura in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Qualità Dell'Aria Abilitata", - "description": "Abilita la telemetria della qualità dell'aria" - }, - "airQualityInterval": { - "label": "Intervallo Di Aggiornamento Qualità Dell'Aria", - "description": "Quanto spesso inviare dati sulla qualità dell'aria sulla mesh" - }, - "powerMeasurementEnabled": { - "label": "Misurazione Alimentazione Abilitata", - "description": "Abilita la telemetria di misura della alimentazione" - }, - "powerUpdateInterval": { - "label": "Intervallo Di Aggiornamento Alimentazione", - "description": "Quanto spesso inviare i dati di alimentazione sulla mesh" - }, - "powerScreenEnabled": { - "label": "Schermo Di Alimentazione Abilitato", - "description": "Abilita lo schermo di Telemetria di alimentazione" - } - } + "page": { + "tabAmbientLighting": "Luce Ambientale", + "tabAudio": "Audio", + "tabCannedMessage": "Predefiniti", + "tabDetectionSensor": "Sensore Di Rilevamento", + "tabExternalNotification": "Notifica Esterna", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Informazioni Vicinato", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Test Distanza", + "tabSerial": "Seriale", + "tabStoreAndForward": "S&I", + "tabTelemetry": "Telemetria" + }, + "ambientLighting": { + "title": "Configurazione Illuminazione Ambientale", + "description": "Impostazioni per il modulo Illuminazione Ambientale", + "ledState": { + "label": "Stato LED", + "description": "Imposta LED su acceso o spento" + }, + "current": { + "label": "Attuale", + "description": "Imposta la corrente per l'uscita LED. Il valore predefinito è 10" + }, + "red": { + "label": "Rosso", + "description": "Imposta il livello rosso del LED. I valori sono 0-255" + }, + "green": { + "label": "Verde", + "description": "Imposta il livello verde del LED. I valori sono 0-255" + }, + "blue": { + "label": "Blu", + "description": "Imposta il livello blu del LED. I valori sono 0-255" + } + }, + "audio": { + "title": "Impostazioni audio", + "description": "Impostazioni per il modulo audio", + "codec2Enabled": { + "label": "Codec 2 Abilitato", + "description": "Abilita la codifica audio Codec 2" + }, + "pttPin": { + "label": "Pin PTT", + "description": "GPIO pin da utilizzare per PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate da usare per la codifica audio" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin da usare per i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin da usare per i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin da usare per i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin da usare per i2S SCK" + } + }, + "cannedMessage": { + "title": "Impostazioni Messaggi Predefiniti", + "description": "Impostazioni per i Messaggi Predefiniti", + "moduleEnabled": { + "label": "Modulo abilitato", + "description": "Abilita Messaggi Predefiniti" + }, + "rotary1Enabled": { + "label": "Encoder Rotativo #1 Abilitato", + "description": "Abilita l'encoder rotativo" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "Valore Pin GPIO (1-39) Per porta encoder A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "Valore Pin GPIO (1-39) Per porta encoder B" + }, + "inputbrokerPinPress": { + "label": "Pin Pressione Encoder", + "description": "Valore Pin GPIO (1-39) Per la pressione dell'encoder" + }, + "inputbrokerEventCw": { + "label": "Evento in senso orario", + "description": "Seleziona evento in ingresso." + }, + "inputbrokerEventCcw": { + "label": "Evento in senso antiorario", + "description": "Seleziona evento in ingresso." + }, + "inputbrokerEventPress": { + "label": "Evento pressione", + "description": "Seleziona evento in ingresso" + }, + "updown1Enabled": { + "label": "Su Giù abilitato", + "description": "Abilita l'encoder su / giù" + }, + "allowInputSource": { + "label": "Consenti sorgente di input", + "description": "Seleziona da: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Invia Campanella", + "description": "Invia un carattere campanella con ogni messaggio" + } + }, + "detectionSensor": { + "title": "Configurazione Sensore Rilevamento", + "description": "Impostazioni per il modulo sensore di rilevamento", + "enabled": { + "label": "Abilitato", + "description": "Abilita o disabilita il modulo del sensore di rilevamento" + }, + "minimumBroadcastSecs": { + "label": "Secondi Di Trasmissione Minimi", + "description": "L'intervallo in secondi di quanto spesso possiamo inviare un messaggio alla mesh quando viene rilevato un cambiamento di stato" + }, + "stateBroadcastSecs": { + "label": "Secondi Trasmissione di Stato", + "description": "L'intervallo in secondi di quanto spesso dovremmo inviare un messaggio alla mesh con lo stato attuale indipendentemente dai cambiamenti" + }, + "sendBell": { + "label": "Invia Campanella", + "description": "Invia campanella ASCII con messaggio di avviso" + }, + "name": { + "label": "Nome Descrittivo", + "description": "Usato per formattare il messaggio inviato a mesh, max 20 Caratteri" + }, + "monitorPin": { + "label": "Pin Monitor", + "description": "Il pin GPIO da monitorare per i cambiamenti di stato" + }, + "detectionTriggerType": { + "label": "Tipo di trigger di rilevamento", + "description": "Il tipo di evento di trigger da usare" + }, + "usePullup": { + "label": "Usa Pullup", + "description": "Indica se usare o meno la modalità INPUT_PULLUP per il pin GPIO" + } + }, + "externalNotification": { + "title": "Configurazione Notifiche Esterne", + "description": "Configura il modulo notifiche esterno", + "enabled": { + "label": "Modulo abilitato", + "description": "Abilita Notifiche Esterne" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Vibrazione Output", + "description": "Vibrazione Output" + }, + "outputBuzzer": { + "label": "Buzzer Output", + "description": "Buzzer Output" + }, + "active": { + "label": "Attivo", + "description": "Attivo" + }, + "alertMessage": { + "label": "Messaggio di allerta", + "description": "Messaggio di allerta" + }, + "alertMessageVibra": { + "label": "Vibrazione Messaggio Di Allerta", + "description": "Vibrazione Messaggio Di Allerta" + }, + "alertMessageBuzzer": { + "label": "Buzzer Messaggio Di Allerta", + "description": "Buzzer Messaggio Di Allerta" + }, + "alertBell": { + "label": "Campanella Di Allarme", + "description": "Occorre attivare una segnalazione quando si riceve un campanello in entrata?" + }, + "alertBellVibra": { + "label": "Vibrazione campanella di allarme", + "description": "Vibrazione campanella di allarme" + }, + "alertBellBuzzer": { + "label": "Buzzer campanella di allarme", + "description": "Buzzer campanella di allarme" + }, + "usePwm": { + "label": "Usa PWM", + "description": "Usa PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Usa I2S come buzzer", + "description": "Designa il Pin I²S come Uscita Buzzer" + } + }, + "mqtt": { + "title": "Impostazioni MQTT", + "description": "Impostazioni per il modulo MQTT", + "enabled": { + "label": "Abilitato", + "description": "Abilita o disabilita MQTT" + }, + "address": { + "label": "Indirizzo Server MQTT", + "description": "Indirizzo server MQTT da usare per i server predefiniti/personalizzati" + }, + "username": { + "label": "Username MQTT", + "description": "Username MQTT da usare per i server predefiniti/personalizzati" + }, + "password": { + "label": "Password MQTT", + "description": "Password MQTT da usare per server predefiniti/personalizzati" + }, + "encryptionEnabled": { + "label": "Crittografia Abilitata", + "description": "Abilita o disabilita la crittografia MQTT. Nota: Tutti i messaggi sono inviati al broker MQTT non cifrati se questa opzione non è abilitata, anche quando i canali uplink hanno chiavi di crittografia impostate. Ciò include i dati di posizione." + }, + "jsonEnabled": { + "label": "JSON Abilitato", + "description": "Indica se inviare/consumare pacchetti JSON su MQTT" + }, + "tlsEnabled": { + "label": "TLS abilitato", + "description": "Abilita o disabilita MQTT" + }, + "root": { + "label": "Root topic", + "description": "Topic root MQTT da utilizzare per server predefiniti/personalizzati" + }, + "proxyToClientEnabled": { + "label": "Proxy Client MQTT Abilitato", + "description": "Utilizza la connessione di rete per fare da proxy ai messaggi MQTT verso il client." + }, + "mapReportingEnabled": { + "label": "Segnalazione sulla Mappa Abilitata", + "description": "Il tuo nodo invierà periodicamente un pacchetto di segnalazione mappa non criptato al server MQTT configurato, questo include id, nome breve e lungo, posizione approssimativa, modello hardware, ruolo, versione del firmware, regione LoRa, preset del modem e nome del canale primario." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Intervallo di Pubblicazione Segnalazione Mappa (s)", + "description": "Intervallo in secondi per pubblicare le segnalazioni mappa" + }, + "positionPrecision": { + "label": "Posizione Approssimativa", + "description": "La posizione condivisa sarà accurata entro questa distanza", + "options": { + "metric_km23": "Entro 23 km", + "metric_km12": "Entro 12 km", + "metric_km5_8": "Entro 5,8 km", + "metric_km2_9": "Entro 2,9 km", + "metric_km1_5": "Entro 1,5 km", + "metric_m700": "Entro 700 m", + "metric_m350": "Entro 350 m", + "metric_m200": "Entro 200 m", + "metric_m90": "Entro 90 m", + "metric_m50": "Entro 50 m", + "imperial_mi15": "Entro 15 miglia", + "imperial_mi7_3": "Entro 7,3 miglia", + "imperial_mi3_6": "Entro 3,6 miglia", + "imperial_mi1_8": "Entro 1,8 miglia", + "imperial_mi0_9": "Entro 0,9 miglia", + "imperial_mi0_5": "Entro 0,5 miglia", + "imperial_mi0_2": "Entro 0,2 miglia", + "imperial_ft600": "Entro 600 piedi", + "imperial_ft300": "Entro 300 piedi", + "imperial_ft150": "Entro 150 piedi" + } + } + } + }, + "neighborInfo": { + "title": "Impostazioni Informazioni Vicini", + "description": "Impostazioni per il modulo Informazioni Vicini", + "enabled": { + "label": "Abilitato", + "description": "Abilita o disabilita Modulo Info Vicini" + }, + "updateInterval": { + "label": "Intervallo di Aggiornamento", + "description": "Intervallo in secondi di quanto spesso dovremmo cercare di inviare le nostre Info Vicini alla mesh" + } + }, + "paxcounter": { + "title": "Impostazioni Paxcounter", + "description": "Impostazioni per il modulo Paxcounter", + "enabled": { + "label": "Modulo abilitato", + "description": "Abilita Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Intervallo di aggiornamento (secondi)", + "description": "Per quanto tempo attendere tra l'invio di pacchetti paxcounter" + }, + "wifiThreshold": { + "label": "Soglia RSSI WiFi", + "description": "A quale livello RSSI WiFi dovrebbe aumentare il contatore. Predefinito a -80." + }, + "bleThreshold": { + "label": "Soglia RSSI BLE", + "description": "A quale livello RSSI BLE dovrebbe aumentare il contatore. Predefinito a -80." + } + }, + "rangeTest": { + "title": "Impostazioni Di Range Test", + "description": "Impostazioni per il modulo Range Test", + "enabled": { + "label": "Modulo abilitato", + "description": "Abilita Range Test" + }, + "sender": { + "label": "Intervallo Dei Messaggi", + "description": "Per quanto tempo attendere tra l'invio dei pacchetti di test" + }, + "save": { + "label": "Salva CSV nella memoria", + "description": "Solo ESP32" + } + }, + "serial": { + "title": "Impostazioni Seriale", + "description": "Impostazioni per il modulo seriale", + "enabled": { + "label": "Modulo abilitato", + "description": "Abilita output seriale" + }, + "echo": { + "label": "Echo", + "description": "Tutti i pacchetti che invii verranno rimandati indietro al tuo dispositivo" + }, + "rxd": { + "label": "Pin di ricezione", + "description": "Imposta il pin GPIO al pin RXD che hai configurato." + }, + "txd": { + "label": "Pin di trasmissione", + "description": "Imposta il pin GPIO al pin TXD che hai configurato." + }, + "baud": { + "label": "Baud rate", + "description": "La velocità di trasmissione seriale" + }, + "timeout": { + "label": "Timeout", + "description": "Secondi da attesa prima di considerare il tuo pacchetto come 'fatto'" + }, + "mode": { + "label": "Modalità", + "description": "Seleziona modalità" + }, + "overrideConsoleSerialPort": { + "label": "Sovrascrivi La Porta Seriale Della Console", + "description": "Se si dispone di una porta seriale collegata alla console, questa verrà sostituita." + } + }, + "storeForward": { + "title": "Configurazione Salva & Inoltra", + "description": "Impostazioni per il modulo Salva & Inoltra", + "enabled": { + "label": "Modulo abilitato", + "description": "Abilita Salva & Inoltra" + }, + "heartbeat": { + "label": "Heartbeat Abilitato", + "description": "Abilita heartbeat Store & Forward" + }, + "records": { + "label": "Numero di record", + "description": "Numero di record da memorizzare" + }, + "historyReturnMax": { + "label": "Cronologia ritorno max", + "description": "Numero massimo di record da restituire" + }, + "historyReturnWindow": { + "label": "Finestra di ritorno cronologia", + "description": "Numero massimo di record da restituire" + } + }, + "telemetry": { + "title": "Impostazioni Telemetria", + "description": "Impostazioni per il modulo Telemetria", + "deviceUpdateInterval": { + "label": "Metriche Dispositivo", + "description": "Intervallo aggiornamento metriche dispositivo (secondi)" + }, + "environmentUpdateInterval": { + "label": "Intervallo aggiornamento metriche ambientali (secondi)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Modulo abilitato", + "description": "Abilita la telemetria Ambiente" + }, + "environmentScreenEnabled": { + "label": "Visualizzato sullo schermo", + "description": "Mostra il modulo di telemetria sull'OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Mostra Fahrenheit", + "description": "Mostra la temperatura in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Qualità Dell'Aria Abilitata", + "description": "Abilita la telemetria della qualità dell'aria" + }, + "airQualityInterval": { + "label": "Intervallo Di Aggiornamento Qualità Dell'Aria", + "description": "Quanto spesso inviare dati sulla qualità dell'aria sulla mesh" + }, + "powerMeasurementEnabled": { + "label": "Misurazione Alimentazione Abilitata", + "description": "Abilita la telemetria di misura della alimentazione" + }, + "powerUpdateInterval": { + "label": "Intervallo Di Aggiornamento Alimentazione", + "description": "Quanto spesso inviare i dati di alimentazione sulla mesh" + }, + "powerScreenEnabled": { + "label": "Schermo Di Alimentazione Abilitato", + "description": "Abilita lo schermo di Telemetria di alimentazione" + } + } } diff --git a/packages/web/public/i18n/locales/it-IT/nodes.json b/packages/web/public/i18n/locales/it-IT/nodes.json index 08bb7559..ee0fd6e1 100644 --- a/packages/web/public/i18n/locales/it-IT/nodes.json +++ b/packages/web/public/i18n/locales/it-IT/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Chiave Pubblica Abilitata" - }, - "noPublicKey": { - "label": "Nessuna Chiave Pubblica" - }, - "directMessage": { - "label": "Messaggio Diretto {{shortName}}" - }, - "favorite": { - "label": "Preferito", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Non è un preferito" - }, - "error": { - "label": "Errori", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Sentito", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Altezza" - }, - "channelUtil": { - "label": "Utilizzo Canale" - }, - "airtimeUtil": { - "label": "Utilizzo Airtime" - } - }, - "nodesTable": { - "headings": { - "longName": "Nome Lungo", - "connection": "Connessione", - "lastHeard": "Ultimo Contatto", - "encryption": "Crittografia", - "model": "Modello", - "macAddress": "Indirizzo MAC" - }, - "connectionStatus": { - "direct": "Diretto", - "away": "assente", - "unknown": "-", - "viaMqtt": ", tramite MQTT" - }, - "lastHeardStatus": { - "never": "Mai" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Richiedi posizione" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Chiave Pubblica Abilitata" + }, + "noPublicKey": { + "label": "Nessuna Chiave Pubblica" + }, + "directMessage": { + "label": "Messaggio Diretto {{shortName}}" + }, + "favorite": { + "label": "Preferito", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Non è un preferito" + }, + "error": { + "label": "Errori", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Sentito", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Altezza" + }, + "channelUtil": { + "label": "Utilizzo Canale" + }, + "airtimeUtil": { + "label": "Utilizzo Airtime" + } + }, + "nodesTable": { + "headings": { + "longName": "Nome Lungo", + "connection": "Connessione", + "lastHeard": "Ultimo Contatto", + "encryption": "Crittografia", + "model": "Modello", + "macAddress": "Indirizzo MAC" + }, + "connectionStatus": { + "direct": "Diretto", + "away": "assente", + "unknown": "-", + "viaMqtt": ", tramite MQTT" + }, + "lastHeardStatus": { + "never": "Mai" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Richiedi posizione" + } } diff --git a/packages/web/public/i18n/locales/it-IT/ui.json b/packages/web/public/i18n/locales/it-IT/ui.json index 2925be76..f5d925cd 100644 --- a/packages/web/public/i18n/locales/it-IT/ui.json +++ b/packages/web/public/i18n/locales/it-IT/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigazione", - "messages": "Messaggi", - "map": "Mappa", - "config": "Configurazione", - "radioConfig": "Configurazione Radio", - "moduleConfig": "Configurazione Modulo", - "channels": "Canali", - "nodes": "Nodi" - }, - "app": { - "title": "Meshtastic", - "logo": "Logo Meshtastic" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Apri barra laterale", - "close": "Chiudi barra laterale" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volt", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Data di build: {{date}}" - }, - "deviceName": { - "title": "Nome del dispositivo", - "changeName": "Cambia Nome Del Dispositivo", - "placeholder": "Inserisci il nome del dispositivo" - }, - "editDeviceName": "Modifica il nome del dispositivo" - } - }, - "batteryStatus": { - "charging": "{{level}}% in carica", - "pluggedIn": "Alimentato", - "title": "Batteria" - }, - "search": { - "nodes": "Cerca nodi...", - "channels": "Cerca canali...", - "commandPalette": "Cerca comandi..." - }, - "toast": { - "positionRequestSent": { - "title": "Richiesta di posizione inviata." - }, - "requestingPosition": { - "title": "Richiesta di posizione, attendere prego..." - }, - "sendingTraceroute": { - "title": "Invio di Traceroute, attendere prego..." - }, - "tracerouteSent": { - "title": "Traceroute inviato." - }, - "savedChannel": { - "title": "Canale Salvato: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "La chat sta usando la crittografia PKI." - }, - "pskEncryption": { - "title": "La chat sta usando la crittografia PSK." - } - }, - "configSaveError": { - "title": "Errore Salvataggio Configurazione", - "description": "Si è verificato un errore durante il salvataggio di questa configurazione." - }, - "validationError": { - "title": "Esistono errori di configurazione", - "description": "Correggi gli errori di configurazione prima di salvare." - }, - "saveSuccess": { - "title": "Salvataggio Configurazione", - "description": "La modifica di configurazione {{case}} è stata salvata." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copiato!" - }, - "copyToClipboard": { - "label": "Copia negli appunti" - }, - "hidePassword": { - "label": "Nascondi password" - }, - "showPassword": { - "label": "Visualizza password" - }, - "deliveryStatus": { - "delivered": "Consegnato", - "failed": "Consegna Fallita", - "waiting": "In attesa", - "unknown": "Sconosciuto" - } - }, - "general": { - "label": "Generale" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Statistiche" - }, - "role": { - "label": "Ruolo" - }, - "filter": { - "label": "Filtro" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Cancella input" - }, - "resetFilters": { - "label": "Ripristina Filtri" - }, - "nodeName": { - "label": "Nome/numero del nodo", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Tempo di Trasmissione Utilizzato (%)" - }, - "batteryLevel": { - "label": "Livello batteria (%)", - "labelText": "Livello batteria (%): {{value}}" - }, - "batteryVoltage": { - "label": "Tensione della Batteria (V)", - "title": "Tensione" - }, - "channelUtilization": { - "label": "Utilizzo Canale (%)" - }, - "hops": { - "direct": "Diretto", - "label": "Numero di hop", - "text": "Numero di hop: {{value}}" - }, - "lastHeard": { - "label": "Ricevuto più di recente", - "labelText": "Ultimo contatto: {{value}}", - "nowLabel": "Adesso" - }, - "snr": { - "label": "SNR (dB)" - }, - "favorites": { - "label": "Preferiti" - }, - "hide": { - "label": "Nascondi" - }, - "showOnly": { - "label": "Mostra Solo" - }, - "viaMqtt": { - "label": "Connesso tramite MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Lingua", - "changeLanguage": "Cambia Lingua" - }, - "theme": { - "dark": "Scuro", - "light": "Chiaro", - "system": "Automatico", - "changeTheme": "Modifica lo schema dei colori" - }, - "errorPage": { - "title": "Questo è un po' imbarazzante...", - "description1": "Siamo davvero spiacenti, ma si è verificato un errore nel client web che ha causato il crash.
Questo non dovrebbe accadere e stiamo lavorando duramente per risolverlo.", - "description2": "Il modo migliore per evitare che ciò accada di nuovo a voi o a chiunque altro è quello di riferire la questione a noi.", - "reportInstructions": "Per favore includi le seguenti informazioni nel tuo report:", - "reportSteps": { - "step1": "Cosa stavi facendo quando si è verificato l'errore", - "step2": "Cosa ti aspettavi succedesse", - "step3": "Quello che è successo realmente", - "step4": "Altre informazioni rilevanti" - }, - "reportLink": "Puoi segnalare il problema al nostro <0>GitHub", - "dashboardLink": "Ritorna alla <0>dashboard", - "detailsSummary": "Dettagli Errore", - "errorMessageLabel": "Messaggio di errore:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® è un marchio registrato di Meshtastic LLC. | <1>Informazioni Legali", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigazione", + "messages": "Messaggi", + "map": "Mappa", + "config": "Configurazione", + "radioConfig": "Configurazione Radio", + "moduleConfig": "Configurazione Modulo", + "channels": "Canali", + "nodes": "Nodi" + }, + "app": { + "title": "Meshtastic", + "logo": "Logo Meshtastic" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Apri barra laterale", + "close": "Chiudi barra laterale" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volt", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Data di build: {{date}}" + }, + "deviceName": { + "title": "Nome del dispositivo", + "changeName": "Cambia Nome Del Dispositivo", + "placeholder": "Inserisci il nome del dispositivo" + }, + "editDeviceName": "Modifica il nome del dispositivo" + } + }, + "batteryStatus": { + "charging": "{{level}}% in carica", + "pluggedIn": "Alimentato", + "title": "Batteria" + }, + "search": { + "nodes": "Cerca nodi...", + "channels": "Cerca canali...", + "commandPalette": "Cerca comandi..." + }, + "toast": { + "positionRequestSent": { + "title": "Richiesta di posizione inviata." + }, + "requestingPosition": { + "title": "Richiesta di posizione, attendere prego..." + }, + "sendingTraceroute": { + "title": "Invio di Traceroute, attendere prego..." + }, + "tracerouteSent": { + "title": "Traceroute inviato." + }, + "savedChannel": { + "title": "Canale Salvato: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "La chat sta usando la crittografia PKI." + }, + "pskEncryption": { + "title": "La chat sta usando la crittografia PSK." + } + }, + "configSaveError": { + "title": "Errore Salvataggio Configurazione", + "description": "Si è verificato un errore durante il salvataggio di questa configurazione." + }, + "validationError": { + "title": "Esistono errori di configurazione", + "description": "Correggi gli errori di configurazione prima di salvare." + }, + "saveSuccess": { + "title": "Salvataggio Configurazione", + "description": "La modifica di configurazione {{case}} è stata salvata." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copiato!" + }, + "copyToClipboard": { + "label": "Copia negli appunti" + }, + "hidePassword": { + "label": "Nascondi password" + }, + "showPassword": { + "label": "Visualizza password" + }, + "deliveryStatus": { + "delivered": "Consegnato", + "failed": "Consegna Fallita", + "waiting": "In attesa", + "unknown": "Sconosciuto" + } + }, + "general": { + "label": "Generale" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Statistiche" + }, + "role": { + "label": "Ruolo" + }, + "filter": { + "label": "Filtro" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Cancella input" + }, + "resetFilters": { + "label": "Ripristina Filtri" + }, + "nodeName": { + "label": "Nome/numero del nodo", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Tempo di Trasmissione Utilizzato (%)" + }, + "batteryLevel": { + "label": "Livello batteria (%)", + "labelText": "Livello batteria (%): {{value}}" + }, + "batteryVoltage": { + "label": "Tensione della Batteria (V)", + "title": "Tensione" + }, + "channelUtilization": { + "label": "Utilizzo Canale (%)" + }, + "hops": { + "direct": "Diretto", + "label": "Numero di hop", + "text": "Numero di hop: {{value}}" + }, + "lastHeard": { + "label": "Ricevuto più di recente", + "labelText": "Ultimo contatto: {{value}}", + "nowLabel": "Adesso" + }, + "snr": { + "label": "SNR (dB)" + }, + "favorites": { + "label": "Preferiti" + }, + "hide": { + "label": "Nascondi" + }, + "showOnly": { + "label": "Mostra Solo" + }, + "viaMqtt": { + "label": "Connesso tramite MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Lingua", + "changeLanguage": "Cambia Lingua" + }, + "theme": { + "dark": "Scuro", + "light": "Chiaro", + "system": "Automatico", + "changeTheme": "Modifica lo schema dei colori" + }, + "errorPage": { + "title": "Questo è un po' imbarazzante...", + "description1": "Siamo davvero spiacenti, ma si è verificato un errore nel client web che ha causato il crash.
Questo non dovrebbe accadere e stiamo lavorando duramente per risolverlo.", + "description2": "Il modo migliore per evitare che ciò accada di nuovo a voi o a chiunque altro è quello di riferire la questione a noi.", + "reportInstructions": "Per favore includi le seguenti informazioni nel tuo report:", + "reportSteps": { + "step1": "Cosa stavi facendo quando si è verificato l'errore", + "step2": "Cosa ti aspettavi succedesse", + "step3": "Quello che è successo realmente", + "step4": "Altre informazioni rilevanti" + }, + "reportLink": "Puoi segnalare il problema al nostro <0>GitHub", + "dashboardLink": "Ritorna alla <0>dashboard", + "detailsSummary": "Dettagli Errore", + "errorMessageLabel": "Messaggio di errore:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® è un marchio registrato di Meshtastic LLC. | <1>Informazioni Legali", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/ja-JP/channels.json b/packages/web/public/i18n/locales/ja-JP/channels.json index 5dc28596..594dc7ad 100644 --- a/packages/web/public/i18n/locales/ja-JP/channels.json +++ b/packages/web/public/i18n/locales/ja-JP/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "チャンネル", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "プライマリ", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "チャンネル設定", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "役割", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "名前", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "チャンネル", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "プライマリ", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "チャンネル設定", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "役割", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "名前", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/commandPalette.json b/packages/web/public/i18n/locales/ja-JP/commandPalette.json index d43e0ee4..af26a208 100644 --- a/packages/web/public/i18n/locales/ja-JP/commandPalette.json +++ b/packages/web/public/i18n/locales/ja-JP/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "メッセージ", - "map": "地図", - "config": "Config", - "channels": "チャンネル", - "nodes": "ノード" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "インポート", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "メッセージ", + "map": "地図", + "config": "Config", + "channels": "チャンネル", + "nodes": "ノード" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "インポート", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/common.json b/packages/web/public/i18n/locales/ja-JP/common.json index 000754fb..d8714638 100644 --- a/packages/web/public/i18n/locales/ja-JP/common.json +++ b/packages/web/public/i18n/locales/ja-JP/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "適用", - "backupKey": "Backup Key", - "cancel": "キャンセル", - "clearMessages": "Clear Messages", - "close": "終了", - "confirm": "Confirm", - "delete": "削除", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "インポート", - "message": "メッセージ", - "now": "Now", - "ok": "OK", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "削除", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "リセット", - "save": "保存", - "scanQr": "QRコードをスキャン", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SN比", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "適用", + "backupKey": "Backup Key", + "cancel": "キャンセル", + "clearMessages": "Clear Messages", + "close": "終了", + "confirm": "Confirm", + "delete": "削除", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "インポート", + "message": "メッセージ", + "now": "Now", + "ok": "OK", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "削除", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "リセット", + "save": "保存", + "scanQr": "QRコードをスキャン", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SN比", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/dashboard.json b/packages/web/public/i18n/locales/ja-JP/dashboard.json index 890b4644..eda0d592 100644 --- a/packages/web/public/i18n/locales/ja-JP/dashboard.json +++ b/packages/web/public/i18n/locales/ja-JP/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "シリアル", - "connectionType_network": "ネットワーク", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "シリアル", + "connectionType_network": "ネットワーク", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/ja-JP/deviceConfig.json b/packages/web/public/i18n/locales/ja-JP/deviceConfig.json index eaaa6010..dea227ee 100644 --- a/packages/web/public/i18n/locales/ja-JP/deviceConfig.json +++ b/packages/web/public/i18n/locales/ja-JP/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "接続するデバイスを選択", - "tabDisplay": "表示", - "tabLora": "LoRa", - "tabNetwork": "ネットワーク", - "tabPosition": "位置", - "tabPower": "電源", - "tabSecurity": "セキュリティ" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX 時間帯" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "役割" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "ペアリングモード" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "帯域" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "MQTT を無視" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "モデムプリセット" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "MQTTを許可" - }, - "overrideDutyCycle": { - "description": "デューティサイクルを上書き", - "label": "デューティサイクルを上書き" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "リージョン" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "ゲートウェイ" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "サブネット" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP Config" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "タイムスタンプ", - "unset": "削除", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "省電力モードを有効化" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "電源設定" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "秘密鍵" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "公開鍵" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "接続するデバイスを選択", + "tabDisplay": "表示", + "tabLora": "LoRa", + "tabNetwork": "ネットワーク", + "tabPosition": "位置", + "tabPower": "電源", + "tabSecurity": "セキュリティ" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX 時間帯" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "役割" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "ペアリングモード" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "帯域" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "MQTT を無視" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "モデムプリセット" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "MQTTを許可" + }, + "overrideDutyCycle": { + "description": "デューティサイクルを上書き", + "label": "デューティサイクルを上書き" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "リージョン" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "ゲートウェイ" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "サブネット" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP Config" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "タイムスタンプ", + "unset": "削除", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "省電力モードを有効化" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "電源設定" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "秘密鍵" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "公開鍵" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/dialog.json b/packages/web/public/i18n/locales/ja-JP/dialog.json index 86498524..6bd1ed54 100644 --- a/packages/web/public/i18n/locales/ja-JP/dialog.json +++ b/packages/web/public/i18n/locales/ja-JP/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "シリアル", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "メッセージ", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "電圧", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "よろしいですか?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "よろしいですか?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "シリアル", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "メッセージ", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "電圧", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "よろしいですか?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "よろしいですか?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/ja-JP/messages.json b/packages/web/public/i18n/locales/ja-JP/messages.json index 62ae8df7..859a75fd 100644 --- a/packages/web/public/i18n/locales/ja-JP/messages.json +++ b/packages/web/public/i18n/locales/ja-JP/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "送信" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "返信" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "送信" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "返信" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/moduleConfig.json b/packages/web/public/i18n/locales/ja-JP/moduleConfig.json index c6d82c85..85ccea96 100644 --- a/packages/web/public/i18n/locales/ja-JP/moduleConfig.json +++ b/packages/web/public/i18n/locales/ja-JP/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "環境照明", - "tabAudio": "オーディオ", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "検出センサー", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "隣接ノード情報", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "レンジテスト", - "tabSerial": "シリアル", - "tabStoreAndForward": "S&F", - "tabTelemetry": "テレメトリー" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "電流", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "赤", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "緑", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "青", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "ルート トピック", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "タイムアウト", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "サーバーの最大保管レコード数 (デフォルト 約11,000レコード)", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "リクエスト可能な最大の履歴件数", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "リクエスト可能な履歴の期間 (分)", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "デバイスのメトリック更新間隔 (秒)" - }, - "environmentUpdateInterval": { - "label": "環境メトリック更新間隔 (秒)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "環境照明", + "tabAudio": "オーディオ", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "検出センサー", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "隣接ノード情報", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "レンジテスト", + "tabSerial": "シリアル", + "tabStoreAndForward": "S&F", + "tabTelemetry": "テレメトリー" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "電流", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "赤", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "緑", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "青", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "ルート トピック", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "タイムアウト", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "サーバーの最大保管レコード数 (デフォルト 約11,000レコード)", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "リクエスト可能な最大の履歴件数", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "リクエスト可能な履歴の期間 (分)", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "デバイスのメトリック更新間隔 (秒)" + }, + "environmentUpdateInterval": { + "label": "環境メトリック更新間隔 (秒)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/ja-JP/nodes.json b/packages/web/public/i18n/locales/ja-JP/nodes.json index 181220f0..ef598446 100644 --- a/packages/web/public/i18n/locales/ja-JP/nodes.json +++ b/packages/web/public/i18n/locales/ja-JP/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "お気に入り", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "エラー", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "直接", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "お気に入り", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "エラー", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "直接", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/ja-JP/ui.json b/packages/web/public/i18n/locales/ja-JP/ui.json index 56983270..64648e5d 100644 --- a/packages/web/public/i18n/locales/ja-JP/ui.json +++ b/packages/web/public/i18n/locales/ja-JP/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "メッセージ", - "map": "地図", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "チャンネル", - "nodes": "ノード" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "ファームウェア", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "バッテリー" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "パスワードを非表示" - }, - "showPassword": { - "label": "パスワードを表示" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "ハードウェア" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "役割" - }, - "filter": { - "label": "絞り込み" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "電圧" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "直接", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "最後の通信", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "言語設定", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "ダーク", - "light": "ライト", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "メッセージ", + "map": "地図", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "チャンネル", + "nodes": "ノード" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "ファームウェア", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "バッテリー" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "パスワードを非表示" + }, + "showPassword": { + "label": "パスワードを表示" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "ハードウェア" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "役割" + }, + "filter": { + "label": "絞り込み" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "電圧" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "直接", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "最後の通信", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "言語設定", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "ダーク", + "light": "ライト", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/ko-KR/channels.json b/packages/web/public/i18n/locales/ko-KR/channels.json index 0987f269..982f237a 100644 --- a/packages/web/public/i18n/locales/ko-KR/channels.json +++ b/packages/web/public/i18n/locales/ko-KR/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "채널", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Primary", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "채널 설정", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "역할", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "이름", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "채널", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Primary", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "채널 설정", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "역할", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "이름", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/commandPalette.json b/packages/web/public/i18n/locales/ko-KR/commandPalette.json index a7bcc191..744c2faf 100644 --- a/packages/web/public/i18n/locales/ko-KR/commandPalette.json +++ b/packages/web/public/i18n/locales/ko-KR/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "메시지", - "map": "지도", - "config": "Config", - "channels": "채널", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "불러오기", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "메시지", + "map": "지도", + "config": "Config", + "channels": "채널", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "불러오기", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/common.json b/packages/web/public/i18n/locales/ko-KR/common.json index 6b7b6a87..98150685 100644 --- a/packages/web/public/i18n/locales/ko-KR/common.json +++ b/packages/web/public/i18n/locales/ko-KR/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "적용", - "backupKey": "Backup Key", - "cancel": "취소", - "clearMessages": "Clear Messages", - "close": "닫기", - "confirm": "Confirm", - "delete": "삭제", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "불러오기", - "message": "메시지", - "now": "Now", - "ok": "확인", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "지우기", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "초기화", - "save": "저장", - "scanQr": " QR코드 스캔", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "적용", + "backupKey": "Backup Key", + "cancel": "취소", + "clearMessages": "Clear Messages", + "close": "닫기", + "confirm": "Confirm", + "delete": "삭제", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "불러오기", + "message": "메시지", + "now": "Now", + "ok": "확인", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "지우기", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "초기화", + "save": "저장", + "scanQr": " QR코드 스캔", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/dashboard.json b/packages/web/public/i18n/locales/ko-KR/dashboard.json index c3dc1447..69430571 100644 --- a/packages/web/public/i18n/locales/ko-KR/dashboard.json +++ b/packages/web/public/i18n/locales/ko-KR/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "시리얼", - "connectionType_network": "네트워크", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "시리얼", + "connectionType_network": "네트워크", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/ko-KR/deviceConfig.json b/packages/web/public/i18n/locales/ko-KR/deviceConfig.json index c26b0244..35212bd1 100644 --- a/packages/web/public/i18n/locales/ko-KR/deviceConfig.json +++ b/packages/web/public/i18n/locales/ko-KR/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "블루투스", - "tabDevice": "기기", - "tabDisplay": "화면", - "tabLora": "LoRa", - "tabNetwork": "네트워크", - "tabPosition": "위치", - "tabPower": "전원", - "tabSecurity": "보안" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX 시간대" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "역할" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "페어링 모드" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "대역폭" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "MQTT로 부터 수신 무시" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "모뎀 프리셋" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "MQTT로 전송 허용" - }, - "overrideDutyCycle": { - "description": "Duty Cycle 무시", - "label": "Duty Cycle 무시" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "지역" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "게이트웨이" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "서브넷" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP 설정" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "타임스탬프", - "unset": "해제", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "저젼력 모드 설정" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "전원 설정" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "개인 키" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "공개 키" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "블루투스", + "tabDevice": "기기", + "tabDisplay": "화면", + "tabLora": "LoRa", + "tabNetwork": "네트워크", + "tabPosition": "위치", + "tabPower": "전원", + "tabSecurity": "보안" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX 시간대" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "역할" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "페어링 모드" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "대역폭" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "MQTT로 부터 수신 무시" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "모뎀 프리셋" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "MQTT로 전송 허용" + }, + "overrideDutyCycle": { + "description": "Duty Cycle 무시", + "label": "Duty Cycle 무시" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "지역" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "게이트웨이" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "서브넷" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP 설정" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "타임스탬프", + "unset": "해제", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "저젼력 모드 설정" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "전원 설정" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "개인 키" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "공개 키" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/dialog.json b/packages/web/public/i18n/locales/ko-KR/dialog.json index 8e2459f4..786932fa 100644 --- a/packages/web/public/i18n/locales/ko-KR/dialog.json +++ b/packages/web/public/i18n/locales/ko-KR/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "블루투스", - "tabSerial": "시리얼", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "메시지", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "전압", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "확실합니까?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "확실합니까?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "블루투스", + "tabSerial": "시리얼", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "메시지", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "전압", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "확실합니까?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "확실합니까?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/ko-KR/messages.json b/packages/web/public/i18n/locales/ko-KR/messages.json index e1d652ea..330bf054 100644 --- a/packages/web/public/i18n/locales/ko-KR/messages.json +++ b/packages/web/public/i18n/locales/ko-KR/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "보내기" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "보내기" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/moduleConfig.json b/packages/web/public/i18n/locales/ko-KR/moduleConfig.json index 628da18b..afe8287e 100644 --- a/packages/web/public/i18n/locales/ko-KR/moduleConfig.json +++ b/packages/web/public/i18n/locales/ko-KR/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "조명", - "tabAudio": "오디오", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "감지 센서", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "이웃 정보", - "tabPaxcounter": "팍스카운터", - "tabRangeTest": "거리 테스트", - "tabSerial": "시리얼", - "tabStoreAndForward": "S&F", - "tabTelemetry": "텔레메트리" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "전류", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "빨강", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "초록", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "파랑", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "시간 초과됨", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Number of records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "기기 메트릭 업데이트 간격 (초)" - }, - "environmentUpdateInterval": { - "label": "환경 메트릭 업데이트 간격 (초)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "조명", + "tabAudio": "오디오", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "감지 센서", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "이웃 정보", + "tabPaxcounter": "팍스카운터", + "tabRangeTest": "거리 테스트", + "tabSerial": "시리얼", + "tabStoreAndForward": "S&F", + "tabTelemetry": "텔레메트리" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "전류", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "빨강", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "초록", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "파랑", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "시간 초과됨", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Number of records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "기기 메트릭 업데이트 간격 (초)" + }, + "environmentUpdateInterval": { + "label": "환경 메트릭 업데이트 간격 (초)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/ko-KR/nodes.json b/packages/web/public/i18n/locales/ko-KR/nodes.json index e6e37463..00895f4f 100644 --- a/packages/web/public/i18n/locales/ko-KR/nodes.json +++ b/packages/web/public/i18n/locales/ko-KR/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "즐겨찾기", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "오류", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "직접 연결", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "즐겨찾기", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "오류", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "직접 연결", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/ko-KR/ui.json b/packages/web/public/i18n/locales/ko-KR/ui.json index d413bed1..dd413f43 100644 --- a/packages/web/public/i18n/locales/ko-KR/ui.json +++ b/packages/web/public/i18n/locales/ko-KR/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "메시지", - "map": "지도", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "채널", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "펌웨어", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "배터리" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "비밀번호 숨김" - }, - "showPassword": { - "label": "비밀번호 보기" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "하드웨어" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "역할" - }, - "filter": { - "label": "필터" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "전압" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "직접 연결", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "최근 수신", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "언어", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "다크", - "light": "라이트", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "메시지", + "map": "지도", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "채널", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "펌웨어", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "배터리" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "비밀번호 숨김" + }, + "showPassword": { + "label": "비밀번호 보기" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "하드웨어" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "역할" + }, + "filter": { + "label": "필터" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "전압" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "직접 연결", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "최근 수신", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "언어", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "다크", + "light": "라이트", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/nl-NL/channels.json b/packages/web/public/i18n/locales/nl-NL/channels.json index ef9b4d4b..79f0d8d2 100644 --- a/packages/web/public/i18n/locales/nl-NL/channels.json +++ b/packages/web/public/i18n/locales/nl-NL/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanalen", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Primair", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Kanaalinstellingen", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Functie", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Naam", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Kanalen", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Primair", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Kanaalinstellingen", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Functie", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Naam", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/commandPalette.json b/packages/web/public/i18n/locales/nl-NL/commandPalette.json index 87c47c87..1a357977 100644 --- a/packages/web/public/i18n/locales/nl-NL/commandPalette.json +++ b/packages/web/public/i18n/locales/nl-NL/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Berichten", - "map": "Kaart", - "config": "Config", - "channels": "Kanalen", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Importeer", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Berichten", + "map": "Kaart", + "config": "Config", + "channels": "Kanalen", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Importeer", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/common.json b/packages/web/public/i18n/locales/nl-NL/common.json index e426f48b..8f3f56d9 100644 --- a/packages/web/public/i18n/locales/nl-NL/common.json +++ b/packages/web/public/i18n/locales/nl-NL/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Toepassen", - "backupKey": "Backup Key", - "cancel": "Annuleer", - "clearMessages": "Clear Messages", - "close": "Sluit", - "confirm": "Confirm", - "delete": "Verwijder", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Importeer", - "message": "Bericht", - "now": "Now", - "ok": "OK", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Verwijder", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Reset", - "save": "Opslaan", - "scanQr": "Scan QR-code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Toepassen", + "backupKey": "Backup Key", + "cancel": "Annuleer", + "clearMessages": "Clear Messages", + "close": "Sluit", + "confirm": "Confirm", + "delete": "Verwijder", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Importeer", + "message": "Bericht", + "now": "Now", + "ok": "OK", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Verwijder", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Reset", + "save": "Opslaan", + "scanQr": "Scan QR-code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/dashboard.json b/packages/web/public/i18n/locales/nl-NL/dashboard.json index 3f7c26d6..260a9738 100644 --- a/packages/web/public/i18n/locales/nl-NL/dashboard.json +++ b/packages/web/public/i18n/locales/nl-NL/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Serieel", - "connectionType_network": "Netwerk", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Serieel", + "connectionType_network": "Netwerk", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/nl-NL/deviceConfig.json b/packages/web/public/i18n/locales/nl-NL/deviceConfig.json index 19db7dae..6e766221 100644 --- a/packages/web/public/i18n/locales/nl-NL/deviceConfig.json +++ b/packages/web/public/i18n/locales/nl-NL/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Apparaat", - "tabDisplay": "Weergave", - "tabLora": "LoRa", - "tabNetwork": "Netwerk", - "tabPosition": "Positie", - "tabPower": "Vermogen", - "tabSecurity": "Beveiliging" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Functie" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Koppelmodus" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bandbreedte" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Negeer MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Overschrijf Duty Cycle", - "label": "Overschrijf Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Regio" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP Address", - "label": "IP-adres" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP Configuratie" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Tijdstempel", - "unset": "Terugzetten", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Energiebesparingsmodus inschakelen" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Energie configuratie" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Privésleutel" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Publieke sleutel" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Apparaat", + "tabDisplay": "Weergave", + "tabLora": "LoRa", + "tabNetwork": "Netwerk", + "tabPosition": "Positie", + "tabPower": "Vermogen", + "tabSecurity": "Beveiliging" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Functie" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Koppelmodus" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bandbreedte" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Negeer MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Overschrijf Duty Cycle", + "label": "Overschrijf Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Regio" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP Address", + "label": "IP-adres" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP Configuratie" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Tijdstempel", + "unset": "Terugzetten", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Energiebesparingsmodus inschakelen" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Energie configuratie" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Privésleutel" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Publieke sleutel" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/dialog.json b/packages/web/public/i18n/locales/nl-NL/dialog.json index 0c6555cd..796ecc6f 100644 --- a/packages/web/public/i18n/locales/nl-NL/dialog.json +++ b/packages/web/public/i18n/locales/nl-NL/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Serieel", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Verbinding maken", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Bericht", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Spanning", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Weet u het zeker?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Weet u het zeker?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Serieel", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Verbinding maken", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Bericht", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Spanning", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Weet u het zeker?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Weet u het zeker?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/nl-NL/messages.json b/packages/web/public/i18n/locales/nl-NL/messages.json index 2572ee9e..198a335b 100644 --- a/packages/web/public/i18n/locales/nl-NL/messages.json +++ b/packages/web/public/i18n/locales/nl-NL/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Verzend" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Verzend" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/moduleConfig.json b/packages/web/public/i18n/locales/nl-NL/moduleConfig.json index 2906dd8b..195863a0 100644 --- a/packages/web/public/i18n/locales/nl-NL/moduleConfig.json +++ b/packages/web/public/i18n/locales/nl-NL/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Sfeerverlichting", - "tabAudio": "Geluid", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detectie Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Bereik Test", - "tabSerial": "Serieel", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetrie" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Huidige", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Rood", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Groen", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Blauw", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Time-Out", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Aantal records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Sfeerverlichting", + "tabAudio": "Geluid", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detectie Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Bereik Test", + "tabSerial": "Serieel", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetrie" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Huidige", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Rood", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Groen", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Blauw", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Time-Out", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Aantal records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/nl-NL/nodes.json b/packages/web/public/i18n/locales/nl-NL/nodes.json index 925ab911..38d882ea 100644 --- a/packages/web/public/i18n/locales/nl-NL/nodes.json +++ b/packages/web/public/i18n/locales/nl-NL/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favoriet", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Foutmelding", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Direct", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favoriet", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Foutmelding", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Direct", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/nl-NL/ui.json b/packages/web/public/i18n/locales/nl-NL/ui.json index 2cb34f46..6b33c8df 100644 --- a/packages/web/public/i18n/locales/nl-NL/ui.json +++ b/packages/web/public/i18n/locales/nl-NL/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Berichten", - "map": "Kaart", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Kanalen", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Batterij" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Wachtwoord verbergen" - }, - "showPassword": { - "label": "Wachtwoord tonen" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Functie" - }, - "filter": { - "label": "Filter" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Spanning" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Direct", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Laatst gehoord", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Taal", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Donker", - "light": "Licht", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Berichten", + "map": "Kaart", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Kanalen", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Batterij" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Wachtwoord verbergen" + }, + "showPassword": { + "label": "Wachtwoord tonen" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Functie" + }, + "filter": { + "label": "Filter" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Spanning" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Direct", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Laatst gehoord", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Taal", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Donker", + "light": "Licht", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/pl-PL/channels.json b/packages/web/public/i18n/locales/pl-PL/channels.json index ddbc26b5..4ae50c88 100644 --- a/packages/web/public/i18n/locales/pl-PL/channels.json +++ b/packages/web/public/i18n/locales/pl-PL/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanały", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Podstawowy", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Ustawienia kanału", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Rola", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Nazwa", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Kanały", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Podstawowy", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Ustawienia kanału", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Rola", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Nazwa", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/commandPalette.json b/packages/web/public/i18n/locales/pl-PL/commandPalette.json index 5526ed2d..364c4d44 100644 --- a/packages/web/public/i18n/locales/pl-PL/commandPalette.json +++ b/packages/web/public/i18n/locales/pl-PL/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Wiadomości", - "map": "Mapa", - "config": "Config", - "channels": "Kanały", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Import", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Wiadomości", + "map": "Mapa", + "config": "Config", + "channels": "Kanały", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Import", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/common.json b/packages/web/public/i18n/locales/pl-PL/common.json index 6aa8233a..bd884f19 100644 --- a/packages/web/public/i18n/locales/pl-PL/common.json +++ b/packages/web/public/i18n/locales/pl-PL/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Zastosuj", - "backupKey": "Backup Key", - "cancel": "Anuluj", - "clearMessages": "Clear Messages", - "close": "Zamknij", - "confirm": "Confirm", - "delete": "Usuń", - "dismiss": "Zamknij", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Wiadomość", - "now": "Now", - "ok": "OK", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Usuń", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Zresetuj", - "save": "Zapisz", - "scanQr": "Scan QR Code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR:", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Nieznany", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Zastosuj", + "backupKey": "Backup Key", + "cancel": "Anuluj", + "clearMessages": "Clear Messages", + "close": "Zamknij", + "confirm": "Confirm", + "delete": "Usuń", + "dismiss": "Zamknij", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Wiadomość", + "now": "Now", + "ok": "OK", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Usuń", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Zresetuj", + "save": "Zapisz", + "scanQr": "Scan QR Code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR:", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Nieznany", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/dashboard.json b/packages/web/public/i18n/locales/pl-PL/dashboard.json index f479246f..553ebb9c 100644 --- a/packages/web/public/i18n/locales/pl-PL/dashboard.json +++ b/packages/web/public/i18n/locales/pl-PL/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Seryjny", - "connectionType_network": "Sieć", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Seryjny", + "connectionType_network": "Sieć", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/pl-PL/deviceConfig.json b/packages/web/public/i18n/locales/pl-PL/deviceConfig.json index 406284fe..d614ad08 100644 --- a/packages/web/public/i18n/locales/pl-PL/deviceConfig.json +++ b/packages/web/public/i18n/locales/pl-PL/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Urządzenie", - "tabDisplay": "Wyświetlacz", - "tabLora": "LoRa", - "tabNetwork": "Sieć", - "tabPosition": "Pozycjonowanie", - "tabPower": "Zasilanie", - "tabSecurity": "Bezpieczeństwo" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Rola" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Włączony" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Pairing mode" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bandwidth" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignore MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Override Duty Cycle", - "label": "Override Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Region" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Ustawienia radia", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Włączony" - }, - "gateway": { - "description": "Default Gateway", - "label": "Brama domyślna" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Włączony" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Ustawienia UDP" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Znacznik czasu", - "unset": "Nieustawiony", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Enable power saving mode" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Konfiguracja zarządzania energią" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Klucz prywatny" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Klucz publiczny" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Urządzenie", + "tabDisplay": "Wyświetlacz", + "tabLora": "LoRa", + "tabNetwork": "Sieć", + "tabPosition": "Pozycjonowanie", + "tabPower": "Zasilanie", + "tabSecurity": "Bezpieczeństwo" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Rola" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Włączony" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Pairing mode" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bandwidth" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignore MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Override Duty Cycle", + "label": "Override Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Region" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Ustawienia radia", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Włączony" + }, + "gateway": { + "description": "Default Gateway", + "label": "Brama domyślna" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Włączony" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Ustawienia UDP" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Znacznik czasu", + "unset": "Nieustawiony", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Enable power saving mode" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Konfiguracja zarządzania energią" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Klucz prywatny" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Klucz publiczny" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/dialog.json b/packages/web/public/i18n/locales/pl-PL/dialog.json index bf55cb58..a17d7255 100644 --- a/packages/web/public/i18n/locales/pl-PL/dialog.json +++ b/packages/web/public/i18n/locales/pl-PL/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Seryjny", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Wiadomość", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Napięcie", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generuj Kod QR" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Jesteś pewny?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Jesteś pewny?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Seryjny", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Wiadomość", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Napięcie", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generuj Kod QR" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Jesteś pewny?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Jesteś pewny?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/pl-PL/messages.json b/packages/web/public/i18n/locales/pl-PL/messages.json index c947bf7e..ae66f746 100644 --- a/packages/web/public/i18n/locales/pl-PL/messages.json +++ b/packages/web/public/i18n/locales/pl-PL/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Wyślij" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Odpowiedz" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Wyślij" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Odpowiedz" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/moduleConfig.json b/packages/web/public/i18n/locales/pl-PL/moduleConfig.json index 66d635ef..f776830f 100644 --- a/packages/web/public/i18n/locales/pl-PL/moduleConfig.json +++ b/packages/web/public/i18n/locales/pl-PL/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambient Lighting", - "tabAudio": "Audio", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detection Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Test zasięgu", - "tabSerial": "Seryjny", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetria" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Natężenie", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Red", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Green", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Blue", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Włączony", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Włączony", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Włączony", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Limit czasu", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Tryb", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Number of records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambient Lighting", + "tabAudio": "Audio", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detection Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Test zasięgu", + "tabSerial": "Seryjny", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetria" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Natężenie", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Red", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Green", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Blue", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Włączony", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Włączony", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Włączony", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Limit czasu", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Tryb", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Number of records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/pl-PL/nodes.json b/packages/web/public/i18n/locales/pl-PL/nodes.json index 7359999d..095aa95b 100644 --- a/packages/web/public/i18n/locales/pl-PL/nodes.json +++ b/packages/web/public/i18n/locales/pl-PL/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Ulubiony", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Błąd", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Usłyszano", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Bezpośrednio", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Ulubiony", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Błąd", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Usłyszano", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Bezpośrednio", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/pl-PL/ui.json b/packages/web/public/i18n/locales/pl-PL/ui.json index 5be83c39..ea2cc67c 100644 --- a/packages/web/public/i18n/locales/pl-PL/ui.json +++ b/packages/web/public/i18n/locales/pl-PL/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Wiadomości", - "map": "Mapa", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Kanały", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Bateria" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Ukryj hasło" - }, - "showPassword": { - "label": "Pokaż hasło" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Czekam. . .", - "unknown": "Nieznany" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Rola" - }, - "filter": { - "label": "Filtr" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Napięcie" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Bezpośrednio", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Aktywność", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Język", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Ciemny", - "light": "Jasny", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Wiadomości", + "map": "Mapa", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Kanały", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Bateria" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Ukryj hasło" + }, + "showPassword": { + "label": "Pokaż hasło" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Czekam. . .", + "unknown": "Nieznany" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Rola" + }, + "filter": { + "label": "Filtr" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Napięcie" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Bezpośrednio", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Aktywność", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Język", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Ciemny", + "light": "Jasny", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/pt-PT/channels.json b/packages/web/public/i18n/locales/pt-PT/channels.json index ab1e9169..00038428 100644 --- a/packages/web/public/i18n/locales/pt-PT/channels.json +++ b/packages/web/public/i18n/locales/pt-PT/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Canal", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Principal", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Configurações de canal", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Papel", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "Nome", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Canal", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Principal", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Configurações de canal", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Papel", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "Nome", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/commandPalette.json b/packages/web/public/i18n/locales/pt-PT/commandPalette.json index 6835f1a5..494ee494 100644 --- a/packages/web/public/i18n/locales/pt-PT/commandPalette.json +++ b/packages/web/public/i18n/locales/pt-PT/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Mensagens", - "map": "Mapa", - "config": "Config", - "channels": "Canal", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "Importar", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Depuração", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Mensagens", + "map": "Mapa", + "config": "Config", + "channels": "Canal", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "Importar", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Depuração", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/common.json b/packages/web/public/i18n/locales/pt-PT/common.json index c2d1d592..49fd5ccc 100644 --- a/packages/web/public/i18n/locales/pt-PT/common.json +++ b/packages/web/public/i18n/locales/pt-PT/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Aplicar", - "backupKey": "Backup Key", - "cancel": "Cancelar", - "clearMessages": "Clear Messages", - "close": "Fechar", - "confirm": "Confirm", - "delete": "Excluir", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Importar", - "message": "Mensagem", - "now": "Now", - "ok": "Okay", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Remover", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Redefinir", - "save": "Salvar", - "scanQr": "Ler código QR", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Aplicar", + "backupKey": "Backup Key", + "cancel": "Cancelar", + "clearMessages": "Clear Messages", + "close": "Fechar", + "confirm": "Confirm", + "delete": "Excluir", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Importar", + "message": "Mensagem", + "now": "Now", + "ok": "Okay", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Remover", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Redefinir", + "save": "Salvar", + "scanQr": "Ler código QR", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/dashboard.json b/packages/web/public/i18n/locales/pt-PT/dashboard.json index b68c6190..0c694905 100644 --- a/packages/web/public/i18n/locales/pt-PT/dashboard.json +++ b/packages/web/public/i18n/locales/pt-PT/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Série", - "connectionType_network": "Rede", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Série", + "connectionType_network": "Rede", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/pt-PT/deviceConfig.json b/packages/web/public/i18n/locales/pt-PT/deviceConfig.json index 091a01c8..45175adb 100644 --- a/packages/web/public/i18n/locales/pt-PT/deviceConfig.json +++ b/packages/web/public/i18n/locales/pt-PT/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Dispositivo", - "tabDisplay": "Ecrã", - "tabLora": "LoRa", - "tabNetwork": "Rede", - "tabPosition": "Posição", - "tabPower": "Energia", - "tabSecurity": "Segurança" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "Fuso horário POSIX" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Papel" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Modo de emparelhamento" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Largura de banda" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ignorar MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Predefinição de modem" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "Disponibilizar no MQTT" - }, - "overrideDutyCycle": { - "description": "Ignorar ciclo de trabalho", - "label": "Ignorar ciclo de trabalho" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Região" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Subnet" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Configuração UDP" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Data e hora", - "unset": "Não Definido", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Ativar modo de poupança de energia" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Configuração de Energia" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Chave privada" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Chave pública" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Dispositivo", + "tabDisplay": "Ecrã", + "tabLora": "LoRa", + "tabNetwork": "Rede", + "tabPosition": "Posição", + "tabPower": "Energia", + "tabSecurity": "Segurança" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "Fuso horário POSIX" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Papel" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Modo de emparelhamento" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Largura de banda" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ignorar MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Predefinição de modem" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "Disponibilizar no MQTT" + }, + "overrideDutyCycle": { + "description": "Ignorar ciclo de trabalho", + "label": "Ignorar ciclo de trabalho" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Região" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Subnet" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Configuração UDP" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Data e hora", + "unset": "Não Definido", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Ativar modo de poupança de energia" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Configuração de Energia" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Chave privada" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Chave pública" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/dialog.json b/packages/web/public/i18n/locales/pt-PT/dialog.json index a584527b..56b52943 100644 --- a/packages/web/public/i18n/locales/pt-PT/dialog.json +++ b/packages/web/public/i18n/locales/pt-PT/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Série", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Ligar", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Mensagem", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Voltagem", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Confirma?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Confirma?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Série", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Ligar", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Mensagem", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Voltagem", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Confirma?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Confirma?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/pt-PT/messages.json b/packages/web/public/i18n/locales/pt-PT/messages.json index cd7260a8..a4647b95 100644 --- a/packages/web/public/i18n/locales/pt-PT/messages.json +++ b/packages/web/public/i18n/locales/pt-PT/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Enviar" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Responder" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Enviar" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Responder" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/moduleConfig.json b/packages/web/public/i18n/locales/pt-PT/moduleConfig.json index e3a638f8..20f353b4 100644 --- a/packages/web/public/i18n/locales/pt-PT/moduleConfig.json +++ b/packages/web/public/i18n/locales/pt-PT/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Iluminação ambiente", - "tabAudio": "Áudio", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Sensor de deteção", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Informações da vizinhança", - "tabPaxcounter": "Contador de pessoas", - "tabRangeTest": "Teste de Alcance", - "tabSerial": "Série", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetria" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Atual", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Vermelho", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Verde", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Azul", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Tópico principal", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Timeout", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Número de registos", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Intervalo de atualização de métricas do dispositivo (segundos)" - }, - "environmentUpdateInterval": { - "label": "Intervalo de atualização de métricas de ambiente (segundos)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Iluminação ambiente", + "tabAudio": "Áudio", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Sensor de deteção", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Informações da vizinhança", + "tabPaxcounter": "Contador de pessoas", + "tabRangeTest": "Teste de Alcance", + "tabSerial": "Série", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetria" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Atual", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Vermelho", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Verde", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Azul", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Tópico principal", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Timeout", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Número de registos", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Intervalo de atualização de métricas do dispositivo (segundos)" + }, + "environmentUpdateInterval": { + "label": "Intervalo de atualização de métricas de ambiente (segundos)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/pt-PT/nodes.json b/packages/web/public/i18n/locales/pt-PT/nodes.json index f263d4cc..229aa086 100644 --- a/packages/web/public/i18n/locales/pt-PT/nodes.json +++ b/packages/web/public/i18n/locales/pt-PT/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favoritos", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Erros", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Direto", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favoritos", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Erros", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Direto", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/pt-PT/ui.json b/packages/web/public/i18n/locales/pt-PT/ui.json index 6e413306..e6261a3f 100644 --- a/packages/web/public/i18n/locales/pt-PT/ui.json +++ b/packages/web/public/i18n/locales/pt-PT/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Mensagens", - "map": "Mapa", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Canal", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Bateria" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Ocultar palavra-passe" - }, - "showPassword": { - "label": "Mostrar palavra-passe" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Papel" - }, - "filter": { - "label": "Filtrar" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Voltagem" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Direto", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Último recebido", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Idioma", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Escuro", - "light": "Claro", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Mensagens", + "map": "Mapa", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Canal", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Bateria" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Ocultar palavra-passe" + }, + "showPassword": { + "label": "Mostrar palavra-passe" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Papel" + }, + "filter": { + "label": "Filtrar" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Voltagem" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Direto", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Último recebido", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Idioma", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Escuro", + "light": "Claro", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/sv-SE/channels.json b/packages/web/public/i18n/locales/sv-SE/channels.json index de35fc36..94fb9375 100644 --- a/packages/web/public/i18n/locales/sv-SE/channels.json +++ b/packages/web/public/i18n/locales/sv-SE/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanaler", - "channelName": "Kanal: {channelName}", - "broadcastLabel": "Primär", - "channelIndex": "# {{index}}" - }, - "validation": { - "pskInvalid": "Ange en giltig {{bits}}-bitars PSK." - }, - "settings": { - "label": "Kanalinställningar", - "description": "Krypto, MQTT & diverse inställningar" - }, - "role": { - "label": "Roll", - "description": "Enhetens telemetri skickas över PRIMÄR. Endast en PRIMÄR kanal tillåts", - "options": { - "primary": "PRIMÄR", - "disabled": "INAKTIVERAD", - "secondary": "SEKUNDÄR" - } - }, - "psk": { - "label": "Delad nyckel (PSK)", - "description": "PSK-längder som stöds: 256-bit, 128-bit, 8-bit eller tom (0-bit)", - "generate": "Generera" - }, - "name": { - "label": "Namn", - "description": "Ett unikt namn för kanalen, <12 bytes. Lämna tomt för standardnamn" - }, - "uplinkEnabled": { - "label": "Upplänk aktiverad", - "description": "Skicka meddelanden från det lokala nätet till MQTT" - }, - "downlinkEnabled": { - "label": "Nedlänk aktiverad", - "description": "Skicka meddelanden från MQTT till det lokala nätet" - }, - "positionPrecision": { - "label": "Plats", - "description": "Platsprecisionen som kan delas med kanalen. Kan inaktiveras.", - "options": { - "none": "Dela inte plats", - "precise": "Exakt plats", - "metric_km23": "Inom 23 kilometer", - "metric_km12": "Inom 12 kilometer", - "metric_km5_8": "Inom 5,8 kilometer", - "metric_km2_9": "Inom 2,9 kilometer", - "metric_km1_5": "Inom 1,5 kilometer", - "metric_m700": "Inom 700 meter", - "metric_m350": "Inom 350 meter", - "metric_m200": "Inom 200 meter", - "metric_m90": "Inom 90 meter", - "metric_m50": "Inom 50 meter", - "imperial_mi15": "Inom 15 engelska mil", - "imperial_mi7_3": "Inom 7,3 engelska mil", - "imperial_mi3_6": "Inom 3,6 engelska mil", - "imperial_mi1_8": "Inom 1,8 engelska mil", - "imperial_mi0_9": "Inom 0,9 engelska mil", - "imperial_mi0_5": "Inom 0,5 engelska mil", - "imperial_mi0_2": "Inom 0,2 engelska mil", - "imperial_ft600": "Inom 600 fot", - "imperial_ft300": "Inom 300 fot", - "imperial_ft150": "Inom 150 fot" - } - } + "page": { + "sectionLabel": "Kanaler", + "channelName": "Kanal: {channelName}", + "broadcastLabel": "Primär", + "channelIndex": "# {{index}}" + }, + "validation": { + "pskInvalid": "Ange en giltig {{bits}}-bitars PSK." + }, + "settings": { + "label": "Kanalinställningar", + "description": "Krypto, MQTT & diverse inställningar" + }, + "role": { + "label": "Roll", + "description": "Enhetens telemetri skickas över PRIMÄR. Endast en PRIMÄR kanal tillåts", + "options": { + "primary": "PRIMÄR", + "disabled": "INAKTIVERAD", + "secondary": "SEKUNDÄR" + } + }, + "psk": { + "label": "Delad nyckel (PSK)", + "description": "PSK-längder som stöds: 256-bit, 128-bit, 8-bit eller tom (0-bit)", + "generate": "Generera" + }, + "name": { + "label": "Namn", + "description": "Ett unikt namn för kanalen, <12 bytes. Lämna tomt för standardnamn" + }, + "uplinkEnabled": { + "label": "Upplänk aktiverad", + "description": "Skicka meddelanden från det lokala nätet till MQTT" + }, + "downlinkEnabled": { + "label": "Nedlänk aktiverad", + "description": "Skicka meddelanden från MQTT till det lokala nätet" + }, + "positionPrecision": { + "label": "Plats", + "description": "Platsprecisionen som kan delas med kanalen. Kan inaktiveras.", + "options": { + "none": "Dela inte plats", + "precise": "Exakt plats", + "metric_km23": "Inom 23 kilometer", + "metric_km12": "Inom 12 kilometer", + "metric_km5_8": "Inom 5,8 kilometer", + "metric_km2_9": "Inom 2,9 kilometer", + "metric_km1_5": "Inom 1,5 kilometer", + "metric_m700": "Inom 700 meter", + "metric_m350": "Inom 350 meter", + "metric_m200": "Inom 200 meter", + "metric_m90": "Inom 90 meter", + "metric_m50": "Inom 50 meter", + "imperial_mi15": "Inom 15 engelska mil", + "imperial_mi7_3": "Inom 7,3 engelska mil", + "imperial_mi3_6": "Inom 3,6 engelska mil", + "imperial_mi1_8": "Inom 1,8 engelska mil", + "imperial_mi0_9": "Inom 0,9 engelska mil", + "imperial_mi0_5": "Inom 0,5 engelska mil", + "imperial_mi0_2": "Inom 0,2 engelska mil", + "imperial_ft600": "Inom 600 fot", + "imperial_ft300": "Inom 300 fot", + "imperial_ft150": "Inom 150 fot" + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/commandPalette.json b/packages/web/public/i18n/locales/sv-SE/commandPalette.json index 08f5814d..9786b163 100644 --- a/packages/web/public/i18n/locales/sv-SE/commandPalette.json +++ b/packages/web/public/i18n/locales/sv-SE/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "Inga resultat hittades.", - "page": { - "title": "Snabbmeny" - }, - "pinGroup": { - "label": "Lägg till grupp i favoriter" - }, - "unpinGroup": { - "label": "Ta bort grupp från favoriter" - }, - "goto": { - "label": "Gå till", - "command": { - "messages": "Meddelanden", - "map": "Karta", - "config": "Inställningar", - "channels": "Kanaler", - "nodes": "Noder" - } - }, - "manage": { - "label": "Hantera", - "command": { - "switchNode": "Byt nod", - "connectNewNode": "Anslut ny nod" - } - }, - "contextual": { - "label": "Kontextuell", - "command": { - "qrCode": "QR-kod", - "qrGenerator": "Generator", - "qrImport": "Import", - "scheduleShutdown": "Schemalägg avstängning", - "scheduleReboot": "Schemalägg omstart", - "rebootToOtaMode": "Starta om till OTA-läge", - "resetNodeDb": "Töm noddatabasen", - "factoryResetDevice": "Fabriksåterställ enhet", - "factoryResetConfig": "Fabriksåterställ konfigurationen" - } - }, - "debug": { - "label": "Felsökning", - "command": { - "reconfigure": "Konfigurera om", - "clearAllStoredMessages": "Radera alla sparade meddelanden" - } - } + "emptyState": "Inga resultat hittades.", + "page": { + "title": "Snabbmeny" + }, + "pinGroup": { + "label": "Lägg till grupp i favoriter" + }, + "unpinGroup": { + "label": "Ta bort grupp från favoriter" + }, + "goto": { + "label": "Gå till", + "command": { + "messages": "Meddelanden", + "map": "Karta", + "config": "Inställningar", + "channels": "Kanaler", + "nodes": "Noder" + } + }, + "manage": { + "label": "Hantera", + "command": { + "switchNode": "Byt nod", + "connectNewNode": "Anslut ny nod" + } + }, + "contextual": { + "label": "Kontextuell", + "command": { + "qrCode": "QR-kod", + "qrGenerator": "Generator", + "qrImport": "Import", + "scheduleShutdown": "Schemalägg avstängning", + "scheduleReboot": "Schemalägg omstart", + "rebootToOtaMode": "Starta om till OTA-läge", + "resetNodeDb": "Töm noddatabasen", + "factoryResetDevice": "Fabriksåterställ enhet", + "factoryResetConfig": "Fabriksåterställ konfigurationen" + } + }, + "debug": { + "label": "Felsökning", + "command": { + "reconfigure": "Konfigurera om", + "clearAllStoredMessages": "Radera alla sparade meddelanden" + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/common.json b/packages/web/public/i18n/locales/sv-SE/common.json index 997064ee..577e927f 100644 --- a/packages/web/public/i18n/locales/sv-SE/common.json +++ b/packages/web/public/i18n/locales/sv-SE/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Verkställ", - "backupKey": "Säkerhetskopiera nyckel", - "cancel": "Avbryt", - "clearMessages": "Ta bort meddelanden", - "close": "Stäng", - "confirm": "Bekräfta", - "delete": "Radera", - "dismiss": "Stäng", - "download": "Ladda ner", - "export": "Exportera", - "generate": "Generera", - "regenerate": "Förnya", - "import": "Importera", - "message": "Meddelande", - "now": "Nu", - "ok": "Okej", - "print": "Skriv ut", - "rebootOtaNow": "Starta om till OTA-läge nu", - "remove": "Ta bort", - "requestNewKeys": "Begär nya nycklar", - "requestPosition": "Begär position", - "reset": "Nollställ", - "save": "Spara", - "scanQr": "Skanna QR-kod", - "traceRoute": "Spåra rutt", - "submit": "Spara" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic webbklient" - }, - "loading": "Laddar...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "hopp", - "plural": "hopp" - }, - "hopsAway": { - "one": "{{count}} hopp bort", - "plural": "{{count}} hopp bort", - "unknown": "Okänt antal hopp bort" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meter", - "suffix": "m" - }, - "minute": { - "one": "minut", - "plural": "minuter" - }, - "hour": { - "one": "Timme", - "plural": "Timmar" - }, - "millisecond": { - "one": "millisekund", - "plural": "millisekunder", - "suffix": "ms" - }, - "second": { - "one": "sekund", - "plural": "sekunder" - }, - "day": { - "one": "Dag", - "plural": "Dagar" - }, - "month": { - "one": "Månad", - "plural": "Månader" - }, - "year": { - "one": "År", - "plural": "År" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volt", - "suffix": "V" - }, - "record": { - "one": "Post", - "plural": "Poster" - } - }, - "security": { - "0bit": "Tom", - "8bit": "8 bitar", - "128bit": "128 bitar", - "256bit": "256 bitar" - }, - "unknown": { - "longName": "Okänd", - "shortName": "UNK", - "notAvailable": "–", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "EJ SATT", - "fallbackName": "Meshtastic {{last4}}", - "node": "Nod", - "formValidation": { - "unsavedChanges": "Osparade ändringar", - "tooBig": { - "string": "Texten är för lång. Ange en text mindre än eller lika med {{maximum}} tecken långt.", - "number": "Värdet är för stort. Ange ett numeriskt värde mindre än eller lika med {{maximum}}.", - "bytes": "Värdet är för stort. En längd mindre än eller lika med {{params.maximum}} bytes krävs." - }, - "tooSmall": { - "string": "Texten är för kort. Ange en text längre än eller lika med {{minimum}} tecken långt.", - "number": "Värdet är för litet. Ange ett numeriskt värde större än eller lika med {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Ogiltigt format, en giltig IPv4-adress krävs.", - "key": "Ogiltigt format, en giltig Base64-kodad nyckel krävs (PSK)." - }, - "invalidType": { - "number": "Ogiltig typ, fältet måste innehålla ett tal." - }, - "pskLength": { - "0bit": "Fältet måste vara tomt.", - "8bit": "Nyckeln måste vara en 8-bitars nyckel (PSK).", - "128bit": "Nyckeln måste vara en 128-bitars nyckel (PSK).", - "256bit": "Nyckeln måste vara en 256-bitars nyckel (PSK)." - }, - "required": { - "generic": "Obligatoriskt fält.", - "managed": "Åtminstone en administratörsnyckel krävs om noden fjärrhanteras.", - "key": "En nyckel måste anges." - } - } + "button": { + "apply": "Verkställ", + "backupKey": "Säkerhetskopiera nyckel", + "cancel": "Avbryt", + "clearMessages": "Ta bort meddelanden", + "close": "Stäng", + "confirm": "Bekräfta", + "delete": "Radera", + "dismiss": "Stäng", + "download": "Ladda ner", + "export": "Exportera", + "generate": "Generera", + "regenerate": "Förnya", + "import": "Importera", + "message": "Meddelande", + "now": "Nu", + "ok": "Okej", + "print": "Skriv ut", + "rebootOtaNow": "Starta om till OTA-läge nu", + "remove": "Ta bort", + "requestNewKeys": "Begär nya nycklar", + "requestPosition": "Begär position", + "reset": "Nollställ", + "save": "Spara", + "scanQr": "Skanna QR-kod", + "traceRoute": "Spåra rutt", + "submit": "Spara" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic webbklient" + }, + "loading": "Laddar...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "hopp", + "plural": "hopp" + }, + "hopsAway": { + "one": "{{count}} hopp bort", + "plural": "{{count}} hopp bort", + "unknown": "Okänt antal hopp bort" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meter", + "suffix": "m" + }, + "minute": { + "one": "minut", + "plural": "minuter" + }, + "hour": { + "one": "Timme", + "plural": "Timmar" + }, + "millisecond": { + "one": "millisekund", + "plural": "millisekunder", + "suffix": "ms" + }, + "second": { + "one": "sekund", + "plural": "sekunder" + }, + "day": { + "one": "Dag", + "plural": "Dagar" + }, + "month": { + "one": "Månad", + "plural": "Månader" + }, + "year": { + "one": "År", + "plural": "År" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volt", + "suffix": "V" + }, + "record": { + "one": "Post", + "plural": "Poster" + } + }, + "security": { + "0bit": "Tom", + "8bit": "8 bitar", + "128bit": "128 bitar", + "256bit": "256 bitar" + }, + "unknown": { + "longName": "Okänd", + "shortName": "UNK", + "notAvailable": "–", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "EJ SATT", + "fallbackName": "Meshtastic {{last4}}", + "node": "Nod", + "formValidation": { + "unsavedChanges": "Osparade ändringar", + "tooBig": { + "string": "Texten är för lång. Ange en text mindre än eller lika med {{maximum}} tecken långt.", + "number": "Värdet är för stort. Ange ett numeriskt värde mindre än eller lika med {{maximum}}.", + "bytes": "Värdet är för stort. En längd mindre än eller lika med {{params.maximum}} bytes krävs." + }, + "tooSmall": { + "string": "Texten är för kort. Ange en text längre än eller lika med {{minimum}} tecken långt.", + "number": "Värdet är för litet. Ange ett numeriskt värde större än eller lika med {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Ogiltigt format, en giltig IPv4-adress krävs.", + "key": "Ogiltigt format, en giltig Base64-kodad nyckel krävs (PSK)." + }, + "invalidType": { + "number": "Ogiltig typ, fältet måste innehålla ett tal." + }, + "pskLength": { + "0bit": "Fältet måste vara tomt.", + "8bit": "Nyckeln måste vara en 8-bitars nyckel (PSK).", + "128bit": "Nyckeln måste vara en 128-bitars nyckel (PSK).", + "256bit": "Nyckeln måste vara en 256-bitars nyckel (PSK)." + }, + "required": { + "generic": "Obligatoriskt fält.", + "managed": "Åtminstone en administratörsnyckel krävs om noden fjärrhanteras.", + "key": "En nyckel måste anges." + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/dashboard.json b/packages/web/public/i18n/locales/sv-SE/dashboard.json index f9ac6a24..a6d941ad 100644 --- a/packages/web/public/i18n/locales/sv-SE/dashboard.json +++ b/packages/web/public/i18n/locales/sv-SE/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Anslutna enheter", - "description": "Hantera dina anslutna Meshtastic-enheter.", - "connectionType_ble": "BLE", - "connectionType_serial": "Seriell kommunikation", - "connectionType_network": "Nätverk", - "noDevicesTitle": "Inga anslutna enheter ", - "noDevicesDescription": "Anslut en ny enhet för att komma igång.", - "button_newConnection": "Ny anslutning" - } + "dashboard": { + "title": "Anslutna enheter", + "description": "Hantera dina anslutna Meshtastic-enheter.", + "connectionType_ble": "BLE", + "connectionType_serial": "Seriell kommunikation", + "connectionType_network": "Nätverk", + "noDevicesTitle": "Inga anslutna enheter ", + "noDevicesDescription": "Anslut en ny enhet för att komma igång.", + "button_newConnection": "Ny anslutning" + } } diff --git a/packages/web/public/i18n/locales/sv-SE/deviceConfig.json b/packages/web/public/i18n/locales/sv-SE/deviceConfig.json index d582dff5..85852b6f 100644 --- a/packages/web/public/i18n/locales/sv-SE/deviceConfig.json +++ b/packages/web/public/i18n/locales/sv-SE/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Konfiguration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Enhet", - "tabDisplay": "Display", - "tabLora": "LoRa", - "tabNetwork": "Nätverk", - "tabPosition": "Plats", - "tabPower": "Ström", - "tabSecurity": "Säkerhet" - }, - "sidebar": { - "label": "Moduler" - }, - "device": { - "title": "Enhetsinställningar", - "description": "Inställningar för enheten", - "buttonPin": { - "description": "Stift för knapp", - "label": "Knapp-stift" - }, - "buzzerPin": { - "description": "Stift för summer", - "label": "Summer-stift" - }, - "disableTripleClick": { - "description": "Inaktivera trippeltryck", - "label": "Inaktivera trippeltryck" - }, - "doubleTapAsButtonPress": { - "description": "Behandla dubbeltryck som knapptryck", - "label": "Dubbeltryck som knapptryck" - }, - "ledHeartbeatDisabled": { - "description": "Inaktivera blinkande LED", - "label": "LED-puls inaktiverad" - }, - "nodeInfoBroadcastInterval": { - "description": "Hur ofta nod-info ska sändas", - "label": "Sändningsintervall för nod-info" - }, - "posixTimezone": { - "description": "POSIX-tidszonsträng för enheten", - "label": "POSIX-tidszon" - }, - "rebroadcastMode": { - "description": "Hur enheten hanterar återutsändning", - "label": "Återutsändningsläge" - }, - "role": { - "description": "Vilken roll enheten har på nätet", - "label": "Roll" - } - }, - "bluetooth": { - "title": "Bluetooth-inställningar", - "description": "Inställningar för Bluetooth-modulen", - "note": "OBS! Vissa enheter (ESP32) kan inte använda både Bluetooth och WiFi samtidigt.", - "enabled": { - "description": "Aktivera eller inaktivera Bluetooth", - "label": "Aktiverad" - }, - "pairingMode": { - "description": "Metod för parkoppling", - "label": "Parkopplingsläge" - }, - "pin": { - "description": "Pinkod för parkoppling", - "label": "Pinkod" - } - }, - "display": { - "description": "Inställningar för enhetens display", - "title": "Displayinställningar", - "headingBold": { - "description": "Visa rubriktexten i fetstil", - "label": "Fetstil för rubriktext" - }, - "carouselDelay": { - "description": "Tid mellan automatiskt byte av sida", - "label": "Karusellfördröjning" - }, - "compassNorthTop": { - "description": "Fixera norr till toppen av kompassen", - "label": "Kompassens norrläge" - }, - "displayMode": { - "description": "Variant på displaylayout", - "label": "Visningsläge" - }, - "displayUnits": { - "description": "Visa metriska eller Brittiska enheter", - "label": "Enheter" - }, - "flipScreen": { - "description": "Vänd displayen 180 grader", - "label": "Vänd skärmen" - }, - "gpsDisplayUnits": { - "description": "Koordinatformat för visning", - "label": "Koordinatformat" - }, - "oledType": { - "description": "Typ av OLED-skärm ansluten till enheten", - "label": "OLED-typ" - }, - "screenTimeout": { - "description": "Stäng av skärmen efter denna tid", - "label": "Tidsgräns för display" - }, - "twelveHourClock": { - "description": "Använd 12-timmarsformat", - "label": "12-timmars klocka" - }, - "wakeOnTapOrMotion": { - "description": "Väck enheten när rörelse upptäcks av enhetens accelerometer", - "label": "Vakna vid rörelse" - } - }, - "lora": { - "title": "Inställningar för nät", - "description": "Inställningar för LoRa-nätet", - "bandwidth": { - "description": "Kanalens bandbredd i MHz", - "label": "Bandbredd" - }, - "boostedRxGain": { - "description": "Ökad RX-förstärkning", - "label": "Ökad RX-förstärkning" - }, - "codingRate": { - "description": "Nämnaren för kodningshastighet", - "label": "Kodningshastighet" - }, - "frequencyOffset": { - "description": "Frekvensförskjutning för att korrigera vid kalibreringsfel i kristallen", - "label": "Frekvensförskjutning" - }, - "frequencySlot": { - "description": "LoRa-kanalnummer för frekvens", - "label": "Frekvens-slot" - }, - "hopLimit": { - "description": "Maximalt antal hopp", - "label": "Hoppgräns" - }, - "ignoreMqtt": { - "description": "Vidarebefordra inte MQTT-meddelanden över nätet", - "label": "Ignorera MQTT" - }, - "modemPreset": { - "description": "Modem-förinställningar som enheten använder", - "label": "Modem-förinställningar" - }, - "okToMqtt": { - "description": "När den är aktiverad anger denna konfiguration att användaren godkänner att paketet sänds till MQTT. Om avaktiverad uppmanas andra noder att inte vidarebefordra enhetens paket till MQTT", - "label": "OK till MQTT" - }, - "overrideDutyCycle": { - "description": "Ersätt gräns för driftsperiod", - "label": "Åsidosätt gräns för driftsperiod" - }, - "overrideFrequency": { - "description": "Åsidosätt frekvens", - "label": "Åsidosätt frekvens" - }, - "region": { - "description": "Anger regionen för din nod", - "label": "Region" - }, - "spreadingFactor": { - "description": "Indikerar antalet chirps per symbol", - "label": "Spridningsfaktor" - }, - "transmitEnabled": { - "description": "Aktivera/inaktivera sändning (TX) från LoRa-radion", - "label": "Sändning aktiverad" - }, - "transmitPower": { - "description": "Max sändningseffekt", - "label": "Sändningseffekt" - }, - "usePreset": { - "description": "Använd en av de fördefinierade modeminställningarna", - "label": "Använd förinställning" - }, - "meshSettings": { - "description": "Inställningar för LoRa-nät", - "label": "Inställningar för nät" - }, - "waveformSettings": { - "description": "Inställningar för LoRa-vågformen", - "label": "Inställningar för vågform" - }, - "radioSettings": { - "label": "Radioinställningar", - "description": "Inställningar för LoRa-radio" - } - }, - "network": { - "title": "Wifi-konfiguration", - "description": "Konfiguration av WiFi-radio", - "note": "OBS! Vissa enheter (ESP32) kan inte använda både Bluetooth och WiFi samtidigt.", - "addressMode": { - "description": "Val för tilldelning av IP-adress", - "label": "Adress-läge" - }, - "dns": { - "description": "DNS-server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Aktivera eller inaktivera Ethernet-porten", - "label": "Aktiverad" - }, - "gateway": { - "description": "Standard-gateway", - "label": "Gateway" - }, - "ip": { - "description": "IP-adress", - "label": "Ip-adress" - }, - "psk": { - "description": "Nätverkslösenord", - "label": "PSK" - }, - "ssid": { - "description": "Nätverksnamn", - "label": "SSID" - }, - "subnet": { - "description": "Subnätmask", - "label": "Subnät" - }, - "wifiEnabled": { - "description": "Aktivera eller inaktivera WiFi-radio", - "label": "Aktiverad" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP-server" - }, - "rsyslogServer": { - "label": "Rsyslog-server" - }, - "ethernetConfigSettings": { - "description": "Ethernet-portens konfiguration", - "label": "Ethernet-konfiguration" - }, - "ipConfigSettings": { - "description": "IP-konfiguration", - "label": "IP-konfiguration" - }, - "ntpConfigSettings": { - "description": "NTP-konfiguration", - "label": "NTP-konfiguration" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog-konfiguration", - "label": "Rsyslog-konfiguration" - }, - "udpConfigSettings": { - "description": "UDP över nät-konfiguration", - "label": "UDP-konfiguration" - } - }, - "position": { - "title": "Platsinställningar", - "description": "Inställningar för platsmodulen", - "broadcastInterval": { - "description": "Hur ofta din plats skickas ut över nätet", - "label": "Sändningsintervall" - }, - "enablePin": { - "description": "Stift för aktivering av GPS-modulen", - "label": "Stift för aktivering" - }, - "fixedPosition": { - "description": "Rapportera inte den inhämtade GPS-positionen, utan en manuellt angiven sådan", - "label": "Fast plats" - }, - "gpsMode": { - "description": "Konfigurera om enhetens GPS är aktiverad, inaktiverad eller saknas", - "label": "GPS-läge" - }, - "gpsUpdateInterval": { - "description": "Hur ofta en GPS-position ska inhämtas", - "label": "Intervall för GPS-uppdatering" - }, - "positionFlags": { - "description": "Valfria fält att inkludera vid sammansättning av positionsmeddelanden. Ju fler fält som väljs, desto större kommer meddelandet att bli. Längre meddelanden leder till högre sändningsutnyttnande och en högre risk för paketförlust.", - "label": "Positionsflaggor" - }, - "receivePin": { - "description": "RX-stift för GPS-modulen", - "label": "RX-stift" - }, - "smartPositionEnabled": { - "description": "Sänd bara positionsuppdatering när det har skett en tillräckligt stor förändring av positionen", - "label": "Aktivera smart position" - }, - "smartPositionMinDistance": { - "description": "Minsta avstånd (i meter) som enheten måste förflyttas innan en positionsuppdatering sänds", - "label": "Minimiavstånd för smart position" - }, - "smartPositionMinInterval": { - "description": "Minsta tidsintervall (i sekunder) som måste passera innan en positionsuppdatering skickas", - "label": "Minimiintervall för smart position" - }, - "transmitPin": { - "description": "TX-stift för GPS-modulen", - "label": "TX-stift" - }, - "intervalsSettings": { - "description": "Hur ofta enheten skickar positionsuppdateringar", - "label": "Intervall" - }, - "flags": { - "placeholder": "Välj positionsflaggor...", - "altitude": "Altitud", - "altitudeGeoidalSeparation": "Geoidhöjd", - "altitudeMsl": "Altitud är medelhavsnivå", - "dop": "Bidrag till osäkerhet i precision (DOP) PDOP används som standard", - "hdopVdop": "Om DOP är satt, använd HDOP / VDOP värden istället för PDOP", - "numSatellites": "Antal satelliter", - "sequenceNumber": "Sekvensnummer", - "timestamp": "Tidsstämpel", - "unset": "Ej inställd", - "vehicleHeading": "Rörelseriktning", - "vehicleSpeed": "Rörelsehastighet" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Används för att justera batterispänningsavläsning", - "label": "ADC faktor" - }, - "ina219Address": { - "description": "I2C-adress till INA219 batterimonitorn", - "label": "INA219-adress" - }, - "lightSleepDuration": { - "description": "Hur länge enheten kommer att vara i lätt strömsparläge", - "label": "Tid för lätt strömsparläge" - }, - "minimumWakeTime": { - "description": "Minsta tid enheten kommer att vara vaken efter att ha tagit emot ett paket", - "label": "Minsta vakna tid" - }, - "noConnectionBluetoothDisabled": { - "description": "Om enheten inte har en aktiv Bluetooth-anslutning inaktiveras Bluetooth-radion efter så här lång tid", - "label": "Bluetooth inaktiverad vid frånkoppling" - }, - "powerSavingEnabled": { - "description": "Välj om du strömmatar enheten från en lågströmkälla (sol) för att minimera strömförbrukningen så mycket som möjligt.", - "label": "Aktivera strömsparläge" - }, - "shutdownOnBatteryDelay": { - "description": "Automatisk avstängning av enheten efter att ha strömmatats från batteri så här lång tid, 0 för obestämd tid", - "label": "Fördröjd avstängning vid batteridrift" - }, - "superDeepSleepDuration": { - "description": "Hur länge enheten kommer att vara i djupt strömsparläge", - "label": "Tid för djupt strömsparläge" - }, - "powerConfigSettings": { - "description": "Inställningar för strömmodulen", - "label": "Ströminställningar" - }, - "sleepSettings": { - "description": "Strömsparlägesinställningar för strömmodulen", - "label": "Inställningar för strömsparläge" - } - }, - "security": { - "description": "Inställningar för säkerhet", - "title": "Säkerhetsinställningar", - "button_backupKey": "Säkerhetskopiera nyckel", - "adminChannelEnabled": { - "description": "Tillåt inkommande styrning via den förlegade, osäkra, administrationskanalen", - "label": "Tillåt förlegad administration" - }, - "enableDebugLogApi": { - "description": "Skriv felsökningsloggar över seriell kommunikation samt visa och exportera positions-rensade loggar över Bluetooth", - "label": "Aktivera API för felsökningslogg" - }, - "managed": { - "description": "Om aktiverad, kan enhetens konfigurationsalternativ bara ändras på distans av en fjärradministratörsnod via administratörsmeddelanden. Aktivera inte detta alternativ om inte minst en lämplig fjärradministratörsnod har konfigurerats och den publika nyckeln matats in i något av fälten ovan.", - "label": "Fjärrhanterad" - }, - "privateKey": { - "description": "Används för att skapa en delad nyckel med en fjärrnod", - "label": "Privat nyckel" - }, - "publicKey": { - "description": "Sänds ut till andra noder på nätet för att de ska kunna beräkna en delad hemlig nyckel", - "label": "Publik nyckel" - }, - "primaryAdminKey": { - "description": "Den primära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", - "label": "Primär administratörsnyckel" - }, - "secondaryAdminKey": { - "description": "Den sekundära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", - "label": "Sekundär administratörsnyckel" - }, - "serialOutputEnabled": { - "description": "Seriell kommunikation över Stream API", - "label": "Seriell kommunikation aktiverad" - }, - "tertiaryAdminKey": { - "description": "Den tertiära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", - "label": "Tertiär administratörsnyckel" - }, - "adminSettings": { - "description": "Inställningar för fjärradministration", - "label": "Fjärradministrationsinställningar" - }, - "loggingSettings": { - "description": "Inställningar för loggning", - "label": "Loggningsinställningar" - } - } + "page": { + "title": "Konfiguration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Enhet", + "tabDisplay": "Display", + "tabLora": "LoRa", + "tabNetwork": "Nätverk", + "tabPosition": "Plats", + "tabPower": "Ström", + "tabSecurity": "Säkerhet" + }, + "sidebar": { + "label": "Moduler" + }, + "device": { + "title": "Enhetsinställningar", + "description": "Inställningar för enheten", + "buttonPin": { + "description": "Stift för knapp", + "label": "Knapp-stift" + }, + "buzzerPin": { + "description": "Stift för summer", + "label": "Summer-stift" + }, + "disableTripleClick": { + "description": "Inaktivera trippeltryck", + "label": "Inaktivera trippeltryck" + }, + "doubleTapAsButtonPress": { + "description": "Behandla dubbeltryck som knapptryck", + "label": "Dubbeltryck som knapptryck" + }, + "ledHeartbeatDisabled": { + "description": "Inaktivera blinkande LED", + "label": "LED-puls inaktiverad" + }, + "nodeInfoBroadcastInterval": { + "description": "Hur ofta nod-info ska sändas", + "label": "Sändningsintervall för nod-info" + }, + "posixTimezone": { + "description": "POSIX-tidszonsträng för enheten", + "label": "POSIX-tidszon" + }, + "rebroadcastMode": { + "description": "Hur enheten hanterar återutsändning", + "label": "Återutsändningsläge" + }, + "role": { + "description": "Vilken roll enheten har på nätet", + "label": "Roll" + } + }, + "bluetooth": { + "title": "Bluetooth-inställningar", + "description": "Inställningar för Bluetooth-modulen", + "note": "OBS! Vissa enheter (ESP32) kan inte använda både Bluetooth och WiFi samtidigt.", + "enabled": { + "description": "Aktivera eller inaktivera Bluetooth", + "label": "Aktiverad" + }, + "pairingMode": { + "description": "Metod för parkoppling", + "label": "Parkopplingsläge" + }, + "pin": { + "description": "Pinkod för parkoppling", + "label": "Pinkod" + } + }, + "display": { + "description": "Inställningar för enhetens display", + "title": "Displayinställningar", + "headingBold": { + "description": "Visa rubriktexten i fetstil", + "label": "Fetstil för rubriktext" + }, + "carouselDelay": { + "description": "Tid mellan automatiskt byte av sida", + "label": "Karusellfördröjning" + }, + "compassNorthTop": { + "description": "Fixera norr till toppen av kompassen", + "label": "Kompassens norrläge" + }, + "displayMode": { + "description": "Variant på displaylayout", + "label": "Visningsläge" + }, + "displayUnits": { + "description": "Visa metriska eller Brittiska enheter", + "label": "Enheter" + }, + "flipScreen": { + "description": "Vänd displayen 180 grader", + "label": "Vänd skärmen" + }, + "gpsDisplayUnits": { + "description": "Koordinatformat för visning", + "label": "Koordinatformat" + }, + "oledType": { + "description": "Typ av OLED-skärm ansluten till enheten", + "label": "OLED-typ" + }, + "screenTimeout": { + "description": "Stäng av skärmen efter denna tid", + "label": "Tidsgräns för display" + }, + "twelveHourClock": { + "description": "Använd 12-timmarsformat", + "label": "12-timmars klocka" + }, + "wakeOnTapOrMotion": { + "description": "Väck enheten när rörelse upptäcks av enhetens accelerometer", + "label": "Vakna vid rörelse" + } + }, + "lora": { + "title": "Inställningar för nät", + "description": "Inställningar för LoRa-nätet", + "bandwidth": { + "description": "Kanalens bandbredd i MHz", + "label": "Bandbredd" + }, + "boostedRxGain": { + "description": "Ökad RX-förstärkning", + "label": "Ökad RX-förstärkning" + }, + "codingRate": { + "description": "Nämnaren för kodningshastighet", + "label": "Kodningshastighet" + }, + "frequencyOffset": { + "description": "Frekvensförskjutning för att korrigera vid kalibreringsfel i kristallen", + "label": "Frekvensförskjutning" + }, + "frequencySlot": { + "description": "LoRa-kanalnummer för frekvens", + "label": "Frekvens-slot" + }, + "hopLimit": { + "description": "Maximalt antal hopp", + "label": "Hoppgräns" + }, + "ignoreMqtt": { + "description": "Vidarebefordra inte MQTT-meddelanden över nätet", + "label": "Ignorera MQTT" + }, + "modemPreset": { + "description": "Modem-förinställningar som enheten använder", + "label": "Modem-förinställningar" + }, + "okToMqtt": { + "description": "När den är aktiverad anger denna konfiguration att användaren godkänner att paketet sänds till MQTT. Om avaktiverad uppmanas andra noder att inte vidarebefordra enhetens paket till MQTT", + "label": "OK till MQTT" + }, + "overrideDutyCycle": { + "description": "Ersätt gräns för driftsperiod", + "label": "Åsidosätt gräns för driftsperiod" + }, + "overrideFrequency": { + "description": "Åsidosätt frekvens", + "label": "Åsidosätt frekvens" + }, + "region": { + "description": "Anger regionen för din nod", + "label": "Region" + }, + "spreadingFactor": { + "description": "Indikerar antalet chirps per symbol", + "label": "Spridningsfaktor" + }, + "transmitEnabled": { + "description": "Aktivera/inaktivera sändning (TX) från LoRa-radion", + "label": "Sändning aktiverad" + }, + "transmitPower": { + "description": "Max sändningseffekt", + "label": "Sändningseffekt" + }, + "usePreset": { + "description": "Använd en av de fördefinierade modeminställningarna", + "label": "Använd förinställning" + }, + "meshSettings": { + "description": "Inställningar för LoRa-nät", + "label": "Inställningar för nät" + }, + "waveformSettings": { + "description": "Inställningar för LoRa-vågformen", + "label": "Inställningar för vågform" + }, + "radioSettings": { + "label": "Radioinställningar", + "description": "Inställningar för LoRa-radio" + } + }, + "network": { + "title": "Wifi-konfiguration", + "description": "Konfiguration av WiFi-radio", + "note": "OBS! Vissa enheter (ESP32) kan inte använda både Bluetooth och WiFi samtidigt.", + "addressMode": { + "description": "Val för tilldelning av IP-adress", + "label": "Adress-läge" + }, + "dns": { + "description": "DNS-server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Aktivera eller inaktivera Ethernet-porten", + "label": "Aktiverad" + }, + "gateway": { + "description": "Standard-gateway", + "label": "Gateway" + }, + "ip": { + "description": "IP-adress", + "label": "Ip-adress" + }, + "psk": { + "description": "Nätverkslösenord", + "label": "PSK" + }, + "ssid": { + "description": "Nätverksnamn", + "label": "SSID" + }, + "subnet": { + "description": "Subnätmask", + "label": "Subnät" + }, + "wifiEnabled": { + "description": "Aktivera eller inaktivera WiFi-radio", + "label": "Aktiverad" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP-server" + }, + "rsyslogServer": { + "label": "Rsyslog-server" + }, + "ethernetConfigSettings": { + "description": "Ethernet-portens konfiguration", + "label": "Ethernet-konfiguration" + }, + "ipConfigSettings": { + "description": "IP-konfiguration", + "label": "IP-konfiguration" + }, + "ntpConfigSettings": { + "description": "NTP-konfiguration", + "label": "NTP-konfiguration" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog-konfiguration", + "label": "Rsyslog-konfiguration" + }, + "udpConfigSettings": { + "description": "UDP över nät-konfiguration", + "label": "UDP-konfiguration" + } + }, + "position": { + "title": "Platsinställningar", + "description": "Inställningar för platsmodulen", + "broadcastInterval": { + "description": "Hur ofta din plats skickas ut över nätet", + "label": "Sändningsintervall" + }, + "enablePin": { + "description": "Stift för aktivering av GPS-modulen", + "label": "Stift för aktivering" + }, + "fixedPosition": { + "description": "Rapportera inte den inhämtade GPS-positionen, utan en manuellt angiven sådan", + "label": "Fast plats" + }, + "gpsMode": { + "description": "Konfigurera om enhetens GPS är aktiverad, inaktiverad eller saknas", + "label": "GPS-läge" + }, + "gpsUpdateInterval": { + "description": "Hur ofta en GPS-position ska inhämtas", + "label": "Intervall för GPS-uppdatering" + }, + "positionFlags": { + "description": "Valfria fält att inkludera vid sammansättning av positionsmeddelanden. Ju fler fält som väljs, desto större kommer meddelandet att bli. Längre meddelanden leder till högre sändningsutnyttnande och en högre risk för paketförlust.", + "label": "Positionsflaggor" + }, + "receivePin": { + "description": "RX-stift för GPS-modulen", + "label": "RX-stift" + }, + "smartPositionEnabled": { + "description": "Sänd bara positionsuppdatering när det har skett en tillräckligt stor förändring av positionen", + "label": "Aktivera smart position" + }, + "smartPositionMinDistance": { + "description": "Minsta avstånd (i meter) som enheten måste förflyttas innan en positionsuppdatering sänds", + "label": "Minimiavstånd för smart position" + }, + "smartPositionMinInterval": { + "description": "Minsta tidsintervall (i sekunder) som måste passera innan en positionsuppdatering skickas", + "label": "Minimiintervall för smart position" + }, + "transmitPin": { + "description": "TX-stift för GPS-modulen", + "label": "TX-stift" + }, + "intervalsSettings": { + "description": "Hur ofta enheten skickar positionsuppdateringar", + "label": "Intervall" + }, + "flags": { + "placeholder": "Välj positionsflaggor...", + "altitude": "Altitud", + "altitudeGeoidalSeparation": "Geoidhöjd", + "altitudeMsl": "Altitud är medelhavsnivå", + "dop": "Bidrag till osäkerhet i precision (DOP) PDOP används som standard", + "hdopVdop": "Om DOP är satt, använd HDOP / VDOP värden istället för PDOP", + "numSatellites": "Antal satelliter", + "sequenceNumber": "Sekvensnummer", + "timestamp": "Tidsstämpel", + "unset": "Ej inställd", + "vehicleHeading": "Rörelseriktning", + "vehicleSpeed": "Rörelsehastighet" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Används för att justera batterispänningsavläsning", + "label": "ADC faktor" + }, + "ina219Address": { + "description": "I2C-adress till INA219 batterimonitorn", + "label": "INA219-adress" + }, + "lightSleepDuration": { + "description": "Hur länge enheten kommer att vara i lätt strömsparläge", + "label": "Tid för lätt strömsparläge" + }, + "minimumWakeTime": { + "description": "Minsta tid enheten kommer att vara vaken efter att ha tagit emot ett paket", + "label": "Minsta vakna tid" + }, + "noConnectionBluetoothDisabled": { + "description": "Om enheten inte har en aktiv Bluetooth-anslutning inaktiveras Bluetooth-radion efter så här lång tid", + "label": "Bluetooth inaktiverad vid frånkoppling" + }, + "powerSavingEnabled": { + "description": "Välj om du strömmatar enheten från en lågströmkälla (sol) för att minimera strömförbrukningen så mycket som möjligt.", + "label": "Aktivera strömsparläge" + }, + "shutdownOnBatteryDelay": { + "description": "Automatisk avstängning av enheten efter att ha strömmatats från batteri så här lång tid, 0 för obestämd tid", + "label": "Fördröjd avstängning vid batteridrift" + }, + "superDeepSleepDuration": { + "description": "Hur länge enheten kommer att vara i djupt strömsparläge", + "label": "Tid för djupt strömsparläge" + }, + "powerConfigSettings": { + "description": "Inställningar för strömmodulen", + "label": "Ströminställningar" + }, + "sleepSettings": { + "description": "Strömsparlägesinställningar för strömmodulen", + "label": "Inställningar för strömsparläge" + } + }, + "security": { + "description": "Inställningar för säkerhet", + "title": "Säkerhetsinställningar", + "button_backupKey": "Säkerhetskopiera nyckel", + "adminChannelEnabled": { + "description": "Tillåt inkommande styrning via den förlegade, osäkra, administrationskanalen", + "label": "Tillåt förlegad administration" + }, + "enableDebugLogApi": { + "description": "Skriv felsökningsloggar över seriell kommunikation samt visa och exportera positions-rensade loggar över Bluetooth", + "label": "Aktivera API för felsökningslogg" + }, + "managed": { + "description": "Om aktiverad, kan enhetens konfigurationsalternativ bara ändras på distans av en fjärradministratörsnod via administratörsmeddelanden. Aktivera inte detta alternativ om inte minst en lämplig fjärradministratörsnod har konfigurerats och den publika nyckeln matats in i något av fälten ovan.", + "label": "Fjärrhanterad" + }, + "privateKey": { + "description": "Används för att skapa en delad nyckel med en fjärrnod", + "label": "Privat nyckel" + }, + "publicKey": { + "description": "Sänds ut till andra noder på nätet för att de ska kunna beräkna en delad hemlig nyckel", + "label": "Publik nyckel" + }, + "primaryAdminKey": { + "description": "Den primära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", + "label": "Primär administratörsnyckel" + }, + "secondaryAdminKey": { + "description": "Den sekundära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", + "label": "Sekundär administratörsnyckel" + }, + "serialOutputEnabled": { + "description": "Seriell kommunikation över Stream API", + "label": "Seriell kommunikation aktiverad" + }, + "tertiaryAdminKey": { + "description": "Den tertiära publika nyckeln hos en fjärradministratörsnod auktoriserad att skicka administratörsmeddelanden till den här noden", + "label": "Tertiär administratörsnyckel" + }, + "adminSettings": { + "description": "Inställningar för fjärradministration", + "label": "Fjärradministrationsinställningar" + }, + "loggingSettings": { + "description": "Inställningar för loggning", + "label": "Loggningsinställningar" + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/dialog.json b/packages/web/public/i18n/locales/sv-SE/dialog.json index 0ed123b8..853bb802 100644 --- a/packages/web/public/i18n/locales/sv-SE/dialog.json +++ b/packages/web/public/i18n/locales/sv-SE/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "Den här åtgärden kommer att rensa all meddelandehistorik. Detta kan inte ångras. Är du säker på att du vill fortsätta?", - "title": "Rensa alla meddelanden" - }, - "deviceName": { - "description": "Enheten kommer att starta om när inställningarna har sparats.", - "longName": "Långt namn", - "shortName": "Kort namn", - "title": "Ändra enhetens namn" - }, - "import": { - "description": "Den aktuella LoRa konfigurationen kommer att skrivas över.", - "error": { - "invalidUrl": "Ogiltig Meshtastic URL" - }, - "channelPrefix": "Kanal: ", - "channelSetUrl": "Kanalinställning/QR-kod URL", - "channels": "Kanaler:", - "usePreset": "Använd förinställning?", - "title": "Importera kanaluppsättning" - }, - "locationResponse": { - "altitude": "Höjd:", - "coordinates": "Koordinater: ", - "title": "Plats: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Förnya nyckel?", - "description": "Är du säker på att du vill förnya den fördelade nyckeln?", - "regenerate": "Förnya" - }, - "newDeviceDialog": { - "title": "Anslut ny enhet", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Seriell kommunikation", - "useHttps": "Använd HTTPS", - "connecting": "Ansluter...", - "connect": "Anslut", - "connectionFailedAlert": { - "title": "Anslutningen misslyckades", - "descriptionPrefix": "Kunde inte ansluta till enheten. ", - "httpsHint": "Om du använder HTTPS kan du behöva godkänna ett självsignerat certifikat först. ", - "openLinkPrefix": "Vänligen öppna ", - "openLinkSuffix": " i en ny flik", - "acceptTlsWarningSuffix": ", acceptera eventuella TLS-varningar om du uppmanas och försök igen", - "learnMoreLink": "Läs mer" - }, - "httpConnection": { - "label": "IP-adress/värdnamn", - "placeholder": "000.000.000.000 / meshtastic.lokal" - }, - "serialConnection": { - "noDevicesPaired": "Inga enheter parkopplade ännu.", - "newDeviceButton": "Ny enhet", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "Inga enheter parkopplade ännu.", - "newDeviceButton": "Ny enhet" - }, - "validation": { - "requiresWebBluetooth": "Den här anslutningstypen kräver <0>Web Bluetooth. Använd en webbläsare som stöds, till exempel Chrome eller Edge.", - "requiresWebSerial": "Den här anslutningstypen kräver <0>Web Serial. Använd en webbläsare som stöds, till exempel Chrome eller Edge.", - "requiresSecureContext": "Denna applikation kräver en <0>säker kontext. Anslut med HTTPS eller localhost.", - "additionallyRequiresSecureContext": "Dessutom kräver den ett <0>säker kontext. Vänligen anslut med HTTPS eller localhost." - } - }, - "nodeDetails": { - "message": "Meddelande", - "requestPosition": "Begär plats", - "traceRoute": "Spåra rutt", - "airTxUtilization": "Sändningsutnyttjande", - "allRawMetrics": "All oformaterad data", - "batteryLevel": "Batterinivå", - "channelUtilization": "Kanalutnyttjande", - "details": "Detaljer:", - "deviceMetrics": "Enhetens mätvärden:", - "hardware": "Hårdvara: ", - "lastHeard": "Senast hörd: ", - "nodeHexPrefix": "Nod-hex: !", - "nodeNumber": "Nodnummer: ", - "position": "Plats:", - "role": "Roll: ", - "uptime": "Drifttid: ", - "voltage": "Spänning", - "title": "Nodinformation för {{identifier}}", - "ignoreNode": "Ignorera nod", - "removeNode": "Ta bort nod", - "unignoreNode": "Ta bort favoritmarkering" - }, - "pkiBackup": { - "loseKeysWarning": "Om du förlorar dina nycklar måste du återställa din enhet.", - "secureBackup": "Det är viktigt att säkerhetskopiera dina publika och privata nycklar och förvara din säkerhetskopia säkert.", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Privat nyckel:", - "publicKey": "Publik nyckel:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Säkerhetskopiera nycklar" - }, - "pkiBackupReminder": { - "description": "Vi rekommenderar att du säkerhetskopierar dina nycklar regelbundet. Vill du säkerhetskopiera nu?", - "title": "Påminnelse om säkerhetskopiering", - "remindLaterPrefix": "Påminn mig om", - "remindNever": "Påminn mig aldrig", - "backupNow": "Säkerhetskopiera nu" - }, - "pkiRegenerate": { - "description": "Är du säker på att du vill förnya nyckelpar?", - "title": "Förnya nyckelpar" - }, - "qr": { - "addChannels": "Lägg till kanaler", - "replaceChannels": "Ersätt kanaler", - "description": "Den aktuella LoRa-konfigurationen kommer också att delas.", - "sharableUrl": "Delbar URL", - "title": "Generera QR-kod" - }, - "rebootOta": { - "title": "Schemalägg omstart", - "description": "Starta om den anslutna noden till OTA- (Over-the-Air) läge efter en fördröjning.", - "enterDelay": "Ange fördröjning (sekunder)", - "scheduled": "Omstart har schemalagts" - }, - "reboot": { - "title": "Schemalägg omstart", - "description": "Starta om den anslutna noden efter x minuter." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "Detta kommer att ta bort noden från enheten och begära nya nycklar.", - "keyMismatchReasonSuffix": ". Detta beror på att fjärrnodens nuvarande publika nyckel inte matchar den tidigare lagrade nyckeln för den här noden.", - "unableToSendDmPrefix": "Din nod kan inte skicka ett direkt meddelande till noden: " - }, - "acceptNewKeys": "Godkänn nya nycklar", - "title": "Nycklarna matchar inte - {{identifier}}" - }, - "removeNode": { - "description": "Är du säker på att du vill ta bort den här noden?", - "title": "Ta bort noden?" - }, - "shutdown": { - "title": "Schemalägg avstängning", - "description": "Stäng av den anslutna noden efter x minuter." - }, - "traceRoute": { - "routeToDestination": "Rutt till destination:", - "routeBack": "Rutt tillbaka:" - }, - "tracerouteResponse": { - "title": "Spåra rutt: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Ja, jag vet vad jag gör", - "conjunction": " och blogginlägget om ", - "postamble": " och förstår konsekvenserna av att ändra roll.", - "preamble": "Jag har läst ", - "choosingRightDeviceRole": "Att välja rätt enhetsroll", - "deviceRoleDocumentation": "Dokumentation för enhetsroll", - "title": "Är du säker?" - }, - "managedMode": { - "confirmUnderstanding": "Ja, jag vet vad jag gör", - "title": "Är du säker?", - "description": "Aktivering av fjärrhanterat läge blockerar klienter (inklusive webbklienten) från att skriva inställningar till en radio. När detta är aktiverat kan enhetens inställningar endast ändras via fjärradministratörsmeddelanden. Den här inställningen krävs inte för fjärradministration." - } + "deleteMessages": { + "description": "Den här åtgärden kommer att rensa all meddelandehistorik. Detta kan inte ångras. Är du säker på att du vill fortsätta?", + "title": "Rensa alla meddelanden" + }, + "deviceName": { + "description": "Enheten kommer att starta om när inställningarna har sparats.", + "longName": "Långt namn", + "shortName": "Kort namn", + "title": "Ändra enhetens namn" + }, + "import": { + "description": "Den aktuella LoRa konfigurationen kommer att skrivas över.", + "error": { + "invalidUrl": "Ogiltig Meshtastic URL" + }, + "channelPrefix": "Kanal: ", + "channelSetUrl": "Kanalinställning/QR-kod URL", + "channels": "Kanaler:", + "usePreset": "Använd förinställning?", + "title": "Importera kanaluppsättning" + }, + "locationResponse": { + "altitude": "Höjd:", + "coordinates": "Koordinater: ", + "title": "Plats: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Förnya nyckel?", + "description": "Är du säker på att du vill förnya den fördelade nyckeln?", + "regenerate": "Förnya" + }, + "newDeviceDialog": { + "title": "Anslut ny enhet", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Seriell kommunikation", + "useHttps": "Använd HTTPS", + "connecting": "Ansluter...", + "connect": "Anslut", + "connectionFailedAlert": { + "title": "Anslutningen misslyckades", + "descriptionPrefix": "Kunde inte ansluta till enheten. ", + "httpsHint": "Om du använder HTTPS kan du behöva godkänna ett självsignerat certifikat först. ", + "openLinkPrefix": "Vänligen öppna ", + "openLinkSuffix": " i en ny flik", + "acceptTlsWarningSuffix": ", acceptera eventuella TLS-varningar om du uppmanas och försök igen", + "learnMoreLink": "Läs mer" + }, + "httpConnection": { + "label": "IP-adress/värdnamn", + "placeholder": "000.000.000.000 / meshtastic.lokal" + }, + "serialConnection": { + "noDevicesPaired": "Inga enheter parkopplade ännu.", + "newDeviceButton": "Ny enhet", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "Inga enheter parkopplade ännu.", + "newDeviceButton": "Ny enhet" + }, + "validation": { + "requiresWebBluetooth": "Den här anslutningstypen kräver <0>Web Bluetooth. Använd en webbläsare som stöds, till exempel Chrome eller Edge.", + "requiresWebSerial": "Den här anslutningstypen kräver <0>Web Serial. Använd en webbläsare som stöds, till exempel Chrome eller Edge.", + "requiresSecureContext": "Denna applikation kräver en <0>säker kontext. Anslut med HTTPS eller localhost.", + "additionallyRequiresSecureContext": "Dessutom kräver den ett <0>säker kontext. Vänligen anslut med HTTPS eller localhost." + } + }, + "nodeDetails": { + "message": "Meddelande", + "requestPosition": "Begär plats", + "traceRoute": "Spåra rutt", + "airTxUtilization": "Sändningsutnyttjande", + "allRawMetrics": "All oformaterad data", + "batteryLevel": "Batterinivå", + "channelUtilization": "Kanalutnyttjande", + "details": "Detaljer:", + "deviceMetrics": "Enhetens mätvärden:", + "hardware": "Hårdvara: ", + "lastHeard": "Senast hörd: ", + "nodeHexPrefix": "Nod-hex: !", + "nodeNumber": "Nodnummer: ", + "position": "Plats:", + "role": "Roll: ", + "uptime": "Drifttid: ", + "voltage": "Spänning", + "title": "Nodinformation för {{identifier}}", + "ignoreNode": "Ignorera nod", + "removeNode": "Ta bort nod", + "unignoreNode": "Ta bort favoritmarkering" + }, + "pkiBackup": { + "loseKeysWarning": "Om du förlorar dina nycklar måste du återställa din enhet.", + "secureBackup": "Det är viktigt att säkerhetskopiera dina publika och privata nycklar och förvara din säkerhetskopia säkert.", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Privat nyckel:", + "publicKey": "Publik nyckel:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Säkerhetskopiera nycklar" + }, + "pkiBackupReminder": { + "description": "Vi rekommenderar att du säkerhetskopierar dina nycklar regelbundet. Vill du säkerhetskopiera nu?", + "title": "Påminnelse om säkerhetskopiering", + "remindLaterPrefix": "Påminn mig om", + "remindNever": "Påminn mig aldrig", + "backupNow": "Säkerhetskopiera nu" + }, + "pkiRegenerate": { + "description": "Är du säker på att du vill förnya nyckelpar?", + "title": "Förnya nyckelpar" + }, + "qr": { + "addChannels": "Lägg till kanaler", + "replaceChannels": "Ersätt kanaler", + "description": "Den aktuella LoRa-konfigurationen kommer också att delas.", + "sharableUrl": "Delbar URL", + "title": "Generera QR-kod" + }, + "rebootOta": { + "title": "Schemalägg omstart", + "description": "Starta om den anslutna noden till OTA- (Over-the-Air) läge efter en fördröjning.", + "enterDelay": "Ange fördröjning (sekunder)", + "scheduled": "Omstart har schemalagts" + }, + "reboot": { + "title": "Schemalägg omstart", + "description": "Starta om den anslutna noden efter x minuter." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "Detta kommer att ta bort noden från enheten och begära nya nycklar.", + "keyMismatchReasonSuffix": ". Detta beror på att fjärrnodens nuvarande publika nyckel inte matchar den tidigare lagrade nyckeln för den här noden.", + "unableToSendDmPrefix": "Din nod kan inte skicka ett direkt meddelande till noden: " + }, + "acceptNewKeys": "Godkänn nya nycklar", + "title": "Nycklarna matchar inte - {{identifier}}" + }, + "removeNode": { + "description": "Är du säker på att du vill ta bort den här noden?", + "title": "Ta bort noden?" + }, + "shutdown": { + "title": "Schemalägg avstängning", + "description": "Stäng av den anslutna noden efter x minuter." + }, + "traceRoute": { + "routeToDestination": "Rutt till destination:", + "routeBack": "Rutt tillbaka:" + }, + "tracerouteResponse": { + "title": "Spåra rutt: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Ja, jag vet vad jag gör", + "conjunction": " och blogginlägget om ", + "postamble": " och förstår konsekvenserna av att ändra roll.", + "preamble": "Jag har läst ", + "choosingRightDeviceRole": "Att välja rätt enhetsroll", + "deviceRoleDocumentation": "Dokumentation för enhetsroll", + "title": "Är du säker?" + }, + "managedMode": { + "confirmUnderstanding": "Ja, jag vet vad jag gör", + "title": "Är du säker?", + "description": "Aktivering av fjärrhanterat läge blockerar klienter (inklusive webbklienten) från att skriva inställningar till en radio. När detta är aktiverat kan enhetens inställningar endast ändras via fjärradministratörsmeddelanden. Den här inställningen krävs inte för fjärradministration." + } } diff --git a/packages/web/public/i18n/locales/sv-SE/messages.json b/packages/web/public/i18n/locales/sv-SE/messages.json index 203b600f..bf46becc 100644 --- a/packages/web/public/i18n/locales/sv-SE/messages.json +++ b/packages/web/public/i18n/locales/sv-SE/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Meddelanden: {{chatName}}", - "placeholder": "Ange meddelande" - }, - "emptyState": { - "title": "Välj en chatt", - "text": "Det finns inga meddelanden ännu." - }, - "selectChatPrompt": { - "text": "Välj en kanal eller nod för att börja chatta." - }, - "sendMessage": { - "placeholder": "Ange ditt meddelande här...", - "sendButton": "Skicka" - }, - "actionsMenu": { - "addReactionLabel": "Lägg till reaktion", - "replyLabel": "Svara" - }, - "deliveryStatus": { - "delivered": { - "label": "Meddelandet har levererats", - "displayText": "Meddelandet har levererats" - }, - "failed": { - "label": "Meddelandeleverans misslyckades", - "displayText": "Leverans misslyckades" - }, - "unknown": { - "label": "Okänd meddelandestatus", - "displayText": "Okänd status" - }, - "waiting": { - "label": "Skickar meddelande", - "displayText": "Väntar på leverans" - } - } + "page": { + "title": "Meddelanden: {{chatName}}", + "placeholder": "Ange meddelande" + }, + "emptyState": { + "title": "Välj en chatt", + "text": "Det finns inga meddelanden ännu." + }, + "selectChatPrompt": { + "text": "Välj en kanal eller nod för att börja chatta." + }, + "sendMessage": { + "placeholder": "Ange ditt meddelande här...", + "sendButton": "Skicka" + }, + "actionsMenu": { + "addReactionLabel": "Lägg till reaktion", + "replyLabel": "Svara" + }, + "deliveryStatus": { + "delivered": { + "label": "Meddelandet har levererats", + "displayText": "Meddelandet har levererats" + }, + "failed": { + "label": "Meddelandeleverans misslyckades", + "displayText": "Leverans misslyckades" + }, + "unknown": { + "label": "Okänd meddelandestatus", + "displayText": "Okänd status" + }, + "waiting": { + "label": "Skickar meddelande", + "displayText": "Väntar på leverans" + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/moduleConfig.json b/packages/web/public/i18n/locales/sv-SE/moduleConfig.json index 075451c9..f3e498a1 100644 --- a/packages/web/public/i18n/locales/sv-SE/moduleConfig.json +++ b/packages/web/public/i18n/locales/sv-SE/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Omgivande belysning", - "tabAudio": "Ljud", - "tabCannedMessage": "Fördefinierade meddelanden", - "tabDetectionSensor": "Detekteringssensor", - "tabExternalNotification": "Extern avisering", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Granninformation", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Räckvidd", - "tabSerial": "Seriell kommunikation", - "tabStoreAndForward": "Lagra & vidarebefodra", - "tabTelemetry": "Telemetri" - }, - "ambientLighting": { - "title": "Inställningar för omgivande belysning", - "description": "Inställningar för modulen för omgivande belysning", - "ledState": { - "label": "LED-läge", - "description": "Anger om lysdioden ska vara på eller av" - }, - "current": { - "label": "Ström", - "description": "Ställer in strömmen för LED-utgången. Standardvärdet är 10" - }, - "red": { - "label": "Rött", - "description": "Anger nivån för den röda lysdioden. Värdena är 0-255" - }, - "green": { - "label": "Grönt", - "description": "Anger nivån för den gröna lysdioden. Värdena är 0-255" - }, - "blue": { - "label": "Blått", - "description": "Anger nivån för den blåa lysdioden. Värdena är 0-255" - } - }, - "audio": { - "title": "Ljudinställningar", - "description": "Inställningar för ljudmodulen", - "codec2Enabled": { - "label": "Codec 2 aktiverad", - "description": "Aktivera Codec 2-ljudkodning" - }, - "pttPin": { - "label": "PTT-stift", - "description": "GPIO-stift för PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate att använda för ljudkodning" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO-stift att använda för i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO-stift att använda för i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO-stift att använda för i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO-stift att använda för i2S SCK" - } - }, - "cannedMessage": { - "title": "Inställningar för fördefinierade meddelanden", - "description": "Inställningar för modulen för fördefinierade meddelanden", - "moduleEnabled": { - "label": "Modul aktiverad", - "description": "Aktivera fördefinierade meddelanden" - }, - "rotary1Enabled": { - "label": "Vridomkopplare #1 aktiverad", - "description": "Aktivera vridomkopplare" - }, - "inputbrokerPinA": { - "label": "Vridomkopplarstift A", - "description": "GPIO-stift (1-39) för vridomkopplarens A-stift" - }, - "inputbrokerPinB": { - "label": "Vridomkopplarstift B", - "description": "GPIO-stift (1-39) för vridomkopplarens B-stift" - }, - "inputbrokerPinPress": { - "label": "Vridomkopplarens knappstift", - "description": "GPIO-stift (1-39) för vridomkopplarens knapp-stift" - }, - "inputbrokerEventCw": { - "label": "Medurs inmatningshändelse", - "description": "Välj inmatningshändelse." - }, - "inputbrokerEventCcw": { - "label": "Moturs inmatningshändelse", - "description": "Välj inmatningshändelse." - }, - "inputbrokerEventPress": { - "label": "Inmatningshändelse för tryck", - "description": "Välj inmatningshändelse." - }, - "updown1Enabled": { - "label": "Upp/ned aktiverad", - "description": "Aktivera upp/ner vridomkopplaren" - }, - "allowInputSource": { - "label": "Tillåten inmatningskälla", - "description": "Välj från: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Skicka klocka", - "description": "Skickar det speciella klock-tecknet med varje meddelande" - } - }, - "detectionSensor": { - "title": "Inställningar för detekteringssensor", - "description": "Inställningar för detekteringssensor-modulen", - "enabled": { - "label": "Aktiverad", - "description": "Aktivera eller inaktivera detekteringssensor-modulen" - }, - "minimumBroadcastSecs": { - "label": "Minsta sändningsintervall", - "description": "Tidsintervall i sekunder hur ofta vi kan skicka ett meddelande till nätet när en tillståndsändring upptäckts" - }, - "stateBroadcastSecs": { - "label": "Högsta sändningsintervall", - "description": "Tidsintervall i sekunder hur ofta vi ska skicka ett meddelande till nätet med nuvarande tillstånd oavsett eventuella förändringar" - }, - "sendBell": { - "label": "Skicka klocka", - "description": "Skicka det speciella klock-tecknet med meddelandet" - }, - "name": { - "label": "Visningsnamn", - "description": "Används för att formatera meddelandet som skickas till nätet, max 20 tecken" - }, - "monitorPin": { - "label": "Stift att övervaka", - "description": "GPIO-stiftet att övervaka för tillståndsändringar" - }, - "detectionTriggerType": { - "label": "Typ för utlösande händelse", - "description": "Typ av utlösande händelse som ska användas" - }, - "usePullup": { - "label": "Använd Pullup", - "description": "Huruvida INPUT_PULLUP-läget ska användas för GPIO-stiftet " - } - }, - "externalNotification": { - "title": "Inställningar för extern avisering", - "description": "Konfigurera modulen för extern avisering", - "enabled": { - "label": "Modul aktiverad", - "description": "Aktivera extern avisering" - }, - "outputMs": { - "label": "Längd", - "description": "Hur länge ska notifikationen vara aktiverad" - }, - "output": { - "label": "Utgång", - "description": "GPIO-stift för utgång" - }, - "outputVibra": { - "label": "Vibrationsutgång", - "description": "GPIO-stift för vibrationsutgång" - }, - "outputBuzzer": { - "label": "Summerutgång", - "description": "GPIO-stift för summerutgång" - }, - "active": { - "label": "Aktiv", - "description": "Aktiv" - }, - "alertMessage": { - "label": "Meddelande-utgång", - "description": "Aktivera utgång när nytt meddelande tas emot" - }, - "alertMessageVibra": { - "label": "Meddelande-vibrationsutgång", - "description": "Aktivera vibrationsutgång när nytt meddelande tas emot" - }, - "alertMessageBuzzer": { - "label": "Meddelande-summer", - "description": "Aktivera summerutgång när nytt meddelande tas emot" - }, - "alertBell": { - "label": "Klock-tecken-utgång", - "description": "Aktivera utgång när ett inkommande meddelande innehåller det speciella klock-tecknet?" - }, - "alertBellVibra": { - "label": "Klock-tecken-vibration", - "description": "Aktivera vibrationsutgång när ett inkommande meddelande innehåller det speciella klock-tecknet" - }, - "alertBellBuzzer": { - "label": "Klock-tecken-summer", - "description": "Aktivera summerutgång när ett inkommande meddelande innehåller det speciella klock-tecknet" - }, - "usePwm": { - "label": "Använd PWM", - "description": "Använd pulsbreddsmodulering (PWM)" - }, - "nagTimeout": { - "label": "Time-out för påminnelse", - "description": "Time-out för påminnelse" - }, - "useI2sAsBuzzer": { - "label": "Använd I²S-stift som summer", - "description": "Ange I²S-stift som summerutgång" - } - }, - "mqtt": { - "title": "MQTT Inställningar", - "description": "Inställningar för MQTT-modulen", - "enabled": { - "label": "Aktiverad", - "description": "Aktivera eller inaktivera MQTT" - }, - "address": { - "label": "MQTT-serveradress", - "description": "MQTT-serveradress att använda för standard/anpassade servrar" - }, - "username": { - "label": "MQTT-användarnamn", - "description": "MQTT-användarnamn att använda för standard/anpassade servrar" - }, - "password": { - "label": "MQTT-lösenord", - "description": "MQTT-lösenord att använda för standard/anpassade servrar" - }, - "encryptionEnabled": { - "label": "Aktivera kryptering ", - "description": "Aktivera eller inaktivera MQTT-kryptering. OBS: Alla meddelanden skickas okrypterade till MQTT-servern om det här alternativet inte är aktiverat, även när dina kanaler med aktiverad MQTT-upplänk har krypteringsnycklar. Detta inkluderar positionsdata." - }, - "jsonEnabled": { - "label": "JSON aktiverat", - "description": "Om du vill skicka/ta emot JSON-paket på MQTT" - }, - "tlsEnabled": { - "label": "TLS aktiverat", - "description": "Aktivera eller inaktivera TLS" - }, - "root": { - "label": "Rotämne (root topic)", - "description": "MQTT rotämne (root topic) att använda för standard/anpassade servrar " - }, - "proxyToClientEnabled": { - "label": "MQTT-klientproxy aktiverad", - "description": "Utnyttja nätverksanslutningen för att vidarebefodra MQTT-meddelanden till klienten." - }, - "mapReportingEnabled": { - "label": "Kartrapportering aktiverad", - "description": "Din nod kommer periodvis skicka ett okrypterat paket till den konfigurerade MQTT-servern som inkluderar id, kort och långt namn, ungefärlig plats, hardvarumodell, enhetsroll, mjukvaru-version, LoRa-region, modeminställning och den primära kanalens namn." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Intervall för kartrapportering", - "description": "Intervall i sekunder för hur ofta kartrapportering ska ske" - }, - "positionPrecision": { - "label": "Ungefärlig plats", - "description": "Den delade platsen kommer att avrundas till denna noggrannhet", - "options": { - "metric_km23": "Inom 23 km", - "metric_km12": "Inom 12 km", - "metric_km5_8": "Inom 5,8 km", - "metric_km2_9": "Inom 2,9 km", - "metric_km1_5": "Inom 1,5 km", - "metric_m700": "Inom 700 m", - "metric_m350": "Inom 350 m", - "metric_m200": "Inom 200 m", - "metric_m90": "Inom 90 meter", - "metric_m50": "inom 50 m", - "imperial_mi15": "Inom 15 engelska mil", - "imperial_mi7_3": "Inom 7,3 engelska mil", - "imperial_mi3_6": "Inom 3,6 engelska mil", - "imperial_mi1_8": "Inom 1,8 engelska mil", - "imperial_mi0_9": "Inom 0,9 engelska mil", - "imperial_mi0_5": "Inom 0,5 engelska mil", - "imperial_mi0_2": "Inom 0,2 engelska mil", - "imperial_ft600": "Inom 600 fot", - "imperial_ft300": "Inom 300 fot", - "imperial_ft150": "Inom 150 fot" - } - } - } - }, - "neighborInfo": { - "title": "Inställningar för granninformation", - "description": "Inställningar för granninformation-modulen", - "enabled": { - "label": "Aktiverad", - "description": "Aktivera eller inaktivera granninformation-modulen" - }, - "updateInterval": { - "label": "Uppdateringsintervall", - "description": "Intervall i sekunder av hur ofta granninformation ska försöka skickas till nätet" - } - }, - "paxcounter": { - "title": "Inställningar för Paxcounter", - "description": "Inställningar för Paxcounter-modulen", - "enabled": { - "label": "Modul aktiverad", - "description": "Aktivera Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Uppdateringsintervall (sekunder)", - "description": "Hur lång tid mellan paxcounter paket skickas" - }, - "wifiThreshold": { - "label": "Tröskelvärde för WiFi RSSI ", - "description": "På vilken WiFi RSSI-nivå ska räknaren öka. Standardvärdet är -80." - }, - "bleThreshold": { - "label": "Tröskelvärde för Bluetooth RSSI ", - "description": "På vilken Bluetooth RSSI-nivå ska räknaren öka. Standardvärdet är -80." - } - }, - "rangeTest": { - "title": "Inställningar för räckviddstest", - "description": "Inställningar för räckviddstest-modulen", - "enabled": { - "label": "Modul aktiverad", - "description": "Aktivera räckviddstest" - }, - "sender": { - "label": "Meddelandeintervall", - "description": "Hur lång tid mellan utsändning av testpaket" - }, - "save": { - "label": "Spara CSV till lagring", - "description": "Spara CSV till enhetens egna flashminne. Endast tillgängligt på ESP32-enheter." - } - }, - "serial": { - "title": "Inställningar för seriell kommunikation", - "description": "Inställningar för den seriella modulen", - "enabled": { - "label": "Modul aktiverad", - "description": "Aktivera seriell utmatning" - }, - "echo": { - "label": "Eko", - "description": "Alla paket du skickar kommer att upprepas tillbaka till din enhet" - }, - "rxd": { - "label": "Stift för mottagning", - "description": "Ställ in GPIO-stift till det RXD-stift du har konfigurerat." - }, - "txd": { - "label": "Stift för sändning", - "description": "Ställ in GPIO-stift till det TXD-stift du har konfigurerat." - }, - "baud": { - "label": "Hastighet", - "description": "Den seriella kommunikationens hastighet" - }, - "timeout": { - "label": "Timeout", - "description": "Tid att vänta innan ditt paket betraktas som \"klart\"." - }, - "mode": { - "label": "Typ", - "description": "Välj typ av paket" - }, - "overrideConsoleSerialPort": { - "label": "Åsidosätt konsolens serieport", - "description": "Om du har en seriell port ansluten till konsolen kommer detta att ersätta den." - } - }, - "storeForward": { - "title": "Inställningar för lagra & vidarebefodra", - "description": "Inställningar för lagra & vidarebefodra-modulen", - "enabled": { - "label": "Modul aktiverad", - "description": "Aktivera lagra & vidarebefodra-modulen" - }, - "heartbeat": { - "label": "Puls aktiverad", - "description": "Aktivera sändning av lagra & vidarebefodra-puls " - }, - "records": { - "label": "Antal poster", - "description": "Antal poster att lagra" - }, - "historyReturnMax": { - "label": "Maxstorlek för historik", - "description": "Maximalt antal poster att returnera" - }, - "historyReturnWindow": { - "label": "Returfönstrets storlek för historik", - "description": "Maximalt antal poster att returnera" - } - }, - "telemetry": { - "title": "Inställningar för telemetri", - "description": "Inställningar för telemetrimodulen", - "deviceUpdateInterval": { - "label": "Enhetens mätvärden", - "description": "Uppdateringsintervall för enhetsdata" - }, - "environmentUpdateInterval": { - "label": "Uppdateringsintervall för miljömätningar", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Modul aktiverad", - "description": "Aktivera miljötelemetri" - }, - "environmentScreenEnabled": { - "label": "Visa på display", - "description": "Visa telemetri-värden på OLED-displayen" - }, - "environmentDisplayFahrenheit": { - "label": "Visa Fahrenheit", - "description": "Visa temperatur i Fahrenheit" - }, - "airQualityEnabled": { - "label": "Aktivera luftkvalitet ", - "description": "Aktivera telemetri för luftkvalitet" - }, - "airQualityInterval": { - "label": "Intervall för uppdatering av luftkvalitet", - "description": "Hur ofta att skicka data om luftkvalitet över nätet" - }, - "powerMeasurementEnabled": { - "label": "Effektmätning aktiverad", - "description": "Aktivera telemetri för effektmätning" - }, - "powerUpdateInterval": { - "label": "Intervall för effektuppdatering", - "description": "Hur ofta ska effektdata skickas över nätet" - }, - "powerScreenEnabled": { - "label": "Aktivera strömskärm", - "description": "Aktivera skärmen för strömdata" - } - } + "page": { + "tabAmbientLighting": "Omgivande belysning", + "tabAudio": "Ljud", + "tabCannedMessage": "Fördefinierade meddelanden", + "tabDetectionSensor": "Detekteringssensor", + "tabExternalNotification": "Extern avisering", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Granninformation", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Räckvidd", + "tabSerial": "Seriell kommunikation", + "tabStoreAndForward": "Lagra & vidarebefodra", + "tabTelemetry": "Telemetri" + }, + "ambientLighting": { + "title": "Inställningar för omgivande belysning", + "description": "Inställningar för modulen för omgivande belysning", + "ledState": { + "label": "LED-läge", + "description": "Anger om lysdioden ska vara på eller av" + }, + "current": { + "label": "Ström", + "description": "Ställer in strömmen för LED-utgången. Standardvärdet är 10" + }, + "red": { + "label": "Rött", + "description": "Anger nivån för den röda lysdioden. Värdena är 0-255" + }, + "green": { + "label": "Grönt", + "description": "Anger nivån för den gröna lysdioden. Värdena är 0-255" + }, + "blue": { + "label": "Blått", + "description": "Anger nivån för den blåa lysdioden. Värdena är 0-255" + } + }, + "audio": { + "title": "Ljudinställningar", + "description": "Inställningar för ljudmodulen", + "codec2Enabled": { + "label": "Codec 2 aktiverad", + "description": "Aktivera Codec 2-ljudkodning" + }, + "pttPin": { + "label": "PTT-stift", + "description": "GPIO-stift för PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate att använda för ljudkodning" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO-stift att använda för i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO-stift att använda för i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO-stift att använda för i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO-stift att använda för i2S SCK" + } + }, + "cannedMessage": { + "title": "Inställningar för fördefinierade meddelanden", + "description": "Inställningar för modulen för fördefinierade meddelanden", + "moduleEnabled": { + "label": "Modul aktiverad", + "description": "Aktivera fördefinierade meddelanden" + }, + "rotary1Enabled": { + "label": "Vridomkopplare #1 aktiverad", + "description": "Aktivera vridomkopplare" + }, + "inputbrokerPinA": { + "label": "Vridomkopplarstift A", + "description": "GPIO-stift (1-39) för vridomkopplarens A-stift" + }, + "inputbrokerPinB": { + "label": "Vridomkopplarstift B", + "description": "GPIO-stift (1-39) för vridomkopplarens B-stift" + }, + "inputbrokerPinPress": { + "label": "Vridomkopplarens knappstift", + "description": "GPIO-stift (1-39) för vridomkopplarens knapp-stift" + }, + "inputbrokerEventCw": { + "label": "Medurs inmatningshändelse", + "description": "Välj inmatningshändelse." + }, + "inputbrokerEventCcw": { + "label": "Moturs inmatningshändelse", + "description": "Välj inmatningshändelse." + }, + "inputbrokerEventPress": { + "label": "Inmatningshändelse för tryck", + "description": "Välj inmatningshändelse." + }, + "updown1Enabled": { + "label": "Upp/ned aktiverad", + "description": "Aktivera upp/ner vridomkopplaren" + }, + "allowInputSource": { + "label": "Tillåten inmatningskälla", + "description": "Välj från: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Skicka klocka", + "description": "Skickar det speciella klock-tecknet med varje meddelande" + } + }, + "detectionSensor": { + "title": "Inställningar för detekteringssensor", + "description": "Inställningar för detekteringssensor-modulen", + "enabled": { + "label": "Aktiverad", + "description": "Aktivera eller inaktivera detekteringssensor-modulen" + }, + "minimumBroadcastSecs": { + "label": "Minsta sändningsintervall", + "description": "Tidsintervall i sekunder hur ofta vi kan skicka ett meddelande till nätet när en tillståndsändring upptäckts" + }, + "stateBroadcastSecs": { + "label": "Högsta sändningsintervall", + "description": "Tidsintervall i sekunder hur ofta vi ska skicka ett meddelande till nätet med nuvarande tillstånd oavsett eventuella förändringar" + }, + "sendBell": { + "label": "Skicka klocka", + "description": "Skicka det speciella klock-tecknet med meddelandet" + }, + "name": { + "label": "Visningsnamn", + "description": "Används för att formatera meddelandet som skickas till nätet, max 20 tecken" + }, + "monitorPin": { + "label": "Stift att övervaka", + "description": "GPIO-stiftet att övervaka för tillståndsändringar" + }, + "detectionTriggerType": { + "label": "Typ för utlösande händelse", + "description": "Typ av utlösande händelse som ska användas" + }, + "usePullup": { + "label": "Använd Pullup", + "description": "Huruvida INPUT_PULLUP-läget ska användas för GPIO-stiftet " + } + }, + "externalNotification": { + "title": "Inställningar för extern avisering", + "description": "Konfigurera modulen för extern avisering", + "enabled": { + "label": "Modul aktiverad", + "description": "Aktivera extern avisering" + }, + "outputMs": { + "label": "Längd", + "description": "Hur länge ska notifikationen vara aktiverad" + }, + "output": { + "label": "Utgång", + "description": "GPIO-stift för utgång" + }, + "outputVibra": { + "label": "Vibrationsutgång", + "description": "GPIO-stift för vibrationsutgång" + }, + "outputBuzzer": { + "label": "Summerutgång", + "description": "GPIO-stift för summerutgång" + }, + "active": { + "label": "Aktiv", + "description": "Aktiv" + }, + "alertMessage": { + "label": "Meddelande-utgång", + "description": "Aktivera utgång när nytt meddelande tas emot" + }, + "alertMessageVibra": { + "label": "Meddelande-vibrationsutgång", + "description": "Aktivera vibrationsutgång när nytt meddelande tas emot" + }, + "alertMessageBuzzer": { + "label": "Meddelande-summer", + "description": "Aktivera summerutgång när nytt meddelande tas emot" + }, + "alertBell": { + "label": "Klock-tecken-utgång", + "description": "Aktivera utgång när ett inkommande meddelande innehåller det speciella klock-tecknet?" + }, + "alertBellVibra": { + "label": "Klock-tecken-vibration", + "description": "Aktivera vibrationsutgång när ett inkommande meddelande innehåller det speciella klock-tecknet" + }, + "alertBellBuzzer": { + "label": "Klock-tecken-summer", + "description": "Aktivera summerutgång när ett inkommande meddelande innehåller det speciella klock-tecknet" + }, + "usePwm": { + "label": "Använd PWM", + "description": "Använd pulsbreddsmodulering (PWM)" + }, + "nagTimeout": { + "label": "Time-out för påminnelse", + "description": "Time-out för påminnelse" + }, + "useI2sAsBuzzer": { + "label": "Använd I²S-stift som summer", + "description": "Ange I²S-stift som summerutgång" + } + }, + "mqtt": { + "title": "MQTT Inställningar", + "description": "Inställningar för MQTT-modulen", + "enabled": { + "label": "Aktiverad", + "description": "Aktivera eller inaktivera MQTT" + }, + "address": { + "label": "MQTT-serveradress", + "description": "MQTT-serveradress att använda för standard/anpassade servrar" + }, + "username": { + "label": "MQTT-användarnamn", + "description": "MQTT-användarnamn att använda för standard/anpassade servrar" + }, + "password": { + "label": "MQTT-lösenord", + "description": "MQTT-lösenord att använda för standard/anpassade servrar" + }, + "encryptionEnabled": { + "label": "Aktivera kryptering ", + "description": "Aktivera eller inaktivera MQTT-kryptering. OBS: Alla meddelanden skickas okrypterade till MQTT-servern om det här alternativet inte är aktiverat, även när dina kanaler med aktiverad MQTT-upplänk har krypteringsnycklar. Detta inkluderar positionsdata." + }, + "jsonEnabled": { + "label": "JSON aktiverat", + "description": "Om du vill skicka/ta emot JSON-paket på MQTT" + }, + "tlsEnabled": { + "label": "TLS aktiverat", + "description": "Aktivera eller inaktivera TLS" + }, + "root": { + "label": "Rotämne (root topic)", + "description": "MQTT rotämne (root topic) att använda för standard/anpassade servrar " + }, + "proxyToClientEnabled": { + "label": "MQTT-klientproxy aktiverad", + "description": "Utnyttja nätverksanslutningen för att vidarebefodra MQTT-meddelanden till klienten." + }, + "mapReportingEnabled": { + "label": "Kartrapportering aktiverad", + "description": "Din nod kommer periodvis skicka ett okrypterat paket till den konfigurerade MQTT-servern som inkluderar id, kort och långt namn, ungefärlig plats, hardvarumodell, enhetsroll, mjukvaru-version, LoRa-region, modeminställning och den primära kanalens namn." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Intervall för kartrapportering", + "description": "Intervall i sekunder för hur ofta kartrapportering ska ske" + }, + "positionPrecision": { + "label": "Ungefärlig plats", + "description": "Den delade platsen kommer att avrundas till denna noggrannhet", + "options": { + "metric_km23": "Inom 23 km", + "metric_km12": "Inom 12 km", + "metric_km5_8": "Inom 5,8 km", + "metric_km2_9": "Inom 2,9 km", + "metric_km1_5": "Inom 1,5 km", + "metric_m700": "Inom 700 m", + "metric_m350": "Inom 350 m", + "metric_m200": "Inom 200 m", + "metric_m90": "Inom 90 meter", + "metric_m50": "inom 50 m", + "imperial_mi15": "Inom 15 engelska mil", + "imperial_mi7_3": "Inom 7,3 engelska mil", + "imperial_mi3_6": "Inom 3,6 engelska mil", + "imperial_mi1_8": "Inom 1,8 engelska mil", + "imperial_mi0_9": "Inom 0,9 engelska mil", + "imperial_mi0_5": "Inom 0,5 engelska mil", + "imperial_mi0_2": "Inom 0,2 engelska mil", + "imperial_ft600": "Inom 600 fot", + "imperial_ft300": "Inom 300 fot", + "imperial_ft150": "Inom 150 fot" + } + } + } + }, + "neighborInfo": { + "title": "Inställningar för granninformation", + "description": "Inställningar för granninformation-modulen", + "enabled": { + "label": "Aktiverad", + "description": "Aktivera eller inaktivera granninformation-modulen" + }, + "updateInterval": { + "label": "Uppdateringsintervall", + "description": "Intervall i sekunder av hur ofta granninformation ska försöka skickas till nätet" + } + }, + "paxcounter": { + "title": "Inställningar för Paxcounter", + "description": "Inställningar för Paxcounter-modulen", + "enabled": { + "label": "Modul aktiverad", + "description": "Aktivera Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Uppdateringsintervall (sekunder)", + "description": "Hur lång tid mellan paxcounter paket skickas" + }, + "wifiThreshold": { + "label": "Tröskelvärde för WiFi RSSI ", + "description": "På vilken WiFi RSSI-nivå ska räknaren öka. Standardvärdet är -80." + }, + "bleThreshold": { + "label": "Tröskelvärde för Bluetooth RSSI ", + "description": "På vilken Bluetooth RSSI-nivå ska räknaren öka. Standardvärdet är -80." + } + }, + "rangeTest": { + "title": "Inställningar för räckviddstest", + "description": "Inställningar för räckviddstest-modulen", + "enabled": { + "label": "Modul aktiverad", + "description": "Aktivera räckviddstest" + }, + "sender": { + "label": "Meddelandeintervall", + "description": "Hur lång tid mellan utsändning av testpaket" + }, + "save": { + "label": "Spara CSV till lagring", + "description": "Spara CSV till enhetens egna flashminne. Endast tillgängligt på ESP32-enheter." + } + }, + "serial": { + "title": "Inställningar för seriell kommunikation", + "description": "Inställningar för den seriella modulen", + "enabled": { + "label": "Modul aktiverad", + "description": "Aktivera seriell utmatning" + }, + "echo": { + "label": "Eko", + "description": "Alla paket du skickar kommer att upprepas tillbaka till din enhet" + }, + "rxd": { + "label": "Stift för mottagning", + "description": "Ställ in GPIO-stift till det RXD-stift du har konfigurerat." + }, + "txd": { + "label": "Stift för sändning", + "description": "Ställ in GPIO-stift till det TXD-stift du har konfigurerat." + }, + "baud": { + "label": "Hastighet", + "description": "Den seriella kommunikationens hastighet" + }, + "timeout": { + "label": "Timeout", + "description": "Tid att vänta innan ditt paket betraktas som \"klart\"." + }, + "mode": { + "label": "Typ", + "description": "Välj typ av paket" + }, + "overrideConsoleSerialPort": { + "label": "Åsidosätt konsolens serieport", + "description": "Om du har en seriell port ansluten till konsolen kommer detta att ersätta den." + } + }, + "storeForward": { + "title": "Inställningar för lagra & vidarebefodra", + "description": "Inställningar för lagra & vidarebefodra-modulen", + "enabled": { + "label": "Modul aktiverad", + "description": "Aktivera lagra & vidarebefodra-modulen" + }, + "heartbeat": { + "label": "Puls aktiverad", + "description": "Aktivera sändning av lagra & vidarebefodra-puls " + }, + "records": { + "label": "Antal poster", + "description": "Antal poster att lagra" + }, + "historyReturnMax": { + "label": "Maxstorlek för historik", + "description": "Maximalt antal poster att returnera" + }, + "historyReturnWindow": { + "label": "Returfönstrets storlek för historik", + "description": "Maximalt antal poster att returnera" + } + }, + "telemetry": { + "title": "Inställningar för telemetri", + "description": "Inställningar för telemetrimodulen", + "deviceUpdateInterval": { + "label": "Enhetens mätvärden", + "description": "Uppdateringsintervall för enhetsdata" + }, + "environmentUpdateInterval": { + "label": "Uppdateringsintervall för miljömätningar", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Modul aktiverad", + "description": "Aktivera miljötelemetri" + }, + "environmentScreenEnabled": { + "label": "Visa på display", + "description": "Visa telemetri-värden på OLED-displayen" + }, + "environmentDisplayFahrenheit": { + "label": "Visa Fahrenheit", + "description": "Visa temperatur i Fahrenheit" + }, + "airQualityEnabled": { + "label": "Aktivera luftkvalitet ", + "description": "Aktivera telemetri för luftkvalitet" + }, + "airQualityInterval": { + "label": "Intervall för uppdatering av luftkvalitet", + "description": "Hur ofta att skicka data om luftkvalitet över nätet" + }, + "powerMeasurementEnabled": { + "label": "Effektmätning aktiverad", + "description": "Aktivera telemetri för effektmätning" + }, + "powerUpdateInterval": { + "label": "Intervall för effektuppdatering", + "description": "Hur ofta ska effektdata skickas över nätet" + }, + "powerScreenEnabled": { + "label": "Aktivera strömskärm", + "description": "Aktivera skärmen för strömdata" + } + } } diff --git a/packages/web/public/i18n/locales/sv-SE/nodes.json b/packages/web/public/i18n/locales/sv-SE/nodes.json index 97855c4c..659c41be 100644 --- a/packages/web/public/i18n/locales/sv-SE/nodes.json +++ b/packages/web/public/i18n/locales/sv-SE/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Publik nyckel aktiverad" - }, - "noPublicKey": { - "label": "Publik nyckel saknas" - }, - "directMessage": { - "label": "Direktmeddelande {{shortName}}" - }, - "favorite": { - "label": "Favorit", - "tooltip": "Lägg till eller ta bort den här noden från dina favoriter" - }, - "notFavorite": { - "label": "Inte en favorit" - }, - "error": { - "label": "Fel", - "text": "Ett fel inträffade vid hämtning av nodens detaljer. Försök igen senare." - }, - "status": { - "heard": "Hörd", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Höjd" - }, - "channelUtil": { - "label": "Kanalutnyttjande" - }, - "airtimeUtil": { - "label": "Sändningstidsutnyttjande" - } - }, - "nodesTable": { - "headings": { - "longName": "Långt namn", - "connection": "Anslutning", - "lastHeard": "Senast hörd", - "encryption": "Kryptering", - "model": "Modell", - "macAddress": "MAC-adress" - }, - "connectionStatus": { - "direct": "Direkt", - "away": "bort", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Aldrig" - } - }, - "actions": { - "added": "Tillagd", - "removed": "Borttagen", - "ignoreNode": "Ignorera nod", - "unignoreNode": "Ta bort ignorering", - "requestPosition": "Begär plats" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Publik nyckel aktiverad" + }, + "noPublicKey": { + "label": "Publik nyckel saknas" + }, + "directMessage": { + "label": "Direktmeddelande {{shortName}}" + }, + "favorite": { + "label": "Favorit", + "tooltip": "Lägg till eller ta bort den här noden från dina favoriter" + }, + "notFavorite": { + "label": "Inte en favorit" + }, + "error": { + "label": "Fel", + "text": "Ett fel inträffade vid hämtning av nodens detaljer. Försök igen senare." + }, + "status": { + "heard": "Hörd", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Höjd" + }, + "channelUtil": { + "label": "Kanalutnyttjande" + }, + "airtimeUtil": { + "label": "Sändningstidsutnyttjande" + } + }, + "nodesTable": { + "headings": { + "longName": "Långt namn", + "connection": "Anslutning", + "lastHeard": "Senast hörd", + "encryption": "Kryptering", + "model": "Modell", + "macAddress": "MAC-adress" + }, + "connectionStatus": { + "direct": "Direkt", + "away": "bort", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Aldrig" + } + }, + "actions": { + "added": "Tillagd", + "removed": "Borttagen", + "ignoreNode": "Ignorera nod", + "unignoreNode": "Ta bort ignorering", + "requestPosition": "Begär plats" + } } diff --git a/packages/web/public/i18n/locales/sv-SE/ui.json b/packages/web/public/i18n/locales/sv-SE/ui.json index dee4cf1e..a76914e7 100644 --- a/packages/web/public/i18n/locales/sv-SE/ui.json +++ b/packages/web/public/i18n/locales/sv-SE/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigering", - "messages": "Meddelanden", - "map": "Karta", - "config": "Inställningar", - "radioConfig": "Radioinställningar", - "moduleConfig": "Modulinställningar", - "channels": "Kanaler", - "nodes": "Noder" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic logotyp" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Öppna sidopanel", - "close": "Stäng sidopanel" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volt", - "firmware": { - "title": "Firmware", - "version": "v{{version}}", - "buildDate": "Kompileringsdatum: {{date}}" - }, - "deviceName": { - "title": "Enhetsnamn", - "changeName": "Ändra enhetens namn", - "placeholder": "Ange enhetsnamn" - }, - "editDeviceName": "Redigera enhetsnamn" - } - }, - "batteryStatus": { - "charging": "{{level}}%, laddar", - "pluggedIn": "Ansluten", - "title": "Batteri" - }, - "search": { - "nodes": "Sök noder...", - "channels": "Sök kanaler...", - "commandPalette": "Sök kommandon..." - }, - "toast": { - "positionRequestSent": { - "title": "Platsbegäran skickad." - }, - "requestingPosition": { - "title": "Begär plats, var god vänta..." - }, - "sendingTraceroute": { - "title": "Skickar Traceroute (spåra rutt), vänligen vänta..." - }, - "tracerouteSent": { - "title": "Traceroute (spåra rutt) skickat.." - }, - "savedChannel": { - "title": "Sparat kanal: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chatten använder PKI-kryptering." - }, - "pskEncryption": { - "title": "Chatten använder PSK-kryptering." - } - }, - "configSaveError": { - "title": "Kunde inte spara inställningarna", - "description": "Ett fel inträffade när inställningarna sparades." - }, - "validationError": { - "title": "Det förekommer inställningsfel", - "description": "Vänligen åtgärda felen i inställningarna innan du sparar." - }, - "saveSuccess": { - "title": "Sparar inställningarna", - "description": "Ändrignarna av {{case}}-inställningarna har sparats." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} dina favoriter.", - "action": { - "added": "La till", - "removed": "Tog bort", - "to": "till", - "from": "från" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} dina ignorerade noder", - "action": { - "added": "La till", - "removed": "Tog bort", - "to": "till", - "from": "från" - } - } - }, - "notifications": { - "copied": { - "label": "Kopierat!" - }, - "copyToClipboard": { - "label": "Kopiera till Urklipp" - }, - "hidePassword": { - "label": "Dölj lösenord" - }, - "showPassword": { - "label": "Visa lösenord" - }, - "deliveryStatus": { - "delivered": "Levererad", - "failed": "Leverans misslyckades", - "waiting": "Väntar", - "unknown": "Okänd" - } - }, - "general": { - "label": "Allmänt" - }, - "hardware": { - "label": "Hårdvara" - }, - "metrics": { - "label": "Telemetri" - }, - "role": { - "label": "Roll" - }, - "filter": { - "label": "Filter" - }, - "advanced": { - "label": "Advancerat" - }, - "clearInput": { - "label": "Rensa inmatning" - }, - "resetFilters": { - "label": "Återställ filter" - }, - "nodeName": { - "label": "Nodnamn/nummer", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Sändningstidsutnyttjande (%)" - }, - "batteryLevel": { - "label": "Batterinivå (%)", - "labelText": "Batterinivå (%): {{value}}" - }, - "batteryVoltage": { - "label": "Batterispänning (V)", - "title": "Spänning" - }, - "channelUtilization": { - "label": "Kanalutnyttjande (%)" - }, - "hops": { - "direct": "Direkt", - "label": "Antal hopp", - "text": "Antal hopp: {{value}}" - }, - "lastHeard": { - "label": "Senast hörd", - "labelText": "Senast hörd: {{value}}", - "nowLabel": "Nu" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favoriter" - }, - "hide": { - "label": "Dölj" - }, - "showOnly": { - "label": "Visa endast" - }, - "viaMqtt": { - "label": "Ansluten via MQTT" - }, - "hopsUnknown": { - "label": "Okänt antal hopp" - }, - "showUnheard": { - "label": "Aldrig hörd" - }, - "language": { - "label": "Språk", - "changeLanguage": "Byt språk" - }, - "theme": { - "dark": "Mörkt", - "light": "Ljust", - "system": "Automatisk", - "changeTheme": "Ändra färgschema" - }, - "errorPage": { - "title": "Det här är lite pinsamt...", - "description1": "Vi är verkligen ledsna men ett fel inträffade i webbklienten som fick den att krascha.
Detta var inte meningen, men vi arbetar hårt för att åtgärda det.", - "description2": "Det bästa sättet att förhindra att detta händer igen för dig eller någon annan är att rapportera problemet till oss.", - "reportInstructions": "Vänligen inkludera följande information i din rapport:", - "reportSteps": { - "step1": "Vad du gjorde när felet inträffade", - "step2": "Vad du förväntade dig skulle hända", - "step3": "Vad som faktiskt hände", - "step4": "All annan relevant information" - }, - "reportLink": "Du kan rapportera problemet på vår <0>GitHub", - "dashboardLink": "Återvänd till <0>start", - "detailsSummary": "Detaljer om felet", - "errorMessageLabel": "Felmeddelande:", - "stackTraceLabel": "Stackspårning:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Drivs av <0>▲ Vercel | Meshtastic® är ett registrerat varumärke som tillhör Meshtastic LLC. | <1>Juridisk information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigering", + "messages": "Meddelanden", + "map": "Karta", + "config": "Inställningar", + "radioConfig": "Radioinställningar", + "moduleConfig": "Modulinställningar", + "channels": "Kanaler", + "nodes": "Noder" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic logotyp" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Öppna sidopanel", + "close": "Stäng sidopanel" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volt", + "firmware": { + "title": "Firmware", + "version": "v{{version}}", + "buildDate": "Kompileringsdatum: {{date}}" + }, + "deviceName": { + "title": "Enhetsnamn", + "changeName": "Ändra enhetens namn", + "placeholder": "Ange enhetsnamn" + }, + "editDeviceName": "Redigera enhetsnamn" + } + }, + "batteryStatus": { + "charging": "{{level}}%, laddar", + "pluggedIn": "Ansluten", + "title": "Batteri" + }, + "search": { + "nodes": "Sök noder...", + "channels": "Sök kanaler...", + "commandPalette": "Sök kommandon..." + }, + "toast": { + "positionRequestSent": { + "title": "Platsbegäran skickad." + }, + "requestingPosition": { + "title": "Begär plats, var god vänta..." + }, + "sendingTraceroute": { + "title": "Skickar Traceroute (spåra rutt), vänligen vänta..." + }, + "tracerouteSent": { + "title": "Traceroute (spåra rutt) skickat.." + }, + "savedChannel": { + "title": "Sparat kanal: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chatten använder PKI-kryptering." + }, + "pskEncryption": { + "title": "Chatten använder PSK-kryptering." + } + }, + "configSaveError": { + "title": "Kunde inte spara inställningarna", + "description": "Ett fel inträffade när inställningarna sparades." + }, + "validationError": { + "title": "Det förekommer inställningsfel", + "description": "Vänligen åtgärda felen i inställningarna innan du sparar." + }, + "saveSuccess": { + "title": "Sparar inställningarna", + "description": "Ändrignarna av {{case}}-inställningarna har sparats." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} dina favoriter.", + "action": { + "added": "La till", + "removed": "Tog bort", + "to": "till", + "from": "från" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} dina ignorerade noder", + "action": { + "added": "La till", + "removed": "Tog bort", + "to": "till", + "from": "från" + } + } + }, + "notifications": { + "copied": { + "label": "Kopierat!" + }, + "copyToClipboard": { + "label": "Kopiera till Urklipp" + }, + "hidePassword": { + "label": "Dölj lösenord" + }, + "showPassword": { + "label": "Visa lösenord" + }, + "deliveryStatus": { + "delivered": "Levererad", + "failed": "Leverans misslyckades", + "waiting": "Väntar", + "unknown": "Okänd" + } + }, + "general": { + "label": "Allmänt" + }, + "hardware": { + "label": "Hårdvara" + }, + "metrics": { + "label": "Telemetri" + }, + "role": { + "label": "Roll" + }, + "filter": { + "label": "Filter" + }, + "advanced": { + "label": "Advancerat" + }, + "clearInput": { + "label": "Rensa inmatning" + }, + "resetFilters": { + "label": "Återställ filter" + }, + "nodeName": { + "label": "Nodnamn/nummer", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Sändningstidsutnyttjande (%)" + }, + "batteryLevel": { + "label": "Batterinivå (%)", + "labelText": "Batterinivå (%): {{value}}" + }, + "batteryVoltage": { + "label": "Batterispänning (V)", + "title": "Spänning" + }, + "channelUtilization": { + "label": "Kanalutnyttjande (%)" + }, + "hops": { + "direct": "Direkt", + "label": "Antal hopp", + "text": "Antal hopp: {{value}}" + }, + "lastHeard": { + "label": "Senast hörd", + "labelText": "Senast hörd: {{value}}", + "nowLabel": "Nu" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favoriter" + }, + "hide": { + "label": "Dölj" + }, + "showOnly": { + "label": "Visa endast" + }, + "viaMqtt": { + "label": "Ansluten via MQTT" + }, + "hopsUnknown": { + "label": "Okänt antal hopp" + }, + "showUnheard": { + "label": "Aldrig hörd" + }, + "language": { + "label": "Språk", + "changeLanguage": "Byt språk" + }, + "theme": { + "dark": "Mörkt", + "light": "Ljust", + "system": "Automatisk", + "changeTheme": "Ändra färgschema" + }, + "errorPage": { + "title": "Det här är lite pinsamt...", + "description1": "Vi är verkligen ledsna men ett fel inträffade i webbklienten som fick den att krascha.
Detta var inte meningen, men vi arbetar hårt för att åtgärda det.", + "description2": "Det bästa sättet att förhindra att detta händer igen för dig eller någon annan är att rapportera problemet till oss.", + "reportInstructions": "Vänligen inkludera följande information i din rapport:", + "reportSteps": { + "step1": "Vad du gjorde när felet inträffade", + "step2": "Vad du förväntade dig skulle hända", + "step3": "Vad som faktiskt hände", + "step4": "All annan relevant information" + }, + "reportLink": "Du kan rapportera problemet på vår <0>GitHub", + "dashboardLink": "Återvänd till <0>start", + "detailsSummary": "Detaljer om felet", + "errorMessageLabel": "Felmeddelande:", + "stackTraceLabel": "Stackspårning:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Drivs av <0>▲ Vercel | Meshtastic® är ett registrerat varumärke som tillhör Meshtastic LLC. | <1>Juridisk information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/tr-TR/channels.json b/packages/web/public/i18n/locales/tr-TR/channels.json index 74fe0384..d30f2932 100644 --- a/packages/web/public/i18n/locales/tr-TR/channels.json +++ b/packages/web/public/i18n/locales/tr-TR/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Kanallar", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "Birincil", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Kanal Ayarları", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Rol", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "İsmi", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Location", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "Kanallar", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "Birincil", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Kanal Ayarları", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Rol", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "İsmi", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Location", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/commandPalette.json b/packages/web/public/i18n/locales/tr-TR/commandPalette.json index cc73c62a..a958e966 100644 --- a/packages/web/public/i18n/locales/tr-TR/commandPalette.json +++ b/packages/web/public/i18n/locales/tr-TR/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Mesajlar", - "map": "Harita", - "config": "Config", - "channels": "Kanallar", - "nodes": "Nodes" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "İçeri aktar", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Hata Ayıklama", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Mesajlar", + "map": "Harita", + "config": "Config", + "channels": "Kanallar", + "nodes": "Nodes" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "İçeri aktar", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Hata Ayıklama", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/common.json b/packages/web/public/i18n/locales/tr-TR/common.json index 3fab7218..d2100bc0 100644 --- a/packages/web/public/i18n/locales/tr-TR/common.json +++ b/packages/web/public/i18n/locales/tr-TR/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Uygula", - "backupKey": "Backup Key", - "cancel": "İptal", - "clearMessages": "Clear Messages", - "close": "Kapat", - "confirm": "Confirm", - "delete": "Sil", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "İçeri aktar", - "message": "Mesaj", - "now": "Now", - "ok": "Tamam", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Kaldır", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Sıfırla", - "save": "Kaydet", - "scanQr": "QR Kodu Tara", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "Hour", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Uygula", + "backupKey": "Backup Key", + "cancel": "İptal", + "clearMessages": "Clear Messages", + "close": "Kapat", + "confirm": "Confirm", + "delete": "Sil", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "İçeri aktar", + "message": "Mesaj", + "now": "Now", + "ok": "Tamam", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Kaldır", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Sıfırla", + "save": "Kaydet", + "scanQr": "QR Kodu Tara", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "Hour", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/dashboard.json b/packages/web/public/i18n/locales/tr-TR/dashboard.json index 003f8732..1546e00d 100644 --- a/packages/web/public/i18n/locales/tr-TR/dashboard.json +++ b/packages/web/public/i18n/locales/tr-TR/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Seri", - "connectionType_network": "Ağ", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Seri", + "connectionType_network": "Ağ", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/tr-TR/deviceConfig.json b/packages/web/public/i18n/locales/tr-TR/deviceConfig.json index 2f21752b..b3ce988e 100644 --- a/packages/web/public/i18n/locales/tr-TR/deviceConfig.json +++ b/packages/web/public/i18n/locales/tr-TR/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "Bluetooth", - "tabDevice": "Cihaz", - "tabDisplay": "Ekran", - "tabLora": "LoRa", - "tabNetwork": "Ağ", - "tabPosition": "Konum", - "tabPower": "Güç", - "tabSecurity": "Güvenlik" - }, - "sidebar": { - "label": "Modüller" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Zaman Dilimi" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Rol" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "Enabled" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Eşleştirme Modu" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bant genişliği" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "MQTT'yi Yoksay" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "MQTT'ye Tamam" - }, - "overrideDutyCycle": { - "description": "Görev Döngüsünü Geçersiz Kıl", - "label": "Görev Döngüsünü Geçersiz Kıl" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Bölge" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Ağ geçidi" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "Alt ağ" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP Ayarları" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Zaman Damgası", - "unset": "Ayarlanmamış", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Güç tasarrufu modunu etkinleştir" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Güç Ayarı" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Özel Anahtar" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Genel Anahtar" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "Bluetooth", + "tabDevice": "Cihaz", + "tabDisplay": "Ekran", + "tabLora": "LoRa", + "tabNetwork": "Ağ", + "tabPosition": "Konum", + "tabPower": "Güç", + "tabSecurity": "Güvenlik" + }, + "sidebar": { + "label": "Modüller" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Zaman Dilimi" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Rol" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "Enabled" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Eşleştirme Modu" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bant genişliği" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "MQTT'yi Yoksay" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "MQTT'ye Tamam" + }, + "overrideDutyCycle": { + "description": "Görev Döngüsünü Geçersiz Kıl", + "label": "Görev Döngüsünü Geçersiz Kıl" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Bölge" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Ağ geçidi" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "Alt ağ" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP Ayarları" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Zaman Damgası", + "unset": "Ayarlanmamış", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Güç tasarrufu modunu etkinleştir" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Güç Ayarı" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Özel Anahtar" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Genel Anahtar" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/dialog.json b/packages/web/public/i18n/locales/tr-TR/dialog.json index 1ba90500..edcbcb4b 100644 --- a/packages/web/public/i18n/locales/tr-TR/dialog.json +++ b/packages/web/public/i18n/locales/tr-TR/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Long Name", - "shortName": "Short Name", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Seri", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "Bağlan", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Mesaj", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Voltaj", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Generate QR Code" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Emin misiniz?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "Emin misiniz?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Long Name", + "shortName": "Short Name", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Seri", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "Bağlan", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Mesaj", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Voltaj", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Generate QR Code" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Emin misiniz?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "Emin misiniz?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/tr-TR/messages.json b/packages/web/public/i18n/locales/tr-TR/messages.json index 7bdb2d22..fa7d1657 100644 --- a/packages/web/public/i18n/locales/tr-TR/messages.json +++ b/packages/web/public/i18n/locales/tr-TR/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "Gönder" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "Reply" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "Gönder" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "Reply" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/moduleConfig.json b/packages/web/public/i18n/locales/tr-TR/moduleConfig.json index 3ba00a84..e1ac9f72 100644 --- a/packages/web/public/i18n/locales/tr-TR/moduleConfig.json +++ b/packages/web/public/i18n/locales/tr-TR/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ortam Işıklandırması", - "tabAudio": "Ses", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Algılama Sensörü", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Komşu Bilgisi", - "tabPaxcounter": "Pax sayacı", - "tabRangeTest": "Mesafe Testi", - "tabSerial": "Seri", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Telemetri" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Akım", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Kırmızı", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Yeşil", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Mavi", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Ana konu", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Zaman Aşımı", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Kayıt sayısı", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "Geçmiş geri dönüş maksimum", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "Geçmiş geri dönüş penceresi", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Cihaz metrikleri güncelleme aralığı (saniye)" - }, - "environmentUpdateInterval": { - "label": "Çevre metrikleri güncelleme aralığı (saniye)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ortam Işıklandırması", + "tabAudio": "Ses", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Algılama Sensörü", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Komşu Bilgisi", + "tabPaxcounter": "Pax sayacı", + "tabRangeTest": "Mesafe Testi", + "tabSerial": "Seri", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Telemetri" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Akım", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Kırmızı", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Yeşil", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Mavi", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Ana konu", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Zaman Aşımı", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Kayıt sayısı", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "Geçmiş geri dönüş maksimum", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "Geçmiş geri dönüş penceresi", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Cihaz metrikleri güncelleme aralığı (saniye)" + }, + "environmentUpdateInterval": { + "label": "Çevre metrikleri güncelleme aralığı (saniye)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/tr-TR/nodes.json b/packages/web/public/i18n/locales/tr-TR/nodes.json index 04a314a1..812dbf81 100644 --- a/packages/web/public/i18n/locales/tr-TR/nodes.json +++ b/packages/web/public/i18n/locales/tr-TR/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favori", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Hata", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Long Name", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "Model", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "Doğrudan", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "Ignore Node", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favori", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Hata", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Long Name", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "Model", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "Doğrudan", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "Ignore Node", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/tr-TR/ui.json b/packages/web/public/i18n/locales/tr-TR/ui.json index efbdbfb6..f93a86f5 100644 --- a/packages/web/public/i18n/locales/tr-TR/ui.json +++ b/packages/web/public/i18n/locales/tr-TR/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Mesajlar", - "map": "Harita", - "config": "Config", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "Kanallar", - "nodes": "Nodes" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "Yazılım", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Pil" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Şifreyi gizle" - }, - "showPassword": { - "label": "Şifreyi göster" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "Waiting", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Donanım" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "Rol" - }, - "filter": { - "label": "Filtre" - }, - "advanced": { - "label": "Advanced" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Voltaj" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Doğrudan", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Son duyulma", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Dil", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "Koyu", - "light": "Açık", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "Mesajlar", + "map": "Harita", + "config": "Config", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "Kanallar", + "nodes": "Nodes" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "Yazılım", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Pil" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Şifreyi gizle" + }, + "showPassword": { + "label": "Şifreyi göster" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "Waiting", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Donanım" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "Rol" + }, + "filter": { + "label": "Filtre" + }, + "advanced": { + "label": "Advanced" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Voltaj" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Doğrudan", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Son duyulma", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Dil", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "Koyu", + "light": "Açık", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/uk-UA/channels.json b/packages/web/public/i18n/locales/uk-UA/channels.json index 8eabfa03..3e871201 100644 --- a/packages/web/public/i18n/locales/uk-UA/channels.json +++ b/packages/web/public/i18n/locales/uk-UA/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "Канали", - "channelName": "Канал: {{channelName}}", - "broadcastLabel": "Основний", - "channelIndex": "Кн {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "Channel Settings", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "Роль", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Згенерувати" - }, - "name": { - "label": "Ім'я", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "Uplink Enabled", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "Downlink Enabled", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "Місце розташування", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Не повідомляти місце знаходження", - "precise": "Точне місце розташування", - "metric_km23": "У межах 23 км", - "metric_km12": "У межах 12 км", - "metric_km5_8": "У межах 5,8 км", - "metric_km2_9": "У межах 2,9 км", - "metric_km1_5": "У межах 1,5 км", - "metric_m700": "У межах 700 м", - "metric_m350": "У межах 350 м", - "metric_m200": "У межах 200 м", - "metric_m90": "У межах 90 м", - "metric_m50": "У межах 50 м", - "imperial_mi15": "У межах 15 миль", - "imperial_mi7_3": "У межах 7,3 милі", - "imperial_mi3_6": "У межах 3,6 милі", - "imperial_mi1_8": "У межах 1,8 милі", - "imperial_mi0_9": "У межах 0,9 милі", - "imperial_mi0_5": "У межах 0,5 милі", - "imperial_mi0_2": "У межах 0,2 милі", - "imperial_ft600": "У межах 600 фт", - "imperial_ft300": "У межах 300 фт", - "imperial_ft150": "У межах 150 фт" - } - } + "page": { + "sectionLabel": "Канали", + "channelName": "Канал: {{channelName}}", + "broadcastLabel": "Основний", + "channelIndex": "Кн {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "Channel Settings", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "Роль", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Згенерувати" + }, + "name": { + "label": "Ім'я", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "Uplink Enabled", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "Downlink Enabled", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "Місце розташування", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Не повідомляти місце знаходження", + "precise": "Точне місце розташування", + "metric_km23": "У межах 23 км", + "metric_km12": "У межах 12 км", + "metric_km5_8": "У межах 5,8 км", + "metric_km2_9": "У межах 2,9 км", + "metric_km1_5": "У межах 1,5 км", + "metric_m700": "У межах 700 м", + "metric_m350": "У межах 350 м", + "metric_m200": "У межах 200 м", + "metric_m90": "У межах 90 м", + "metric_m50": "У межах 50 м", + "imperial_mi15": "У межах 15 миль", + "imperial_mi7_3": "У межах 7,3 милі", + "imperial_mi3_6": "У межах 3,6 милі", + "imperial_mi1_8": "У межах 1,8 милі", + "imperial_mi0_9": "У межах 0,9 милі", + "imperial_mi0_5": "У межах 0,5 милі", + "imperial_mi0_2": "У межах 0,2 милі", + "imperial_ft600": "У межах 600 фт", + "imperial_ft300": "У межах 300 фт", + "imperial_ft150": "У межах 150 фт" + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/commandPalette.json b/packages/web/public/i18n/locales/uk-UA/commandPalette.json index c04c4fa5..296be301 100644 --- a/packages/web/public/i18n/locales/uk-UA/commandPalette.json +++ b/packages/web/public/i18n/locales/uk-UA/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "Повідомлення", - "map": "Мапа", - "config": "Config", - "channels": "Канали", - "nodes": "Вузли" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR-код", - "qrGenerator": "Генератор", - "qrImport": "Import", - "scheduleShutdown": "Розклад вимкнення", - "scheduleReboot": "Розклад перезавантаження", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "Debug", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "Повідомлення", + "map": "Мапа", + "config": "Config", + "channels": "Канали", + "nodes": "Вузли" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR-код", + "qrGenerator": "Генератор", + "qrImport": "Import", + "scheduleShutdown": "Розклад вимкнення", + "scheduleReboot": "Розклад перезавантаження", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "Debug", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/common.json b/packages/web/public/i18n/locales/uk-UA/common.json index 02667ac1..5ca17b84 100644 --- a/packages/web/public/i18n/locales/uk-UA/common.json +++ b/packages/web/public/i18n/locales/uk-UA/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "Застосувати", - "backupKey": "Backup Key", - "cancel": "Скасувати", - "clearMessages": "Clear Messages", - "close": "Закрити", - "confirm": "Confirm", - "delete": "Видалити", - "dismiss": "Dismiss", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "Import", - "message": "Повідомлення", - "now": "Now", - "ok": "Гаразд", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "Видалити", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "Скинути", - "save": "Зберегти", - "scanQr": "Scan QR Code", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Завантаження...", - "unit": { - "cps": "CPS", - "dbm": "дБм", - "hertz": "Гц", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "МГц", - "raw": "raw", - "meter": { - "one": "Метр", - "plural": "Meters", - "suffix": "м" - }, - "minute": { - "one": "Minute", - "plural": "Хвилин" - }, - "hour": { - "one": "Година", - "plural": "Годин" - }, - "millisecond": { - "one": "Мілісекунда", - "plural": "Мілісекунди", - "suffix": "мс" - }, - "second": { - "one": "Секунда", - "plural": "Секунд" - }, - "day": { - "one": "День", - "plural": "Днів" - }, - "month": { - "one": "Місяць", - "plural": "Місяців" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Вольт", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "Empty", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "Unknown", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Невірний формат, потрібна IPv4-адреса.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Ключ повинен бути пустим.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "Це поле є обов'язковим.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "Застосувати", + "backupKey": "Backup Key", + "cancel": "Скасувати", + "clearMessages": "Clear Messages", + "close": "Закрити", + "confirm": "Confirm", + "delete": "Видалити", + "dismiss": "Dismiss", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "Import", + "message": "Повідомлення", + "now": "Now", + "ok": "Гаразд", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "Видалити", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "Скинути", + "save": "Зберегти", + "scanQr": "Scan QR Code", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Завантаження...", + "unit": { + "cps": "CPS", + "dbm": "дБм", + "hertz": "Гц", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "МГц", + "raw": "raw", + "meter": { + "one": "Метр", + "plural": "Meters", + "suffix": "м" + }, + "minute": { + "one": "Minute", + "plural": "Хвилин" + }, + "hour": { + "one": "Година", + "plural": "Годин" + }, + "millisecond": { + "one": "Мілісекунда", + "plural": "Мілісекунди", + "suffix": "мс" + }, + "second": { + "one": "Секунда", + "plural": "Секунд" + }, + "day": { + "one": "День", + "plural": "Днів" + }, + "month": { + "one": "Місяць", + "plural": "Місяців" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Вольт", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "Empty", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "Unknown", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Невірний формат, потрібна IPv4-адреса.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Ключ повинен бути пустим.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "Це поле є обов'язковим.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/dashboard.json b/packages/web/public/i18n/locales/uk-UA/dashboard.json index 4fad3e69..f356d31b 100644 --- a/packages/web/public/i18n/locales/uk-UA/dashboard.json +++ b/packages/web/public/i18n/locales/uk-UA/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "Серійний порт", - "connectionType_network": "Мережа", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "Серійний порт", + "connectionType_network": "Мережа", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/uk-UA/deviceConfig.json b/packages/web/public/i18n/locales/uk-UA/deviceConfig.json index 0de85c36..cea5ac50 100644 --- a/packages/web/public/i18n/locales/uk-UA/deviceConfig.json +++ b/packages/web/public/i18n/locales/uk-UA/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Налаштування", - "tabBluetooth": "Bluetooth", - "tabDevice": "Пристрій", - "tabDisplay": "Дисплей", - "tabLora": "LoRa", - "tabNetwork": "Мережа", - "tabPosition": "Position", - "tabPower": "Живлення", - "tabSecurity": "Безпека" - }, - "sidebar": { - "label": "Модулі" - }, - "device": { - "title": "Налаштування пристрою", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX Timezone" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "Rebroadcast Mode" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "Role" - } - }, - "bluetooth": { - "title": "Налаштування Bluetooth", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Увімкнути або вимкнути Bluetooth", - "label": "Увімкнено" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "Pairing mode" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "Display Mode" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "Display Units" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED Type" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "Bandwidth" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "Coding Rate" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "Ігнорувати MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "Modem Preset" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "OK to MQTT" - }, - "overrideDutyCycle": { - "description": "Override Duty Cycle", - "label": "Override Duty Cycle" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "Регіон" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "Transmit Enabled" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "Use Preset" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "Налаштування WiFi", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS-сервер", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "Enabled" - }, - "gateway": { - "description": "Default Gateway", - "label": "Шлюз" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Маска підмережі", - "label": "Підмережа" - }, - "wifiEnabled": { - "description": "Увімкнути або вимкнути WiFi радіо", - "label": "Enabled" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP-сервер" - }, - "rsyslogServer": { - "label": "Rsyslog-сервер" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "Налаштування NTP", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Налаштування Rsyslog" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "Налаштування UDP" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "Broadcast Interval" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Висота", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "Timestamp", - "unset": "Скинути", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "Enable power saving mode" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "Налаштування живлення" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Налаштування режиму сну" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Налаштування безпеки", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "Private Key" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "Public Key" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "Primary Admin Key" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "Secondary Admin Key" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "Tertiary Admin Key" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Налаштування", + "tabBluetooth": "Bluetooth", + "tabDevice": "Пристрій", + "tabDisplay": "Дисплей", + "tabLora": "LoRa", + "tabNetwork": "Мережа", + "tabPosition": "Position", + "tabPower": "Живлення", + "tabSecurity": "Безпека" + }, + "sidebar": { + "label": "Модулі" + }, + "device": { + "title": "Налаштування пристрою", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX Timezone" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "Rebroadcast Mode" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "Role" + } + }, + "bluetooth": { + "title": "Налаштування Bluetooth", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Увімкнути або вимкнути Bluetooth", + "label": "Увімкнено" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "Pairing mode" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "Display Mode" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "Display Units" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED Type" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "Bandwidth" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "Coding Rate" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "Ігнорувати MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "Modem Preset" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "OK to MQTT" + }, + "overrideDutyCycle": { + "description": "Override Duty Cycle", + "label": "Override Duty Cycle" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "Регіон" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "Transmit Enabled" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "Use Preset" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "Налаштування WiFi", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS-сервер", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "Enabled" + }, + "gateway": { + "description": "Default Gateway", + "label": "Шлюз" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Маска підмережі", + "label": "Підмережа" + }, + "wifiEnabled": { + "description": "Увімкнути або вимкнути WiFi радіо", + "label": "Enabled" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP-сервер" + }, + "rsyslogServer": { + "label": "Rsyslog-сервер" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "Налаштування NTP", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Налаштування Rsyslog" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "Налаштування UDP" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "Broadcast Interval" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Висота", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "Timestamp", + "unset": "Скинути", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "Enable power saving mode" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "Налаштування живлення" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Налаштування режиму сну" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Налаштування безпеки", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "Private Key" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "Public Key" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "Primary Admin Key" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "Secondary Admin Key" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "Tertiary Admin Key" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/dialog.json b/packages/web/public/i18n/locales/uk-UA/dialog.json index 20bdd125..e662a301 100644 --- a/packages/web/public/i18n/locales/uk-UA/dialog.json +++ b/packages/web/public/i18n/locales/uk-UA/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Очистити всі повідомлення" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "Довга назва", - "shortName": "Коротка назва", - "title": "Змінити назву пристрою" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Канал: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Канали:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Висота: ", - "coordinates": "Координати: ", - "title": "Розташування: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Перегенерувати" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "Bluetooth", - "tabSerial": "Serial", - "useHttps": "Використовувати HTTPS", - "connecting": "Підключення...", - "connect": "Connect", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "Новий пристрій" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "Повідомлення", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "Voltage", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "Згенерувати QR-код" - }, - "rebootOta": { - "title": "Запланувати перезавантаження", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Введіть затримку (сек)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Запланувати перезавантаження", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "Ви впевнені?" - }, - "managedMode": { - "confirmUnderstanding": "Я знаю, що роблю", - "title": "Ви впевнені?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Очистити всі повідомлення" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "Довга назва", + "shortName": "Коротка назва", + "title": "Змінити назву пристрою" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Канал: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Канали:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Висота: ", + "coordinates": "Координати: ", + "title": "Розташування: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Перегенерувати" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "Bluetooth", + "tabSerial": "Serial", + "useHttps": "Використовувати HTTPS", + "connecting": "Підключення...", + "connect": "Connect", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "Новий пристрій" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "Повідомлення", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "Voltage", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "Згенерувати QR-код" + }, + "rebootOta": { + "title": "Запланувати перезавантаження", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Введіть затримку (сек)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Запланувати перезавантаження", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "Ви впевнені?" + }, + "managedMode": { + "confirmUnderstanding": "Я знаю, що роблю", + "title": "Ви впевнені?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/uk-UA/messages.json b/packages/web/public/i18n/locales/uk-UA/messages.json index 0500adb8..57301fe4 100644 --- a/packages/web/public/i18n/locales/uk-UA/messages.json +++ b/packages/web/public/i18n/locales/uk-UA/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Повідомлення: {{chatName}}", - "placeholder": "Введіть повідомлення" - }, - "emptyState": { - "title": "Оберіть чат", - "text": "Поки немає повідомлень." - }, - "selectChatPrompt": { - "text": "Виберіть канал або вузол для початку обміну повідомленнями." - }, - "sendMessage": { - "placeholder": "Введіть ваше повідомлення тут...", - "sendButton": "Надіслати" - }, - "actionsMenu": { - "addReactionLabel": "Додати реакцію", - "replyLabel": "Відповісти" - }, - "deliveryStatus": { - "delivered": { - "label": "Повідомлення доставлено", - "displayText": "Повідомлення доставлено" - }, - "failed": { - "label": "Помилка доставлення повідомлення", - "displayText": "Надсилання не відбулося" - }, - "unknown": { - "label": "Статус повідомлення невідомий", - "displayText": "Невідомий стан" - }, - "waiting": { - "label": "Надсилання повідомлення", - "displayText": "Очікування доставки" - } - } + "page": { + "title": "Повідомлення: {{chatName}}", + "placeholder": "Введіть повідомлення" + }, + "emptyState": { + "title": "Оберіть чат", + "text": "Поки немає повідомлень." + }, + "selectChatPrompt": { + "text": "Виберіть канал або вузол для початку обміну повідомленнями." + }, + "sendMessage": { + "placeholder": "Введіть ваше повідомлення тут...", + "sendButton": "Надіслати" + }, + "actionsMenu": { + "addReactionLabel": "Додати реакцію", + "replyLabel": "Відповісти" + }, + "deliveryStatus": { + "delivered": { + "label": "Повідомлення доставлено", + "displayText": "Повідомлення доставлено" + }, + "failed": { + "label": "Помилка доставлення повідомлення", + "displayText": "Надсилання не відбулося" + }, + "unknown": { + "label": "Статус повідомлення невідомий", + "displayText": "Невідомий стан" + }, + "waiting": { + "label": "Надсилання повідомлення", + "displayText": "Очікування доставки" + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/moduleConfig.json b/packages/web/public/i18n/locales/uk-UA/moduleConfig.json index 89074e3d..56714297 100644 --- a/packages/web/public/i18n/locales/uk-UA/moduleConfig.json +++ b/packages/web/public/i18n/locales/uk-UA/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "Ambient Lighting", - "tabAudio": "Аудіо", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "Detection Sensor", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "Neighbor Info", - "tabPaxcounter": "Paxcounter", - "tabRangeTest": "Тест дальності", - "tabSerial": "Serial", - "tabStoreAndForward": "S&F", - "tabTelemetry": "Телеметрія" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED State", - "description": "Sets LED to on or off" - }, - "current": { - "label": "Current", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "Червоний", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "Зелений", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "Синій", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "Send Bell", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "Send Bell", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "Налаштування MQTT", - "description": "Settings for the MQTT module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "Ім'я користувача MQTT", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "Пароль MQTT", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "Encryption Enabled", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "JSON Enabled", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "TLS Enabled", - "description": "Enable or disable TLS" - }, - "root": { - "label": "Root topic", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "Enabled", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "Echo", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "Timeout", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "Mode", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "Number of records", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "History return max", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "History return window", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "Device Metrics", - "description": "Device metrics update interval (seconds)" - }, - "environmentUpdateInterval": { - "label": "Environment metrics update interval (seconds)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "Display Fahrenheit", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "Ambient Lighting", + "tabAudio": "Аудіо", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "Detection Sensor", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "Neighbor Info", + "tabPaxcounter": "Paxcounter", + "tabRangeTest": "Тест дальності", + "tabSerial": "Serial", + "tabStoreAndForward": "S&F", + "tabTelemetry": "Телеметрія" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED State", + "description": "Sets LED to on or off" + }, + "current": { + "label": "Current", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "Червоний", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "Зелений", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "Синій", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "Send Bell", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "Send Bell", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "Налаштування MQTT", + "description": "Settings for the MQTT module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "Ім'я користувача MQTT", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "Пароль MQTT", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "Encryption Enabled", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "JSON Enabled", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "TLS Enabled", + "description": "Enable or disable TLS" + }, + "root": { + "label": "Root topic", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "Enabled", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "Echo", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "Timeout", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "Mode", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "Number of records", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "History return max", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "History return window", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "Device Metrics", + "description": "Device metrics update interval (seconds)" + }, + "environmentUpdateInterval": { + "label": "Environment metrics update interval (seconds)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "Display Fahrenheit", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/uk-UA/nodes.json b/packages/web/public/i18n/locales/uk-UA/nodes.json index f0ca01bc..d690219e 100644 --- a/packages/web/public/i18n/locales/uk-UA/nodes.json +++ b/packages/web/public/i18n/locales/uk-UA/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "Favorite", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "Помилка", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "Heard", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "Довга назва", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Шифрування", - "model": "Model", - "macAddress": "MAC-адреса" - }, - "connectionStatus": { - "direct": "Direct", - "away": "away", - "unknown": "-", - "viaMqtt": ", через MQTT" - }, - "lastHeardStatus": { - "never": "Ніколи" - } - }, - "actions": { - "added": "Додано", - "removed": "Видалено", - "ignoreNode": "Ігнорувати вузол", - "unignoreNode": "Unignore Node", - "requestPosition": "Запитати позицію" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "Favorite", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "Помилка", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "Heard", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "Довга назва", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Шифрування", + "model": "Model", + "macAddress": "MAC-адреса" + }, + "connectionStatus": { + "direct": "Direct", + "away": "away", + "unknown": "-", + "viaMqtt": ", через MQTT" + }, + "lastHeardStatus": { + "never": "Ніколи" + } + }, + "actions": { + "added": "Додано", + "removed": "Видалено", + "ignoreNode": "Ігнорувати вузол", + "unignoreNode": "Unignore Node", + "requestPosition": "Запитати позицію" + } } diff --git a/packages/web/public/i18n/locales/uk-UA/ui.json b/packages/web/public/i18n/locales/uk-UA/ui.json index 92c8b4b3..a876bd8a 100644 --- a/packages/web/public/i18n/locales/uk-UA/ui.json +++ b/packages/web/public/i18n/locales/uk-UA/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Навігація", - "messages": "Повідомлення", - "map": "Мапа", - "config": "Config", - "radioConfig": "Налаштування радіо", - "moduleConfig": "Module Config", - "channels": "Канали", - "nodes": "Вузли" - }, - "app": { - "title": "Meshtastic", - "logo": "Логотип Meshtastic" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Відкрити бічну панель", - "close": "Закрити бічну панель" - } - }, - "deviceInfo": { - "volts": "{{voltage}} Вольт", - "firmware": { - "title": "Прошивка", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "Батарея" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Додано", - "removed": "Видалено", - "to": "до", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Додано", - "removed": "Видалено", - "to": "до", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Скопійовано!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "Hide password" - }, - "showPassword": { - "label": "Show password" - }, - "deliveryStatus": { - "delivered": "Доставлено", - "failed": "Delivery Failed", - "waiting": "Очікування", - "unknown": "Unknown" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Hardware" - }, - "metrics": { - "label": "Метрики" - }, - "role": { - "label": "Role" - }, - "filter": { - "label": "Фільтри" - }, - "advanced": { - "label": "Розширені" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Напруга" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "Direct", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "Last heard", - "labelText": "Last heard: {{value}}", - "nowLabel": "Зараз" - }, - "snr": { - "label": "SNR (дБ)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Сховати" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "Мова", - "changeLanguage": "Змінити мову" - }, - "theme": { - "dark": "Темна", - "light": "Світла", - "system": "Automatic", - "changeTheme": "Змінити схему кольорів" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Інформація про помилку", - "errorMessageLabel": "Помилка:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Навігація", + "messages": "Повідомлення", + "map": "Мапа", + "config": "Config", + "radioConfig": "Налаштування радіо", + "moduleConfig": "Module Config", + "channels": "Канали", + "nodes": "Вузли" + }, + "app": { + "title": "Meshtastic", + "logo": "Логотип Meshtastic" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Відкрити бічну панель", + "close": "Закрити бічну панель" + } + }, + "deviceInfo": { + "volts": "{{voltage}} Вольт", + "firmware": { + "title": "Прошивка", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "Батарея" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Додано", + "removed": "Видалено", + "to": "до", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Додано", + "removed": "Видалено", + "to": "до", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Скопійовано!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "Hide password" + }, + "showPassword": { + "label": "Show password" + }, + "deliveryStatus": { + "delivered": "Доставлено", + "failed": "Delivery Failed", + "waiting": "Очікування", + "unknown": "Unknown" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Hardware" + }, + "metrics": { + "label": "Метрики" + }, + "role": { + "label": "Role" + }, + "filter": { + "label": "Фільтри" + }, + "advanced": { + "label": "Розширені" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "Напруга" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "Direct", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "Last heard", + "labelText": "Last heard: {{value}}", + "nowLabel": "Зараз" + }, + "snr": { + "label": "SNR (дБ)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Сховати" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "Мова", + "changeLanguage": "Змінити мову" + }, + "theme": { + "dark": "Темна", + "light": "Світла", + "system": "Automatic", + "changeTheme": "Змінити схему кольорів" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Інформація про помилку", + "errorMessageLabel": "Помилка:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/i18n/locales/zh-CN/channels.json b/packages/web/public/i18n/locales/zh-CN/channels.json index 3ad45930..c1ba3ed5 100644 --- a/packages/web/public/i18n/locales/zh-CN/channels.json +++ b/packages/web/public/i18n/locales/zh-CN/channels.json @@ -1,69 +1,69 @@ { - "page": { - "sectionLabel": "频道", - "channelName": "Channel: {{channelName}}", - "broadcastLabel": "主要", - "channelIndex": "Ch {{index}}" - }, - "validation": { - "pskInvalid": "Please enter a valid {{bits}} bit PSK." - }, - "settings": { - "label": "频道设置", - "description": "Crypto, MQTT & misc settings" - }, - "role": { - "label": "角色", - "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", - "options": { - "primary": "PRIMARY", - "disabled": "DISABLED", - "secondary": "SECONDARY" - } - }, - "psk": { - "label": "Pre-Shared Key", - "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", - "generate": "Generate" - }, - "name": { - "label": "名称", - "description": "A unique name for the channel <12 bytes, leave blank for default" - }, - "uplinkEnabled": { - "label": "启用上传", - "description": "Send messages from the local mesh to MQTT" - }, - "downlinkEnabled": { - "label": "启用下载", - "description": "Send messages from MQTT to the local mesh" - }, - "positionPrecision": { - "label": "位置", - "description": "The precision of the location to share with the channel. Can be disabled.", - "options": { - "none": "Do not share location", - "precise": "Precise Location", - "metric_km23": "Within 23 kilometers", - "metric_km12": "Within 12 kilometers", - "metric_km5_8": "Within 5.8 kilometers", - "metric_km2_9": "Within 2.9 kilometers", - "metric_km1_5": "Within 1.5 kilometers", - "metric_m700": "Within 700 meters", - "metric_m350": "Within 350 meters", - "metric_m200": "Within 200 meters", - "metric_m90": "Within 90 meters", - "metric_m50": "Within 50 meters", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } + "page": { + "sectionLabel": "频道", + "channelName": "Channel: {{channelName}}", + "broadcastLabel": "主要", + "channelIndex": "Ch {{index}}" + }, + "validation": { + "pskInvalid": "Please enter a valid {{bits}} bit PSK." + }, + "settings": { + "label": "频道设置", + "description": "Crypto, MQTT & misc settings" + }, + "role": { + "label": "角色", + "description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed", + "options": { + "primary": "PRIMARY", + "disabled": "DISABLED", + "secondary": "SECONDARY" + } + }, + "psk": { + "label": "Pre-Shared Key", + "description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)", + "generate": "Generate" + }, + "name": { + "label": "名称", + "description": "A unique name for the channel <12 bytes, leave blank for default" + }, + "uplinkEnabled": { + "label": "启用上传", + "description": "Send messages from the local mesh to MQTT" + }, + "downlinkEnabled": { + "label": "启用下载", + "description": "Send messages from MQTT to the local mesh" + }, + "positionPrecision": { + "label": "位置", + "description": "The precision of the location to share with the channel. Can be disabled.", + "options": { + "none": "Do not share location", + "precise": "Precise Location", + "metric_km23": "Within 23 kilometers", + "metric_km12": "Within 12 kilometers", + "metric_km5_8": "Within 5.8 kilometers", + "metric_km2_9": "Within 2.9 kilometers", + "metric_km1_5": "Within 1.5 kilometers", + "metric_m700": "Within 700 meters", + "metric_m350": "Within 350 meters", + "metric_m200": "Within 200 meters", + "metric_m90": "Within 90 meters", + "metric_m50": "Within 50 meters", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/commandPalette.json b/packages/web/public/i18n/locales/zh-CN/commandPalette.json index 685ec409..1dd5161c 100644 --- a/packages/web/public/i18n/locales/zh-CN/commandPalette.json +++ b/packages/web/public/i18n/locales/zh-CN/commandPalette.json @@ -1,50 +1,50 @@ { - "emptyState": "No results found.", - "page": { - "title": "Command Menu" - }, - "pinGroup": { - "label": "Pin command group" - }, - "unpinGroup": { - "label": "Unpin command group" - }, - "goto": { - "label": "Goto", - "command": { - "messages": "消息", - "map": "地图", - "config": "配置", - "channels": "频道", - "nodes": "节点" - } - }, - "manage": { - "label": "Manage", - "command": { - "switchNode": "Switch Node", - "connectNewNode": "Connect New Node" - } - }, - "contextual": { - "label": "Contextual", - "command": { - "qrCode": "QR Code", - "qrGenerator": "Generator", - "qrImport": "导入", - "scheduleShutdown": "Schedule Shutdown", - "scheduleReboot": "Schedule Reboot", - "rebootToOtaMode": "Reboot To OTA Mode", - "resetNodeDb": "Reset Node DB", - "factoryResetDevice": "Factory Reset Device", - "factoryResetConfig": "Factory Reset Config" - } - }, - "debug": { - "label": "调试", - "command": { - "reconfigure": "Reconfigure", - "clearAllStoredMessages": "Clear All Stored Message" - } - } + "emptyState": "No results found.", + "page": { + "title": "Command Menu" + }, + "pinGroup": { + "label": "Pin command group" + }, + "unpinGroup": { + "label": "Unpin command group" + }, + "goto": { + "label": "Goto", + "command": { + "messages": "消息", + "map": "地图", + "config": "配置", + "channels": "频道", + "nodes": "节点" + } + }, + "manage": { + "label": "Manage", + "command": { + "switchNode": "Switch Node", + "connectNewNode": "Connect New Node" + } + }, + "contextual": { + "label": "Contextual", + "command": { + "qrCode": "QR Code", + "qrGenerator": "Generator", + "qrImport": "导入", + "scheduleShutdown": "Schedule Shutdown", + "scheduleReboot": "Schedule Reboot", + "rebootToOtaMode": "Reboot To OTA Mode", + "resetNodeDb": "Reset Node DB", + "factoryResetDevice": "Factory Reset Device", + "factoryResetConfig": "Factory Reset Config" + } + }, + "debug": { + "label": "调试", + "command": { + "reconfigure": "Reconfigure", + "clearAllStoredMessages": "Clear All Stored Message" + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/common.json b/packages/web/public/i18n/locales/zh-CN/common.json index 0498cc54..35e41c5e 100644 --- a/packages/web/public/i18n/locales/zh-CN/common.json +++ b/packages/web/public/i18n/locales/zh-CN/common.json @@ -1,141 +1,141 @@ { - "button": { - "apply": "申请", - "backupKey": "Backup Key", - "cancel": "取消", - "clearMessages": "Clear Messages", - "close": "关闭", - "confirm": "Confirm", - "delete": "删除", - "dismiss": "收起键盘", - "download": "Download", - "export": "Export", - "generate": "Generate", - "regenerate": "Regenerate", - "import": "导入", - "message": "信息", - "now": "Now", - "ok": "好的", - "print": "Print", - "rebootOtaNow": "Reboot to OTA Mode Now", - "remove": "移除", - "requestNewKeys": "Request New Keys", - "requestPosition": "Request Position", - "reset": "重置", - "save": "保存", - "scanQr": "扫描二维码", - "traceRoute": "Trace Route", - "submit": "Submit" - }, - "app": { - "title": "Meshtastic", - "fullTitle": "Meshtastic Web Client" - }, - "loading": "Loading...", - "unit": { - "cps": "CPS", - "dbm": "dBm", - "hertz": "Hz", - "hop": { - "one": "Hop", - "plural": "Hops" - }, - "hopsAway": { - "one": "{{count}} hop away", - "plural": "{{count}} hops away", - "unknown": "Unknown hops away" - }, - "megahertz": "MHz", - "raw": "raw", - "meter": { - "one": "Meter", - "plural": "Meters", - "suffix": "m" - }, - "minute": { - "one": "Minute", - "plural": "Minutes" - }, - "hour": { - "one": "小时", - "plural": "Hours" - }, - "millisecond": { - "one": "Millisecond", - "plural": "Milliseconds", - "suffix": "ms" - }, - "second": { - "one": "Second", - "plural": "Seconds" - }, - "day": { - "one": "Day", - "plural": "Days" - }, - "month": { - "one": "Month", - "plural": "Months" - }, - "year": { - "one": "Year", - "plural": "Years" - }, - "snr": "SNR", - "volt": { - "one": "Volt", - "plural": "Volts", - "suffix": "V" - }, - "record": { - "one": "Records", - "plural": "Records" - } - }, - "security": { - "0bit": "空", - "8bit": "8 bit", - "128bit": "128 bit", - "256bit": "256 bit" - }, - "unknown": { - "longName": "未知", - "shortName": "UNK", - "notAvailable": "N/A", - "num": "??" - }, - "nodeUnknownPrefix": "!", - "unset": "UNSET", - "fallbackName": "Meshtastic {{last4}}", - "node": "Node", - "formValidation": { - "unsavedChanges": "Unsaved changes", - "tooBig": { - "string": "Too long, expected less than or equal to {{maximum}} characters.", - "number": "Too big, expected a number smaller than or equal to {{maximum}}.", - "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." - }, - "tooSmall": { - "string": "Too short, expected more than or equal to {{minimum}} characters.", - "number": "Too small, expected a number larger than or equal to {{minimum}}." - }, - "invalidFormat": { - "ipv4": "Invalid format, expected an IPv4 address.", - "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." - }, - "invalidType": { - "number": "Invalid type, expected a number." - }, - "pskLength": { - "0bit": "Key is required to be empty.", - "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", - "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", - "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." - }, - "required": { - "generic": "This field is required.", - "managed": "At least one admin key is requred if the node is managed.", - "key": "Key is required." - } - } + "button": { + "apply": "申请", + "backupKey": "Backup Key", + "cancel": "取消", + "clearMessages": "Clear Messages", + "close": "关闭", + "confirm": "Confirm", + "delete": "删除", + "dismiss": "收起键盘", + "download": "Download", + "export": "Export", + "generate": "Generate", + "regenerate": "Regenerate", + "import": "导入", + "message": "信息", + "now": "Now", + "ok": "好的", + "print": "Print", + "rebootOtaNow": "Reboot to OTA Mode Now", + "remove": "移除", + "requestNewKeys": "Request New Keys", + "requestPosition": "Request Position", + "reset": "重置", + "save": "保存", + "scanQr": "扫描二维码", + "traceRoute": "Trace Route", + "submit": "Submit" + }, + "app": { + "title": "Meshtastic", + "fullTitle": "Meshtastic Web Client" + }, + "loading": "Loading...", + "unit": { + "cps": "CPS", + "dbm": "dBm", + "hertz": "Hz", + "hop": { + "one": "Hop", + "plural": "Hops" + }, + "hopsAway": { + "one": "{{count}} hop away", + "plural": "{{count}} hops away", + "unknown": "Unknown hops away" + }, + "megahertz": "MHz", + "raw": "raw", + "meter": { + "one": "Meter", + "plural": "Meters", + "suffix": "m" + }, + "minute": { + "one": "Minute", + "plural": "Minutes" + }, + "hour": { + "one": "小时", + "plural": "Hours" + }, + "millisecond": { + "one": "Millisecond", + "plural": "Milliseconds", + "suffix": "ms" + }, + "second": { + "one": "Second", + "plural": "Seconds" + }, + "day": { + "one": "Day", + "plural": "Days" + }, + "month": { + "one": "Month", + "plural": "Months" + }, + "year": { + "one": "Year", + "plural": "Years" + }, + "snr": "SNR", + "volt": { + "one": "Volt", + "plural": "Volts", + "suffix": "V" + }, + "record": { + "one": "Records", + "plural": "Records" + } + }, + "security": { + "0bit": "空", + "8bit": "8 bit", + "128bit": "128 bit", + "256bit": "256 bit" + }, + "unknown": { + "longName": "未知", + "shortName": "UNK", + "notAvailable": "N/A", + "num": "??" + }, + "nodeUnknownPrefix": "!", + "unset": "UNSET", + "fallbackName": "Meshtastic {{last4}}", + "node": "Node", + "formValidation": { + "unsavedChanges": "Unsaved changes", + "tooBig": { + "string": "Too long, expected less than or equal to {{maximum}} characters.", + "number": "Too big, expected a number smaller than or equal to {{maximum}}.", + "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes." + }, + "tooSmall": { + "string": "Too short, expected more than or equal to {{minimum}} characters.", + "number": "Too small, expected a number larger than or equal to {{minimum}}." + }, + "invalidFormat": { + "ipv4": "Invalid format, expected an IPv4 address.", + "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)." + }, + "invalidType": { + "number": "Invalid type, expected a number." + }, + "pskLength": { + "0bit": "Key is required to be empty.", + "8bit": "Key is required to be an 8 bit pre-shared key (PSK).", + "128bit": "Key is required to be a 128 bit pre-shared key (PSK).", + "256bit": "Key is required to be a 256 bit pre-shared key (PSK)." + }, + "required": { + "generic": "This field is required.", + "managed": "At least one admin key is requred if the node is managed.", + "key": "Key is required." + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/dashboard.json b/packages/web/public/i18n/locales/zh-CN/dashboard.json index a7b78399..0dd5f46c 100644 --- a/packages/web/public/i18n/locales/zh-CN/dashboard.json +++ b/packages/web/public/i18n/locales/zh-CN/dashboard.json @@ -1,12 +1,12 @@ { - "dashboard": { - "title": "Connected Devices", - "description": "Manage your connected Meshtastic devices.", - "connectionType_ble": "BLE", - "connectionType_serial": "串口", - "connectionType_network": "网络", - "noDevicesTitle": "No devices connected", - "noDevicesDescription": "Connect a new device to get started.", - "button_newConnection": "New Connection" - } + "dashboard": { + "title": "Connected Devices", + "description": "Manage your connected Meshtastic devices.", + "connectionType_ble": "BLE", + "connectionType_serial": "串口", + "connectionType_network": "网络", + "noDevicesTitle": "No devices connected", + "noDevicesDescription": "Connect a new device to get started.", + "button_newConnection": "New Connection" + } } diff --git a/packages/web/public/i18n/locales/zh-CN/deviceConfig.json b/packages/web/public/i18n/locales/zh-CN/deviceConfig.json index 590aeb25..9924d5af 100644 --- a/packages/web/public/i18n/locales/zh-CN/deviceConfig.json +++ b/packages/web/public/i18n/locales/zh-CN/deviceConfig.json @@ -1,428 +1,428 @@ { - "page": { - "title": "Configuration", - "tabBluetooth": "蓝牙", - "tabDevice": "设备", - "tabDisplay": "显示", - "tabLora": "LoRa", - "tabNetwork": "网络", - "tabPosition": "定位", - "tabPower": "电源", - "tabSecurity": "安全" - }, - "sidebar": { - "label": "Modules" - }, - "device": { - "title": "Device Settings", - "description": "Settings for the device", - "buttonPin": { - "description": "Button pin override", - "label": "Button Pin" - }, - "buzzerPin": { - "description": "Buzzer pin override", - "label": "Buzzer Pin" - }, - "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" - }, - "doubleTapAsButtonPress": { - "description": "Treat double tap as button press", - "label": "Double Tap as Button Press" - }, - "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", - "label": "LED Heartbeat Disabled" - }, - "nodeInfoBroadcastInterval": { - "description": "How often to broadcast node info", - "label": "Node Info Broadcast Interval" - }, - "posixTimezone": { - "description": "The POSIX timezone string for the device", - "label": "POSIX 时区" - }, - "rebroadcastMode": { - "description": "How to handle rebroadcasting", - "label": "转播模式" - }, - "role": { - "description": "What role the device performs on the mesh", - "label": "角色" - } - }, - "bluetooth": { - "title": "Bluetooth Settings", - "description": "Settings for the Bluetooth module", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "enabled": { - "description": "Enable or disable Bluetooth", - "label": "启用" - }, - "pairingMode": { - "description": "Pin selection behaviour.", - "label": "配对模式" - }, - "pin": { - "description": "Pin to use when pairing", - "label": "Pin" - } - }, - "display": { - "description": "Settings for the device display", - "title": "Display Settings", - "headingBold": { - "description": "Bolden the heading text", - "label": "Bold Heading" - }, - "carouselDelay": { - "description": "How fast to cycle through windows", - "label": "Carousel Delay" - }, - "compassNorthTop": { - "description": "Fix north to the top of compass", - "label": "Compass North Top" - }, - "displayMode": { - "description": "Screen layout variant", - "label": "显示模式" - }, - "displayUnits": { - "description": "Display metric or imperial units", - "label": "显示单位" - }, - "flipScreen": { - "description": "Flip display 180 degrees", - "label": "Flip Screen" - }, - "gpsDisplayUnits": { - "description": "Coordinate display format", - "label": "GPS Display Units" - }, - "oledType": { - "description": "Type of OLED screen attached to the device", - "label": "OLED 类型" - }, - "screenTimeout": { - "description": "Turn off the display after this long", - "label": "Screen Timeout" - }, - "twelveHourClock": { - "description": "Use 12-hour clock format", - "label": "12-Hour Clock" - }, - "wakeOnTapOrMotion": { - "description": "Wake the device on tap or motion", - "label": "Wake on Tap or Motion" - } - }, - "lora": { - "title": "Mesh Settings", - "description": "Settings for the LoRa mesh", - "bandwidth": { - "description": "Channel bandwidth in MHz", - "label": "带宽" - }, - "boostedRxGain": { - "description": "Boosted RX gain", - "label": "Boosted RX Gain" - }, - "codingRate": { - "description": "The denominator of the coding rate", - "label": "编码率" - }, - "frequencyOffset": { - "description": "Frequency offset to correct for crystal calibration errors", - "label": "Frequency Offset" - }, - "frequencySlot": { - "description": "LoRa frequency channel number", - "label": "Frequency Slot" - }, - "hopLimit": { - "description": "Maximum number of hops", - "label": "Hop Limit" - }, - "ignoreMqtt": { - "description": "Don't forward MQTT messages over the mesh", - "label": "忽略 MQTT" - }, - "modemPreset": { - "description": "Modem preset to use", - "label": "调制解调器预设" - }, - "okToMqtt": { - "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", - "label": "使用MQTT" - }, - "overrideDutyCycle": { - "description": "覆盖占空比", - "label": "覆盖占空比" - }, - "overrideFrequency": { - "description": "Override frequency", - "label": "Override Frequency" - }, - "region": { - "description": "Sets the region for your node", - "label": "区域" - }, - "spreadingFactor": { - "description": "Indicates the number of chirps per symbol", - "label": "Spreading Factor" - }, - "transmitEnabled": { - "description": "Enable/Disable transmit (TX) from the LoRa radio", - "label": "启用传输" - }, - "transmitPower": { - "description": "Max transmit power", - "label": "Transmit Power" - }, - "usePreset": { - "description": "Use one of the predefined modem presets", - "label": "使用预设" - }, - "meshSettings": { - "description": "Settings for the LoRa mesh", - "label": "Mesh Settings" - }, - "waveformSettings": { - "description": "Settings for the LoRa waveform", - "label": "Waveform Settings" - }, - "radioSettings": { - "label": "Radio Settings", - "description": "Settings for the LoRa radio" - } - }, - "network": { - "title": "WiFi Config", - "description": "WiFi radio configuration", - "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", - "addressMode": { - "description": "Address assignment selection", - "label": "Address Mode" - }, - "dns": { - "description": "DNS Server", - "label": "DNS" - }, - "ethernetEnabled": { - "description": "Enable or disable the Ethernet port", - "label": "启用" - }, - "gateway": { - "description": "Default Gateway", - "label": "网关" - }, - "ip": { - "description": "IP Address", - "label": "IP" - }, - "psk": { - "description": "Network password", - "label": "共享密钥/PSK" - }, - "ssid": { - "description": "Network name", - "label": "SSID" - }, - "subnet": { - "description": "Subnet Mask", - "label": "子网" - }, - "wifiEnabled": { - "description": "Enable or disable the WiFi radio", - "label": "启用" - }, - "meshViaUdp": { - "label": "Mesh via UDP" - }, - "ntpServer": { - "label": "NTP Server" - }, - "rsyslogServer": { - "label": "Rsyslog Server" - }, - "ethernetConfigSettings": { - "description": "Ethernet port configuration", - "label": "Ethernet Config" - }, - "ipConfigSettings": { - "description": "IP configuration", - "label": "IP Config" - }, - "ntpConfigSettings": { - "description": "NTP configuration", - "label": "NTP Config" - }, - "rsyslogConfigSettings": { - "description": "Rsyslog configuration", - "label": "Rsyslog Config" - }, - "udpConfigSettings": { - "description": "UDP over Mesh configuration", - "label": "UDP 设置" - } - }, - "position": { - "title": "Position Settings", - "description": "Settings for the position module", - "broadcastInterval": { - "description": "How often your position is sent out over the mesh", - "label": "广播间隔" - }, - "enablePin": { - "description": "GPS module enable pin override", - "label": "Enable Pin" - }, - "fixedPosition": { - "description": "Don't report GPS position, but a manually-specified one", - "label": "Fixed Position" - }, - "gpsMode": { - "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", - "label": "GPS Mode" - }, - "gpsUpdateInterval": { - "description": "How often a GPS fix should be acquired", - "label": "GPS Update Interval" - }, - "positionFlags": { - "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", - "label": "Position Flags" - }, - "receivePin": { - "description": "GPS module RX pin override", - "label": "Receive Pin" - }, - "smartPositionEnabled": { - "description": "Only send position when there has been a meaningful change in location", - "label": "Enable Smart Position" - }, - "smartPositionMinDistance": { - "description": "Minimum distance (in meters) that must be traveled before a position update is sent", - "label": "Smart Position Minimum Distance" - }, - "smartPositionMinInterval": { - "description": "Minimum interval (in seconds) that must pass before a position update is sent", - "label": "Smart Position Minimum Interval" - }, - "transmitPin": { - "description": "GPS module TX pin override", - "label": "Transmit Pin" - }, - "intervalsSettings": { - "description": "How often to send position updates", - "label": "Intervals" - }, - "flags": { - "placeholder": "Select position flags...", - "altitude": "Altitude", - "altitudeGeoidalSeparation": "Altitude Geoidal Separation", - "altitudeMsl": "Altitude is Mean Sea Level", - "dop": "Dilution of precision (DOP) PDOP used by default", - "hdopVdop": "如果设置了 DOP,则使用 HDOP / VDOP 值而不是 PDOP", - "numSatellites": "Number of satellites", - "sequenceNumber": "Sequence number", - "timestamp": "时间戳", - "unset": "未设置", - "vehicleHeading": "Vehicle heading", - "vehicleSpeed": "Vehicle speed" - } - }, - "power": { - "adcMultiplierOverride": { - "description": "Used for tweaking battery voltage reading", - "label": "ADC Multiplier Override ratio" - }, - "ina219Address": { - "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" - }, - "lightSleepDuration": { - "description": "How long the device will be in light sleep for", - "label": "Light Sleep Duration" - }, - "minimumWakeTime": { - "description": "Minimum amount of time the device will stay awake for after receiving a packet", - "label": "Minimum Wake Time" - }, - "noConnectionBluetoothDisabled": { - "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" - }, - "powerSavingEnabled": { - "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", - "label": "启用节能模式" - }, - "shutdownOnBatteryDelay": { - "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", - "label": "Shutdown on battery delay" - }, - "superDeepSleepDuration": { - "description": "How long the device will be in super deep sleep for", - "label": "Super Deep Sleep Duration" - }, - "powerConfigSettings": { - "description": "Settings for the power module", - "label": "电源配置" - }, - "sleepSettings": { - "description": "Sleep settings for the power module", - "label": "Sleep Settings" - } - }, - "security": { - "description": "Settings for the Security configuration", - "title": "Security Settings", - "button_backupKey": "Backup Key", - "adminChannelEnabled": { - "description": "Allow incoming device control over the insecure legacy admin channel", - "label": "Allow Legacy Admin" - }, - "enableDebugLogApi": { - "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", - "label": "Enable Debug Log API" - }, - "managed": { - "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" - }, - "privateKey": { - "description": "Used to create a shared key with a remote device", - "label": "私钥" - }, - "publicKey": { - "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", - "label": "公钥" - }, - "primaryAdminKey": { - "description": "The primary public key authorized to send admin messages to this node", - "label": "一级管理员密钥" - }, - "secondaryAdminKey": { - "description": "The secondary public key authorized to send admin messages to this node", - "label": "二级管理员密钥" - }, - "serialOutputEnabled": { - "description": "Serial Console over the Stream API", - "label": "Serial Output Enabled" - }, - "tertiaryAdminKey": { - "description": "The tertiary public key authorized to send admin messages to this node", - "label": "三级管理员密钥" - }, - "adminSettings": { - "description": "Settings for Admin", - "label": "Admin Settings" - }, - "loggingSettings": { - "description": "Settings for Logging", - "label": "Logging Settings" - } - } + "page": { + "title": "Configuration", + "tabBluetooth": "蓝牙", + "tabDevice": "设备", + "tabDisplay": "显示", + "tabLora": "LoRa", + "tabNetwork": "网络", + "tabPosition": "定位", + "tabPower": "电源", + "tabSecurity": "安全" + }, + "sidebar": { + "label": "Modules" + }, + "device": { + "title": "Device Settings", + "description": "Settings for the device", + "buttonPin": { + "description": "Button pin override", + "label": "Button Pin" + }, + "buzzerPin": { + "description": "Buzzer pin override", + "label": "Buzzer Pin" + }, + "disableTripleClick": { + "description": "Disable triple click", + "label": "Disable Triple Click" + }, + "doubleTapAsButtonPress": { + "description": "Treat double tap as button press", + "label": "Double Tap as Button Press" + }, + "ledHeartbeatDisabled": { + "description": "Disable default blinking LED", + "label": "LED Heartbeat Disabled" + }, + "nodeInfoBroadcastInterval": { + "description": "How often to broadcast node info", + "label": "Node Info Broadcast Interval" + }, + "posixTimezone": { + "description": "The POSIX timezone string for the device", + "label": "POSIX 时区" + }, + "rebroadcastMode": { + "description": "How to handle rebroadcasting", + "label": "转播模式" + }, + "role": { + "description": "What role the device performs on the mesh", + "label": "角色" + } + }, + "bluetooth": { + "title": "Bluetooth Settings", + "description": "Settings for the Bluetooth module", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "enabled": { + "description": "Enable or disable Bluetooth", + "label": "启用" + }, + "pairingMode": { + "description": "Pin selection behaviour.", + "label": "配对模式" + }, + "pin": { + "description": "Pin to use when pairing", + "label": "Pin" + } + }, + "display": { + "description": "Settings for the device display", + "title": "Display Settings", + "headingBold": { + "description": "Bolden the heading text", + "label": "Bold Heading" + }, + "carouselDelay": { + "description": "How fast to cycle through windows", + "label": "Carousel Delay" + }, + "compassNorthTop": { + "description": "Fix north to the top of compass", + "label": "Compass North Top" + }, + "displayMode": { + "description": "Screen layout variant", + "label": "显示模式" + }, + "displayUnits": { + "description": "Display metric or imperial units", + "label": "显示单位" + }, + "flipScreen": { + "description": "Flip display 180 degrees", + "label": "Flip Screen" + }, + "gpsDisplayUnits": { + "description": "Coordinate display format", + "label": "GPS Display Units" + }, + "oledType": { + "description": "Type of OLED screen attached to the device", + "label": "OLED 类型" + }, + "screenTimeout": { + "description": "Turn off the display after this long", + "label": "Screen Timeout" + }, + "twelveHourClock": { + "description": "Use 12-hour clock format", + "label": "12-Hour Clock" + }, + "wakeOnTapOrMotion": { + "description": "Wake the device on tap or motion", + "label": "Wake on Tap or Motion" + } + }, + "lora": { + "title": "Mesh Settings", + "description": "Settings for the LoRa mesh", + "bandwidth": { + "description": "Channel bandwidth in MHz", + "label": "带宽" + }, + "boostedRxGain": { + "description": "Boosted RX gain", + "label": "Boosted RX Gain" + }, + "codingRate": { + "description": "The denominator of the coding rate", + "label": "编码率" + }, + "frequencyOffset": { + "description": "Frequency offset to correct for crystal calibration errors", + "label": "Frequency Offset" + }, + "frequencySlot": { + "description": "LoRa frequency channel number", + "label": "Frequency Slot" + }, + "hopLimit": { + "description": "Maximum number of hops", + "label": "Hop Limit" + }, + "ignoreMqtt": { + "description": "Don't forward MQTT messages over the mesh", + "label": "忽略 MQTT" + }, + "modemPreset": { + "description": "Modem preset to use", + "label": "调制解调器预设" + }, + "okToMqtt": { + "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT", + "label": "使用MQTT" + }, + "overrideDutyCycle": { + "description": "覆盖占空比", + "label": "覆盖占空比" + }, + "overrideFrequency": { + "description": "Override frequency", + "label": "Override Frequency" + }, + "region": { + "description": "Sets the region for your node", + "label": "区域" + }, + "spreadingFactor": { + "description": "Indicates the number of chirps per symbol", + "label": "Spreading Factor" + }, + "transmitEnabled": { + "description": "Enable/Disable transmit (TX) from the LoRa radio", + "label": "启用传输" + }, + "transmitPower": { + "description": "Max transmit power", + "label": "Transmit Power" + }, + "usePreset": { + "description": "Use one of the predefined modem presets", + "label": "使用预设" + }, + "meshSettings": { + "description": "Settings for the LoRa mesh", + "label": "Mesh Settings" + }, + "waveformSettings": { + "description": "Settings for the LoRa waveform", + "label": "Waveform Settings" + }, + "radioSettings": { + "label": "Radio Settings", + "description": "Settings for the LoRa radio" + } + }, + "network": { + "title": "WiFi Config", + "description": "WiFi radio configuration", + "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", + "addressMode": { + "description": "Address assignment selection", + "label": "Address Mode" + }, + "dns": { + "description": "DNS Server", + "label": "DNS" + }, + "ethernetEnabled": { + "description": "Enable or disable the Ethernet port", + "label": "启用" + }, + "gateway": { + "description": "Default Gateway", + "label": "网关" + }, + "ip": { + "description": "IP Address", + "label": "IP" + }, + "psk": { + "description": "Network password", + "label": "共享密钥/PSK" + }, + "ssid": { + "description": "Network name", + "label": "SSID" + }, + "subnet": { + "description": "Subnet Mask", + "label": "子网" + }, + "wifiEnabled": { + "description": "Enable or disable the WiFi radio", + "label": "启用" + }, + "meshViaUdp": { + "label": "Mesh via UDP" + }, + "ntpServer": { + "label": "NTP Server" + }, + "rsyslogServer": { + "label": "Rsyslog Server" + }, + "ethernetConfigSettings": { + "description": "Ethernet port configuration", + "label": "Ethernet Config" + }, + "ipConfigSettings": { + "description": "IP configuration", + "label": "IP Config" + }, + "ntpConfigSettings": { + "description": "NTP configuration", + "label": "NTP Config" + }, + "rsyslogConfigSettings": { + "description": "Rsyslog configuration", + "label": "Rsyslog Config" + }, + "udpConfigSettings": { + "description": "UDP over Mesh configuration", + "label": "UDP 设置" + } + }, + "position": { + "title": "Position Settings", + "description": "Settings for the position module", + "broadcastInterval": { + "description": "How often your position is sent out over the mesh", + "label": "广播间隔" + }, + "enablePin": { + "description": "GPS module enable pin override", + "label": "Enable Pin" + }, + "fixedPosition": { + "description": "Don't report GPS position, but a manually-specified one", + "label": "Fixed Position" + }, + "gpsMode": { + "description": "Configure whether device GPS is Enabled, Disabled, or Not Present", + "label": "GPS Mode" + }, + "gpsUpdateInterval": { + "description": "How often a GPS fix should be acquired", + "label": "GPS Update Interval" + }, + "positionFlags": { + "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.", + "label": "Position Flags" + }, + "receivePin": { + "description": "GPS module RX pin override", + "label": "Receive Pin" + }, + "smartPositionEnabled": { + "description": "Only send position when there has been a meaningful change in location", + "label": "Enable Smart Position" + }, + "smartPositionMinDistance": { + "description": "Minimum distance (in meters) that must be traveled before a position update is sent", + "label": "Smart Position Minimum Distance" + }, + "smartPositionMinInterval": { + "description": "Minimum interval (in seconds) that must pass before a position update is sent", + "label": "Smart Position Minimum Interval" + }, + "transmitPin": { + "description": "GPS module TX pin override", + "label": "Transmit Pin" + }, + "intervalsSettings": { + "description": "How often to send position updates", + "label": "Intervals" + }, + "flags": { + "placeholder": "Select position flags...", + "altitude": "Altitude", + "altitudeGeoidalSeparation": "Altitude Geoidal Separation", + "altitudeMsl": "Altitude is Mean Sea Level", + "dop": "Dilution of precision (DOP) PDOP used by default", + "hdopVdop": "如果设置了 DOP,则使用 HDOP / VDOP 值而不是 PDOP", + "numSatellites": "Number of satellites", + "sequenceNumber": "Sequence number", + "timestamp": "时间戳", + "unset": "未设置", + "vehicleHeading": "Vehicle heading", + "vehicleSpeed": "Vehicle speed" + } + }, + "power": { + "adcMultiplierOverride": { + "description": "Used for tweaking battery voltage reading", + "label": "ADC Multiplier Override ratio" + }, + "ina219Address": { + "description": "Address of the INA219 battery monitor", + "label": "INA219 Address" + }, + "lightSleepDuration": { + "description": "How long the device will be in light sleep for", + "label": "Light Sleep Duration" + }, + "minimumWakeTime": { + "description": "Minimum amount of time the device will stay awake for after receiving a packet", + "label": "Minimum Wake Time" + }, + "noConnectionBluetoothDisabled": { + "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", + "label": "No Connection Bluetooth Disabled" + }, + "powerSavingEnabled": { + "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", + "label": "启用节能模式" + }, + "shutdownOnBatteryDelay": { + "description": "Automatically shutdown node after this long when on battery, 0 for indefinite", + "label": "Shutdown on battery delay" + }, + "superDeepSleepDuration": { + "description": "How long the device will be in super deep sleep for", + "label": "Super Deep Sleep Duration" + }, + "powerConfigSettings": { + "description": "Settings for the power module", + "label": "电源配置" + }, + "sleepSettings": { + "description": "Sleep settings for the power module", + "label": "Sleep Settings" + } + }, + "security": { + "description": "Settings for the Security configuration", + "title": "Security Settings", + "button_backupKey": "Backup Key", + "adminChannelEnabled": { + "description": "Allow incoming device control over the insecure legacy admin channel", + "label": "Allow Legacy Admin" + }, + "enableDebugLogApi": { + "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth", + "label": "Enable Debug Log API" + }, + "managed": { + "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", + "label": "Managed" + }, + "privateKey": { + "description": "Used to create a shared key with a remote device", + "label": "私钥" + }, + "publicKey": { + "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key", + "label": "公钥" + }, + "primaryAdminKey": { + "description": "The primary public key authorized to send admin messages to this node", + "label": "一级管理员密钥" + }, + "secondaryAdminKey": { + "description": "The secondary public key authorized to send admin messages to this node", + "label": "二级管理员密钥" + }, + "serialOutputEnabled": { + "description": "Serial Console over the Stream API", + "label": "Serial Output Enabled" + }, + "tertiaryAdminKey": { + "description": "The tertiary public key authorized to send admin messages to this node", + "label": "三级管理员密钥" + }, + "adminSettings": { + "description": "Settings for Admin", + "label": "Admin Settings" + }, + "loggingSettings": { + "description": "Settings for Logging", + "label": "Logging Settings" + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/dialog.json b/packages/web/public/i18n/locales/zh-CN/dialog.json index f3203783..293638cb 100644 --- a/packages/web/public/i18n/locales/zh-CN/dialog.json +++ b/packages/web/public/i18n/locales/zh-CN/dialog.json @@ -1,171 +1,171 @@ { - "deleteMessages": { - "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", - "title": "Clear All Messages" - }, - "deviceName": { - "description": "The Device will restart once the config is saved.", - "longName": "长名称", - "shortName": "短名称", - "title": "Change Device Name" - }, - "import": { - "description": "The current LoRa configuration will be overridden.", - "error": { - "invalidUrl": "Invalid Meshtastic URL" - }, - "channelPrefix": "Channel: ", - "channelSetUrl": "Channel Set/QR Code URL", - "channels": "Channels:", - "usePreset": "Use Preset?", - "title": "Import Channel Set" - }, - "locationResponse": { - "altitude": "Altitude: ", - "coordinates": "Coordinates: ", - "title": "Location: {{identifier}}" - }, - "pkiRegenerateDialog": { - "title": "Regenerate Pre-Shared Key?", - "description": "Are you sure you want to regenerate the pre-shared key?", - "regenerate": "Regenerate" - }, - "newDeviceDialog": { - "title": "Connect New Device", - "https": "https", - "http": "http", - "tabHttp": "HTTP", - "tabBluetooth": "蓝牙", - "tabSerial": "串口", - "useHttps": "Use HTTPS", - "connecting": "Connecting...", - "connect": "连接", - "connectionFailedAlert": { - "title": "Connection Failed", - "descriptionPrefix": "Could not connect to the device. ", - "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", - "openLinkPrefix": "Please open ", - "openLinkSuffix": " in a new tab", - "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", - "learnMoreLink": "Learn more" - }, - "httpConnection": { - "label": "IP Address/Hostname", - "placeholder": "000.000.000.000 / meshtastic.local" - }, - "serialConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device", - "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" - }, - "bluetoothConnection": { - "noDevicesPaired": "No devices paired yet.", - "newDeviceButton": "New device" - }, - "validation": { - "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", - "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", - "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." - } - }, - "nodeDetails": { - "message": "信息", - "requestPosition": "Request Position", - "traceRoute": "Trace Route", - "airTxUtilization": "Air TX utilization", - "allRawMetrics": "All Raw Metrics:", - "batteryLevel": "Battery level", - "channelUtilization": "Channel utilization", - "details": "Details:", - "deviceMetrics": "Device Metrics:", - "hardware": "Hardware: ", - "lastHeard": "Last Heard: ", - "nodeHexPrefix": "Node Hex: !", - "nodeNumber": "Node Number: ", - "position": "Position:", - "role": "Role: ", - "uptime": "Uptime: ", - "voltage": "电压", - "title": "Node Details for {{identifier}}", - "ignoreNode": "Ignore node", - "removeNode": "Remove node", - "unignoreNode": "Unignore node" - }, - "pkiBackup": { - "loseKeysWarning": "If you lose your keys, you will need to reset your device.", - "secureBackup": "Its important to backup your public and private keys and store your backup securely!", - "footer": "=== END OF KEYS ===", - "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", - "privateKey": "Private Key:", - "publicKey": "Public Key:", - "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", - "title": "Backup Keys" - }, - "pkiBackupReminder": { - "description": "We recommend backing up your key data regularly. Would you like to back up now?", - "title": "Backup Reminder", - "remindLaterPrefix": "Remind me in", - "remindNever": "Never remind me", - "backupNow": "Back up now" - }, - "pkiRegenerate": { - "description": "Are you sure you want to regenerate key pair?", - "title": "Regenerate Key Pair" - }, - "qr": { - "addChannels": "Add Channels", - "replaceChannels": "Replace Channels", - "description": "The current LoRa configuration will also be shared.", - "sharableUrl": "Sharable URL", - "title": "生成二维码" - }, - "rebootOta": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", - "enterDelay": "Enter delay (sec)", - "scheduled": "Reboot has been scheduled" - }, - "reboot": { - "title": "Schedule Reboot", - "description": "Reboot the connected node after x minutes." - }, - "refreshKeys": { - "description": { - "acceptNewKeys": "This will remove the node from device and request new keys.", - "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", - "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " - }, - "acceptNewKeys": "Accept New Keys", - "title": "Keys Mismatch - {{identifier}}" - }, - "removeNode": { - "description": "Are you sure you want to remove this Node?", - "title": "Remove Node?" - }, - "shutdown": { - "title": "Schedule Shutdown", - "description": "Turn off the connected node after x minutes." - }, - "traceRoute": { - "routeToDestination": "Route to destination:", - "routeBack": "Route back:" - }, - "tracerouteResponse": { - "title": "Traceroute: {{identifier}}" - }, - "unsafeRoles": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "conjunction": " and the blog post about ", - "postamble": " and understand the implications of changing the role.", - "preamble": "I have read the ", - "choosingRightDeviceRole": "Choosing The Right Device Role", - "deviceRoleDocumentation": "Device Role Documentation", - "title": "是否确认?" - }, - "managedMode": { - "confirmUnderstanding": "Yes, I know what I'm doing", - "title": "是否确认?", - "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." - } + "deleteMessages": { + "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?", + "title": "Clear All Messages" + }, + "deviceName": { + "description": "The Device will restart once the config is saved.", + "longName": "长名称", + "shortName": "短名称", + "title": "Change Device Name" + }, + "import": { + "description": "The current LoRa configuration will be overridden.", + "error": { + "invalidUrl": "Invalid Meshtastic URL" + }, + "channelPrefix": "Channel: ", + "channelSetUrl": "Channel Set/QR Code URL", + "channels": "Channels:", + "usePreset": "Use Preset?", + "title": "Import Channel Set" + }, + "locationResponse": { + "altitude": "Altitude: ", + "coordinates": "Coordinates: ", + "title": "Location: {{identifier}}" + }, + "pkiRegenerateDialog": { + "title": "Regenerate Pre-Shared Key?", + "description": "Are you sure you want to regenerate the pre-shared key?", + "regenerate": "Regenerate" + }, + "newDeviceDialog": { + "title": "Connect New Device", + "https": "https", + "http": "http", + "tabHttp": "HTTP", + "tabBluetooth": "蓝牙", + "tabSerial": "串口", + "useHttps": "Use HTTPS", + "connecting": "Connecting...", + "connect": "连接", + "connectionFailedAlert": { + "title": "Connection Failed", + "descriptionPrefix": "Could not connect to the device. ", + "httpsHint": "If using HTTPS, you may need to accept a self-signed certificate first. ", + "openLinkPrefix": "Please open ", + "openLinkSuffix": " in a new tab", + "acceptTlsWarningSuffix": ", accept any TLS warnings if prompted, then try again", + "learnMoreLink": "Learn more" + }, + "httpConnection": { + "label": "IP Address/Hostname", + "placeholder": "000.000.000.000 / meshtastic.local" + }, + "serialConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device", + "deviceIdentifier": "# {{index}} - {{vendorId}} - {{productId}}" + }, + "bluetoothConnection": { + "noDevicesPaired": "No devices paired yet.", + "newDeviceButton": "New device" + }, + "validation": { + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." + } + }, + "nodeDetails": { + "message": "信息", + "requestPosition": "Request Position", + "traceRoute": "Trace Route", + "airTxUtilization": "Air TX utilization", + "allRawMetrics": "All Raw Metrics:", + "batteryLevel": "Battery level", + "channelUtilization": "Channel utilization", + "details": "Details:", + "deviceMetrics": "Device Metrics:", + "hardware": "Hardware: ", + "lastHeard": "Last Heard: ", + "nodeHexPrefix": "Node Hex: !", + "nodeNumber": "Node Number: ", + "position": "Position:", + "role": "Role: ", + "uptime": "Uptime: ", + "voltage": "电压", + "title": "Node Details for {{identifier}}", + "ignoreNode": "Ignore node", + "removeNode": "Remove node", + "unignoreNode": "Unignore node" + }, + "pkiBackup": { + "loseKeysWarning": "If you lose your keys, you will need to reset your device.", + "secureBackup": "Its important to backup your public and private keys and store your backup securely!", + "footer": "=== END OF KEYS ===", + "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===", + "privateKey": "Private Key:", + "publicKey": "Public Key:", + "fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt", + "title": "Backup Keys" + }, + "pkiBackupReminder": { + "description": "We recommend backing up your key data regularly. Would you like to back up now?", + "title": "Backup Reminder", + "remindLaterPrefix": "Remind me in", + "remindNever": "Never remind me", + "backupNow": "Back up now" + }, + "pkiRegenerate": { + "description": "Are you sure you want to regenerate key pair?", + "title": "Regenerate Key Pair" + }, + "qr": { + "addChannels": "Add Channels", + "replaceChannels": "Replace Channels", + "description": "The current LoRa configuration will also be shared.", + "sharableUrl": "Sharable URL", + "title": "生成二维码" + }, + "rebootOta": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after a delay into OTA (Over-the-Air) mode.", + "enterDelay": "Enter delay (sec)", + "scheduled": "Reboot has been scheduled" + }, + "reboot": { + "title": "Schedule Reboot", + "description": "Reboot the connected node after x minutes." + }, + "refreshKeys": { + "description": { + "acceptNewKeys": "This will remove the node from device and request new keys.", + "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.", + "unableToSendDmPrefix": "Your node is unable to send a direct message to node: " + }, + "acceptNewKeys": "Accept New Keys", + "title": "Keys Mismatch - {{identifier}}" + }, + "removeNode": { + "description": "Are you sure you want to remove this Node?", + "title": "Remove Node?" + }, + "shutdown": { + "title": "Schedule Shutdown", + "description": "Turn off the connected node after x minutes." + }, + "traceRoute": { + "routeToDestination": "Route to destination:", + "routeBack": "Route back:" + }, + "tracerouteResponse": { + "title": "Traceroute: {{identifier}}" + }, + "unsafeRoles": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "conjunction": " and the blog post about ", + "postamble": " and understand the implications of changing the role.", + "preamble": "I have read the ", + "choosingRightDeviceRole": "Choosing The Right Device Role", + "deviceRoleDocumentation": "Device Role Documentation", + "title": "是否确认?" + }, + "managedMode": { + "confirmUnderstanding": "Yes, I know what I'm doing", + "title": "是否确认?", + "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration." + } } diff --git a/packages/web/public/i18n/locales/zh-CN/messages.json b/packages/web/public/i18n/locales/zh-CN/messages.json index 35f3380b..790b61b8 100644 --- a/packages/web/public/i18n/locales/zh-CN/messages.json +++ b/packages/web/public/i18n/locales/zh-CN/messages.json @@ -1,39 +1,39 @@ { - "page": { - "title": "Messages: {{chatName}}", - "placeholder": "Enter Message" - }, - "emptyState": { - "title": "Select a Chat", - "text": "No messages yet." - }, - "selectChatPrompt": { - "text": "Select a channel or node to start messaging." - }, - "sendMessage": { - "placeholder": "Enter your message here...", - "sendButton": "传送" - }, - "actionsMenu": { - "addReactionLabel": "Add Reaction", - "replyLabel": "回复" - }, - "deliveryStatus": { - "delivered": { - "label": "Message delivered", - "displayText": "Message delivered" - }, - "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" - }, - "unknown": { - "label": "Message status unknown", - "displayText": "Unknown state" - }, - "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" - } - } + "page": { + "title": "Messages: {{chatName}}", + "placeholder": "Enter Message" + }, + "emptyState": { + "title": "Select a Chat", + "text": "No messages yet." + }, + "selectChatPrompt": { + "text": "Select a channel or node to start messaging." + }, + "sendMessage": { + "placeholder": "Enter your message here...", + "sendButton": "传送" + }, + "actionsMenu": { + "addReactionLabel": "Add Reaction", + "replyLabel": "回复" + }, + "deliveryStatus": { + "delivered": { + "label": "Message delivered", + "displayText": "Message delivered" + }, + "failed": { + "label": "Message delivery failed", + "displayText": "Delivery failed" + }, + "unknown": { + "label": "Message status unknown", + "displayText": "Unknown state" + }, + "waiting": { + "label": "Sending message", + "displayText": "Waiting for delivery" + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/moduleConfig.json b/packages/web/public/i18n/locales/zh-CN/moduleConfig.json index 4bcce7d2..8758a23e 100644 --- a/packages/web/public/i18n/locales/zh-CN/moduleConfig.json +++ b/packages/web/public/i18n/locales/zh-CN/moduleConfig.json @@ -1,448 +1,448 @@ { - "page": { - "tabAmbientLighting": "氛围灯", - "tabAudio": "音频", - "tabCannedMessage": "Canned", - "tabDetectionSensor": "检测传感器", - "tabExternalNotification": "Ext Notif", - "tabMqtt": "MQTT", - "tabNeighborInfo": "邻居信息", - "tabPaxcounter": "客流计数", - "tabRangeTest": "拉距测试", - "tabSerial": "串口", - "tabStoreAndForward": "S&F", - "tabTelemetry": "遥测(传感器)" - }, - "ambientLighting": { - "title": "Ambient Lighting Settings", - "description": "Settings for the Ambient Lighting module", - "ledState": { - "label": "LED 状态", - "description": "Sets LED to on or off" - }, - "current": { - "label": "电流", - "description": "Sets the current for the LED output. Default is 10" - }, - "red": { - "label": "红", - "description": "Sets the red LED level. Values are 0-255" - }, - "green": { - "label": "绿", - "description": "Sets the green LED level. Values are 0-255" - }, - "blue": { - "label": "蓝", - "description": "Sets the blue LED level. Values are 0-255" - } - }, - "audio": { - "title": "Audio Settings", - "description": "Settings for the Audio module", - "codec2Enabled": { - "label": "Codec 2 Enabled", - "description": "Enable Codec 2 audio encoding" - }, - "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" - }, - "bitrate": { - "label": "Bitrate", - "description": "Bitrate to use for audio encoding" - }, - "i2sWs": { - "label": "i2S WS", - "description": "GPIO pin to use for i2S WS" - }, - "i2sSd": { - "label": "i2S SD", - "description": "GPIO pin to use for i2S SD" - }, - "i2sDin": { - "label": "i2S DIN", - "description": "GPIO pin to use for i2S DIN" - }, - "i2sSck": { - "label": "i2S SCK", - "description": "GPIO pin to use for i2S SCK" - } - }, - "cannedMessage": { - "title": "Canned Message Settings", - "description": "Settings for the Canned Message module", - "moduleEnabled": { - "label": "Module Enabled", - "description": "Enable Canned Message" - }, - "rotary1Enabled": { - "label": "Rotary Encoder #1 Enabled", - "description": "Enable the rotary encoder" - }, - "inputbrokerPinA": { - "label": "Encoder Pin A", - "description": "GPIO Pin Value (1-39) For encoder port A" - }, - "inputbrokerPinB": { - "label": "Encoder Pin B", - "description": "GPIO Pin Value (1-39) For encoder port B" - }, - "inputbrokerPinPress": { - "label": "Encoder Pin Press", - "description": "GPIO Pin Value (1-39) For encoder Press" - }, - "inputbrokerEventCw": { - "label": "Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventCcw": { - "label": "Counter Clockwise event", - "description": "Select input event." - }, - "inputbrokerEventPress": { - "label": "Press event", - "description": "Select input event" - }, - "updown1Enabled": { - "label": "Up Down enabled", - "description": "Enable the up / down encoder" - }, - "allowInputSource": { - "label": "Allow Input Source", - "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" - }, - "sendBell": { - "label": "发送铃声", - "description": "Sends a bell character with each message" - } - }, - "detectionSensor": { - "title": "Detection Sensor Settings", - "description": "Settings for the Detection Sensor module", - "enabled": { - "label": "启用", - "description": "Enable or disable Detection Sensor Module" - }, - "minimumBroadcastSecs": { - "label": "Minimum Broadcast Seconds", - "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" - }, - "stateBroadcastSecs": { - "label": "State Broadcast Seconds", - "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" - }, - "sendBell": { - "label": "发送铃声", - "description": "Send ASCII bell with alert message" - }, - "name": { - "label": "Friendly Name", - "description": "Used to format the message sent to mesh, max 20 Characters" - }, - "monitorPin": { - "label": "Monitor Pin", - "description": "The GPIO pin to monitor for state changes" - }, - "detectionTriggerType": { - "label": "Detection Triggered Type", - "description": "The type of trigger event to be used" - }, - "usePullup": { - "label": "Use Pullup", - "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" - } - }, - "externalNotification": { - "title": "External Notification Settings", - "description": "Configure the external notification module", - "enabled": { - "label": "Module Enabled", - "description": "Enable External Notification" - }, - "outputMs": { - "label": "Output MS", - "description": "Output MS" - }, - "output": { - "label": "Output", - "description": "Output" - }, - "outputVibra": { - "label": "Output Vibrate", - "description": "Output Vibrate" - }, - "outputBuzzer": { - "label": "Output Buzzer", - "description": "Output Buzzer" - }, - "active": { - "label": "Active", - "description": "Active" - }, - "alertMessage": { - "label": "Alert Message", - "description": "Alert Message" - }, - "alertMessageVibra": { - "label": "Alert Message Vibrate", - "description": "Alert Message Vibrate" - }, - "alertMessageBuzzer": { - "label": "Alert Message Buzzer", - "description": "Alert Message Buzzer" - }, - "alertBell": { - "label": "Alert Bell", - "description": "Should an alert be triggered when receiving an incoming bell?" - }, - "alertBellVibra": { - "label": "Alert Bell Vibrate", - "description": "Alert Bell Vibrate" - }, - "alertBellBuzzer": { - "label": "Alert Bell Buzzer", - "description": "Alert Bell Buzzer" - }, - "usePwm": { - "label": "Use PWM", - "description": "Use PWM" - }, - "nagTimeout": { - "label": "Nag Timeout", - "description": "Nag Timeout" - }, - "useI2sAsBuzzer": { - "label": "Use I²S Pin as Buzzer", - "description": "Designate I²S Pin as Buzzer Output" - } - }, - "mqtt": { - "title": "MQTT Settings", - "description": "Settings for the MQTT module", - "enabled": { - "label": "启用", - "description": "Enable or disable MQTT" - }, - "address": { - "label": "MQTT Server Address", - "description": "MQTT server address to use for default/custom servers" - }, - "username": { - "label": "MQTT Username", - "description": "MQTT username to use for default/custom servers" - }, - "password": { - "label": "MQTT Password", - "description": "MQTT password to use for default/custom servers" - }, - "encryptionEnabled": { - "label": "启用加密", - "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." - }, - "jsonEnabled": { - "label": "启用 JSON", - "description": "Whether to send/consume JSON packets on MQTT" - }, - "tlsEnabled": { - "label": "启用 TLS", - "description": "Enable or disable TLS" - }, - "root": { - "label": "根主题", - "description": "MQTT root topic to use for default/custom servers" - }, - "proxyToClientEnabled": { - "label": "MQTT Client Proxy Enabled", - "description": "Utilizes the network connection to proxy MQTT messages to the client." - }, - "mapReportingEnabled": { - "label": "Map Reporting Enabled", - "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." - }, - "mapReportSettings": { - "publishIntervalSecs": { - "label": "Map Report Publish Interval (s)", - "description": "Interval in seconds to publish map reports" - }, - "positionPrecision": { - "label": "Approximate Location", - "description": "Position shared will be accurate within this distance", - "options": { - "metric_km23": "Within 23 km", - "metric_km12": "Within 12 km", - "metric_km5_8": "Within 5.8 km", - "metric_km2_9": "Within 2.9 km", - "metric_km1_5": "Within 1.5 km", - "metric_m700": "Within 700 m", - "metric_m350": "Within 350 m", - "metric_m200": "Within 200 m", - "metric_m90": "Within 90 m", - "metric_m50": "Within 50 m", - "imperial_mi15": "Within 15 miles", - "imperial_mi7_3": "Within 7.3 miles", - "imperial_mi3_6": "Within 3.6 miles", - "imperial_mi1_8": "Within 1.8 miles", - "imperial_mi0_9": "Within 0.9 miles", - "imperial_mi0_5": "Within 0.5 miles", - "imperial_mi0_2": "Within 0.2 miles", - "imperial_ft600": "Within 600 feet", - "imperial_ft300": "Within 300 feet", - "imperial_ft150": "Within 150 feet" - } - } - } - }, - "neighborInfo": { - "title": "Neighbor Info Settings", - "description": "Settings for the Neighbor Info module", - "enabled": { - "label": "启用", - "description": "Enable or disable Neighbor Info Module" - }, - "updateInterval": { - "label": "Update Interval", - "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" - } - }, - "paxcounter": { - "title": "Paxcounter Settings", - "description": "Settings for the Paxcounter module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Paxcounter" - }, - "paxcounterUpdateInterval": { - "label": "Update Interval (seconds)", - "description": "How long to wait between sending paxcounter packets" - }, - "wifiThreshold": { - "label": "WiFi RSSI Threshold", - "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." - }, - "bleThreshold": { - "label": "BLE RSSI Threshold", - "description": "At what BLE RSSI level should the counter increase. Defaults to -80." - } - }, - "rangeTest": { - "title": "Range Test Settings", - "description": "Settings for the Range Test module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Range Test" - }, - "sender": { - "label": "Message Interval", - "description": "How long to wait between sending test packets" - }, - "save": { - "label": "Save CSV to storage", - "description": "ESP32 Only" - } - }, - "serial": { - "title": "Serial Settings", - "description": "Settings for the Serial module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Serial output" - }, - "echo": { - "label": "回声", - "description": "Any packets you send will be echoed back to your device" - }, - "rxd": { - "label": "Receive Pin", - "description": "Set the GPIO pin to the RXD pin you have set up." - }, - "txd": { - "label": "Transmit Pin", - "description": "Set the GPIO pin to the TXD pin you have set up." - }, - "baud": { - "label": "Baud Rate", - "description": "The serial baud rate" - }, - "timeout": { - "label": "超时", - "description": "Seconds to wait before we consider your packet as 'done'" - }, - "mode": { - "label": "模式", - "description": "Select Mode" - }, - "overrideConsoleSerialPort": { - "label": "Override Console Serial Port", - "description": "If you have a serial port connected to the console, this will override it." - } - }, - "storeForward": { - "title": "Store & Forward Settings", - "description": "Settings for the Store & Forward module", - "enabled": { - "label": "Module Enabled", - "description": "Enable Store & Forward" - }, - "heartbeat": { - "label": "Heartbeat Enabled", - "description": "Enable Store & Forward heartbeat" - }, - "records": { - "label": "记录数", - "description": "Number of records to store" - }, - "historyReturnMax": { - "label": "历史记录最大返回值", - "description": "Max number of records to return" - }, - "historyReturnWindow": { - "label": "历史记录返回窗口", - "description": "Max number of records to return" - } - }, - "telemetry": { - "title": "Telemetry Settings", - "description": "Settings for the Telemetry module", - "deviceUpdateInterval": { - "label": "设备指标", - "description": "设备计量更新间隔 (秒)" - }, - "environmentUpdateInterval": { - "label": "环境计量更新间隔 (秒)", - "description": "" - }, - "environmentMeasurementEnabled": { - "label": "Module Enabled", - "description": "Enable the Environment Telemetry" - }, - "environmentScreenEnabled": { - "label": "Displayed on Screen", - "description": "Show the Telemetry Module on the OLED" - }, - "environmentDisplayFahrenheit": { - "label": "展示华氏度", - "description": "Display temp in Fahrenheit" - }, - "airQualityEnabled": { - "label": "Air Quality Enabled", - "description": "Enable the Air Quality Telemetry" - }, - "airQualityInterval": { - "label": "Air Quality Update Interval", - "description": "How often to send Air Quality data over the mesh" - }, - "powerMeasurementEnabled": { - "label": "Power Measurement Enabled", - "description": "Enable the Power Measurement Telemetry" - }, - "powerUpdateInterval": { - "label": "Power Update Interval", - "description": "How often to send Power data over the mesh" - }, - "powerScreenEnabled": { - "label": "Power Screen Enabled", - "description": "Enable the Power Telemetry Screen" - } - } + "page": { + "tabAmbientLighting": "氛围灯", + "tabAudio": "音频", + "tabCannedMessage": "Canned", + "tabDetectionSensor": "检测传感器", + "tabExternalNotification": "Ext Notif", + "tabMqtt": "MQTT", + "tabNeighborInfo": "邻居信息", + "tabPaxcounter": "客流计数", + "tabRangeTest": "拉距测试", + "tabSerial": "串口", + "tabStoreAndForward": "S&F", + "tabTelemetry": "遥测(传感器)" + }, + "ambientLighting": { + "title": "Ambient Lighting Settings", + "description": "Settings for the Ambient Lighting module", + "ledState": { + "label": "LED 状态", + "description": "Sets LED to on or off" + }, + "current": { + "label": "电流", + "description": "Sets the current for the LED output. Default is 10" + }, + "red": { + "label": "红", + "description": "Sets the red LED level. Values are 0-255" + }, + "green": { + "label": "绿", + "description": "Sets the green LED level. Values are 0-255" + }, + "blue": { + "label": "蓝", + "description": "Sets the blue LED level. Values are 0-255" + } + }, + "audio": { + "title": "Audio Settings", + "description": "Settings for the Audio module", + "codec2Enabled": { + "label": "Codec 2 Enabled", + "description": "Enable Codec 2 audio encoding" + }, + "pttPin": { + "label": "PTT Pin", + "description": "GPIO pin to use for PTT" + }, + "bitrate": { + "label": "Bitrate", + "description": "Bitrate to use for audio encoding" + }, + "i2sWs": { + "label": "i2S WS", + "description": "GPIO pin to use for i2S WS" + }, + "i2sSd": { + "label": "i2S SD", + "description": "GPIO pin to use for i2S SD" + }, + "i2sDin": { + "label": "i2S DIN", + "description": "GPIO pin to use for i2S DIN" + }, + "i2sSck": { + "label": "i2S SCK", + "description": "GPIO pin to use for i2S SCK" + } + }, + "cannedMessage": { + "title": "Canned Message Settings", + "description": "Settings for the Canned Message module", + "moduleEnabled": { + "label": "Module Enabled", + "description": "Enable Canned Message" + }, + "rotary1Enabled": { + "label": "Rotary Encoder #1 Enabled", + "description": "Enable the rotary encoder" + }, + "inputbrokerPinA": { + "label": "Encoder Pin A", + "description": "GPIO Pin Value (1-39) For encoder port A" + }, + "inputbrokerPinB": { + "label": "Encoder Pin B", + "description": "GPIO Pin Value (1-39) For encoder port B" + }, + "inputbrokerPinPress": { + "label": "Encoder Pin Press", + "description": "GPIO Pin Value (1-39) For encoder Press" + }, + "inputbrokerEventCw": { + "label": "Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventCcw": { + "label": "Counter Clockwise event", + "description": "Select input event." + }, + "inputbrokerEventPress": { + "label": "Press event", + "description": "Select input event" + }, + "updown1Enabled": { + "label": "Up Down enabled", + "description": "Enable the up / down encoder" + }, + "allowInputSource": { + "label": "Allow Input Source", + "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'" + }, + "sendBell": { + "label": "发送铃声", + "description": "Sends a bell character with each message" + } + }, + "detectionSensor": { + "title": "Detection Sensor Settings", + "description": "Settings for the Detection Sensor module", + "enabled": { + "label": "启用", + "description": "Enable or disable Detection Sensor Module" + }, + "minimumBroadcastSecs": { + "label": "Minimum Broadcast Seconds", + "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected" + }, + "stateBroadcastSecs": { + "label": "State Broadcast Seconds", + "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes" + }, + "sendBell": { + "label": "发送铃声", + "description": "Send ASCII bell with alert message" + }, + "name": { + "label": "Friendly Name", + "description": "Used to format the message sent to mesh, max 20 Characters" + }, + "monitorPin": { + "label": "Monitor Pin", + "description": "The GPIO pin to monitor for state changes" + }, + "detectionTriggerType": { + "label": "Detection Triggered Type", + "description": "The type of trigger event to be used" + }, + "usePullup": { + "label": "Use Pullup", + "description": "Whether or not use INPUT_PULLUP mode for GPIO pin" + } + }, + "externalNotification": { + "title": "External Notification Settings", + "description": "Configure the external notification module", + "enabled": { + "label": "Module Enabled", + "description": "Enable External Notification" + }, + "outputMs": { + "label": "Output MS", + "description": "Output MS" + }, + "output": { + "label": "Output", + "description": "Output" + }, + "outputVibra": { + "label": "Output Vibrate", + "description": "Output Vibrate" + }, + "outputBuzzer": { + "label": "Output Buzzer", + "description": "Output Buzzer" + }, + "active": { + "label": "Active", + "description": "Active" + }, + "alertMessage": { + "label": "Alert Message", + "description": "Alert Message" + }, + "alertMessageVibra": { + "label": "Alert Message Vibrate", + "description": "Alert Message Vibrate" + }, + "alertMessageBuzzer": { + "label": "Alert Message Buzzer", + "description": "Alert Message Buzzer" + }, + "alertBell": { + "label": "Alert Bell", + "description": "Should an alert be triggered when receiving an incoming bell?" + }, + "alertBellVibra": { + "label": "Alert Bell Vibrate", + "description": "Alert Bell Vibrate" + }, + "alertBellBuzzer": { + "label": "Alert Bell Buzzer", + "description": "Alert Bell Buzzer" + }, + "usePwm": { + "label": "Use PWM", + "description": "Use PWM" + }, + "nagTimeout": { + "label": "Nag Timeout", + "description": "Nag Timeout" + }, + "useI2sAsBuzzer": { + "label": "Use I²S Pin as Buzzer", + "description": "Designate I²S Pin as Buzzer Output" + } + }, + "mqtt": { + "title": "MQTT Settings", + "description": "Settings for the MQTT module", + "enabled": { + "label": "启用", + "description": "Enable or disable MQTT" + }, + "address": { + "label": "MQTT Server Address", + "description": "MQTT server address to use for default/custom servers" + }, + "username": { + "label": "MQTT Username", + "description": "MQTT username to use for default/custom servers" + }, + "password": { + "label": "MQTT Password", + "description": "MQTT password to use for default/custom servers" + }, + "encryptionEnabled": { + "label": "启用加密", + "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data." + }, + "jsonEnabled": { + "label": "启用 JSON", + "description": "Whether to send/consume JSON packets on MQTT" + }, + "tlsEnabled": { + "label": "启用 TLS", + "description": "Enable or disable TLS" + }, + "root": { + "label": "根主题", + "description": "MQTT root topic to use for default/custom servers" + }, + "proxyToClientEnabled": { + "label": "MQTT Client Proxy Enabled", + "description": "Utilizes the network connection to proxy MQTT messages to the client." + }, + "mapReportingEnabled": { + "label": "Map Reporting Enabled", + "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." + }, + "mapReportSettings": { + "publishIntervalSecs": { + "label": "Map Report Publish Interval (s)", + "description": "Interval in seconds to publish map reports" + }, + "positionPrecision": { + "label": "Approximate Location", + "description": "Position shared will be accurate within this distance", + "options": { + "metric_km23": "Within 23 km", + "metric_km12": "Within 12 km", + "metric_km5_8": "Within 5.8 km", + "metric_km2_9": "Within 2.9 km", + "metric_km1_5": "Within 1.5 km", + "metric_m700": "Within 700 m", + "metric_m350": "Within 350 m", + "metric_m200": "Within 200 m", + "metric_m90": "Within 90 m", + "metric_m50": "Within 50 m", + "imperial_mi15": "Within 15 miles", + "imperial_mi7_3": "Within 7.3 miles", + "imperial_mi3_6": "Within 3.6 miles", + "imperial_mi1_8": "Within 1.8 miles", + "imperial_mi0_9": "Within 0.9 miles", + "imperial_mi0_5": "Within 0.5 miles", + "imperial_mi0_2": "Within 0.2 miles", + "imperial_ft600": "Within 600 feet", + "imperial_ft300": "Within 300 feet", + "imperial_ft150": "Within 150 feet" + } + } + } + }, + "neighborInfo": { + "title": "Neighbor Info Settings", + "description": "Settings for the Neighbor Info module", + "enabled": { + "label": "启用", + "description": "Enable or disable Neighbor Info Module" + }, + "updateInterval": { + "label": "Update Interval", + "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh" + } + }, + "paxcounter": { + "title": "Paxcounter Settings", + "description": "Settings for the Paxcounter module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Paxcounter" + }, + "paxcounterUpdateInterval": { + "label": "Update Interval (seconds)", + "description": "How long to wait between sending paxcounter packets" + }, + "wifiThreshold": { + "label": "WiFi RSSI Threshold", + "description": "At what WiFi RSSI level should the counter increase. Defaults to -80." + }, + "bleThreshold": { + "label": "BLE RSSI Threshold", + "description": "At what BLE RSSI level should the counter increase. Defaults to -80." + } + }, + "rangeTest": { + "title": "Range Test Settings", + "description": "Settings for the Range Test module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Range Test" + }, + "sender": { + "label": "Message Interval", + "description": "How long to wait between sending test packets" + }, + "save": { + "label": "Save CSV to storage", + "description": "ESP32 Only" + } + }, + "serial": { + "title": "Serial Settings", + "description": "Settings for the Serial module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Serial output" + }, + "echo": { + "label": "回声", + "description": "Any packets you send will be echoed back to your device" + }, + "rxd": { + "label": "Receive Pin", + "description": "Set the GPIO pin to the RXD pin you have set up." + }, + "txd": { + "label": "Transmit Pin", + "description": "Set the GPIO pin to the TXD pin you have set up." + }, + "baud": { + "label": "Baud Rate", + "description": "The serial baud rate" + }, + "timeout": { + "label": "超时", + "description": "Seconds to wait before we consider your packet as 'done'" + }, + "mode": { + "label": "模式", + "description": "Select Mode" + }, + "overrideConsoleSerialPort": { + "label": "Override Console Serial Port", + "description": "If you have a serial port connected to the console, this will override it." + } + }, + "storeForward": { + "title": "Store & Forward Settings", + "description": "Settings for the Store & Forward module", + "enabled": { + "label": "Module Enabled", + "description": "Enable Store & Forward" + }, + "heartbeat": { + "label": "Heartbeat Enabled", + "description": "Enable Store & Forward heartbeat" + }, + "records": { + "label": "记录数", + "description": "Number of records to store" + }, + "historyReturnMax": { + "label": "历史记录最大返回值", + "description": "Max number of records to return" + }, + "historyReturnWindow": { + "label": "历史记录返回窗口", + "description": "Max number of records to return" + } + }, + "telemetry": { + "title": "Telemetry Settings", + "description": "Settings for the Telemetry module", + "deviceUpdateInterval": { + "label": "设备指标", + "description": "设备计量更新间隔 (秒)" + }, + "environmentUpdateInterval": { + "label": "环境计量更新间隔 (秒)", + "description": "" + }, + "environmentMeasurementEnabled": { + "label": "Module Enabled", + "description": "Enable the Environment Telemetry" + }, + "environmentScreenEnabled": { + "label": "Displayed on Screen", + "description": "Show the Telemetry Module on the OLED" + }, + "environmentDisplayFahrenheit": { + "label": "展示华氏度", + "description": "Display temp in Fahrenheit" + }, + "airQualityEnabled": { + "label": "Air Quality Enabled", + "description": "Enable the Air Quality Telemetry" + }, + "airQualityInterval": { + "label": "Air Quality Update Interval", + "description": "How often to send Air Quality data over the mesh" + }, + "powerMeasurementEnabled": { + "label": "Power Measurement Enabled", + "description": "Enable the Power Measurement Telemetry" + }, + "powerUpdateInterval": { + "label": "Power Update Interval", + "description": "How often to send Power data over the mesh" + }, + "powerScreenEnabled": { + "label": "Power Screen Enabled", + "description": "Enable the Power Telemetry Screen" + } + } } diff --git a/packages/web/public/i18n/locales/zh-CN/nodes.json b/packages/web/public/i18n/locales/zh-CN/nodes.json index f33a4313..85674f90 100644 --- a/packages/web/public/i18n/locales/zh-CN/nodes.json +++ b/packages/web/public/i18n/locales/zh-CN/nodes.json @@ -1,63 +1,63 @@ { - "nodeDetail": { - "publicKeyEnabled": { - "label": "Public Key Enabled" - }, - "noPublicKey": { - "label": "No Public Key" - }, - "directMessage": { - "label": "Direct Message {{shortName}}" - }, - "favorite": { - "label": "收藏", - "tooltip": "Add or remove this node from your favorites" - }, - "notFavorite": { - "label": "Not a Favorite" - }, - "error": { - "label": "错误", - "text": "An error occurred while fetching node details. Please try again later." - }, - "status": { - "heard": "收到", - "mqtt": "MQTT" - }, - "elevation": { - "label": "Elevation" - }, - "channelUtil": { - "label": "Channel Util" - }, - "airtimeUtil": { - "label": "Airtime Util" - } - }, - "nodesTable": { - "headings": { - "longName": "长名称", - "connection": "Connection", - "lastHeard": "Last Heard", - "encryption": "Encryption", - "model": "模型", - "macAddress": "MAC Address" - }, - "connectionStatus": { - "direct": "直频", - "away": "away", - "unknown": "-", - "viaMqtt": ", via MQTT" - }, - "lastHeardStatus": { - "never": "Never" - } - }, - "actions": { - "added": "Added", - "removed": "Removed", - "ignoreNode": "忽略节点", - "unignoreNode": "Unignore Node", - "requestPosition": "Request Position" - } + "nodeDetail": { + "publicKeyEnabled": { + "label": "Public Key Enabled" + }, + "noPublicKey": { + "label": "No Public Key" + }, + "directMessage": { + "label": "Direct Message {{shortName}}" + }, + "favorite": { + "label": "收藏", + "tooltip": "Add or remove this node from your favorites" + }, + "notFavorite": { + "label": "Not a Favorite" + }, + "error": { + "label": "错误", + "text": "An error occurred while fetching node details. Please try again later." + }, + "status": { + "heard": "收到", + "mqtt": "MQTT" + }, + "elevation": { + "label": "Elevation" + }, + "channelUtil": { + "label": "Channel Util" + }, + "airtimeUtil": { + "label": "Airtime Util" + } + }, + "nodesTable": { + "headings": { + "longName": "长名称", + "connection": "Connection", + "lastHeard": "Last Heard", + "encryption": "Encryption", + "model": "模型", + "macAddress": "MAC Address" + }, + "connectionStatus": { + "direct": "直频", + "away": "away", + "unknown": "-", + "viaMqtt": ", via MQTT" + }, + "lastHeardStatus": { + "never": "Never" + } + }, + "actions": { + "added": "Added", + "removed": "Removed", + "ignoreNode": "忽略节点", + "unignoreNode": "Unignore Node", + "requestPosition": "Request Position" + } } diff --git a/packages/web/public/i18n/locales/zh-CN/ui.json b/packages/web/public/i18n/locales/zh-CN/ui.json index a74f34f3..d50668d3 100644 --- a/packages/web/public/i18n/locales/zh-CN/ui.json +++ b/packages/web/public/i18n/locales/zh-CN/ui.json @@ -1,228 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "消息", - "map": "地图", - "config": "配置", - "radioConfig": "Radio Config", - "moduleConfig": "Module Config", - "channels": "频道", - "nodes": "节点" - }, - "app": { - "title": "Meshtastic", - "logo": "Meshtastic Logo" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Open sidebar", - "close": "Close sidebar" - } - }, - "deviceInfo": { - "volts": "{{voltage}} volts", - "firmware": { - "title": "固件", - "version": "v{{version}}", - "buildDate": "Build date: {{date}}" - }, - "deviceName": { - "title": "Device Name", - "changeName": "Change Device Name", - "placeholder": "Enter device name" - }, - "editDeviceName": "Edit device name" - } - }, - "batteryStatus": { - "charging": "{{level}}% charging", - "pluggedIn": "Plugged in", - "title": "电池" - }, - "search": { - "nodes": "Search nodes...", - "channels": "Search channels...", - "commandPalette": "Search commands..." - }, - "toast": { - "positionRequestSent": { - "title": "Position request sent." - }, - "requestingPosition": { - "title": "Requesting position, please wait..." - }, - "sendingTraceroute": { - "title": "Sending Traceroute, please wait..." - }, - "tracerouteSent": { - "title": "Traceroute sent." - }, - "savedChannel": { - "title": "Saved Channel: {{channelName}}" - }, - "messages": { - "pkiEncryption": { - "title": "Chat is using PKI encryption." - }, - "pskEncryption": { - "title": "Chat is using PSK encryption." - } - }, - "configSaveError": { - "title": "Error Saving Config", - "description": "An error occurred while saving the configuration." - }, - "validationError": { - "title": "Config Errors Exist", - "description": "Please fix the configuration errors before saving." - }, - "saveSuccess": { - "title": "Saving Config", - "description": "The configuration change {{case}} has been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} favorites.", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} ignore list", - "action": { - "added": "Added", - "removed": "Removed", - "to": "to", - "from": "from" - } - } - }, - "notifications": { - "copied": { - "label": "Copied!" - }, - "copyToClipboard": { - "label": "Copy to clipboard" - }, - "hidePassword": { - "label": "隐藏密码" - }, - "showPassword": { - "label": "显示密码" - }, - "deliveryStatus": { - "delivered": "Delivered", - "failed": "Delivery Failed", - "waiting": "等待中...", - "unknown": "未知" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "硬件" - }, - "metrics": { - "label": "Metrics" - }, - "role": { - "label": "角色" - }, - "filter": { - "label": "筛选器csvfganw" - }, - "advanced": { - "label": "高级" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Reset Filters" - }, - "nodeName": { - "label": "Node name/number", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Airtime Utilization (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "电压" - }, - "channelUtilization": { - "label": "Channel Utilization (%)" - }, - "hops": { - "direct": "直频", - "label": "Number of hops", - "text": "Number of hops: {{value}}" - }, - "lastHeard": { - "label": "最后听到", - "labelText": "Last heard: {{value}}", - "nowLabel": "Now" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Favorites" - }, - "hide": { - "label": "Hide" - }, - "showOnly": { - "label": "Show Only" - }, - "viaMqtt": { - "label": "Connected via MQTT" - }, - "hopsUnknown": { - "label": "Unknown number of hops" - }, - "showUnheard": { - "label": "Never heard" - }, - "language": { - "label": "语言", - "changeLanguage": "Change Language" - }, - "theme": { - "dark": "深色", - "light": "浅色", - "system": "Automatic", - "changeTheme": "Change Color Scheme" - }, - "errorPage": { - "title": "This is a little embarrassing...", - "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", - "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", - "reportInstructions": "Please include the following information in your report:", - "reportSteps": { - "step1": "What you were doing when the error occurred", - "step2": "What you expected to happen", - "step3": "What actually happened", - "step4": "Any other relevant information" - }, - "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", - "detailsSummary": "Error Details", - "errorMessageLabel": "Error message:", - "stackTraceLabel": "Stack trace:", - "fallbackError": "{{error}}" - }, - "footer": { - "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", - "commitSha": "Commit SHA: {{sha}}" - } + "navigation": { + "title": "Navigation", + "messages": "消息", + "map": "地图", + "config": "配置", + "radioConfig": "Radio Config", + "moduleConfig": "Module Config", + "channels": "频道", + "nodes": "节点" + }, + "app": { + "title": "Meshtastic", + "logo": "Meshtastic Logo" + }, + "sidebar": { + "collapseToggle": { + "button": { + "open": "Open sidebar", + "close": "Close sidebar" + } + }, + "deviceInfo": { + "volts": "{{voltage}} volts", + "firmware": { + "title": "固件", + "version": "v{{version}}", + "buildDate": "Build date: {{date}}" + }, + "deviceName": { + "title": "Device Name", + "changeName": "Change Device Name", + "placeholder": "Enter device name" + }, + "editDeviceName": "Edit device name" + } + }, + "batteryStatus": { + "charging": "{{level}}% charging", + "pluggedIn": "Plugged in", + "title": "电池" + }, + "search": { + "nodes": "Search nodes...", + "channels": "Search channels...", + "commandPalette": "Search commands..." + }, + "toast": { + "positionRequestSent": { + "title": "Position request sent." + }, + "requestingPosition": { + "title": "Requesting position, please wait..." + }, + "sendingTraceroute": { + "title": "Sending Traceroute, please wait..." + }, + "tracerouteSent": { + "title": "Traceroute sent." + }, + "savedChannel": { + "title": "Saved Channel: {{channelName}}" + }, + "messages": { + "pkiEncryption": { + "title": "Chat is using PKI encryption." + }, + "pskEncryption": { + "title": "Chat is using PSK encryption." + } + }, + "configSaveError": { + "title": "Error Saving Config", + "description": "An error occurred while saving the configuration." + }, + "validationError": { + "title": "Config Errors Exist", + "description": "Please fix the configuration errors before saving." + }, + "saveSuccess": { + "title": "Saving Config", + "description": "The configuration change {{case}} has been saved." + }, + "favoriteNode": { + "title": "{{action}} {{nodeName}} {{direction}} favorites.", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} ignore list", + "action": { + "added": "Added", + "removed": "Removed", + "to": "to", + "from": "from" + } + } + }, + "notifications": { + "copied": { + "label": "Copied!" + }, + "copyToClipboard": { + "label": "Copy to clipboard" + }, + "hidePassword": { + "label": "隐藏密码" + }, + "showPassword": { + "label": "显示密码" + }, + "deliveryStatus": { + "delivered": "Delivered", + "failed": "Delivery Failed", + "waiting": "等待中...", + "unknown": "未知" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "硬件" + }, + "metrics": { + "label": "Metrics" + }, + "role": { + "label": "角色" + }, + "filter": { + "label": "筛选器csvfganw" + }, + "advanced": { + "label": "高级" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Reset Filters" + }, + "nodeName": { + "label": "Node name/number", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Airtime Utilization (%)" + }, + "batteryLevel": { + "label": "Battery level (%)", + "labelText": "Battery level (%): {{value}}" + }, + "batteryVoltage": { + "label": "Battery voltage (V)", + "title": "电压" + }, + "channelUtilization": { + "label": "Channel Utilization (%)" + }, + "hops": { + "direct": "直频", + "label": "Number of hops", + "text": "Number of hops: {{value}}" + }, + "lastHeard": { + "label": "最后听到", + "labelText": "Last heard: {{value}}", + "nowLabel": "Now" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Favorites" + }, + "hide": { + "label": "Hide" + }, + "showOnly": { + "label": "Show Only" + }, + "viaMqtt": { + "label": "Connected via MQTT" + }, + "hopsUnknown": { + "label": "Unknown number of hops" + }, + "showUnheard": { + "label": "Never heard" + }, + "language": { + "label": "语言", + "changeLanguage": "Change Language" + }, + "theme": { + "dark": "深色", + "light": "浅色", + "system": "Automatic", + "changeTheme": "Change Color Scheme" + }, + "errorPage": { + "title": "This is a little embarrassing...", + "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.", + "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.", + "reportInstructions": "Please include the following information in your report:", + "reportSteps": { + "step1": "What you were doing when the error occurred", + "step2": "What you expected to happen", + "step3": "What actually happened", + "step4": "Any other relevant information" + }, + "reportLink": "You can report the issue to our <0>GitHub", + "dashboardLink": "Return to the <0>dashboard", + "detailsSummary": "Error Details", + "errorMessageLabel": "Error message:", + "stackTraceLabel": "Stack trace:", + "fallbackError": "{{error}}" + }, + "footer": { + "text": "Powered by <0>▲ Vercel | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information", + "commitSha": "Commit SHA: {{sha}}" + } } diff --git a/packages/web/public/site.webmanifest b/packages/web/public/site.webmanifest index dc9509b9..7f923721 100644 --- a/packages/web/public/site.webmanifest +++ b/packages/web/public/site.webmanifest @@ -1,16 +1,16 @@ { - "name": "Meshtastic", - "short_name": "Web Client", - "start_url": ".", - "description": "Meshtastic Web App", - "icons": [ - { - "src": "/logo.svg", - "sizes": "any", - "type": "image/svg+xml" - } - ], - "theme_color": "#67ea94", - "background_color": "#67ea94", - "display": "standalone" + "name": "Meshtastic", + "short_name": "Web Client", + "start_url": ".", + "description": "Meshtastic Web App", + "icons": [ + { + "src": "/logo.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ], + "theme_color": "#67ea94", + "background_color": "#67ea94", + "display": "standalone" } diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index 78c43813..63ed20ed 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -1,20 +1,19 @@ import { DeviceWrapper } from "@app/DeviceWrapper.tsx"; +import { CommandPalette } from "@components/CommandPalette/index.tsx"; import { DialogManager } from "@components/Dialog/DialogManager.tsx"; import { NewDeviceDialog } from "@components/Dialog/NewDeviceDialog.tsx"; import { KeyBackupReminder } from "@components/KeyBackupReminder.tsx"; -import { Toaster } from "@components/Toaster.tsx"; +import { ErrorPage } from "@components/UI/ErrorPage.tsx"; import Footer from "@components/UI/Footer.tsx"; +import { useTheme } from "@core/hooks/useTheme.ts"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; -import { Dashboard } from "@pages/Dashboard/index.tsx"; -import { ErrorBoundary } from "react-error-boundary"; -import { ErrorPage } from "@components/UI/ErrorPage.tsx"; -import { MapProvider } from "react-map-gl/maplibre"; -import { CommandPalette } from "@components/CommandPalette/index.tsx"; import { SidebarProvider } from "@core/stores/sidebarStore.tsx"; -import { useTheme } from "@core/hooks/useTheme.ts"; +import { Dashboard } from "@pages/Dashboard/index.tsx"; import { Outlet } from "@tanstack/react-router"; import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; +import { ErrorBoundary } from "react-error-boundary"; +import { MapProvider } from "react-map-gl/maplibre"; export function App() { const { getDevice } = useDeviceStore(); @@ -34,7 +33,7 @@ export function App() { setConnectDialogOpen(open); }} /> - + {/* */}
- {device - ? ( -
- - - - - - -
- ) - : ( - <> - -
- - )} + {device ? ( +
+ + + + + + +
+ ) : ( + <> + +
+ + )}
diff --git a/packages/web/src/DeviceWrapper.tsx b/packages/web/src/DeviceWrapper.tsx index dfd66407..3b8c3802 100644 --- a/packages/web/src/DeviceWrapper.tsx +++ b/packages/web/src/DeviceWrapper.tsx @@ -1,5 +1,5 @@ -import { DeviceContext } from "@core/stores/deviceStore.ts"; import type { Device } from "@core/stores/deviceStore.ts"; +import { DeviceContext } from "@core/stores/deviceStore.ts"; import type { ReactNode } from "react"; export interface DeviceWrapperProps { diff --git a/packages/web/src/__mocks__/components/UI/Button.tsx b/packages/web/src/__mocks__/components/UI/Button.tsx index 9fcd10f1..d8e4586f 100644 --- a/packages/web/src/__mocks__/components/UI/Button.tsx +++ b/packages/web/src/__mocks__/components/UI/Button.tsx @@ -1,7 +1,12 @@ import { vi } from "vitest"; vi.mock("@components/UI/Button.tsx", () => ({ - Button: ({ children, name, disabled, onClick }: { + Button: ({ + children, + name, + disabled, + onClick, + }: { children: React.ReactNode; variant: string; name: string; diff --git a/packages/web/src/__mocks__/components/UI/Checkbox.tsx b/packages/web/src/__mocks__/components/UI/Checkbox.tsx index 363c4bb0..a194124d 100644 --- a/packages/web/src/__mocks__/components/UI/Checkbox.tsx +++ b/packages/web/src/__mocks__/components/UI/Checkbox.tsx @@ -1,13 +1,15 @@ import { vi } from "vitest"; vi.mock("@components/UI/Checkbox.tsx", () => ({ - Checkbox: ( - { id, checked, onChange }: { - id: string; - checked: boolean; - onChange: () => void; - }, - ) => ( + Checkbox: ({ + id, + checked, + onChange, + }: { + id: string; + checked: boolean; + onChange: () => void; + }) => ( void; -}) => open ?
{children}
: null; +}) => (open ?
{children}
: null); export const DialogContent = ({ children, @@ -12,19 +15,19 @@ export const DialogContent = ({ }: { children: React.ReactNode; className?: string; -}) =>
{children}
; +}) => ( +
+ {children} +
+); -export const DialogHeader = ({ - children, -}: { - children: React.ReactNode; -}) =>
{children}
; +export const DialogHeader = ({ children }: { children: React.ReactNode }) => ( +
{children}
+); -export const DialogTitle = ({ - children, -}: { - children: React.ReactNode; -}) =>
{children}
; +export const DialogTitle = ({ children }: { children: React.ReactNode }) => ( +
{children}
+); export const DialogDescription = ({ children, @@ -33,7 +36,9 @@ export const DialogDescription = ({ children: React.ReactNode; className?: string; }) => ( -
{children}
+
+ {children} +
); export const DialogFooter = ({ @@ -42,4 +47,8 @@ export const DialogFooter = ({ }: { children: React.ReactNode; className?: string; -}) =>
{children}
; +}) => ( +
+ {children} +
+); diff --git a/packages/web/src/__mocks__/components/UI/Label.tsx b/packages/web/src/__mocks__/components/UI/Label.tsx index f233b844..504321dc 100644 --- a/packages/web/src/__mocks__/components/UI/Label.tsx +++ b/packages/web/src/__mocks__/components/UI/Label.tsx @@ -1,13 +1,15 @@ import { vi } from "vitest"; vi.mock("@components/UI/Label.tsx", () => ({ - Label: ( - { children, htmlFor, className }: { - children: React.ReactNode; - htmlFor: string; - className?: string; - }, - ) => ( + Label: ({ + children, + htmlFor, + className, + }: { + children: React.ReactNode; + htmlFor: string; + className?: string; + }) => ( diff --git a/packages/web/src/__mocks__/components/UI/Link.tsx b/packages/web/src/__mocks__/components/UI/Link.tsx index bfbe9352..01f7cf50 100644 --- a/packages/web/src/__mocks__/components/UI/Link.tsx +++ b/packages/web/src/__mocks__/components/UI/Link.tsx @@ -1,11 +1,17 @@ import { vi } from "vitest"; vi.mock("@components/UI/Typography/Link.tsx", () => ({ - Link: ( - { children, href, className }: { - children: React.ReactNode; - href: string; - className?: string; - }, - ) => {children}, + Link: ({ + children, + href, + className, + }: { + children: React.ReactNode; + href: string; + className?: string; + }) => ( + + {children} + + ), })); diff --git a/packages/web/src/components/BatteryStatus.tsx b/packages/web/src/components/BatteryStatus.tsx index feb7ff67..9f541ce6 100644 --- a/packages/web/src/components/BatteryStatus.tsx +++ b/packages/web/src/components/BatteryStatus.tsx @@ -1,12 +1,12 @@ -import React from "react"; import { BatteryFullIcon, BatteryLowIcon, BatteryMediumIcon, PlugZapIcon, } from "lucide-react"; +import type React from "react"; import { useTranslation } from "react-i18next"; -import { DeviceMetrics } from "./types.ts"; +import type { DeviceMetrics } from "./types.ts"; type BatteryStatusKey = keyof typeof BATTERY_STATUS; @@ -14,10 +14,6 @@ interface BatteryStatusProps { deviceMetrics?: DeviceMetrics | null; } -interface BatteryStatusProps { - deviceMetrics?: DeviceMetrics | null; -} - interface StatusConfig { Icon: React.ElementType; className: string; @@ -89,10 +85,7 @@ const BatteryStatus: React.FC = ({ deviceMetrics }) => { } = statusConfigMap[statusKey]; return ( -
+
{statusText}
diff --git a/packages/web/src/components/CommandPalette/index.tsx b/packages/web/src/components/CommandPalette/index.tsx index e87277d9..d27139bc 100644 --- a/packages/web/src/components/CommandPalette/index.tsx +++ b/packages/web/src/components/CommandPalette/index.tsx @@ -1,356 +1,358 @@ +import { Avatar } from "@components/UI/Avatar.tsx"; import { - CommandDialog, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, } from "@components/UI/Command.tsx"; +import { usePinnedItems } from "@core/hooks/usePinnedItems.ts"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDevice, useDeviceStore } from "@core/stores/deviceStore.ts"; +import { cn } from "@core/utils/cn.ts"; +import { useNavigate } from "@tanstack/react-router"; import { useCommandState } from "cmdk"; import { - ArrowLeftRightIcon, - BoxSelectIcon, - BugIcon, - CloudOff, - EraserIcon, - FactoryIcon, - LayersIcon, - LinkIcon, - type LucideIcon, - MapIcon, - MessageSquareIcon, - Pin, - PlusIcon, - PowerIcon, - QrCodeIcon, - RefreshCwIcon, - SettingsIcon, - SmartphoneIcon, - TrashIcon, - UsersIcon, + ArrowLeftRightIcon, + BoxSelectIcon, + BugIcon, + CloudOff, + EraserIcon, + FactoryIcon, + LayersIcon, + LinkIcon, + type LucideIcon, + MapIcon, + MessageSquareIcon, + Pin, + PlusIcon, + PowerIcon, + QrCodeIcon, + RefreshCwIcon, + SettingsIcon, + SmartphoneIcon, + TrashIcon, + UsersIcon, } from "lucide-react"; import { useEffect } from "react"; -import { Avatar } from "@components/UI/Avatar.tsx"; -import { cn } from "@core/utils/cn.ts"; import { useTranslation } from "react-i18next"; -import { usePinnedItems } from "@core/hooks/usePinnedItems.ts"; -import { useNavigate } from "@tanstack/react-router"; export interface Group { - id: string; - label: string; - icon: LucideIcon; - commands: Command[]; + id: string; + label: string; + icon: LucideIcon; + commands: Command[]; } export interface Command { - label: string; - icon: LucideIcon; - action?: () => void; - subItems?: SubItem[]; - tags?: string[]; + label: string; + icon: LucideIcon; + action?: () => void; + subItems?: SubItem[]; + tags?: string[]; } export interface SubItem { - label: string; - icon: React.ReactNode; - action: () => void; + label: string; + icon: React.ReactNode; + action: () => void; } export const CommandPalette = () => { - const { - commandPaletteOpen, - setCommandPaletteOpen, - setConnectDialogOpen, - setSelectedDevice, - } = useAppStore(); - const { getDevices } = useDeviceStore(); - const { setDialogOpen, getNode, connection } = useDevice(); - const { pinnedItems, togglePinnedItem } = usePinnedItems({ - storageName: "pinnedCommandMenuGroups", - }); - const { t } = useTranslation("commandPalette"); - const navigate = useNavigate({ from: "/" }); + const { + commandPaletteOpen, + setCommandPaletteOpen, + setConnectDialogOpen, + setSelectedDevice, + } = useAppStore(); + const { getDevices } = useDeviceStore(); + const { setDialogOpen, getNode, connection } = useDevice(); + const { pinnedItems, togglePinnedItem } = usePinnedItems({ + storageName: "pinnedCommandMenuGroups", + }); + const { t } = useTranslation("commandPalette"); + const navigate = useNavigate({ from: "/" }); - const groups: Group[] = [ - { - id: "gotoGroup", - label: t("goto.label"), - icon: LinkIcon, - commands: [ - { - label: t("goto.command.messages"), - icon: MessageSquareIcon, - action() { - navigate({ to: "/messages" }); - }, - }, - { - label: t("goto.command.map"), - icon: MapIcon, - action() { - navigate({ to: "/map" }); - }, - }, - { - label: t("goto.command.config"), - icon: SettingsIcon, - action() { - navigate({ to: "/config" }); - }, - tags: ["settings"], - }, - { - label: t("goto.command.channels"), - icon: LayersIcon, - action() { - navigate({ to: "/channels" }); - }, - }, - { - label: t("goto.command.nodes"), - icon: UsersIcon, - action() { - navigate({ to: "/nodes" }); - }, - }, - ], - }, - { - id: "manageGroup", - label: t("manage.label"), - icon: SmartphoneIcon, - commands: [ - { - label: t("manage.command.switchNode"), - icon: ArrowLeftRightIcon, - subItems: getDevices().map((device) => ({ - label: getNode(device.hardware.myNodeNum)?.user?.longName ?? - t("unknown.shortName"), - icon: ( - - ), - action() { - setSelectedDevice(device.id); - }, - })), - }, - { - label: t("manage.command.connectNewNode"), - icon: PlusIcon, - action() { - setConnectDialogOpen(true); - }, - }, - ], - }, - { - id: "contextualGroup", - label: t("contextual.label"), - icon: BoxSelectIcon, - commands: [ - { - label: t("contextual.command.qrCode"), - icon: QrCodeIcon, - subItems: [ - { - label: t("contextual.command.qrGenerator"), - icon: , - action() { - setDialogOpen("QR", true); - }, - }, - { - label: t("contextual.command.qrImport"), - icon: , - action() { - setDialogOpen("import", true); - }, - }, - ], - }, - { - label: t("contextual.command.scheduleShutdown"), - icon: PowerIcon, - action() { - setDialogOpen("shutdown", true); - }, - }, - { - label: t("contextual.command.scheduleReboot"), - icon: RefreshCwIcon, - action() { - setDialogOpen("reboot", true); - }, - }, - { - label: t("contextual.command.rebootToOtaMode"), - icon: RefreshCwIcon, - action() { - setDialogOpen("rebootOTA", true); - }, - }, - { - label: t("contextual.command.resetNodeDb"), - icon: TrashIcon, - action() { - connection?.resetNodes(); - }, - }, - { - label: t("contextual.command.disconnect"), - icon: CloudOff, - action() { - connection?.disconnect().catch((error) => { - console.error("Failed to disconnect:", error); - }); - }, - }, - { - label: t("contextual.command.factoryResetDevice"), - icon: FactoryIcon, - action() { - connection?.factoryResetDevice(); - }, - }, - { - label: t("contextual.command.factoryResetConfig"), - icon: FactoryIcon, - action() { - connection?.factoryResetConfig(); - }, - }, - ], - }, - { - id: "debugGroup", - label: t("debug.label"), - icon: BugIcon, - commands: [ - { - label: t("debug.command.reconfigure"), - icon: RefreshCwIcon, - action() { - void connection?.configure(); - }, - }, - { - label: t("debug.command.clearAllStoredMessages"), - icon: EraserIcon, - action() { - setDialogOpen("deleteMessages", true); - }, - }, - ], - }, - ]; + const groups: Group[] = [ + { + id: "gotoGroup", + label: t("goto.label"), + icon: LinkIcon, + commands: [ + { + label: t("goto.command.messages"), + icon: MessageSquareIcon, + action() { + navigate({ to: "/messages" }); + }, + }, + { + label: t("goto.command.map"), + icon: MapIcon, + action() { + navigate({ to: "/map" }); + }, + }, + { + label: t("goto.command.config"), + icon: SettingsIcon, + action() { + navigate({ to: "/config" }); + }, + tags: ["settings"], + }, + { + label: t("goto.command.channels"), + icon: LayersIcon, + action() { + navigate({ to: "/channels" }); + }, + }, + { + label: t("goto.command.nodes"), + icon: UsersIcon, + action() { + navigate({ to: "/nodes" }); + }, + }, + ], + }, + { + id: "manageGroup", + label: t("manage.label"), + icon: SmartphoneIcon, + commands: [ + { + label: t("manage.command.switchNode"), + icon: ArrowLeftRightIcon, + subItems: getDevices().map((device) => ({ + label: + getNode(device.hardware.myNodeNum)?.user?.longName ?? + t("unknown.shortName"), + icon: ( + + ), + action() { + setSelectedDevice(device.id); + }, + })), + }, + { + label: t("manage.command.connectNewNode"), + icon: PlusIcon, + action() { + setConnectDialogOpen(true); + }, + }, + ], + }, + { + id: "contextualGroup", + label: t("contextual.label"), + icon: BoxSelectIcon, + commands: [ + { + label: t("contextual.command.qrCode"), + icon: QrCodeIcon, + subItems: [ + { + label: t("contextual.command.qrGenerator"), + icon: , + action() { + setDialogOpen("QR", true); + }, + }, + { + label: t("contextual.command.qrImport"), + icon: , + action() { + setDialogOpen("import", true); + }, + }, + ], + }, + { + label: t("contextual.command.scheduleShutdown"), + icon: PowerIcon, + action() { + setDialogOpen("shutdown", true); + }, + }, + { + label: t("contextual.command.scheduleReboot"), + icon: RefreshCwIcon, + action() { + setDialogOpen("reboot", true); + }, + }, + { + label: t("contextual.command.rebootToOtaMode"), + icon: RefreshCwIcon, + action() { + setDialogOpen("rebootOTA", true); + }, + }, + { + label: t("contextual.command.resetNodeDb"), + icon: TrashIcon, + action() { + connection?.resetNodes(); + }, + }, + { + label: t("contextual.command.disconnect"), + icon: CloudOff, + action() { + connection?.disconnect().catch((error) => { + console.error("Failed to disconnect:", error); + }); + }, + }, + { + label: t("contextual.command.factoryResetDevice"), + icon: FactoryIcon, + action() { + connection?.factoryResetDevice(); + }, + }, + { + label: t("contextual.command.factoryResetConfig"), + icon: FactoryIcon, + action() { + connection?.factoryResetConfig(); + }, + }, + ], + }, + { + id: "debugGroup", + label: t("debug.label"), + icon: BugIcon, + commands: [ + { + label: t("debug.command.reconfigure"), + icon: RefreshCwIcon, + action() { + void connection?.configure(); + }, + }, + { + label: t("debug.command.clearAllStoredMessages"), + icon: EraserIcon, + action() { + setDialogOpen("deleteMessages", true); + }, + }, + ], + }, + ]; - const sortedGroups = [...groups].sort((a, b) => { - const aPinned = pinnedItems.includes(a.id) ? 1 : 0; - const bPinned = pinnedItems.includes(b.id) ? 1 : 0; - return bPinned - aPinned; - }); + const sortedGroups = [...groups].sort((a, b) => { + const aPinned = pinnedItems.includes(a.id) ? 1 : 0; + const bPinned = pinnedItems.includes(b.id) ? 1 : 0; + return bPinned - aPinned; + }); - useEffect(() => { - const handleKeydown = (e: KeyboardEvent) => { - if (e.key === "k" && (e.metaKey || e.ctrlKey)) { - e.preventDefault(); - setCommandPaletteOpen(true); - } - }; + useEffect(() => { + const handleKeydown = (e: KeyboardEvent) => { + if (e.key === "k" && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + setCommandPaletteOpen(true); + } + }; - globalThis.addEventListener("keydown", handleKeydown); - return () => globalThis.removeEventListener("keydown", handleKeydown); - }, [setCommandPaletteOpen]); + globalThis.addEventListener("keydown", handleKeydown); + return () => globalThis.removeEventListener("keydown", handleKeydown); + }, [setCommandPaletteOpen]); - return ( - - - - {t("emptyState")} - {sortedGroups.map((group) => ( - - {group.label} - -
- } - > - {group.commands.map((command) => ( -
- { - command.action?.(); - setCommandPaletteOpen(false); - }} - > - - {command.label} - - {command.subItems?.map((subItem) => ( - - ))} -
- ))} - - ))} - - - ); + return ( + + + + {t("emptyState")} + {sortedGroups.map((group) => ( + + {group.label} + + + } + > + {group.commands.map((command) => ( +
+ { + command.action?.(); + setCommandPaletteOpen(false); + }} + > + + {command.label} + + {command.subItems?.map((subItem) => ( + + ))} +
+ ))} +
+ ))} +
+
+ ); }; const SubItem = ({ - label, - icon, - action, + label, + icon, + action, }: { - label: string; - icon: React.ReactNode; - action: () => void; + label: string; + icon: React.ReactNode; + action: () => void; }) => { - const search = useCommandState((state) => state.search); - if (!search) return null; + const search = useCommandState((state) => state.search); + if (!search) { + return null; + } - return ( - - {icon} - {label} - - ); + return ( + + {icon} + {label} + + ); }; diff --git a/packages/web/src/components/DeviceInfoPanel.tsx b/packages/web/src/components/DeviceInfoPanel.tsx index 0e332f03..6e89a4db 100644 --- a/packages/web/src/components/DeviceInfoPanel.tsx +++ b/packages/web/src/components/DeviceInfoPanel.tsx @@ -8,15 +8,16 @@ import { Search as SearchIcon, ZapIcon, } from "lucide-react"; -import BatteryStatus from "./BatteryStatus.tsx"; -import { Subtle } from "./UI/Typography/Subtle.tsx"; -import { Avatar } from "./UI/Avatar.tsx"; -import type { DeviceMetrics } from "./types.ts"; -import { Button } from "./UI/Button.tsx"; -import React, { Fragment } from "react"; +import type React from "react"; +import { Fragment } from "react"; import { useTranslation } from "react-i18next"; -import ThemeSwitcher from "./ThemeSwitcher.tsx"; +import BatteryStatus from "./BatteryStatus.tsx"; import LanguageSwitcher from "./LanguageSwitcher.tsx"; +import ThemeSwitcher from "./ThemeSwitcher.tsx"; +import type { DeviceMetrics } from "./types.ts"; +import { Avatar } from "./UI/Avatar.tsx"; +import { Button } from "./UI/Button.tsx"; +import { Subtle } from "./UI/Typography/Subtle.tsx"; interface DeviceInfoPanelProps { isCollapsed: boolean; @@ -70,9 +71,10 @@ export const DeviceInfoPanel = ({ id: "voltage", label: t("batteryVoltage.title"), icon: ZapIcon, - value: voltage !== undefined - ? `${voltage?.toPrecision(3)} V` - : t("unknown.notAvailable", "N/A"), + value: + voltage !== undefined + ? `${voltage?.toPrecision(3)} V` + : t("unknown.notAvailable", "N/A"), }, { id: "firmware", @@ -135,8 +137,7 @@ export const DeviceInfoPanel = ({ {!isCollapsed && ( -
-
+
)}
{ const IconComponent = item.icon; return ( -
+
{IconComponent && ( {!isCollapsed && ( -
-
+
)}
- {buttonItem.render()} - + {buttonItem.render()} ); } return ( diff --git a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx b/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx index a938c21f..28dfbd76 100644 --- a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx +++ b/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx @@ -1,8 +1,8 @@ +import { DeleteMessagesDialog } from "@components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx"; import { fireEvent, render, screen } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; // Ensure the path is correct for import import { useMessageStore } from "../../../core/stores/messageStore/index.ts"; -import { DeleteMessagesDialog } from "@components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx"; vi.mock("@core/stores/messageStore", () => ({ useMessageStore: vi.fn(() => ({ @@ -26,9 +26,7 @@ describe("DeleteMessagesDialog", () => { }); it("calls onOpenChange with false when the close button (X) is clicked", () => { - render( - , - ); + render(); const closeButton = screen.queryByTestId("dialog-close-button"); if (!closeButton) { throw new Error( @@ -41,15 +39,15 @@ describe("DeleteMessagesDialog", () => { }); it("renders the dialog when open is true", () => { - render( - , - ); + render(); expect(screen.getByText("Clear All Messages")).toBeInTheDocument(); - expect(screen.getByText(/This action will clear all message history./)) - .toBeInTheDocument(); + expect( + screen.getByText(/This action will clear all message history./), + ).toBeInTheDocument(); expect(screen.getByRole("button", { name: "Dismiss" })).toBeInTheDocument(); - expect(screen.getByRole("button", { name: "Clear Messages" })) - .toBeInTheDocument(); + expect( + screen.getByRole("button", { name: "Clear Messages" }), + ).toBeInTheDocument(); }); it("does not render the dialog when open is false", () => { @@ -60,18 +58,14 @@ describe("DeleteMessagesDialog", () => { }); it("calls onOpenChange with false when the dismiss button is clicked", () => { - render( - , - ); + render(); fireEvent.click(screen.getByRole("button", { name: "Dismiss" })); expect(mockOnOpenChange).toHaveBeenCalledTimes(1); // Add count check expect(mockOnOpenChange).toHaveBeenCalledWith(false); }); it("calls deleteAllMessages and onOpenChange with false when the clear messages button is clicked", () => { - render( - , - ); + render(); fireEvent.click(screen.getByRole("button", { name: "Clear Messages" })); expect(mockClearAllMessages).toHaveBeenCalledTimes(1); expect(mockOnOpenChange).toHaveBeenCalledTimes(1); // Add count check diff --git a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx b/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx index 78427da4..f8ea93f9 100644 --- a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx +++ b/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx @@ -9,8 +9,8 @@ import { DialogTitle, } from "@components/UI/Dialog.tsx"; import { AlertTriangleIcon } from "lucide-react"; -import { useMessageStore } from "../../../core/stores/messageStore/index.ts"; import { useTranslation } from "react-i18next"; +import { useMessageStore } from "../../../core/stores/messageStore/index.ts"; export interface DeleteMessagesDialogProps { open: boolean; @@ -41,11 +41,7 @@ export const DeleteMessagesDialog = ({ - - diff --git a/packages/web/src/components/Dialog/DialogManager.tsx b/packages/web/src/components/Dialog/DialogManager.tsx index acd1c9ea..0ba1a97f 100644 --- a/packages/web/src/components/Dialog/DialogManager.tsx +++ b/packages/web/src/components/Dialog/DialogManager.tsx @@ -1,16 +1,16 @@ -import { useDevice } from "@core/stores/deviceStore.ts"; -import { RemoveNodeDialog } from "@components/Dialog/RemoveNodeDialog.tsx"; +import { DeleteMessagesDialog } from "@components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx"; import { DeviceNameDialog } from "@components/Dialog/DeviceNameDialog.tsx"; import { ImportDialog } from "@components/Dialog/ImportDialog.tsx"; +import { NodeDetailsDialog } from "@components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx"; import { PkiBackupDialog } from "@components/Dialog/PKIBackupDialog.tsx"; import { QRDialog } from "@components/Dialog/QRDialog.tsx"; import { RebootDialog } from "@components/Dialog/RebootDialog.tsx"; -import { ShutdownDialog } from "@components/Dialog/ShutdownDialog.tsx"; -import { NodeDetailsDialog } from "@components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx"; -import { UnsafeRolesDialog } from "@components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx"; -import { RefreshKeysDialog } from "@components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx"; import { RebootOTADialog } from "@components/Dialog/RebootOTADialog.tsx"; -import { DeleteMessagesDialog } from "@components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx"; +import { RefreshKeysDialog } from "@components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx"; +import { RemoveNodeDialog } from "@components/Dialog/RemoveNodeDialog.tsx"; +import { ShutdownDialog } from "@components/Dialog/ShutdownDialog.tsx"; +import { UnsafeRolesDialog } from "@components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx"; +import { useDevice } from "@core/stores/deviceStore.ts"; export const DialogManager = () => { const { channels, config, dialog, setDialogOpen } = useDevice(); diff --git a/packages/web/src/components/Dialog/ImportDialog.tsx b/packages/web/src/components/Dialog/ImportDialog.tsx index 6b448ace..67451a81 100644 --- a/packages/web/src/components/Dialog/ImportDialog.tsx +++ b/packages/web/src/components/Dialog/ImportDialog.tsx @@ -1,6 +1,5 @@ import { create, fromBinary } from "@bufbuild/protobuf"; import { Button } from "@components/UI/Button.tsx"; -import { Checkbox } from "../UI/Checkbox/index.tsx"; import { Dialog, DialogClose, @@ -18,6 +17,7 @@ import { Protobuf } from "@meshtastic/core"; import { toByteArray } from "base64-js"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; +import { Checkbox } from "../UI/Checkbox/index.tsx"; export interface ImportDialogProps { open: boolean; @@ -25,10 +25,7 @@ export interface ImportDialogProps { loraConfig?: Protobuf.Config.Config_LoRaConfig; } -export const ImportDialog = ({ - open, - onOpenChange, -}: ImportDialogProps) => { +export const ImportDialog = ({ open, onOpenChange }: ImportDialogProps) => { const { t } = useTranslation("dialog"); const [importDialogInput, setImportDialogInput] = useState(""); const [channelSet, setChannelSet] = useState(); @@ -69,7 +66,7 @@ export const ImportDialog = ({ setValidUrl(false); setChannelSet(undefined); } - }, [importDialogInput]); + }, [importDialogInput, t]); const apply = () => { channelSet?.settings.map( @@ -77,9 +74,10 @@ export const ImportDialog = ({ connection?.setChannel( create(Protobuf.Channel.ChannelSchema, { index, - role: index === 0 - ? Protobuf.Channel.Channel_Role.PRIMARY - : Protobuf.Channel.Channel_Role.SECONDARY, + role: + index === 0 + ? Protobuf.Channel.Channel_Role.PRIMARY + : Protobuf.Channel.Channel_Role.SECONDARY, settings: ch, }), ); @@ -104,9 +102,7 @@ export const ImportDialog = ({ {t("import.title")} - - {t("import.description")} - + {t("import.description")}
@@ -127,25 +123,21 @@ export const ImportDialog = ({ checked={channelSet?.loraConfig?.usePreset ?? true} />
- { - /* */ - } + */}
- { - /* */ - } + */} {t("import.channels")} diff --git a/packages/web/src/components/Dialog/LocationResponseDialog.tsx b/packages/web/src/components/Dialog/LocationResponseDialog.tsx index 93b31f57..99670419 100644 --- a/packages/web/src/components/Dialog/LocationResponseDialog.tsx +++ b/packages/web/src/components/Dialog/LocationResponseDialog.tsx @@ -1,4 +1,7 @@ import { useDevice } from "@core/stores/deviceStore.ts"; +import type { Protobuf, Types } from "@meshtastic/core"; +import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; +import { useTranslation } from "react-i18next"; import { Dialog, DialogClose, @@ -7,9 +10,6 @@ import { DialogHeader, DialogTitle, } from "../UI/Dialog.tsx"; -import type { Protobuf, Types } from "@meshtastic/core"; -import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; -import { useTranslation } from "react-i18next"; export interface LocationResponseDialogProps { location: Types.PacketMetadata | undefined; @@ -26,16 +26,19 @@ export const LocationResponseDialog = ({ const { getNode } = useDevice(); const from = getNode(location?.from ?? 0); - const longName = from?.user?.longName ?? + const longName = + from?.user?.longName ?? (from ? `!${numberToHexUnpadded(from?.num)}` : t("unknown.shortName")); - const shortName = from?.user?.shortName ?? + const shortName = + from?.user?.shortName ?? (from ? `${numberToHexUnpadded(from?.num).substring(0, 4)}` : t("unknown.shortName")); const position = location?.data; - const hasCoordinates = position && + const hasCoordinates = + position && typeof position.latitudeI === "number" && typeof position.longitudeI === "number" && typeof position.altitude === "number"; @@ -53,40 +56,38 @@ export const LocationResponseDialog = ({ - {hasCoordinates - ? ( -
- -

- {t("locationResponse.coordinates")} - - {" "} - {position.latitudeI ?? 0 / 1e7},{" "} - {position.longitudeI ?? 0 / 1e7} - -

-

- {t("locationResponse.altitude")} {position.altitude} - {(position.altitude ?? 0) < 1 - ? t("unit.meter.one") - : t("unit.meter.plural")} -

-
-
- ) - : ( - // Optional: Show a message if coordinates are not available -

- {t("locationResponse.noCoordinates")} -

- )} + {hasCoordinates ? ( +
+ +

+ {t("locationResponse.coordinates")} + + {" "} + {position.latitudeI ?? 0 / 1e7},{" "} + {position.longitudeI ?? 0 / 1e7} + +

+

+ {t("locationResponse.altitude")} {position.altitude} + {(position.altitude ?? 0) < 1 + ? t("unit.meter.one") + : t("unit.meter.plural")} +

+
+
+ ) : ( + // Optional: Show a message if coordinates are not available +

+ {t("locationResponse.noCoordinates")} +

+ )}
diff --git a/packages/web/src/components/Dialog/ManagedModeDialog.tsx b/packages/web/src/components/Dialog/ManagedModeDialog.tsx index 996139d4..6146dc2a 100644 --- a/packages/web/src/components/Dialog/ManagedModeDialog.tsx +++ b/packages/web/src/components/Dialog/ManagedModeDialog.tsx @@ -1,4 +1,5 @@ import { Button } from "@components/UI/Button.tsx"; +import { Checkbox } from "@components/UI/Checkbox/index.tsx"; import { Dialog, DialogClose, @@ -8,9 +9,8 @@ import { DialogHeader, DialogTitle, } from "@components/UI/Dialog.tsx"; -import { Trans, useTranslation } from "react-i18next"; -import { Checkbox } from "@components/UI/Checkbox/index.tsx"; import { useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; export interface ManagedModeDialogProps { open: boolean; @@ -36,7 +36,7 @@ export const ManagedModeDialog = ({ , + bold:

, }} /> diff --git a/packages/web/src/components/Dialog/NewDeviceDialog.tsx b/packages/web/src/components/Dialog/NewDeviceDialog.tsx index eb25e185..e6170123 100644 --- a/packages/web/src/components/Dialog/NewDeviceDialog.tsx +++ b/packages/web/src/components/Dialog/NewDeviceDialog.tsx @@ -1,7 +1,3 @@ -import { - type BrowserFeature, - useBrowserFeatureDetection, -} from "@core/hooks/useBrowserFeatureDetection.ts"; import { BLE } from "@components/PageComponents/Connect/BLE.tsx"; import { HTTP } from "@components/PageComponents/Connect/HTTP.tsx"; import { Serial } from "@components/PageComponents/Connect/Serial.tsx"; @@ -18,6 +14,10 @@ import { TabsList, TabsTrigger, } from "@components/UI/Tabs.tsx"; +import { + type BrowserFeature, + useBrowserFeatureDetection, +} from "@core/hooks/useBrowserFeatureDetection.ts"; import { AlertCircle } from "lucide-react"; import { Trans, useTranslation } from "react-i18next"; import { Link } from "../UI/Typography/Link.tsx"; @@ -45,24 +45,23 @@ interface FeatureErrorProps { const errors: Record = { "Web Bluetooth": { - href: - "https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API#browser_compatibility", + href: "https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API#browser_compatibility", i18nKey: "newDeviceDialog.validation.requiresWebBluetooth", }, "Web Serial": { - href: - "https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API#browser_compatibility", + href: "https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API#browser_compatibility", i18nKey: "newDeviceDialog.validation.requiresWebSerial", }, "Secure Context": { - href: - "https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts", + href: "https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts", i18nKey: "newDeviceDialog.validation.requiresSecureContext", }, }; const ErrorMessage = ({ missingFeatures, tabId }: FeatureErrorProps) => { - if (missingFeatures.length === 0) return null; + if (missingFeatures.length === 0) { + return null; + } const browserFeatures = missingFeatures.filter( (feature) => feature !== "Secure Context", @@ -70,11 +69,11 @@ const ErrorMessage = ({ missingFeatures, tabId }: FeatureErrorProps) => { const needsSecureContext = missingFeatures.includes("Secure Context"); const needsFeature = - (tabId === "BLE" && browserFeatures.includes("Web Bluetooth")) + tabId === "BLE" && browserFeatures.includes("Web Bluetooth") ? "Web Bluetooth" - : (tabId === "Serial" && browserFeatures.includes("Web Serial")) - ? "Web Serial" - : undefined; + : tabId === "Serial" && browserFeatures.includes("Web Serial") + ? "Web Serial" + : undefined; return (

@@ -97,9 +96,11 @@ const ErrorMessage = ({ missingFeatures, tabId }: FeatureErrorProps) => { {needsFeature && needsSecureContext && " "} {needsSecureContext && ( 0 - ? "newDeviceDialog.validation.additionallyRequiresSecureContext" - : "newDeviceDialog.validation.requiresSecureContext"} + i18nKey={ + browserFeatures.length > 0 + ? "newDeviceDialog.validation.additionallyRequiresSecureContext" + : "newDeviceDialog.validation.requiresSecureContext" + } components={{ "0": ( { ); }; -export const NewDeviceDialog = ({ - open, - onOpenChange, -}: NewDeviceProps) => { +export const NewDeviceDialog = ({ open, onOpenChange }: NewDeviceProps) => { const { t } = useTranslation("dialog"); const { unsupported } = useBrowserFeatureDetection(); @@ -135,14 +133,16 @@ export const NewDeviceDialog = ({ id: "BLE", label: t("newDeviceDialog.tabBluetooth"), element: BLE, - isDisabled: unsupported.includes("Web Bluetooth") || + isDisabled: + unsupported.includes("Web Bluetooth") || unsupported.includes("Secure Context"), }, { id: "Serial", label: t("newDeviceDialog.tabSerial"), element: Serial, - isDisabled: unsupported.includes("Web Serial") || + isDisabled: + unsupported.includes("Web Serial") || unsupported.includes("Secure Context"), }, ]; @@ -165,19 +165,11 @@ export const NewDeviceDialog = ({ {tabs.map((tab) => (
- {(tab.id !== "HTTP" && - tab.isDisabled) - ? ( - - ) - : ( - onOpenChange(false)} - /> - )} + {tab.id !== "HTTP" && tab.isDisabled ? ( + + ) : ( + onOpenChange(false)} /> + )}
))} diff --git a/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx b/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx index b9e3caad..eff2f756 100644 --- a/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx +++ b/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx @@ -1,22 +1,13 @@ -import { useEffect, useState } from "react"; -import { useAppStore } from "@core/stores/appStore.ts"; -import { useDevice } from "@core/stores/deviceStore.ts"; -import { Protobuf } from "@meshtastic/core"; -import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { DeviceImage } from "@components/generic/DeviceImage.tsx"; import { TimeAgo } from "@components/generic/TimeAgo.tsx"; import { Uptime } from "@components/generic/Uptime.tsx"; -import { toast } from "@core/hooks/useToast.ts"; -import { useFavoriteNode } from "@core/hooks/useFavoriteNode.ts"; -import { useIgnoreNode } from "@core/hooks/useIgnoreNode.ts"; -import { cn } from "@core/utils/cn.ts"; - import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@components/UI/Accordion.tsx"; +import { Button } from "@components/UI/Button.tsx"; import { Dialog, DialogClose, @@ -25,7 +16,23 @@ import { DialogHeader, DialogTitle, } from "@components/UI/Dialog.tsx"; -import { Button } from "@components/UI/Button.tsx"; +import { Separator } from "@components/UI/Seperator.tsx"; +import { + Tooltip, + TooltipArrow, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@components/UI/Tooltip.tsx"; +import { useFavoriteNode } from "@core/hooks/useFavoriteNode.ts"; +import { useIgnoreNode } from "@core/hooks/useIgnoreNode.ts"; +import { toast } from "@core/hooks/useToast.ts"; +import { useAppStore } from "@core/stores/appStore.ts"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { cn } from "@core/utils/cn.ts"; +import { Protobuf } from "@meshtastic/core"; +import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; +import { useNavigate } from "@tanstack/react-router"; import { BellIcon, BellOffIcon, @@ -35,16 +42,8 @@ import { TrashIcon, WaypointsIcon, } from "lucide-react"; -import { - Tooltip, - TooltipArrow, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@components/UI/Tooltip.tsx"; -import { Separator } from "@components/UI/Seperator.tsx"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useNavigate } from "@tanstack/react-router"; export interface NodeDetailsDialogProps { open: boolean; @@ -72,21 +71,29 @@ export const NodeDetailsDialog = ({ ); useEffect(() => { - if (!node) return; + if (!node) { + return; + } setIsFavoriteState(node?.isFavorite); setIsIgnoredState(node?.isIgnored); }, [node]); - if (!node) return; + if (!node) { + return; + } function handleDirectMessage() { - if (!node) return; + if (!node) { + return; + } navigate({ to: `/messages/direct/${node.num}` }); setDialogOpen("nodeDetails", false); } function handleRequestPosition() { - if (!node) return; + if (!node) { + return; + } toast({ title: t("toast.requestingPosition.title", { ns: "ui" }), @@ -94,13 +101,15 @@ export const NodeDetailsDialog = ({ connection?.requestPosition(node.num).then(() => toast({ title: t("toast.positionRequestSent.title", { ns: "ui" }), - }) + }), ); onOpenChange(false); } function handleTraceroute() { - if (!node) return; + if (!node) { + return; + } toast({ title: t("toast.sendingTraceroute.title", { ns: "ui" }), @@ -108,13 +117,15 @@ export const NodeDetailsDialog = ({ connection?.traceRoute(node.num).then(() => toast({ title: t("toast.tracerouteSent.title", { ns: "ui" }), - }) + }), ); onOpenChange(false); } function handleNodeRemove() { - if (!node) return; + if (!node) { + return; + } setNodeNumToBeRemoved(node?.num); setDialogOpen("nodeRemoval", true); @@ -122,14 +133,18 @@ export const NodeDetailsDialog = ({ } function handleToggleFavorite() { - if (!node) return; + if (!node) { + return; + } updateFavorite({ nodeNum: node.num, isFavorite: !isFavoriteState }); setIsFavoriteState(!isFavoriteState); } function handleToggleIgnored() { - if (!node) return; + if (!node) { + return; + } updateIgnored({ nodeNum: node.num, isIgnored: !isIgnoredState }); setIsIgnoredState(!isIgnoredState); @@ -202,7 +217,7 @@ export const NodeDetailsDialog = ({ )} /> -
+
@@ -255,7 +270,10 @@ export const NodeDetailsDialog = ({

{t("nodeDetails.details")}

-

{t("nodeDetails.nodeNumber")}{node.num}

+

+ {t("nodeDetails.nodeNumber")} + {node.num} +

{t("nodeDetails.nodeHexPrefix")} {numberToHexUnpadded(node.num)} @@ -268,21 +286,25 @@ export const NodeDetailsDialog = ({

{t("nodeDetails.lastHeard")} - {node.lastHeard === 0 - ? t("nodesTable.lastHeardStatus.never", { ns: "nodes" }) - : } + {node.lastHeard === 0 ? ( + t("nodesTable.lastHeardStatus.never", { ns: "nodes" }) + ) : ( + + )}

{t("nodeDetails.hardware")} - {(Protobuf.Mesh.HardwareModel[node.user?.hwModel ?? 0] ?? - t("unknown.shortName")) - .replace(/_/g, " ")} + {( + Protobuf.Mesh.HardwareModel[node.user?.hwModel ?? 0] ?? + t("unknown.shortName") + ).replace(/_/g, " ")}

@@ -293,36 +315,35 @@ export const NodeDetailsDialog = ({ {t("nodeDetails.position")}

- {node.position - ? ( - <> - {node.position.latitudeI && - node.position.longitudeI && ( -

- {t("locationResponse.coordinates")} - - {node.position.latitudeI / 1e7},{" "} - {node.position.longitudeI / 1e7} - -

- )} - {node.position.altitude && ( -

- {t("locationResponse.altitude")} - {node.position.altitude} - {t("unit.meter.one")} -

- )} - - ) - :

{t("unknown.shortName")}

} + {node.position ? ( + <> + {node.position.latitudeI && node.position.longitudeI && ( +

+ {t("locationResponse.coordinates")} + + {node.position.latitudeI / 1e7},{" "} + {node.position.longitudeI / 1e7} + +

+ )} + {node.position.altitude && ( +

+ {t("locationResponse.altitude")} + {node.position.altitude} + {t("unit.meter.one")} +

+ )} + + ) : ( +

{t("unknown.shortName")}

+ )} )} diff --git a/packages/web/src/components/Form/DynamicFormField.tsx b/packages/web/src/components/Form/DynamicFormField.tsx index 34508613..a5f0a60b 100644 --- a/packages/web/src/components/Form/DynamicFormField.tsx +++ b/packages/web/src/components/Form/DynamicFormField.tsx @@ -1,7 +1,3 @@ -import { - type MultiSelectFieldProps, - MultiSelectInput, -} from "./FormMultiSelect.tsx"; import { GenericInput, type InputFieldProps, @@ -19,6 +15,10 @@ import { ToggleInput, } from "@components/Form/FormToggle.tsx"; import type { Control, FieldValues } from "react-hook-form"; +import { + type MultiSelectFieldProps, + MultiSelectInput, +} from "./FormMultiSelect.tsx"; export type FieldProps = | InputFieldProps diff --git a/packages/web/src/components/Form/FormInput.tsx b/packages/web/src/components/Form/FormInput.tsx index 9a7d605d..74e69430 100644 --- a/packages/web/src/components/Form/FormInput.tsx +++ b/packages/web/src/components/Form/FormInput.tsx @@ -58,7 +58,9 @@ export function GenericInput({ return; } - if (field.inputChange) field.inputChange(e); + if (field.inputChange) { + field.inputChange(e); + } controllerField.onChange( field.type === "number" @@ -76,14 +78,17 @@ export function GenericInput({ extends BaseFormBuilderProps { type: "multiSelect"; @@ -15,9 +15,7 @@ export interface MultiSelectFieldProps extends BaseFormBuilderProps { isChecked: (name: string) => boolean; value: string[]; properties: BaseFormBuilderProps["properties"] & { - enumValue: - | { [s: string]: string | number } - | typeof FLAGS_CONFIG; + enumValue: { [s: string]: string | number } | typeof FLAGS_CONFIG; formatEnumName?: boolean; }; } @@ -39,7 +37,7 @@ export function MultiSelectInput({ ([key, configOrValue]) => { if (isNewConfigStructure) { const config = - configOrValue as typeof FLAGS_CONFIG[keyof typeof FLAGS_CONFIG]; + configOrValue as (typeof FLAGS_CONFIG)[keyof typeof FLAGS_CONFIG]; return { key, display: t(config.i18nKey), diff --git a/packages/web/src/components/Form/FormPasswordGenerator.tsx b/packages/web/src/components/Form/FormPasswordGenerator.tsx index ba919ead..d4543e74 100644 --- a/packages/web/src/components/Form/FormPasswordGenerator.tsx +++ b/packages/web/src/components/Form/FormPasswordGenerator.tsx @@ -2,11 +2,11 @@ import type { BaseFormBuilderProps, GenericFormElementProps, } from "@components/Form/DynamicForm.tsx"; -import type { ButtonVariant } from "../UI/Button.tsx"; import { Generator } from "@components/UI/Generator.tsx"; -import { Controller, type FieldValues, useFormContext } from "react-hook-form"; import { usePasswordVisibilityToggle } from "@core/hooks/usePasswordVisibilityToggle.ts"; import { useEffect } from "react"; +import { Controller, type FieldValues, useFormContext } from "react-hook-form"; +import type { ButtonVariant } from "../UI/Button.tsx"; export interface PasswordGeneratorProps extends BaseFormBuilderProps { type: "passwordGenerator"; @@ -38,24 +38,22 @@ export function PasswordGenerator({ useEffect(() => { trigger(field.name); - }, [field.devicePSKBitCount, field.name, trigger]); + }, [field.name, trigger]); return ( ( + render={({ field: { value, onChange, ...rest } }) => ( { - if (field.inputChange) field.inputChange(e); + if (field.inputChange) { + field.inputChange(e); + } onChange(e); }} selectChange={field.selectChange ?? (() => {})} diff --git a/packages/web/src/components/Form/FormSelect.tsx b/packages/web/src/components/Form/FormSelect.tsx index 3b4cce04..4b5638be 100644 --- a/packages/web/src/components/Form/FormSelect.tsx +++ b/packages/web/src/components/Form/FormSelect.tsx @@ -9,8 +9,8 @@ import { SelectTrigger, SelectValue, } from "@components/UI/Select.tsx"; -import { type FieldValues, useController } from "react-hook-form"; import { cn } from "@core/utils/cn.ts"; +import { type FieldValues, useController } from "react-hook-form"; export interface SelectFieldProps extends BaseFormBuilderProps { type: "select"; @@ -73,10 +73,14 @@ export function SelectInput({ if (field.validate) { const isValid = await field.validate(selectedKey); - if (!isValid) return; + if (!isValid) { + return; + } } - if (field.selectChange) field.selectChange(newValue, selectedKey); + if (field.selectChange) { + field.selectChange(newValue, selectedKey); + } onChange(Number.parseInt(newValue)); }; diff --git a/packages/web/src/components/Form/FormToggle.tsx b/packages/web/src/components/Form/FormToggle.tsx index 6351ef51..1a6bdd0b 100644 --- a/packages/web/src/components/Form/FormToggle.tsx +++ b/packages/web/src/components/Form/FormToggle.tsx @@ -3,8 +3,8 @@ import type { GenericFormElementProps, } from "@components/Form/DynamicForm.tsx"; import { Switch } from "@components/UI/Switch.tsx"; -import { Controller, type FieldValues } from "react-hook-form"; import { cn } from "@core/utils/cn.ts"; +import { Controller, type FieldValues } from "react-hook-form"; export interface ToggleFieldProps extends BaseFormBuilderProps { type: "toggle"; @@ -22,9 +22,7 @@ export function ToggleInput({ ( + render={({ field: { value, onChange, ...rest } }) => ( { diff --git a/packages/web/src/components/Form/createZodResolver.ts b/packages/web/src/components/Form/createZodResolver.ts index 09ca42bc..3deecbd4 100644 --- a/packages/web/src/components/Form/createZodResolver.ts +++ b/packages/web/src/components/Form/createZodResolver.ts @@ -1,4 +1,3 @@ -import type { ZodType } from "zod/v4"; import type { FieldError, FieldValues, @@ -6,6 +5,7 @@ import type { ResolverOptions, ResolverResult, } from "react-hook-form"; +import type { ZodType } from "zod/v4"; export function createZodResolver( schema: ZodType, @@ -32,18 +32,18 @@ export function createZodResolver( const { path, code, message, ...params } = issue; const key = path.join("."); - const suffix = "format" in params - ? params.format - : "origin" in params - ? params.origin - : "expected" in params - ? params.expected - : ""; + const suffix = + "format" in params + ? params.format + : "origin" in params + ? params.origin + : "expected" in params + ? params.expected + : ""; - const newCode = code.replace( - /_([a-z])/g, - (_, char) => char.toUpperCase(), - ) + (suffix ? `.${suffix}` : ""); + const newCode = + code.replace(/_([a-z])/g, (_, char) => char.toUpperCase()) + + (suffix ? `.${suffix}` : ""); const fieldError: FieldError & { params?: Record } = { type: newCode, diff --git a/packages/web/src/components/KeyBackupReminder.tsx b/packages/web/src/components/KeyBackupReminder.tsx index 32cacd1a..1edf3bca 100644 --- a/packages/web/src/components/KeyBackupReminder.tsx +++ b/packages/web/src/components/KeyBackupReminder.tsx @@ -11,6 +11,5 @@ export const KeyBackupReminder = () => { onAccept: () => setDialogOpen("pkiBackup", true), enabled: true, }); - // deno-lint-ignore jsx-no-useless-fragment - return <>; + return null; }; diff --git a/packages/web/src/components/LanguageSwitcher.tsx b/packages/web/src/components/LanguageSwitcher.tsx index 62a2b4cf..8dfc6377 100644 --- a/packages/web/src/components/LanguageSwitcher.tsx +++ b/packages/web/src/components/LanguageSwitcher.tsx @@ -1,7 +1,10 @@ -import { Check, Languages } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import { LangCode, supportedLanguages } from "@app/i18n-config.ts"; +import { type LangCode, supportedLanguages } from "@app/i18n-config.ts"; import useLang from "@core/hooks/useLang.ts"; +import { cn } from "@core/utils/cn.ts"; +import { Check, Languages } from "lucide-react"; +import { useCallback } from "react"; +import { useTranslation } from "react-i18next"; +import { Button } from "./UI/Button.tsx"; import { DropdownMenu, DropdownMenuContent, @@ -9,8 +12,6 @@ import { DropdownMenuTrigger, } from "./UI/DropdownMenu.tsx"; import { Subtle } from "./UI/Typography/Subtle.tsx"; -import { cn } from "@core/utils/cn.ts"; -import { Button } from "./UI/Button.tsx"; interface LanguageSwitcherProps { disableHover?: boolean; @@ -22,9 +23,12 @@ export default function LanguageSwitcher({ const { i18n } = useTranslation("ui"); const { set: setLanguage, currentLanguage } = useLang(); - const handleLanguageChange = async (languageCode: LangCode) => { - await setLanguage(languageCode, true); - }; + const handleLanguageChange = useCallback( + async (languageCode: LangCode) => { + await setLanguage(languageCode, true); + }, + [setLanguage], + ); return ( diff --git a/packages/web/src/components/Map.tsx b/packages/web/src/components/Map.tsx index a121fb6e..483538f6 100644 --- a/packages/web/src/components/Map.tsx +++ b/packages/web/src/components/Map.tsx @@ -1,25 +1,27 @@ +import { useTheme } from "@core/hooks/useTheme.ts"; +import { useEffect, useRef } from "react"; import MapGl, { AttributionControl, type MapRef, NavigationControl, ScaleControl, } from "react-map-gl/maplibre"; -import { useTheme } from "@core/hooks/useTheme.ts"; -import { useEffect, useRef } from "react"; interface MapProps { children?: React.ReactNode; onLoad?: (map: MapRef) => void; } -export const Map = ({ children, onLoad }: MapProps) => { +export const BaseMap = ({ children, onLoad }: MapProps) => { const { theme } = useTheme(); const darkMode = theme === "dark"; const mapRef = useRef(null); useEffect(() => { const map = mapRef.current; - if (map && onLoad) onLoad(map); + if (map && onLoad) { + onLoad(map); + } }, [onLoad]); return ( @@ -45,14 +47,12 @@ export const Map = ({ children, onLoad }: MapProps) => { }} /> {/* { Disabled for now until we can use i18n for the geolocate control} */} - { - /* */ - } + /> */} {children} diff --git a/packages/web/src/components/PageComponents/Channel.tsx b/packages/web/src/components/PageComponents/Channel.tsx index 1d7b3c01..40eb43a6 100644 --- a/packages/web/src/components/PageComponents/Channel.tsx +++ b/packages/web/src/components/PageComponents/Channel.tsx @@ -1,5 +1,6 @@ import { makeChannelSchema } from "@app/validation/channel.ts"; import { create } from "@bufbuild/protobuf"; +import { PkiRegenerateDialog } from "@components/Dialog/PkiRegenerateDialog.tsx"; import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useToast } from "@core/hooks/useToast.ts"; import { useDevice } from "@core/stores/deviceStore.ts"; @@ -8,8 +9,7 @@ import { fromByteArray, toByteArray } from "base64-js"; import cryptoRandomString from "crypto-random-string"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { PkiRegenerateDialog } from "@components/Dialog/PkiRegenerateDialog.tsx"; -import { infer as zodInfer } from "zod/v4"; +import type { infer as zodInfer } from "zod/v4"; export interface SettingsPanelProps { channel: Protobuf.Channel.Channel; @@ -20,9 +20,8 @@ export const Channel = ({ channel }: SettingsPanelProps) => { const { t } = useTranslation(["channels", "ui", "dialog"]); const { toast } = useToast(); - const [preSharedDialogOpen, setPreSharedDialogOpen] = useState( - false, - ); + const [preSharedDialogOpen, setPreSharedDialogOpen] = + useState(false); const [pass, setPass] = useState( fromByteArray(channel?.settings?.psk ?? new Uint8Array(0)), ); @@ -30,12 +29,9 @@ export const Channel = ({ channel }: SettingsPanelProps) => { channel?.settings?.psk.length ?? 16, ); - const ChannelValidationSchema = useMemo( - () => { - return makeChannelSchema(byteCount); - }, - [byteCount], - ); + const ChannelValidationSchema = useMemo(() => { + return makeChannelSchema(byteCount); + }, [byteCount]); type ChannelValidation = zodInfer; @@ -52,10 +48,12 @@ export const Channel = ({ channel }: SettingsPanelProps) => { }, }); connection?.setChannel(channel).then(() => { - console.debug(t("toast.savedChannel.title", { - ns: "ui", - channelName: channel.settings?.name, - })); + console.debug( + t("toast.savedChannel.title", { + ns: "ui", + channelName: channel.settings?.name, + }), + ); toast({ title: t("toast.savedChannel.title", { ns: "ui", @@ -108,7 +106,7 @@ export const Channel = ({ channel }: SettingsPanelProps) => { ...channel?.settings?.moduleSettings, positionPrecision: channel?.settings?.moduleSettings?.positionPrecision === - undefined + undefined ? 10 : channel?.settings?.moduleSettings?.positionPrecision, }, @@ -127,12 +125,13 @@ export const Channel = ({ channel }: SettingsPanelProps) => { disabled: channel.index === 0, description: t("role.description"), properties: { - enumValue: channel.index === 0 - ? { [t("role.options.primary")]: 1 } - : { - [t("role.options.disabled")]: 0, - [t("role.options.secondary")]: 2, - }, + enumValue: + channel.index === 0 + ? { [t("role.options.primary")]: 1 } + : { + [t("role.options.disabled")]: 0, + [t("role.options.secondary")]: 2, + }, }, }, { @@ -182,79 +181,36 @@ export const Channel = ({ channel }: SettingsPanelProps) => { label: t("positionPrecision.label"), description: t("positionPrecision.description"), properties: { - enumValue: config.display?.units === 0 - ? { - [t("positionPrecision.options.none")]: 0, - [ - t("positionPrecision.options.metric_km23") - ]: 10, - [ - t("positionPrecision.options.metric_km12") - ]: 11, - [ - t("positionPrecision.options.metric_km5_8") - ]: 12, - [ - t("positionPrecision.options.metric_km2_9") - ]: 13, - [ - t("positionPrecision.options.metric_km1_5") - ]: 14, - [ - t("positionPrecision.options.metric_m700") - ]: 15, - [ - t("positionPrecision.options.metric_m350") - ]: 16, - [ - t("positionPrecision.options.metric_m200") - ]: 17, - [ - t("positionPrecision.options.metric_m90") - ]: 18, - [ - t("positionPrecision.options.metric_m50") - ]: 19, - [ - t("positionPrecision.options.precise") - ]: 32, - } - : { - [t("positionPrecision.options.none")]: 0, - [ - t("positionPrecision.options.imperial_mi15") - ]: 10, - [ - t("positionPrecision.options.imperial_mi7_3") - ]: 11, - [ - t("positionPrecision.options.imperial_mi3_6") - ]: 12, - [ - t("positionPrecision.options.imperial_mi1_8") - ]: 13, - [ - t("positionPrecision.options.imperial_mi0_9") - ]: 14, - [ - t("positionPrecision.options.imperial_mi0_5") - ]: 15, - [ - t("positionPrecision.options.imperial_mi0_2") - ]: 16, - [ - t("positionPrecision.options.imperial_ft600") - ]: 17, - [ - t("positionPrecision.options.imperial_ft300") - ]: 18, - [ - t("positionPrecision.options.imperial_ft150") - ]: 19, - [ - t("positionPrecision.options.precise") - ]: 32, - }, + enumValue: + config.display?.units === 0 + ? { + [t("positionPrecision.options.none")]: 0, + [t("positionPrecision.options.metric_km23")]: 10, + [t("positionPrecision.options.metric_km12")]: 11, + [t("positionPrecision.options.metric_km5_8")]: 12, + [t("positionPrecision.options.metric_km2_9")]: 13, + [t("positionPrecision.options.metric_km1_5")]: 14, + [t("positionPrecision.options.metric_m700")]: 15, + [t("positionPrecision.options.metric_m350")]: 16, + [t("positionPrecision.options.metric_m200")]: 17, + [t("positionPrecision.options.metric_m90")]: 18, + [t("positionPrecision.options.metric_m50")]: 19, + [t("positionPrecision.options.precise")]: 32, + } + : { + [t("positionPrecision.options.none")]: 0, + [t("positionPrecision.options.imperial_mi15")]: 10, + [t("positionPrecision.options.imperial_mi7_3")]: 11, + [t("positionPrecision.options.imperial_mi3_6")]: 12, + [t("positionPrecision.options.imperial_mi1_8")]: 13, + [t("positionPrecision.options.imperial_mi0_9")]: 14, + [t("positionPrecision.options.imperial_mi0_5")]: 15, + [t("positionPrecision.options.imperial_mi0_2")]: 16, + [t("positionPrecision.options.imperial_ft600")]: 17, + [t("positionPrecision.options.imperial_ft300")]: 18, + [t("positionPrecision.options.imperial_ft150")]: 19, + [t("positionPrecision.options.precise")]: 32, + }, }, }, ], diff --git a/packages/web/src/components/PageComponents/Config/Bluetooth.tsx b/packages/web/src/components/PageComponents/Config/Bluetooth.tsx index 5d27c4a1..140eec8f 100644 --- a/packages/web/src/components/PageComponents/Config/Bluetooth.tsx +++ b/packages/web/src/components/PageComponents/Config/Bluetooth.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type BluetoothValidation, BluetoothValidationSchema, @@ -8,14 +9,16 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface BluetoothConfigProps { onFormInit: DynamicFormFormInit; } export const Bluetooth = ({ onFormInit }: BluetoothConfigProps) => { + useWaitForConfig({ configCase: "bluetooth" }); + const { config, setWorkingConfig, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); diff --git a/packages/web/src/components/PageComponents/Config/ConfigSuspender.tsx b/packages/web/src/components/PageComponents/Config/ConfigSuspender.tsx deleted file mode 100644 index 83eaa89d..00000000 --- a/packages/web/src/components/PageComponents/Config/ConfigSuspender.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { - useDevice, - ValidConfigType, - ValidModuleConfigType, -} from "@core/stores/deviceStore.ts"; -import { useEffect, useState } from "react"; - -export function ConfigSuspender({ - configCase, - moduleConfigCase, - children, -}: { - configCase?: ValidConfigType; - moduleConfigCase?: ValidModuleConfigType; - children: React.ReactNode; -}) { - const { config, moduleConfig } = useDevice(); - - let cfg = undefined; - if (configCase) { - cfg = config[configCase]; - } else if (moduleConfigCase) { - cfg = moduleConfig[moduleConfigCase]; - } else { - return children; - } - - const [ready, setReady] = useState(() => cfg !== undefined); - - useEffect(() => { - if (cfg !== undefined) setReady(true); - }, [cfg]); - - if (!ready) throw new Promise(() => {}); // triggers suspense fallback - - return children; -} diff --git a/packages/web/src/components/PageComponents/Config/Device/index.tsx b/packages/web/src/components/PageComponents/Config/Device/index.tsx index 2d1689b2..90fe85ae 100644 --- a/packages/web/src/components/PageComponents/Config/Device/index.tsx +++ b/packages/web/src/components/PageComponents/Config/Device/index.tsx @@ -1,22 +1,25 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type DeviceValidation, DeviceValidationSchema, } from "@app/validation/config/device.ts"; import { create } from "@bufbuild/protobuf"; +import { useUnsafeRolesDialog } from "@components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts"; import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; -import { Protobuf } from "@meshtastic/core"; -import { useUnsafeRolesDialog } from "@components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts"; -import { useTranslation } from "react-i18next"; import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { Protobuf } from "@meshtastic/core"; +import { useTranslation } from "react-i18next"; interface DeviceConfigProps { onFormInit: DynamicFormFormInit; } export const Device = ({ onFormInit }: DeviceConfigProps) => { + useWaitForConfig({ configCase: "device" }); + const { config, setWorkingConfig, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); @@ -113,8 +116,8 @@ export const Device = ({ onFormInit }: DeviceConfigProps) => { properties: { fieldLength: { max: 64, - currentValueLength: getEffectiveConfig("device")?.tzdef - ?.length, + currentValueLength: + getEffectiveConfig("device")?.tzdef?.length, showCharacterCount: true, }, }, diff --git a/packages/web/src/components/PageComponents/Config/Display.tsx b/packages/web/src/components/PageComponents/Config/Display.tsx index 42e0e546..a80b1b78 100644 --- a/packages/web/src/components/PageComponents/Config/Display.tsx +++ b/packages/web/src/components/PageComponents/Config/Display.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type DisplayValidation, DisplayValidationSchema, @@ -8,14 +9,15 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface DisplayConfigProps { onFormInit: DynamicFormFormInit; } export const Display = ({ onFormInit }: DisplayConfigProps) => { + useWaitForConfig({ configCase: "display" }); const { config, setWorkingConfig, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); diff --git a/packages/web/src/components/PageComponents/Config/LoRa.tsx b/packages/web/src/components/PageComponents/Config/LoRa.tsx index 251f2fcb..abbd8d89 100644 --- a/packages/web/src/components/PageComponents/Config/LoRa.tsx +++ b/packages/web/src/components/PageComponents/Config/LoRa.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type LoRaValidation, LoRaValidationSchema, @@ -8,14 +9,16 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface LoRaConfigProps { onFormInit: DynamicFormFormInit; } export const LoRa = ({ onFormInit }: LoRaConfigProps) => { + useWaitForConfig({ configCase: "lora" }); + const { config, setWorkingConfig, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); diff --git a/packages/web/src/components/PageComponents/Config/Network/index.tsx b/packages/web/src/components/PageComponents/Config/Network/index.tsx index 12e72362..7bb39fd5 100644 --- a/packages/web/src/components/PageComponents/Config/Network/index.tsx +++ b/packages/web/src/components/PageComponents/Config/Network/index.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type NetworkValidation, NetworkValidationSchema, @@ -8,18 +9,20 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { convertIntToIpAddress, convertIpAddressToInt, } from "@core/utils/ip.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface NetworkConfigProps { onFormInit: DynamicFormFormInit; } export const Network = ({ onFormInit }: NetworkConfigProps) => { + useWaitForConfig({ configCase: "network" }); + const { config, setWorkingConfig, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); @@ -72,24 +75,28 @@ export const Network = ({ onFormInit }: NetworkConfigProps) => { ), dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0), }, - enabledProtocols: config.network?.enabledProtocols ?? + enabledProtocols: + config.network?.enabledProtocols ?? Protobuf.Config.Config_NetworkConfig_ProtocolFlags.NO_BROADCAST, }} - values={{ - ...networkConfig, - ipv4Config: { - ip: convertIntToIpAddress(networkConfig?.ipv4Config?.ip ?? 0), - gateway: convertIntToIpAddress( - networkConfig?.ipv4Config?.gateway ?? 0, - ), - subnet: convertIntToIpAddress( - networkConfig?.ipv4Config?.subnet ?? 0, - ), - dns: convertIntToIpAddress(networkConfig?.ipv4Config?.dns ?? 0), - }, - enabledProtocols: networkConfig?.enabledProtocols ?? - Protobuf.Config.Config_NetworkConfig_ProtocolFlags.NO_BROADCAST, - } as NetworkValidation} + values={ + { + ...networkConfig, + ipv4Config: { + ip: convertIntToIpAddress(networkConfig?.ipv4Config?.ip ?? 0), + gateway: convertIntToIpAddress( + networkConfig?.ipv4Config?.gateway ?? 0, + ), + subnet: convertIntToIpAddress( + networkConfig?.ipv4Config?.subnet ?? 0, + ), + dns: convertIntToIpAddress(networkConfig?.ipv4Config?.dns ?? 0), + }, + enabledProtocols: + networkConfig?.enabledProtocols ?? + Protobuf.Config.Config_NetworkConfig_ProtocolFlags.NO_BROADCAST, + } as NetworkValidation + } fieldGroups={[ { label: t("network.title"), diff --git a/packages/web/src/components/PageComponents/Config/Position.tsx b/packages/web/src/components/PageComponents/Config/Position.tsx index d6fa1a05..ed052af9 100644 --- a/packages/web/src/components/PageComponents/Config/Position.tsx +++ b/packages/web/src/components/PageComponents/Config/Position.tsx @@ -1,7 +1,4 @@ -import { - type FlagName, - usePositionFlags, -} from "@core/hooks/usePositionFlags.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type PositionValidation, PositionValidationSchema, @@ -11,16 +8,22 @@ import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; +import { + type FlagName, + usePositionFlags, +} from "@core/hooks/usePositionFlags.ts"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useCallback } from "react"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface PositionConfigProps { onFormInit: DynamicFormFormInit; } export const Position = ({ onFormInit }: PositionConfigProps) => { + useWaitForConfig({ configCase: "position" }); + const { setWorkingConfig, config, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { flagsValue, activeFlags, toggleFlag, getAllFlags } = usePositionFlags( diff --git a/packages/web/src/components/PageComponents/Config/Power.tsx b/packages/web/src/components/PageComponents/Config/Power.tsx index c35c543d..61d4c680 100644 --- a/packages/web/src/components/PageComponents/Config/Power.tsx +++ b/packages/web/src/components/PageComponents/Config/Power.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type PowerValidation, PowerValidationSchema, @@ -8,14 +9,16 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface PowerConfigProps { onFormInit: DynamicFormFormInit; } export const Power = ({ onFormInit }: PowerConfigProps) => { + useWaitForConfig({ configCase: "power" }); + const { setWorkingConfig, config, getEffectiveConfig, removeWorkingConfig } = useDevice(); const { t } = useTranslation("deviceConfig"); diff --git a/packages/web/src/components/PageComponents/Config/Security/Security.tsx b/packages/web/src/components/PageComponents/Config/Security/Security.tsx index 911227b5..abdd7377 100644 --- a/packages/web/src/components/PageComponents/Config/Security/Security.tsx +++ b/packages/web/src/components/PageComponents/Config/Security/Security.tsx @@ -1,30 +1,33 @@ -import { PkiRegenerateDialog } from "@components/Dialog/PkiRegenerateDialog.tsx"; -import { ManagedModeDialog } from "@components/Dialog/ManagedModeDialog.tsx"; -import { - DynamicForm, - type DynamicFormFormInit, -} from "@components/Form/DynamicForm.tsx"; -import { useAppStore } from "@core/stores/appStore.ts"; -import { getX25519PrivateKey, getX25519PublicKey } from "@core/utils/x25519.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type ParsedSecurity, type RawSecurity, RawSecuritySchema, } from "@app/validation/config/security.ts"; -import { useEffect, useState } from "react"; import { create } from "@bufbuild/protobuf"; +import { ManagedModeDialog } from "@components/Dialog/ManagedModeDialog.tsx"; +import { PkiRegenerateDialog } from "@components/Dialog/PkiRegenerateDialog.tsx"; +import { createZodResolver } from "@components/Form/createZodResolver.ts"; +import { + DynamicForm, + type DynamicFormFormInit, +} from "@components/Form/DynamicForm.tsx"; +import { useAppStore } from "@core/stores/appStore.ts"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { getX25519PrivateKey, getX25519PublicKey } from "@core/utils/x25519.ts"; import { Protobuf } from "@meshtastic/core"; import { fromByteArray, toByteArray } from "base64-js"; -import { useTranslation } from "react-i18next"; +import { useEffect, useState } from "react"; import { type DefaultValues, useForm } from "react-hook-form"; -import { createZodResolver } from "@components/Form/createZodResolver.ts"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { useTranslation } from "react-i18next"; interface SecurityConfigProps { onFormInit: DynamicFormFormInit; } export const Security = ({ onFormInit }: SecurityConfigProps) => { + useWaitForConfig({ configCase: "security" }); + const { config, setWorkingConfig, @@ -43,19 +46,11 @@ export const Security = ({ onFormInit }: SecurityConfigProps) => { privateKey: fromByteArray( securityConfig?.privateKey ?? new Uint8Array(0), ), - publicKey: fromByteArray( - securityConfig?.publicKey ?? new Uint8Array(0), - ), + publicKey: fromByteArray(securityConfig?.publicKey ?? new Uint8Array(0)), adminKey: [ - fromByteArray( - securityConfig?.adminKey?.at(0) ?? new Uint8Array(0), - ), - fromByteArray( - securityConfig?.adminKey?.at(1) ?? new Uint8Array(0), - ), - fromByteArray( - securityConfig?.adminKey?.at(2) ?? new Uint8Array(0), - ), + fromByteArray(securityConfig?.adminKey?.at(0) ?? new Uint8Array(0)), + fromByteArray(securityConfig?.adminKey?.at(1) ?? new Uint8Array(0)), + fromByteArray(securityConfig?.adminKey?.at(2) ?? new Uint8Array(0)), ], }, }; @@ -73,15 +68,15 @@ export const Security = ({ onFormInit }: SecurityConfigProps) => { onFormInit?.(formMethods); }, [onFormInit, formMethods]); - const [privateKeyDialogOpen, setPrivateKeyDialogOpen] = useState( - false, - ); - const [managedModeDialogOpen, setManagedModeDialogOpen] = useState( - false, - ); + const [privateKeyDialogOpen, setPrivateKeyDialogOpen] = + useState(false); + const [managedModeDialogOpen, setManagedModeDialogOpen] = + useState(false); const onSubmit = (data: RawSecurity) => { - if (!formState.isReady) return; + if (!formState.isReady) { + return; + } const payload: ParsedSecurity = { ...data, diff --git a/packages/web/src/components/PageComponents/Connect/BLE.tsx b/packages/web/src/components/PageComponents/Connect/BLE.tsx index ca1dd326..20a27ee5 100644 --- a/packages/web/src/components/PageComponents/Connect/BLE.tsx +++ b/packages/web/src/components/PageComponents/Connect/BLE.tsx @@ -1,19 +1,17 @@ -import type { TabElementProps } from "../../Dialog/NewDeviceDialog.tsx"; -import { Button } from "@components/UI/Button.tsx"; import { Mono } from "@components/generic/Mono.tsx"; +import { Button } from "@components/UI/Button.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; +import { useMessageStore } from "@core/stores/messageStore/index.ts"; import { subscribeAll } from "@core/subscriptions.ts"; import { randId } from "@core/utils/randId.ts"; -import { TransportWebBluetooth } from "@meshtastic/transport-web-bluetooth"; import { MeshDevice } from "@meshtastic/core"; +import { TransportWebBluetooth } from "@meshtastic/transport-web-bluetooth"; import { useCallback, useEffect, useState } from "react"; -import { useMessageStore } from "@core/stores/messageStore/index.ts"; import { useTranslation } from "react-i18next"; +import type { TabElementProps } from "../../Dialog/NewDeviceDialog.tsx"; -export const BLE = ( - { closeDialog }: TabElementProps, -) => { +export const BLE = ({ closeDialog }: TabElementProps) => { const [connectionInProgress, setConnectionInProgress] = useState(false); const [bleDevices, setBleDevices] = useState([]); const { addDevice } = useDeviceStore(); @@ -77,10 +75,12 @@ export const BLE = ( if (exists === -1) { setBleDevices(bleDevices.concat(device)); } - }).catch((error: Error) => { + }) + .catch((error: Error) => { console.error("Error requesting device:", error); setConnectionInProgress(false); - }).finally(() => { + }) + .finally(() => { setConnectionInProgress(false); }); }} diff --git a/packages/web/src/components/PageComponents/Connect/HTTP.test.tsx b/packages/web/src/components/PageComponents/Connect/HTTP.test.tsx index 6ae11735..b8262c08 100644 --- a/packages/web/src/components/PageComponents/Connect/HTTP.test.tsx +++ b/packages/web/src/components/PageComponents/Connect/HTTP.test.tsx @@ -1,7 +1,7 @@ -import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { HTTP } from "@components/PageComponents/Connect/HTTP.tsx"; import { MeshDevice } from "@meshtastic/core"; import { TransportHTTP } from "@meshtastic/transport-http"; +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; vi.mock("@core/stores/appStore.ts", () => ({ @@ -35,8 +35,9 @@ describe("HTTP Component", () => { render(); expect(screen.getByText("IP Address/Hostname")).toBeInTheDocument(); expect(screen.getByRole("textbox")).toBeInTheDocument(); - expect(screen.getByPlaceholderText("000.000.000.000 / meshtastic.local")) - .toBeInTheDocument(); + expect( + screen.getByPlaceholderText("000.000.000.000 / meshtastic.local"), + ).toBeInTheDocument(); expect(screen.getByText("Use HTTPS")).toBeInTheDocument(); expect(screen.getByRole("button", { name: "Connect" })).toBeInTheDocument(); }); @@ -45,8 +46,9 @@ describe("HTTP Component", () => { render(); const inputField = screen.getByRole("textbox"); fireEvent.change(inputField, { target: { value: "meshtastic.local" } }); - expect(screen.getByPlaceholderText("000.000.000.000 / meshtastic.local")) - .toBeInTheDocument(); + expect( + screen.getByPlaceholderText("000.000.000.000 / meshtastic.local"), + ).toBeInTheDocument(); }); it("toggles HTTPS switch and updates prefix", () => { diff --git a/packages/web/src/components/PageComponents/Connect/HTTP.tsx b/packages/web/src/components/PageComponents/Connect/HTTP.tsx index d92733af..e3558648 100644 --- a/packages/web/src/components/PageComponents/Connect/HTTP.tsx +++ b/packages/web/src/components/PageComponents/Connect/HTTP.tsx @@ -1,19 +1,19 @@ import type { TabElementProps } from "@components/Dialog/NewDeviceDialog.tsx"; import { Button } from "@components/UI/Button.tsx"; import { Input } from "@components/UI/Input.tsx"; -import { Link } from "@components/UI/Typography/Link.tsx"; import { Label } from "@components/UI/Label.tsx"; import { Switch } from "@components/UI/Switch.tsx"; +import { Link } from "@components/UI/Typography/Link.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; +import { useMessageStore } from "@core/stores/messageStore/index.ts"; import { subscribeAll } from "@core/subscriptions.ts"; import { randId } from "@core/utils/randId.ts"; import { MeshDevice } from "@meshtastic/core"; import { TransportHTTP } from "@meshtastic/transport-http"; +import { AlertTriangle } from "lucide-react"; import { useState } from "react"; import { useController, useForm } from "react-hook-form"; -import { AlertTriangle } from "lucide-react"; -import { useMessageStore } from "@core/stores/messageStore/index.ts"; import { useTranslation } from "react-i18next"; interface FormData { @@ -21,9 +21,7 @@ interface FormData { tls: boolean; } -export const HTTP = ( - { closeDialog }: TabElementProps, -) => { +export const HTTP = ({ closeDialog }: TabElementProps) => { const { t } = useTranslation("dialog"); const [connectionInProgress, setConnectionInProgress] = useState(false); const isURLHTTPS = location.protocol === "https:"; @@ -35,11 +33,11 @@ export const HTTP = ( const { control, handleSubmit, register } = useForm({ defaultValues: { ip: ["client.meshtastic.org", "localhost"].includes( - globalThis.location.hostname, - ) + globalThis.location.hostname, + ) ? "meshtastic.local" : globalThis.location.host, - tls: isURLHTTPS ? true : false, + tls: !!isURLHTTPS, }, }); @@ -47,9 +45,10 @@ export const HTTP = ( field: { value: tlsValue, onChange: setTLS }, } = useController({ name: "tls", control }); - const [connectionError, setConnectionError] = useState< - { host: string; secure: boolean } | null - >(null); + const [connectionError, setConnectionError] = useState<{ + host: string; + secure: boolean; + } | null>(null); const onSubmit = handleSubmit(async (data) => { setConnectionInProgress(true); @@ -85,9 +84,11 @@ export const HTTP = (
)} -
diff --git a/packages/web/src/components/PageComponents/Messages/ChannelChat.tsx b/packages/web/src/components/PageComponents/Messages/ChannelChat.tsx index 2a326259..dcfc3e5a 100644 --- a/packages/web/src/components/PageComponents/Messages/ChannelChat.tsx +++ b/packages/web/src/components/PageComponents/Messages/ChannelChat.tsx @@ -1,6 +1,6 @@ import { MessageItem } from "@components/PageComponents/Messages/MessageItem.tsx"; +import type { Message } from "@core/stores/messageStore/types.ts"; import { InboxIcon } from "lucide-react"; -import { Message } from "@core/stores/messageStore/types.ts"; import { useTranslation } from "react-i18next"; export interface ChannelChatProps { diff --git a/packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx b/packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx index 35e1cdf2..2bdf10b7 100644 --- a/packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx +++ b/packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx @@ -41,10 +41,7 @@ export const MessageActionsMenu = ({ const iconSizeClass = "size-4"; return ( -
e.stopPropagation()} - > +
diff --git a/packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx b/packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx index 0ddb8531..9f3ca7ab 100644 --- a/packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx +++ b/packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx @@ -1,3 +1,4 @@ +import type { Types } from "@meshtastic/core"; import { act, fireEvent, @@ -6,13 +7,10 @@ import { waitFor, } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { MessageInput, MessageInputProps } from "./MessageInput.tsx"; -import { Types } from "@meshtastic/core"; +import { MessageInput, type MessageInputProps } from "./MessageInput.tsx"; vi.mock("@components/UI/Button.tsx", () => ({ - Button: vi.fn(( - { type, className, children, onClick, onSubmit, ...rest }, - ) => ( + Button: vi.fn(({ type, className, children, onClick, onSubmit, ...rest }) => (
diff --git a/packages/web/src/components/PageComponents/Messages/MessageItem.tsx b/packages/web/src/components/PageComponents/Messages/MessageItem.tsx index ee38e674..d7d3e921 100644 --- a/packages/web/src/components/PageComponents/Messages/MessageItem.tsx +++ b/packages/web/src/components/PageComponents/Messages/MessageItem.tsx @@ -1,3 +1,4 @@ +import { Avatar } from "@components/UI/Avatar.tsx"; import { Tooltip, TooltipArrow, @@ -6,18 +7,18 @@ import { TooltipTrigger, } from "@components/UI/Tooltip.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; -import { cn } from "@core/utils/cn.ts"; -import { Avatar } from "@components/UI/Avatar.tsx"; -import { AlertCircle, CheckCircle2, CircleEllipsis } from "lucide-react"; -import type { LucideIcon } from "lucide-react"; -import { ReactNode, useMemo } from "react"; import { MessageState, useMessageStore, } from "@core/stores/messageStore/index.ts"; -import { Protobuf, Types } from "@meshtastic/core"; -import { Message } from "@core/stores/messageStore/types.ts"; +import type { Message } from "@core/stores/messageStore/types.ts"; +import { cn } from "@core/utils/cn.ts"; +import { type Protobuf, Types } from "@meshtastic/core"; +import type { LucideIcon } from "lucide-react"; +import { AlertCircle, CheckCircle2, CircleEllipsis } from "lucide-react"; +import { type ReactNode, useMemo } from "react"; import { useTranslation } from "react-i18next"; + // import { MessageActionsMenu } from "@components/PageComponents/Messages/MessageActionsMenu.tsx"; // TODO: Uncomment when actions menu is implemented interface MessageStatusInfo { @@ -27,12 +28,13 @@ interface MessageStatusInfo { iconClassName?: string; } -const StatusTooltip = ( - { statusInfo, children }: { - statusInfo: MessageStatusInfo; - children: ReactNode; - }, -) => ( +const StatusTooltip = ({ + statusInfo, + children, +}: { + statusInfo: MessageStatusInfo; + children: ReactNode; +}) => ( {children} @@ -77,16 +79,20 @@ export const MessageItem = ({ message }: MessageItemProps) => { [t], ); - const UNKNOWN_STATUS = useMemo((): MessageStatusInfo => ({ - displayText: t("deliveryStatus.unknown.displayText"), - icon: AlertCircle, - ariaLabel: t("deliveryStatus.unknown.label"), - iconClassName: "text-red-500 dark:text-red-400", - }), [t]); + const UNKNOWN_STATUS = useMemo( + (): MessageStatusInfo => ({ + displayText: t("deliveryStatus.unknown.displayText"), + icon: AlertCircle, + ariaLabel: t("deliveryStatus.unknown.label"), + iconClassName: "text-red-500 dark:text-red-400", + }), + [t], + ); const getMessageStatusInfo = useMemo( - () => (state: MessageState): MessageStatusInfo => - MESSAGE_STATUS_MAP[state] ?? UNKNOWN_STATUS, + () => + (state: MessageState): MessageStatusInfo => + MESSAGE_STATUS_MAP[state] ?? UNKNOWN_STATUS, [MESSAGE_STATUS_MAP, UNKNOWN_STATUS], ); @@ -103,8 +109,8 @@ export const MessageItem = ({ message }: MessageItemProps) => { const longName = messageUser?.user?.longName; const derivedShortName = messageUser?.user?.shortName || fallbackName; const derivedDisplayName = longName || derivedShortName; - const isFavorite = messageUser?.num !== myNodeNum && - messageUser?.isFavorite; + const isFavorite = + messageUser?.num !== myNodeNum && messageUser?.isFavorite; return { displayName: derivedDisplayName, shortName: derivedShortName, @@ -116,7 +122,7 @@ export const MessageItem = ({ message }: MessageItemProps) => { const StatusIconComponent = messageStatusInfo.icon; const messageDate = useMemo( - () => message.date ? new Date(message.date) : null, + () => (message.date ? new Date(message.date) : null), [message.date], ); const locale = i18n.language; @@ -199,11 +205,9 @@ export const MessageItem = ({ message }: MessageItemProps) => {
{/* Actions Menu Placeholder */} - { - /*
+ {/*
console.log("Reply")} /> -
*/ - } +
*/} ); }; diff --git a/packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx b/packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx index 9a0f7298..8bab62bd 100644 --- a/packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx +++ b/packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx @@ -1,9 +1,9 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import { render, screen } from "@testing-library/react"; import { TraceRoute } from "@components/PageComponents/Messages/TraceRoute.tsx"; -import { useDevice } from "@core/stores/deviceStore.ts"; import { mockDeviceStore } from "@core/stores/deviceStore.mock.ts"; +import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; +import { render, screen } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("@core/stores/deviceStore"); @@ -18,7 +18,7 @@ describe("TraceRoute", () => { macaddr: new Uint8Array([0x01, 0x02, 0x03, 0x04]), id: "source-node", isLicensed: false, - role: Protobuf.Config.Config_DeviceConfig_Role["CLIENT"], + role: Protobuf.Config.Config_DeviceConfig_Role.CLIENT, } as Protobuf.Mesh.NodeInfo["user"], }; @@ -32,7 +32,7 @@ describe("TraceRoute", () => { macaddr: new Uint8Array([0x05, 0x06, 0x07, 0x08]), id: "destination-node", isLicensed: false, - role: Protobuf.Config.Config_DeviceConfig_Role["CLIENT"], + role: Protobuf.Config.Config_DeviceConfig_Role.CLIENT, } as Protobuf.Mesh.NodeInfo["user"], }; @@ -123,13 +123,7 @@ describe("TraceRoute", () => { }); it("renders '??' for missing SNR values", () => { - render( - , - ); + render(); expect(screen.getByText("Node A")).toBeInTheDocument(); // Check for translated '??' placeholder diff --git a/packages/web/src/components/PageComponents/Messages/TraceRoute.tsx b/packages/web/src/components/PageComponents/Messages/TraceRoute.tsx index a1d85aa6..7f9d2ee1 100644 --- a/packages/web/src/components/PageComponents/Messages/TraceRoute.tsx +++ b/packages/web/src/components/PageComponents/Messages/TraceRoute.tsx @@ -22,9 +22,7 @@ interface RoutePathProps { snr?: number[]; } -const RoutePath = ( - { title, from, to, path, snr }: RoutePathProps, -) => { +const RoutePath = ({ title, from, to, path, snr }: RoutePathProps) => { const { getNode } = useDevice(); const { t } = useTranslation(); diff --git a/packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx b/packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx index 50da8ec6..60f7339d 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx @@ -1,4 +1,4 @@ -import { useDevice } from "@core/stores/deviceStore.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type AmbientLightingValidation, AmbientLightingValidationSchema, @@ -8,17 +8,19 @@ import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface AmbientLightingModuleConfigProps { onFormInit: DynamicFormFormInit; } -export const AmbientLighting = ( - { onFormInit }: AmbientLightingModuleConfigProps, -) => { +export const AmbientLighting = ({ + onFormInit, +}: AmbientLightingModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "ambientLighting" }); const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx b/packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx index 7a6ead8e..031aef04 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type AudioValidation, AudioValidationSchema, @@ -8,15 +9,16 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface AudioModuleConfigProps { onFormInit: DynamicFormFormInit; } export const Audio = ({ onFormInit }: AudioModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "audio" }); const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx b/packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx index b0e075e8..68fb50f6 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type CannedMessageValidation, CannedMessageValidationSchema, @@ -8,17 +9,19 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface CannedMessageModuleConfigProps { onFormInit: DynamicFormFormInit; } -export const CannedMessage = ( - { onFormInit }: CannedMessageModuleConfigProps, -) => { +export const CannedMessage = ({ + onFormInit, +}: CannedMessageModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "cannedMessage" }); + const { moduleConfig, setWorkingModuleConfig, @@ -92,8 +95,9 @@ export const CannedMessage = ( label: t("cannedMessage.inputbrokerEventCw.label"), description: t("cannedMessage.inputbrokerEventCw.description"), properties: { - enumValue: Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: + Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { @@ -102,8 +106,9 @@ export const CannedMessage = ( label: t("cannedMessage.inputbrokerEventCcw.label"), description: t("cannedMessage.inputbrokerEventCcw.description"), properties: { - enumValue: Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: + Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { @@ -112,8 +117,9 @@ export const CannedMessage = ( label: t("cannedMessage.inputbrokerEventPress.label"), description: t("cannedMessage.inputbrokerEventPress.description"), properties: { - enumValue: Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: + Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { diff --git a/packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx b/packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx index 5d1fdb59..56c0410e 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx @@ -1,4 +1,4 @@ -import { useDevice } from "@core/stores/deviceStore.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type DetectionSensorValidation, DetectionSensorValidationSchema, @@ -8,17 +8,20 @@ import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface DetectionSensorModuleConfigProps { onFormInit: DynamicFormFormInit; } -export const DetectionSensor = ( - { onFormInit }: DetectionSensorModuleConfigProps, -) => { +export const DetectionSensor = ({ + onFormInit, +}: DetectionSensorModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "detectionSensor" }); + const { moduleConfig, setWorkingModuleConfig, @@ -135,8 +138,9 @@ export const DetectionSensor = ( }, ], properties: { - enumValue: Protobuf.ModuleConfig - .ModuleConfig_DetectionSensorConfig_TriggerType, + enumValue: + Protobuf.ModuleConfig + .ModuleConfig_DetectionSensorConfig_TriggerType, }, }, { diff --git a/packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx b/packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx index ff3141ea..2f40a610 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type ExternalNotificationValidation, ExternalNotificationValidationSchema, @@ -8,17 +9,19 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface ExternalNotificationModuleConfigProps { onFormInit: DynamicFormFormInit; } -export const ExternalNotification = ( - { onFormInit }: ExternalNotificationModuleConfigProps, -) => { +export const ExternalNotification = ({ + onFormInit, +}: ExternalNotificationModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "externalNotification" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx b/packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx index 6b6f4abd..a19e8e5f 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx @@ -1,4 +1,4 @@ -import { useDevice } from "@core/stores/deviceStore.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type MqttValidation, MqttValidationSchema, @@ -8,15 +8,18 @@ import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface MqttModuleConfigProps { onFormInit: DynamicFormFormInit; } export const MQTT = ({ onFormInit }: MqttModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "mqtt" }); + const { config, moduleConfig, @@ -55,10 +58,12 @@ export const MQTT = ({ onFormInit }: MqttModuleConfigProps) => { ) => { return cfg ? { - ...cfg, - mapReportSettings: cfg.mapReportSettings ?? - { publishIntervalSecs: 0, positionPrecision: 10 }, - } + ...cfg, + mapReportSettings: cfg.mapReportSettings ?? { + publishIntervalSecs: 0, + positionPrecision: 10, + }, + } : undefined; }; @@ -202,78 +207,77 @@ export const MQTT = ({ onFormInit }: MqttModuleConfigProps) => { { type: "select", name: "mapReportSettings.positionPrecision", - label: t( - "mqtt.mapReportSettings.positionPrecision.label", - ), + label: t("mqtt.mapReportSettings.positionPrecision.label"), description: t( "mqtt.mapReportSettings.positionPrecision.description", ), properties: { - enumValue: config.display?.units === 0 - ? { - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_km23") - ]: 10, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_km12") - ]: 11, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_km5_8") - ]: 12, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_km2_9") - ]: 13, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_km1_5") - ]: 14, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_m700") - ]: 15, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_m350") - ]: 16, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_m200") - ]: 17, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_m90") - ]: 18, - [ - t("mqtt.mapReportSettings.positionPrecision.options.metric_m50") - ]: 19, - } - : { - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi15") - ]: 10, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi7_3") - ]: 11, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi3_6") - ]: 12, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi1_8") - ]: 13, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_9") - ]: 14, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_5") - ]: 15, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_2") - ]: 16, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_ft600") - ]: 17, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_ft300") - ]: 18, - [ - t("mqtt.mapReportSettings.positionPrecision.options.imperial_ft150") - ]: 19, - }, + enumValue: + config.display?.units === 0 + ? { + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_km23", + )]: 10, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_km12", + )]: 11, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_km5_8", + )]: 12, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_km2_9", + )]: 13, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_km1_5", + )]: 14, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_m700", + )]: 15, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_m350", + )]: 16, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_m200", + )]: 17, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_m90", + )]: 18, + [t( + "mqtt.mapReportSettings.positionPrecision.options.metric_m50", + )]: 19, + } + : { + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi15", + )]: 10, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi7_3", + )]: 11, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi3_6", + )]: 12, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi1_8", + )]: 13, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_9", + )]: 14, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_5", + )]: 15, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_mi0_2", + )]: 16, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_ft600", + )]: 17, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_ft300", + )]: 18, + [t( + "mqtt.mapReportSettings.positionPrecision.options.imperial_ft150", + )]: 19, + }, }, disabledBy: [ { diff --git a/packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx b/packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx index 389c70bc..7f9757a2 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx @@ -1,4 +1,4 @@ -import { useDevice } from "@core/stores/deviceStore.ts"; +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type NeighborInfoValidation, NeighborInfoValidationSchema, @@ -8,15 +8,18 @@ import { DynamicForm, type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface NeighborInfoModuleConfigProps { onFormInit: DynamicFormFormInit; } export const NeighborInfo = ({ onFormInit }: NeighborInfoModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "neighborInfo" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx b/packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx index 45921d73..471f44a9 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type PaxcounterValidation, PaxcounterValidationSchema, @@ -8,15 +9,17 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface PaxcounterModuleConfigProps { onFormInit: DynamicFormFormInit; } export const Paxcounter = ({ onFormInit }: PaxcounterModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "paxcounter" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx b/packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx index fd18a110..273e4877 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type RangeTestValidation, RangeTestValidationSchema, @@ -8,21 +9,24 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface RangeTestModuleConfigProps { onFormInit: DynamicFormFormInit; } export const RangeTest = ({ onFormInit }: RangeTestModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "rangeTest" }); + const { moduleConfig, setWorkingModuleConfig, getEffectiveModuleConfig, removeWorkingModuleConfig, } = useDevice(); + const { t } = useTranslation("moduleConfig"); const onSubmit = (data: RangeTestValidation) => { diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx b/packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx index 9adcac16..8dcc7ef4 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type SerialValidation, SerialValidationSchema, @@ -8,15 +9,17 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface SerialModuleConfigProps { onFormInit: DynamicFormFormInit; } export const Serial = ({ onFormInit }: SerialModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "serial" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx b/packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx index 155c235a..af0a6aed 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type StoreForwardValidation, StoreForwardValidationSchema, @@ -8,15 +9,17 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface StoreForwardModuleConfigProps { onFormInit: DynamicFormFormInit; } export const StoreForward = ({ onFormInit }: StoreForwardModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "storeForward" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx b/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx index 0bb71134..3483bab9 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx +++ b/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx @@ -1,3 +1,4 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; import { type TelemetryValidation, TelemetryValidationSchema, @@ -8,15 +9,17 @@ import { type DynamicFormFormInit, } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; import { Protobuf } from "@meshtastic/core"; import { useTranslation } from "react-i18next"; -import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; interface TelemetryModuleConfigProps { onFormInit: DynamicFormFormInit; } export const Telemetry = ({ onFormInit }: TelemetryModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "telemetry" }); + const { moduleConfig, setWorkingModuleConfig, diff --git a/packages/web/src/components/PageLayout.tsx b/packages/web/src/components/PageLayout.tsx index 7a8c1eee..b2bc76c2 100644 --- a/packages/web/src/components/PageLayout.tsx +++ b/packages/web/src/components/PageLayout.tsx @@ -1,10 +1,10 @@ -import React from "react"; -import { cn } from "@core/utils/cn.ts"; -import { type LucideIcon } from "lucide-react"; +import { ErrorPage } from "@components/UI/ErrorPage.tsx"; import Footer from "@components/UI/Footer.tsx"; import { Spinner } from "@components/UI/Spinner.tsx"; +import { cn } from "@core/utils/cn.ts"; +import type { LucideIcon } from "lucide-react"; +import type React from "react"; import { ErrorBoundary } from "react-error-boundary"; -import { ErrorPage } from "@components/UI/ErrorPage.tsx"; export interface ActionItem { key: string; @@ -90,7 +90,9 @@ export const PageLayout = ({ aria-busy={action.isLoading} > {action.icon && - (action.isLoading ? : ( + (action.isLoading ? ( + + ) : ( diff --git a/packages/web/src/components/Sidebar.tsx b/packages/web/src/components/Sidebar.tsx index ddef36aa..8b7438d1 100644 --- a/packages/web/src/components/Sidebar.tsx +++ b/packages/web/src/components/Sidebar.tsx @@ -1,11 +1,13 @@ -import type React from "react"; -import { useEffect, useState, useTransition } from "react"; +import { SidebarButton } from "@components/UI/Sidebar/SidebarButton.tsx"; import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.tsx"; -import { Subtle } from "@components/UI/Typography/Subtle.tsx"; -import { useDevice } from "@core/stores/deviceStore.ts"; -import type { Page } from "@core/stores/deviceStore.ts"; import { Spinner } from "@components/UI/Spinner.tsx"; - +import { Subtle } from "@components/UI/Typography/Subtle.tsx"; +import { useAppStore } from "@core/stores/appStore.ts"; +import type { Page } from "@core/stores/deviceStore.ts"; +import { useDevice } from "@core/stores/deviceStore.ts"; +import { useSidebar } from "@core/stores/sidebarStore.tsx"; +import { cn } from "@core/utils/cn.ts"; +import { useLocation, useNavigate } from "@tanstack/react-router"; import { CircleChevronLeft, LayersIcon, @@ -15,13 +17,10 @@ import { SettingsIcon, UsersIcon, } from "lucide-react"; -import { cn } from "@core/utils/cn.ts"; -import { useSidebar } from "@core/stores/sidebarStore.tsx"; -import { useAppStore } from "@core/stores/appStore.ts"; -import { SidebarButton } from "@components/UI/Sidebar/SidebarButton.tsx"; +import type React from "react"; +import { useEffect, useState, useTransition } from "react"; import { useTranslation } from "react-i18next"; import { DeviceInfoPanel } from "./DeviceInfoPanel.tsx"; -import { useLocation, useNavigate } from "@tanstack/react-router"; export interface SidebarProps { children?: React.ReactNode; @@ -89,7 +88,7 @@ export const Sidebar = ({ children }: SidebarProps) => { const numUnread = [...unreadCounts.values()].reduce((sum, v) => sum + v, 0); const [displayedNodeCount, setDisplayedNodeCount] = useState(() => - Math.max(getNodesLength() - 1, 0) + Math.max(getNodesLength() - 1, 0), ); const [_, startNodeCountTransition] = useTransition(); @@ -189,37 +188,36 @@ export const Sidebar = ({ children }: SidebarProps) => {
- {myNode === undefined - ? ( -
- - - {t("loading")} - -
- ) - : ( - setCommandPaletteOpen(true)} - setDialogOpen={() => setDialogOpen("deviceName", true)} - user={{ - longName: myNode?.user?.longName ?? t("unknown.longName"), - shortName: myNode?.user?.shortName ?? t("unknown.shortName"), - }} - firmwareVersion={myMetadata?.firmwareVersion ?? - t("unknown.notAvailable")} - deviceMetrics={{ - batteryLevel: myNode.deviceMetrics?.batteryLevel, - voltage: myNode.deviceMetrics?.voltage, - }} - /> - )} + {myNode === undefined ? ( +
+ + + {t("loading")} + +
+ ) : ( + setCommandPaletteOpen(true)} + setDialogOpen={() => setDialogOpen("deviceName", true)} + user={{ + longName: myNode?.user?.longName ?? t("unknown.longName"), + shortName: myNode?.user?.shortName ?? t("unknown.shortName"), + }} + firmwareVersion={ + myMetadata?.firmwareVersion ?? t("unknown.notAvailable") + } + deviceMetrics={{ + batteryLevel: myNode.deviceMetrics?.batteryLevel, + voltage: myNode.deviceMetrics?.voltage, + }} + /> + )}
); diff --git a/packages/web/src/components/ThemeSwitcher.tsx b/packages/web/src/components/ThemeSwitcher.tsx index ab147ce2..f0900279 100644 --- a/packages/web/src/components/ThemeSwitcher.tsx +++ b/packages/web/src/components/ThemeSwitcher.tsx @@ -2,8 +2,8 @@ import { useTheme } from "@core/hooks/useTheme.ts"; import { cn } from "@core/utils/cn.ts"; import { Monitor, Moon, Sun } from "lucide-react"; import { useTranslation } from "react-i18next"; -import { Subtle } from "./UI/Typography/Subtle.tsx"; import { Button } from "./UI/Button.tsx"; +import { Subtle } from "./UI/Typography/Subtle.tsx"; type ThemePreference = "light" | "dark" | "system"; diff --git a/packages/web/src/components/UI/Avatar.tsx b/packages/web/src/components/UI/Avatar.tsx index f4192d64..2577eea4 100644 --- a/packages/web/src/components/UI/Avatar.tsx +++ b/packages/web/src/components/UI/Avatar.tsx @@ -1,5 +1,4 @@ -import { cn } from "@core/utils/cn.ts"; -import { LockKeyholeOpenIcon, StarIcon } from "lucide-react"; +import { getColorFromText, isLightColor } from "@app/core/utils/color"; import { Tooltip, TooltipArrow, @@ -7,15 +6,10 @@ import { TooltipProvider, TooltipTrigger, } from "@components/UI/Tooltip.tsx"; +import { cn } from "@core/utils/cn.ts"; +import { LockKeyholeOpenIcon, StarIcon } from "lucide-react"; import { useTranslation } from "react-i18next"; -type RGBColor = { - r: number; - g: number; - b: number; - a: number; -}; - interface AvatarProps { text: string | number; size?: "sm" | "lg"; @@ -24,49 +18,6 @@ interface AvatarProps { showFavorite?: boolean; } -class ColorUtils { - static hexToRgb(hex: number): RGBColor { - return { - r: (hex & 0xff0000) >> 16, - g: (hex & 0x00ff00) >> 8, - b: hex & 0x0000ff, - a: 255, - }; - } - - static rgbToHex(color: RGBColor): number { - return ( - (Math.round(color.a) << 24) | - (Math.round(color.r) << 16) | - (Math.round(color.g) << 8) | - Math.round(color.b) - ); - } - - static isLight(color: RGBColor): boolean { - const brightness = (color.r * 299 + color.g * 587 + color.b * 114) / 1000; - return brightness > 127.5; - } -} - -const getColorFromText = (text: string): RGBColor => { - if (!text) { - return { r: 0, g: 0, b: 0, a: 255 }; - } - let hash = 0; - for (let i = 0; i < text?.length; i++) { - hash = text.charCodeAt(i) + ((hash << 5) - hash); - hash |= 0; - } - - return { - r: (hash & 0xff0000) >> 16, - g: (hash & 0x00ff00) >> 8, - b: hash & 0x0000ff, - a: 255, - }; -}; - export const Avatar = ({ text, size = "sm", @@ -83,7 +34,7 @@ export const Avatar = ({ const safeText = text?.toString().toUpperCase(); const bgColor = getColorFromText(safeText); - const isLight = ColorUtils.isLight(bgColor); + const isLight = isLightColor(bgColor); const textColor = isLight ? "#000000" : "#FFFFFF"; const initials = safeText?.slice(0, 4) ?? t("unknown.shortName"); @@ -100,48 +51,42 @@ export const Avatar = ({ color: textColor, }} > - {showFavorite - ? ( - - - - - - {t("nodeDetail.favorite.label", { ns: "nodes" })} - - - - - ) - : null} - {showError - ? ( - - - - - - {t("nodeDetail.error.label", { ns: "nodes" })} - - - - - ) - : null} -

- {initials} -

+ {showFavorite ? ( + + + + + + {t("nodeDetail.favorite.label", { ns: "nodes" })} + + + + + ) : null} + {showError ? ( + + + + + + {t("nodeDetail.error.label", { ns: "nodes" })} + + + + + ) : null} +

{initials}

); }; diff --git a/packages/web/src/components/UI/Button.tsx b/packages/web/src/components/UI/Button.tsx index 905eca30..54cfcebb 100644 --- a/packages/web/src/components/UI/Button.tsx +++ b/packages/web/src/components/UI/Button.tsx @@ -1,6 +1,6 @@ -import { cva, type VariantProps } from "class-variance-authority"; -import * as React from "react"; import { cn } from "@core/utils/cn.ts"; +import { cva, type VariantProps } from "class-variance-authority"; +import type * as React from "react"; const buttonVariants = cva( "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 disabled:opacity-50 dark:focus:ring-slate-400 disabled:cursor-not-allowed dark:focus:ring-offset-slate-900 cursor-pointer", @@ -19,8 +19,7 @@ const buttonVariants = cva( "bg-slate-100 text-slate-700 hover:bg-slate-200 dark:bg-slate-500 dark:text-white dark:hover:bg-slate-400", ghost: "bg-transparent hover:bg-slate-100 dark:hover:bg-slate-800 dark:text-slate-100 dark:hover:text-slate-100 data-[state=open]:bg-transparent dark:data-[state=open]:bg-transparent", - link: - "bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent", + link: "bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent", }, size: { default: "h-10 py-2 px-4", @@ -39,8 +38,7 @@ const buttonVariants = cva( export type ButtonVariant = VariantProps["variant"]; export interface ButtonProps - extends - React.ButtonHTMLAttributes, + extends React.ButtonHTMLAttributes, VariantProps { icon?: React.ReactNode; iconAlignment?: "left" | "right"; diff --git a/packages/web/src/components/UI/Checkbox/Checkbox.test.tsx b/packages/web/src/components/UI/Checkbox/Checkbox.test.tsx index e7badabe..eab95fa7 100644 --- a/packages/web/src/components/UI/Checkbox/Checkbox.test.tsx +++ b/packages/web/src/components/UI/Checkbox/Checkbox.test.tsx @@ -1,17 +1,20 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import { Checkbox } from "@components/UI/Checkbox/index.tsx"; -import React from "react"; +import { cleanup, fireEvent, render, screen } from "@testing-library/react"; +import type React from "react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("@components/UI/Label.tsx", () => ({ - Label: ( - { children, className, htmlFor, id }: { - children: React.ReactNode; - className: string; - htmlFor: string; - id: string; - }, - ) => ( + Label: ({ + children, + className, + htmlFor, + id, + }: { + children: React.ReactNode; + className: string; + htmlFor: string; + id: string; + }) => (