* feat(protobufs): sync to firmware-current and consume workspace package Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*). Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true. * build(protobufs): vendor generated bindings for workspace consumers The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen * fix(protobufs): clean script removes the actual generated output dir buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback. * refactor: move web app packages/web -> apps/web Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green. * feat: config fields, module pages, key verification, telemetry capture Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green. * chore: drop #1062 (unsaved-change-detection) to match upstream revert #1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green. * fix(nodes): clean up SNR display in node table and map popup SNR is a ratio measured in dB, not dBm (which is absolute power); the node table and map popup both mislabeled it and crammed three values together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same heuristic ((snr+10)*5) shown twice — once clamped, once not. Render SNR in dB rounded to one decimal, color-coded by a 0-100% signal-quality heuristic (green/yellow/red), with the quality percentage as a muted secondary. Drop the redundant raw value. Adds unit.db; this matches the existing SNRTooltip, which already renders dB.
239 lines
13 KiB
JSON
239 lines
13 KiB
JSON
{
|
|
"deleteMessages": {
|
|
"description": "Това действие ще изчисти цялата история на съобщенията. Това не може да бъде отменено. Сигурни ли сте, че искате да продължите?",
|
|
"title": "Изчистване на всички съобщения"
|
|
},
|
|
"import": {
|
|
"description": "Текущата конфигурация на LoRa ще бъде презаписана.",
|
|
"error": {
|
|
"invalidUrl": "Невалиден Meshtastic URL"
|
|
},
|
|
"channelPrefix": "Канал: ",
|
|
"primary": "Първичен ",
|
|
"doNotImport": "No not import",
|
|
"channelName": "Име",
|
|
"channelSlot": "Слот",
|
|
"channelSetUrl": "Channel Set/QR Code URL",
|
|
"useLoraConfig": "Импортиране на конфигурация на LoRa",
|
|
"presetDescription": "Текущата конфигурация na LoRa ще бъде заменена.",
|
|
"title": "Import Channel Set"
|
|
},
|
|
"locationResponse": {
|
|
"title": "Местоположение: {{identifier}}",
|
|
"altitude": "Надморска височина: ",
|
|
"coordinates": "Координати:",
|
|
"noCoordinates": "Няма координати"
|
|
},
|
|
"pkiRegenerateDialog": {
|
|
"title": "Регенериране на предварително споделения ключ?",
|
|
"description": "Сигурни ли сте, че искате да регенерирате предварително споделения ключ?",
|
|
"regenerate": "Регенериране"
|
|
},
|
|
"addConnection": {
|
|
"title": "Добавяне на връзка",
|
|
"description": "Изберете тип връзка и попълнете данните",
|
|
"validation": {
|
|
"requiresWebBluetooth": "Този тип връзка изисква <0>Web Bluetooth</0>. Моля, използвайте поддържан браузър, като Chrome или Edge.",
|
|
"requiresWebSerial": "Този тип връзка изисква <0>Web Serial</0>. Моля, използвайте поддържан браузър, като Chrome или Edge.",
|
|
"requiresSecureContext": "Това приложение изисква <0>secure context</0>. Моля, свържете се чрез HTTPS или localhost.",
|
|
"additionallyRequiresSecureContext": "Освен това, изисква <0>secure context</0>. Моля, свържете се чрез HTTPS или localhost."
|
|
},
|
|
"bluetoothConnection": {
|
|
"namePlaceholder": "Моят Bluetooth възел",
|
|
"supported": {
|
|
"title": "Поддържа се Web Bluetooth"
|
|
},
|
|
"notSupported": {
|
|
"title": "Не се поддържа Web Bluetooth",
|
|
"description": "Вашият браузър или устройство не поддържа Web Bluetooth"
|
|
},
|
|
"short": "BT: {{deviceName}}",
|
|
"long": "Bluetooth устройство",
|
|
"device": "Устройство",
|
|
"selectDevice": "Изберете устройство",
|
|
"selected": "Избрано Bluetooth устройство",
|
|
"notSelected": "Няма избрано устройство",
|
|
"helperText": "Използва услугата Meshtastic Bluetooth за откриване."
|
|
},
|
|
"serialConnection": {
|
|
"namePlaceholder": "Моят сериен възел",
|
|
"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": "Порт",
|
|
"selectPort": "Изберете порт",
|
|
"deviceName": "USB {{vendorId}}:{{productId}}",
|
|
"notSelected": "Няма избран порт"
|
|
},
|
|
"httpConnection": {
|
|
"namePlaceholder": "Моят HTTP възел",
|
|
"inputPlaceholder": "192.168.1.10 или meshtastic.local",
|
|
"heading": "URL или IP",
|
|
"useHttps": "Използване на HTTPS",
|
|
"invalidUrl": {
|
|
"title": "Невалиден URL",
|
|
"description": "Моля, въведете валиден HTTP или HTTPS URL."
|
|
},
|
|
"connectionTest": {
|
|
"description": "Тествайте връзката, преди да я запазите, за да се уверите, че устройството е достъпно.",
|
|
"button": {
|
|
"loading": "Тестване...",
|
|
"label": "Тестване на връзката"
|
|
},
|
|
"reachable": "Достъпно",
|
|
"notReachable": "Не е достъпно",
|
|
"success": {
|
|
"title": "Тестът на връзката е успешен",
|
|
"description": "Устройството изглежда е достъпно."
|
|
},
|
|
"failure": {
|
|
"title": "Тестът на връзката не е успешен",
|
|
"description": "Не можа да се осъществи връзка с устройството. Проверете URL-а и опитайте отново."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"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": "Подробности за възел за {{identifier}}",
|
|
"ignoreNode": "Игнориране на възела",
|
|
"removeNode": "Премахване на възела",
|
|
"unignoreNode": "Премахване на игнорирането на възела",
|
|
"security": "Сигурност:",
|
|
"publicKey": "Публичен ключ:",
|
|
"messageable": "Messageable: ",
|
|
"KeyManuallyVerifiedTrue": "Публичният ключ е проверен ръчно",
|
|
"KeyManuallyVerifiedFalse": "Публичният ключ не е проверен ръчно"
|
|
},
|
|
"pkiBackup": {
|
|
"loseKeysWarning": "Ако загубите ключовете си, ще трябва да нулирате устройството си.",
|
|
"secureBackup": "Важно е да направите резервно копие на публичните и частните си ключове и да съхранявате резервното си копие сигурно!",
|
|
"footer": "=== КРАЙ НА КЛЮЧОВЕТЕ ===",
|
|
"header": "=== MESHTASTIC КЛЮЧОВЕ ЗА {{longName}} ({{shortName}}) ===",
|
|
"privateKey": "Частен ключ:",
|
|
"publicKey": "Публичен ключ:",
|
|
"fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt",
|
|
"title": "Backup Keys"
|
|
},
|
|
"pkiBackupReminder": {
|
|
"description": "Препоръчваме редовно да правите резервни копия на данните с вашите ключове. Искате ли да направите резервно копие сега?",
|
|
"title": "Напомняне за резервно копие",
|
|
"remindLaterPrefix": "Напомни ми в",
|
|
"remindNever": "Никога не ми напомняй",
|
|
"backupNow": "Създаване на резервно копие сега"
|
|
},
|
|
"pkiRegenerate": {
|
|
"description": "Сигурни ли сте, че искате да регенерирате двойката ключове?",
|
|
"title": "Регенериране на двойката ключове"
|
|
},
|
|
"qr": {
|
|
"addChannels": "Добавяне на канали",
|
|
"replaceChannels": "Замяна на канали",
|
|
"description": "Текущата конфигурация на LoRa също ще бъде споделена.",
|
|
"sharableUrl": "Sharable URL",
|
|
"title": "Генериране на QR код"
|
|
},
|
|
"reboot": {
|
|
"title": "Рестартиране на устройството",
|
|
"description": "Reboot now or schedule a reboot of the connected node. Optionally, you can choose to reboot into OTA (Over-the-Air) mode.",
|
|
"ota": "Reboot into OTA mode",
|
|
"enterDelay": "Въведете забавяне",
|
|
"scheduled": "Насрочено е рестартиране",
|
|
"schedule": "Планиране на рестартиране",
|
|
"now": "Рестартиране сега",
|
|
"cancel": "Cancel scheduled reboot"
|
|
},
|
|
"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": "Вашият възел не може да изпрати директно съобщение до възел:"
|
|
},
|
|
"acceptNewKeys": "риемане на нови ключове",
|
|
"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": "и публикацията в блога за ",
|
|
"postamble": " и разберам последиците от промяната на ролята.",
|
|
"preamble": "Аз прочетох ",
|
|
"choosingRightDeviceRole": "Избор на правилната роля на устройството",
|
|
"deviceRoleDocumentation": "Документация за ролите на устройството",
|
|
"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."
|
|
},
|
|
"clientNotification": {
|
|
"title": "Client Notification",
|
|
"TraceRoute can only be sent once every 30 seconds": "TraceRoute can only be sent once every 30 seconds",
|
|
"Compromised keys were detected and regenerated.": "Бяха открити и регенерирани компрометирани ключове."
|
|
},
|
|
"resetNodeDb": {
|
|
"title": "Reset Node Database",
|
|
"description": "This will clear all nodes from the connected device's node database and clear all message history in the client. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Reset Node Database",
|
|
"failedTitle": "There was an error resetting the Node DB. Please try again."
|
|
},
|
|
"clearAllStores": {
|
|
"title": "Clear All Local Storage",
|
|
"description": "This will clear all locally stored data, including message history and node databases for all previously connected devices. This will require you to reconnect to your node once complete and cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Clear all local storage",
|
|
"failedTitle": "There was an error clearing local storage. Please try again."
|
|
},
|
|
"factoryResetDevice": {
|
|
"title": "Фабрично нулиране на устройството",
|
|
"description": "This will factory reset the connected device, erasing all configurations and data on the device as well as all nodes and messages saved in the client. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Фабрично нулиране на устройството",
|
|
"failedTitle": "There was an error performing the factory reset. Please try again."
|
|
},
|
|
"factoryResetConfig": {
|
|
"title": "Фабрично нулиране на конфигурацията",
|
|
"description": "This will factory reset the configuration on the connected device, erasing all configurations on the device. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Фабрично нулиране на конфигурацията",
|
|
"failedTitle": "There was an error performing the factory reset. Please try again."
|
|
}
|
|
}
|