From 1af1295b8f7624f5a8700f3380781541d0e81759 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Mon, 3 Nov 2025 20:24:24 -0500 Subject: [PATCH] feat(connections): Add connections page (replaces new device dialog) (#919) * feat(conn): add connection screen and logic * fixes from code review * force https * code review fixes * add http for self testing * enable deviceStore persistance * added translations * disabled feature flag * i18n updates * chore: add new folders to biome config (#910) * chore(i18n): New Crowdin Translations by GitHub Action (#908) Co-authored-by: Crowdin Bot * fix: use correct deprecated GPS coordinate format enum (#917) The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema. Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented. * style: fix line wrapping for GPS coordinate format enum (#918) - Split long enum reference across multiple lines to improve code readability - Maintains consistent code formatting standards without changing functionality * fix(core): ensure core package works in browser (#923) * fix(core): ensure core package works in browser * style(core): revert new line removal * fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) * feat(ui): Add UI library (#900) * feat: scaffold UI library * Update packages/ui/src/components/theme-provider.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add lock file * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * formatting/linting fixes * fixed some paring logic * fixed connection issue with serial --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot Co-authored-by: Kamil Dzieniszewski Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com> Co-authored-by: Ben Allfree Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .gitignore | 5 + packages/core/src/types.ts | 1 + packages/web/package.json | 9 +- .../i18n/locales/be-BY/connections.json | 10 + .../public/i18n/locales/be-BY/dashboard.json | 12 - .../web/public/i18n/locales/be-BY/ui.json | 453 ++++++------ .../i18n/locales/bg-BG/connections.json | 12 + .../public/i18n/locales/bg-BG/dashboard.json | 12 - .../web/public/i18n/locales/bg-BG/ui.json | 453 ++++++------ .../{dashboard.json => connections.json} | 0 .../web/public/i18n/locales/cs-CZ/ui.json | 453 ++++++------ .../{dashboard.json => connections.json} | 0 .../web/public/i18n/locales/en/common.json | 7 + .../public/i18n/locales/en/connections.json | 34 + .../web/public/i18n/locales/en/dashboard.json | 12 - .../web/public/i18n/locales/en/dialog.json | 116 +-- packages/web/public/i18n/locales/en/ui.json | 3 +- .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../{dashboard.json => connections.json} | 0 .../web/public/i18n/locales/zh-CN/ui.json | 453 ++++++------ packages/web/src/App.tsx | 13 +- .../Badge/ConnectionStatusBadge.tsx | 0 .../src/components/Badge/SupportedBadge.tsx | 19 + .../web/src/components/DeviceInfoPanel.tsx | 70 ++ .../AddConnectionDialog.tsx | 671 ++++++++++++++++++ .../Dialog/AddConnectionDialog/validation.ts | 27 + .../components/Dialog/DeviceNameDialog.tsx | 140 ---- .../src/components/Dialog/DialogManager.tsx | 7 - .../src/components/Dialog/ImportDialog.tsx | 2 +- .../PageComponents/Channels/Channel.tsx | 6 +- .../components/PageComponents/Connect/BLE.tsx | 104 --- .../PageComponents/Connect/HTTP.test.tsx | 103 --- .../PageComponents/Connect/HTTP.tsx | 172 ----- .../PageComponents/Connect/Serial.tsx | 116 --- .../Connections/ConnectionStatusBadge.tsx | 38 + packages/web/src/components/Sidebar.tsx | 10 + .../web/src/components/UI/AlertDialog.tsx | 149 ++++ packages/web/src/components/UI/Badge.tsx | 35 + packages/web/src/components/UI/Card.tsx | 85 +++ packages/web/src/components/UI/ErrorPage.tsx | 4 +- packages/web/src/core/hooks/useLRUList.ts | 232 ++++++ .../web/src/core/services/dev-overrides.ts | 1 - .../core/stores/deviceStore/changeRegistry.ts | 14 +- .../web/src/core/stores/deviceStore/index.ts | 63 +- .../web/src/core/stores/deviceStore/types.ts | 40 ++ packages/web/src/i18n-config.ts | 2 +- packages/web/src/pages/Connections/index.tsx | 411 +++++++++++ .../src/pages/Connections/useConnections.ts | 496 +++++++++++++ packages/web/src/pages/Connections/utils.ts | 84 +++ packages/web/src/pages/Dashboard/index.tsx | 93 --- packages/web/src/pages/Nodes/index.tsx | 4 +- packages/web/src/routes.tsx | 11 +- packages/web/src/tests/setup.ts | 6 +- packages/web/src/validation/config/user.ts | 8 +- packages/web/vite.config.ts | 9 +- pnpm-lock.yaml | 219 +++--- 69 files changed, 3628 insertions(+), 1881 deletions(-) create mode 100644 packages/web/public/i18n/locales/be-BY/connections.json delete mode 100644 packages/web/public/i18n/locales/be-BY/dashboard.json create mode 100644 packages/web/public/i18n/locales/bg-BG/connections.json delete mode 100644 packages/web/public/i18n/locales/bg-BG/dashboard.json rename packages/web/public/i18n/locales/cs-CZ/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/de-DE/{dashboard.json => connections.json} (100%) create mode 100644 packages/web/public/i18n/locales/en/connections.json delete mode 100644 packages/web/public/i18n/locales/en/dashboard.json rename packages/web/public/i18n/locales/es-ES/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/fi-FI/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/fr-FR/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/hu-HU/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/it-IT/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/ja-JP/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/ko-KR/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/nl-NL/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/pl-PL/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/pt-BR/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/pt-PT/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/sv-SE/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/tr-TR/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/uk-UA/{dashboard.json => connections.json} (100%) rename packages/web/public/i18n/locales/zh-CN/{dashboard.json => connections.json} (100%) create mode 100644 packages/web/src/components/Badge/ConnectionStatusBadge.tsx create mode 100644 packages/web/src/components/Badge/SupportedBadge.tsx create mode 100644 packages/web/src/components/Dialog/AddConnectionDialog/AddConnectionDialog.tsx create mode 100644 packages/web/src/components/Dialog/AddConnectionDialog/validation.ts delete mode 100644 packages/web/src/components/Dialog/DeviceNameDialog.tsx delete mode 100644 packages/web/src/components/PageComponents/Connect/BLE.tsx delete mode 100644 packages/web/src/components/PageComponents/Connect/HTTP.test.tsx delete mode 100644 packages/web/src/components/PageComponents/Connect/HTTP.tsx delete mode 100644 packages/web/src/components/PageComponents/Connect/Serial.tsx create mode 100644 packages/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx create mode 100644 packages/web/src/components/UI/AlertDialog.tsx create mode 100644 packages/web/src/components/UI/Badge.tsx create mode 100644 packages/web/src/components/UI/Card.tsx create mode 100644 packages/web/src/core/hooks/useLRUList.ts create mode 100644 packages/web/src/pages/Connections/index.tsx create mode 100644 packages/web/src/pages/Connections/useConnections.ts create mode 100644 packages/web/src/pages/Connections/utils.ts delete mode 100644 packages/web/src/pages/Dashboard/index.tsx diff --git a/.gitignore b/.gitignore index cb8f36f4..5c67a54a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,8 @@ npm/ **/LICENSE packages/protobufs/packages/ts/dist + +# Local dev certs +*.pem +*.crt +*.key \ No newline at end of file diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 751f4a6c..8f055d67 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -46,6 +46,7 @@ export enum DeviceStatusEnum { DeviceConnected = 5, DeviceConfiguring = 6, DeviceConfigured = 7, + DeviceError = 8, } export type LogEventPacket = LogEvent & { date: Date }; diff --git a/packages/web/package.json b/packages/web/package.json index 14897845..39ea2963 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -14,16 +14,17 @@ "homepage": "https://meshtastic.org", "scripts": { "preinstall": "npx only-allow pnpm", + "setup:certs": "mkcert localhost 127.0.0.1 ::1", "build": "vite build", - "build:analyze": "BUNDLE_ANALYZE=true bun run build", + "build:analyze": "BUNDLE_ANALYZE=true pnpm run build", "check": "biome check src/", "check:fix": "biome check --write src/", "dev": "vite", + "dev:https": "USE_HTTPS=true vite", "test": "vitest", - "ts:check": "bun run tsc --noEmit", + "typecheck": "pnpm run tsc --noEmit", "preview": "vite preview", "docker:build": "docker build -t meshtastic-web:latest -f ./infra/Containerfile .", - "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": { @@ -34,6 +35,7 @@ "@meshtastic/transport-web-serial": "workspace:*", "@noble/curves": "^1.9.2", "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", @@ -97,6 +99,7 @@ "@types/react-dom": "^19.2.0", "@types/serviceworker": "^0.0.158", "@types/w3c-web-serial": "^1.0.8", + "@vitejs/plugin-basic-ssl": "^2.1.0", "@vitejs/plugin-react": "^5.0.4", "autoprefixer": "^10.4.21", "gzipper": "^8.2.1", diff --git a/packages/web/public/i18n/locales/be-BY/connections.json b/packages/web/public/i18n/locales/be-BY/connections.json new file mode 100644 index 00000000..bc119e1b --- /dev/null +++ b/packages/web/public/i18n/locales/be-BY/connections.json @@ -0,0 +1,10 @@ +{ + "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/be-BY/dashboard.json b/packages/web/public/i18n/locales/be-BY/dashboard.json deleted file mode 100644 index 3a3cd869..00000000 --- a/packages/web/public/i18n/locales/be-BY/dashboard.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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/be-BY/ui.json b/packages/web/public/i18n/locales/be-BY/ui.json index 77436c05..277a515c 100644 --- a/packages/web/public/i18n/locales/be-BY/ui.json +++ b/packages/web/public/i18n/locales/be-BY/ui.json @@ -1,229 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Messages", - "map": "Map", - "settings": "Settings", - "channels": "Channels", - "radioConfig": "Radio Config", - "deviceConfig": "Device Config", - "moduleConfig": "Module Config", - "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}}" - } - } - }, - "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." - }, - "saveAllSuccess": { - "title": "Saved", - "description": "All configuration changes have 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 (%)", - "short": "Airtime Util. (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Voltage" - }, - "channelUtilization": { - "label": "Channel Utilization (%)", - "short": "Channel Util. (%)" - }, - "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", + "connectionsLink": "Return to the <0>connections", + "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/bg-BG/connections.json b/packages/web/public/i18n/locales/bg-BG/connections.json new file mode 100644 index 00000000..6ceb36fb --- /dev/null +++ b/packages/web/public/i18n/locales/bg-BG/connections.json @@ -0,0 +1,12 @@ +{ + "connections": { + "title": "Свързани устройства", + "description": "Управлявайте свързаните си устройства Meshtastic.", + "connectionType_ble": "BLE", + "connectionType_serial": "Серийна", + "connectionType_network": "Мрежа", + "noDevicesTitle": "Няма свързани устройства", + "noDevicesDescription": "Свържете ново устройство, за да започнете.", + "button_newConnection": "Нова връзка" + } +} diff --git a/packages/web/public/i18n/locales/bg-BG/dashboard.json b/packages/web/public/i18n/locales/bg-BG/dashboard.json deleted file mode 100644 index 4f1c9d39..00000000 --- a/packages/web/public/i18n/locales/bg-BG/dashboard.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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/ui.json b/packages/web/public/i18n/locales/bg-BG/ui.json index abb09c41..a63d6d3a 100644 --- a/packages/web/public/i18n/locales/bg-BG/ui.json +++ b/packages/web/public/i18n/locales/bg-BG/ui.json @@ -1,229 +1,228 @@ { - "navigation": { - "title": "Навигация", - "messages": "Съобщения", - "map": "Карта", - "settings": "Настройки", - "channels": "Канали", - "radioConfig": "Конфигурация на радиото", - "deviceConfig": "Конфигуриране на устройството", - "moduleConfig": "Конфигурация на модула", - "nodes": "Възли" - }, - "app": { - "title": "Meshtastic", - "logo": "Лого на Meshtastic" - }, - "sidebar": { - "collapseToggle": { - "button": { - "open": "Отваряне на страничната лента", - "close": "Затваряне на страничната лента" - } - }, - "deviceInfo": { - "volts": "{{voltage}} волта", - "firmware": { - "title": "Фърмуер", - "version": "v{{version}}", - "buildDate": "Дата на компилация: {{date}}" - } - } - }, - "batteryStatus": { - "charging": "{{level}}% зареждане", - "pluggedIn": "Включен в ел. мрежа", - "title": "Батерия" - }, - "search": { - "nodes": "Търсене на възли...", - "channels": "Търсене на канали...", - "commandPalette": "Търсене на команди..." - }, - "toast": { - "positionRequestSent": { - "title": "Заявката за позиция е изпратена." - }, - "requestingPosition": { - "title": "Запитване за позиция, моля изчакайте..." - }, - "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}} е запазена." - }, - "saveAllSuccess": { - "title": "Saved", - "description": "All configuration changes have been saved." - }, - "favoriteNode": { - "title": "{{action}} {{nodeName}} {{direction}} любими.", - "action": { - "added": "Добавен", - "removed": "Премахнат", - "to": "в", - "from": "от" - } - }, - "ignoreNode": { - "title": "{{action}} {{nodeName}} {{direction}} списък с игнорирани", - "action": { - "added": "Добавен", - "removed": "Премахнат", - "to": "в", - "from": "от" - } - } - }, - "notifications": { - "copied": { - "label": "Копирано!" - }, - "copyToClipboard": { - "label": "Копиране в клипборда" - }, - "hidePassword": { - "label": "Скриване на паролата" - }, - "showPassword": { - "label": "Показване на паролата" - }, - "deliveryStatus": { - "delivered": "Доставено", - "failed": "Неуспешна доставка", - "waiting": "Изчакване", - "unknown": "Неизвестно" - } - }, - "general": { - "label": "General" - }, - "hardware": { - "label": "Хардуер" - }, - "metrics": { - "label": "Метрики" - }, - "role": { - "label": "Роля" - }, - "filter": { - "label": "Филтър" - }, - "advanced": { - "label": "Разширени" - }, - "clearInput": { - "label": "Clear input" - }, - "resetFilters": { - "label": "Нулиране на филтрите" - }, - "nodeName": { - "label": "Име/номер на възел", - "placeholder": "Meshtastic 1234" - }, - "airtimeUtilization": { - "label": "Използване на ефира (%)", - "short": "Airtime Util. (%)" - }, - "batteryLevel": { - "label": "Ниво на батерията (%)", - "labelText": "Ниво на батерията (%): {{value}}" - }, - "batteryVoltage": { - "label": "Напрежение на батерията (V)", - "title": "Напрежение" - }, - "channelUtilization": { - "label": "Използване на канала (%)", - "short": "Channel Util. (%)" - }, - "hops": { - "direct": "Директно", - "label": "Брой хопове", - "text": "Брой хопове: {{value}}" - }, - "lastHeard": { - "label": "Последно чут", - "labelText": "Последно чут: {{value}}", - "nowLabel": "Сега" - }, - "snr": { - "label": "SNR (db)" - }, - "favorites": { - "label": "Любими" - }, - "hide": { - "label": "Скриване" - }, - "showOnly": { - "label": "Показване само" - }, - "viaMqtt": { - "label": "Свързан чрез MQTT" - }, - "hopsUnknown": { - "label": "Неизвестен брой хопове" - }, - "showUnheard": { - "label": "Никога не е чуван" - }, - "language": { - "label": "Език", - "changeLanguage": "Промяна на езика" - }, - "theme": { - "dark": "Тъмна", - "light": "Светла", - "system": "Автоматично", - "changeTheme": "Промяна на цветовата схема" - }, - "errorPage": { - "title": "Това е малко смущаващо...", - "description1": "Наистина съжаляваме, но възникна грешка в web клиента, която доведе до срив.
Това не би трябвало да се случва и работим усилено, за да го поправим.", - "description2": "Най-добрият начин да предотвратите това да се случи отново с вас или с някой друг е да ни съобщите за проблема.", - "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": "Заявката за позиция е изпратена." + }, + "requestingPosition": { + "title": "Запитване за позиция, моля изчакайте..." + }, + "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}} любими.", + "action": { + "added": "Добавен", + "removed": "Премахнат", + "to": "в", + "from": "от" + } + }, + "ignoreNode": { + "title": "{{action}} {{nodeName}} {{direction}} списък с игнорирани", + "action": { + "added": "Добавен", + "removed": "Премахнат", + "to": "в", + "from": "от" + } + } + }, + "notifications": { + "copied": { + "label": "Копирано!" + }, + "copyToClipboard": { + "label": "Копиране в клипборда" + }, + "hidePassword": { + "label": "Скриване на паролата" + }, + "showPassword": { + "label": "Показване на паролата" + }, + "deliveryStatus": { + "delivered": "Доставено", + "failed": "Неуспешна доставка", + "waiting": "Изчакване", + "unknown": "Неизвестно" + } + }, + "general": { + "label": "General" + }, + "hardware": { + "label": "Хардуер" + }, + "metrics": { + "label": "Метрики" + }, + "role": { + "label": "Роля" + }, + "filter": { + "label": "Филтър" + }, + "advanced": { + "label": "Разширени" + }, + "clearInput": { + "label": "Clear input" + }, + "resetFilters": { + "label": "Нулиране на филтрите" + }, + "nodeName": { + "label": "Име/номер на възел", + "placeholder": "Meshtastic 1234" + }, + "airtimeUtilization": { + "label": "Използване на ефира (%)" + }, + "batteryLevel": { + "label": "Ниво на батерията (%)", + "labelText": "Ниво на батерията (%): {{value}}" + }, + "batteryVoltage": { + "label": "Напрежение на батерията (V)", + "title": "Напрежение" + }, + "channelUtilization": { + "label": "Използване на канала (%)" + }, + "hops": { + "direct": "Директно", + "label": "Брой хопове", + "text": "Брой хопове: {{value}}" + }, + "lastHeard": { + "label": "Последно чут", + "labelText": "Последно чут: {{value}}", + "nowLabel": "Сега" + }, + "snr": { + "label": "SNR (db)" + }, + "favorites": { + "label": "Любими" + }, + "hide": { + "label": "Скриване" + }, + "showOnly": { + "label": "Показване само" + }, + "viaMqtt": { + "label": "Свързан чрез MQTT" + }, + "hopsUnknown": { + "label": "Неизвестен брой хопове" + }, + "showUnheard": { + "label": "Никога не е чуван" + }, + "language": { + "label": "Език", + "changeLanguage": "Промяна на езика" + }, + "theme": { + "dark": "Тъмна", + "light": "Светла", + "system": "Автоматично", + "changeTheme": "Промяна на цветовата схема" + }, + "errorPage": { + "title": "Това е малко смущаващо...", + "description1": "Наистина съжаляваме, но възникна грешка в web клиента, която доведе до срив.
Това не би трябвало да се случва и работим усилено, за да го поправим.", + "description2": "Най-добрият начин да предотвратите това да се случи отново с вас или с някой друг е да ни съобщите за проблема.", + "reportInstructions": "Моля, включете следната информация в доклада си:", + "reportSteps": { + "step1": "Какво правехте, когато възникна грешката", + "step2": "Какво очаквахте да се случи", + "step3": "Какво всъщност се случи", + "step4": "Всяка друга подходяща информация" + }, + "reportLink": "Можете да съобщите за проблема в нашия <0>GitHub", + "connectionsLink": "Връщане към <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/dashboard.json b/packages/web/public/i18n/locales/cs-CZ/connections.json similarity index 100% rename from packages/web/public/i18n/locales/cs-CZ/dashboard.json rename to packages/web/public/i18n/locales/cs-CZ/connections.json diff --git a/packages/web/public/i18n/locales/cs-CZ/ui.json b/packages/web/public/i18n/locales/cs-CZ/ui.json index a31f2fee..c609446a 100644 --- a/packages/web/public/i18n/locales/cs-CZ/ui.json +++ b/packages/web/public/i18n/locales/cs-CZ/ui.json @@ -1,229 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "Zprávy", - "map": "Mapa", - "settings": "Nastavení", - "channels": "Kanály", - "radioConfig": "Radio Config", - "deviceConfig": "Nastavení zařízení", - "moduleConfig": "Module Config", - "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}}" - } - } - }, - "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." - }, - "saveAllSuccess": { - "title": "Saved", - "description": "All configuration changes have 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 (%)", - "short": "Airtime Util. (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "Napětí" - }, - "channelUtilization": { - "label": "Channel Utilization (%)", - "short": "Channel Util. (%)" - }, - "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", + "connectionsLink": "Return to the <0>connections", + "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/dashboard.json b/packages/web/public/i18n/locales/de-DE/connections.json similarity index 100% rename from packages/web/public/i18n/locales/de-DE/dashboard.json rename to packages/web/public/i18n/locales/de-DE/connections.json diff --git a/packages/web/public/i18n/locales/en/common.json b/packages/web/public/i18n/locales/en/common.json index 6c25fc9f..db09d144 100644 --- a/packages/web/public/i18n/locales/en/common.json +++ b/packages/web/public/i18n/locales/en/common.json @@ -1,14 +1,18 @@ { "button": { "apply": "Apply", + "addConnection": "Add Connection", + "saveConnection": "Save connection", "backupKey": "Backup Key", "cancel": "Cancel", + "connect": "Connect", "clearMessages": "Clear Messages", "close": "Close", "confirm": "Confirm", "delete": "Delete", "dismiss": "Dismiss", "download": "Download", + "disconnect": "Disconnect", "export": "Export", "generate": "Generate", "regenerate": "Regenerate", @@ -21,7 +25,10 @@ "requestNewKeys": "Request New Keys", "requestPosition": "Request Position", "reset": "Reset", + "retry": "Retry", "save": "Save", + "setDefault": "Set as default", + "unsetDefault": "Unset default", "scanQr": "Scan QR Code", "traceRoute": "Trace Route", "submit": "Submit" diff --git a/packages/web/public/i18n/locales/en/connections.json b/packages/web/public/i18n/locales/en/connections.json new file mode 100644 index 00000000..d8679be5 --- /dev/null +++ b/packages/web/public/i18n/locales/en/connections.json @@ -0,0 +1,34 @@ +{ + "page": { + "title": "Connect to a Meshtastic device", + "description": "Add a device connection via HTTP, Bluetooth, or Serial. Your saved connections will be saved in your browser." + }, + "connectionType_ble": "BLE", + "connectionType_serial": "Serial", + "connectionType_network": "Network", + "deleteConnection": "Delete connection", + "areYouSure": "This will remove {{name}}. You canot undo this action.", + "moreActions": "More actions", + "noConnections": { + "title": "No connections yet.", + "description": "Create your first connection. It will connect immediately and be saved for later." + }, + "lastConnectedAt": "Last connected: {{date}}", + "neverConnected": "Never connected", + "toasts": { + "connected": "Connected", + "nowConnected": "{{name}} is now connected", + "nowDisconnected": "{{name}} are now disconnecte", + "disconnected": "Disconnected", + "failed": "Failed to connect", + "checkConnetion": "Check your device or settings and try again", + "defaultSet": "Default set", + "defaultConnection": "Default connection is now {{nameisconnected}}", + "deleted": "Deleted", + "deletedByName": "{{name}} was removed", + "pickConnectionAgain": "Could not connect. You may need to reselect the device/port.", + "added": "Connection added", + "savedByName": "{{name}} saved.", + "savedCantConnect": "The connection was saved but could not connect." + } +} diff --git a/packages/web/public/i18n/locales/en/dashboard.json b/packages/web/public/i18n/locales/en/dashboard.json deleted file mode 100644 index 3a3cd869..00000000 --- a/packages/web/public/i18n/locales/en/dashboard.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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/dialog.json b/packages/web/public/i18n/locales/en/dialog.json index 4ffc3ac2..be5366dd 100644 --- a/packages/web/public/i18n/locales/en/dialog.json +++ b/packages/web/public/i18n/locales/en/dialog.json @@ -3,18 +3,6 @@ "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": "Import a Channel Set from a Meshtastic URL.
Valid Meshtasic URLs start with \"https://meshtastic.org/e/...\"", "error": { @@ -41,49 +29,77 @@ "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" - }, + "addConnection": { + "title": "Add connection", + "description": "Choose a connection type and fill in the details", "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." + }, + "bluetoothConnection": { + "namePlaceholder": "My Bluetooth Node", + "supported": { + "title": "Web Bluetooth supported" + }, + "notSupported": { + "title": "Web Bluetooth not supported", + "description": "Your browser or device does not support Web Bluetooth" + }, + "short": "BT: {{deviceName}}", + "long": "Bluetooth Device", + "device": "Device", + "selectDevice": "Select device", + "selected": "Bluetooth device selected", + "notSelected": "No device selected", + "helperText": "Uses the Meshtastic Bluetooth service for discovery." + }, + "serialConnection": { + "namePlaceholder": "My Serial Node", + "helperText": "Selecting a port grants permission so the app can open it to connect.", + "supported": { + "title": "Web Serial supported" + }, + "notSupported": { + "title": "Web Serial not supported", + "description": "Your browser or device does not support Web Serial" + }, + "portSelected": { + "title": "Serial port selected", + "description": "Port permissions granted." + }, + "port": "Port", + "selectPort": "Select port", + "deviceName": "USB {{vendorId}}:{{productId}}", + "notSelected": "No port selected" + }, + "httpConnection": { + "namePlaceholder": "My HTTP Node", + "inputPlaceholder": "192.168.1.10 or meshtastic.local", + "heading": "URL or IP", + "useHttps": "Use HTTTPS", + "invalidUrl": { + "title": "Invalid URL", + "description": "Please enter a valid HTTP or HTTPS URL." + }, + "connectionTest": { + "description": "Test the connetion before saving to verify the device is reachable.", + "button": { + "loading": "Testing...", + "label": "Test connection" + }, + "reachable": "Reachable", + "notReachable": "Not reachable", + "success": { + "title": "Connection test successful", + "description": "The device appears to be reachable." + }, + "failure": { + "title": "Connection test failed", + "description": "Could not reach the device. Check the URL and try again." + } + } } }, "nodeDetails": { diff --git a/packages/web/public/i18n/locales/en/ui.json b/packages/web/public/i18n/locales/en/ui.json index 18ea8092..00d3bd5f 100644 --- a/packages/web/public/i18n/locales/en/ui.json +++ b/packages/web/public/i18n/locales/en/ui.json @@ -8,6 +8,7 @@ "radioConfig": "Radio Config", "deviceConfig": "Device Config", "moduleConfig": "Module Config", + "manageConnections": "Manage Connections", "nodes": "Nodes" }, "app": { @@ -202,7 +203,7 @@ "step4": "Any other relevant information" }, "reportLink": "You can report the issue to our <0>GitHub", - "dashboardLink": "Return to the <0>dashboard", + "connectionsLink": "Return to the <0>connections", "detailsSummary": "Error Details", "errorMessageLabel": "Error message:", "stackTraceLabel": "Stack trace:", diff --git a/packages/web/public/i18n/locales/es-ES/dashboard.json b/packages/web/public/i18n/locales/es-ES/connections.json similarity index 100% rename from packages/web/public/i18n/locales/es-ES/dashboard.json rename to packages/web/public/i18n/locales/es-ES/connections.json diff --git a/packages/web/public/i18n/locales/fi-FI/dashboard.json b/packages/web/public/i18n/locales/fi-FI/connections.json similarity index 100% rename from packages/web/public/i18n/locales/fi-FI/dashboard.json rename to packages/web/public/i18n/locales/fi-FI/connections.json diff --git a/packages/web/public/i18n/locales/fr-FR/dashboard.json b/packages/web/public/i18n/locales/fr-FR/connections.json similarity index 100% rename from packages/web/public/i18n/locales/fr-FR/dashboard.json rename to packages/web/public/i18n/locales/fr-FR/connections.json diff --git a/packages/web/public/i18n/locales/hu-HU/dashboard.json b/packages/web/public/i18n/locales/hu-HU/connections.json similarity index 100% rename from packages/web/public/i18n/locales/hu-HU/dashboard.json rename to packages/web/public/i18n/locales/hu-HU/connections.json diff --git a/packages/web/public/i18n/locales/it-IT/dashboard.json b/packages/web/public/i18n/locales/it-IT/connections.json similarity index 100% rename from packages/web/public/i18n/locales/it-IT/dashboard.json rename to packages/web/public/i18n/locales/it-IT/connections.json diff --git a/packages/web/public/i18n/locales/ja-JP/dashboard.json b/packages/web/public/i18n/locales/ja-JP/connections.json similarity index 100% rename from packages/web/public/i18n/locales/ja-JP/dashboard.json rename to packages/web/public/i18n/locales/ja-JP/connections.json diff --git a/packages/web/public/i18n/locales/ko-KR/dashboard.json b/packages/web/public/i18n/locales/ko-KR/connections.json similarity index 100% rename from packages/web/public/i18n/locales/ko-KR/dashboard.json rename to packages/web/public/i18n/locales/ko-KR/connections.json diff --git a/packages/web/public/i18n/locales/nl-NL/dashboard.json b/packages/web/public/i18n/locales/nl-NL/connections.json similarity index 100% rename from packages/web/public/i18n/locales/nl-NL/dashboard.json rename to packages/web/public/i18n/locales/nl-NL/connections.json diff --git a/packages/web/public/i18n/locales/pl-PL/dashboard.json b/packages/web/public/i18n/locales/pl-PL/connections.json similarity index 100% rename from packages/web/public/i18n/locales/pl-PL/dashboard.json rename to packages/web/public/i18n/locales/pl-PL/connections.json diff --git a/packages/web/public/i18n/locales/pt-BR/dashboard.json b/packages/web/public/i18n/locales/pt-BR/connections.json similarity index 100% rename from packages/web/public/i18n/locales/pt-BR/dashboard.json rename to packages/web/public/i18n/locales/pt-BR/connections.json diff --git a/packages/web/public/i18n/locales/pt-PT/dashboard.json b/packages/web/public/i18n/locales/pt-PT/connections.json similarity index 100% rename from packages/web/public/i18n/locales/pt-PT/dashboard.json rename to packages/web/public/i18n/locales/pt-PT/connections.json diff --git a/packages/web/public/i18n/locales/sv-SE/dashboard.json b/packages/web/public/i18n/locales/sv-SE/connections.json similarity index 100% rename from packages/web/public/i18n/locales/sv-SE/dashboard.json rename to packages/web/public/i18n/locales/sv-SE/connections.json diff --git a/packages/web/public/i18n/locales/tr-TR/dashboard.json b/packages/web/public/i18n/locales/tr-TR/connections.json similarity index 100% rename from packages/web/public/i18n/locales/tr-TR/dashboard.json rename to packages/web/public/i18n/locales/tr-TR/connections.json diff --git a/packages/web/public/i18n/locales/uk-UA/dashboard.json b/packages/web/public/i18n/locales/uk-UA/connections.json similarity index 100% rename from packages/web/public/i18n/locales/uk-UA/dashboard.json rename to packages/web/public/i18n/locales/uk-UA/connections.json diff --git a/packages/web/public/i18n/locales/zh-CN/dashboard.json b/packages/web/public/i18n/locales/zh-CN/connections.json similarity index 100% rename from packages/web/public/i18n/locales/zh-CN/dashboard.json rename to packages/web/public/i18n/locales/zh-CN/connections.json diff --git a/packages/web/public/i18n/locales/zh-CN/ui.json b/packages/web/public/i18n/locales/zh-CN/ui.json index 21652d5b..52ce6497 100644 --- a/packages/web/public/i18n/locales/zh-CN/ui.json +++ b/packages/web/public/i18n/locales/zh-CN/ui.json @@ -1,229 +1,228 @@ { - "navigation": { - "title": "Navigation", - "messages": "消息", - "map": "地图", - "settings": "设置", - "channels": "频道", - "radioConfig": "Radio Config", - "deviceConfig": "设备配置", - "moduleConfig": "Module Config", - "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}}" - } - } - }, - "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." - }, - "saveAllSuccess": { - "title": "Saved", - "description": "All configuration changes have 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 (%)", - "short": "Airtime Util. (%)" - }, - "batteryLevel": { - "label": "Battery level (%)", - "labelText": "Battery level (%): {{value}}" - }, - "batteryVoltage": { - "label": "Battery voltage (V)", - "title": "电压" - }, - "channelUtilization": { - "label": "Channel Utilization (%)", - "short": "Channel Util. (%)" - }, - "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", + "connectionsLink": "Return to the <0>connections", + "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/src/App.tsx b/packages/web/src/App.tsx index 6403f2b2..5fc115c6 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -1,15 +1,13 @@ 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 { SidebarProvider, useAppStore, useDeviceStore } from "@core/stores"; -// import { SidebarProvider, ThemeProvider } from "@meshtastic/ui"; -import { Dashboard } from "@pages/Dashboard/index.tsx"; +import { Connections } from "@pages/Connections/index.tsx"; import { Outlet } from "@tanstack/react-router"; import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; import { ErrorBoundary } from "react-error-boundary"; @@ -19,20 +17,19 @@ export function App() { useTheme(); const { getDevice } = useDeviceStore(); - const { selectedDeviceId, setConnectDialogOpen, connectDialogOpen } = - useAppStore(); + const { selectedDeviceId } = useAppStore(); const device = getDevice(selectedDeviceId); return ( // - { setConnectDialogOpen(open); }} - /> + /> */} @@ -53,7 +50,7 @@ export function App() { ) : ( <> - +