diff --git a/.claude/settings.local.json b/.claude/settings.local.json index b188820..bde7dd8 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -17,7 +17,11 @@ "Bash(flutter analyze lib/main.dart)", "Bash(flutter analyze lib/providers/app_provider.dart lib/services/meshcore_ble_service.dart)", "Bash(flutter analyze lib/services/meshcore_ble_service.dart)", - "Bash(flutter analyze lib/services/meshcore_ble_service.dart lib/services/location_tracking_service.dart)" + "Bash(flutter analyze lib/services/meshcore_ble_service.dart lib/services/location_tracking_service.dart)", + "Bash(flutter analyze lib/widgets/map/trail_controls.dart lib/screens/map_tab.dart)", + "Bash(flutter analyze lib/screens/device_config_screen.dart)", + "Bash(flutter analyze lib/services/ble/ble_response_handler.dart)", + "Bash(flutter analyze)" ], "deny": [], "ask": [] diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip index 8d459db..8f42367 100644 Binary files a/ios/Runner.app.dSYM.zip and b/ios/Runner.app.dSYM.zip differ diff --git a/ios/Runner.ipa b/ios/Runner.ipa index 3f9725c..c55cf5d 100644 Binary files a/ios/Runner.ipa and b/ios/Runner.ipa differ diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml index 6e77260..2a2340a 100644 --- a/ios/fastlane/report.xml +++ b/ios/fastlane/report.xml @@ -5,22 +5,22 @@ - + - + - + - + diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb new file mode 100644 index 0000000..b9a3604 --- /dev/null +++ b/lib/l10n/app_de.arb @@ -0,0 +1,2100 @@ +{ + "@@locale": "de", + + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "Der Anwendungstitel" + }, + + "messages": "Nachrichten", + "@messages": { + "description": "Beschriftung der Nachrichten-Registerkarte" + }, + + "contacts": "Kontakte", + "@contacts": { + "description": "Beschriftung der Kontakte-Registerkarte" + }, + + "map": "Karte", + "@map": { + "description": "Beschriftung der Karten-Registerkarte" + }, + + "settings": "Einstellungen", + "@settings": { + "description": "Titel des Einstellungsbildschirms" + }, + + "connect": "Verbinden", + "@connect": { + "description": "Beschriftung der Verbinden-Schaltfläche" + }, + + "disconnect": "Trennen", + "@disconnect": { + "description": "Beschriftung der Trennen-Schaltfläche" + }, + + "scanningForDevices": "Suche nach Geräten...", + "@scanningForDevices": { + "description": "Text, der beim Scannen nach BLE-Geräten angezeigt wird" + }, + + "noDevicesFound": "Keine Geräte gefunden", + "@noDevicesFound": { + "description": "Text, der angezeigt wird, wenn keine BLE-Geräte gefunden wurden" + }, + + "scanAgain": "Erneut scannen", + "@scanAgain": { + "description": "Schaltfläche zum Neustart des BLE-Scans" + }, + + "tapToConnect": "Zum Verbinden tippen", + "@tapToConnect": { + "description": "Untertiteltext für Gerät in der Scanliste" + }, + + "deviceNotConnected": "Gerät nicht verbunden", + "@deviceNotConnected": { + "description": "Fehlermeldung, wenn das Gerät nicht verbunden ist" + }, + + "locationPermissionDenied": "Standortberechtigung verweigert", + "@locationPermissionDenied": { + "description": "Fehler, wenn die Standortberechtigung verweigert wird" + }, + + "locationPermissionPermanentlyDenied": "Standortberechtigung dauerhaft verweigert. Bitte in den Einstellungen aktivieren.", + "@locationPermissionPermanentlyDenied": { + "description": "Fehler, wenn die Standortberechtigung dauerhaft verweigert wird" + }, + + "locationPermissionRequired": "Die Standortberechtigung ist für GPS-Tracking und Teamkoordination erforderlich. Sie können sie später in den Einstellungen aktivieren.", + "@locationPermissionRequired": { + "description": "Nachricht, wenn Standortberechtigung benötigt wird" + }, + + "locationServicesDisabled": "Standortdienste sind deaktiviert. Bitte aktivieren Sie sie in den Einstellungen.", + "@locationServicesDisabled": { + "description": "Fehler, wenn Standortdienste deaktiviert sind" + }, + + "failedToGetGpsLocation": "GPS-Position konnte nicht abgerufen werden", + "@failedToGetGpsLocation": { + "description": "Fehler, wenn die GPS-Position nicht abgerufen werden kann" + }, + + "advertisedAtLocation": "Position gesendet bei {latitude}, {longitude}", + "@advertisedAtLocation": { + "description": "Erfolgsmeldung mit der gesendeten Position", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "failedToAdvertise": "Senden fehlgeschlagen: {error}", + "@failedToAdvertise": { + "description": "Fehlermeldung bei fehlgeschlagenem Senden", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "reconnecting": "Wiederverbindung... ({attempt}/{max})", + "@reconnecting": { + "description": "Text, der während Wiederverbindungsversuchen angezeigt wird", + "placeholders": { + "attempt": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + + "cancelReconnection": "Wiederverbindung abbrechen", + "@cancelReconnection": { + "description": "Tooltip für die Schaltfläche zum Abbrechen der Wiederverbindung" + }, + + "mapManagement": "Kartenverwaltung", + "@mapManagement": { + "description": "Menüeintrag für Kartenverwaltung" + }, + + "general": "Allgemein", + "@general": { + "description": "Überschrift des allgemeinen Einstellungsbereichs" + }, + + "theme": "Design", + "@theme": { + "description": "Beschriftung der Design-Einstellung" + }, + + "chooseTheme": "Design auswählen", + "@chooseTheme": { + "description": "Titel des Design-Auswahldialogs" + }, + + "light": "Hell", + "@light": { + "description": "Helles Design-Option" + }, + + "dark": "Dunkel", + "@dark": { + "description": "Dunkles Design-Option" + }, + + "blueLightTheme": "Blaues helles Design", + "@blueLightTheme": { + "description": "Beschreibung für blaues helles Design" + }, + + "blueDarkTheme": "Blaues dunkles Design", + "@blueDarkTheme": { + "description": "Beschreibung für blaues dunkles Design" + }, + + "sarRed": "SAR Rot", + "@sarRed": { + "description": "SAR Rot Design-Option" + }, + + "alertEmergencyMode": "Alarm-/Notfallmodus", + "@alertEmergencyMode": { + "description": "Beschreibung für SAR Rot Design" + }, + + "sarGreen": "SAR Grün", + "@sarGreen": { + "description": "SAR Grün Design-Option" + }, + + "safeAllClearMode": "Sicher/Entwarnung-Modus", + "@safeAllClearMode": { + "description": "Beschreibung für SAR Grün Design" + }, + + "autoSystem": "Automatisch (System)", + "@autoSystem": { + "description": "Automatisches/System-Design-Option" + }, + + "followSystemTheme": "System-Design folgen", + "@followSystemTheme": { + "description": "Beschreibung für System-Design" + }, + + "showRxTxIndicators": "RX/TX-Indikatoren anzeigen", + "@showRxTxIndicators": { + "description": "Einstellung zum Anzeigen von RX/TX-Indikatoren" + }, + + "displayPacketActivity": "Paketaktivitätsindikatoren in der oberen Leiste anzeigen", + "@displayPacketActivity": { + "description": "Beschreibung für die Einstellung der RX/TX-Indikatoren" + }, + + "language": "Sprache", + "@language": { + "description": "Beschriftung der Spracheinstellung" + }, + + "chooseLanguage": "Sprache auswählen", + "@chooseLanguage": { + "description": "Titel des Sprachauswahldialogs" + }, + + "english": "Englisch", + "@english": { + "description": "Englische Sprachoption" + }, + + "slovenian": "Slowenisch", + "@slovenian": { + "description": "Slowenische Sprachoption" + }, + + "croatian": "Kroatisch", + "@croatian": { + "description": "Kroatische Sprachoption" + }, + + "locationBroadcasting": "Standortübertragung", + "@locationBroadcasting": { + "description": "Überschrift des Standorteinstellungsbereichs" + }, + + "autoLocationTracking": "Automatisches Standort-Tracking", + "@autoLocationTracking": { + "description": "Einstellung für automatisches Standort-Tracking" + }, + + "automaticallyBroadcastPosition": "Positionsaktualisierungen automatisch übertragen", + "@automaticallyBroadcastPosition": { + "description": "Beschreibung für automatisches Standort-Tracking" + }, + + "configureTracking": "Tracking konfigurieren", + "@configureTracking": { + "description": "Beschriftung der Tracking-Konfigurations-Schaltfläche" + }, + + "distanceAndTimeThresholds": "Entfernungs- und Zeitschwellenwerte", + "@distanceAndTimeThresholds": { + "description": "Beschreibung für Tracking-Konfiguration" + }, + + "locationTrackingConfiguration": "Standort-Tracking-Konfiguration", + "@locationTrackingConfiguration": { + "description": "Titel des Tracking-Konfigurationsdialogs" + }, + + "configureWhenLocationBroadcasts": "Konfigurieren Sie, wann Standortübertragungen an das Mesh-Netzwerk gesendet werden", + "@configureWhenLocationBroadcasts": { + "description": "Beschreibung für den Tracking-Konfigurationsdialog" + }, + + "minimumDistance": "Mindestentfernung", + "@minimumDistance": { + "description": "Beschriftung der Mindestentfernungseinstellung" + }, + + "broadcastAfterMoving": "Nur nach Bewegung von {distance} Metern übertragen", + "@broadcastAfterMoving": { + "description": "Beschreibung für Mindestentfernung", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "maximumDistance": "Maximale Entfernung", + "@maximumDistance": { + "description": "Beschriftung der maximalen Entfernungseinstellung" + }, + + "alwaysBroadcastAfterMoving": "Immer nach Bewegung von {distance} Metern übertragen", + "@alwaysBroadcastAfterMoving": { + "description": "Beschreibung für maximale Entfernung", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "minimumTimeInterval": "Minimales Zeitintervall", + "@minimumTimeInterval": { + "description": "Beschriftung der minimalen Zeitintervalleinstellung" + }, + + "alwaysBroadcastEvery": "Immer alle {duration} übertragen", + "@alwaysBroadcastEvery": { + "description": "Beschreibung für Zeitintervall", + "placeholders": { + "duration": { + "type": "String" + } + } + }, + + "save": "Speichern", + "@save": { + "description": "Beschriftung der Speichern-Schaltfläche" + }, + + "cancel": "Abbrechen", + "@cancel": { + "description": "Beschriftung der Abbrechen-Schaltfläche" + }, + + "close": "Schließen", + "@close": { + "description": "Beschriftung der Schließen-Schaltfläche" + }, + + "about": "Über", + "@about": { + "description": "Überschrift des Über-Bereichs" + }, + + "appVersion": "App-Version", + "@appVersion": { + "description": "Beschriftung der App-Version" + }, + + "appName": "App-Name", + "@appName": { + "description": "Beschriftung des App-Namens" + }, + + "aboutMeshCoreSar": "Über MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "Titel des Über-Dialogs" + }, + + "aboutDescription": "Eine Such- und Rettungsanwendung für Notfallteams. Funktionen umfassen:\n\n• BLE-Mesh-Netzwerk für Gerät-zu-Gerät-Kommunikation\n• Offline-Karten mit mehreren Ebenenoptionen\n• Echtzeit-Teammitgliederverfolgung\n• SAR-Taktikmarkierungen (Person gefunden, Feuer, Sammelpunkt)\n• Kontaktverwaltung und Nachrichtenübermittlung\n• GPS-Tracking mit Kompass-Kurs\n• Karten-Tile-Caching für Offline-Nutzung", + "@aboutDescription": { + "description": "Beschreibung des Über-Dialogs" + }, + + "technologiesUsed": "Verwendete Technologien:", + "@technologiesUsed": { + "description": "Titel des Abschnitts verwendete Technologien" + }, + + "technologiesList": "• Flutter für plattformübergreifende Entwicklung\n• BLE (Bluetooth Low Energy) für Mesh-Netzwerk\n• OpenStreetMap für Kartendarstellung\n• Provider für Zustandsverwaltung\n• SharedPreferences für lokale Speicherung", + "@technologiesList": { + "description": "Liste der verwendeten Technologien" + }, + + "developer": "Entwickler", + "@developer": { + "description": "Überschrift des Entwickler-Bereichs" + }, + + "packageName": "Paketname", + "@packageName": { + "description": "Beschriftung des Paketnamens" + }, + + "sampleData": "Beispieldaten", + "@sampleData": { + "description": "Überschrift des Beispieldaten-Bereichs" + }, + + "sampleDataDescription": "Laden oder löschen Sie Beispielkontakte, Kanalnachrichten und SAR-Markierungen zum Testen", + "@sampleDataDescription": { + "description": "Beschreibung des Beispieldaten-Bereichs" + }, + + "loadSampleData": "Beispieldaten laden", + "@loadSampleData": { + "description": "Schaltfläche zum Laden von Beispieldaten" + }, + + "clearAllData": "Alle Daten löschen", + "@clearAllData": { + "description": "Schaltfläche zum Löschen aller Daten" + }, + + "clearAllDataConfirmTitle": "Alle Daten löschen", + "@clearAllDataConfirmTitle": { + "description": "Titel des Dialogs zur Bestätigung des Löschens von Daten" + }, + + "clearAllDataConfirmMessage": "Dadurch werden alle Kontakte und SAR-Markierungen gelöscht. Sind Sie sicher?", + "@clearAllDataConfirmMessage": { + "description": "Bestätigungsnachricht zum Löschen von Daten" + }, + + "clear": "Löschen", + "@clear": { + "description": "Beschriftung der Löschen-Schaltfläche" + }, + + "loadedSampleData": "{teamCount} Teammitglieder, {channelCount} Kanäle, {sarCount} SAR-Markierungen, {messageCount} Nachrichten geladen", + "@loadedSampleData": { + "description": "Erfolgsmeldung nach dem Laden von Beispieldaten", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + + "failedToLoadSampleData": "Fehler beim Laden der Beispieldaten: {error}", + "@failedToLoadSampleData": { + "description": "Fehlermeldung, wenn das Laden der Beispieldaten fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "allDataCleared": "Alle Daten gelöscht", + "@allDataCleared": { + "description": "Erfolgsmeldung nach dem Löschen aller Daten" + }, + + "failedToStartBackgroundTracking": "Hintergrund-Tracking konnte nicht gestartet werden. Überprüfen Sie Berechtigungen und BLE-Verbindung.", + "@failedToStartBackgroundTracking": { + "description": "Fehlermeldung, wenn das Hintergrund-Tracking nicht gestartet werden kann" + }, + + "locationBroadcast": "Standortübertragung: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Erfolgsmeldung für Standortübertragung", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "defaultPinInfo": "Die Standard-PIN für Geräte ohne Bildschirm ist 123456. Probleme beim Koppeln? Vergessen Sie das Bluetooth-Gerät in den Systemeinstellungen.", + "@defaultPinInfo": { + "description": "Informationen zur Standard-PIN für die Kopplung" + }, + + "noMessagesYet": "Noch keine Nachrichten", + "@noMessagesYet": { + "description": "Leerzustandsnachricht, wenn keine Nachrichten vorhanden sind" + }, + + "pullDownToSync": "Nach unten ziehen, um Nachrichten zu synchronisieren", + "@pullDownToSync": { + "description": "Anweisung zum Herunterziehen zum Aktualisieren von Nachrichten" + }, + + "deleteContact": "Kontakt löschen", + "@deleteContact": { + "description": "Beschriftung der Kontakt-löschen-Aktion" + }, + + "delete": "Löschen", + "@delete": { + "description": "Beschriftung der Löschen-Schaltfläche" + }, + + "viewOnMap": "Auf Karte anzeigen", + "@viewOnMap": { + "description": "Aktion zum Anzeigen des Kontaktstandorts auf der Karte" + }, + + "refresh": "Aktualisieren", + "@refresh": { + "description": "Beschriftung der Aktualisieren-Schaltfläche" + }, + + "sendDirectMessage": "Direktnachricht senden", + "@sendDirectMessage": { + "description": "Aktion zum Senden einer Direktnachricht an Kontakt" + }, + + "resetPath": "Pfad zurücksetzen (Umleitung)", + "@resetPath": { + "description": "Aktion zum Zurücksetzen des Kontaktpfads für Umleitung" + }, + + "publicKeyCopied": "Öffentlicher Schlüssel in die Zwischenablage kopiert", + "@publicKeyCopied": { + "description": "Erfolgsmeldung, wenn der öffentliche Schlüssel kopiert wurde" + }, + + "copiedToClipboard": "{label} in die Zwischenablage kopiert", + "@copiedToClipboard": { + "description": "Erfolgsmeldung, wenn ein Wert in die Zwischenablage kopiert wurde", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "pleaseEnterPassword": "Bitte geben Sie ein Passwort ein", + "@pleaseEnterPassword": { + "description": "Validierungsnachricht für leeres Passwortfeld" + }, + + "failedToSyncContacts": "Kontaktsynchronisation fehlgeschlagen: {error}", + "@failedToSyncContacts": { + "description": "Fehlermeldung, wenn die Kontaktsynchronisation fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "loggedInSuccessfully": "Erfolgreich angemeldet! Warte auf Raumnachrichten...", + "@loggedInSuccessfully": { + "description": "Erfolgsmeldung nach erfolgreicher Raumanmeldung" + }, + + "loginFailed": "Anmeldung fehlgeschlagen - falsches Passwort", + "@loginFailed": { + "description": "Fehlermeldung, wenn die Raumanmeldung fehlschlägt" + }, + + "loggingIn": "Anmeldung bei {roomName}...", + "@loggingIn": { + "description": "Statusmeldung während des Raumanmeldungsvorgangs", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "failedToSendLogin": "Anmeldung senden fehlgeschlagen: {error}", + "@failedToSendLogin": { + "description": "Fehlermeldung, wenn das Senden des Anmeldebefehls fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "lowLocationAccuracy": "Niedrige Standortgenauigkeit", + "@lowLocationAccuracy": { + "description": "Warnungstitel für niedrige GPS-Genauigkeit" + }, + + "continue_": "Fortfahren", + "@continue_": { + "description": "Beschriftung der Fortfahren-Schaltfläche" + }, + + "sendSarMarker": "SAR-Markierung senden", + "@sendSarMarker": { + "description": "Aktion zum Senden einer SAR-Markierung" + }, + + "deleteDrawing": "Zeichnung löschen", + "@deleteDrawing": { + "description": "Aktion zum Löschen einer Kartenzeichnung" + }, + + "drawLine": "Linie zeichnen", + "@drawLine": { + "description": "Kartenzeichnungsmodus: Linie" + }, + + "drawLineDesc": "Freihandlinie auf der Karte zeichnen", + "@drawLineDesc": { + "description": "Beschreibung für Linienzeichnungsmodus" + }, + + "drawRectangle": "Rechteck zeichnen", + "@drawRectangle": { + "description": "Kartenzeichnungsmodus: Rechteck" + }, + + "drawRectangleDesc": "Rechteckigen Bereich auf der Karte zeichnen", + "@drawRectangleDesc": { + "description": "Beschreibung für Rechteckzeichnungsmodus" + }, + + "shareDrawings": "Zeichnungen teilen", + "@shareDrawings": { + "description": "Aktion zum Teilen von Zeichnungen im Netzwerk" + }, + + "clearAllDrawings": "Alle Zeichnungen löschen", + "@clearAllDrawings": { + "description": "Aktion zum Löschen aller lokalen Zeichnungen" + }, + + "clearAll": "Alle löschen", + "@clearAll": { + "description": "Beschriftung der Alle-löschen-Schaltfläche" + }, + + "noLocalDrawings": "Keine lokalen Zeichnungen zum Teilen", + "@noLocalDrawings": { + "description": "Nachricht, wenn keine Zeichnungen zum Teilen vorhanden sind" + }, + + "publicChannel": "Öffentlicher Kanal", + "@publicChannel": { + "description": "Option für öffentlichen Kanal zum Teilen" + }, + + "broadcastToAll": "An alle Knoten in der Nähe senden (temporär)", + "@broadcastToAll": { + "description": "Beschreibung für öffentliche Kanalübertragung" + }, + + "storedPermanently": "Dauerhaft im Raum gespeichert", + "@storedPermanently": { + "description": "Beschreibung für dauerhafte Raumspeicherung" + }, + + "notConnectedToDevice": "Nicht mit Gerät verbunden", + "@notConnectedToDevice": { + "description": "Fehlermeldung, wenn das Gerät nicht für Direktnachrichten verbunden ist" + }, + + "directMessage": "Direktnachricht", + "@directMessage": { + "description": "Titel für Direktnachrichtenblatt" + }, + + "directMessageSentTo": "Direktnachricht an {contactName} gesendet", + "@directMessageSentTo": { + "description": "Erfolgsmeldung nach dem Senden einer Direktnachricht", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "failedToSend": "Senden fehlgeschlagen: {error}", + "@failedToSend": { + "description": "Fehlermeldung, wenn das Senden einer Direktnachricht fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "directMessageInfo": "Diese Nachricht wird direkt an {contactName} gesendet. Sie erscheint auch im Hauptnachrichten-Feed.", + "@directMessageInfo": { + "description": "Informationen zum Verhalten von Direktnachrichten", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "typeYourMessage": "Geben Sie Ihre Nachricht ein...", + "@typeYourMessage": { + "description": "Platzhaltertext für Nachrichteneingabefeld" + }, + + "quickLocationMarker": "Schnelle Standortmarkierung", + "@quickLocationMarker": { + "description": "Untertitel für SAR-Markierungsblatt-Kopfzeile" + }, + + "markerType": "Markierungstyp", + "@markerType": { + "description": "Beschriftung für Markierungstypauswahlbereich" + }, + + "sendTo": "Senden an", + "@sendTo": { + "description": "Beschriftung für Zielauswahlbereich" + }, + + "noDestinationsAvailable": "Keine Ziele verfügbar.", + "@noDestinationsAvailable": { + "description": "Warnung, wenn keine Räume oder Kanäle vorhanden sind" + }, + + "selectDestination": "Ziel auswählen...", + "@selectDestination": { + "description": "Platzhalter für Ziel-Dropdown" + }, + + "ephemeralBroadcastInfo": "Temporär: Nur Over-the-Air-Übertragung. Nicht gespeichert - Knoten müssen online sein.", + "@ephemeralBroadcastInfo": { + "description": "Informationen über temporäre Kanalübertragungen" + }, + + "persistentRoomInfo": "Dauerhaft: Unveränderlich im Raum gespeichert. Automatisch synchronisiert und offline gespeichert.", + "@persistentRoomInfo": { + "description": "Informationen über dauerhafte Raumspeicherung" + }, + + "location": "Standort", + "@location": { + "description": "Beschriftung für Standortbereich" + }, + + "fromMap": "Von Karte", + "@fromMap": { + "description": "Badge, das anzeigt, dass der Standort vom Kartentippen stammt" + }, + + "gettingLocation": "Standort wird abgerufen...", + "@gettingLocation": { + "description": "Ladenachricht beim Abrufen der GPS-Position" + }, + + "locationError": "Standortfehler", + "@locationError": { + "description": "Titel für Standortfehlermeldungen" + }, + + "retry": "Wiederholen", + "@retry": { + "description": "Beschriftung der Wiederholen-Schaltfläche" + }, + + "refreshLocation": "Standort aktualisieren", + "@refreshLocation": { + "description": "Tooltip für Standort-aktualisieren-Schaltfläche" + }, + + "accuracyMeters": "Genauigkeit: ±{accuracy}m", + "@accuracyMeters": { + "description": "Anzeige der GPS-Genauigkeit in Metern", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "notesOptional": "Notizen (optional)", + "@notesOptional": { + "description": "Beschriftung für optionales Notizenfeld" + }, + + "addAdditionalInformation": "Zusätzliche Informationen hinzufügen...", + "@addAdditionalInformation": { + "description": "Platzhalter für Notizenfeld" + }, + + "lowAccuracyWarning": "Standortgenauigkeit beträgt ±{accuracy}m. Dies ist möglicherweise nicht genau genug für SAR-Operationen.\n\nTrotzdem fortfahren?", + "@lowAccuracyWarning": { + "description": "Warnungsdialoginhalt für niedrige GPS-Genauigkeit", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "loginToRoom": "Bei Raum anmelden", + "@loginToRoom": { + "description": "Titel für Raumanmeldedialog" + }, + + "enterPasswordInfo": "Geben Sie das Passwort ein, um auf diesen Raum zuzugreifen. Das Passwort wird für die zukünftige Verwendung gespeichert.", + "@enterPasswordInfo": { + "description": "Informationen zum Raumpasswort" + }, + + "password": "Passwort", + "@password": { + "description": "Beschriftung des Passwortfelds" + }, + + "enterRoomPassword": "Raumpasswort eingeben", + "@enterRoomPassword": { + "description": "Passwortfeld-Hinweis" + }, + + "loggingInDots": "Anmeldung läuft...", + "@loggingInDots": { + "description": "Schaltflächentext während der Anmeldung" + }, + + "login": "Anmelden", + "@login": { + "description": "Beschriftung der Anmelden-Schaltfläche" + }, + + "failedToAddRoom": "Fehler beim Hinzufügen des Raums zum Gerät: {error}\n\nDer Raum hat möglicherweise noch nicht gesendet.\nVersuchen Sie zu warten, bis der Raum sendet.", + "@failedToAddRoom": { + "description": "Fehlermeldung, wenn das Hinzufügen des Raums fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "direct": "Direkt", + "@direct": { + "description": "Direkter Routing-Indikator" + }, + + "flood": "Flut", + "@flood": { + "description": "Flut-Routing-Indikator" + }, + + "admin": "Admin", + "@admin": { + "description": "Admin-Badge-Beschriftung" + }, + + "loggedIn": "Angemeldet", + "@loggedIn": { + "description": "Angemeldet-Status-Badge" + }, + + "noGpsData": "Keine GPS-Daten", + "@noGpsData": { + "description": "Nachricht, wenn GPS-Daten nicht verfügbar sind" + }, + + "distance": "Entfernung", + "@distance": { + "description": "Beschriftung der Entfernung" + }, + + "pingingDirect": "Pinge {name} (direkt über Pfad)...", + "@pingingDirect": { + "description": "Statusmeldung für direkten Ping", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingingFlood": "Pinge {name} (Flutung - kein Pfad)...", + "@pingingFlood": { + "description": "Statusmeldung für Flut-Ping", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "directPingTimeout": "Direkter Ping-Timeout - wiederhole {name} mit Flutung...", + "@directPingTimeout": { + "description": "Warnung, wenn direkter Ping ein Timeout hat", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingSuccessful": "Ping erfolgreich an {name}{fallback}", + "@pingSuccessful": { + "description": "Erfolgsmeldung für Ping", + "placeholders": { + "name": { + "type": "String" + }, + "fallback": { + "type": "String" + } + } + }, + + "viaFloodingFallback": " (über Flutungs-Fallback)", + "@viaFloodingFallback": { + "description": "Suffix für Ping-Erfolg mit Fallback" + }, + + "pingFailed": "Ping fehlgeschlagen an {name} - keine Antwort erhalten", + "@pingFailed": { + "description": "Fehlermeldung, wenn Ping fehlschlägt", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "deleteContactConfirmation": "Sind Sie sicher, dass Sie \"{name}\" löschen möchten?\n\nDies entfernt den Kontakt sowohl aus der App als auch vom Begleitfunkgerät.", + "@deleteContactConfirmation": { + "description": "Bestätigungsnachricht zum Löschen eines Kontakts", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "removingContact": "Entferne {name}...", + "@removingContact": { + "description": "Statusmeldung beim Entfernen des Kontakts", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "contactRemoved": "Kontakt \"{name}\" entfernt", + "@contactRemoved": { + "description": "Erfolgsmeldung nach dem Entfernen des Kontakts", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "failedToRemoveContact": "Fehler beim Entfernen des Kontakts: {error}", + "@failedToRemoveContact": { + "description": "Fehlermeldung, wenn das Entfernen des Kontakts fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "type": "Typ", + "@type": { + "description": "Beschriftung des Kontakttyps" + }, + + "publicKey": "Öffentlicher Schlüssel", + "@publicKey": { + "description": "Beschriftung des öffentlichen Schlüssels" + }, + + "lastSeen": "Zuletzt gesehen", + "@lastSeen": { + "description": "Beschriftung Zuletzt gesehen" + }, + + "roomStatus": "Raumstatus", + "@roomStatus": { + "description": "Überschrift des Raumstatus-Bereichs" + }, + + "loginStatus": "Anmeldestatus", + "@loginStatus": { + "description": "Beschriftung des Anmeldestatus" + }, + + "notLoggedIn": "Nicht angemeldet", + "@notLoggedIn": { + "description": "Nicht angemeldet-Status" + }, + + "adminAccess": "Admin-Zugriff", + "@adminAccess": { + "description": "Beschriftung des Admin-Zugriffs" + }, + + "yes": "Ja", + "@yes": { + "description": "Ja-Antwort" + }, + + "no": "Nein", + "@no": { + "description": "Nein-Antwort" + }, + + "permissions": "Berechtigungen", + "@permissions": { + "description": "Beschriftung der Berechtigungen" + }, + + "passwordSaved": "Passwort gespeichert", + "@passwordSaved": { + "description": "Beschriftung Passwort gespeichert" + }, + + "locationColon": "Standort:", + "@locationColon": { + "description": "Überschrift des Standortbereichs" + }, + + "telemetry": "Telemetrie", + "@telemetry": { + "description": "Überschrift des Telemetrie-Bereichs" + }, + + "requestingTelemetry": "Fordere Telemetrie von {name} an...", + "@requestingTelemetry": { + "description": "Statusmeldung beim Anfordern von Telemetrie", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "voltage": "Spannung", + "@voltage": { + "description": "Beschriftung der Spannung" + }, + + "battery": "Batterie", + "@battery": { + "description": "Beschriftung der Batterie" + }, + + "temperature": "Temperatur", + "@temperature": { + "description": "Beschriftung der Temperatur" + }, + + "humidity": "Luftfeuchtigkeit", + "@humidity": { + "description": "Beschriftung der Luftfeuchtigkeit" + }, + + "pressure": "Druck", + "@pressure": { + "description": "Beschriftung des Drucks" + }, + + "gpsTelemetry": "GPS (Telemetrie)", + "@gpsTelemetry": { + "description": "GPS aus Telemetrie-Beschriftung" + }, + + "updated": "Aktualisiert", + "@updated": { + "description": "Beschriftung des Aktualisierungszeitstempels" + }, + + "pathResetInfo": "Pfad zurückgesetzt für {name}. Nächste Nachricht findet eine neue Route.", + "@pathResetInfo": { + "description": "Infonachricht nach Pfad-Reset", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "reLoginToRoom": "Erneut bei Raum anmelden", + "@reLoginToRoom": { + "description": "Schaltfläche zur erneuten Anmeldung beim Raum" + }, + + "heading": "Kurs", + "@heading": { + "description": "Beschriftung des Kompasskurses" + }, + + "elevation": "Höhe", + "@elevation": { + "description": "Beschriftung der Höhe/Höhenlage" + }, + + "accuracy": "Genauigkeit", + "@accuracy": { + "description": "Beschriftung der GPS-Genauigkeit" + }, + + "filterMarkers": "Markierungen filtern", + "@filterMarkers": { + "description": "Titel für Markierungen-filtern-Dialog" + }, + + "filterMarkersTooltip": "Markierungen filtern", + "@filterMarkersTooltip": { + "description": "Tooltip für Filter-Schaltfläche" + }, + + "contactsFilter": "Kontakte", + "@contactsFilter": { + "description": "Filteroption für Kontakte" + }, + + "repeatersFilter": "Repeater", + "@repeatersFilter": { + "description": "Filteroption für Repeater" + }, + + "sarMarkers": "SAR-Markierungen", + "@sarMarkers": { + "description": "Überschrift des SAR-Markierungen-Bereichs" + }, + + "foundPerson": "Person gefunden", + "@foundPerson": { + "description": "Typ der SAR-Markierung: Person gefunden" + }, + + "fire": "Feuer", + "@fire": { + "description": "Typ der SAR-Markierung: Feuer" + }, + + "stagingArea": "Sammelpunkt", + "@stagingArea": { + "description": "Typ der SAR-Markierung: Sammelpunkt" + }, + + "showAll": "Alle anzeigen", + "@showAll": { + "description": "Schaltfläche zum Anzeigen aller Filter" + }, + + "nearbyContacts": "Kontakte in der Nähe", + "@nearbyContacts": { + "description": "Titel für die Liste der Kontakte in der Nähe im Kompass" + }, + + "locationUnavailable": "Standort nicht verfügbar", + "@locationUnavailable": { + "description": "Nachricht, wenn GPS-Standort nicht verfügbar ist" + }, + + "ahead": "voraus", + "@ahead": { + "description": "Relative Peilungsrichtung - voraus" + }, + + "degreesRight": "{degrees}° rechts", + "@degreesRight": { + "description": "Relative Peilungsrichtung - rechts", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "degreesLeft": "{degrees}° links", + "@degreesLeft": { + "description": "Relative Peilungsrichtung - links", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Anzeigenformat für Breiten- und Längengrad", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "noContactsYet": "Noch keine Kontakte", + "@noContactsYet": { + "description": "Leerzustandsnachricht, wenn keine Kontakte vorhanden sind" + }, + + "connectToDeviceToLoadContacts": "Mit einem Gerät verbinden, um Kontakte zu laden", + "@connectToDeviceToLoadContacts": { + "description": "Anweisung zum Verbinden des Geräts zum Laden von Kontakten" + }, + + "teamMembers": "Teammitglieder", + "@teamMembers": { + "description": "Überschrift für Teammitglieder (Chat-Kontakte)" + }, + + "repeaters": "Repeater", + "@repeaters": { + "description": "Überschrift für Repeater-Knoten" + }, + + "rooms": "Räume", + "@rooms": { + "description": "Überschrift für Räume" + }, + + "channels": "Kanäle", + "@channels": { + "description": "Überschrift für Broadcast-Kanäle" + }, + + "cacheStatistics": "Cache-Statistiken", + "@cacheStatistics": { + "description": "Titel für Cache-Statistik-Bereich" + }, + + "totalTiles": "Gesamte Tiles", + "@totalTiles": { + "description": "Beschriftung für Gesamtanzahl der gecachten Tiles" + }, + + "cacheSize": "Cache-Größe", + "@cacheSize": { + "description": "Beschriftung für Cache-Größe in MB" + }, + + "storeName": "Speichername", + "@storeName": { + "description": "Beschriftung für Cache-Speichernamen" + }, + + "noCacheStatistics": "Keine Cache-Statistiken verfügbar", + "@noCacheStatistics": { + "description": "Nachricht, wenn Cache-Statistiken nicht verfügbar sind" + }, + + "downloadRegion": "Region herunterladen", + "@downloadRegion": { + "description": "Titel für Region-herunterladen-Bereich" + }, + + "mapLayer": "Kartenebene", + "@mapLayer": { + "description": "Beschriftung für Kartenebenenauswahl" + }, + + "regionBounds": "Regionsgrenzen", + "@regionBounds": { + "description": "Titel für Regionsgrenzen-Eingabebereich" + }, + + "north": "Nord", + "@north": { + "description": "Beschriftung für Nordkoordinate" + }, + + "south": "Süd", + "@south": { + "description": "Beschriftung für Südkoordinate" + }, + + "east": "Ost", + "@east": { + "description": "Beschriftung für Ostkoordinate" + }, + + "west": "West", + "@west": { + "description": "Beschriftung für Westkoordinate" + }, + + "zoomLevels": "Zoom-Stufen", + "@zoomLevels": { + "description": "Titel für Zoom-Stufen-Bereich" + }, + + "minZoom": "Min: {zoom}", + "@minZoom": { + "description": "Beschriftung für minimale Zoom-Stufe", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "maxZoom": "Max: {zoom}", + "@maxZoom": { + "description": "Beschriftung für maximale Zoom-Stufe", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "downloadingDots": "Lädt herunter...", + "@downloadingDots": { + "description": "Statusmeldung während des Downloads" + }, + + "cancelDownload": "Download abbrechen", + "@cancelDownload": { + "description": "Schaltfläche zum Abbrechen des Downloads" + }, + + "downloadRegionButton": "Region herunterladen", + "@downloadRegionButton": { + "description": "Schaltfläche zum Starten des Regions-Downloads" + }, + + "downloadNote": "Hinweis: Große Regionen oder hohe Zoom-Stufen können erhebliche Zeit und Speicherplatz benötigen.", + "@downloadNote": { + "description": "Warnung zu Download-Größe und -Zeit" + }, + + "cacheManagement": "Cache-Verwaltung", + "@cacheManagement": { + "description": "Titel für Cache-Verwaltungsbereich" + }, + + "clearAllMaps": "Alle Karten löschen", + "@clearAllMaps": { + "description": "Schaltfläche zum Löschen aller gecachten Karten" + }, + + "clearMapsConfirmTitle": "Alle Karten löschen", + "@clearMapsConfirmTitle": { + "description": "Titel für Karten-löschen-Bestätigungsdialog" + }, + + "clearMapsConfirmMessage": "Sind Sie sicher, dass Sie alle heruntergeladenen Karten löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "@clearMapsConfirmMessage": { + "description": "Bestätigungsnachricht zum Löschen von Karten" + }, + + "mapDownloadCompleted": "Karten-Download abgeschlossen!", + "@mapDownloadCompleted": { + "description": "Erfolgsmeldung nach Karten-Download" + }, + + "cacheClearedSuccessfully": "Cache erfolgreich gelöscht!", + "@cacheClearedSuccessfully": { + "description": "Erfolgsmeldung nach dem Löschen des Caches" + }, + + "downloadCancelled": "Download abgebrochen", + "@downloadCancelled": { + "description": "Nachricht, wenn der Download abgebrochen wird" + }, + + "startingDownload": "Starte Download...", + "@startingDownload": { + "description": "Anfangsstatus beim Beginn des Downloads" + }, + + "downloadingMapTiles": "Lade Karten-Tiles herunter...", + "@downloadingMapTiles": { + "description": "Status während des Tile-Downloads" + }, + + "downloadCompletedSuccessfully": "Download erfolgreich abgeschlossen!", + "@downloadCompletedSuccessfully": { + "description": "Status nach erfolgreichem Download" + }, + + "cancellingDownload": "Breche Download ab...", + "@cancellingDownload": { + "description": "Status beim Abbrechen des Downloads" + }, + + "errorLoadingStats": "Fehler beim Laden der Statistiken: {error}", + "@errorLoadingStats": { + "description": "Fehlermeldung, wenn das Laden der Cache-Statistiken fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "downloadFailed": "Download fehlgeschlagen: {error}", + "@downloadFailed": { + "description": "Fehlermeldung, wenn der Download fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "cancelFailed": "Abbruch fehlgeschlagen: {error}", + "@cancelFailed": { + "description": "Fehlermeldung, wenn der Abbruch fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "clearCacheFailed": "Löschen des Caches fehlgeschlagen: {error}", + "@clearCacheFailed": { + "description": "Fehlermeldung, wenn das Löschen des Caches fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomError": "Min-Zoom: {error}", + "@minZoomError": { + "description": "Validierungsfehler für minimalen Zoom", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "maxZoomError": "Max-Zoom: {error}", + "@maxZoomError": { + "description": "Validierungsfehler für maximalen Zoom", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomGreaterThanMax": "Minimaler Zoom muss kleiner oder gleich dem maximalen Zoom sein", + "@minZoomGreaterThanMax": { + "description": "Validierungsfehler, wenn Min-Zoom > Max-Zoom" + }, + + "selectMapLayer": "Kartenebene auswählen", + "@selectMapLayer": { + "description": "Titel für Kartenebenen-Auswahldialog" + }, + + "mapOptions": "Kartenoptionen", + "@mapOptions": { + "description": "Titel für Kartenoptionen-Dialog" + }, + + "showLegend": "Legende anzeigen", + "@showLegend": { + "description": "Umschalter zum Anzeigen der Kartenlegende" + }, + + "displayMarkerTypeCounts": "Markierungstypen-Anzahl anzeigen", + "@displayMarkerTypeCounts": { + "description": "Beschreibung für Legende-anzeigen-Umschalter" + }, + + "rotateMapWithHeading": "Karte mit Kurs drehen", + "@rotateMapWithHeading": { + "description": "Umschalter zum Drehen der Karte mit Kompasskurs" + }, + + "mapFollowsDirection": "Karte folgt Ihrer Richtung während der Bewegung", + "@mapFollowsDirection": { + "description": "Beschreibung für Karte-drehen-Umschalter" + }, + + "showMapDebugInfo": "Karten-Debug-Info anzeigen", + "@showMapDebugInfo": { + "description": "Umschalter zum Anzeigen von Karten-Debug-Informationen" + }, + + "displayZoomLevelBounds": "Zoom-Stufe und Grenzen anzeigen", + "@displayZoomLevelBounds": { + "description": "Beschreibung für Debug-Info-Umschalter" + }, + + "fullscreenMode": "Vollbildmodus", + "@fullscreenMode": { + "description": "Umschalter für Vollbild-Kartenmodus" + }, + + "hideUiFullMapView": "Alle UI-Steuerelemente für volle Kartenansicht ausblenden", + "@hideUiFullMapView": { + "description": "Beschreibung für Vollbildmodus-Umschalter" + }, + + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "Name der OpenStreetMap-Ebene" + }, + + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "Name der OpenTopoMap-Ebene" + }, + + "esriSatellite": "ESRI-Satellit", + "@esriSatellite": { + "description": "Name der ESRI-Satellitenbildebene" + }, + + "downloadVisibleArea": "Sichtbaren Bereich herunterladen", + "@downloadVisibleArea": { + "description": "Tooltip für Schaltfläche zum Herunterladen des sichtbaren Bereichs" + }, + + "initializingMap": "Initialisiere Karte...", + "@initializingMap": { + "description": "Ladenachricht für Karteninitialisierung" + }, + + "dragToPosition": "Zur Position ziehen", + "@dragToPosition": { + "description": "Beschriftung beim Ziehen einer Stecknadel auf der Karte" + }, + + "createSarMarker": "SAR-Markierung erstellen", + "@createSarMarker": { + "description": "Beschriftung zum Erstellen einer SAR-Markierung von Stecknadel" + }, + + "compass": "Kompass", + "@compass": { + "description": "Kompasstitel im detaillierten Kompassdialog" + }, + + "navigationAndContacts": "Navigation & Kontakte", + "@navigationAndContacts": { + "description": "Untertitel für Kompassdialog" + }, + + "sarAlert": "SAR-ALARM", + "@sarAlert": { + "description": "Beschriftung für SAR-Alarm-Badge auf Nachrichten" + }, + + "messageSentToPublicChannel": "Nachricht an öffentlichen Kanal gesendet", + "@messageSentToPublicChannel": { + "description": "Erfolgsmeldung, wenn Nachricht an öffentlichen Kanal gesendet wird" + }, + + "pleaseSelectRoomToSendSar": "Bitte wählen Sie einen Raum zum Senden der SAR-Markierung", + "@pleaseSelectRoomToSendSar": { + "description": "Fehler, wenn kein Raum für SAR-Markierung ausgewählt ist" + }, + + "failedToSendSarMarker": "Fehler beim Senden der SAR-Markierung: {error}", + "@failedToSendSarMarker": { + "description": "Fehlermeldung, wenn das Senden der SAR-Markierung fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "sarMarkerSentTo": "SAR-Markierung an {roomName} gesendet", + "@sarMarkerSentTo": { + "description": "Erfolgsmeldung, wenn SAR-Markierung an Raum gesendet wird", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "notConnectedCannotSync": "Nicht verbunden - Nachrichten können nicht synchronisiert werden", + "@notConnectedCannotSync": { + "description": "Warnung beim Versuch, Nachrichten zu synchronisieren, während nicht verbunden" + }, + + "syncedMessageCount": "{count} Nachricht(en) synchronisiert", + "@syncedMessageCount": { + "description": "Erfolgsmeldung mit Anzahl der synchronisierten Nachrichten", + "placeholders": { + "count": { + "type": "int" + } + } + }, + + "noNewMessages": "Keine neuen Nachrichten", + "@noNewMessages": { + "description": "Infonachricht, wenn keine neuen Nachrichten zum Synchronisieren vorhanden sind" + }, + + "syncFailed": "Synchronisation fehlgeschlagen: {error}", + "@syncFailed": { + "description": "Fehlermeldung, wenn Synchronisation fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToResendMessage": "Fehler beim erneuten Senden der Nachricht", + "@failedToResendMessage": { + "description": "Fehler, wenn erneutes Senden der Nachricht fehlschlägt" + }, + + "retryingMessage": "Wiederhole Nachricht...", + "@retryingMessage": { + "description": "Infonachricht beim Wiederholen einer fehlgeschlagenen Nachricht" + }, + + "retryFailed": "Wiederholen fehlgeschlagen: {error}", + "@retryFailed": { + "description": "Fehlermeldung, wenn Wiederholen fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "textCopiedToClipboard": "Text in Zwischenablage kopiert", + "@textCopiedToClipboard": { + "description": "Erfolgsmeldung, wenn Text kopiert wird" + }, + + "cannotReplySenderMissing": "Antwort nicht möglich: Absenderinformationen fehlen", + "@cannotReplySenderMissing": { + "description": "Fehler, wenn Absenderinformationen für Antwort fehlen" + }, + + "cannotReplyContactNotFound": "Antwort nicht möglich: Kontakt nicht gefunden", + "@cannotReplyContactNotFound": { + "description": "Fehler, wenn Kontakt für Antwort nicht gefunden wird" + }, + + "messageDeleted": "Nachricht gelöscht", + "@messageDeleted": { + "description": "Infonachricht, wenn Nachricht gelöscht wird" + }, + + "refreshedContacts": "Kontakte aktualisiert", + "@refreshedContacts": { + "description": "Erfolgsmeldung, wenn Kontakte aktualisiert werden" + }, + + "justNow": "Gerade eben", + "@justNow": { + "description": "Zeitindikator für sehr aktuelle Aktivität" + }, + + "minutesAgo": "vor {minutes}m", + "@minutesAgo": { + "description": "Zeitindikator für Minuten zuvor", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + + "hoursAgo": "vor {hours}h", + "@hoursAgo": { + "description": "Zeitindikator für Stunden zuvor", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + + "daysAgo": "vor {days}d", + "@daysAgo": { + "description": "Zeitindikator für Tage zuvor", + "placeholders": { + "days": { + "type": "int" + } + } + }, + + "secondsAgo": "vor {seconds}s", + "@secondsAgo": { + "description": "Zeitindikator für Sekunden zuvor", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + + "sending": "Wird gesendet...", + "@sending": { + "description": "Zustellungsstatus: wird gesendet" + }, + + "sent": "Gesendet", + "@sent": { + "description": "Zustellungsstatus: gesendet" + }, + + "delivered": "Zugestellt", + "@delivered": { + "description": "Zustellungsstatus: zugestellt" + }, + + "deliveredWithTime": "Zugestellt ({time}ms)", + "@deliveredWithTime": { + "description": "Zustellungsstatus mit Rundlaufzeit", + "placeholders": { + "time": { + "type": "int" + } + } + }, + + "failed": "Fehlgeschlagen", + "@failed": { + "description": "Zustellungsstatus: fehlgeschlagen" + }, + + "sarMarkerFoundPerson": "Person gefunden", + "@sarMarkerFoundPerson": { + "description": "SAR-Markierungstyp: Person gefunden" + }, + + "sarMarkerFire": "Feuerstandort", + "@sarMarkerFire": { + "description": "SAR-Markierungstyp: Feuer" + }, + + "sarMarkerStagingArea": "Sammelpunkt", + "@sarMarkerStagingArea": { + "description": "SAR-Markierungstyp: Sammelpunkt" + }, + + "sarMarkerObject": "Objekt gefunden", + "@sarMarkerObject": { + "description": "SAR-Markierungstyp: Objekt" + }, + + "from": "Von", + "@from": { + "description": "Absender-Beschriftung in Benachrichtigungen" + }, + + "coordinates": "Koordinaten", + "@coordinates": { + "description": "Koordinaten-Beschriftung" + }, + + "tapToViewOnMap": "Tippen, um auf der Karte anzuzeigen", + "@tapToViewOnMap": { + "description": "Benachrichtigungsaktionstext" + }, + + "radioSettings": "Funkeinstellungen", + "@radioSettings": { + "description": "Titel des Abschnitts für Funkeinstellungen" + }, + + "frequencyMHz": "Frequenz (MHz)", + "@frequencyMHz": { + "description": "Beschriftung für Funkfrequenzfeld" + }, + + "frequencyExample": "z.B. 869.618", + "@frequencyExample": { + "description": "Hilfetext-Beispiel für Frequenz" + }, + + "bandwidth": "Bandbreite", + "@bandwidth": { + "description": "Beschriftung für Bandbreiten-Dropdown" + }, + + "spreadingFactor": "Spreading-Faktor", + "@spreadingFactor": { + "description": "Beschriftung für Spreading-Faktor-Dropdown" + }, + + "codingRate": "Codierungsrate", + "@codingRate": { + "description": "Beschriftung für Codierungsraten-Dropdown" + }, + + "txPowerDbm": "TX-Leistung (dBm)", + "@txPowerDbm": { + "description": "Beschriftung für TX-Leistungsfeld" + }, + + "maxPowerDbm": "Max: {power} dBm", + "@maxPowerDbm": { + "description": "Hilfetext zur maximalen TX-Leistung", + "placeholders": { + "power": { "type": "int" } + } + }, + + "you": "Du", + "@you": { + "description": "Beschriftung für den aktuellen Benutzer in Nachrichtenblasen" + }, + + "offlineVectorMaps": "Offline-Vektorkarten", + "@offlineVectorMaps": { + "description": "Titel für den Abschnitt Offline-Vektorkarten" + }, + + "offlineVectorMapsDescription": "Importieren und verwalten Sie Offline-Vektorkarten-Tiles (MBTiles-Format) zur Verwendung ohne Internetverbindung", + "@offlineVectorMapsDescription": { + "description": "Beschreibung für den Abschnitt Offline-Vektorkarten" + }, + + "importMbtiles": "MBTiles-Datei importieren", + "@importMbtiles": { + "description": "Schaltfläche zum Importieren einer MBTiles-Datei" + }, + + "importMbtilesNote": "Unterstützt MBTiles-Dateien mit Vektor-Tiles (PBF/MVT-Format). Geofabrik-Auszüge funktionieren hervorragend!", + "@importMbtilesNote": { + "description": "Hinweis zu unterstützten MBTiles-Dateitypen" + }, + + "noMbtilesFiles": "Keine Offline-Vektorkarten gefunden", + "@noMbtilesFiles": { + "description": "Nachricht, wenn keine MBTiles-Dateien verfügbar sind" + }, + + "mbtilesImportedSuccessfully": "MBTiles-Datei erfolgreich importiert", + "@mbtilesImportedSuccessfully": { + "description": "Erfolgsmeldung nach dem Importieren der MBTiles-Datei" + }, + + "failedToImportMbtiles": "Fehler beim Importieren der MBTiles-Datei", + "@failedToImportMbtiles": { + "description": "Fehlermeldung, wenn MBTiles-Import fehlschlägt" + }, + + "deleteMbtilesConfirmTitle": "Offline-Karte löschen", + "@deleteMbtilesConfirmTitle": { + "description": "Titel für MBTiles-Löschbestätigungsdialog" + }, + + "deleteMbtilesConfirmMessage": "Sind Sie sicher, dass Sie \"{name}\" löschen möchten? Dies entfernt die Offline-Karte dauerhaft.", + "@deleteMbtilesConfirmMessage": { + "description": "Bestätigungsnachricht zum Löschen der MBTiles-Datei", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "mbtilesDeletedSuccessfully": "Offline-Karte erfolgreich gelöscht", + "@mbtilesDeletedSuccessfully": { + "description": "Erfolgsmeldung nach dem Löschen der MBTiles-Datei" + }, + + "failedToDeleteMbtiles": "Fehler beim Löschen der Offline-Karte", + "@failedToDeleteMbtiles": { + "description": "Fehlermeldung, wenn MBTiles-Löschung fehlschlägt" + }, + + "vectorTiles": "Vektor-Tiles", + "@vectorTiles": { + "description": "Beschriftung für Vektor-Tile-Typ" + }, + + "schema": "Schema", + "@schema": { + "description": "Beschriftung für Vektor-Tile-Schema" + }, + + "unknown": "Unbekannt", + "@unknown": { + "description": "Beschriftung für unbekannten Wert" + }, + + "bounds": "Grenzen", + "@bounds": { + "description": "Beschriftung für geografische Grenzen" + }, + + "onlineLayers": "Online-Ebenen", + "@onlineLayers": { + "description": "Überschrift für Online-Kartenebenen" + }, + + "offlineLayers": "Offline-Ebenen", + "@offlineLayers": { + "description": "Überschrift für Offline-Kartenebenen (MBTiles)" + }, + + "locationTrail": "Standortverlauf", + "@locationTrail": { + "description": "Titel des Standortverlaufs" + }, + + "showTrailOnMap": "Verlauf auf Karte anzeigen", + "@showTrailOnMap": { + "description": "Umschalter zum Ein-/Ausblenden des Verlaufs auf der Karte" + }, + + "trailVisible": "Verlauf ist auf der Karte sichtbar", + "@trailVisible": { + "description": "Verlaufssichtbarkeitsstatus - sichtbar" + }, + + "trailHiddenRecording": "Verlauf ist ausgeblendet (Aufzeichnung läuft noch)", + "@trailHiddenRecording": { + "description": "Verlaufssichtbarkeitsstatus - ausgeblendet, aber Aufzeichnung läuft" + }, + + "distance": "Entfernung", + "@distance": { + "description": "Beschriftung der Entfernung" + }, + + "duration": "Dauer", + "@duration": { + "description": "Beschriftung der Dauer" + }, + + "points": "Punkte", + "@points": { + "description": "Beschriftung der Verlaufspunkte-Anzahl" + }, + + "clearTrail": "Verlauf löschen", + "@clearTrail": { + "description": "Schaltfläche zum Löschen des Standortverlaufs" + }, + + "clearTrailQuestion": "Verlauf löschen?", + "@clearTrailQuestion": { + "description": "Titel des Bestätigungsdialogs" + }, + + "clearTrailConfirmation": "Sind Sie sicher, dass Sie den aktuellen Standortverlauf löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "@clearTrailConfirmation": { + "description": "Nachricht des Bestätigungsdialogs" + }, + + "noTrailRecorded": "Noch kein Verlauf aufgezeichnet", + "@noTrailRecorded": { + "description": "Nachricht, wenn kein Verlauf vorhanden ist" + }, + + "startTrackingToRecord": "Standort-Tracking starten, um Ihren Verlauf aufzuzeichnen", + "@startTrackingToRecord": { + "description": "Anweisungen zum Starten der Verlaufsaufzeichnung" + }, + + "trailControls": "Verlaufssteuerung", + "@trailControls": { + "description": "Tooltip für Verlaufssteuerung" + }, + + "deviceInformation": "Geräteinformationen", + "@deviceInformation": { + "description": "Überschrift des Geräteinformationen-Bereichs" + }, + + "bleName": "BLE-Name", + "@bleName": { + "description": "Beschriftung des Bluetooth-Low-Energy-Gerätenamens" + }, + + "meshName": "Mesh-Name", + "@meshName": { + "description": "Beschriftung des Mesh-Netzwerknamens" + }, + + "notSet": "Nicht festgelegt", + "@notSet": { + "description": "Beschriftung, wenn ein Wert nicht festgelegt ist" + }, + + "model": "Modell", + "@model": { + "description": "Beschriftung des Gerätemodells" + }, + + "version": "Version", + "@version": { + "description": "Beschriftung der Version" + }, + + "buildDate": "Build-Datum", + "@buildDate": { + "description": "Beschriftung des Firmware-Build-Datums" + }, + + "firmware": "Firmware", + "@firmware": { + "description": "Beschriftung der Firmware" + }, + + "maxContacts": "Max. Kontakte", + "@maxContacts": { + "description": "Beschriftung der maximalen Kontaktkapazität" + }, + + "maxChannels": "Max. Kanäle", + "@maxChannels": { + "description": "Beschriftung der maximalen Kanalkapazität" + }, + + "publicInfo": "Öffentliche Informationen", + "@publicInfo": { + "description": "Überschrift des öffentlichen Informationen-Bereichs" + }, + + "meshNetworkName": "Mesh-Netzwerkname", + "@meshNetworkName": { + "description": "Beschriftung des Mesh-Netzwerknamens-Felds" + }, + + "nameBroadcastInMesh": "Name, der in Mesh-Sendungen übertragen wird", + "@nameBroadcastInMesh": { + "description": "Hilfetext für Mesh-Netzwerknamens-Feld" + }, + + "telemetryAndLocationSharing": "Telemetrie & Standortfreigabe", + "@telemetryAndLocationSharing": { + "description": "Beschriftung des Telemetrie- und Standortfreigabe-Umschalters" + }, + + "lat": "Lat", + "@lat": { + "description": "Beschriftung des Breitengradfelds (Kurzform)" + }, + + "lon": "Lon", + "@lon": { + "description": "Beschriftung des Längengradfelds (Kurzform)" + }, + + "useCurrentLocation": "Aktuellen Standort verwenden", + "@useCurrentLocation": { + "description": "Tooltip für Schaltfläche zum Verwenden des aktuellen Standorts" + }, + + "noneUnknown": "Keine/Unbekannt", + "@noneUnknown": { + "description": "Gerätetyp: keine oder unbekannt" + }, + + "chatNode": "Chat-Knoten", + "@chatNode": { + "description": "Gerätetyp: Chat-Knoten" + }, + + "repeater": "Repeater", + "@repeater": { + "description": "Gerätetyp: Repeater" + }, + + "roomChannel": "Raum/Kanal", + "@roomChannel": { + "description": "Gerätetyp: Raum oder Kanal" + }, + + "typeNumber": "Typ {number}", + "@typeNumber": { + "description": "Generischer Gerätetyp mit Nummer", + "placeholders": { + "number": { + "type": "int" + } + } + }, + + "copiedToClipboardShort": "{label} in Zwischenablage kopiert", + "@copiedToClipboardShort": { + "description": "Kurze Erfolgsmeldung beim Kopieren in die Zwischenablage", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "failedToSave": "Fehler beim Speichern: {error}", + "@failedToSave": { + "description": "Allgemeine Fehlermeldung für Speicherfehler", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToGetLocation": "Fehler beim Abrufen des Standorts: {error}", + "@failedToGetLocation": { + "description": "Fehlermeldung, wenn das Abrufen des Standorts fehlschlägt", + "placeholders": { + "error": { + "type": "String" + } + } + } +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 42b8d74..f22fc7f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1886,5 +1886,215 @@ "offlineLayers": "Offline Layers", "@offlineLayers": { "description": "Section header for offline map layers (MBTiles)" + }, + + "locationTrail": "Location Trail", + "@locationTrail": { + "description": "Location trail title" + }, + + "showTrailOnMap": "Show Trail on Map", + "@showTrailOnMap": { + "description": "Toggle to show/hide trail on map" + }, + + "trailVisible": "Trail is visible on the map", + "@trailVisible": { + "description": "Trail visibility status - visible" + }, + + "trailHiddenRecording": "Trail is hidden (still recording)", + "@trailHiddenRecording": { + "description": "Trail visibility status - hidden but recording" + }, + + "distance": "Distance", + "@distance": { + "description": "Distance label" + }, + + "duration": "Duration", + "@duration": { + "description": "Duration label" + }, + + "points": "Points", + "@points": { + "description": "Trail points count label" + }, + + "clearTrail": "Clear Trail", + "@clearTrail": { + "description": "Button to clear location trail" + }, + + "clearTrailQuestion": "Clear Trail?", + "@clearTrailQuestion": { + "description": "Confirmation dialog title" + }, + + "clearTrailConfirmation": "Are you sure you want to clear the current location trail? This action cannot be undone.", + "@clearTrailConfirmation": { + "description": "Confirmation dialog message" + }, + + "noTrailRecorded": "No trail recorded yet", + "@noTrailRecorded": { + "description": "Message when no trail exists" + }, + + "startTrackingToRecord": "Start location tracking to record your trail", + "@startTrackingToRecord": { + "description": "Instructions to start trail recording" + }, + + "trailControls": "Trail Controls", + "@trailControls": { + "description": "Trail controls tooltip" + }, + + "deviceInformation": "Device Information", + "@deviceInformation": { + "description": "Device information section header" + }, + + "bleName": "BLE Name", + "@bleName": { + "description": "Bluetooth Low Energy device name label" + }, + + "meshName": "Mesh Name", + "@meshName": { + "description": "Mesh network name label" + }, + + "notSet": "Not set", + "@notSet": { + "description": "Label when a value is not set" + }, + + "model": "Model", + "@model": { + "description": "Device model label" + }, + + "version": "Version", + "@version": { + "description": "Version label" + }, + + "buildDate": "Build Date", + "@buildDate": { + "description": "Firmware build date label" + }, + + "firmware": "Firmware", + "@firmware": { + "description": "Firmware label" + }, + + "maxContacts": "Max Contacts", + "@maxContacts": { + "description": "Maximum contacts capacity label" + }, + + "maxChannels": "Max Channels", + "@maxChannels": { + "description": "Maximum channels capacity label" + }, + + "publicInfo": "Public Info", + "@publicInfo": { + "description": "Public information section header" + }, + + "meshNetworkName": "Mesh Network Name", + "@meshNetworkName": { + "description": "Mesh network name field label" + }, + + "nameBroadcastInMesh": "Name broadcast in mesh advertisements", + "@nameBroadcastInMesh": { + "description": "Helper text for mesh network name field" + }, + + "telemetryAndLocationSharing": "Telemetry & Location Sharing", + "@telemetryAndLocationSharing": { + "description": "Telemetry and location sharing toggle label" + }, + + "lat": "Lat", + "@lat": { + "description": "Latitude field label (short form)" + }, + + "lon": "Lon", + "@lon": { + "description": "Longitude field label (short form)" + }, + + "useCurrentLocation": "Use current location", + "@useCurrentLocation": { + "description": "Tooltip for use current location button" + }, + + "noneUnknown": "None/Unknown", + "@noneUnknown": { + "description": "Device type: none or unknown" + }, + + "chatNode": "Chat Node", + "@chatNode": { + "description": "Device type: chat node" + }, + + "repeater": "Repeater", + "@repeater": { + "description": "Device type: repeater" + }, + + "roomChannel": "Room/Channel", + "@roomChannel": { + "description": "Device type: room or channel" + }, + + "typeNumber": "Type {number}", + "@typeNumber": { + "description": "Generic device type with number", + "placeholders": { + "number": { + "type": "int" + } + } + }, + + "copiedToClipboardShort": "Copied {label} to clipboard", + "@copiedToClipboardShort": { + "description": "Short success message when copying to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "failedToSave": "Failed to save: {error}", + "@failedToSave": { + "description": "Generic error message for save failures", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToGetLocation": "Failed to get location: {error}", + "@failedToGetLocation": { + "description": "Error message when getting location fails", + "placeholders": { + "error": { + "type": "String" + } + } } } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb new file mode 100644 index 0000000..9c3ad15 --- /dev/null +++ b/lib/l10n/app_es.arb @@ -0,0 +1,2095 @@ +{ + "@@locale": "es", + + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "El título de la aplicación" + }, + + "messages": "Mensajes", + "@messages": { + "description": "Etiqueta de la pestaña de mensajes" + }, + + "contacts": "Contactos", + "@contacts": { + "description": "Etiqueta de la pestaña de contactos" + }, + + "map": "Mapa", + "@map": { + "description": "Etiqueta de la pestaña del mapa" + }, + + "settings": "Configuración", + "@settings": { + "description": "Título de la pantalla de configuración" + }, + + "connect": "Conectar", + "@connect": { + "description": "Etiqueta del botón de conectar" + }, + + "disconnect": "Desconectar", + "@disconnect": { + "description": "Etiqueta del botón de desconectar" + }, + + "scanningForDevices": "Buscando dispositivos...", + "@scanningForDevices": { + "description": "Texto mostrado al buscar dispositivos BLE" + }, + + "noDevicesFound": "No se encontraron dispositivos", + "@noDevicesFound": { + "description": "Texto mostrado cuando no se encuentran dispositivos BLE" + }, + + "scanAgain": "Buscar de nuevo", + "@scanAgain": { + "description": "Botón para reiniciar el escaneo BLE" + }, + + "tapToConnect": "Toca para conectar", + "@tapToConnect": { + "description": "Texto de subtítulo para dispositivo en la lista de escaneo" + }, + + "deviceNotConnected": "Dispositivo no conectado", + "@deviceNotConnected": { + "description": "Mensaje de error cuando el dispositivo no está conectado" + }, + + "locationPermissionDenied": "Permiso de ubicación denegado", + "@locationPermissionDenied": { + "description": "Error cuando se deniega el permiso de ubicación" + }, + + "locationPermissionPermanentlyDenied": "Permiso de ubicación denegado permanentemente. Por favor, actívalo en Configuración.", + "@locationPermissionPermanentlyDenied": { + "description": "Error cuando el permiso de ubicación se deniega permanentemente" + }, + + "locationPermissionRequired": "El permiso de ubicación es necesario para el seguimiento GPS y la coordinación del equipo. Puedes activarlo más tarde en Configuración.", + "@locationPermissionRequired": { + "description": "Mensaje cuando se necesita el permiso de ubicación" + }, + + "locationServicesDisabled": "Los servicios de ubicación están desactivados. Por favor, actívalos en Configuración.", + "@locationServicesDisabled": { + "description": "Error cuando los servicios de ubicación están desactivados" + }, + + "failedToGetGpsLocation": "Error al obtener la ubicación GPS", + "@failedToGetGpsLocation": { + "description": "Error cuando no se puede obtener la ubicación GPS" + }, + + "advertisedAtLocation": "Anunciado en {latitude}, {longitude}", + "@advertisedAtLocation": { + "description": "Mensaje de éxito mostrando la ubicación anunciada", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "failedToAdvertise": "Error al anunciar: {error}", + "@failedToAdvertise": { + "description": "Mensaje de error para anuncio fallido", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "reconnecting": "Reconectando... ({attempt}/{max})", + "@reconnecting": { + "description": "Texto mostrado durante los intentos de reconexión", + "placeholders": { + "attempt": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + + "cancelReconnection": "Cancelar reconexión", + "@cancelReconnection": { + "description": "Tooltip para el botón de cancelar reconexión" + }, + + "mapManagement": "Gestión de mapas", + "@mapManagement": { + "description": "Elemento del menú para gestión de mapas" + }, + + "general": "General", + "@general": { + "description": "Encabezado de la sección de configuración general" + }, + + "theme": "Tema", + "@theme": { + "description": "Etiqueta de la configuración del tema" + }, + + "chooseTheme": "Elegir tema", + "@chooseTheme": { + "description": "Título del diálogo de selección de tema" + }, + + "light": "Claro", + "@light": { + "description": "Opción de tema claro" + }, + + "dark": "Oscuro", + "@dark": { + "description": "Opción de tema oscuro" + }, + + "blueLightTheme": "Tema azul claro", + "@blueLightTheme": { + "description": "Descripción del tema azul claro" + }, + + "blueDarkTheme": "Tema azul oscuro", + "@blueDarkTheme": { + "description": "Descripción del tema azul oscuro" + }, + + "sarRed": "SAR Rojo", + "@sarRed": { + "description": "Opción de tema SAR Rojo" + }, + + "alertEmergencyMode": "Modo de alerta/emergencia", + "@alertEmergencyMode": { + "description": "Descripción del tema SAR Rojo" + }, + + "sarGreen": "SAR Verde", + "@sarGreen": { + "description": "Opción de tema SAR Verde" + }, + + "safeAllClearMode": "Modo seguro/todo despejado", + "@safeAllClearMode": { + "description": "Descripción del tema SAR Verde" + }, + + "autoSystem": "Auto (Sistema)", + "@autoSystem": { + "description": "Opción de tema automático/sistema" + }, + + "followSystemTheme": "Seguir el tema del sistema", + "@followSystemTheme": { + "description": "Descripción del tema del sistema" + }, + + "showRxTxIndicators": "Mostrar indicadores RX/TX", + "@showRxTxIndicators": { + "description": "Configuración para mostrar indicadores RX/TX" + }, + + "displayPacketActivity": "Mostrar indicadores de actividad de paquetes en la barra superior", + "@displayPacketActivity": { + "description": "Descripción de la configuración de indicadores RX/TX" + }, + + "language": "Idioma", + "@language": { + "description": "Etiqueta de la configuración de idioma" + }, + + "chooseLanguage": "Elegir idioma", + "@chooseLanguage": { + "description": "Título del diálogo de selección de idioma" + }, + + "english": "Inglés", + "@english": { + "description": "Opción de idioma inglés" + }, + + "slovenian": "Esloveno", + "@slovenian": { + "description": "Opción de idioma esloveno" + }, + + "croatian": "Croata", + "@croatian": { + "description": "Opción de idioma croata" + }, + + "locationBroadcasting": "Difusión de ubicación", + "@locationBroadcasting": { + "description": "Encabezado de la sección de configuración de ubicación" + }, + + "autoLocationTracking": "Seguimiento automático de ubicación", + "@autoLocationTracking": { + "description": "Configuración de seguimiento automático de ubicación" + }, + + "automaticallyBroadcastPosition": "Difundir automáticamente actualizaciones de posición", + "@automaticallyBroadcastPosition": { + "description": "Descripción del seguimiento automático de ubicación" + }, + + "configureTracking": "Configurar seguimiento", + "@configureTracking": { + "description": "Etiqueta del botón de configurar seguimiento" + }, + + "distanceAndTimeThresholds": "Umbrales de distancia y tiempo", + "@distanceAndTimeThresholds": { + "description": "Descripción de la configuración de seguimiento" + }, + + "locationTrackingConfiguration": "Configuración de seguimiento de ubicación", + "@locationTrackingConfiguration": { + "description": "Título del diálogo de configuración de seguimiento" + }, + + "configureWhenLocationBroadcasts": "Configurar cuándo se envían difusiones de ubicación a la red mesh", + "@configureWhenLocationBroadcasts": { + "description": "Descripción del diálogo de configuración de seguimiento" + }, + + "minimumDistance": "Distancia mínima", + "@minimumDistance": { + "description": "Etiqueta de la configuración de distancia mínima" + }, + + "broadcastAfterMoving": "Difundir solo después de moverse {distance} metros", + "@broadcastAfterMoving": { + "description": "Descripción de la distancia mínima", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "maximumDistance": "Distancia máxima", + "@maximumDistance": { + "description": "Etiqueta de la configuración de distancia máxima" + }, + + "alwaysBroadcastAfterMoving": "Siempre difundir después de moverse {distance} metros", + "@alwaysBroadcastAfterMoving": { + "description": "Descripción de la distancia máxima", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "minimumTimeInterval": "Intervalo de tiempo mínimo", + "@minimumTimeInterval": { + "description": "Etiqueta de la configuración de intervalo de tiempo mínimo" + }, + + "alwaysBroadcastEvery": "Siempre difundir cada {duration}", + "@alwaysBroadcastEvery": { + "description": "Descripción del intervalo de tiempo", + "placeholders": { + "duration": { + "type": "String" + } + } + }, + + "save": "Guardar", + "@save": { + "description": "Etiqueta del botón de guardar" + }, + + "cancel": "Cancelar", + "@cancel": { + "description": "Etiqueta del botón de cancelar" + }, + + "close": "Cerrar", + "@close": { + "description": "Etiqueta del botón de cerrar" + }, + + "about": "Acerca de", + "@about": { + "description": "Encabezado de la sección acerca de" + }, + + "appVersion": "Versión de la aplicación", + "@appVersion": { + "description": "Etiqueta de la versión de la aplicación" + }, + + "appName": "Nombre de la aplicación", + "@appName": { + "description": "Etiqueta del nombre de la aplicación" + }, + + "aboutMeshCoreSar": "Acerca de MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "Título del diálogo acerca de" + }, + + "aboutDescription": "Una aplicación de Búsqueda y Rescate diseñada para equipos de respuesta a emergencias. Las características incluyen:\n\n• Red mesh BLE para comunicación entre dispositivos\n• Mapas sin conexión con múltiples opciones de capas\n• Seguimiento en tiempo real de miembros del equipo\n• Marcadores tácticos SAR (persona encontrada, fuego, zona de preparación)\n• Gestión de contactos y mensajería\n• Seguimiento GPS con rumbo de brújula\n• Caché de teselas de mapa para uso sin conexión", + "@aboutDescription": { + "description": "Descripción del diálogo acerca de" + }, + + "technologiesUsed": "Tecnologías utilizadas:", + "@technologiesUsed": { + "description": "Título de la sección de tecnologías utilizadas" + }, + + "technologiesList": "• Flutter para desarrollo multiplataforma\n• BLE (Bluetooth Low Energy) para redes mesh\n• OpenStreetMap para mapas\n• Provider para gestión de estado\n• SharedPreferences para almacenamiento local", + "@technologiesList": { + "description": "Lista de tecnologías utilizadas" + }, + + "developer": "Desarrollador", + "@developer": { + "description": "Encabezado de la sección de desarrollador" + }, + + "packageName": "Nombre del paquete", + "@packageName": { + "description": "Etiqueta del nombre del paquete" + }, + + "sampleData": "Datos de muestra", + "@sampleData": { + "description": "Encabezado de la sección de datos de muestra" + }, + + "sampleDataDescription": "Cargar o borrar contactos de muestra, mensajes de canal y marcadores SAR para pruebas", + "@sampleDataDescription": { + "description": "Descripción de la sección de datos de muestra" + }, + + "loadSampleData": "Cargar datos de muestra", + "@loadSampleData": { + "description": "Botón de cargar datos de muestra" + }, + + "clearAllData": "Borrar todos los datos", + "@clearAllData": { + "description": "Botón de borrar todos los datos" + }, + + "clearAllDataConfirmTitle": "Borrar todos los datos", + "@clearAllDataConfirmTitle": { + "description": "Título del diálogo de confirmación de borrar datos" + }, + + "clearAllDataConfirmMessage": "Esto borrará todos los contactos y marcadores SAR. ¿Estás seguro?", + "@clearAllDataConfirmMessage": { + "description": "Mensaje de confirmación de borrar datos" + }, + + "clear": "Borrar", + "@clear": { + "description": "Etiqueta del botón de borrar" + }, + + "loadedSampleData": "Cargados {teamCount} miembros del equipo, {channelCount} canales, {sarCount} marcadores SAR, {messageCount} mensajes", + "@loadedSampleData": { + "description": "Mensaje de éxito después de cargar datos de muestra", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + + "failedToLoadSampleData": "Error al cargar datos de muestra: {error}", + "@failedToLoadSampleData": { + "description": "Mensaje de error cuando fallan los datos de muestra", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "allDataCleared": "Todos los datos borrados", + "@allDataCleared": { + "description": "Mensaje de éxito después de borrar todos los datos" + }, + + "failedToStartBackgroundTracking": "Error al iniciar el seguimiento en segundo plano. Verifica los permisos y la conexión BLE.", + "@failedToStartBackgroundTracking": { + "description": "Mensaje de error cuando falla el inicio del seguimiento en segundo plano" + }, + + "locationBroadcast": "Difusión de ubicación: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Mensaje de éxito para difusión de ubicación", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "defaultPinInfo": "El PIN predeterminado para dispositivos sin pantalla es 123456. ¿Problemas para emparejar? Olvida el dispositivo bluetooth en la configuración del sistema.", + "@defaultPinInfo": { + "description": "Información sobre el PIN predeterminado para emparejamiento" + }, + + "noMessagesYet": "Aún no hay mensajes", + "@noMessagesYet": { + "description": "Mensaje de estado vacío cuando no hay mensajes" + }, + + "pullDownToSync": "Desliza hacia abajo para sincronizar mensajes", + "@pullDownToSync": { + "description": "Instrucción para deslizar hacia abajo para actualizar mensajes" + }, + + "deleteContact": "Eliminar contacto", + "@deleteContact": { + "description": "Etiqueta de la acción de eliminar contacto" + }, + + "delete": "Eliminar", + "@delete": { + "description": "Etiqueta del botón de eliminar" + }, + + "viewOnMap": "Ver en el mapa", + "@viewOnMap": { + "description": "Acción para ver la ubicación del contacto en el mapa" + }, + + "refresh": "Actualizar", + "@refresh": { + "description": "Etiqueta del botón de actualizar" + }, + + "sendDirectMessage": "Enviar mensaje directo", + "@sendDirectMessage": { + "description": "Acción para enviar mensaje directo al contacto" + }, + + "resetPath": "Restablecer ruta (Re-enrutar)", + "@resetPath": { + "description": "Acción para restablecer la ruta del contacto para re-enrutamiento" + }, + + "publicKeyCopied": "Clave pública copiada al portapapeles", + "@publicKeyCopied": { + "description": "Mensaje de éxito cuando se copia la clave pública" + }, + + "copiedToClipboard": "{label} copiado al portapapeles", + "@copiedToClipboard": { + "description": "Mensaje de éxito cuando se copia un valor al portapapeles", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "pleaseEnterPassword": "Por favor, introduce una contraseña", + "@pleaseEnterPassword": { + "description": "Mensaje de validación para campo de contraseña vacío" + }, + + "failedToSyncContacts": "Error al sincronizar contactos: {error}", + "@failedToSyncContacts": { + "description": "Mensaje de error cuando falla la sincronización de contactos", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "loggedInSuccessfully": "¡Inicio de sesión exitoso! Esperando mensajes de la sala...", + "@loggedInSuccessfully": { + "description": "Mensaje de éxito después de iniciar sesión en la sala exitosamente" + }, + + "loginFailed": "Error de inicio de sesión - contraseña incorrecta", + "@loginFailed": { + "description": "Mensaje de error cuando falla el inicio de sesión en la sala" + }, + + "loggingIn": "Iniciando sesión en {roomName}...", + "@loggingIn": { + "description": "Mensaje de estado durante el proceso de inicio de sesión en la sala", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "failedToSendLogin": "Error al enviar inicio de sesión: {error}", + "@failedToSendLogin": { + "description": "Mensaje de error cuando falla el envío del comando de inicio de sesión", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "lowLocationAccuracy": "Baja precisión de ubicación", + "@lowLocationAccuracy": { + "description": "Título de advertencia para baja precisión GPS" + }, + + "continue_": "Continuar", + "@continue_": { + "description": "Etiqueta del botón de continuar" + }, + + "sendSarMarker": "Enviar marcador SAR", + "@sendSarMarker": { + "description": "Acción para enviar marcador SAR" + }, + + "deleteDrawing": "Eliminar dibujo", + "@deleteDrawing": { + "description": "Acción para eliminar un dibujo del mapa" + }, + + "drawLine": "Dibujar línea", + "@drawLine": { + "description": "Modo de dibujo del mapa: línea" + }, + + "drawLineDesc": "Dibujar una línea a mano alzada en el mapa", + "@drawLineDesc": { + "description": "Descripción del modo de dibujo de línea" + }, + + "drawRectangle": "Dibujar rectángulo", + "@drawRectangle": { + "description": "Modo de dibujo del mapa: rectángulo" + }, + + "drawRectangleDesc": "Dibujar un área rectangular en el mapa", + "@drawRectangleDesc": { + "description": "Descripción del modo de dibujo de rectángulo" + }, + + "shareDrawings": "Compartir dibujos", + "@shareDrawings": { + "description": "Acción para compartir dibujos a la red" + }, + + "clearAllDrawings": "Borrar todos los dibujos", + "@clearAllDrawings": { + "description": "Acción para borrar todos los dibujos locales" + }, + + "clearAll": "Borrar todo", + "@clearAll": { + "description": "Etiqueta del botón de borrar todo" + }, + + "noLocalDrawings": "No hay dibujos locales para compartir", + "@noLocalDrawings": { + "description": "Mensaje cuando no hay dibujos para compartir" + }, + + "publicChannel": "Canal público", + "@publicChannel": { + "description": "Opción de canal público para compartir" + }, + + "broadcastToAll": "Difundir a todos los nodos cercanos (efímero)", + "@broadcastToAll": { + "description": "Descripción de la difusión de canal público" + }, + + "storedPermanently": "Almacenado permanentemente en la sala", + "@storedPermanently": { + "description": "Descripción de la permanencia del almacenamiento en la sala" + }, + + "notConnectedToDevice": "No conectado al dispositivo", + "@notConnectedToDevice": { + "description": "Mensaje de error cuando el dispositivo no está conectado para mensajería directa" + }, + + "directMessage": "Mensaje directo", + "@directMessage": { + "description": "Título de la hoja de mensaje directo" + }, + + "directMessageSentTo": "Mensaje directo enviado a {contactName}", + "@directMessageSentTo": { + "description": "Mensaje de éxito después de enviar mensaje directo", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "failedToSend": "Error al enviar: {error}", + "@failedToSend": { + "description": "Mensaje de error cuando falla el envío de mensaje directo", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "directMessageInfo": "Este mensaje se enviará directamente a {contactName}. También aparecerá en el feed de mensajes principal.", + "@directMessageInfo": { + "description": "Información sobre el comportamiento de la mensajería directa", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "typeYourMessage": "Escribe tu mensaje...", + "@typeYourMessage": { + "description": "Texto de marcador de posición para el campo de entrada de mensaje" + }, + + "quickLocationMarker": "Marcador de ubicación rápida", + "@quickLocationMarker": { + "description": "Subtítulo para el encabezado de la hoja de marcador SAR" + }, + + "markerType": "Tipo de marcador", + "@markerType": { + "description": "Etiqueta para la sección de selección de tipo de marcador" + }, + + "sendTo": "Enviar a", + "@sendTo": { + "description": "Etiqueta para la sección de selección de destino" + }, + + "noDestinationsAvailable": "No hay destinos disponibles.", + "@noDestinationsAvailable": { + "description": "Advertencia cuando no existen salas o canales" + }, + + "selectDestination": "Seleccionar destino...", + "@selectDestination": { + "description": "Marcador de posición para menú desplegable de destino" + }, + + "ephemeralBroadcastInfo": "Efímero: Solo difusión por el aire. No se almacena - los nodos deben estar en línea.", + "@ephemeralBroadcastInfo": { + "description": "Información sobre difusiones de canal efímeras" + }, + + "persistentRoomInfo": "Persistente: Almacenado de manera inmutable en la sala. Se sincroniza automáticamente y se conserva sin conexión.", + "@persistentRoomInfo": { + "description": "Información sobre almacenamiento persistente en sala" + }, + + "location": "Ubicación", + "@location": { + "description": "Etiqueta para la sección de ubicación" + }, + + "fromMap": "Desde el mapa", + "@fromMap": { + "description": "Insignia que muestra que la ubicación es desde un toque en el mapa" + }, + + "gettingLocation": "Obteniendo ubicación...", + "@gettingLocation": { + "description": "Mensaje de carga mientras se obtiene la ubicación GPS" + }, + + "locationError": "Error de ubicación", + "@locationError": { + "description": "Título para mensajes de error de ubicación" + }, + + "retry": "Reintentar", + "@retry": { + "description": "Etiqueta del botón de reintentar" + }, + + "refreshLocation": "Actualizar ubicación", + "@refreshLocation": { + "description": "Tooltip para el botón de actualizar ubicación" + }, + + "accuracyMeters": "Precisión: ±{accuracy}m", + "@accuracyMeters": { + "description": "Visualización de la precisión GPS en metros", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "notesOptional": "Notas (opcional)", + "@notesOptional": { + "description": "Etiqueta para el campo de notas opcional" + }, + + "addAdditionalInformation": "Agregar información adicional...", + "@addAdditionalInformation": { + "description": "Marcador de posición para el campo de notas" + }, + + "lowAccuracyWarning": "La precisión de la ubicación es ±{accuracy}m. Esto puede no ser lo suficientemente preciso para operaciones SAR.\n\n¿Continuar de todos modos?", + "@lowAccuracyWarning": { + "description": "Contenido del diálogo de advertencia para baja precisión GPS", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "loginToRoom": "Iniciar sesión en la sala", + "@loginToRoom": { + "description": "Título del diálogo de inicio de sesión en la sala" + }, + + "enterPasswordInfo": "Introduce la contraseña para acceder a esta sala. La contraseña se guardará para uso futuro.", + "@enterPasswordInfo": { + "description": "Información sobre la contraseña de la sala" + }, + + "password": "Contraseña", + "@password": { + "description": "Etiqueta del campo de contraseña" + }, + + "enterRoomPassword": "Introduce la contraseña de la sala", + "@enterRoomPassword": { + "description": "Sugerencia del campo de contraseña" + }, + + "loggingInDots": "Iniciando sesión...", + "@loggingInDots": { + "description": "Texto del botón mientras se inicia sesión" + }, + + "login": "Iniciar sesión", + "@login": { + "description": "Etiqueta del botón de iniciar sesión" + }, + + "failedToAddRoom": "Error al agregar la sala al dispositivo: {error}\n\nLa sala puede no haber anunciado aún.\nIntenta esperar a que la sala transmita.", + "@failedToAddRoom": { + "description": "Mensaje de error cuando falla la adición de la sala", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "direct": "Directo", + "@direct": { + "description": "Indicador de enrutamiento directo" + }, + + "flood": "Inundación", + "@flood": { + "description": "Indicador de enrutamiento por inundación" + }, + + "admin": "Admin", + "@admin": { + "description": "Etiqueta de insignia de administrador" + }, + + "loggedIn": "Sesión iniciada", + "@loggedIn": { + "description": "Insignia de estado de sesión iniciada" + }, + + "noGpsData": "Sin datos GPS", + "@noGpsData": { + "description": "Mensaje cuando los datos GPS no están disponibles" + }, + + "distance": "Distancia", + "@distance": { + "description": "Etiqueta de distancia" + }, + + "pingingDirect": "Haciendo ping a {name} (directo vía ruta)...", + "@pingingDirect": { + "description": "Mensaje de estado para ping directo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingingFlood": "Haciendo ping a {name} (inundación - sin ruta)...", + "@pingingFlood": { + "description": "Mensaje de estado para ping por inundación", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "directPingTimeout": "Tiempo de espera de ping directo agotado - reintentando {name} con inundación...", + "@directPingTimeout": { + "description": "Advertencia cuando el ping directo agota el tiempo de espera", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingSuccessful": "Ping exitoso a {name}{fallback}", + "@pingSuccessful": { + "description": "Mensaje de éxito para ping", + "placeholders": { + "name": { + "type": "String" + }, + "fallback": { + "type": "String" + } + } + }, + + "viaFloodingFallback": " (vía respaldo de inundación)", + "@viaFloodingFallback": { + "description": "Sufijo para éxito de ping con respaldo" + }, + + "pingFailed": "Ping fallido a {name} - no se recibió respuesta", + "@pingFailed": { + "description": "Mensaje de error cuando falla el ping", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "deleteContactConfirmation": "¿Estás seguro de que quieres eliminar \"{name}\"?\n\nEsto eliminará el contacto tanto de la aplicación como del dispositivo de radio compañero.", + "@deleteContactConfirmation": { + "description": "Mensaje de confirmación para eliminar contacto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "removingContact": "Eliminando {name}...", + "@removingContact": { + "description": "Mensaje de estado mientras se elimina el contacto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "contactRemoved": "Contacto \"{name}\" eliminado", + "@contactRemoved": { + "description": "Mensaje de éxito después de eliminar contacto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "failedToRemoveContact": "Error al eliminar contacto: {error}", + "@failedToRemoveContact": { + "description": "Mensaje de error cuando falla la eliminación del contacto", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "type": "Tipo", + "@type": { + "description": "Etiqueta de tipo de contacto" + }, + + "publicKey": "Clave pública", + "@publicKey": { + "description": "Etiqueta de clave pública" + }, + + "lastSeen": "Visto por última vez", + "@lastSeen": { + "description": "Etiqueta de visto por última vez" + }, + + "roomStatus": "Estado de la sala", + "@roomStatus": { + "description": "Encabezado de la sección de estado de la sala" + }, + + "loginStatus": "Estado de inicio de sesión", + "@loginStatus": { + "description": "Etiqueta de estado de inicio de sesión" + }, + + "notLoggedIn": "No ha iniciado sesión", + "@notLoggedIn": { + "description": "Estado de no ha iniciado sesión" + }, + + "adminAccess": "Acceso de administrador", + "@adminAccess": { + "description": "Etiqueta de acceso de administrador" + }, + + "yes": "Sí", + "@yes": { + "description": "Respuesta sí" + }, + + "no": "No", + "@no": { + "description": "Respuesta no" + }, + + "permissions": "Permisos", + "@permissions": { + "description": "Etiqueta de permisos" + }, + + "passwordSaved": "Contraseña guardada", + "@passwordSaved": { + "description": "Etiqueta de contraseña guardada" + }, + + "locationColon": "Ubicación:", + "@locationColon": { + "description": "Encabezado de la sección de ubicación" + }, + + "telemetry": "Telemetría", + "@telemetry": { + "description": "Encabezado de la sección de telemetría" + }, + + "requestingTelemetry": "Solicitando telemetría de {name}...", + "@requestingTelemetry": { + "description": "Mensaje de estado mientras se solicita telemetría", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "voltage": "Voltaje", + "@voltage": { + "description": "Etiqueta de voltaje" + }, + + "battery": "Batería", + "@battery": { + "description": "Etiqueta de batería" + }, + + "temperature": "Temperatura", + "@temperature": { + "description": "Etiqueta de temperatura" + }, + + "humidity": "Humedad", + "@humidity": { + "description": "Etiqueta de humedad" + }, + + "pressure": "Presión", + "@pressure": { + "description": "Etiqueta de presión" + }, + + "gpsTelemetry": "GPS (Telemetría)", + "@gpsTelemetry": { + "description": "Etiqueta de GPS desde telemetría" + }, + + "updated": "Actualizado", + "@updated": { + "description": "Etiqueta de marca de tiempo actualizada" + }, + + "pathResetInfo": "Ruta restablecida para {name}. El próximo mensaje encontrará una nueva ruta.", + "@pathResetInfo": { + "description": "Mensaje de información después de restablecer ruta", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "reLoginToRoom": "Re-iniciar sesión en la sala", + "@reLoginToRoom": { + "description": "Botón para re-iniciar sesión en la sala" + }, + + "heading": "Rumbo", + "@heading": { + "description": "Etiqueta de rumbo de brújula" + }, + + "elevation": "Elevación", + "@elevation": { + "description": "Etiqueta de elevación/altitud" + }, + + "accuracy": "Precisión", + "@accuracy": { + "description": "Etiqueta de precisión GPS" + }, + + "filterMarkers": "Filtrar marcadores", + "@filterMarkers": { + "description": "Título del diálogo de filtrar marcadores" + }, + + "filterMarkersTooltip": "Filtrar marcadores", + "@filterMarkersTooltip": { + "description": "Tooltip para el botón de filtrar" + }, + + "contactsFilter": "Contactos", + "@contactsFilter": { + "description": "Opción de filtro para contactos" + }, + + "repeatersFilter": "Repetidores", + "@repeatersFilter": { + "description": "Opción de filtro para repetidores" + }, + + "sarMarkers": "Marcadores SAR", + "@sarMarkers": { + "description": "Encabezado de la sección de marcadores SAR" + }, + + "foundPerson": "Persona encontrada", + "@foundPerson": { + "description": "Tipo de marcador SAR de persona encontrada" + }, + + "fire": "Fuego", + "@fire": { + "description": "Tipo de marcador SAR de fuego" + }, + + "stagingArea": "Área de preparación", + "@stagingArea": { + "description": "Tipo de marcador SAR de área de preparación" + }, + + "showAll": "Mostrar todo", + "@showAll": { + "description": "Botón para mostrar todos los filtros" + }, + + "nearbyContacts": "Contactos cercanos", + "@nearbyContacts": { + "description": "Título para la lista de contactos cercanos en brújula" + }, + + "locationUnavailable": "Ubicación no disponible", + "@locationUnavailable": { + "description": "Mensaje cuando la ubicación GPS no está disponible" + }, + + "ahead": "adelante", + "@ahead": { + "description": "Dirección de rumbo relativo - adelante" + }, + + "degreesRight": "{degrees}° derecha", + "@degreesRight": { + "description": "Dirección de rumbo relativo - derecha", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "degreesLeft": "{degrees}° izquierda", + "@degreesLeft": { + "description": "Dirección de rumbo relativo - izquierda", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Formato de visualización de latitud y longitud", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "noContactsYet": "Aún no hay contactos", + "@noContactsYet": { + "description": "Mensaje de estado vacío cuando no hay contactos" + }, + + "connectToDeviceToLoadContacts": "Conéctate a un dispositivo para cargar contactos", + "@connectToDeviceToLoadContacts": { + "description": "Instrucción para conectar dispositivo para cargar contactos" + }, + + "teamMembers": "Miembros del equipo", + "@teamMembers": { + "description": "Encabezado de sección para miembros del equipo (contactos de chat)" + }, + + "repeaters": "Repetidores", + "@repeaters": { + "description": "Encabezado de sección para nodos repetidores" + }, + + "rooms": "Salas", + "@rooms": { + "description": "Encabezado de sección para salas" + }, + + "channels": "Canales", + "@channels": { + "description": "Encabezado de sección para canales de difusión" + }, + + "cacheStatistics": "Estadísticas de caché", + "@cacheStatistics": { + "description": "Título de la sección de estadísticas de caché" + }, + + "totalTiles": "Total de teselas", + "@totalTiles": { + "description": "Etiqueta del número total de teselas en caché" + }, + + "cacheSize": "Tamaño de caché", + "@cacheSize": { + "description": "Etiqueta del tamaño de caché en MB" + }, + + "storeName": "Nombre del almacén", + "@storeName": { + "description": "Etiqueta del nombre del almacén de caché" + }, + + "noCacheStatistics": "No hay estadísticas de caché disponibles", + "@noCacheStatistics": { + "description": "Mensaje cuando las estadísticas de caché no están disponibles" + }, + + "downloadRegion": "Descargar región", + "@downloadRegion": { + "description": "Título de la sección de descargar región" + }, + + "mapLayer": "Capa de mapa", + "@mapLayer": { + "description": "Etiqueta de selección de capa de mapa" + }, + + "regionBounds": "Límites de región", + "@regionBounds": { + "description": "Título de la sección de entrada de límites de región" + }, + + "north": "Norte", + "@north": { + "description": "Etiqueta de coordenada norte" + }, + + "south": "Sur", + "@south": { + "description": "Etiqueta de coordenada sur" + }, + + "east": "Este", + "@east": { + "description": "Etiqueta de coordenada este" + }, + + "west": "Oeste", + "@west": { + "description": "Etiqueta de coordenada oeste" + }, + + "zoomLevels": "Niveles de zoom", + "@zoomLevels": { + "description": "Título de la sección de niveles de zoom" + }, + + "minZoom": "Mín: {zoom}", + "@minZoom": { + "description": "Etiqueta del nivel de zoom mínimo", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "maxZoom": "Máx: {zoom}", + "@maxZoom": { + "description": "Etiqueta del nivel de zoom máximo", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "downloadingDots": "Descargando...", + "@downloadingDots": { + "description": "Mensaje de estado durante la descarga" + }, + + "cancelDownload": "Cancelar descarga", + "@cancelDownload": { + "description": "Botón para cancelar descarga" + }, + + "downloadRegionButton": "Descargar región", + "@downloadRegionButton": { + "description": "Botón para iniciar descarga de región" + }, + + "downloadNote": "Nota: Las regiones grandes o niveles de zoom altos pueden tomar un tiempo y espacio de almacenamiento significativos.", + "@downloadNote": { + "description": "Advertencia sobre el tamaño y tiempo de descarga" + }, + + "cacheManagement": "Gestión de caché", + "@cacheManagement": { + "description": "Título de la sección de gestión de caché" + }, + + "clearAllMaps": "Borrar todos los mapas", + "@clearAllMaps": { + "description": "Botón para borrar todos los mapas en caché" + }, + + "clearMapsConfirmTitle": "Borrar todos los mapas", + "@clearMapsConfirmTitle": { + "description": "Título del diálogo de confirmación de borrar mapas" + }, + + "clearMapsConfirmMessage": "¿Estás seguro de que quieres eliminar todos los mapas descargados? Esta acción no se puede deshacer.", + "@clearMapsConfirmMessage": { + "description": "Mensaje de confirmación para borrar mapas" + }, + + "mapDownloadCompleted": "¡Descarga de mapa completada!", + "@mapDownloadCompleted": { + "description": "Mensaje de éxito después de descargar mapa" + }, + + "cacheClearedSuccessfully": "¡Caché borrada exitosamente!", + "@cacheClearedSuccessfully": { + "description": "Mensaje de éxito después de borrar caché" + }, + + "downloadCancelled": "Descarga cancelada", + "@downloadCancelled": { + "description": "Mensaje cuando se cancela la descarga" + }, + + "startingDownload": "Iniciando descarga...", + "@startingDownload": { + "description": "Estado inicial cuando comienza la descarga" + }, + + "downloadingMapTiles": "Descargando teselas de mapa...", + "@downloadingMapTiles": { + "description": "Estado durante la descarga de teselas" + }, + + "downloadCompletedSuccessfully": "¡Descarga completada exitosamente!", + "@downloadCompletedSuccessfully": { + "description": "Estado después de descarga exitosa" + }, + + "cancellingDownload": "Cancelando descarga...", + "@cancellingDownload": { + "description": "Estado mientras se cancela la descarga" + }, + + "errorLoadingStats": "Error al cargar estadísticas: {error}", + "@errorLoadingStats": { + "description": "Mensaje de error cuando falla la carga de estadísticas de caché", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "downloadFailed": "Error en la descarga: {error}", + "@downloadFailed": { + "description": "Mensaje de error cuando falla la descarga", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "cancelFailed": "Error al cancelar: {error}", + "@cancelFailed": { + "description": "Mensaje de error cuando falla la cancelación", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "clearCacheFailed": "Error al borrar caché: {error}", + "@clearCacheFailed": { + "description": "Mensaje de error cuando falla el borrado de caché", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomError": "Zoom mín: {error}", + "@minZoomError": { + "description": "Error de validación para zoom mínimo", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "maxZoomError": "Zoom máx: {error}", + "@maxZoomError": { + "description": "Error de validación para zoom máximo", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomGreaterThanMax": "El zoom mínimo debe ser menor o igual al zoom máximo", + "@minZoomGreaterThanMax": { + "description": "Error de validación cuando zoom mín > zoom máx" + }, + + "selectMapLayer": "Seleccionar capa de mapa", + "@selectMapLayer": { + "description": "Título del diálogo de selección de capa de mapa" + }, + + "mapOptions": "Opciones de mapa", + "@mapOptions": { + "description": "Título del diálogo de opciones de mapa" + }, + + "showLegend": "Mostrar leyenda", + "@showLegend": { + "description": "Alternar para mostrar leyenda del mapa" + }, + + "displayMarkerTypeCounts": "Mostrar recuentos de tipos de marcadores", + "@displayMarkerTypeCounts": { + "description": "Descripción del alternar de mostrar leyenda" + }, + + "rotateMapWithHeading": "Rotar mapa con rumbo", + "@rotateMapWithHeading": { + "description": "Alternar para rotar mapa con rumbo de brújula" + }, + + "mapFollowsDirection": "El mapa sigue tu dirección cuando te mueves", + "@mapFollowsDirection": { + "description": "Descripción del alternar de rotar mapa" + }, + + "showMapDebugInfo": "Mostrar información de depuración del mapa", + "@showMapDebugInfo": { + "description": "Alternar para mostrar información de depuración del mapa" + }, + + "displayZoomLevelBounds": "Mostrar nivel de zoom y límites", + "@displayZoomLevelBounds": { + "description": "Descripción del alternar de información de depuración" + }, + + "fullscreenMode": "Modo de pantalla completa", + "@fullscreenMode": { + "description": "Alternar para modo de mapa de pantalla completa" + }, + + "hideUiFullMapView": "Ocultar todos los controles de IU para vista de mapa completo", + "@hideUiFullMapView": { + "description": "Descripción del alternar de modo de pantalla completa" + }, + + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "Nombre de capa OpenStreetMap" + }, + + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "Nombre de capa OpenTopoMap" + }, + + "esriSatellite": "ESRI Satélite", + "@esriSatellite": { + "description": "Nombre de capa de imágenes de satélite ESRI" + }, + + "downloadVisibleArea": "Descargar área visible", + "@downloadVisibleArea": { + "description": "Tooltip para el botón de descargar área visible" + }, + + "initializingMap": "Inicializando mapa...", + "@initializingMap": { + "description": "Mensaje de carga para inicialización del mapa" + }, + + "dragToPosition": "Arrastrar a posición", + "@dragToPosition": { + "description": "Etiqueta al arrastrar un pin en el mapa" + }, + + "createSarMarker": "Crear marcador SAR", + "@createSarMarker": { + "description": "Etiqueta para crear marcador SAR desde pin" + }, + + "compass": "Brújula", + "@compass": { + "description": "Título de brújula en diálogo de brújula detallada" + }, + + "navigationAndContacts": "Navegación y contactos", + "@navigationAndContacts": { + "description": "Subtítulo del diálogo de brújula" + }, + + "sarAlert": "ALERTA SAR", + "@sarAlert": { + "description": "Etiqueta de insignia de alerta SAR en mensajes" + }, + + "messageSentToPublicChannel": "Mensaje enviado al canal público", + "@messageSentToPublicChannel": { + "description": "Mensaje de éxito cuando el mensaje se envía al canal público" + }, + + "pleaseSelectRoomToSendSar": "Por favor, selecciona una sala para enviar marcador SAR", + "@pleaseSelectRoomToSendSar": { + "description": "Error cuando no se selecciona sala para marcador SAR" + }, + + "failedToSendSarMarker": "Error al enviar marcador SAR: {error}", + "@failedToSendSarMarker": { + "description": "Mensaje de error cuando falla el envío del marcador SAR", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "sarMarkerSentTo": "Marcador SAR enviado a {roomName}", + "@sarMarkerSentTo": { + "description": "Mensaje de éxito cuando el marcador SAR se envía a la sala", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "notConnectedCannotSync": "No conectado - no se pueden sincronizar mensajes", + "@notConnectedCannotSync": { + "description": "Advertencia al intentar sincronizar mensajes sin estar conectado" + }, + + "syncedMessageCount": "Sincronizados {count} mensaje(s)", + "@syncedMessageCount": { + "description": "Mensaje de éxito mostrando número de mensajes sincronizados", + "placeholders": { + "count": { + "type": "int" + } + } + }, + + "noNewMessages": "No hay mensajes nuevos", + "@noNewMessages": { + "description": "Mensaje de información cuando no hay mensajes nuevos para sincronizar" + }, + + "syncFailed": "Error de sincronización: {error}", + "@syncFailed": { + "description": "Mensaje de error cuando falla la sincronización", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToResendMessage": "Error al reenviar mensaje", + "@failedToResendMessage": { + "description": "Error cuando falla el reintento de mensaje" + }, + + "retryingMessage": "Reintentando mensaje...", + "@retryingMessage": { + "description": "Mensaje de información al reintentar un mensaje fallido" + }, + + "retryFailed": "Error de reintento: {error}", + "@retryFailed": { + "description": "Mensaje de error cuando falla el reintento", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "textCopiedToClipboard": "Texto copiado al portapapeles", + "@textCopiedToClipboard": { + "description": "Mensaje de éxito cuando se copia texto" + }, + + "cannotReplySenderMissing": "No se puede responder: falta información del remitente", + "@cannotReplySenderMissing": { + "description": "Error cuando falta información del remitente para responder" + }, + + "cannotReplyContactNotFound": "No se puede responder: contacto no encontrado", + "@cannotReplyContactNotFound": { + "description": "Error cuando no se encuentra contacto para responder" + }, + + "messageDeleted": "Mensaje eliminado", + "@messageDeleted": { + "description": "Mensaje de información cuando se elimina mensaje" + }, + + "refreshedContacts": "Contactos actualizados", + "@refreshedContacts": { + "description": "Mensaje de éxito cuando se actualizan contactos" + }, + + "justNow": "Justo ahora", + "@justNow": { + "description": "Indicador de tiempo para actividad muy reciente" + }, + + "minutesAgo": "Hace {minutes}m", + "@minutesAgo": { + "description": "Indicador de tiempo para hace minutos", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + + "hoursAgo": "Hace {hours}h", + "@hoursAgo": { + "description": "Indicador de tiempo para hace horas", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + + "daysAgo": "Hace {days}d", + "@daysAgo": { + "description": "Indicador de tiempo para hace días", + "placeholders": { + "days": { + "type": "int" + } + } + }, + + "secondsAgo": "Hace {seconds}s", + "@secondsAgo": { + "description": "Indicador de tiempo para hace segundos", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + + "sending": "Enviando...", + "@sending": { + "description": "Estado de entrega: enviando" + }, + + "sent": "Enviado", + "@sent": { + "description": "Estado de entrega: enviado" + }, + + "delivered": "Entregado", + "@delivered": { + "description": "Estado de entrega: entregado" + }, + + "deliveredWithTime": "Entregado ({time}ms)", + "@deliveredWithTime": { + "description": "Estado de entrega con tiempo de ida y vuelta", + "placeholders": { + "time": { + "type": "int" + } + } + }, + + "failed": "Fallido", + "@failed": { + "description": "Estado de entrega: fallido" + }, + + "sarMarkerFoundPerson": "Persona encontrada", + "@sarMarkerFoundPerson": { + "description": "Tipo de marcador SAR: persona encontrada" + }, + + "sarMarkerFire": "Ubicación de fuego", + "@sarMarkerFire": { + "description": "Tipo de marcador SAR: fuego" + }, + + "sarMarkerStagingArea": "Área de preparación", + "@sarMarkerStagingArea": { + "description": "Tipo de marcador SAR: área de preparación" + }, + + "sarMarkerObject": "Objeto encontrado", + "@sarMarkerObject": { + "description": "Tipo de marcador SAR: objeto" + }, + + "from": "De", + "@from": { + "description": "Etiqueta de remitente en notificaciones" + }, + + "coordinates": "Coordenadas", + "@coordinates": { + "description": "Etiqueta de coordenadas" + }, + + "tapToViewOnMap": "Toca para ver en el mapa", + "@tapToViewOnMap": { + "description": "Texto de acción de notificación" + }, + + "radioSettings": "Configuración de radio", + "@radioSettings": { + "description": "Título de sección para configuración de radio" + }, + + "frequencyMHz": "Frecuencia (MHz)", + "@frequencyMHz": { + "description": "Etiqueta del campo de frecuencia de radio" + }, + + "frequencyExample": "ej., 869.618", + "@frequencyExample": { + "description": "Texto de ayuda de ejemplo para frecuencia" + }, + + "bandwidth": "Ancho de banda", + "@bandwidth": { + "description": "Etiqueta del menú desplegable de ancho de banda" + }, + + "spreadingFactor": "Factor de dispersión", + "@spreadingFactor": { + "description": "Etiqueta del menú desplegable de factor de dispersión" + }, + + "codingRate": "Tasa de codificación", + "@codingRate": { + "description": "Etiqueta del menú desplegable de tasa de codificación" + }, + + "txPowerDbm": "Potencia TX (dBm)", + "@txPowerDbm": { + "description": "Etiqueta del campo de potencia TX" + }, + + "maxPowerDbm": "Máx: {power} dBm", + "@maxPowerDbm": { + "description": "Texto de ayuda mostrando potencia TX máxima", + "placeholders": { + "power": { "type": "int" } + } + }, + + "you": "Tú", + "@you": { + "description": "Etiqueta para el usuario actual en burbujas de mensaje" + }, + + "offlineVectorMaps": "Mapas vectoriales sin conexión", + "@offlineVectorMaps": { + "description": "Título de la sección de mapas vectoriales sin conexión" + }, + + "offlineVectorMapsDescription": "Importar y gestionar teselas de mapas vectoriales sin conexión (formato MBTiles) para usar sin conexión a internet", + "@offlineVectorMapsDescription": { + "description": "Descripción de la sección de mapas vectoriales sin conexión" + }, + + "importMbtiles": "Importar archivo MBTiles", + "@importMbtiles": { + "description": "Botón para importar archivo MBTiles" + }, + + "importMbtilesNote": "Compatible con archivos MBTiles con teselas vectoriales (formato PBF/MVT). ¡Los extractos de Geofabrik funcionan muy bien!", + "@importMbtilesNote": { + "description": "Nota sobre tipos de archivo MBTiles compatibles" + }, + + "noMbtilesFiles": "No se encontraron mapas vectoriales sin conexión", + "@noMbtilesFiles": { + "description": "Mensaje cuando no hay archivos MBTiles disponibles" + }, + + "mbtilesImportedSuccessfully": "Archivo MBTiles importado exitosamente", + "@mbtilesImportedSuccessfully": { + "description": "Mensaje de éxito después de importar archivo MBTiles" + }, + + "failedToImportMbtiles": "Error al importar archivo MBTiles", + "@failedToImportMbtiles": { + "description": "Mensaje de error cuando falla la importación de MBTiles" + }, + + "deleteMbtilesConfirmTitle": "Eliminar mapa sin conexión", + "@deleteMbtilesConfirmTitle": { + "description": "Título del diálogo de confirmación de eliminar MBTiles" + }, + + "deleteMbtilesConfirmMessage": "¿Estás seguro de que quieres eliminar \"{name}\"? Esto eliminará permanentemente el mapa sin conexión.", + "@deleteMbtilesConfirmMessage": { + "description": "Mensaje de confirmación para eliminar archivo MBTiles", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "mbtilesDeletedSuccessfully": "Mapa sin conexión eliminado exitosamente", + "@mbtilesDeletedSuccessfully": { + "description": "Mensaje de éxito después de eliminar archivo MBTiles" + }, + + "failedToDeleteMbtiles": "Error al eliminar mapa sin conexión", + "@failedToDeleteMbtiles": { + "description": "Mensaje de error cuando falla la eliminación de MBTiles" + }, + + "vectorTiles": "Teselas vectoriales", + "@vectorTiles": { + "description": "Etiqueta del tipo de tesela vectorial" + }, + + "schema": "Esquema", + "@schema": { + "description": "Etiqueta del esquema de tesela vectorial" + }, + + "unknown": "Desconocido", + "@unknown": { + "description": "Etiqueta de valor desconocido" + }, + + "bounds": "Límites", + "@bounds": { + "description": "Etiqueta de límites geográficos" + }, + + "onlineLayers": "Capas en línea", + "@onlineLayers": { + "description": "Encabezado de sección para capas de mapa en línea" + }, + + "offlineLayers": "Capas sin conexión", + "@offlineLayers": { + "description": "Encabezado de sección para capas de mapa sin conexión (MBTiles)" + }, + + "locationTrail": "Rastro de ubicación", + "@locationTrail": { + "description": "Título del rastro de ubicación" + }, + + "showTrailOnMap": "Mostrar rastro en el mapa", + "@showTrailOnMap": { + "description": "Alternar para mostrar/ocultar rastro en el mapa" + }, + + "trailVisible": "El rastro es visible en el mapa", + "@trailVisible": { + "description": "Estado de visibilidad del rastro - visible" + }, + + "trailHiddenRecording": "El rastro está oculto (aún grabando)", + "@trailHiddenRecording": { + "description": "Estado de visibilidad del rastro - oculto pero grabando" + }, + + "duration": "Duración", + "@duration": { + "description": "Etiqueta de duración" + }, + + "points": "Puntos", + "@points": { + "description": "Etiqueta de recuento de puntos del rastro" + }, + + "clearTrail": "Borrar rastro", + "@clearTrail": { + "description": "Botón para borrar rastro de ubicación" + }, + + "clearTrailQuestion": "¿Borrar rastro?", + "@clearTrailQuestion": { + "description": "Título del diálogo de confirmación" + }, + + "clearTrailConfirmation": "¿Estás seguro de que quieres borrar el rastro de ubicación actual? Esta acción no se puede deshacer.", + "@clearTrailConfirmation": { + "description": "Mensaje del diálogo de confirmación" + }, + + "noTrailRecorded": "Aún no se ha grabado rastro", + "@noTrailRecorded": { + "description": "Mensaje cuando no existe rastro" + }, + + "startTrackingToRecord": "Inicia el seguimiento de ubicación para grabar tu rastro", + "@startTrackingToRecord": { + "description": "Instrucciones para iniciar la grabación del rastro" + }, + + "trailControls": "Controles del rastro", + "@trailControls": { + "description": "Tooltip de controles del rastro" + }, + + "deviceInformation": "Información del dispositivo", + "@deviceInformation": { + "description": "Encabezado de la sección de información del dispositivo" + }, + + "bleName": "Nombre BLE", + "@bleName": { + "description": "Etiqueta del nombre del dispositivo Bluetooth Low Energy" + }, + + "meshName": "Nombre Mesh", + "@meshName": { + "description": "Etiqueta del nombre de red mesh" + }, + + "notSet": "No establecido", + "@notSet": { + "description": "Etiqueta cuando no se establece un valor" + }, + + "model": "Modelo", + "@model": { + "description": "Etiqueta del modelo del dispositivo" + }, + + "version": "Versión", + "@version": { + "description": "Etiqueta de versión" + }, + + "buildDate": "Fecha de compilación", + "@buildDate": { + "description": "Etiqueta de fecha de compilación del firmware" + }, + + "firmware": "Firmware", + "@firmware": { + "description": "Etiqueta de firmware" + }, + + "maxContacts": "Contactos máximos", + "@maxContacts": { + "description": "Etiqueta de capacidad máxima de contactos" + }, + + "maxChannels": "Canales máximos", + "@maxChannels": { + "description": "Etiqueta de capacidad máxima de canales" + }, + + "publicInfo": "Información pública", + "@publicInfo": { + "description": "Encabezado de la sección de información pública" + }, + + "meshNetworkName": "Nombre de red Mesh", + "@meshNetworkName": { + "description": "Etiqueta del campo de nombre de red mesh" + }, + + "nameBroadcastInMesh": "Nombre difundido en anuncios mesh", + "@nameBroadcastInMesh": { + "description": "Texto de ayuda para el campo de nombre de red mesh" + }, + + "telemetryAndLocationSharing": "Telemetría y compartir ubicación", + "@telemetryAndLocationSharing": { + "description": "Etiqueta del alternar de telemetría y compartir ubicación" + }, + + "lat": "Lat", + "@lat": { + "description": "Etiqueta del campo de latitud (forma corta)" + }, + + "lon": "Lon", + "@lon": { + "description": "Etiqueta del campo de longitud (forma corta)" + }, + + "useCurrentLocation": "Usar ubicación actual", + "@useCurrentLocation": { + "description": "Tooltip para el botón de usar ubicación actual" + }, + + "noneUnknown": "Ninguno/Desconocido", + "@noneUnknown": { + "description": "Tipo de dispositivo: ninguno o desconocido" + }, + + "chatNode": "Nodo de chat", + "@chatNode": { + "description": "Tipo de dispositivo: nodo de chat" + }, + + "repeater": "Repetidor", + "@repeater": { + "description": "Tipo de dispositivo: repetidor" + }, + + "roomChannel": "Sala/Canal", + "@roomChannel": { + "description": "Tipo de dispositivo: sala o canal" + }, + + "typeNumber": "Tipo {number}", + "@typeNumber": { + "description": "Tipo de dispositivo genérico con número", + "placeholders": { + "number": { + "type": "int" + } + } + }, + + "copiedToClipboardShort": "Copiado {label} al portapapeles", + "@copiedToClipboardShort": { + "description": "Mensaje corto de éxito al copiar al portapapeles", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "failedToSave": "Error al guardar: {error}", + "@failedToSave": { + "description": "Mensaje de error genérico para fallos al guardar", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToGetLocation": "Error al obtener ubicación: {error}", + "@failedToGetLocation": { + "description": "Mensaje de error cuando falla la obtención de ubicación", + "placeholders": { + "error": { + "type": "String" + } + } + } +} diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb new file mode 100644 index 0000000..4d2e696 --- /dev/null +++ b/lib/l10n/app_fr.arb @@ -0,0 +1,2100 @@ +{ + "@@locale": "fr", + + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "Le titre de l'application" + }, + + "messages": "Messages", + "@messages": { + "description": "Libellé de l'onglet Messages" + }, + + "contacts": "Contacts", + "@contacts": { + "description": "Libellé de l'onglet Contacts" + }, + + "map": "Carte", + "@map": { + "description": "Libellé de l'onglet Carte" + }, + + "settings": "Paramètres", + "@settings": { + "description": "Titre de l'écran Paramètres" + }, + + "connect": "Connecter", + "@connect": { + "description": "Libellé du bouton Connecter" + }, + + "disconnect": "Déconnecter", + "@disconnect": { + "description": "Libellé du bouton Déconnecter" + }, + + "scanningForDevices": "Recherche d'appareils...", + "@scanningForDevices": { + "description": "Texte affiché lors de la recherche d'appareils BLE" + }, + + "noDevicesFound": "Aucun appareil trouvé", + "@noDevicesFound": { + "description": "Texte affiché lorsqu'aucun appareil BLE n'est trouvé" + }, + + "scanAgain": "Rechercher à nouveau", + "@scanAgain": { + "description": "Bouton pour relancer la recherche BLE" + }, + + "tapToConnect": "Appuyez pour connecter", + "@tapToConnect": { + "description": "Texte de sous-titre pour l'appareil dans la liste de recherche" + }, + + "deviceNotConnected": "Appareil non connecté", + "@deviceNotConnected": { + "description": "Message d'erreur lorsque l'appareil n'est pas connecté" + }, + + "locationPermissionDenied": "Permission de localisation refusée", + "@locationPermissionDenied": { + "description": "Erreur lorsque la permission de localisation est refusée" + }, + + "locationPermissionPermanentlyDenied": "Permission de localisation définitivement refusée. Veuillez l'activer dans les Paramètres.", + "@locationPermissionPermanentlyDenied": { + "description": "Erreur lorsque la permission de localisation est définitivement refusée" + }, + + "locationPermissionRequired": "La permission de localisation est requise pour le suivi GPS et la coordination d'équipe. Vous pouvez l'activer plus tard dans les Paramètres.", + "@locationPermissionRequired": { + "description": "Message lorsque la permission de localisation est nécessaire" + }, + + "locationServicesDisabled": "Les services de localisation sont désactivés. Veuillez les activer dans les Paramètres.", + "@locationServicesDisabled": { + "description": "Erreur lorsque les services de localisation sont désactivés" + }, + + "failedToGetGpsLocation": "Échec de l'obtention de la position GPS", + "@failedToGetGpsLocation": { + "description": "Erreur lorsque la position GPS ne peut pas être obtenue" + }, + + "advertisedAtLocation": "Annoncé à {latitude}, {longitude}", + "@advertisedAtLocation": { + "description": "Message de succès affichant la position annoncée", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "failedToAdvertise": "Échec de l'annonce : {error}", + "@failedToAdvertise": { + "description": "Message d'erreur pour l'échec de l'annonce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "reconnecting": "Reconnexion... ({attempt}/{max})", + "@reconnecting": { + "description": "Texte affiché pendant les tentatives de reconnexion", + "placeholders": { + "attempt": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + + "cancelReconnection": "Annuler la reconnexion", + "@cancelReconnection": { + "description": "Info-bulle pour le bouton d'annulation de reconnexion" + }, + + "mapManagement": "Gestion des cartes", + "@mapManagement": { + "description": "Élément de menu pour la gestion des cartes" + }, + + "general": "Général", + "@general": { + "description": "En-tête de section des paramètres généraux" + }, + + "theme": "Thème", + "@theme": { + "description": "Libellé du paramètre de thème" + }, + + "chooseTheme": "Choisir le thème", + "@chooseTheme": { + "description": "Titre de la boîte de dialogue de sélection du thème" + }, + + "light": "Clair", + "@light": { + "description": "Option de thème clair" + }, + + "dark": "Sombre", + "@dark": { + "description": "Option de thème sombre" + }, + + "blueLightTheme": "Thème bleu clair", + "@blueLightTheme": { + "description": "Description du thème bleu clair" + }, + + "blueDarkTheme": "Thème bleu sombre", + "@blueDarkTheme": { + "description": "Description du thème bleu sombre" + }, + + "sarRed": "SAR Rouge", + "@sarRed": { + "description": "Option de thème SAR Rouge" + }, + + "alertEmergencyMode": "Mode alerte/urgence", + "@alertEmergencyMode": { + "description": "Description du thème SAR Rouge" + }, + + "sarGreen": "SAR Vert", + "@sarGreen": { + "description": "Option de thème SAR Vert" + }, + + "safeAllClearMode": "Mode sécurisé/dégagé", + "@safeAllClearMode": { + "description": "Description du thème SAR Vert" + }, + + "autoSystem": "Auto (Système)", + "@autoSystem": { + "description": "Option de thème automatique/système" + }, + + "followSystemTheme": "Suivre le thème du système", + "@followSystemTheme": { + "description": "Description du thème système" + }, + + "showRxTxIndicators": "Afficher les indicateurs RX/TX", + "@showRxTxIndicators": { + "description": "Paramètre pour afficher les indicateurs RX/TX" + }, + + "displayPacketActivity": "Afficher les indicateurs d'activité des paquets dans la barre supérieure", + "@displayPacketActivity": { + "description": "Description du paramètre des indicateurs RX/TX" + }, + + "language": "Langue", + "@language": { + "description": "Libellé du paramètre de langue" + }, + + "chooseLanguage": "Choisir la langue", + "@chooseLanguage": { + "description": "Titre de la boîte de dialogue de sélection de langue" + }, + + "english": "Anglais", + "@english": { + "description": "Option de langue anglaise" + }, + + "slovenian": "Slovène", + "@slovenian": { + "description": "Option de langue slovène" + }, + + "croatian": "Croate", + "@croatian": { + "description": "Option de langue croate" + }, + + "locationBroadcasting": "Diffusion de position", + "@locationBroadcasting": { + "description": "En-tête de section des paramètres de localisation" + }, + + "autoLocationTracking": "Suivi automatique de position", + "@autoLocationTracking": { + "description": "Paramètre de suivi automatique de position" + }, + + "automaticallyBroadcastPosition": "Diffuser automatiquement les mises à jour de position", + "@automaticallyBroadcastPosition": { + "description": "Description du suivi automatique de position" + }, + + "configureTracking": "Configurer le suivi", + "@configureTracking": { + "description": "Libellé du bouton de configuration du suivi" + }, + + "distanceAndTimeThresholds": "Seuils de distance et de temps", + "@distanceAndTimeThresholds": { + "description": "Description de la configuration du suivi" + }, + + "locationTrackingConfiguration": "Configuration du suivi de position", + "@locationTrackingConfiguration": { + "description": "Titre de la boîte de dialogue de configuration du suivi" + }, + + "configureWhenLocationBroadcasts": "Configurer quand les diffusions de position sont envoyées au réseau maillé", + "@configureWhenLocationBroadcasts": { + "description": "Description de la boîte de dialogue de configuration du suivi" + }, + + "minimumDistance": "Distance minimale", + "@minimumDistance": { + "description": "Libellé du paramètre de distance minimale" + }, + + "broadcastAfterMoving": "Diffuser uniquement après un déplacement de {distance} mètres", + "@broadcastAfterMoving": { + "description": "Description de la distance minimale", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "maximumDistance": "Distance maximale", + "@maximumDistance": { + "description": "Libellé du paramètre de distance maximale" + }, + + "alwaysBroadcastAfterMoving": "Toujours diffuser après un déplacement de {distance} mètres", + "@alwaysBroadcastAfterMoving": { + "description": "Description de la distance maximale", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "minimumTimeInterval": "Intervalle de temps minimal", + "@minimumTimeInterval": { + "description": "Libellé du paramètre d'intervalle de temps minimal" + }, + + "alwaysBroadcastEvery": "Toujours diffuser toutes les {duration}", + "@alwaysBroadcastEvery": { + "description": "Description de l'intervalle de temps", + "placeholders": { + "duration": { + "type": "String" + } + } + }, + + "save": "Enregistrer", + "@save": { + "description": "Libellé du bouton Enregistrer" + }, + + "cancel": "Annuler", + "@cancel": { + "description": "Libellé du bouton Annuler" + }, + + "close": "Fermer", + "@close": { + "description": "Libellé du bouton Fermer" + }, + + "about": "À propos", + "@about": { + "description": "En-tête de section À propos" + }, + + "appVersion": "Version de l'application", + "@appVersion": { + "description": "Libellé de la version de l'application" + }, + + "appName": "Nom de l'application", + "@appName": { + "description": "Libellé du nom de l'application" + }, + + "aboutMeshCoreSar": "À propos de MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "Titre de la boîte de dialogue À propos" + }, + + "aboutDescription": "Une application de recherche et sauvetage conçue pour les équipes d'intervention d'urgence. Les fonctionnalités incluent :\n\n• Réseau maillé BLE pour communication appareil à appareil\n• Cartes hors ligne avec options de couches multiples\n• Suivi en temps réel des membres de l'équipe\n• Marqueurs tactiques SAR (personne trouvée, feu, zone de rassemblement)\n• Gestion des contacts et messagerie\n• Suivi GPS avec cap du compas\n• Mise en cache des tuiles de carte pour utilisation hors ligne", + "@aboutDescription": { + "description": "Description de la boîte de dialogue À propos" + }, + + "technologiesUsed": "Technologies utilisées :", + "@technologiesUsed": { + "description": "Titre de la section des technologies utilisées" + }, + + "technologiesList": "• Flutter pour le développement multiplateforme\n• BLE (Bluetooth Low Energy) pour réseau maillé\n• OpenStreetMap pour la cartographie\n• Provider pour la gestion d'état\n• SharedPreferences pour le stockage local", + "@technologiesList": { + "description": "Liste des technologies utilisées" + }, + + "developer": "Développeur", + "@developer": { + "description": "En-tête de section Développeur" + }, + + "packageName": "Nom du package", + "@packageName": { + "description": "Libellé du nom du package" + }, + + "sampleData": "Données d'exemple", + "@sampleData": { + "description": "En-tête de section Données d'exemple" + }, + + "sampleDataDescription": "Charger ou effacer les contacts d'exemple, les messages de canal et les marqueurs SAR pour les tests", + "@sampleDataDescription": { + "description": "Description de la section Données d'exemple" + }, + + "loadSampleData": "Charger des données d'exemple", + "@loadSampleData": { + "description": "Bouton pour charger des données d'exemple" + }, + + "clearAllData": "Effacer toutes les données", + "@clearAllData": { + "description": "Bouton pour effacer toutes les données" + }, + + "clearAllDataConfirmTitle": "Effacer toutes les données", + "@clearAllDataConfirmTitle": { + "description": "Titre de la boîte de dialogue de confirmation d'effacement des données" + }, + + "clearAllDataConfirmMessage": "Cela effacera tous les contacts et marqueurs SAR. Êtes-vous sûr ?", + "@clearAllDataConfirmMessage": { + "description": "Message de confirmation d'effacement des données" + }, + + "clear": "Effacer", + "@clear": { + "description": "Libellé du bouton Effacer" + }, + + "loadedSampleData": "Chargé {teamCount} membres d'équipe, {channelCount} canaux, {sarCount} marqueurs SAR, {messageCount} messages", + "@loadedSampleData": { + "description": "Message de succès après le chargement des données d'exemple", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + + "failedToLoadSampleData": "Échec du chargement des données d'exemple : {error}", + "@failedToLoadSampleData": { + "description": "Message d'erreur lorsque le chargement des données d'exemple échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "allDataCleared": "Toutes les données effacées", + "@allDataCleared": { + "description": "Message de succès après l'effacement de toutes les données" + }, + + "failedToStartBackgroundTracking": "Échec du démarrage du suivi en arrière-plan. Vérifiez les permissions et la connexion BLE.", + "@failedToStartBackgroundTracking": { + "description": "Message d'erreur lorsque le suivi en arrière-plan échoue au démarrage" + }, + + "locationBroadcast": "Diffusion de position : {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Message de succès pour la diffusion de position", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "defaultPinInfo": "Le code PIN par défaut pour les appareils sans écran est 123456. Problèmes d'appairage ? Oubliez l'appareil Bluetooth dans les paramètres système.", + "@defaultPinInfo": { + "description": "Information sur le code PIN par défaut pour l'appairage" + }, + + "noMessagesYet": "Aucun message pour le moment", + "@noMessagesYet": { + "description": "Message d'état vide lorsqu'il n'y a pas de messages" + }, + + "pullDownToSync": "Tirez vers le bas pour synchroniser les messages", + "@pullDownToSync": { + "description": "Instruction pour tirer vers le bas pour actualiser les messages" + }, + + "deleteContact": "Supprimer le contact", + "@deleteContact": { + "description": "Libellé de l'action de suppression de contact" + }, + + "delete": "Supprimer", + "@delete": { + "description": "Libellé du bouton Supprimer" + }, + + "viewOnMap": "Voir sur la carte", + "@viewOnMap": { + "description": "Action pour voir la position du contact sur la carte" + }, + + "refresh": "Actualiser", + "@refresh": { + "description": "Libellé du bouton Actualiser" + }, + + "sendDirectMessage": "Envoyer un message direct", + "@sendDirectMessage": { + "description": "Action pour envoyer un message direct au contact" + }, + + "resetPath": "Réinitialiser le chemin (Re-router)", + "@resetPath": { + "description": "Action pour réinitialiser le chemin du contact pour réacheminement" + }, + + "publicKeyCopied": "Clé publique copiée dans le presse-papiers", + "@publicKeyCopied": { + "description": "Message de succès lorsque la clé publique est copiée" + }, + + "copiedToClipboard": "{label} copié dans le presse-papiers", + "@copiedToClipboard": { + "description": "Message de succès lorsqu'une valeur est copiée dans le presse-papiers", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "pleaseEnterPassword": "Veuillez saisir un mot de passe", + "@pleaseEnterPassword": { + "description": "Message de validation pour le champ de mot de passe vide" + }, + + "failedToSyncContacts": "Échec de la synchronisation des contacts : {error}", + "@failedToSyncContacts": { + "description": "Message d'erreur lorsque la synchronisation des contacts échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "loggedInSuccessfully": "Connexion réussie ! En attente des messages du salon...", + "@loggedInSuccessfully": { + "description": "Message de succès après une connexion au salon réussie" + }, + + "loginFailed": "Échec de la connexion - mot de passe incorrect", + "@loginFailed": { + "description": "Message d'erreur lorsque la connexion au salon échoue" + }, + + "loggingIn": "Connexion à {roomName}...", + "@loggingIn": { + "description": "Message d'état pendant le processus de connexion au salon", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "failedToSendLogin": "Échec de l'envoi de la connexion : {error}", + "@failedToSendLogin": { + "description": "Message d'erreur lorsque la commande de connexion échoue à l'envoi", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "lowLocationAccuracy": "Précision de localisation faible", + "@lowLocationAccuracy": { + "description": "Titre d'avertissement pour une faible précision GPS" + }, + + "continue_": "Continuer", + "@continue_": { + "description": "Libellé du bouton Continuer" + }, + + "sendSarMarker": "Envoyer un marqueur SAR", + "@sendSarMarker": { + "description": "Action pour envoyer un marqueur SAR" + }, + + "deleteDrawing": "Supprimer le dessin", + "@deleteDrawing": { + "description": "Action pour supprimer un dessin de carte" + }, + + "drawLine": "Tracer une ligne", + "@drawLine": { + "description": "Mode de dessin de carte : ligne" + }, + + "drawLineDesc": "Tracer une ligne à main levée sur la carte", + "@drawLineDesc": { + "description": "Description du mode de dessin de ligne" + }, + + "drawRectangle": "Tracer un rectangle", + "@drawRectangle": { + "description": "Mode de dessin de carte : rectangle" + }, + + "drawRectangleDesc": "Tracer une zone rectangulaire sur la carte", + "@drawRectangleDesc": { + "description": "Description du mode de dessin de rectangle" + }, + + "shareDrawings": "Partager les dessins", + "@shareDrawings": { + "description": "Action pour partager les dessins sur le réseau" + }, + + "clearAllDrawings": "Effacer tous les dessins", + "@clearAllDrawings": { + "description": "Action pour effacer tous les dessins locaux" + }, + + "clearAll": "Tout effacer", + "@clearAll": { + "description": "Libellé du bouton Tout effacer" + }, + + "noLocalDrawings": "Aucun dessin local à partager", + "@noLocalDrawings": { + "description": "Message lorsqu'il n'y a pas de dessins à partager" + }, + + "publicChannel": "Canal public", + "@publicChannel": { + "description": "Option de canal public pour le partage" + }, + + "broadcastToAll": "Diffuser à tous les nœuds à proximité (éphémère)", + "@broadcastToAll": { + "description": "Description de la diffusion du canal public" + }, + + "storedPermanently": "Stocké de manière permanente dans le salon", + "@storedPermanently": { + "description": "Description de la permanence du stockage dans le salon" + }, + + "notConnectedToDevice": "Non connecté à l'appareil", + "@notConnectedToDevice": { + "description": "Message d'erreur lorsque l'appareil n'est pas connecté pour la messagerie directe" + }, + + "directMessage": "Message direct", + "@directMessage": { + "description": "Titre de la feuille de message direct" + }, + + "directMessageSentTo": "Message direct envoyé à {contactName}", + "@directMessageSentTo": { + "description": "Message de succès après l'envoi d'un message direct", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "failedToSend": "Échec de l'envoi : {error}", + "@failedToSend": { + "description": "Message d'erreur lorsque l'envoi du message direct échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "directMessageInfo": "Ce message sera envoyé directement à {contactName}. Il apparaîtra également dans le fil de messages principal.", + "@directMessageInfo": { + "description": "Information sur le comportement de la messagerie directe", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "typeYourMessage": "Saisissez votre message...", + "@typeYourMessage": { + "description": "Texte de l'espace réservé pour le champ de saisie de message" + }, + + "quickLocationMarker": "Marqueur de position rapide", + "@quickLocationMarker": { + "description": "Sous-titre de l'en-tête de la feuille de marqueur SAR" + }, + + "markerType": "Type de marqueur", + "@markerType": { + "description": "Libellé de la section de sélection du type de marqueur" + }, + + "sendTo": "Envoyer à", + "@sendTo": { + "description": "Libellé de la section de sélection de destination" + }, + + "noDestinationsAvailable": "Aucune destination disponible.", + "@noDestinationsAvailable": { + "description": "Avertissement lorsqu'il n'existe aucun salon ou canal" + }, + + "selectDestination": "Sélectionner la destination...", + "@selectDestination": { + "description": "Espace réservé pour le menu déroulant de destination" + }, + + "ephemeralBroadcastInfo": "Éphémère : Diffusion par ondes uniquement. Non stocké - les nœuds doivent être en ligne.", + "@ephemeralBroadcastInfo": { + "description": "Information sur les diffusions de canal éphémères" + }, + + "persistentRoomInfo": "Persistant : Stocké de manière immuable dans le salon. Synchronisé automatiquement et préservé hors ligne.", + "@persistentRoomInfo": { + "description": "Information sur le stockage persistant dans le salon" + }, + + "location": "Position", + "@location": { + "description": "Libellé de la section de position" + }, + + "fromMap": "Depuis la carte", + "@fromMap": { + "description": "Badge indiquant que la position provient d'un clic sur la carte" + }, + + "gettingLocation": "Obtention de la position...", + "@gettingLocation": { + "description": "Message de chargement lors de l'obtention de la position GPS" + }, + + "locationError": "Erreur de localisation", + "@locationError": { + "description": "Titre des messages d'erreur de localisation" + }, + + "retry": "Réessayer", + "@retry": { + "description": "Libellé du bouton Réessayer" + }, + + "refreshLocation": "Actualiser la position", + "@refreshLocation": { + "description": "Info-bulle pour le bouton d'actualisation de la position" + }, + + "accuracyMeters": "Précision : ±{accuracy}m", + "@accuracyMeters": { + "description": "Affichage de la précision GPS en mètres", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "notesOptional": "Notes (facultatives)", + "@notesOptional": { + "description": "Libellé du champ de notes facultatives" + }, + + "addAdditionalInformation": "Ajouter des informations supplémentaires...", + "@addAdditionalInformation": { + "description": "Espace réservé pour le champ de notes" + }, + + "lowAccuracyWarning": "La précision de localisation est de ±{accuracy}m. Cela peut ne pas être assez précis pour les opérations SAR.\n\nContinuer quand même ?", + "@lowAccuracyWarning": { + "description": "Contenu de la boîte de dialogue d'avertissement pour une faible précision GPS", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "loginToRoom": "Se connecter au salon", + "@loginToRoom": { + "description": "Titre de la boîte de dialogue de connexion au salon" + }, + + "enterPasswordInfo": "Entrez le mot de passe pour accéder à ce salon. Le mot de passe sera enregistré pour une utilisation future.", + "@enterPasswordInfo": { + "description": "Information sur le mot de passe du salon" + }, + + "password": "Mot de passe", + "@password": { + "description": "Libellé du champ de mot de passe" + }, + + "enterRoomPassword": "Entrez le mot de passe du salon", + "@enterRoomPassword": { + "description": "Indice du champ de mot de passe" + }, + + "loggingInDots": "Connexion...", + "@loggingInDots": { + "description": "Texte du bouton pendant la connexion" + }, + + "login": "Se connecter", + "@login": { + "description": "Libellé du bouton de connexion" + }, + + "failedToAddRoom": "Échec de l'ajout du salon à l'appareil : {error}\n\nLe salon n'a peut-être pas encore été annoncé.\nEssayez d'attendre que le salon diffuse.", + "@failedToAddRoom": { + "description": "Message d'erreur lorsque l'ajout du salon échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "direct": "Direct", + "@direct": { + "description": "Indicateur de routage direct" + }, + + "flood": "Inondation", + "@flood": { + "description": "Indicateur de routage par inondation" + }, + + "admin": "Admin", + "@admin": { + "description": "Libellé du badge d'administrateur" + }, + + "loggedIn": "Connecté", + "@loggedIn": { + "description": "Badge d'état connecté" + }, + + "noGpsData": "Aucune donnée GPS", + "@noGpsData": { + "description": "Message lorsque les données GPS ne sont pas disponibles" + }, + + "distance": "Distance", + "@distance": { + "description": "Libellé de la distance" + }, + + "pingingDirect": "Ping de {name} (direct via chemin)...", + "@pingingDirect": { + "description": "Message d'état pour le ping direct", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingingFlood": "Ping de {name} (inondation - pas de chemin)...", + "@pingingFlood": { + "description": "Message d'état pour le ping par inondation", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "directPingTimeout": "Délai d'attente du ping direct - nouvelle tentative de {name} avec inondation...", + "@directPingTimeout": { + "description": "Avertissement lorsque le ping direct expire", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingSuccessful": "Ping réussi vers {name}{fallback}", + "@pingSuccessful": { + "description": "Message de succès pour le ping", + "placeholders": { + "name": { + "type": "String" + }, + "fallback": { + "type": "String" + } + } + }, + + "viaFloodingFallback": " (via repli par inondation)", + "@viaFloodingFallback": { + "description": "Suffixe pour le succès du ping avec repli" + }, + + "pingFailed": "Échec du ping vers {name} - aucune réponse reçue", + "@pingFailed": { + "description": "Message d'erreur lorsque le ping échoue", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "deleteContactConfirmation": "Êtes-vous sûr de vouloir supprimer \"{name}\" ?\n\nCela supprimera le contact de l'application et de l'appareil radio compagnon.", + "@deleteContactConfirmation": { + "description": "Message de confirmation pour la suppression du contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "removingContact": "Suppression de {name}...", + "@removingContact": { + "description": "Message d'état lors de la suppression du contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "contactRemoved": "Contact \"{name}\" supprimé", + "@contactRemoved": { + "description": "Message de succès après la suppression du contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "failedToRemoveContact": "Échec de la suppression du contact : {error}", + "@failedToRemoveContact": { + "description": "Message d'erreur lorsque la suppression du contact échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "type": "Type", + "@type": { + "description": "Libellé du type de contact" + }, + + "publicKey": "Clé publique", + "@publicKey": { + "description": "Libellé de la clé publique" + }, + + "lastSeen": "Dernière vue", + "@lastSeen": { + "description": "Libellé de la dernière vue" + }, + + "roomStatus": "État du salon", + "@roomStatus": { + "description": "En-tête de section de l'état du salon" + }, + + "loginStatus": "État de connexion", + "@loginStatus": { + "description": "Libellé de l'état de connexion" + }, + + "notLoggedIn": "Non connecté", + "@notLoggedIn": { + "description": "État non connecté" + }, + + "adminAccess": "Accès administrateur", + "@adminAccess": { + "description": "Libellé de l'accès administrateur" + }, + + "yes": "Oui", + "@yes": { + "description": "Réponse Oui" + }, + + "no": "Non", + "@no": { + "description": "Réponse Non" + }, + + "permissions": "Permissions", + "@permissions": { + "description": "Libellé des permissions" + }, + + "passwordSaved": "Mot de passe enregistré", + "@passwordSaved": { + "description": "Libellé du mot de passe enregistré" + }, + + "locationColon": "Position :", + "@locationColon": { + "description": "En-tête de section de position" + }, + + "telemetry": "Télémétrie", + "@telemetry": { + "description": "En-tête de section de télémétrie" + }, + + "requestingTelemetry": "Demande de télémétrie à {name}...", + "@requestingTelemetry": { + "description": "Message d'état lors de la demande de télémétrie", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "voltage": "Tension", + "@voltage": { + "description": "Libellé de la tension" + }, + + "battery": "Batterie", + "@battery": { + "description": "Libellé de la batterie" + }, + + "temperature": "Température", + "@temperature": { + "description": "Libellé de la température" + }, + + "humidity": "Humidité", + "@humidity": { + "description": "Libellé de l'humidité" + }, + + "pressure": "Pression", + "@pressure": { + "description": "Libellé de la pression" + }, + + "gpsTelemetry": "GPS (Télémétrie)", + "@gpsTelemetry": { + "description": "Libellé du GPS depuis la télémétrie" + }, + + "updated": "Mis à jour", + "@updated": { + "description": "Libellé de l'horodatage de mise à jour" + }, + + "pathResetInfo": "Chemin réinitialisé pour {name}. Le prochain message trouvera un nouvel itinéraire.", + "@pathResetInfo": { + "description": "Message d'information après la réinitialisation du chemin", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "reLoginToRoom": "Se reconnecter au salon", + "@reLoginToRoom": { + "description": "Bouton pour se reconnecter au salon" + }, + + "heading": "Cap", + "@heading": { + "description": "Libellé du cap du compas" + }, + + "elevation": "Élévation", + "@elevation": { + "description": "Libellé de l'élévation/altitude" + }, + + "accuracy": "Précision", + "@accuracy": { + "description": "Libellé de la précision GPS" + }, + + "filterMarkers": "Filtrer les marqueurs", + "@filterMarkers": { + "description": "Titre de la boîte de dialogue de filtrage des marqueurs" + }, + + "filterMarkersTooltip": "Filtrer les marqueurs", + "@filterMarkersTooltip": { + "description": "Info-bulle du bouton de filtre" + }, + + "contactsFilter": "Contacts", + "@contactsFilter": { + "description": "Option de filtre pour les contacts" + }, + + "repeatersFilter": "Répéteurs", + "@repeatersFilter": { + "description": "Option de filtre pour les répéteurs" + }, + + "sarMarkers": "Marqueurs SAR", + "@sarMarkers": { + "description": "En-tête de section des marqueurs SAR" + }, + + "foundPerson": "Personne trouvée", + "@foundPerson": { + "description": "Type de marqueur SAR personne trouvée" + }, + + "fire": "Feu", + "@fire": { + "description": "Type de marqueur SAR feu" + }, + + "stagingArea": "Zone de rassemblement", + "@stagingArea": { + "description": "Type de marqueur SAR zone de rassemblement" + }, + + "showAll": "Tout afficher", + "@showAll": { + "description": "Bouton pour afficher tous les filtres" + }, + + "nearbyContacts": "Contacts à proximité", + "@nearbyContacts": { + "description": "Titre de la liste des contacts à proximité dans le compas" + }, + + "locationUnavailable": "Position non disponible", + "@locationUnavailable": { + "description": "Message lorsque la position GPS n'est pas disponible" + }, + + "ahead": "devant", + "@ahead": { + "description": "Direction de relèvement relatif - devant" + }, + + "degreesRight": "{degrees}° à droite", + "@degreesRight": { + "description": "Direction de relèvement relatif - à droite", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "degreesLeft": "{degrees}° à gauche", + "@degreesLeft": { + "description": "Direction de relèvement relatif - à gauche", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "latLonFormat": "Lat : {latitude} Lon : {longitude}", + "@latLonFormat": { + "description": "Format d'affichage de la latitude et de la longitude", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "noContactsYet": "Aucun contact pour le moment", + "@noContactsYet": { + "description": "Message d'état vide lorsqu'il n'y a pas de contacts" + }, + + "connectToDeviceToLoadContacts": "Connectez-vous à un appareil pour charger les contacts", + "@connectToDeviceToLoadContacts": { + "description": "Instruction pour connecter l'appareil pour charger les contacts" + }, + + "teamMembers": "Membres de l'équipe", + "@teamMembers": { + "description": "En-tête de section pour les membres de l'équipe (contacts de discussion)" + }, + + "repeaters": "Répéteurs", + "@repeaters": { + "description": "En-tête de section pour les nœuds répéteurs" + }, + + "rooms": "Salons", + "@rooms": { + "description": "En-tête de section pour les salons" + }, + + "channels": "Canaux", + "@channels": { + "description": "En-tête de section pour les canaux de diffusion" + }, + + "cacheStatistics": "Statistiques du cache", + "@cacheStatistics": { + "description": "Titre de la section des statistiques du cache" + }, + + "totalTiles": "Total de tuiles", + "@totalTiles": { + "description": "Libellé du nombre total de tuiles en cache" + }, + + "cacheSize": "Taille du cache", + "@cacheSize": { + "description": "Libellé de la taille du cache en Mo" + }, + + "storeName": "Nom du magasin", + "@storeName": { + "description": "Libellé du nom du magasin de cache" + }, + + "noCacheStatistics": "Aucune statistique de cache disponible", + "@noCacheStatistics": { + "description": "Message lorsque les statistiques du cache ne sont pas disponibles" + }, + + "downloadRegion": "Télécharger une région", + "@downloadRegion": { + "description": "Titre de la section de téléchargement de région" + }, + + "mapLayer": "Couche de carte", + "@mapLayer": { + "description": "Libellé de la sélection de la couche de carte" + }, + + "regionBounds": "Limites de la région", + "@regionBounds": { + "description": "Titre de la section de saisie des limites de la région" + }, + + "north": "Nord", + "@north": { + "description": "Libellé de la coordonnée nord" + }, + + "south": "Sud", + "@south": { + "description": "Libellé de la coordonnée sud" + }, + + "east": "Est", + "@east": { + "description": "Libellé de la coordonnée est" + }, + + "west": "Ouest", + "@west": { + "description": "Libellé de la coordonnée ouest" + }, + + "zoomLevels": "Niveaux de zoom", + "@zoomLevels": { + "description": "Titre de la section des niveaux de zoom" + }, + + "minZoom": "Min : {zoom}", + "@minZoom": { + "description": "Libellé du niveau de zoom minimal", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "maxZoom": "Max : {zoom}", + "@maxZoom": { + "description": "Libellé du niveau de zoom maximal", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "downloadingDots": "Téléchargement...", + "@downloadingDots": { + "description": "Message d'état pendant le téléchargement" + }, + + "cancelDownload": "Annuler le téléchargement", + "@cancelDownload": { + "description": "Bouton pour annuler le téléchargement" + }, + + "downloadRegionButton": "Télécharger la région", + "@downloadRegionButton": { + "description": "Bouton pour démarrer le téléchargement de région" + }, + + "downloadNote": "Remarque : Les grandes régions ou les niveaux de zoom élevés peuvent nécessiter beaucoup de temps et d'espace de stockage.", + "@downloadNote": { + "description": "Avertissement concernant la taille et le temps de téléchargement" + }, + + "cacheManagement": "Gestion du cache", + "@cacheManagement": { + "description": "Titre de la section de gestion du cache" + }, + + "clearAllMaps": "Effacer toutes les cartes", + "@clearAllMaps": { + "description": "Bouton pour effacer toutes les cartes en cache" + }, + + "clearMapsConfirmTitle": "Effacer toutes les cartes", + "@clearMapsConfirmTitle": { + "description": "Titre de la boîte de dialogue de confirmation d'effacement des cartes" + }, + + "clearMapsConfirmMessage": "Êtes-vous sûr de vouloir supprimer toutes les cartes téléchargées ? Cette action ne peut pas être annulée.", + "@clearMapsConfirmMessage": { + "description": "Message de confirmation pour l'effacement des cartes" + }, + + "mapDownloadCompleted": "Téléchargement de la carte terminé !", + "@mapDownloadCompleted": { + "description": "Message de succès après le téléchargement de la carte" + }, + + "cacheClearedSuccessfully": "Cache effacé avec succès !", + "@cacheClearedSuccessfully": { + "description": "Message de succès après l'effacement du cache" + }, + + "downloadCancelled": "Téléchargement annulé", + "@downloadCancelled": { + "description": "Message lorsque le téléchargement est annulé" + }, + + "startingDownload": "Démarrage du téléchargement...", + "@startingDownload": { + "description": "État initial lors du début du téléchargement" + }, + + "downloadingMapTiles": "Téléchargement des tuiles de carte...", + "@downloadingMapTiles": { + "description": "État pendant le téléchargement des tuiles" + }, + + "downloadCompletedSuccessfully": "Téléchargement terminé avec succès !", + "@downloadCompletedSuccessfully": { + "description": "État après un téléchargement réussi" + }, + + "cancellingDownload": "Annulation du téléchargement...", + "@cancellingDownload": { + "description": "État lors de l'annulation du téléchargement" + }, + + "errorLoadingStats": "Erreur de chargement des statistiques : {error}", + "@errorLoadingStats": { + "description": "Message d'erreur lorsque le chargement des statistiques du cache échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "downloadFailed": "Échec du téléchargement : {error}", + "@downloadFailed": { + "description": "Message d'erreur lorsque le téléchargement échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "cancelFailed": "Échec de l'annulation : {error}", + "@cancelFailed": { + "description": "Message d'erreur lorsque l'annulation échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "clearCacheFailed": "Échec de l'effacement du cache : {error}", + "@clearCacheFailed": { + "description": "Message d'erreur lorsque l'effacement du cache échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomError": "Zoom min : {error}", + "@minZoomError": { + "description": "Erreur de validation pour le zoom minimal", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "maxZoomError": "Zoom max : {error}", + "@maxZoomError": { + "description": "Erreur de validation pour le zoom maximal", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomGreaterThanMax": "Le zoom minimal doit être inférieur ou égal au zoom maximal", + "@minZoomGreaterThanMax": { + "description": "Erreur de validation lorsque le zoom min > zoom max" + }, + + "selectMapLayer": "Sélectionner la couche de carte", + "@selectMapLayer": { + "description": "Titre de la boîte de dialogue de sélection de la couche de carte" + }, + + "mapOptions": "Options de carte", + "@mapOptions": { + "description": "Titre de la boîte de dialogue des options de carte" + }, + + "showLegend": "Afficher la légende", + "@showLegend": { + "description": "Interrupteur pour afficher la légende de la carte" + }, + + "displayMarkerTypeCounts": "Afficher les décomptes des types de marqueurs", + "@displayMarkerTypeCounts": { + "description": "Description de l'interrupteur d'affichage de la légende" + }, + + "rotateMapWithHeading": "Faire pivoter la carte avec le cap", + "@rotateMapWithHeading": { + "description": "Interrupteur pour faire pivoter la carte avec le cap du compas" + }, + + "mapFollowsDirection": "La carte suit votre direction lorsque vous vous déplacez", + "@mapFollowsDirection": { + "description": "Description de l'interrupteur de rotation de la carte" + }, + + "showMapDebugInfo": "Afficher les infos de débogage de la carte", + "@showMapDebugInfo": { + "description": "Interrupteur pour afficher les informations de débogage de la carte" + }, + + "displayZoomLevelBounds": "Afficher le niveau de zoom et les limites", + "@displayZoomLevelBounds": { + "description": "Description de l'interrupteur d'infos de débogage" + }, + + "fullscreenMode": "Mode plein écran", + "@fullscreenMode": { + "description": "Interrupteur pour le mode plein écran de la carte" + }, + + "hideUiFullMapView": "Masquer tous les contrôles d'interface pour une vue de carte complète", + "@hideUiFullMapView": { + "description": "Description de l'interrupteur du mode plein écran" + }, + + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "Nom de la couche OpenStreetMap" + }, + + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "Nom de la couche OpenTopoMap" + }, + + "esriSatellite": "Satellite ESRI", + "@esriSatellite": { + "description": "Nom de la couche d'imagerie satellite ESRI" + }, + + "downloadVisibleArea": "Télécharger la zone visible", + "@downloadVisibleArea": { + "description": "Info-bulle du bouton de téléchargement de la zone visible" + }, + + "initializingMap": "Initialisation de la carte...", + "@initializingMap": { + "description": "Message de chargement pour l'initialisation de la carte" + }, + + "dragToPosition": "Faire glisser vers la position", + "@dragToPosition": { + "description": "Libellé lors du glissement d'une épingle sur la carte" + }, + + "createSarMarker": "Créer un marqueur SAR", + "@createSarMarker": { + "description": "Libellé pour créer un marqueur SAR à partir d'une épingle" + }, + + "compass": "Boussole", + "@compass": { + "description": "Titre de la boussole dans la boîte de dialogue de boussole détaillée" + }, + + "navigationAndContacts": "Navigation et contacts", + "@navigationAndContacts": { + "description": "Sous-titre de la boîte de dialogue de la boussole" + }, + + "sarAlert": "ALERTE SAR", + "@sarAlert": { + "description": "Libellé du badge d'alerte SAR sur les messages" + }, + + "messageSentToPublicChannel": "Message envoyé au canal public", + "@messageSentToPublicChannel": { + "description": "Message de succès lorsque le message est envoyé au canal public" + }, + + "pleaseSelectRoomToSendSar": "Veuillez sélectionner un salon pour envoyer le marqueur SAR", + "@pleaseSelectRoomToSendSar": { + "description": "Erreur lorsqu'aucun salon n'est sélectionné pour le marqueur SAR" + }, + + "failedToSendSarMarker": "Échec de l'envoi du marqueur SAR : {error}", + "@failedToSendSarMarker": { + "description": "Message d'erreur lorsque l'envoi du marqueur SAR échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "sarMarkerSentTo": "Marqueur SAR envoyé à {roomName}", + "@sarMarkerSentTo": { + "description": "Message de succès lorsque le marqueur SAR est envoyé au salon", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "notConnectedCannotSync": "Non connecté - impossible de synchroniser les messages", + "@notConnectedCannotSync": { + "description": "Avertissement lors de la tentative de synchronisation des messages sans être connecté" + }, + + "syncedMessageCount": "Synchronisé {count} message(s)", + "@syncedMessageCount": { + "description": "Message de succès indiquant le nombre de messages synchronisés", + "placeholders": { + "count": { + "type": "int" + } + } + }, + + "noNewMessages": "Aucun nouveau message", + "@noNewMessages": { + "description": "Message d'information lorsqu'il n'y a pas de nouveaux messages à synchroniser" + }, + + "syncFailed": "Échec de la synchronisation : {error}", + "@syncFailed": { + "description": "Message d'erreur lorsque la synchronisation échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToResendMessage": "Échec du renvoi du message", + "@failedToResendMessage": { + "description": "Erreur lorsque la nouvelle tentative de message échoue" + }, + + "retryingMessage": "Nouvelle tentative de message...", + "@retryingMessage": { + "description": "Message d'information lors de la nouvelle tentative d'un message échoué" + }, + + "retryFailed": "Échec de la nouvelle tentative : {error}", + "@retryFailed": { + "description": "Message d'erreur lorsque la nouvelle tentative échoue", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "textCopiedToClipboard": "Texte copié dans le presse-papiers", + "@textCopiedToClipboard": { + "description": "Message de succès lorsque le texte est copié" + }, + + "cannotReplySenderMissing": "Impossible de répondre : informations sur l'expéditeur manquantes", + "@cannotReplySenderMissing": { + "description": "Erreur lorsque les informations sur l'expéditeur manquent pour la réponse" + }, + + "cannotReplyContactNotFound": "Impossible de répondre : contact non trouvé", + "@cannotReplyContactNotFound": { + "description": "Erreur lorsque le contact n'est pas trouvé pour la réponse" + }, + + "messageDeleted": "Message supprimé", + "@messageDeleted": { + "description": "Message d'information lorsque le message est supprimé" + }, + + "refreshedContacts": "Contacts actualisés", + "@refreshedContacts": { + "description": "Message de succès lorsque les contacts sont actualisés" + }, + + "justNow": "À l'instant", + "@justNow": { + "description": "Indicateur de temps pour une activité très récente" + }, + + "minutesAgo": "Il y a {minutes}m", + "@minutesAgo": { + "description": "Indicateur de temps pour les minutes écoulées", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + + "hoursAgo": "Il y a {hours}h", + "@hoursAgo": { + "description": "Indicateur de temps pour les heures écoulées", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + + "daysAgo": "Il y a {days}j", + "@daysAgo": { + "description": "Indicateur de temps pour les jours écoulés", + "placeholders": { + "days": { + "type": "int" + } + } + }, + + "secondsAgo": "Il y a {seconds}s", + "@secondsAgo": { + "description": "Indicateur de temps pour les secondes écoulées", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + + "sending": "Envoi...", + "@sending": { + "description": "État de livraison : envoi" + }, + + "sent": "Envoyé", + "@sent": { + "description": "État de livraison : envoyé" + }, + + "delivered": "Livré", + "@delivered": { + "description": "État de livraison : livré" + }, + + "deliveredWithTime": "Livré ({time}ms)", + "@deliveredWithTime": { + "description": "État de livraison avec temps aller-retour", + "placeholders": { + "time": { + "type": "int" + } + } + }, + + "failed": "Échec", + "@failed": { + "description": "État de livraison : échec" + }, + + "sarMarkerFoundPerson": "Personne trouvée", + "@sarMarkerFoundPerson": { + "description": "Type de marqueur SAR : personne trouvée" + }, + + "sarMarkerFire": "Lieu de feu", + "@sarMarkerFire": { + "description": "Type de marqueur SAR : feu" + }, + + "sarMarkerStagingArea": "Zone de rassemblement", + "@sarMarkerStagingArea": { + "description": "Type de marqueur SAR : zone de rassemblement" + }, + + "sarMarkerObject": "Objet trouvé", + "@sarMarkerObject": { + "description": "Type de marqueur SAR : objet" + }, + + "from": "De", + "@from": { + "description": "Libellé de l'expéditeur dans les notifications" + }, + + "coordinates": "Coordonnées", + "@coordinates": { + "description": "Libellé des coordonnées" + }, + + "tapToViewOnMap": "Appuyez pour voir sur la carte", + "@tapToViewOnMap": { + "description": "Texte de l'action de notification" + }, + + "radioSettings": "Paramètres radio", + "@radioSettings": { + "description": "Titre de section pour les paramètres radio" + }, + + "frequencyMHz": "Fréquence (MHz)", + "@frequencyMHz": { + "description": "Libellé du champ de fréquence radio" + }, + + "frequencyExample": "ex. : 869,618", + "@frequencyExample": { + "description": "Texte d'aide exemple pour la fréquence" + }, + + "bandwidth": "Bande passante", + "@bandwidth": { + "description": "Libellé du menu déroulant de bande passante" + }, + + "spreadingFactor": "Facteur d'étalement", + "@spreadingFactor": { + "description": "Libellé du menu déroulant du facteur d'étalement" + }, + + "codingRate": "Taux de codage", + "@codingRate": { + "description": "Libellé du menu déroulant du taux de codage" + }, + + "txPowerDbm": "Puissance TX (dBm)", + "@txPowerDbm": { + "description": "Libellé du champ de puissance TX" + }, + + "maxPowerDbm": "Max : {power} dBm", + "@maxPowerDbm": { + "description": "Texte d'aide indiquant la puissance TX maximale", + "placeholders": { + "power": { "type": "int" } + } + }, + + "you": "Vous", + "@you": { + "description": "Libellé pour l'utilisateur actuel dans les bulles de message" + }, + + "offlineVectorMaps": "Cartes vectorielles hors ligne", + "@offlineVectorMaps": { + "description": "Titre de la section des cartes vectorielles hors ligne" + }, + + "offlineVectorMapsDescription": "Importer et gérer les tuiles de cartes vectorielles hors ligne (format MBTiles) pour une utilisation sans connexion Internet", + "@offlineVectorMapsDescription": { + "description": "Description de la section des cartes vectorielles hors ligne" + }, + + "importMbtiles": "Importer un fichier MBTiles", + "@importMbtiles": { + "description": "Bouton pour importer un fichier MBTiles" + }, + + "importMbtilesNote": "Prend en charge les fichiers MBTiles avec tuiles vectorielles (format PBF/MVT). Les extraits Geofabrik fonctionnent très bien !", + "@importMbtilesNote": { + "description": "Remarque sur les types de fichiers MBTiles pris en charge" + }, + + "noMbtilesFiles": "Aucune carte vectorielle hors ligne trouvée", + "@noMbtilesFiles": { + "description": "Message lorsqu'aucun fichier MBTiles n'est disponible" + }, + + "mbtilesImportedSuccessfully": "Fichier MBTiles importé avec succès", + "@mbtilesImportedSuccessfully": { + "description": "Message de succès après l'importation du fichier MBTiles" + }, + + "failedToImportMbtiles": "Échec de l'importation du fichier MBTiles", + "@failedToImportMbtiles": { + "description": "Message d'erreur lorsque l'importation MBTiles échoue" + }, + + "deleteMbtilesConfirmTitle": "Supprimer la carte hors ligne", + "@deleteMbtilesConfirmTitle": { + "description": "Titre de la boîte de dialogue de confirmation de suppression de MBTiles" + }, + + "deleteMbtilesConfirmMessage": "Êtes-vous sûr de vouloir supprimer \"{name}\" ? Cela supprimera définitivement la carte hors ligne.", + "@deleteMbtilesConfirmMessage": { + "description": "Message de confirmation pour la suppression du fichier MBTiles", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "mbtilesDeletedSuccessfully": "Carte hors ligne supprimée avec succès", + "@mbtilesDeletedSuccessfully": { + "description": "Message de succès après la suppression du fichier MBTiles" + }, + + "failedToDeleteMbtiles": "Échec de la suppression de la carte hors ligne", + "@failedToDeleteMbtiles": { + "description": "Message d'erreur lorsque la suppression de MBTiles échoue" + }, + + "vectorTiles": "Tuiles vectorielles", + "@vectorTiles": { + "description": "Libellé du type de tuile vectorielle" + }, + + "schema": "Schéma", + "@schema": { + "description": "Libellé du schéma de tuile vectorielle" + }, + + "unknown": "Inconnu", + "@unknown": { + "description": "Libellé de valeur inconnue" + }, + + "bounds": "Limites", + "@bounds": { + "description": "Libellé des limites géographiques" + }, + + "onlineLayers": "Couches en ligne", + "@onlineLayers": { + "description": "En-tête de section pour les couches de carte en ligne" + }, + + "offlineLayers": "Couches hors ligne", + "@offlineLayers": { + "description": "En-tête de section pour les couches de carte hors ligne (MBTiles)" + }, + + "locationTrail": "Trace de déplacement", + "@locationTrail": { + "description": "Titre de la trace de déplacement" + }, + + "showTrailOnMap": "Afficher la trace sur la carte", + "@showTrailOnMap": { + "description": "Interrupteur pour afficher/masquer la trace sur la carte" + }, + + "trailVisible": "La trace est visible sur la carte", + "@trailVisible": { + "description": "État de visibilité de la trace - visible" + }, + + "trailHiddenRecording": "La trace est masquée (enregistrement en cours)", + "@trailHiddenRecording": { + "description": "État de visibilité de la trace - masqué mais enregistrement en cours" + }, + + "distance": "Distance", + "@distance": { + "description": "Libellé de la distance" + }, + + "duration": "Durée", + "@duration": { + "description": "Libellé de la durée" + }, + + "points": "Points", + "@points": { + "description": "Libellé du nombre de points de la trace" + }, + + "clearTrail": "Effacer la trace", + "@clearTrail": { + "description": "Bouton pour effacer la trace de déplacement" + }, + + "clearTrailQuestion": "Effacer la trace ?", + "@clearTrailQuestion": { + "description": "Titre de la boîte de dialogue de confirmation" + }, + + "clearTrailConfirmation": "Êtes-vous sûr de vouloir effacer la trace de déplacement actuelle ? Cette action ne peut pas être annulée.", + "@clearTrailConfirmation": { + "description": "Message de la boîte de dialogue de confirmation" + }, + + "noTrailRecorded": "Aucune trace enregistrée pour le moment", + "@noTrailRecorded": { + "description": "Message lorsqu'aucune trace n'existe" + }, + + "startTrackingToRecord": "Démarrez le suivi de position pour enregistrer votre trace", + "@startTrackingToRecord": { + "description": "Instructions pour démarrer l'enregistrement de la trace" + }, + + "trailControls": "Contrôles de la trace", + "@trailControls": { + "description": "Info-bulle des contrôles de la trace" + }, + + "deviceInformation": "Informations sur l'appareil", + "@deviceInformation": { + "description": "En-tête de section des informations sur l'appareil" + }, + + "bleName": "Nom BLE", + "@bleName": { + "description": "Libellé du nom de l'appareil Bluetooth Low Energy" + }, + + "meshName": "Nom du maillage", + "@meshName": { + "description": "Libellé du nom du réseau maillé" + }, + + "notSet": "Non défini", + "@notSet": { + "description": "Libellé lorsqu'une valeur n'est pas définie" + }, + + "model": "Modèle", + "@model": { + "description": "Libellé du modèle d'appareil" + }, + + "version": "Version", + "@version": { + "description": "Libellé de la version" + }, + + "buildDate": "Date de compilation", + "@buildDate": { + "description": "Libellé de la date de compilation du micrologiciel" + }, + + "firmware": "Micrologiciel", + "@firmware": { + "description": "Libellé du micrologiciel" + }, + + "maxContacts": "Contacts max", + "@maxContacts": { + "description": "Libellé de la capacité maximale de contacts" + }, + + "maxChannels": "Canaux max", + "@maxChannels": { + "description": "Libellé de la capacité maximale de canaux" + }, + + "publicInfo": "Informations publiques", + "@publicInfo": { + "description": "En-tête de section des informations publiques" + }, + + "meshNetworkName": "Nom du réseau maillé", + "@meshNetworkName": { + "description": "Libellé du champ du nom du réseau maillé" + }, + + "nameBroadcastInMesh": "Nom diffusé dans les annonces du maillage", + "@nameBroadcastInMesh": { + "description": "Texte d'aide pour le champ du nom du réseau maillé" + }, + + "telemetryAndLocationSharing": "Télémétrie et partage de position", + "@telemetryAndLocationSharing": { + "description": "Libellé de l'interrupteur de télémétrie et de partage de position" + }, + + "lat": "Lat", + "@lat": { + "description": "Libellé du champ de latitude (forme courte)" + }, + + "lon": "Lon", + "@lon": { + "description": "Libellé du champ de longitude (forme courte)" + }, + + "useCurrentLocation": "Utiliser la position actuelle", + "@useCurrentLocation": { + "description": "Info-bulle du bouton d'utilisation de la position actuelle" + }, + + "noneUnknown": "Aucun/Inconnu", + "@noneUnknown": { + "description": "Type d'appareil : aucun ou inconnu" + }, + + "chatNode": "Nœud de discussion", + "@chatNode": { + "description": "Type d'appareil : nœud de discussion" + }, + + "repeater": "Répéteur", + "@repeater": { + "description": "Type d'appareil : répéteur" + }, + + "roomChannel": "Salon/Canal", + "@roomChannel": { + "description": "Type d'appareil : salon ou canal" + }, + + "typeNumber": "Type {number}", + "@typeNumber": { + "description": "Type d'appareil générique avec numéro", + "placeholders": { + "number": { + "type": "int" + } + } + }, + + "copiedToClipboardShort": "{label} copié dans le presse-papiers", + "@copiedToClipboardShort": { + "description": "Message de succès court lors de la copie dans le presse-papiers", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "failedToSave": "Échec de l'enregistrement : {error}", + "@failedToSave": { + "description": "Message d'erreur générique pour les échecs d'enregistrement", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToGetLocation": "Échec de l'obtention de la position : {error}", + "@failedToGetLocation": { + "description": "Message d'erreur lorsque l'obtention de la position échoue", + "placeholders": { + "error": { + "type": "String" + } + } + } +} diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index ef50437..860d25e 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -632,5 +632,81 @@ "onlineLayers": "Mrežni slojevi", - "offlineLayers": "Offline slojevi" + "offlineLayers": "Offline slojevi", + + "locationTrail": "Putanja lokacije", + + "showTrailOnMap": "Prikaži putanju na karti", + + "trailVisible": "Putanja je vidljiva na karti", + + "trailHiddenRecording": "Putanja je skrivena (još se snima)", + + "distance": "Udaljenost", + + "duration": "Trajanje", + + "points": "Točke", + + "clearTrail": "Obriši putanju", + + "clearTrailQuestion": "Obrisati putanju?", + + "clearTrailConfirmation": "Jeste li sigurni da želite obrisati trenutnu putanju lokacije? Ova radnja se ne može poništiti.", + + "noTrailRecorded": "Još nije snimljena putanja", + + "startTrackingToRecord": "Pokrenite praćenje lokacije za snimanje putanje", + + "trailControls": "Upravljanje putanjom", + + "deviceInformation": "Informacije o uređaju", + + "bleName": "BLE naziv", + + "meshName": "Mesh naziv", + + "notSet": "Nije postavljeno", + + "model": "Model", + + "version": "Verzija", + + "buildDate": "Datum izgradnje", + + "firmware": "Firmware", + + "maxContacts": "Maks. kontakata", + + "maxChannels": "Maks. kanala", + + "publicInfo": "Javne informacije", + + "meshNetworkName": "Naziv mesh mreže", + + "nameBroadcastInMesh": "Naziv koji se emitira u mesh oglasima", + + "telemetryAndLocationSharing": "Telemetrija i dijeljenje lokacije", + + "lat": "Šir", + + "lon": "Dug", + + "useCurrentLocation": "Koristi trenutnu lokaciju", + + "noneUnknown": "Nema/Nepoznato", + + "chatNode": "Čvorište za razgovor", + + "repeater": "Repetitor", + + "roomChannel": "Soba/Kanal", + + "typeNumber": "Tip {number}", + + "copiedToClipboardShort": "Kopirano {label} u međuspremnik", + + "failedToSave": "Neuspjelo spremanje: {error}", + + "failedToGetLocation": "Neuspjelo dohvaćanje lokacije: {error}" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb new file mode 100644 index 0000000..b98823a --- /dev/null +++ b/lib/l10n/app_it.arb @@ -0,0 +1,2100 @@ +{ + "@@locale": "it", + + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "Il titolo dell'applicazione" + }, + + "messages": "Messaggi", + "@messages": { + "description": "Etichetta della scheda Messaggi" + }, + + "contacts": "Contatti", + "@contacts": { + "description": "Etichetta della scheda Contatti" + }, + + "map": "Mappa", + "@map": { + "description": "Etichetta della scheda Mappa" + }, + + "settings": "Impostazioni", + "@settings": { + "description": "Titolo della schermata Impostazioni" + }, + + "connect": "Connetti", + "@connect": { + "description": "Etichetta del pulsante Connetti" + }, + + "disconnect": "Disconnetti", + "@disconnect": { + "description": "Etichetta del pulsante Disconnetti" + }, + + "scanningForDevices": "Ricerca dispositivi in corso...", + "@scanningForDevices": { + "description": "Testo mostrato durante la ricerca di dispositivi BLE" + }, + + "noDevicesFound": "Nessun dispositivo trovato", + "@noDevicesFound": { + "description": "Testo mostrato quando non vengono trovati dispositivi BLE" + }, + + "scanAgain": "Cerca Nuovamente", + "@scanAgain": { + "description": "Pulsante per riavviare la ricerca BLE" + }, + + "tapToConnect": "Tocca per connettere", + "@tapToConnect": { + "description": "Testo sottotitolo per dispositivo nell'elenco di ricerca" + }, + + "deviceNotConnected": "Dispositivo non connesso", + "@deviceNotConnected": { + "description": "Messaggio di errore quando il dispositivo non è connesso" + }, + + "locationPermissionDenied": "Autorizzazione posizione negata", + "@locationPermissionDenied": { + "description": "Errore quando l'autorizzazione alla posizione viene negata" + }, + + "locationPermissionPermanentlyDenied": "Autorizzazione posizione negata permanentemente. Abilitarla nelle Impostazioni.", + "@locationPermissionPermanentlyDenied": { + "description": "Errore quando l'autorizzazione alla posizione è negata permanentemente" + }, + + "locationPermissionRequired": "L'autorizzazione alla posizione è necessaria per il tracciamento GPS e il coordinamento del team. Puoi abilitarla successivamente nelle Impostazioni.", + "@locationPermissionRequired": { + "description": "Messaggio quando è necessaria l'autorizzazione alla posizione" + }, + + "locationServicesDisabled": "I servizi di localizzazione sono disabilitati. Abilitarli nelle Impostazioni.", + "@locationServicesDisabled": { + "description": "Errore quando i servizi di localizzazione sono disabilitati" + }, + + "failedToGetGpsLocation": "Impossibile ottenere la posizione GPS", + "@failedToGetGpsLocation": { + "description": "Errore quando non è possibile ottenere la posizione GPS" + }, + + "advertisedAtLocation": "Annunciato a {latitude}, {longitude}", + "@advertisedAtLocation": { + "description": "Messaggio di successo che mostra la posizione annunciata", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "failedToAdvertise": "Annuncio fallito: {error}", + "@failedToAdvertise": { + "description": "Messaggio di errore per annuncio fallito", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "reconnecting": "Riconnessione in corso... ({attempt}/{max})", + "@reconnecting": { + "description": "Testo mostrato durante i tentativi di riconnessione", + "placeholders": { + "attempt": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + + "cancelReconnection": "Annulla riconnessione", + "@cancelReconnection": { + "description": "Tooltip per il pulsante annulla riconnessione" + }, + + "mapManagement": "Gestione Mappa", + "@mapManagement": { + "description": "Voce di menu per la gestione della mappa" + }, + + "general": "Generale", + "@general": { + "description": "Intestazione sezione impostazioni generali" + }, + + "theme": "Tema", + "@theme": { + "description": "Etichetta impostazione tema" + }, + + "chooseTheme": "Scegli Tema", + "@chooseTheme": { + "description": "Titolo della finestra di selezione tema" + }, + + "light": "Chiaro", + "@light": { + "description": "Opzione tema chiaro" + }, + + "dark": "Scuro", + "@dark": { + "description": "Opzione tema scuro" + }, + + "blueLightTheme": "Tema blu chiaro", + "@blueLightTheme": { + "description": "Descrizione per il tema blu chiaro" + }, + + "blueDarkTheme": "Tema blu scuro", + "@blueDarkTheme": { + "description": "Descrizione per il tema blu scuro" + }, + + "sarRed": "SAR Rosso", + "@sarRed": { + "description": "Opzione tema SAR Rosso" + }, + + "alertEmergencyMode": "Modalità Allerta/Emergenza", + "@alertEmergencyMode": { + "description": "Descrizione per il tema SAR Rosso" + }, + + "sarGreen": "SAR Verde", + "@sarGreen": { + "description": "Opzione tema SAR Verde" + }, + + "safeAllClearMode": "Modalità Sicuro/Tutto Libero", + "@safeAllClearMode": { + "description": "Descrizione per il tema SAR Verde" + }, + + "autoSystem": "Auto (Sistema)", + "@autoSystem": { + "description": "Opzione tema Auto/Sistema" + }, + + "followSystemTheme": "Segui tema di sistema", + "@followSystemTheme": { + "description": "Descrizione per il tema di sistema" + }, + + "showRxTxIndicators": "Mostra Indicatori RX/TX", + "@showRxTxIndicators": { + "description": "Impostazione per mostrare gli indicatori RX/TX" + }, + + "displayPacketActivity": "Mostra indicatori di attività pacchetti nella barra superiore", + "@displayPacketActivity": { + "description": "Descrizione per l'impostazione degli indicatori RX/TX" + }, + + "language": "Lingua", + "@language": { + "description": "Etichetta impostazione lingua" + }, + + "chooseLanguage": "Scegli Lingua", + "@chooseLanguage": { + "description": "Titolo della finestra di selezione lingua" + }, + + "english": "Inglese", + "@english": { + "description": "Opzione lingua inglese" + }, + + "slovenian": "Sloveno", + "@slovenian": { + "description": "Opzione lingua slovena" + }, + + "croatian": "Croato", + "@croatian": { + "description": "Opzione lingua croata" + }, + + "locationBroadcasting": "Trasmissione Posizione", + "@locationBroadcasting": { + "description": "Intestazione sezione impostazioni posizione" + }, + + "autoLocationTracking": "Tracciamento Posizione Automatico", + "@autoLocationTracking": { + "description": "Impostazione tracciamento posizione automatico" + }, + + "automaticallyBroadcastPosition": "Trasmetti automaticamente aggiornamenti di posizione", + "@automaticallyBroadcastPosition": { + "description": "Descrizione per il tracciamento posizione automatico" + }, + + "configureTracking": "Configura Tracciamento", + "@configureTracking": { + "description": "Etichetta pulsante configura tracciamento" + }, + + "distanceAndTimeThresholds": "Soglie di distanza e tempo", + "@distanceAndTimeThresholds": { + "description": "Descrizione per la configurazione del tracciamento" + }, + + "locationTrackingConfiguration": "Configurazione Tracciamento Posizione", + "@locationTrackingConfiguration": { + "description": "Titolo della finestra di configurazione tracciamento" + }, + + "configureWhenLocationBroadcasts": "Configura quando le trasmissioni di posizione vengono inviate alla rete mesh", + "@configureWhenLocationBroadcasts": { + "description": "Descrizione per la finestra di configurazione tracciamento" + }, + + "minimumDistance": "Distanza Minima", + "@minimumDistance": { + "description": "Etichetta impostazione distanza minima" + }, + + "broadcastAfterMoving": "Trasmetti solo dopo essersi spostati di {distance} metri", + "@broadcastAfterMoving": { + "description": "Descrizione per la distanza minima", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "maximumDistance": "Distanza Massima", + "@maximumDistance": { + "description": "Etichetta impostazione distanza massima" + }, + + "alwaysBroadcastAfterMoving": "Trasmetti sempre dopo essersi spostati di {distance} metri", + "@alwaysBroadcastAfterMoving": { + "description": "Descrizione per la distanza massima", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + + "minimumTimeInterval": "Intervallo Minimo di Tempo", + "@minimumTimeInterval": { + "description": "Etichetta impostazione intervallo minimo di tempo" + }, + + "alwaysBroadcastEvery": "Trasmetti sempre ogni {duration}", + "@alwaysBroadcastEvery": { + "description": "Descrizione per l'intervallo di tempo", + "placeholders": { + "duration": { + "type": "String" + } + } + }, + + "save": "Salva", + "@save": { + "description": "Etichetta pulsante Salva" + }, + + "cancel": "Annulla", + "@cancel": { + "description": "Etichetta pulsante Annulla" + }, + + "close": "Chiudi", + "@close": { + "description": "Etichetta pulsante Chiudi" + }, + + "about": "Informazioni", + "@about": { + "description": "Intestazione sezione Informazioni" + }, + + "appVersion": "Versione App", + "@appVersion": { + "description": "Etichetta versione app" + }, + + "appName": "Nome App", + "@appName": { + "description": "Etichetta nome app" + }, + + "aboutMeshCoreSar": "Informazioni su MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "Titolo della finestra Informazioni" + }, + + "aboutDescription": "Un'applicazione di Ricerca e Soccorso progettata per i team di emergenza. Le caratteristiche includono:\n\n• Rete mesh BLE per comunicazione dispositivo-a-dispositivo\n• Mappe offline con opzioni di livelli multipli\n• Tracciamento in tempo reale dei membri del team\n• Marcatori tattici SAR (persona trovata, incendio, area di appoggio)\n• Gestione contatti e messaggistica\n• Tracciamento GPS con direzione bussola\n• Caching dei tile della mappa per uso offline", + "@aboutDescription": { + "description": "Descrizione nella finestra Informazioni" + }, + + "technologiesUsed": "Tecnologie Utilizzate:", + "@technologiesUsed": { + "description": "Titolo sezione tecnologie utilizzate" + }, + + "technologiesList": "• Flutter per lo sviluppo multipiattaforma\n• BLE (Bluetooth Low Energy) per la rete mesh\n• OpenStreetMap per la mappatura\n• Provider per la gestione dello stato\n• SharedPreferences per l'archiviazione locale", + "@technologiesList": { + "description": "Elenco delle tecnologie utilizzate" + }, + + "developer": "Sviluppatore", + "@developer": { + "description": "Intestazione sezione sviluppatore" + }, + + "packageName": "Nome Pacchetto", + "@packageName": { + "description": "Etichetta nome pacchetto" + }, + + "sampleData": "Dati di Esempio", + "@sampleData": { + "description": "Intestazione sezione dati di esempio" + }, + + "sampleDataDescription": "Carica o cancella contatti di esempio, messaggi di canale e marcatori SAR per test", + "@sampleDataDescription": { + "description": "Descrizione sezione dati di esempio" + }, + + "loadSampleData": "Carica Dati di Esempio", + "@loadSampleData": { + "description": "Pulsante carica dati di esempio" + }, + + "clearAllData": "Cancella Tutti i Dati", + "@clearAllData": { + "description": "Pulsante cancella tutti i dati" + }, + + "clearAllDataConfirmTitle": "Cancella Tutti i Dati", + "@clearAllDataConfirmTitle": { + "description": "Titolo della finestra di conferma cancellazione dati" + }, + + "clearAllDataConfirmMessage": "Questo cancellerà tutti i contatti e i marcatori SAR. Sei sicuro?", + "@clearAllDataConfirmMessage": { + "description": "Messaggio di conferma cancellazione dati" + }, + + "clear": "Cancella", + "@clear": { + "description": "Etichetta pulsante Cancella" + }, + + "loadedSampleData": "Caricati {teamCount} membri del team, {channelCount} canali, {sarCount} marcatori SAR, {messageCount} messaggi", + "@loadedSampleData": { + "description": "Messaggio di successo dopo il caricamento dei dati di esempio", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + + "failedToLoadSampleData": "Impossibile caricare dati di esempio: {error}", + "@failedToLoadSampleData": { + "description": "Messaggio di errore quando il caricamento dei dati di esempio fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "allDataCleared": "Tutti i dati cancellati", + "@allDataCleared": { + "description": "Messaggio di successo dopo la cancellazione di tutti i dati" + }, + + "failedToStartBackgroundTracking": "Impossibile avviare il tracciamento in background. Verifica le autorizzazioni e la connessione BLE.", + "@failedToStartBackgroundTracking": { + "description": "Messaggio di errore quando il tracciamento in background fallisce" + }, + + "locationBroadcast": "Trasmissione posizione: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Messaggio di successo per la trasmissione della posizione", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "defaultPinInfo": "Il PIN predefinito per i dispositivi senza schermo è 123456. Problemi di accoppiamento? Dimentica il dispositivo bluetooth nelle impostazioni di sistema.", + "@defaultPinInfo": { + "description": "Informazioni sul PIN predefinito per l'accoppiamento" + }, + + "noMessagesYet": "Nessun messaggio ancora", + "@noMessagesYet": { + "description": "Messaggio di stato vuoto quando non ci sono messaggi" + }, + + "pullDownToSync": "Trascina verso il basso per sincronizzare i messaggi", + "@pullDownToSync": { + "description": "Istruzione per trascinare verso il basso per aggiornare i messaggi" + }, + + "deleteContact": "Elimina Contatto", + "@deleteContact": { + "description": "Etichetta azione elimina contatto" + }, + + "delete": "Elimina", + "@delete": { + "description": "Etichetta pulsante Elimina" + }, + + "viewOnMap": "Visualizza su Mappa", + "@viewOnMap": { + "description": "Azione per visualizzare la posizione del contatto sulla mappa" + }, + + "refresh": "Aggiorna", + "@refresh": { + "description": "Etichetta pulsante Aggiorna" + }, + + "sendDirectMessage": "Invia Messaggio Diretto", + "@sendDirectMessage": { + "description": "Azione per inviare messaggio diretto al contatto" + }, + + "resetPath": "Resetta Percorso (Ri-instrada)", + "@resetPath": { + "description": "Azione per resettare il percorso del contatto per il re-instradamento" + }, + + "publicKeyCopied": "Chiave pubblica copiata negli appunti", + "@publicKeyCopied": { + "description": "Messaggio di successo quando la chiave pubblica viene copiata" + }, + + "copiedToClipboard": "{label} copiato negli appunti", + "@copiedToClipboard": { + "description": "Messaggio di successo quando un valore viene copiato negli appunti", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "pleaseEnterPassword": "Inserisci una password", + "@pleaseEnterPassword": { + "description": "Messaggio di validazione per campo password vuoto" + }, + + "failedToSyncContacts": "Impossibile sincronizzare i contatti: {error}", + "@failedToSyncContacts": { + "description": "Messaggio di errore quando la sincronizzazione dei contatti fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "loggedInSuccessfully": "Accesso effettuato con successo! In attesa dei messaggi della stanza...", + "@loggedInSuccessfully": { + "description": "Messaggio di successo dopo l'accesso alla stanza" + }, + + "loginFailed": "Accesso fallito - password errata", + "@loginFailed": { + "description": "Messaggio di errore quando l'accesso alla stanza fallisce" + }, + + "loggingIn": "Accesso a {roomName} in corso...", + "@loggingIn": { + "description": "Messaggio di stato durante il processo di accesso alla stanza", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "failedToSendLogin": "Impossibile inviare l'accesso: {error}", + "@failedToSendLogin": { + "description": "Messaggio di errore quando il comando di accesso fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "lowLocationAccuracy": "Precisione Posizione Bassa", + "@lowLocationAccuracy": { + "description": "Titolo avviso per precisione GPS bassa" + }, + + "continue_": "Continua", + "@continue_": { + "description": "Etichetta pulsante Continua" + }, + + "sendSarMarker": "Invia marcatore SAR", + "@sendSarMarker": { + "description": "Azione per inviare marcatore SAR" + }, + + "deleteDrawing": "Elimina Disegno", + "@deleteDrawing": { + "description": "Azione per eliminare un disegno sulla mappa" + }, + + "drawLine": "Disegna Linea", + "@drawLine": { + "description": "Modalità disegno mappa: linea" + }, + + "drawLineDesc": "Disegna una linea a mano libera sulla mappa", + "@drawLineDesc": { + "description": "Descrizione per la modalità disegno linea" + }, + + "drawRectangle": "Disegna Rettangolo", + "@drawRectangle": { + "description": "Modalità disegno mappa: rettangolo" + }, + + "drawRectangleDesc": "Disegna un'area rettangolare sulla mappa", + "@drawRectangleDesc": { + "description": "Descrizione per la modalità disegno rettangolo" + }, + + "shareDrawings": "Condividi Disegni", + "@shareDrawings": { + "description": "Azione per condividere disegni sulla rete" + }, + + "clearAllDrawings": "Cancella Tutti i Disegni", + "@clearAllDrawings": { + "description": "Azione per cancellare tutti i disegni locali" + }, + + "clearAll": "Cancella Tutto", + "@clearAll": { + "description": "Etichetta pulsante Cancella Tutto" + }, + + "noLocalDrawings": "Nessun disegno locale da condividere", + "@noLocalDrawings": { + "description": "Messaggio quando non ci sono disegni da condividere" + }, + + "publicChannel": "Canale Pubblico", + "@publicChannel": { + "description": "Opzione canale pubblico per la condivisione" + }, + + "broadcastToAll": "Trasmetti a tutti i nodi vicini (effimero)", + "@broadcastToAll": { + "description": "Descrizione per la trasmissione sul canale pubblico" + }, + + "storedPermanently": "Archiviato permanentemente nella stanza", + "@storedPermanently": { + "description": "Descrizione per la permanenza dell'archiviazione nella stanza" + }, + + "notConnectedToDevice": "Non connesso al dispositivo", + "@notConnectedToDevice": { + "description": "Messaggio di errore quando il dispositivo non è connesso per la messaggistica diretta" + }, + + "directMessage": "Messaggio Diretto", + "@directMessage": { + "description": "Titolo per il pannello messaggio diretto" + }, + + "directMessageSentTo": "Messaggio diretto inviato a {contactName}", + "@directMessageSentTo": { + "description": "Messaggio di successo dopo l'invio del messaggio diretto", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "failedToSend": "Invio fallito: {error}", + "@failedToSend": { + "description": "Messaggio di errore quando l'invio del messaggio diretto fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "directMessageInfo": "Questo messaggio verrà inviato direttamente a {contactName}. Apparirà anche nel feed dei messaggi principali.", + "@directMessageInfo": { + "description": "Informazioni sul comportamento della messaggistica diretta", + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + + "typeYourMessage": "Scrivi il tuo messaggio...", + "@typeYourMessage": { + "description": "Testo segnaposto per il campo di input del messaggio" + }, + + "quickLocationMarker": "Marcatore posizione rapido", + "@quickLocationMarker": { + "description": "Sottotitolo per l'intestazione del pannello marcatore SAR" + }, + + "markerType": "Tipo Marcatore", + "@markerType": { + "description": "Etichetta per la sezione di selezione tipo marcatore" + }, + + "sendTo": "Invia A", + "@sendTo": { + "description": "Etichetta per la sezione di selezione destinazione" + }, + + "noDestinationsAvailable": "Nessuna destinazione disponibile.", + "@noDestinationsAvailable": { + "description": "Avviso quando non esistono stanze o canali" + }, + + "selectDestination": "Seleziona destinazione...", + "@selectDestination": { + "description": "Segnaposto per il menu a discesa della destinazione" + }, + + "ephemeralBroadcastInfo": "Effimero: Trasmissione via etere solamente. Non archiviato - i nodi devono essere online.", + "@ephemeralBroadcastInfo": { + "description": "Informazioni sulle trasmissioni di canale effimere" + }, + + "persistentRoomInfo": "Persistente: Archiviato in modo immutabile nella stanza. Sincronizzato automaticamente e conservato offline.", + "@persistentRoomInfo": { + "description": "Informazioni sull'archiviazione persistente della stanza" + }, + + "location": "Posizione", + "@location": { + "description": "Etichetta per la sezione posizione" + }, + + "fromMap": "Dalla Mappa", + "@fromMap": { + "description": "Badge che mostra che la posizione proviene dal tocco sulla mappa" + }, + + "gettingLocation": "Ottenimento posizione...", + "@gettingLocation": { + "description": "Messaggio di caricamento durante il recupero della posizione GPS" + }, + + "locationError": "Errore Posizione", + "@locationError": { + "description": "Titolo per i messaggi di errore della posizione" + }, + + "retry": "Riprova", + "@retry": { + "description": "Etichetta pulsante Riprova" + }, + + "refreshLocation": "Aggiorna posizione", + "@refreshLocation": { + "description": "Tooltip per il pulsante aggiorna posizione" + }, + + "accuracyMeters": "Precisione: ±{accuracy}m", + "@accuracyMeters": { + "description": "Visualizzazione della precisione GPS in metri", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "notesOptional": "Note (facoltativo)", + "@notesOptional": { + "description": "Etichetta per il campo note facoltativo" + }, + + "addAdditionalInformation": "Aggiungi informazioni aggiuntive...", + "@addAdditionalInformation": { + "description": "Segnaposto per il campo note" + }, + + "lowAccuracyWarning": "La precisione della posizione è ±{accuracy}m. Potrebbe non essere abbastanza accurata per le operazioni SAR.\n\nContinuare comunque?", + "@lowAccuracyWarning": { + "description": "Contenuto della finestra di avviso per precisione GPS bassa", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + + "loginToRoom": "Accedi alla Stanza", + "@loginToRoom": { + "description": "Titolo per la finestra di accesso alla stanza" + }, + + "enterPasswordInfo": "Inserisci la password per accedere a questa stanza. La password verrà salvata per usi futuri.", + "@enterPasswordInfo": { + "description": "Informazioni sulla password della stanza" + }, + + "password": "Password", + "@password": { + "description": "Etichetta campo password" + }, + + "enterRoomPassword": "Inserisci password stanza", + "@enterRoomPassword": { + "description": "Suggerimento campo password" + }, + + "loggingInDots": "Accesso in corso...", + "@loggingInDots": { + "description": "Testo pulsante durante l'accesso" + }, + + "login": "Accedi", + "@login": { + "description": "Etichetta pulsante Accedi" + }, + + "failedToAddRoom": "Impossibile aggiungere la stanza al dispositivo: {error}\n\nLa stanza potrebbe non aver ancora trasmesso.\nProva ad attendere che la stanza trasmetta.", + "@failedToAddRoom": { + "description": "Messaggio di errore quando l'aggiunta della stanza fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "direct": "Diretto", + "@direct": { + "description": "Indicatore instradamento diretto" + }, + + "flood": "Flood", + "@flood": { + "description": "Indicatore instradamento flood" + }, + + "admin": "Admin", + "@admin": { + "description": "Etichetta badge amministratore" + }, + + "loggedIn": "Connesso", + "@loggedIn": { + "description": "Badge stato connesso" + }, + + "noGpsData": "Nessun dato GPS", + "@noGpsData": { + "description": "Messaggio quando i dati GPS non sono disponibili" + }, + + "distance": "Distanza", + "@distance": { + "description": "Etichetta distanza" + }, + + "pingingDirect": "Ping {name} (diretto via percorso)...", + "@pingingDirect": { + "description": "Messaggio di stato per ping diretto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingingFlood": "Ping {name} (flooding - nessun percorso)...", + "@pingingFlood": { + "description": "Messaggio di stato per ping flood", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "directPingTimeout": "Timeout ping diretto - nuovo tentativo {name} con flooding...", + "@directPingTimeout": { + "description": "Avviso quando il ping diretto va in timeout", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "pingSuccessful": "Ping riuscito a {name}{fallback}", + "@pingSuccessful": { + "description": "Messaggio di successo per ping", + "placeholders": { + "name": { + "type": "String" + }, + "fallback": { + "type": "String" + } + } + }, + + "viaFloodingFallback": " (via fallback flooding)", + "@viaFloodingFallback": { + "description": "Suffisso per successo ping con fallback" + }, + + "pingFailed": "Ping fallito a {name} - nessuna risposta ricevuta", + "@pingFailed": { + "description": "Messaggio di errore quando il ping fallisce", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "deleteContactConfirmation": "Sei sicuro di voler eliminare \"{name}\"?\n\nQuesto rimuoverà il contatto sia dall'app che dal dispositivo radio companion.", + "@deleteContactConfirmation": { + "description": "Messaggio di conferma per l'eliminazione del contatto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "removingContact": "Rimozione di {name}...", + "@removingContact": { + "description": "Messaggio di stato durante la rimozione del contatto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "contactRemoved": "Contatto \"{name}\" rimosso", + "@contactRemoved": { + "description": "Messaggio di successo dopo la rimozione del contatto", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "failedToRemoveContact": "Impossibile rimuovere il contatto: {error}", + "@failedToRemoveContact": { + "description": "Messaggio di errore quando la rimozione del contatto fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "type": "Tipo", + "@type": { + "description": "Etichetta tipo contatto" + }, + + "publicKey": "Chiave Pubblica", + "@publicKey": { + "description": "Etichetta chiave pubblica" + }, + + "lastSeen": "Ultima Visita", + "@lastSeen": { + "description": "Etichetta ultima visita" + }, + + "roomStatus": "Stato Stanza", + "@roomStatus": { + "description": "Intestazione sezione stato stanza" + }, + + "loginStatus": "Stato Accesso", + "@loginStatus": { + "description": "Etichetta stato accesso" + }, + + "notLoggedIn": "Non Connesso", + "@notLoggedIn": { + "description": "Stato non connesso" + }, + + "adminAccess": "Accesso Admin", + "@adminAccess": { + "description": "Etichetta accesso amministratore" + }, + + "yes": "Sì", + "@yes": { + "description": "Risposta Sì" + }, + + "no": "No", + "@no": { + "description": "Risposta No" + }, + + "permissions": "Permessi", + "@permissions": { + "description": "Etichetta permessi" + }, + + "passwordSaved": "Password Salvata", + "@passwordSaved": { + "description": "Etichetta password salvata" + }, + + "locationColon": "Posizione:", + "@locationColon": { + "description": "Intestazione sezione posizione" + }, + + "telemetry": "Telemetria", + "@telemetry": { + "description": "Intestazione sezione telemetria" + }, + + "requestingTelemetry": "Richiesta telemetria da {name}...", + "@requestingTelemetry": { + "description": "Messaggio di stato durante la richiesta telemetria", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "voltage": "Tensione", + "@voltage": { + "description": "Etichetta tensione" + }, + + "battery": "Batteria", + "@battery": { + "description": "Etichetta batteria" + }, + + "temperature": "Temperatura", + "@temperature": { + "description": "Etichetta temperatura" + }, + + "humidity": "Umidità", + "@humidity": { + "description": "Etichetta umidità" + }, + + "pressure": "Pressione", + "@pressure": { + "description": "Etichetta pressione" + }, + + "gpsTelemetry": "GPS (Telemetria)", + "@gpsTelemetry": { + "description": "Etichetta GPS da telemetria" + }, + + "updated": "Aggiornato", + "@updated": { + "description": "Etichetta timestamp aggiornato" + }, + + "pathResetInfo": "Percorso resettato per {name}. Il prossimo messaggio troverà un nuovo instradamento.", + "@pathResetInfo": { + "description": "Messaggio informativo dopo il reset del percorso", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "reLoginToRoom": "Riaccedi alla Stanza", + "@reLoginToRoom": { + "description": "Pulsante per riaccedere alla stanza" + }, + + "heading": "Direzione", + "@heading": { + "description": "Etichetta direzione bussola" + }, + + "elevation": "Elevazione", + "@elevation": { + "description": "Etichetta elevazione/altitudine" + }, + + "accuracy": "Precisione", + "@accuracy": { + "description": "Etichetta precisione GPS" + }, + + "filterMarkers": "Filtra Marcatori", + "@filterMarkers": { + "description": "Titolo per la finestra filtra marcatori" + }, + + "filterMarkersTooltip": "Filtra marcatori", + "@filterMarkersTooltip": { + "description": "Tooltip per il pulsante filtro" + }, + + "contactsFilter": "Contatti", + "@contactsFilter": { + "description": "Opzione filtro per contatti" + }, + + "repeatersFilter": "Ripetitori", + "@repeatersFilter": { + "description": "Opzione filtro per ripetitori" + }, + + "sarMarkers": "Marcatori SAR", + "@sarMarkers": { + "description": "Intestazione sezione marcatori SAR" + }, + + "foundPerson": "Persona Trovata", + "@foundPerson": { + "description": "Tipo marcatore SAR persona trovata" + }, + + "fire": "Incendio", + "@fire": { + "description": "Tipo marcatore SAR incendio" + }, + + "stagingArea": "Area di Appoggio", + "@stagingArea": { + "description": "Tipo marcatore SAR area di appoggio" + }, + + "showAll": "Mostra Tutto", + "@showAll": { + "description": "Pulsante per mostrare tutti i filtri" + }, + + "nearbyContacts": "Contatti Vicini", + "@nearbyContacts": { + "description": "Titolo per l'elenco contatti vicini nella bussola" + }, + + "locationUnavailable": "Posizione non disponibile", + "@locationUnavailable": { + "description": "Messaggio quando la posizione GPS non è disponibile" + }, + + "ahead": "avanti", + "@ahead": { + "description": "Direzione rilevamento relativo - avanti" + }, + + "degreesRight": "{degrees}° destra", + "@degreesRight": { + "description": "Direzione rilevamento relativo - destra", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "degreesLeft": "{degrees}° sinistra", + "@degreesLeft": { + "description": "Direzione rilevamento relativo - sinistra", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Formato visualizzazione latitudine e longitudine", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + + "noContactsYet": "Nessun contatto ancora", + "@noContactsYet": { + "description": "Messaggio di stato vuoto quando non ci sono contatti" + }, + + "connectToDeviceToLoadContacts": "Connetti a un dispositivo per caricare i contatti", + "@connectToDeviceToLoadContacts": { + "description": "Istruzione per connettere dispositivo per caricare contatti" + }, + + "teamMembers": "Membri del Team", + "@teamMembers": { + "description": "Intestazione sezione per i membri del team (contatti chat)" + }, + + "repeaters": "Ripetitori", + "@repeaters": { + "description": "Intestazione sezione per i nodi ripetitori" + }, + + "rooms": "Stanze", + "@rooms": { + "description": "Intestazione sezione per le stanze" + }, + + "channels": "Canali", + "@channels": { + "description": "Intestazione sezione per i canali di trasmissione" + }, + + "cacheStatistics": "Statistiche Cache", + "@cacheStatistics": { + "description": "Titolo per la sezione statistiche cache" + }, + + "totalTiles": "Tile Totali", + "@totalTiles": { + "description": "Etichetta per il numero totale di tile in cache" + }, + + "cacheSize": "Dimensione Cache", + "@cacheSize": { + "description": "Etichetta per la dimensione della cache in MB" + }, + + "storeName": "Nome Archivio", + "@storeName": { + "description": "Etichetta per il nome dell'archivio cache" + }, + + "noCacheStatistics": "Nessuna statistica cache disponibile", + "@noCacheStatistics": { + "description": "Messaggio quando le statistiche cache non sono disponibili" + }, + + "downloadRegion": "Scarica Regione", + "@downloadRegion": { + "description": "Titolo per la sezione scarica regione" + }, + + "mapLayer": "Livello Mappa", + "@mapLayer": { + "description": "Etichetta per la selezione del livello mappa" + }, + + "regionBounds": "Limiti Regione", + "@regionBounds": { + "description": "Titolo per la sezione input limiti regione" + }, + + "north": "Nord", + "@north": { + "description": "Etichetta per coordinata nord" + }, + + "south": "Sud", + "@south": { + "description": "Etichetta per coordinata sud" + }, + + "east": "Est", + "@east": { + "description": "Etichetta per coordinata est" + }, + + "west": "Ovest", + "@west": { + "description": "Etichetta per coordinata ovest" + }, + + "zoomLevels": "Livelli di Zoom", + "@zoomLevels": { + "description": "Titolo per la sezione livelli di zoom" + }, + + "minZoom": "Min: {zoom}", + "@minZoom": { + "description": "Etichetta per il livello di zoom minimo", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "maxZoom": "Max: {zoom}", + "@maxZoom": { + "description": "Etichetta per il livello di zoom massimo", + "placeholders": { + "zoom": { + "type": "int" + } + } + }, + + "downloadingDots": "Scaricamento in corso...", + "@downloadingDots": { + "description": "Messaggio di stato durante il download" + }, + + "cancelDownload": "Annulla Download", + "@cancelDownload": { + "description": "Pulsante per annullare il download" + }, + + "downloadRegionButton": "Scarica Regione", + "@downloadRegionButton": { + "description": "Pulsante per avviare il download della regione" + }, + + "downloadNote": "Nota: Regioni grandi o livelli di zoom elevati possono richiedere tempo e spazio di archiviazione significativi.", + "@downloadNote": { + "description": "Avviso sulla dimensione e durata del download" + }, + + "cacheManagement": "Gestione Cache", + "@cacheManagement": { + "description": "Titolo per la sezione gestione cache" + }, + + "clearAllMaps": "Cancella Tutte le Mappe", + "@clearAllMaps": { + "description": "Pulsante per cancellare tutte le mappe in cache" + }, + + "clearMapsConfirmTitle": "Cancella Tutte le Mappe", + "@clearMapsConfirmTitle": { + "description": "Titolo per la finestra di conferma cancellazione mappe" + }, + + "clearMapsConfirmMessage": "Sei sicuro di voler eliminare tutte le mappe scaricate? Questa azione non può essere annullata.", + "@clearMapsConfirmMessage": { + "description": "Messaggio di conferma per la cancellazione delle mappe" + }, + + "mapDownloadCompleted": "Download mappa completato!", + "@mapDownloadCompleted": { + "description": "Messaggio di successo dopo il download della mappa" + }, + + "cacheClearedSuccessfully": "Cache cancellata con successo!", + "@cacheClearedSuccessfully": { + "description": "Messaggio di successo dopo la cancellazione della cache" + }, + + "downloadCancelled": "Download annullato", + "@downloadCancelled": { + "description": "Messaggio quando il download viene annullato" + }, + + "startingDownload": "Avvio download...", + "@startingDownload": { + "description": "Stato iniziale quando inizia il download" + }, + + "downloadingMapTiles": "Scaricamento tile mappa...", + "@downloadingMapTiles": { + "description": "Stato durante il download dei tile" + }, + + "downloadCompletedSuccessfully": "Download completato con successo!", + "@downloadCompletedSuccessfully": { + "description": "Stato dopo il download riuscito" + }, + + "cancellingDownload": "Annullamento download...", + "@cancellingDownload": { + "description": "Stato durante l'annullamento del download" + }, + + "errorLoadingStats": "Errore nel caricamento delle statistiche: {error}", + "@errorLoadingStats": { + "description": "Messaggio di errore quando il caricamento delle statistiche cache fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "downloadFailed": "Download fallito: {error}", + "@downloadFailed": { + "description": "Messaggio di errore quando il download fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "cancelFailed": "Annullamento fallito: {error}", + "@cancelFailed": { + "description": "Messaggio di errore quando l'annullamento fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "clearCacheFailed": "Cancellazione cache fallita: {error}", + "@clearCacheFailed": { + "description": "Messaggio di errore quando la cancellazione della cache fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomError": "Zoom minimo: {error}", + "@minZoomError": { + "description": "Errore di validazione per lo zoom minimo", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "maxZoomError": "Zoom massimo: {error}", + "@maxZoomError": { + "description": "Errore di validazione per lo zoom massimo", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "minZoomGreaterThanMax": "Lo zoom minimo deve essere minore o uguale allo zoom massimo", + "@minZoomGreaterThanMax": { + "description": "Errore di validazione quando zoom minimo > zoom massimo" + }, + + "selectMapLayer": "Seleziona Livello Mappa", + "@selectMapLayer": { + "description": "Titolo per la finestra di selezione livello mappa" + }, + + "mapOptions": "Opzioni Mappa", + "@mapOptions": { + "description": "Titolo per la finestra opzioni mappa" + }, + + "showLegend": "Mostra Legenda", + "@showLegend": { + "description": "Interruttore per mostrare la legenda della mappa" + }, + + "displayMarkerTypeCounts": "Visualizza conteggio tipi di marcatori", + "@displayMarkerTypeCounts": { + "description": "Descrizione per l'interruttore mostra legenda" + }, + + "rotateMapWithHeading": "Ruota Mappa con Direzione", + "@rotateMapWithHeading": { + "description": "Interruttore per ruotare la mappa con la direzione della bussola" + }, + + "mapFollowsDirection": "La mappa segue la tua direzione quando ti muovi", + "@mapFollowsDirection": { + "description": "Descrizione per l'interruttore ruota mappa" + }, + + "showMapDebugInfo": "Mostra Info Debug Mappa", + "@showMapDebugInfo": { + "description": "Interruttore per mostrare informazioni di debug della mappa" + }, + + "displayZoomLevelBounds": "Visualizza livello di zoom e limiti", + "@displayZoomLevelBounds": { + "description": "Descrizione per l'interruttore info debug" + }, + + "fullscreenMode": "Modalità Schermo Intero", + "@fullscreenMode": { + "description": "Interruttore per la modalità mappa a schermo intero" + }, + + "hideUiFullMapView": "Nascondi tutti i controlli UI per la visualizzazione completa della mappa", + "@hideUiFullMapView": { + "description": "Descrizione per l'interruttore modalità schermo intero" + }, + + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "Nome livello OpenStreetMap" + }, + + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "Nome livello OpenTopoMap" + }, + + "esriSatellite": "ESRI Satellite", + "@esriSatellite": { + "description": "Nome livello immagini satellitari ESRI" + }, + + "downloadVisibleArea": "Scarica area visibile", + "@downloadVisibleArea": { + "description": "Tooltip per il pulsante scarica area visibile" + }, + + "initializingMap": "Inizializzazione mappa...", + "@initializingMap": { + "description": "Messaggio di caricamento per l'inizializzazione della mappa" + }, + + "dragToPosition": "Trascina per Posizionare", + "@dragToPosition": { + "description": "Etichetta quando si trascina un segnaposto sulla mappa" + }, + + "createSarMarker": "Crea Marcatore SAR", + "@createSarMarker": { + "description": "Etichetta per creare marcatore SAR dal segnaposto" + }, + + "compass": "Bussola", + "@compass": { + "description": "Titolo della bussola nella finestra bussola dettagliata" + }, + + "navigationAndContacts": "Navigazione e Contatti", + "@navigationAndContacts": { + "description": "Sottotitolo per la finestra bussola" + }, + + "sarAlert": "ALLERTA SAR", + "@sarAlert": { + "description": "Etichetta per il badge allerta SAR sui messaggi" + }, + + "messageSentToPublicChannel": "Messaggio inviato al canale pubblico", + "@messageSentToPublicChannel": { + "description": "Messaggio di successo quando il messaggio viene inviato al canale pubblico" + }, + + "pleaseSelectRoomToSendSar": "Seleziona una stanza per inviare il marcatore SAR", + "@pleaseSelectRoomToSendSar": { + "description": "Errore quando non è selezionata alcuna stanza per il marcatore SAR" + }, + + "failedToSendSarMarker": "Impossibile inviare il marcatore SAR: {error}", + "@failedToSendSarMarker": { + "description": "Messaggio di errore quando l'invio del marcatore SAR fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "sarMarkerSentTo": "Marcatore SAR inviato a {roomName}", + "@sarMarkerSentTo": { + "description": "Messaggio di successo quando il marcatore SAR viene inviato alla stanza", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + + "notConnectedCannotSync": "Non connesso - impossibile sincronizzare i messaggi", + "@notConnectedCannotSync": { + "description": "Avviso quando si tenta di sincronizzare i messaggi senza essere connessi" + }, + + "syncedMessageCount": "Sincronizzati {count} messaggio(i)", + "@syncedMessageCount": { + "description": "Messaggio di successo che mostra il numero di messaggi sincronizzati", + "placeholders": { + "count": { + "type": "int" + } + } + }, + + "noNewMessages": "Nessun nuovo messaggio", + "@noNewMessages": { + "description": "Messaggio informativo quando non ci sono nuovi messaggi da sincronizzare" + }, + + "syncFailed": "Sincronizzazione fallita: {error}", + "@syncFailed": { + "description": "Messaggio di errore quando la sincronizzazione fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToResendMessage": "Impossibile reinviare il messaggio", + "@failedToResendMessage": { + "description": "Errore quando il nuovo tentativo di invio del messaggio fallisce" + }, + + "retryingMessage": "Nuovo tentativo messaggio...", + "@retryingMessage": { + "description": "Messaggio informativo quando si riprova un messaggio fallito" + }, + + "retryFailed": "Nuovo tentativo fallito: {error}", + "@retryFailed": { + "description": "Messaggio di errore quando il nuovo tentativo fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "textCopiedToClipboard": "Testo copiato negli appunti", + "@textCopiedToClipboard": { + "description": "Messaggio di successo quando il testo viene copiato" + }, + + "cannotReplySenderMissing": "Impossibile rispondere: informazioni mittente mancanti", + "@cannotReplySenderMissing": { + "description": "Errore quando le informazioni del mittente mancano per la risposta" + }, + + "cannotReplyContactNotFound": "Impossibile rispondere: contatto non trovato", + "@cannotReplyContactNotFound": { + "description": "Errore quando il contatto non viene trovato per la risposta" + }, + + "messageDeleted": "Messaggio eliminato", + "@messageDeleted": { + "description": "Messaggio informativo quando un messaggio viene eliminato" + }, + + "refreshedContacts": "Contatti aggiornati", + "@refreshedContacts": { + "description": "Messaggio di successo quando i contatti vengono aggiornati" + }, + + "justNow": "Proprio ora", + "@justNow": { + "description": "Indicatore tempo per attività molto recente" + }, + + "minutesAgo": "{minutes}m fa", + "@minutesAgo": { + "description": "Indicatore tempo per minuti fa", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + + "hoursAgo": "{hours}h fa", + "@hoursAgo": { + "description": "Indicatore tempo per ore fa", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + + "daysAgo": "{days}g fa", + "@daysAgo": { + "description": "Indicatore tempo per giorni fa", + "placeholders": { + "days": { + "type": "int" + } + } + }, + + "secondsAgo": "{seconds}s fa", + "@secondsAgo": { + "description": "Indicatore tempo per secondi fa", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + + "sending": "Invio...", + "@sending": { + "description": "Stato consegna: invio" + }, + + "sent": "Inviato", + "@sent": { + "description": "Stato consegna: inviato" + }, + + "delivered": "Consegnato", + "@delivered": { + "description": "Stato consegna: consegnato" + }, + + "deliveredWithTime": "Consegnato ({time}ms)", + "@deliveredWithTime": { + "description": "Stato consegna con tempo di andata e ritorno", + "placeholders": { + "time": { + "type": "int" + } + } + }, + + "failed": "Fallito", + "@failed": { + "description": "Stato consegna: fallito" + }, + + "sarMarkerFoundPerson": "Persona Trovata", + "@sarMarkerFoundPerson": { + "description": "Tipo marcatore SAR: persona trovata" + }, + + "sarMarkerFire": "Posizione Incendio", + "@sarMarkerFire": { + "description": "Tipo marcatore SAR: incendio" + }, + + "sarMarkerStagingArea": "Area di Appoggio", + "@sarMarkerStagingArea": { + "description": "Tipo marcatore SAR: area di appoggio" + }, + + "sarMarkerObject": "Oggetto Trovato", + "@sarMarkerObject": { + "description": "Tipo marcatore SAR: oggetto" + }, + + "from": "Da", + "@from": { + "description": "Etichetta mittente nelle notifiche" + }, + + "coordinates": "Coordinate", + "@coordinates": { + "description": "Etichetta coordinate" + }, + + "tapToViewOnMap": "Tocca per visualizzare sulla mappa", + "@tapToViewOnMap": { + "description": "Testo azione notifica" + }, + + "radioSettings": "Impostazioni Radio", + "@radioSettings": { + "description": "Titolo sezione per le impostazioni radio" + }, + + "frequencyMHz": "Frequenza (MHz)", + "@frequencyMHz": { + "description": "Etichetta per il campo frequenza radio" + }, + + "frequencyExample": "es., 869.618", + "@frequencyExample": { + "description": "Testo di aiuto esempio per la frequenza" + }, + + "bandwidth": "Larghezza di Banda", + "@bandwidth": { + "description": "Etichetta per il menu a discesa larghezza di banda" + }, + + "spreadingFactor": "Fattore di Spreading", + "@spreadingFactor": { + "description": "Etichetta per il menu a discesa fattore di spreading" + }, + + "codingRate": "Tasso di Codifica", + "@codingRate": { + "description": "Etichetta per il menu a discesa tasso di codifica" + }, + + "txPowerDbm": "Potenza TX (dBm)", + "@txPowerDbm": { + "description": "Etichetta per il campo potenza TX" + }, + + "maxPowerDbm": "Max: {power} dBm", + "@maxPowerDbm": { + "description": "Testo di aiuto che mostra la potenza TX massima", + "placeholders": { + "power": { "type": "int" } + } + }, + + "you": "Tu", + "@you": { + "description": "Etichetta per l'utente corrente nelle bolle dei messaggi" + }, + + "offlineVectorMaps": "Mappe Vettoriali Offline", + "@offlineVectorMaps": { + "description": "Titolo per la sezione mappe vettoriali offline" + }, + + "offlineVectorMapsDescription": "Importa e gestisci tile di mappe vettoriali offline (formato MBTiles) per l'uso senza connessione internet", + "@offlineVectorMapsDescription": { + "description": "Descrizione per la sezione mappe vettoriali offline" + }, + + "importMbtiles": "Importa File MBTiles", + "@importMbtiles": { + "description": "Pulsante per importare file MBTiles" + }, + + "importMbtilesNote": "Supporta file MBTiles con tile vettoriali (formato PBF/MVT). Gli estratti Geofabrik funzionano benissimo!", + "@importMbtilesNote": { + "description": "Nota sui tipi di file MBTiles supportati" + }, + + "noMbtilesFiles": "Nessuna mappa vettoriale offline trovata", + "@noMbtilesFiles": { + "description": "Messaggio quando non sono disponibili file MBTiles" + }, + + "mbtilesImportedSuccessfully": "File MBTiles importato con successo", + "@mbtilesImportedSuccessfully": { + "description": "Messaggio di successo dopo l'importazione del file MBTiles" + }, + + "failedToImportMbtiles": "Impossibile importare il file MBTiles", + "@failedToImportMbtiles": { + "description": "Messaggio di errore quando l'importazione MBTiles fallisce" + }, + + "deleteMbtilesConfirmTitle": "Elimina Mappa Offline", + "@deleteMbtilesConfirmTitle": { + "description": "Titolo per la finestra di conferma eliminazione MBTiles" + }, + + "deleteMbtilesConfirmMessage": "Sei sicuro di voler eliminare \"{name}\"? Questo rimuoverà permanentemente la mappa offline.", + "@deleteMbtilesConfirmMessage": { + "description": "Messaggio di conferma per l'eliminazione del file MBTiles", + "placeholders": { + "name": { + "type": "String" + } + } + }, + + "mbtilesDeletedSuccessfully": "Mappa offline eliminata con successo", + "@mbtilesDeletedSuccessfully": { + "description": "Messaggio di successo dopo l'eliminazione del file MBTiles" + }, + + "failedToDeleteMbtiles": "Impossibile eliminare la mappa offline", + "@failedToDeleteMbtiles": { + "description": "Messaggio di errore quando l'eliminazione MBTiles fallisce" + }, + + "vectorTiles": "Tile Vettoriali", + "@vectorTiles": { + "description": "Etichetta per il tipo tile vettoriale" + }, + + "schema": "Schema", + "@schema": { + "description": "Etichetta per lo schema tile vettoriale" + }, + + "unknown": "Sconosciuto", + "@unknown": { + "description": "Etichetta valore sconosciuto" + }, + + "bounds": "Limiti", + "@bounds": { + "description": "Etichetta per i limiti geografici" + }, + + "onlineLayers": "Livelli Online", + "@onlineLayers": { + "description": "Intestazione sezione per i livelli mappa online" + }, + + "offlineLayers": "Livelli Offline", + "@offlineLayers": { + "description": "Intestazione sezione per i livelli mappa offline (MBTiles)" + }, + + "locationTrail": "Traccia Posizione", + "@locationTrail": { + "description": "Titolo traccia posizione" + }, + + "showTrailOnMap": "Mostra Traccia sulla Mappa", + "@showTrailOnMap": { + "description": "Interruttore per mostrare/nascondere la traccia sulla mappa" + }, + + "trailVisible": "La traccia è visibile sulla mappa", + "@trailVisible": { + "description": "Stato visibilità traccia - visibile" + }, + + "trailHiddenRecording": "La traccia è nascosta (ancora in registrazione)", + "@trailHiddenRecording": { + "description": "Stato visibilità traccia - nascosta ma in registrazione" + }, + + "distance": "Distanza", + "@distance": { + "description": "Etichetta distanza" + }, + + "duration": "Durata", + "@duration": { + "description": "Etichetta durata" + }, + + "points": "Punti", + "@points": { + "description": "Etichetta conteggio punti traccia" + }, + + "clearTrail": "Cancella Traccia", + "@clearTrail": { + "description": "Pulsante per cancellare la traccia posizione" + }, + + "clearTrailQuestion": "Cancellare Traccia?", + "@clearTrailQuestion": { + "description": "Titolo finestra di conferma" + }, + + "clearTrailConfirmation": "Sei sicuro di voler cancellare la traccia posizione attuale? Questa azione non può essere annullata.", + "@clearTrailConfirmation": { + "description": "Messaggio finestra di conferma" + }, + + "noTrailRecorded": "Nessuna traccia registrata ancora", + "@noTrailRecorded": { + "description": "Messaggio quando non esiste traccia" + }, + + "startTrackingToRecord": "Avvia il tracciamento posizione per registrare la tua traccia", + "@startTrackingToRecord": { + "description": "Istruzioni per avviare la registrazione della traccia" + }, + + "trailControls": "Controlli Traccia", + "@trailControls": { + "description": "Tooltip controlli traccia" + }, + + "deviceInformation": "Informazioni Dispositivo", + "@deviceInformation": { + "description": "Intestazione sezione informazioni dispositivo" + }, + + "bleName": "Nome BLE", + "@bleName": { + "description": "Etichetta nome dispositivo Bluetooth Low Energy" + }, + + "meshName": "Nome Mesh", + "@meshName": { + "description": "Etichetta nome rete mesh" + }, + + "notSet": "Non impostato", + "@notSet": { + "description": "Etichetta quando un valore non è impostato" + }, + + "model": "Modello", + "@model": { + "description": "Etichetta modello dispositivo" + }, + + "version": "Versione", + "@version": { + "description": "Etichetta versione" + }, + + "buildDate": "Data Build", + "@buildDate": { + "description": "Etichetta data build firmware" + }, + + "firmware": "Firmware", + "@firmware": { + "description": "Etichetta firmware" + }, + + "maxContacts": "Contatti Max", + "@maxContacts": { + "description": "Etichetta capacità massima contatti" + }, + + "maxChannels": "Canali Max", + "@maxChannels": { + "description": "Etichetta capacità massima canali" + }, + + "publicInfo": "Informazioni Pubbliche", + "@publicInfo": { + "description": "Intestazione sezione informazioni pubbliche" + }, + + "meshNetworkName": "Nome Rete Mesh", + "@meshNetworkName": { + "description": "Etichetta campo nome rete mesh" + }, + + "nameBroadcastInMesh": "Nome trasmesso negli annunci mesh", + "@nameBroadcastInMesh": { + "description": "Testo di aiuto per il campo nome rete mesh" + }, + + "telemetryAndLocationSharing": "Telemetria e Condivisione Posizione", + "@telemetryAndLocationSharing": { + "description": "Etichetta interruttore telemetria e condivisione posizione" + }, + + "lat": "Lat", + "@lat": { + "description": "Etichetta campo latitudine (forma breve)" + }, + + "lon": "Lon", + "@lon": { + "description": "Etichetta campo longitudine (forma breve)" + }, + + "useCurrentLocation": "Usa posizione attuale", + "@useCurrentLocation": { + "description": "Tooltip per il pulsante usa posizione attuale" + }, + + "noneUnknown": "Nessuno/Sconosciuto", + "@noneUnknown": { + "description": "Tipo dispositivo: nessuno o sconosciuto" + }, + + "chatNode": "Nodo Chat", + "@chatNode": { + "description": "Tipo dispositivo: nodo chat" + }, + + "repeater": "Ripetitore", + "@repeater": { + "description": "Tipo dispositivo: ripetitore" + }, + + "roomChannel": "Stanza/Canale", + "@roomChannel": { + "description": "Tipo dispositivo: stanza o canale" + }, + + "typeNumber": "Tipo {number}", + "@typeNumber": { + "description": "Tipo dispositivo generico con numero", + "placeholders": { + "number": { + "type": "int" + } + } + }, + + "copiedToClipboardShort": "Copiato {label} negli appunti", + "@copiedToClipboardShort": { + "description": "Messaggio di successo breve quando si copia negli appunti", + "placeholders": { + "label": { + "type": "String" + } + } + }, + + "failedToSave": "Impossibile salvare: {error}", + "@failedToSave": { + "description": "Messaggio di errore generico per fallimenti di salvataggio", + "placeholders": { + "error": { + "type": "String" + } + } + }, + + "failedToGetLocation": "Impossibile ottenere la posizione: {error}", + "@failedToGetLocation": { + "description": "Messaggio di errore quando l'ottenimento della posizione fallisce", + "placeholders": { + "error": { + "type": "String" + } + } + } +} diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 0acd34f..079eda3 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -5,8 +5,12 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; +import 'app_localizations_de.dart'; import 'app_localizations_en.dart'; +import 'app_localizations_es.dart'; +import 'app_localizations_fr.dart'; import 'app_localizations_hr.dart'; +import 'app_localizations_it.dart'; import 'app_localizations_sl.dart'; // ignore_for_file: type=lint @@ -95,8 +99,12 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ + Locale('de'), Locale('en'), + Locale('es'), + Locale('fr'), Locale('hr'), + Locale('it'), Locale('sl'), ]; @@ -2024,6 +2032,228 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Offline Layers'** String get offlineLayers; + + /// Location trail title + /// + /// In en, this message translates to: + /// **'Location Trail'** + String get locationTrail; + + /// Toggle to show/hide trail on map + /// + /// In en, this message translates to: + /// **'Show Trail on Map'** + String get showTrailOnMap; + + /// Trail visibility status - visible + /// + /// In en, this message translates to: + /// **'Trail is visible on the map'** + String get trailVisible; + + /// Trail visibility status - hidden but recording + /// + /// In en, this message translates to: + /// **'Trail is hidden (still recording)'** + String get trailHiddenRecording; + + /// Duration label + /// + /// In en, this message translates to: + /// **'Duration'** + String get duration; + + /// Trail points count label + /// + /// In en, this message translates to: + /// **'Points'** + String get points; + + /// Button to clear location trail + /// + /// In en, this message translates to: + /// **'Clear Trail'** + String get clearTrail; + + /// Confirmation dialog title + /// + /// In en, this message translates to: + /// **'Clear Trail?'** + String get clearTrailQuestion; + + /// Confirmation dialog message + /// + /// In en, this message translates to: + /// **'Are you sure you want to clear the current location trail? This action cannot be undone.'** + String get clearTrailConfirmation; + + /// Message when no trail exists + /// + /// In en, this message translates to: + /// **'No trail recorded yet'** + String get noTrailRecorded; + + /// Instructions to start trail recording + /// + /// In en, this message translates to: + /// **'Start location tracking to record your trail'** + String get startTrackingToRecord; + + /// Trail controls tooltip + /// + /// In en, this message translates to: + /// **'Trail Controls'** + String get trailControls; + + /// Device information section header + /// + /// In en, this message translates to: + /// **'Device Information'** + String get deviceInformation; + + /// Bluetooth Low Energy device name label + /// + /// In en, this message translates to: + /// **'BLE Name'** + String get bleName; + + /// Mesh network name label + /// + /// In en, this message translates to: + /// **'Mesh Name'** + String get meshName; + + /// Label when a value is not set + /// + /// In en, this message translates to: + /// **'Not set'** + String get notSet; + + /// Device model label + /// + /// In en, this message translates to: + /// **'Model'** + String get model; + + /// Version label + /// + /// In en, this message translates to: + /// **'Version'** + String get version; + + /// Firmware build date label + /// + /// In en, this message translates to: + /// **'Build Date'** + String get buildDate; + + /// Firmware label + /// + /// In en, this message translates to: + /// **'Firmware'** + String get firmware; + + /// Maximum contacts capacity label + /// + /// In en, this message translates to: + /// **'Max Contacts'** + String get maxContacts; + + /// Maximum channels capacity label + /// + /// In en, this message translates to: + /// **'Max Channels'** + String get maxChannels; + + /// Public information section header + /// + /// In en, this message translates to: + /// **'Public Info'** + String get publicInfo; + + /// Mesh network name field label + /// + /// In en, this message translates to: + /// **'Mesh Network Name'** + String get meshNetworkName; + + /// Helper text for mesh network name field + /// + /// In en, this message translates to: + /// **'Name broadcast in mesh advertisements'** + String get nameBroadcastInMesh; + + /// Telemetry and location sharing toggle label + /// + /// In en, this message translates to: + /// **'Telemetry & Location Sharing'** + String get telemetryAndLocationSharing; + + /// Latitude field label (short form) + /// + /// In en, this message translates to: + /// **'Lat'** + String get lat; + + /// Longitude field label (short form) + /// + /// In en, this message translates to: + /// **'Lon'** + String get lon; + + /// Tooltip for use current location button + /// + /// In en, this message translates to: + /// **'Use current location'** + String get useCurrentLocation; + + /// Device type: none or unknown + /// + /// In en, this message translates to: + /// **'None/Unknown'** + String get noneUnknown; + + /// Device type: chat node + /// + /// In en, this message translates to: + /// **'Chat Node'** + String get chatNode; + + /// Device type: repeater + /// + /// In en, this message translates to: + /// **'Repeater'** + String get repeater; + + /// Device type: room or channel + /// + /// In en, this message translates to: + /// **'Room/Channel'** + String get roomChannel; + + /// Generic device type with number + /// + /// In en, this message translates to: + /// **'Type {number}'** + String typeNumber(int number); + + /// Short success message when copying to clipboard + /// + /// In en, this message translates to: + /// **'Copied {label} to clipboard'** + String copiedToClipboardShort(String label); + + /// Generic error message for save failures + /// + /// In en, this message translates to: + /// **'Failed to save: {error}'** + String failedToSave(String error); + + /// Error message when getting location fails + /// + /// In en, this message translates to: + /// **'Failed to get location: {error}'** + String failedToGetLocation(String error); } class _AppLocalizationsDelegate @@ -2036,8 +2266,15 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'hr', 'sl'].contains(locale.languageCode); + bool isSupported(Locale locale) => [ + 'de', + 'en', + 'es', + 'fr', + 'hr', + 'it', + 'sl', + ].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -2046,10 +2283,18 @@ class _AppLocalizationsDelegate AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { + case 'de': + return AppLocalizationsDe(); case 'en': return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); + case 'fr': + return AppLocalizationsFr(); case 'hr': return AppLocalizationsHr(); + case 'it': + return AppLocalizationsIt(); case 'sl': return AppLocalizationsSl(); } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart new file mode 100644 index 0000000..908eeca --- /dev/null +++ b/lib/l10n/app_localizations_de.dart @@ -0,0 +1,1241 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for German (`de`). +class AppLocalizationsDe extends AppLocalizations { + AppLocalizationsDe([String locale = 'de']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Nachrichten'; + + @override + String get contacts => 'Kontakte'; + + @override + String get map => 'Karte'; + + @override + String get settings => 'Einstellungen'; + + @override + String get connect => 'Verbinden'; + + @override + String get disconnect => 'Trennen'; + + @override + String get scanningForDevices => 'Suche nach Geräten...'; + + @override + String get noDevicesFound => 'Keine Geräte gefunden'; + + @override + String get scanAgain => 'Erneut scannen'; + + @override + String get tapToConnect => 'Zum Verbinden tippen'; + + @override + String get deviceNotConnected => 'Gerät nicht verbunden'; + + @override + String get locationPermissionDenied => 'Standortberechtigung verweigert'; + + @override + String get locationPermissionPermanentlyDenied => + 'Standortberechtigung dauerhaft verweigert. Bitte in den Einstellungen aktivieren.'; + + @override + String get locationPermissionRequired => + 'Die Standortberechtigung ist für GPS-Tracking und Teamkoordination erforderlich. Sie können sie später in den Einstellungen aktivieren.'; + + @override + String get locationServicesDisabled => + 'Standortdienste sind deaktiviert. Bitte aktivieren Sie sie in den Einstellungen.'; + + @override + String get failedToGetGpsLocation => + 'GPS-Position konnte nicht abgerufen werden'; + + @override + String advertisedAtLocation(String latitude, String longitude) { + return 'Position gesendet bei $latitude, $longitude'; + } + + @override + String failedToAdvertise(String error) { + return 'Senden fehlgeschlagen: $error'; + } + + @override + String reconnecting(int attempt, int max) { + return 'Wiederverbindung... ($attempt/$max)'; + } + + @override + String get cancelReconnection => 'Wiederverbindung abbrechen'; + + @override + String get mapManagement => 'Kartenverwaltung'; + + @override + String get general => 'Allgemein'; + + @override + String get theme => 'Design'; + + @override + String get chooseTheme => 'Design auswählen'; + + @override + String get light => 'Hell'; + + @override + String get dark => 'Dunkel'; + + @override + String get blueLightTheme => 'Blaues helles Design'; + + @override + String get blueDarkTheme => 'Blaues dunkles Design'; + + @override + String get sarRed => 'SAR Rot'; + + @override + String get alertEmergencyMode => 'Alarm-/Notfallmodus'; + + @override + String get sarGreen => 'SAR Grün'; + + @override + String get safeAllClearMode => 'Sicher/Entwarnung-Modus'; + + @override + String get autoSystem => 'Automatisch (System)'; + + @override + String get followSystemTheme => 'System-Design folgen'; + + @override + String get showRxTxIndicators => 'RX/TX-Indikatoren anzeigen'; + + @override + String get displayPacketActivity => + 'Paketaktivitätsindikatoren in der oberen Leiste anzeigen'; + + @override + String get language => 'Sprache'; + + @override + String get chooseLanguage => 'Sprache auswählen'; + + @override + String get english => 'Englisch'; + + @override + String get slovenian => 'Slowenisch'; + + @override + String get croatian => 'Kroatisch'; + + @override + String get locationBroadcasting => 'Standortübertragung'; + + @override + String get autoLocationTracking => 'Automatisches Standort-Tracking'; + + @override + String get automaticallyBroadcastPosition => + 'Positionsaktualisierungen automatisch übertragen'; + + @override + String get configureTracking => 'Tracking konfigurieren'; + + @override + String get distanceAndTimeThresholds => 'Entfernungs- und Zeitschwellenwerte'; + + @override + String get locationTrackingConfiguration => 'Standort-Tracking-Konfiguration'; + + @override + String get configureWhenLocationBroadcasts => + 'Konfigurieren Sie, wann Standortübertragungen an das Mesh-Netzwerk gesendet werden'; + + @override + String get minimumDistance => 'Mindestentfernung'; + + @override + String broadcastAfterMoving(String distance) { + return 'Nur nach Bewegung von $distance Metern übertragen'; + } + + @override + String get maximumDistance => 'Maximale Entfernung'; + + @override + String alwaysBroadcastAfterMoving(String distance) { + return 'Immer nach Bewegung von $distance Metern übertragen'; + } + + @override + String get minimumTimeInterval => 'Minimales Zeitintervall'; + + @override + String alwaysBroadcastEvery(String duration) { + return 'Immer alle $duration übertragen'; + } + + @override + String get save => 'Speichern'; + + @override + String get cancel => 'Abbrechen'; + + @override + String get close => 'Schließen'; + + @override + String get about => 'Über'; + + @override + String get appVersion => 'App-Version'; + + @override + String get appName => 'App-Name'; + + @override + String get aboutMeshCoreSar => 'Über MeshCore SAR'; + + @override + String get aboutDescription => + 'Eine Such- und Rettungsanwendung für Notfallteams. Funktionen umfassen:\n\n• BLE-Mesh-Netzwerk für Gerät-zu-Gerät-Kommunikation\n• Offline-Karten mit mehreren Ebenenoptionen\n• Echtzeit-Teammitgliederverfolgung\n• SAR-Taktikmarkierungen (Person gefunden, Feuer, Sammelpunkt)\n• Kontaktverwaltung und Nachrichtenübermittlung\n• GPS-Tracking mit Kompass-Kurs\n• Karten-Tile-Caching für Offline-Nutzung'; + + @override + String get technologiesUsed => 'Verwendete Technologien:'; + + @override + String get technologiesList => + '• Flutter für plattformübergreifende Entwicklung\n• BLE (Bluetooth Low Energy) für Mesh-Netzwerk\n• OpenStreetMap für Kartendarstellung\n• Provider für Zustandsverwaltung\n• SharedPreferences für lokale Speicherung'; + + @override + String get developer => 'Entwickler'; + + @override + String get packageName => 'Paketname'; + + @override + String get sampleData => 'Beispieldaten'; + + @override + String get sampleDataDescription => + 'Laden oder löschen Sie Beispielkontakte, Kanalnachrichten und SAR-Markierungen zum Testen'; + + @override + String get loadSampleData => 'Beispieldaten laden'; + + @override + String get clearAllData => 'Alle Daten löschen'; + + @override + String get clearAllDataConfirmTitle => 'Alle Daten löschen'; + + @override + String get clearAllDataConfirmMessage => + 'Dadurch werden alle Kontakte und SAR-Markierungen gelöscht. Sind Sie sicher?'; + + @override + String get clear => 'Löschen'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return '$teamCount Teammitglieder, $channelCount Kanäle, $sarCount SAR-Markierungen, $messageCount Nachrichten geladen'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Fehler beim Laden der Beispieldaten: $error'; + } + + @override + String get allDataCleared => 'Alle Daten gelöscht'; + + @override + String get failedToStartBackgroundTracking => + 'Hintergrund-Tracking konnte nicht gestartet werden. Überprüfen Sie Berechtigungen und BLE-Verbindung.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Standortübertragung: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'Die Standard-PIN für Geräte ohne Bildschirm ist 123456. Probleme beim Koppeln? Vergessen Sie das Bluetooth-Gerät in den Systemeinstellungen.'; + + @override + String get noMessagesYet => 'Noch keine Nachrichten'; + + @override + String get pullDownToSync => + 'Nach unten ziehen, um Nachrichten zu synchronisieren'; + + @override + String get deleteContact => 'Kontakt löschen'; + + @override + String get delete => 'Löschen'; + + @override + String get viewOnMap => 'Auf Karte anzeigen'; + + @override + String get refresh => 'Aktualisieren'; + + @override + String get sendDirectMessage => 'Direktnachricht senden'; + + @override + String get resetPath => 'Pfad zurücksetzen (Umleitung)'; + + @override + String get publicKeyCopied => + 'Öffentlicher Schlüssel in die Zwischenablage kopiert'; + + @override + String copiedToClipboard(String label) { + return '$label in die Zwischenablage kopiert'; + } + + @override + String get pleaseEnterPassword => 'Bitte geben Sie ein Passwort ein'; + + @override + String failedToSyncContacts(String error) { + return 'Kontaktsynchronisation fehlgeschlagen: $error'; + } + + @override + String get loggedInSuccessfully => + 'Erfolgreich angemeldet! Warte auf Raumnachrichten...'; + + @override + String get loginFailed => 'Anmeldung fehlgeschlagen - falsches Passwort'; + + @override + String loggingIn(String roomName) { + return 'Anmeldung bei $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Anmeldung senden fehlgeschlagen: $error'; + } + + @override + String get lowLocationAccuracy => 'Niedrige Standortgenauigkeit'; + + @override + String get continue_ => 'Fortfahren'; + + @override + String get sendSarMarker => 'SAR-Markierung senden'; + + @override + String get deleteDrawing => 'Zeichnung löschen'; + + @override + String get drawLine => 'Linie zeichnen'; + + @override + String get drawLineDesc => 'Freihandlinie auf der Karte zeichnen'; + + @override + String get drawRectangle => 'Rechteck zeichnen'; + + @override + String get drawRectangleDesc => 'Rechteckigen Bereich auf der Karte zeichnen'; + + @override + String get shareDrawings => 'Zeichnungen teilen'; + + @override + String get clearAllDrawings => 'Alle Zeichnungen löschen'; + + @override + String get clearAll => 'Alle löschen'; + + @override + String get noLocalDrawings => 'Keine lokalen Zeichnungen zum Teilen'; + + @override + String get publicChannel => 'Öffentlicher Kanal'; + + @override + String get broadcastToAll => 'An alle Knoten in der Nähe senden (temporär)'; + + @override + String get storedPermanently => 'Dauerhaft im Raum gespeichert'; + + @override + String get notConnectedToDevice => 'Nicht mit Gerät verbunden'; + + @override + String get directMessage => 'Direktnachricht'; + + @override + String directMessageSentTo(String contactName) { + return 'Direktnachricht an $contactName gesendet'; + } + + @override + String failedToSend(String error) { + return 'Senden fehlgeschlagen: $error'; + } + + @override + String directMessageInfo(String contactName) { + return 'Diese Nachricht wird direkt an $contactName gesendet. Sie erscheint auch im Hauptnachrichten-Feed.'; + } + + @override + String get typeYourMessage => 'Geben Sie Ihre Nachricht ein...'; + + @override + String get quickLocationMarker => 'Schnelle Standortmarkierung'; + + @override + String get markerType => 'Markierungstyp'; + + @override + String get sendTo => 'Senden an'; + + @override + String get noDestinationsAvailable => 'Keine Ziele verfügbar.'; + + @override + String get selectDestination => 'Ziel auswählen...'; + + @override + String get ephemeralBroadcastInfo => + 'Temporär: Nur Over-the-Air-Übertragung. Nicht gespeichert - Knoten müssen online sein.'; + + @override + String get persistentRoomInfo => + 'Dauerhaft: Unveränderlich im Raum gespeichert. Automatisch synchronisiert und offline gespeichert.'; + + @override + String get location => 'Standort'; + + @override + String get fromMap => 'Von Karte'; + + @override + String get gettingLocation => 'Standort wird abgerufen...'; + + @override + String get locationError => 'Standortfehler'; + + @override + String get retry => 'Wiederholen'; + + @override + String get refreshLocation => 'Standort aktualisieren'; + + @override + String accuracyMeters(int accuracy) { + return 'Genauigkeit: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notizen (optional)'; + + @override + String get addAdditionalInformation => + 'Zusätzliche Informationen hinzufügen...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'Standortgenauigkeit beträgt ±${accuracy}m. Dies ist möglicherweise nicht genau genug für SAR-Operationen.\n\nTrotzdem fortfahren?'; + } + + @override + String get loginToRoom => 'Bei Raum anmelden'; + + @override + String get enterPasswordInfo => + 'Geben Sie das Passwort ein, um auf diesen Raum zuzugreifen. Das Passwort wird für die zukünftige Verwendung gespeichert.'; + + @override + String get password => 'Passwort'; + + @override + String get enterRoomPassword => 'Raumpasswort eingeben'; + + @override + String get loggingInDots => 'Anmeldung läuft...'; + + @override + String get login => 'Anmelden'; + + @override + String failedToAddRoom(String error) { + return 'Fehler beim Hinzufügen des Raums zum Gerät: $error\n\nDer Raum hat möglicherweise noch nicht gesendet.\nVersuchen Sie zu warten, bis der Raum sendet.'; + } + + @override + String get direct => 'Direkt'; + + @override + String get flood => 'Flut'; + + @override + String get admin => 'Admin'; + + @override + String get loggedIn => 'Angemeldet'; + + @override + String get noGpsData => 'Keine GPS-Daten'; + + @override + String get distance => 'Entfernung'; + + @override + String pingingDirect(String name) { + return 'Pinge $name (direkt über Pfad)...'; + } + + @override + String pingingFlood(String name) { + return 'Pinge $name (Flutung - kein Pfad)...'; + } + + @override + String directPingTimeout(String name) { + return 'Direkter Ping-Timeout - wiederhole $name mit Flutung...'; + } + + @override + String pingSuccessful(String name, String fallback) { + return 'Ping erfolgreich an $name$fallback'; + } + + @override + String get viaFloodingFallback => ' (über Flutungs-Fallback)'; + + @override + String pingFailed(String name) { + return 'Ping fehlgeschlagen an $name - keine Antwort erhalten'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Sind Sie sicher, dass Sie \"$name\" löschen möchten?\n\nDies entfernt den Kontakt sowohl aus der App als auch vom Begleitfunkgerät.'; + } + + @override + String removingContact(String name) { + return 'Entferne $name...'; + } + + @override + String contactRemoved(String name) { + return 'Kontakt \"$name\" entfernt'; + } + + @override + String failedToRemoveContact(String error) { + return 'Fehler beim Entfernen des Kontakts: $error'; + } + + @override + String get type => 'Typ'; + + @override + String get publicKey => 'Öffentlicher Schlüssel'; + + @override + String get lastSeen => 'Zuletzt gesehen'; + + @override + String get roomStatus => 'Raumstatus'; + + @override + String get loginStatus => 'Anmeldestatus'; + + @override + String get notLoggedIn => 'Nicht angemeldet'; + + @override + String get adminAccess => 'Admin-Zugriff'; + + @override + String get yes => 'Ja'; + + @override + String get no => 'Nein'; + + @override + String get permissions => 'Berechtigungen'; + + @override + String get passwordSaved => 'Passwort gespeichert'; + + @override + String get locationColon => 'Standort:'; + + @override + String get telemetry => 'Telemetrie'; + + @override + String requestingTelemetry(String name) { + return 'Fordere Telemetrie von $name an...'; + } + + @override + String get voltage => 'Spannung'; + + @override + String get battery => 'Batterie'; + + @override + String get temperature => 'Temperatur'; + + @override + String get humidity => 'Luftfeuchtigkeit'; + + @override + String get pressure => 'Druck'; + + @override + String get gpsTelemetry => 'GPS (Telemetrie)'; + + @override + String get updated => 'Aktualisiert'; + + @override + String pathResetInfo(String name) { + return 'Pfad zurückgesetzt für $name. Nächste Nachricht findet eine neue Route.'; + } + + @override + String get reLoginToRoom => 'Erneut bei Raum anmelden'; + + @override + String get heading => 'Kurs'; + + @override + String get elevation => 'Höhe'; + + @override + String get accuracy => 'Genauigkeit'; + + @override + String get filterMarkers => 'Markierungen filtern'; + + @override + String get filterMarkersTooltip => 'Markierungen filtern'; + + @override + String get contactsFilter => 'Kontakte'; + + @override + String get repeatersFilter => 'Repeater'; + + @override + String get sarMarkers => 'SAR-Markierungen'; + + @override + String get foundPerson => 'Person gefunden'; + + @override + String get fire => 'Feuer'; + + @override + String get stagingArea => 'Sammelpunkt'; + + @override + String get showAll => 'Alle anzeigen'; + + @override + String get nearbyContacts => 'Kontakte in der Nähe'; + + @override + String get locationUnavailable => 'Standort nicht verfügbar'; + + @override + String get ahead => 'voraus'; + + @override + String degreesRight(int degrees) { + return '$degrees° rechts'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° links'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Noch keine Kontakte'; + + @override + String get connectToDeviceToLoadContacts => + 'Mit einem Gerät verbinden, um Kontakte zu laden'; + + @override + String get teamMembers => 'Teammitglieder'; + + @override + String get repeaters => 'Repeater'; + + @override + String get rooms => 'Räume'; + + @override + String get channels => 'Kanäle'; + + @override + String get cacheStatistics => 'Cache-Statistiken'; + + @override + String get totalTiles => 'Gesamte Tiles'; + + @override + String get cacheSize => 'Cache-Größe'; + + @override + String get storeName => 'Speichername'; + + @override + String get noCacheStatistics => 'Keine Cache-Statistiken verfügbar'; + + @override + String get downloadRegion => 'Region herunterladen'; + + @override + String get mapLayer => 'Kartenebene'; + + @override + String get regionBounds => 'Regionsgrenzen'; + + @override + String get north => 'Nord'; + + @override + String get south => 'Süd'; + + @override + String get east => 'Ost'; + + @override + String get west => 'West'; + + @override + String get zoomLevels => 'Zoom-Stufen'; + + @override + String minZoom(int zoom) { + return 'Min: $zoom'; + } + + @override + String maxZoom(int zoom) { + return 'Max: $zoom'; + } + + @override + String get downloadingDots => 'Lädt herunter...'; + + @override + String get cancelDownload => 'Download abbrechen'; + + @override + String get downloadRegionButton => 'Region herunterladen'; + + @override + String get downloadNote => + 'Hinweis: Große Regionen oder hohe Zoom-Stufen können erhebliche Zeit und Speicherplatz benötigen.'; + + @override + String get cacheManagement => 'Cache-Verwaltung'; + + @override + String get clearAllMaps => 'Alle Karten löschen'; + + @override + String get clearMapsConfirmTitle => 'Alle Karten löschen'; + + @override + String get clearMapsConfirmMessage => + 'Sind Sie sicher, dass Sie alle heruntergeladenen Karten löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.'; + + @override + String get mapDownloadCompleted => 'Karten-Download abgeschlossen!'; + + @override + String get cacheClearedSuccessfully => 'Cache erfolgreich gelöscht!'; + + @override + String get downloadCancelled => 'Download abgebrochen'; + + @override + String get startingDownload => 'Starte Download...'; + + @override + String get downloadingMapTiles => 'Lade Karten-Tiles herunter...'; + + @override + String get downloadCompletedSuccessfully => + 'Download erfolgreich abgeschlossen!'; + + @override + String get cancellingDownload => 'Breche Download ab...'; + + @override + String errorLoadingStats(String error) { + return 'Fehler beim Laden der Statistiken: $error'; + } + + @override + String downloadFailed(String error) { + return 'Download fehlgeschlagen: $error'; + } + + @override + String cancelFailed(String error) { + return 'Abbruch fehlgeschlagen: $error'; + } + + @override + String clearCacheFailed(String error) { + return 'Löschen des Caches fehlgeschlagen: $error'; + } + + @override + String minZoomError(String error) { + return 'Min-Zoom: $error'; + } + + @override + String maxZoomError(String error) { + return 'Max-Zoom: $error'; + } + + @override + String get minZoomGreaterThanMax => + 'Minimaler Zoom muss kleiner oder gleich dem maximalen Zoom sein'; + + @override + String get selectMapLayer => 'Kartenebene auswählen'; + + @override + String get mapOptions => 'Kartenoptionen'; + + @override + String get showLegend => 'Legende anzeigen'; + + @override + String get displayMarkerTypeCounts => 'Markierungstypen-Anzahl anzeigen'; + + @override + String get rotateMapWithHeading => 'Karte mit Kurs drehen'; + + @override + String get mapFollowsDirection => + 'Karte folgt Ihrer Richtung während der Bewegung'; + + @override + String get showMapDebugInfo => 'Karten-Debug-Info anzeigen'; + + @override + String get displayZoomLevelBounds => 'Zoom-Stufe und Grenzen anzeigen'; + + @override + String get fullscreenMode => 'Vollbildmodus'; + + @override + String get hideUiFullMapView => + 'Alle UI-Steuerelemente für volle Kartenansicht ausblenden'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'ESRI-Satellit'; + + @override + String get downloadVisibleArea => 'Sichtbaren Bereich herunterladen'; + + @override + String get initializingMap => 'Initialisiere Karte...'; + + @override + String get dragToPosition => 'Zur Position ziehen'; + + @override + String get createSarMarker => 'SAR-Markierung erstellen'; + + @override + String get compass => 'Kompass'; + + @override + String get navigationAndContacts => 'Navigation & Kontakte'; + + @override + String get sarAlert => 'SAR-ALARM'; + + @override + String get messageSentToPublicChannel => + 'Nachricht an öffentlichen Kanal gesendet'; + + @override + String get pleaseSelectRoomToSendSar => + 'Bitte wählen Sie einen Raum zum Senden der SAR-Markierung'; + + @override + String failedToSendSarMarker(String error) { + return 'Fehler beim Senden der SAR-Markierung: $error'; + } + + @override + String sarMarkerSentTo(String roomName) { + return 'SAR-Markierung an $roomName gesendet'; + } + + @override + String get notConnectedCannotSync => + 'Nicht verbunden - Nachrichten können nicht synchronisiert werden'; + + @override + String syncedMessageCount(int count) { + return '$count Nachricht(en) synchronisiert'; + } + + @override + String get noNewMessages => 'Keine neuen Nachrichten'; + + @override + String syncFailed(String error) { + return 'Synchronisation fehlgeschlagen: $error'; + } + + @override + String get failedToResendMessage => + 'Fehler beim erneuten Senden der Nachricht'; + + @override + String get retryingMessage => 'Wiederhole Nachricht...'; + + @override + String retryFailed(String error) { + return 'Wiederholen fehlgeschlagen: $error'; + } + + @override + String get textCopiedToClipboard => 'Text in Zwischenablage kopiert'; + + @override + String get cannotReplySenderMissing => + 'Antwort nicht möglich: Absenderinformationen fehlen'; + + @override + String get cannotReplyContactNotFound => + 'Antwort nicht möglich: Kontakt nicht gefunden'; + + @override + String get messageDeleted => 'Nachricht gelöscht'; + + @override + String get refreshedContacts => 'Kontakte aktualisiert'; + + @override + String get justNow => 'Gerade eben'; + + @override + String minutesAgo(int minutes) { + return 'vor ${minutes}m'; + } + + @override + String hoursAgo(int hours) { + return 'vor ${hours}h'; + } + + @override + String daysAgo(int days) { + return 'vor ${days}d'; + } + + @override + String secondsAgo(int seconds) { + return 'vor ${seconds}s'; + } + + @override + String get sending => 'Wird gesendet...'; + + @override + String get sent => 'Gesendet'; + + @override + String get delivered => 'Zugestellt'; + + @override + String deliveredWithTime(int time) { + return 'Zugestellt (${time}ms)'; + } + + @override + String get failed => 'Fehlgeschlagen'; + + @override + String get sarMarkerFoundPerson => 'Person gefunden'; + + @override + String get sarMarkerFire => 'Feuerstandort'; + + @override + String get sarMarkerStagingArea => 'Sammelpunkt'; + + @override + String get sarMarkerObject => 'Objekt gefunden'; + + @override + String get from => 'Von'; + + @override + String get coordinates => 'Koordinaten'; + + @override + String get tapToViewOnMap => 'Tippen, um auf der Karte anzuzeigen'; + + @override + String get radioSettings => 'Funkeinstellungen'; + + @override + String get frequencyMHz => 'Frequenz (MHz)'; + + @override + String get frequencyExample => 'z.B. 869.618'; + + @override + String get bandwidth => 'Bandbreite'; + + @override + String get spreadingFactor => 'Spreading-Faktor'; + + @override + String get codingRate => 'Codierungsrate'; + + @override + String get txPowerDbm => 'TX-Leistung (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Max: $power dBm'; + } + + @override + String get you => 'Du'; + + @override + String get offlineVectorMaps => 'Offline-Vektorkarten'; + + @override + String get offlineVectorMapsDescription => + 'Importieren und verwalten Sie Offline-Vektorkarten-Tiles (MBTiles-Format) zur Verwendung ohne Internetverbindung'; + + @override + String get importMbtiles => 'MBTiles-Datei importieren'; + + @override + String get importMbtilesNote => + 'Unterstützt MBTiles-Dateien mit Vektor-Tiles (PBF/MVT-Format). Geofabrik-Auszüge funktionieren hervorragend!'; + + @override + String get noMbtilesFiles => 'Keine Offline-Vektorkarten gefunden'; + + @override + String get mbtilesImportedSuccessfully => + 'MBTiles-Datei erfolgreich importiert'; + + @override + String get failedToImportMbtiles => + 'Fehler beim Importieren der MBTiles-Datei'; + + @override + String get deleteMbtilesConfirmTitle => 'Offline-Karte löschen'; + + @override + String deleteMbtilesConfirmMessage(String name) { + return 'Sind Sie sicher, dass Sie \"$name\" löschen möchten? Dies entfernt die Offline-Karte dauerhaft.'; + } + + @override + String get mbtilesDeletedSuccessfully => 'Offline-Karte erfolgreich gelöscht'; + + @override + String get failedToDeleteMbtiles => 'Fehler beim Löschen der Offline-Karte'; + + @override + String get vectorTiles => 'Vektor-Tiles'; + + @override + String get schema => 'Schema'; + + @override + String get unknown => 'Unbekannt'; + + @override + String get bounds => 'Grenzen'; + + @override + String get onlineLayers => 'Online-Ebenen'; + + @override + String get offlineLayers => 'Offline-Ebenen'; + + @override + String get locationTrail => 'Standortverlauf'; + + @override + String get showTrailOnMap => 'Verlauf auf Karte anzeigen'; + + @override + String get trailVisible => 'Verlauf ist auf der Karte sichtbar'; + + @override + String get trailHiddenRecording => + 'Verlauf ist ausgeblendet (Aufzeichnung läuft noch)'; + + @override + String get duration => 'Dauer'; + + @override + String get points => 'Punkte'; + + @override + String get clearTrail => 'Verlauf löschen'; + + @override + String get clearTrailQuestion => 'Verlauf löschen?'; + + @override + String get clearTrailConfirmation => + 'Sind Sie sicher, dass Sie den aktuellen Standortverlauf löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.'; + + @override + String get noTrailRecorded => 'Noch kein Verlauf aufgezeichnet'; + + @override + String get startTrackingToRecord => + 'Standort-Tracking starten, um Ihren Verlauf aufzuzeichnen'; + + @override + String get trailControls => 'Verlaufssteuerung'; + + @override + String get deviceInformation => 'Geräteinformationen'; + + @override + String get bleName => 'BLE-Name'; + + @override + String get meshName => 'Mesh-Name'; + + @override + String get notSet => 'Nicht festgelegt'; + + @override + String get model => 'Modell'; + + @override + String get version => 'Version'; + + @override + String get buildDate => 'Build-Datum'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Max. Kontakte'; + + @override + String get maxChannels => 'Max. Kanäle'; + + @override + String get publicInfo => 'Öffentliche Informationen'; + + @override + String get meshNetworkName => 'Mesh-Netzwerkname'; + + @override + String get nameBroadcastInMesh => + 'Name, der in Mesh-Sendungen übertragen wird'; + + @override + String get telemetryAndLocationSharing => 'Telemetrie & Standortfreigabe'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Aktuellen Standort verwenden'; + + @override + String get noneUnknown => 'Keine/Unbekannt'; + + @override + String get chatNode => 'Chat-Knoten'; + + @override + String get repeater => 'Repeater'; + + @override + String get roomChannel => 'Raum/Kanal'; + + @override + String typeNumber(int number) { + return 'Typ $number'; + } + + @override + String copiedToClipboardShort(String label) { + return '$label in Zwischenablage kopiert'; + } + + @override + String failedToSave(String error) { + return 'Fehler beim Speichern: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Fehler beim Abrufen des Standorts: $error'; + } +} diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 8d757b5..3613d4e 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1104,4 +1104,125 @@ class AppLocalizationsEn extends AppLocalizations { @override String get offlineLayers => 'Offline Layers'; + + @override + String get locationTrail => 'Location Trail'; + + @override + String get showTrailOnMap => 'Show Trail on Map'; + + @override + String get trailVisible => 'Trail is visible on the map'; + + @override + String get trailHiddenRecording => 'Trail is hidden (still recording)'; + + @override + String get duration => 'Duration'; + + @override + String get points => 'Points'; + + @override + String get clearTrail => 'Clear Trail'; + + @override + String get clearTrailQuestion => 'Clear Trail?'; + + @override + String get clearTrailConfirmation => + 'Are you sure you want to clear the current location trail? This action cannot be undone.'; + + @override + String get noTrailRecorded => 'No trail recorded yet'; + + @override + String get startTrackingToRecord => + 'Start location tracking to record your trail'; + + @override + String get trailControls => 'Trail Controls'; + + @override + String get deviceInformation => 'Device Information'; + + @override + String get bleName => 'BLE Name'; + + @override + String get meshName => 'Mesh Name'; + + @override + String get notSet => 'Not set'; + + @override + String get model => 'Model'; + + @override + String get version => 'Version'; + + @override + String get buildDate => 'Build Date'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Max Contacts'; + + @override + String get maxChannels => 'Max Channels'; + + @override + String get publicInfo => 'Public Info'; + + @override + String get meshNetworkName => 'Mesh Network Name'; + + @override + String get nameBroadcastInMesh => 'Name broadcast in mesh advertisements'; + + @override + String get telemetryAndLocationSharing => 'Telemetry & Location Sharing'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Use current location'; + + @override + String get noneUnknown => 'None/Unknown'; + + @override + String get chatNode => 'Chat Node'; + + @override + String get repeater => 'Repeater'; + + @override + String get roomChannel => 'Room/Channel'; + + @override + String typeNumber(int number) { + return 'Type $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Copied $label to clipboard'; + } + + @override + String failedToSave(String error) { + return 'Failed to save: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Failed to get location: $error'; + } } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart new file mode 100644 index 0000000..bbe3871 --- /dev/null +++ b/lib/l10n/app_localizations_es.dart @@ -0,0 +1,1236 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppLocalizationsEs extends AppLocalizations { + AppLocalizationsEs([String locale = 'es']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Mensajes'; + + @override + String get contacts => 'Contactos'; + + @override + String get map => 'Mapa'; + + @override + String get settings => 'Configuración'; + + @override + String get connect => 'Conectar'; + + @override + String get disconnect => 'Desconectar'; + + @override + String get scanningForDevices => 'Buscando dispositivos...'; + + @override + String get noDevicesFound => 'No se encontraron dispositivos'; + + @override + String get scanAgain => 'Buscar de nuevo'; + + @override + String get tapToConnect => 'Toca para conectar'; + + @override + String get deviceNotConnected => 'Dispositivo no conectado'; + + @override + String get locationPermissionDenied => 'Permiso de ubicación denegado'; + + @override + String get locationPermissionPermanentlyDenied => + 'Permiso de ubicación denegado permanentemente. Por favor, actívalo en Configuración.'; + + @override + String get locationPermissionRequired => + 'El permiso de ubicación es necesario para el seguimiento GPS y la coordinación del equipo. Puedes activarlo más tarde en Configuración.'; + + @override + String get locationServicesDisabled => + 'Los servicios de ubicación están desactivados. Por favor, actívalos en Configuración.'; + + @override + String get failedToGetGpsLocation => 'Error al obtener la ubicación GPS'; + + @override + String advertisedAtLocation(String latitude, String longitude) { + return 'Anunciado en $latitude, $longitude'; + } + + @override + String failedToAdvertise(String error) { + return 'Error al anunciar: $error'; + } + + @override + String reconnecting(int attempt, int max) { + return 'Reconectando... ($attempt/$max)'; + } + + @override + String get cancelReconnection => 'Cancelar reconexión'; + + @override + String get mapManagement => 'Gestión de mapas'; + + @override + String get general => 'General'; + + @override + String get theme => 'Tema'; + + @override + String get chooseTheme => 'Elegir tema'; + + @override + String get light => 'Claro'; + + @override + String get dark => 'Oscuro'; + + @override + String get blueLightTheme => 'Tema azul claro'; + + @override + String get blueDarkTheme => 'Tema azul oscuro'; + + @override + String get sarRed => 'SAR Rojo'; + + @override + String get alertEmergencyMode => 'Modo de alerta/emergencia'; + + @override + String get sarGreen => 'SAR Verde'; + + @override + String get safeAllClearMode => 'Modo seguro/todo despejado'; + + @override + String get autoSystem => 'Auto (Sistema)'; + + @override + String get followSystemTheme => 'Seguir el tema del sistema'; + + @override + String get showRxTxIndicators => 'Mostrar indicadores RX/TX'; + + @override + String get displayPacketActivity => + 'Mostrar indicadores de actividad de paquetes en la barra superior'; + + @override + String get language => 'Idioma'; + + @override + String get chooseLanguage => 'Elegir idioma'; + + @override + String get english => 'Inglés'; + + @override + String get slovenian => 'Esloveno'; + + @override + String get croatian => 'Croata'; + + @override + String get locationBroadcasting => 'Difusión de ubicación'; + + @override + String get autoLocationTracking => 'Seguimiento automático de ubicación'; + + @override + String get automaticallyBroadcastPosition => + 'Difundir automáticamente actualizaciones de posición'; + + @override + String get configureTracking => 'Configurar seguimiento'; + + @override + String get distanceAndTimeThresholds => 'Umbrales de distancia y tiempo'; + + @override + String get locationTrackingConfiguration => + 'Configuración de seguimiento de ubicación'; + + @override + String get configureWhenLocationBroadcasts => + 'Configurar cuándo se envían difusiones de ubicación a la red mesh'; + + @override + String get minimumDistance => 'Distancia mínima'; + + @override + String broadcastAfterMoving(String distance) { + return 'Difundir solo después de moverse $distance metros'; + } + + @override + String get maximumDistance => 'Distancia máxima'; + + @override + String alwaysBroadcastAfterMoving(String distance) { + return 'Siempre difundir después de moverse $distance metros'; + } + + @override + String get minimumTimeInterval => 'Intervalo de tiempo mínimo'; + + @override + String alwaysBroadcastEvery(String duration) { + return 'Siempre difundir cada $duration'; + } + + @override + String get save => 'Guardar'; + + @override + String get cancel => 'Cancelar'; + + @override + String get close => 'Cerrar'; + + @override + String get about => 'Acerca de'; + + @override + String get appVersion => 'Versión de la aplicación'; + + @override + String get appName => 'Nombre de la aplicación'; + + @override + String get aboutMeshCoreSar => 'Acerca de MeshCore SAR'; + + @override + String get aboutDescription => + 'Una aplicación de Búsqueda y Rescate diseñada para equipos de respuesta a emergencias. Las características incluyen:\n\n• Red mesh BLE para comunicación entre dispositivos\n• Mapas sin conexión con múltiples opciones de capas\n• Seguimiento en tiempo real de miembros del equipo\n• Marcadores tácticos SAR (persona encontrada, fuego, zona de preparación)\n• Gestión de contactos y mensajería\n• Seguimiento GPS con rumbo de brújula\n• Caché de teselas de mapa para uso sin conexión'; + + @override + String get technologiesUsed => 'Tecnologías utilizadas:'; + + @override + String get technologiesList => + '• Flutter para desarrollo multiplataforma\n• BLE (Bluetooth Low Energy) para redes mesh\n• OpenStreetMap para mapas\n• Provider para gestión de estado\n• SharedPreferences para almacenamiento local'; + + @override + String get developer => 'Desarrollador'; + + @override + String get packageName => 'Nombre del paquete'; + + @override + String get sampleData => 'Datos de muestra'; + + @override + String get sampleDataDescription => + 'Cargar o borrar contactos de muestra, mensajes de canal y marcadores SAR para pruebas'; + + @override + String get loadSampleData => 'Cargar datos de muestra'; + + @override + String get clearAllData => 'Borrar todos los datos'; + + @override + String get clearAllDataConfirmTitle => 'Borrar todos los datos'; + + @override + String get clearAllDataConfirmMessage => + 'Esto borrará todos los contactos y marcadores SAR. ¿Estás seguro?'; + + @override + String get clear => 'Borrar'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Cargados $teamCount miembros del equipo, $channelCount canales, $sarCount marcadores SAR, $messageCount mensajes'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Error al cargar datos de muestra: $error'; + } + + @override + String get allDataCleared => 'Todos los datos borrados'; + + @override + String get failedToStartBackgroundTracking => + 'Error al iniciar el seguimiento en segundo plano. Verifica los permisos y la conexión BLE.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Difusión de ubicación: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'El PIN predeterminado para dispositivos sin pantalla es 123456. ¿Problemas para emparejar? Olvida el dispositivo bluetooth en la configuración del sistema.'; + + @override + String get noMessagesYet => 'Aún no hay mensajes'; + + @override + String get pullDownToSync => 'Desliza hacia abajo para sincronizar mensajes'; + + @override + String get deleteContact => 'Eliminar contacto'; + + @override + String get delete => 'Eliminar'; + + @override + String get viewOnMap => 'Ver en el mapa'; + + @override + String get refresh => 'Actualizar'; + + @override + String get sendDirectMessage => 'Enviar mensaje directo'; + + @override + String get resetPath => 'Restablecer ruta (Re-enrutar)'; + + @override + String get publicKeyCopied => 'Clave pública copiada al portapapeles'; + + @override + String copiedToClipboard(String label) { + return '$label copiado al portapapeles'; + } + + @override + String get pleaseEnterPassword => 'Por favor, introduce una contraseña'; + + @override + String failedToSyncContacts(String error) { + return 'Error al sincronizar contactos: $error'; + } + + @override + String get loggedInSuccessfully => + '¡Inicio de sesión exitoso! Esperando mensajes de la sala...'; + + @override + String get loginFailed => 'Error de inicio de sesión - contraseña incorrecta'; + + @override + String loggingIn(String roomName) { + return 'Iniciando sesión en $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Error al enviar inicio de sesión: $error'; + } + + @override + String get lowLocationAccuracy => 'Baja precisión de ubicación'; + + @override + String get continue_ => 'Continuar'; + + @override + String get sendSarMarker => 'Enviar marcador SAR'; + + @override + String get deleteDrawing => 'Eliminar dibujo'; + + @override + String get drawLine => 'Dibujar línea'; + + @override + String get drawLineDesc => 'Dibujar una línea a mano alzada en el mapa'; + + @override + String get drawRectangle => 'Dibujar rectángulo'; + + @override + String get drawRectangleDesc => 'Dibujar un área rectangular en el mapa'; + + @override + String get shareDrawings => 'Compartir dibujos'; + + @override + String get clearAllDrawings => 'Borrar todos los dibujos'; + + @override + String get clearAll => 'Borrar todo'; + + @override + String get noLocalDrawings => 'No hay dibujos locales para compartir'; + + @override + String get publicChannel => 'Canal público'; + + @override + String get broadcastToAll => 'Difundir a todos los nodos cercanos (efímero)'; + + @override + String get storedPermanently => 'Almacenado permanentemente en la sala'; + + @override + String get notConnectedToDevice => 'No conectado al dispositivo'; + + @override + String get directMessage => 'Mensaje directo'; + + @override + String directMessageSentTo(String contactName) { + return 'Mensaje directo enviado a $contactName'; + } + + @override + String failedToSend(String error) { + return 'Error al enviar: $error'; + } + + @override + String directMessageInfo(String contactName) { + return 'Este mensaje se enviará directamente a $contactName. También aparecerá en el feed de mensajes principal.'; + } + + @override + String get typeYourMessage => 'Escribe tu mensaje...'; + + @override + String get quickLocationMarker => 'Marcador de ubicación rápida'; + + @override + String get markerType => 'Tipo de marcador'; + + @override + String get sendTo => 'Enviar a'; + + @override + String get noDestinationsAvailable => 'No hay destinos disponibles.'; + + @override + String get selectDestination => 'Seleccionar destino...'; + + @override + String get ephemeralBroadcastInfo => + 'Efímero: Solo difusión por el aire. No se almacena - los nodos deben estar en línea.'; + + @override + String get persistentRoomInfo => + 'Persistente: Almacenado de manera inmutable en la sala. Se sincroniza automáticamente y se conserva sin conexión.'; + + @override + String get location => 'Ubicación'; + + @override + String get fromMap => 'Desde el mapa'; + + @override + String get gettingLocation => 'Obteniendo ubicación...'; + + @override + String get locationError => 'Error de ubicación'; + + @override + String get retry => 'Reintentar'; + + @override + String get refreshLocation => 'Actualizar ubicación'; + + @override + String accuracyMeters(int accuracy) { + return 'Precisión: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notas (opcional)'; + + @override + String get addAdditionalInformation => 'Agregar información adicional...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'La precisión de la ubicación es ±${accuracy}m. Esto puede no ser lo suficientemente preciso para operaciones SAR.\n\n¿Continuar de todos modos?'; + } + + @override + String get loginToRoom => 'Iniciar sesión en la sala'; + + @override + String get enterPasswordInfo => + 'Introduce la contraseña para acceder a esta sala. La contraseña se guardará para uso futuro.'; + + @override + String get password => 'Contraseña'; + + @override + String get enterRoomPassword => 'Introduce la contraseña de la sala'; + + @override + String get loggingInDots => 'Iniciando sesión...'; + + @override + String get login => 'Iniciar sesión'; + + @override + String failedToAddRoom(String error) { + return 'Error al agregar la sala al dispositivo: $error\n\nLa sala puede no haber anunciado aún.\nIntenta esperar a que la sala transmita.'; + } + + @override + String get direct => 'Directo'; + + @override + String get flood => 'Inundación'; + + @override + String get admin => 'Admin'; + + @override + String get loggedIn => 'Sesión iniciada'; + + @override + String get noGpsData => 'Sin datos GPS'; + + @override + String get distance => 'Distancia'; + + @override + String pingingDirect(String name) { + return 'Haciendo ping a $name (directo vía ruta)...'; + } + + @override + String pingingFlood(String name) { + return 'Haciendo ping a $name (inundación - sin ruta)...'; + } + + @override + String directPingTimeout(String name) { + return 'Tiempo de espera de ping directo agotado - reintentando $name con inundación...'; + } + + @override + String pingSuccessful(String name, String fallback) { + return 'Ping exitoso a $name$fallback'; + } + + @override + String get viaFloodingFallback => ' (vía respaldo de inundación)'; + + @override + String pingFailed(String name) { + return 'Ping fallido a $name - no se recibió respuesta'; + } + + @override + String deleteContactConfirmation(String name) { + return '¿Estás seguro de que quieres eliminar \"$name\"?\n\nEsto eliminará el contacto tanto de la aplicación como del dispositivo de radio compañero.'; + } + + @override + String removingContact(String name) { + return 'Eliminando $name...'; + } + + @override + String contactRemoved(String name) { + return 'Contacto \"$name\" eliminado'; + } + + @override + String failedToRemoveContact(String error) { + return 'Error al eliminar contacto: $error'; + } + + @override + String get type => 'Tipo'; + + @override + String get publicKey => 'Clave pública'; + + @override + String get lastSeen => 'Visto por última vez'; + + @override + String get roomStatus => 'Estado de la sala'; + + @override + String get loginStatus => 'Estado de inicio de sesión'; + + @override + String get notLoggedIn => 'No ha iniciado sesión'; + + @override + String get adminAccess => 'Acceso de administrador'; + + @override + String get yes => 'Sí'; + + @override + String get no => 'No'; + + @override + String get permissions => 'Permisos'; + + @override + String get passwordSaved => 'Contraseña guardada'; + + @override + String get locationColon => 'Ubicación:'; + + @override + String get telemetry => 'Telemetría'; + + @override + String requestingTelemetry(String name) { + return 'Solicitando telemetría de $name...'; + } + + @override + String get voltage => 'Voltaje'; + + @override + String get battery => 'Batería'; + + @override + String get temperature => 'Temperatura'; + + @override + String get humidity => 'Humedad'; + + @override + String get pressure => 'Presión'; + + @override + String get gpsTelemetry => 'GPS (Telemetría)'; + + @override + String get updated => 'Actualizado'; + + @override + String pathResetInfo(String name) { + return 'Ruta restablecida para $name. El próximo mensaje encontrará una nueva ruta.'; + } + + @override + String get reLoginToRoom => 'Re-iniciar sesión en la sala'; + + @override + String get heading => 'Rumbo'; + + @override + String get elevation => 'Elevación'; + + @override + String get accuracy => 'Precisión'; + + @override + String get filterMarkers => 'Filtrar marcadores'; + + @override + String get filterMarkersTooltip => 'Filtrar marcadores'; + + @override + String get contactsFilter => 'Contactos'; + + @override + String get repeatersFilter => 'Repetidores'; + + @override + String get sarMarkers => 'Marcadores SAR'; + + @override + String get foundPerson => 'Persona encontrada'; + + @override + String get fire => 'Fuego'; + + @override + String get stagingArea => 'Área de preparación'; + + @override + String get showAll => 'Mostrar todo'; + + @override + String get nearbyContacts => 'Contactos cercanos'; + + @override + String get locationUnavailable => 'Ubicación no disponible'; + + @override + String get ahead => 'adelante'; + + @override + String degreesRight(int degrees) { + return '$degrees° derecha'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° izquierda'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Aún no hay contactos'; + + @override + String get connectToDeviceToLoadContacts => + 'Conéctate a un dispositivo para cargar contactos'; + + @override + String get teamMembers => 'Miembros del equipo'; + + @override + String get repeaters => 'Repetidores'; + + @override + String get rooms => 'Salas'; + + @override + String get channels => 'Canales'; + + @override + String get cacheStatistics => 'Estadísticas de caché'; + + @override + String get totalTiles => 'Total de teselas'; + + @override + String get cacheSize => 'Tamaño de caché'; + + @override + String get storeName => 'Nombre del almacén'; + + @override + String get noCacheStatistics => 'No hay estadísticas de caché disponibles'; + + @override + String get downloadRegion => 'Descargar región'; + + @override + String get mapLayer => 'Capa de mapa'; + + @override + String get regionBounds => 'Límites de región'; + + @override + String get north => 'Norte'; + + @override + String get south => 'Sur'; + + @override + String get east => 'Este'; + + @override + String get west => 'Oeste'; + + @override + String get zoomLevels => 'Niveles de zoom'; + + @override + String minZoom(int zoom) { + return 'Mín: $zoom'; + } + + @override + String maxZoom(int zoom) { + return 'Máx: $zoom'; + } + + @override + String get downloadingDots => 'Descargando...'; + + @override + String get cancelDownload => 'Cancelar descarga'; + + @override + String get downloadRegionButton => 'Descargar región'; + + @override + String get downloadNote => + 'Nota: Las regiones grandes o niveles de zoom altos pueden tomar un tiempo y espacio de almacenamiento significativos.'; + + @override + String get cacheManagement => 'Gestión de caché'; + + @override + String get clearAllMaps => 'Borrar todos los mapas'; + + @override + String get clearMapsConfirmTitle => 'Borrar todos los mapas'; + + @override + String get clearMapsConfirmMessage => + '¿Estás seguro de que quieres eliminar todos los mapas descargados? Esta acción no se puede deshacer.'; + + @override + String get mapDownloadCompleted => '¡Descarga de mapa completada!'; + + @override + String get cacheClearedSuccessfully => '¡Caché borrada exitosamente!'; + + @override + String get downloadCancelled => 'Descarga cancelada'; + + @override + String get startingDownload => 'Iniciando descarga...'; + + @override + String get downloadingMapTiles => 'Descargando teselas de mapa...'; + + @override + String get downloadCompletedSuccessfully => + '¡Descarga completada exitosamente!'; + + @override + String get cancellingDownload => 'Cancelando descarga...'; + + @override + String errorLoadingStats(String error) { + return 'Error al cargar estadísticas: $error'; + } + + @override + String downloadFailed(String error) { + return 'Error en la descarga: $error'; + } + + @override + String cancelFailed(String error) { + return 'Error al cancelar: $error'; + } + + @override + String clearCacheFailed(String error) { + return 'Error al borrar caché: $error'; + } + + @override + String minZoomError(String error) { + return 'Zoom mín: $error'; + } + + @override + String maxZoomError(String error) { + return 'Zoom máx: $error'; + } + + @override + String get minZoomGreaterThanMax => + 'El zoom mínimo debe ser menor o igual al zoom máximo'; + + @override + String get selectMapLayer => 'Seleccionar capa de mapa'; + + @override + String get mapOptions => 'Opciones de mapa'; + + @override + String get showLegend => 'Mostrar leyenda'; + + @override + String get displayMarkerTypeCounts => + 'Mostrar recuentos de tipos de marcadores'; + + @override + String get rotateMapWithHeading => 'Rotar mapa con rumbo'; + + @override + String get mapFollowsDirection => + 'El mapa sigue tu dirección cuando te mueves'; + + @override + String get showMapDebugInfo => 'Mostrar información de depuración del mapa'; + + @override + String get displayZoomLevelBounds => 'Mostrar nivel de zoom y límites'; + + @override + String get fullscreenMode => 'Modo de pantalla completa'; + + @override + String get hideUiFullMapView => + 'Ocultar todos los controles de IU para vista de mapa completo'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'ESRI Satélite'; + + @override + String get downloadVisibleArea => 'Descargar área visible'; + + @override + String get initializingMap => 'Inicializando mapa...'; + + @override + String get dragToPosition => 'Arrastrar a posición'; + + @override + String get createSarMarker => 'Crear marcador SAR'; + + @override + String get compass => 'Brújula'; + + @override + String get navigationAndContacts => 'Navegación y contactos'; + + @override + String get sarAlert => 'ALERTA SAR'; + + @override + String get messageSentToPublicChannel => 'Mensaje enviado al canal público'; + + @override + String get pleaseSelectRoomToSendSar => + 'Por favor, selecciona una sala para enviar marcador SAR'; + + @override + String failedToSendSarMarker(String error) { + return 'Error al enviar marcador SAR: $error'; + } + + @override + String sarMarkerSentTo(String roomName) { + return 'Marcador SAR enviado a $roomName'; + } + + @override + String get notConnectedCannotSync => + 'No conectado - no se pueden sincronizar mensajes'; + + @override + String syncedMessageCount(int count) { + return 'Sincronizados $count mensaje(s)'; + } + + @override + String get noNewMessages => 'No hay mensajes nuevos'; + + @override + String syncFailed(String error) { + return 'Error de sincronización: $error'; + } + + @override + String get failedToResendMessage => 'Error al reenviar mensaje'; + + @override + String get retryingMessage => 'Reintentando mensaje...'; + + @override + String retryFailed(String error) { + return 'Error de reintento: $error'; + } + + @override + String get textCopiedToClipboard => 'Texto copiado al portapapeles'; + + @override + String get cannotReplySenderMissing => + 'No se puede responder: falta información del remitente'; + + @override + String get cannotReplyContactNotFound => + 'No se puede responder: contacto no encontrado'; + + @override + String get messageDeleted => 'Mensaje eliminado'; + + @override + String get refreshedContacts => 'Contactos actualizados'; + + @override + String get justNow => 'Justo ahora'; + + @override + String minutesAgo(int minutes) { + return 'Hace ${minutes}m'; + } + + @override + String hoursAgo(int hours) { + return 'Hace ${hours}h'; + } + + @override + String daysAgo(int days) { + return 'Hace ${days}d'; + } + + @override + String secondsAgo(int seconds) { + return 'Hace ${seconds}s'; + } + + @override + String get sending => 'Enviando...'; + + @override + String get sent => 'Enviado'; + + @override + String get delivered => 'Entregado'; + + @override + String deliveredWithTime(int time) { + return 'Entregado (${time}ms)'; + } + + @override + String get failed => 'Fallido'; + + @override + String get sarMarkerFoundPerson => 'Persona encontrada'; + + @override + String get sarMarkerFire => 'Ubicación de fuego'; + + @override + String get sarMarkerStagingArea => 'Área de preparación'; + + @override + String get sarMarkerObject => 'Objeto encontrado'; + + @override + String get from => 'De'; + + @override + String get coordinates => 'Coordenadas'; + + @override + String get tapToViewOnMap => 'Toca para ver en el mapa'; + + @override + String get radioSettings => 'Configuración de radio'; + + @override + String get frequencyMHz => 'Frecuencia (MHz)'; + + @override + String get frequencyExample => 'ej., 869.618'; + + @override + String get bandwidth => 'Ancho de banda'; + + @override + String get spreadingFactor => 'Factor de dispersión'; + + @override + String get codingRate => 'Tasa de codificación'; + + @override + String get txPowerDbm => 'Potencia TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Máx: $power dBm'; + } + + @override + String get you => 'Tú'; + + @override + String get offlineVectorMaps => 'Mapas vectoriales sin conexión'; + + @override + String get offlineVectorMapsDescription => + 'Importar y gestionar teselas de mapas vectoriales sin conexión (formato MBTiles) para usar sin conexión a internet'; + + @override + String get importMbtiles => 'Importar archivo MBTiles'; + + @override + String get importMbtilesNote => + 'Compatible con archivos MBTiles con teselas vectoriales (formato PBF/MVT). ¡Los extractos de Geofabrik funcionan muy bien!'; + + @override + String get noMbtilesFiles => + 'No se encontraron mapas vectoriales sin conexión'; + + @override + String get mbtilesImportedSuccessfully => + 'Archivo MBTiles importado exitosamente'; + + @override + String get failedToImportMbtiles => 'Error al importar archivo MBTiles'; + + @override + String get deleteMbtilesConfirmTitle => 'Eliminar mapa sin conexión'; + + @override + String deleteMbtilesConfirmMessage(String name) { + return '¿Estás seguro de que quieres eliminar \"$name\"? Esto eliminará permanentemente el mapa sin conexión.'; + } + + @override + String get mbtilesDeletedSuccessfully => + 'Mapa sin conexión eliminado exitosamente'; + + @override + String get failedToDeleteMbtiles => 'Error al eliminar mapa sin conexión'; + + @override + String get vectorTiles => 'Teselas vectoriales'; + + @override + String get schema => 'Esquema'; + + @override + String get unknown => 'Desconocido'; + + @override + String get bounds => 'Límites'; + + @override + String get onlineLayers => 'Capas en línea'; + + @override + String get offlineLayers => 'Capas sin conexión'; + + @override + String get locationTrail => 'Rastro de ubicación'; + + @override + String get showTrailOnMap => 'Mostrar rastro en el mapa'; + + @override + String get trailVisible => 'El rastro es visible en el mapa'; + + @override + String get trailHiddenRecording => 'El rastro está oculto (aún grabando)'; + + @override + String get duration => 'Duración'; + + @override + String get points => 'Puntos'; + + @override + String get clearTrail => 'Borrar rastro'; + + @override + String get clearTrailQuestion => '¿Borrar rastro?'; + + @override + String get clearTrailConfirmation => + '¿Estás seguro de que quieres borrar el rastro de ubicación actual? Esta acción no se puede deshacer.'; + + @override + String get noTrailRecorded => 'Aún no se ha grabado rastro'; + + @override + String get startTrackingToRecord => + 'Inicia el seguimiento de ubicación para grabar tu rastro'; + + @override + String get trailControls => 'Controles del rastro'; + + @override + String get deviceInformation => 'Información del dispositivo'; + + @override + String get bleName => 'Nombre BLE'; + + @override + String get meshName => 'Nombre Mesh'; + + @override + String get notSet => 'No establecido'; + + @override + String get model => 'Modelo'; + + @override + String get version => 'Versión'; + + @override + String get buildDate => 'Fecha de compilación'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Contactos máximos'; + + @override + String get maxChannels => 'Canales máximos'; + + @override + String get publicInfo => 'Información pública'; + + @override + String get meshNetworkName => 'Nombre de red Mesh'; + + @override + String get nameBroadcastInMesh => 'Nombre difundido en anuncios mesh'; + + @override + String get telemetryAndLocationSharing => 'Telemetría y compartir ubicación'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Usar ubicación actual'; + + @override + String get noneUnknown => 'Ninguno/Desconocido'; + + @override + String get chatNode => 'Nodo de chat'; + + @override + String get repeater => 'Repetidor'; + + @override + String get roomChannel => 'Sala/Canal'; + + @override + String typeNumber(int number) { + return 'Tipo $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Copiado $label al portapapeles'; + } + + @override + String failedToSave(String error) { + return 'Error al guardar: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Error al obtener ubicación: $error'; + } +} diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart new file mode 100644 index 0000000..e56d4ef --- /dev/null +++ b/lib/l10n/app_localizations_fr.dart @@ -0,0 +1,1243 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class AppLocalizationsFr extends AppLocalizations { + AppLocalizationsFr([String locale = 'fr']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Messages'; + + @override + String get contacts => 'Contacts'; + + @override + String get map => 'Carte'; + + @override + String get settings => 'Paramètres'; + + @override + String get connect => 'Connecter'; + + @override + String get disconnect => 'Déconnecter'; + + @override + String get scanningForDevices => 'Recherche d\'appareils...'; + + @override + String get noDevicesFound => 'Aucun appareil trouvé'; + + @override + String get scanAgain => 'Rechercher à nouveau'; + + @override + String get tapToConnect => 'Appuyez pour connecter'; + + @override + String get deviceNotConnected => 'Appareil non connecté'; + + @override + String get locationPermissionDenied => 'Permission de localisation refusée'; + + @override + String get locationPermissionPermanentlyDenied => + 'Permission de localisation définitivement refusée. Veuillez l\'activer dans les Paramètres.'; + + @override + String get locationPermissionRequired => + 'La permission de localisation est requise pour le suivi GPS et la coordination d\'équipe. Vous pouvez l\'activer plus tard dans les Paramètres.'; + + @override + String get locationServicesDisabled => + 'Les services de localisation sont désactivés. Veuillez les activer dans les Paramètres.'; + + @override + String get failedToGetGpsLocation => + 'Échec de l\'obtention de la position GPS'; + + @override + String advertisedAtLocation(String latitude, String longitude) { + return 'Annoncé à $latitude, $longitude'; + } + + @override + String failedToAdvertise(String error) { + return 'Échec de l\'annonce : $error'; + } + + @override + String reconnecting(int attempt, int max) { + return 'Reconnexion... ($attempt/$max)'; + } + + @override + String get cancelReconnection => 'Annuler la reconnexion'; + + @override + String get mapManagement => 'Gestion des cartes'; + + @override + String get general => 'Général'; + + @override + String get theme => 'Thème'; + + @override + String get chooseTheme => 'Choisir le thème'; + + @override + String get light => 'Clair'; + + @override + String get dark => 'Sombre'; + + @override + String get blueLightTheme => 'Thème bleu clair'; + + @override + String get blueDarkTheme => 'Thème bleu sombre'; + + @override + String get sarRed => 'SAR Rouge'; + + @override + String get alertEmergencyMode => 'Mode alerte/urgence'; + + @override + String get sarGreen => 'SAR Vert'; + + @override + String get safeAllClearMode => 'Mode sécurisé/dégagé'; + + @override + String get autoSystem => 'Auto (Système)'; + + @override + String get followSystemTheme => 'Suivre le thème du système'; + + @override + String get showRxTxIndicators => 'Afficher les indicateurs RX/TX'; + + @override + String get displayPacketActivity => + 'Afficher les indicateurs d\'activité des paquets dans la barre supérieure'; + + @override + String get language => 'Langue'; + + @override + String get chooseLanguage => 'Choisir la langue'; + + @override + String get english => 'Anglais'; + + @override + String get slovenian => 'Slovène'; + + @override + String get croatian => 'Croate'; + + @override + String get locationBroadcasting => 'Diffusion de position'; + + @override + String get autoLocationTracking => 'Suivi automatique de position'; + + @override + String get automaticallyBroadcastPosition => + 'Diffuser automatiquement les mises à jour de position'; + + @override + String get configureTracking => 'Configurer le suivi'; + + @override + String get distanceAndTimeThresholds => 'Seuils de distance et de temps'; + + @override + String get locationTrackingConfiguration => + 'Configuration du suivi de position'; + + @override + String get configureWhenLocationBroadcasts => + 'Configurer quand les diffusions de position sont envoyées au réseau maillé'; + + @override + String get minimumDistance => 'Distance minimale'; + + @override + String broadcastAfterMoving(String distance) { + return 'Diffuser uniquement après un déplacement de $distance mètres'; + } + + @override + String get maximumDistance => 'Distance maximale'; + + @override + String alwaysBroadcastAfterMoving(String distance) { + return 'Toujours diffuser après un déplacement de $distance mètres'; + } + + @override + String get minimumTimeInterval => 'Intervalle de temps minimal'; + + @override + String alwaysBroadcastEvery(String duration) { + return 'Toujours diffuser toutes les $duration'; + } + + @override + String get save => 'Enregistrer'; + + @override + String get cancel => 'Annuler'; + + @override + String get close => 'Fermer'; + + @override + String get about => 'À propos'; + + @override + String get appVersion => 'Version de l\'application'; + + @override + String get appName => 'Nom de l\'application'; + + @override + String get aboutMeshCoreSar => 'À propos de MeshCore SAR'; + + @override + String get aboutDescription => + 'Une application de recherche et sauvetage conçue pour les équipes d\'intervention d\'urgence. Les fonctionnalités incluent :\n\n• Réseau maillé BLE pour communication appareil à appareil\n• Cartes hors ligne avec options de couches multiples\n• Suivi en temps réel des membres de l\'équipe\n• Marqueurs tactiques SAR (personne trouvée, feu, zone de rassemblement)\n• Gestion des contacts et messagerie\n• Suivi GPS avec cap du compas\n• Mise en cache des tuiles de carte pour utilisation hors ligne'; + + @override + String get technologiesUsed => 'Technologies utilisées :'; + + @override + String get technologiesList => + '• Flutter pour le développement multiplateforme\n• BLE (Bluetooth Low Energy) pour réseau maillé\n• OpenStreetMap pour la cartographie\n• Provider pour la gestion d\'état\n• SharedPreferences pour le stockage local'; + + @override + String get developer => 'Développeur'; + + @override + String get packageName => 'Nom du package'; + + @override + String get sampleData => 'Données d\'exemple'; + + @override + String get sampleDataDescription => + 'Charger ou effacer les contacts d\'exemple, les messages de canal et les marqueurs SAR pour les tests'; + + @override + String get loadSampleData => 'Charger des données d\'exemple'; + + @override + String get clearAllData => 'Effacer toutes les données'; + + @override + String get clearAllDataConfirmTitle => 'Effacer toutes les données'; + + @override + String get clearAllDataConfirmMessage => + 'Cela effacera tous les contacts et marqueurs SAR. Êtes-vous sûr ?'; + + @override + String get clear => 'Effacer'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Chargé $teamCount membres d\'équipe, $channelCount canaux, $sarCount marqueurs SAR, $messageCount messages'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Échec du chargement des données d\'exemple : $error'; + } + + @override + String get allDataCleared => 'Toutes les données effacées'; + + @override + String get failedToStartBackgroundTracking => + 'Échec du démarrage du suivi en arrière-plan. Vérifiez les permissions et la connexion BLE.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Diffusion de position : $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'Le code PIN par défaut pour les appareils sans écran est 123456. Problèmes d\'appairage ? Oubliez l\'appareil Bluetooth dans les paramètres système.'; + + @override + String get noMessagesYet => 'Aucun message pour le moment'; + + @override + String get pullDownToSync => + 'Tirez vers le bas pour synchroniser les messages'; + + @override + String get deleteContact => 'Supprimer le contact'; + + @override + String get delete => 'Supprimer'; + + @override + String get viewOnMap => 'Voir sur la carte'; + + @override + String get refresh => 'Actualiser'; + + @override + String get sendDirectMessage => 'Envoyer un message direct'; + + @override + String get resetPath => 'Réinitialiser le chemin (Re-router)'; + + @override + String get publicKeyCopied => 'Clé publique copiée dans le presse-papiers'; + + @override + String copiedToClipboard(String label) { + return '$label copié dans le presse-papiers'; + } + + @override + String get pleaseEnterPassword => 'Veuillez saisir un mot de passe'; + + @override + String failedToSyncContacts(String error) { + return 'Échec de la synchronisation des contacts : $error'; + } + + @override + String get loggedInSuccessfully => + 'Connexion réussie ! En attente des messages du salon...'; + + @override + String get loginFailed => 'Échec de la connexion - mot de passe incorrect'; + + @override + String loggingIn(String roomName) { + return 'Connexion à $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Échec de l\'envoi de la connexion : $error'; + } + + @override + String get lowLocationAccuracy => 'Précision de localisation faible'; + + @override + String get continue_ => 'Continuer'; + + @override + String get sendSarMarker => 'Envoyer un marqueur SAR'; + + @override + String get deleteDrawing => 'Supprimer le dessin'; + + @override + String get drawLine => 'Tracer une ligne'; + + @override + String get drawLineDesc => 'Tracer une ligne à main levée sur la carte'; + + @override + String get drawRectangle => 'Tracer un rectangle'; + + @override + String get drawRectangleDesc => 'Tracer une zone rectangulaire sur la carte'; + + @override + String get shareDrawings => 'Partager les dessins'; + + @override + String get clearAllDrawings => 'Effacer tous les dessins'; + + @override + String get clearAll => 'Tout effacer'; + + @override + String get noLocalDrawings => 'Aucun dessin local à partager'; + + @override + String get publicChannel => 'Canal public'; + + @override + String get broadcastToAll => + 'Diffuser à tous les nœuds à proximité (éphémère)'; + + @override + String get storedPermanently => 'Stocké de manière permanente dans le salon'; + + @override + String get notConnectedToDevice => 'Non connecté à l\'appareil'; + + @override + String get directMessage => 'Message direct'; + + @override + String directMessageSentTo(String contactName) { + return 'Message direct envoyé à $contactName'; + } + + @override + String failedToSend(String error) { + return 'Échec de l\'envoi : $error'; + } + + @override + String directMessageInfo(String contactName) { + return 'Ce message sera envoyé directement à $contactName. Il apparaîtra également dans le fil de messages principal.'; + } + + @override + String get typeYourMessage => 'Saisissez votre message...'; + + @override + String get quickLocationMarker => 'Marqueur de position rapide'; + + @override + String get markerType => 'Type de marqueur'; + + @override + String get sendTo => 'Envoyer à'; + + @override + String get noDestinationsAvailable => 'Aucune destination disponible.'; + + @override + String get selectDestination => 'Sélectionner la destination...'; + + @override + String get ephemeralBroadcastInfo => + 'Éphémère : Diffusion par ondes uniquement. Non stocké - les nœuds doivent être en ligne.'; + + @override + String get persistentRoomInfo => + 'Persistant : Stocké de manière immuable dans le salon. Synchronisé automatiquement et préservé hors ligne.'; + + @override + String get location => 'Position'; + + @override + String get fromMap => 'Depuis la carte'; + + @override + String get gettingLocation => 'Obtention de la position...'; + + @override + String get locationError => 'Erreur de localisation'; + + @override + String get retry => 'Réessayer'; + + @override + String get refreshLocation => 'Actualiser la position'; + + @override + String accuracyMeters(int accuracy) { + return 'Précision : ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notes (facultatives)'; + + @override + String get addAdditionalInformation => + 'Ajouter des informations supplémentaires...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'La précision de localisation est de ±${accuracy}m. Cela peut ne pas être assez précis pour les opérations SAR.\n\nContinuer quand même ?'; + } + + @override + String get loginToRoom => 'Se connecter au salon'; + + @override + String get enterPasswordInfo => + 'Entrez le mot de passe pour accéder à ce salon. Le mot de passe sera enregistré pour une utilisation future.'; + + @override + String get password => 'Mot de passe'; + + @override + String get enterRoomPassword => 'Entrez le mot de passe du salon'; + + @override + String get loggingInDots => 'Connexion...'; + + @override + String get login => 'Se connecter'; + + @override + String failedToAddRoom(String error) { + return 'Échec de l\'ajout du salon à l\'appareil : $error\n\nLe salon n\'a peut-être pas encore été annoncé.\nEssayez d\'attendre que le salon diffuse.'; + } + + @override + String get direct => 'Direct'; + + @override + String get flood => 'Inondation'; + + @override + String get admin => 'Admin'; + + @override + String get loggedIn => 'Connecté'; + + @override + String get noGpsData => 'Aucune donnée GPS'; + + @override + String get distance => 'Distance'; + + @override + String pingingDirect(String name) { + return 'Ping de $name (direct via chemin)...'; + } + + @override + String pingingFlood(String name) { + return 'Ping de $name (inondation - pas de chemin)...'; + } + + @override + String directPingTimeout(String name) { + return 'Délai d\'attente du ping direct - nouvelle tentative de $name avec inondation...'; + } + + @override + String pingSuccessful(String name, String fallback) { + return 'Ping réussi vers $name$fallback'; + } + + @override + String get viaFloodingFallback => ' (via repli par inondation)'; + + @override + String pingFailed(String name) { + return 'Échec du ping vers $name - aucune réponse reçue'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Êtes-vous sûr de vouloir supprimer \"$name\" ?\n\nCela supprimera le contact de l\'application et de l\'appareil radio compagnon.'; + } + + @override + String removingContact(String name) { + return 'Suppression de $name...'; + } + + @override + String contactRemoved(String name) { + return 'Contact \"$name\" supprimé'; + } + + @override + String failedToRemoveContact(String error) { + return 'Échec de la suppression du contact : $error'; + } + + @override + String get type => 'Type'; + + @override + String get publicKey => 'Clé publique'; + + @override + String get lastSeen => 'Dernière vue'; + + @override + String get roomStatus => 'État du salon'; + + @override + String get loginStatus => 'État de connexion'; + + @override + String get notLoggedIn => 'Non connecté'; + + @override + String get adminAccess => 'Accès administrateur'; + + @override + String get yes => 'Oui'; + + @override + String get no => 'Non'; + + @override + String get permissions => 'Permissions'; + + @override + String get passwordSaved => 'Mot de passe enregistré'; + + @override + String get locationColon => 'Position :'; + + @override + String get telemetry => 'Télémétrie'; + + @override + String requestingTelemetry(String name) { + return 'Demande de télémétrie à $name...'; + } + + @override + String get voltage => 'Tension'; + + @override + String get battery => 'Batterie'; + + @override + String get temperature => 'Température'; + + @override + String get humidity => 'Humidité'; + + @override + String get pressure => 'Pression'; + + @override + String get gpsTelemetry => 'GPS (Télémétrie)'; + + @override + String get updated => 'Mis à jour'; + + @override + String pathResetInfo(String name) { + return 'Chemin réinitialisé pour $name. Le prochain message trouvera un nouvel itinéraire.'; + } + + @override + String get reLoginToRoom => 'Se reconnecter au salon'; + + @override + String get heading => 'Cap'; + + @override + String get elevation => 'Élévation'; + + @override + String get accuracy => 'Précision'; + + @override + String get filterMarkers => 'Filtrer les marqueurs'; + + @override + String get filterMarkersTooltip => 'Filtrer les marqueurs'; + + @override + String get contactsFilter => 'Contacts'; + + @override + String get repeatersFilter => 'Répéteurs'; + + @override + String get sarMarkers => 'Marqueurs SAR'; + + @override + String get foundPerson => 'Personne trouvée'; + + @override + String get fire => 'Feu'; + + @override + String get stagingArea => 'Zone de rassemblement'; + + @override + String get showAll => 'Tout afficher'; + + @override + String get nearbyContacts => 'Contacts à proximité'; + + @override + String get locationUnavailable => 'Position non disponible'; + + @override + String get ahead => 'devant'; + + @override + String degreesRight(int degrees) { + return '$degrees° à droite'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° à gauche'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat : $latitude Lon : $longitude'; + } + + @override + String get noContactsYet => 'Aucun contact pour le moment'; + + @override + String get connectToDeviceToLoadContacts => + 'Connectez-vous à un appareil pour charger les contacts'; + + @override + String get teamMembers => 'Membres de l\'équipe'; + + @override + String get repeaters => 'Répéteurs'; + + @override + String get rooms => 'Salons'; + + @override + String get channels => 'Canaux'; + + @override + String get cacheStatistics => 'Statistiques du cache'; + + @override + String get totalTiles => 'Total de tuiles'; + + @override + String get cacheSize => 'Taille du cache'; + + @override + String get storeName => 'Nom du magasin'; + + @override + String get noCacheStatistics => 'Aucune statistique de cache disponible'; + + @override + String get downloadRegion => 'Télécharger une région'; + + @override + String get mapLayer => 'Couche de carte'; + + @override + String get regionBounds => 'Limites de la région'; + + @override + String get north => 'Nord'; + + @override + String get south => 'Sud'; + + @override + String get east => 'Est'; + + @override + String get west => 'Ouest'; + + @override + String get zoomLevels => 'Niveaux de zoom'; + + @override + String minZoom(int zoom) { + return 'Min : $zoom'; + } + + @override + String maxZoom(int zoom) { + return 'Max : $zoom'; + } + + @override + String get downloadingDots => 'Téléchargement...'; + + @override + String get cancelDownload => 'Annuler le téléchargement'; + + @override + String get downloadRegionButton => 'Télécharger la région'; + + @override + String get downloadNote => + 'Remarque : Les grandes régions ou les niveaux de zoom élevés peuvent nécessiter beaucoup de temps et d\'espace de stockage.'; + + @override + String get cacheManagement => 'Gestion du cache'; + + @override + String get clearAllMaps => 'Effacer toutes les cartes'; + + @override + String get clearMapsConfirmTitle => 'Effacer toutes les cartes'; + + @override + String get clearMapsConfirmMessage => + 'Êtes-vous sûr de vouloir supprimer toutes les cartes téléchargées ? Cette action ne peut pas être annulée.'; + + @override + String get mapDownloadCompleted => 'Téléchargement de la carte terminé !'; + + @override + String get cacheClearedSuccessfully => 'Cache effacé avec succès !'; + + @override + String get downloadCancelled => 'Téléchargement annulé'; + + @override + String get startingDownload => 'Démarrage du téléchargement...'; + + @override + String get downloadingMapTiles => 'Téléchargement des tuiles de carte...'; + + @override + String get downloadCompletedSuccessfully => + 'Téléchargement terminé avec succès !'; + + @override + String get cancellingDownload => 'Annulation du téléchargement...'; + + @override + String errorLoadingStats(String error) { + return 'Erreur de chargement des statistiques : $error'; + } + + @override + String downloadFailed(String error) { + return 'Échec du téléchargement : $error'; + } + + @override + String cancelFailed(String error) { + return 'Échec de l\'annulation : $error'; + } + + @override + String clearCacheFailed(String error) { + return 'Échec de l\'effacement du cache : $error'; + } + + @override + String minZoomError(String error) { + return 'Zoom min : $error'; + } + + @override + String maxZoomError(String error) { + return 'Zoom max : $error'; + } + + @override + String get minZoomGreaterThanMax => + 'Le zoom minimal doit être inférieur ou égal au zoom maximal'; + + @override + String get selectMapLayer => 'Sélectionner la couche de carte'; + + @override + String get mapOptions => 'Options de carte'; + + @override + String get showLegend => 'Afficher la légende'; + + @override + String get displayMarkerTypeCounts => + 'Afficher les décomptes des types de marqueurs'; + + @override + String get rotateMapWithHeading => 'Faire pivoter la carte avec le cap'; + + @override + String get mapFollowsDirection => + 'La carte suit votre direction lorsque vous vous déplacez'; + + @override + String get showMapDebugInfo => 'Afficher les infos de débogage de la carte'; + + @override + String get displayZoomLevelBounds => + 'Afficher le niveau de zoom et les limites'; + + @override + String get fullscreenMode => 'Mode plein écran'; + + @override + String get hideUiFullMapView => + 'Masquer tous les contrôles d\'interface pour une vue de carte complète'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'Satellite ESRI'; + + @override + String get downloadVisibleArea => 'Télécharger la zone visible'; + + @override + String get initializingMap => 'Initialisation de la carte...'; + + @override + String get dragToPosition => 'Faire glisser vers la position'; + + @override + String get createSarMarker => 'Créer un marqueur SAR'; + + @override + String get compass => 'Boussole'; + + @override + String get navigationAndContacts => 'Navigation et contacts'; + + @override + String get sarAlert => 'ALERTE SAR'; + + @override + String get messageSentToPublicChannel => 'Message envoyé au canal public'; + + @override + String get pleaseSelectRoomToSendSar => + 'Veuillez sélectionner un salon pour envoyer le marqueur SAR'; + + @override + String failedToSendSarMarker(String error) { + return 'Échec de l\'envoi du marqueur SAR : $error'; + } + + @override + String sarMarkerSentTo(String roomName) { + return 'Marqueur SAR envoyé à $roomName'; + } + + @override + String get notConnectedCannotSync => + 'Non connecté - impossible de synchroniser les messages'; + + @override + String syncedMessageCount(int count) { + return 'Synchronisé $count message(s)'; + } + + @override + String get noNewMessages => 'Aucun nouveau message'; + + @override + String syncFailed(String error) { + return 'Échec de la synchronisation : $error'; + } + + @override + String get failedToResendMessage => 'Échec du renvoi du message'; + + @override + String get retryingMessage => 'Nouvelle tentative de message...'; + + @override + String retryFailed(String error) { + return 'Échec de la nouvelle tentative : $error'; + } + + @override + String get textCopiedToClipboard => 'Texte copié dans le presse-papiers'; + + @override + String get cannotReplySenderMissing => + 'Impossible de répondre : informations sur l\'expéditeur manquantes'; + + @override + String get cannotReplyContactNotFound => + 'Impossible de répondre : contact non trouvé'; + + @override + String get messageDeleted => 'Message supprimé'; + + @override + String get refreshedContacts => 'Contacts actualisés'; + + @override + String get justNow => 'À l\'instant'; + + @override + String minutesAgo(int minutes) { + return 'Il y a ${minutes}m'; + } + + @override + String hoursAgo(int hours) { + return 'Il y a ${hours}h'; + } + + @override + String daysAgo(int days) { + return 'Il y a ${days}j'; + } + + @override + String secondsAgo(int seconds) { + return 'Il y a ${seconds}s'; + } + + @override + String get sending => 'Envoi...'; + + @override + String get sent => 'Envoyé'; + + @override + String get delivered => 'Livré'; + + @override + String deliveredWithTime(int time) { + return 'Livré (${time}ms)'; + } + + @override + String get failed => 'Échec'; + + @override + String get sarMarkerFoundPerson => 'Personne trouvée'; + + @override + String get sarMarkerFire => 'Lieu de feu'; + + @override + String get sarMarkerStagingArea => 'Zone de rassemblement'; + + @override + String get sarMarkerObject => 'Objet trouvé'; + + @override + String get from => 'De'; + + @override + String get coordinates => 'Coordonnées'; + + @override + String get tapToViewOnMap => 'Appuyez pour voir sur la carte'; + + @override + String get radioSettings => 'Paramètres radio'; + + @override + String get frequencyMHz => 'Fréquence (MHz)'; + + @override + String get frequencyExample => 'ex. : 869,618'; + + @override + String get bandwidth => 'Bande passante'; + + @override + String get spreadingFactor => 'Facteur d\'étalement'; + + @override + String get codingRate => 'Taux de codage'; + + @override + String get txPowerDbm => 'Puissance TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Max : $power dBm'; + } + + @override + String get you => 'Vous'; + + @override + String get offlineVectorMaps => 'Cartes vectorielles hors ligne'; + + @override + String get offlineVectorMapsDescription => + 'Importer et gérer les tuiles de cartes vectorielles hors ligne (format MBTiles) pour une utilisation sans connexion Internet'; + + @override + String get importMbtiles => 'Importer un fichier MBTiles'; + + @override + String get importMbtilesNote => + 'Prend en charge les fichiers MBTiles avec tuiles vectorielles (format PBF/MVT). Les extraits Geofabrik fonctionnent très bien !'; + + @override + String get noMbtilesFiles => 'Aucune carte vectorielle hors ligne trouvée'; + + @override + String get mbtilesImportedSuccessfully => + 'Fichier MBTiles importé avec succès'; + + @override + String get failedToImportMbtiles => + 'Échec de l\'importation du fichier MBTiles'; + + @override + String get deleteMbtilesConfirmTitle => 'Supprimer la carte hors ligne'; + + @override + String deleteMbtilesConfirmMessage(String name) { + return 'Êtes-vous sûr de vouloir supprimer \"$name\" ? Cela supprimera définitivement la carte hors ligne.'; + } + + @override + String get mbtilesDeletedSuccessfully => + 'Carte hors ligne supprimée avec succès'; + + @override + String get failedToDeleteMbtiles => + 'Échec de la suppression de la carte hors ligne'; + + @override + String get vectorTiles => 'Tuiles vectorielles'; + + @override + String get schema => 'Schéma'; + + @override + String get unknown => 'Inconnu'; + + @override + String get bounds => 'Limites'; + + @override + String get onlineLayers => 'Couches en ligne'; + + @override + String get offlineLayers => 'Couches hors ligne'; + + @override + String get locationTrail => 'Trace de déplacement'; + + @override + String get showTrailOnMap => 'Afficher la trace sur la carte'; + + @override + String get trailVisible => 'La trace est visible sur la carte'; + + @override + String get trailHiddenRecording => + 'La trace est masquée (enregistrement en cours)'; + + @override + String get duration => 'Durée'; + + @override + String get points => 'Points'; + + @override + String get clearTrail => 'Effacer la trace'; + + @override + String get clearTrailQuestion => 'Effacer la trace ?'; + + @override + String get clearTrailConfirmation => + 'Êtes-vous sûr de vouloir effacer la trace de déplacement actuelle ? Cette action ne peut pas être annulée.'; + + @override + String get noTrailRecorded => 'Aucune trace enregistrée pour le moment'; + + @override + String get startTrackingToRecord => + 'Démarrez le suivi de position pour enregistrer votre trace'; + + @override + String get trailControls => 'Contrôles de la trace'; + + @override + String get deviceInformation => 'Informations sur l\'appareil'; + + @override + String get bleName => 'Nom BLE'; + + @override + String get meshName => 'Nom du maillage'; + + @override + String get notSet => 'Non défini'; + + @override + String get model => 'Modèle'; + + @override + String get version => 'Version'; + + @override + String get buildDate => 'Date de compilation'; + + @override + String get firmware => 'Micrologiciel'; + + @override + String get maxContacts => 'Contacts max'; + + @override + String get maxChannels => 'Canaux max'; + + @override + String get publicInfo => 'Informations publiques'; + + @override + String get meshNetworkName => 'Nom du réseau maillé'; + + @override + String get nameBroadcastInMesh => 'Nom diffusé dans les annonces du maillage'; + + @override + String get telemetryAndLocationSharing => 'Télémétrie et partage de position'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Utiliser la position actuelle'; + + @override + String get noneUnknown => 'Aucun/Inconnu'; + + @override + String get chatNode => 'Nœud de discussion'; + + @override + String get repeater => 'Répéteur'; + + @override + String get roomChannel => 'Salon/Canal'; + + @override + String typeNumber(int number) { + return 'Type $number'; + } + + @override + String copiedToClipboardShort(String label) { + return '$label copié dans le presse-papiers'; + } + + @override + String failedToSave(String error) { + return 'Échec de l\'enregistrement : $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Échec de l\'obtention de la position : $error'; + } +} diff --git a/lib/l10n/app_localizations_hr.dart b/lib/l10n/app_localizations_hr.dart index 08b2d4f..5a21726 100644 --- a/lib/l10n/app_localizations_hr.dart +++ b/lib/l10n/app_localizations_hr.dart @@ -1105,4 +1105,125 @@ class AppLocalizationsHr extends AppLocalizations { @override String get offlineLayers => 'Offline slojevi'; + + @override + String get locationTrail => 'Putanja lokacije'; + + @override + String get showTrailOnMap => 'Prikaži putanju na karti'; + + @override + String get trailVisible => 'Putanja je vidljiva na karti'; + + @override + String get trailHiddenRecording => 'Putanja je skrivena (još se snima)'; + + @override + String get duration => 'Trajanje'; + + @override + String get points => 'Točke'; + + @override + String get clearTrail => 'Obriši putanju'; + + @override + String get clearTrailQuestion => 'Obrisati putanju?'; + + @override + String get clearTrailConfirmation => + 'Jeste li sigurni da želite obrisati trenutnu putanju lokacije? Ova radnja se ne može poništiti.'; + + @override + String get noTrailRecorded => 'Još nije snimljena putanja'; + + @override + String get startTrackingToRecord => + 'Pokrenite praćenje lokacije za snimanje putanje'; + + @override + String get trailControls => 'Upravljanje putanjom'; + + @override + String get deviceInformation => 'Informacije o uređaju'; + + @override + String get bleName => 'BLE naziv'; + + @override + String get meshName => 'Mesh naziv'; + + @override + String get notSet => 'Nije postavljeno'; + + @override + String get model => 'Model'; + + @override + String get version => 'Verzija'; + + @override + String get buildDate => 'Datum izgradnje'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Maks. kontakata'; + + @override + String get maxChannels => 'Maks. kanala'; + + @override + String get publicInfo => 'Javne informacije'; + + @override + String get meshNetworkName => 'Naziv mesh mreže'; + + @override + String get nameBroadcastInMesh => 'Naziv koji se emitira u mesh oglasima'; + + @override + String get telemetryAndLocationSharing => 'Telemetrija i dijeljenje lokacije'; + + @override + String get lat => 'Šir'; + + @override + String get lon => 'Dug'; + + @override + String get useCurrentLocation => 'Koristi trenutnu lokaciju'; + + @override + String get noneUnknown => 'Nema/Nepoznato'; + + @override + String get chatNode => 'Čvorište za razgovor'; + + @override + String get repeater => 'Repetitor'; + + @override + String get roomChannel => 'Soba/Kanal'; + + @override + String typeNumber(int number) { + return 'Tip $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Kopirano $label u međuspremnik'; + } + + @override + String failedToSave(String error) { + return 'Neuspjelo spremanje: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Neuspjelo dohvaćanje lokacije: $error'; + } } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart new file mode 100644 index 0000000..9cd5f91 --- /dev/null +++ b/lib/l10n/app_localizations_it.dart @@ -0,0 +1,1239 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Italian (`it`). +class AppLocalizationsIt extends AppLocalizations { + AppLocalizationsIt([String locale = 'it']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Messaggi'; + + @override + String get contacts => 'Contatti'; + + @override + String get map => 'Mappa'; + + @override + String get settings => 'Impostazioni'; + + @override + String get connect => 'Connetti'; + + @override + String get disconnect => 'Disconnetti'; + + @override + String get scanningForDevices => 'Ricerca dispositivi in corso...'; + + @override + String get noDevicesFound => 'Nessun dispositivo trovato'; + + @override + String get scanAgain => 'Cerca Nuovamente'; + + @override + String get tapToConnect => 'Tocca per connettere'; + + @override + String get deviceNotConnected => 'Dispositivo non connesso'; + + @override + String get locationPermissionDenied => 'Autorizzazione posizione negata'; + + @override + String get locationPermissionPermanentlyDenied => + 'Autorizzazione posizione negata permanentemente. Abilitarla nelle Impostazioni.'; + + @override + String get locationPermissionRequired => + 'L\'autorizzazione alla posizione è necessaria per il tracciamento GPS e il coordinamento del team. Puoi abilitarla successivamente nelle Impostazioni.'; + + @override + String get locationServicesDisabled => + 'I servizi di localizzazione sono disabilitati. Abilitarli nelle Impostazioni.'; + + @override + String get failedToGetGpsLocation => 'Impossibile ottenere la posizione GPS'; + + @override + String advertisedAtLocation(String latitude, String longitude) { + return 'Annunciato a $latitude, $longitude'; + } + + @override + String failedToAdvertise(String error) { + return 'Annuncio fallito: $error'; + } + + @override + String reconnecting(int attempt, int max) { + return 'Riconnessione in corso... ($attempt/$max)'; + } + + @override + String get cancelReconnection => 'Annulla riconnessione'; + + @override + String get mapManagement => 'Gestione Mappa'; + + @override + String get general => 'Generale'; + + @override + String get theme => 'Tema'; + + @override + String get chooseTheme => 'Scegli Tema'; + + @override + String get light => 'Chiaro'; + + @override + String get dark => 'Scuro'; + + @override + String get blueLightTheme => 'Tema blu chiaro'; + + @override + String get blueDarkTheme => 'Tema blu scuro'; + + @override + String get sarRed => 'SAR Rosso'; + + @override + String get alertEmergencyMode => 'Modalità Allerta/Emergenza'; + + @override + String get sarGreen => 'SAR Verde'; + + @override + String get safeAllClearMode => 'Modalità Sicuro/Tutto Libero'; + + @override + String get autoSystem => 'Auto (Sistema)'; + + @override + String get followSystemTheme => 'Segui tema di sistema'; + + @override + String get showRxTxIndicators => 'Mostra Indicatori RX/TX'; + + @override + String get displayPacketActivity => + 'Mostra indicatori di attività pacchetti nella barra superiore'; + + @override + String get language => 'Lingua'; + + @override + String get chooseLanguage => 'Scegli Lingua'; + + @override + String get english => 'Inglese'; + + @override + String get slovenian => 'Sloveno'; + + @override + String get croatian => 'Croato'; + + @override + String get locationBroadcasting => 'Trasmissione Posizione'; + + @override + String get autoLocationTracking => 'Tracciamento Posizione Automatico'; + + @override + String get automaticallyBroadcastPosition => + 'Trasmetti automaticamente aggiornamenti di posizione'; + + @override + String get configureTracking => 'Configura Tracciamento'; + + @override + String get distanceAndTimeThresholds => 'Soglie di distanza e tempo'; + + @override + String get locationTrackingConfiguration => + 'Configurazione Tracciamento Posizione'; + + @override + String get configureWhenLocationBroadcasts => + 'Configura quando le trasmissioni di posizione vengono inviate alla rete mesh'; + + @override + String get minimumDistance => 'Distanza Minima'; + + @override + String broadcastAfterMoving(String distance) { + return 'Trasmetti solo dopo essersi spostati di $distance metri'; + } + + @override + String get maximumDistance => 'Distanza Massima'; + + @override + String alwaysBroadcastAfterMoving(String distance) { + return 'Trasmetti sempre dopo essersi spostati di $distance metri'; + } + + @override + String get minimumTimeInterval => 'Intervallo Minimo di Tempo'; + + @override + String alwaysBroadcastEvery(String duration) { + return 'Trasmetti sempre ogni $duration'; + } + + @override + String get save => 'Salva'; + + @override + String get cancel => 'Annulla'; + + @override + String get close => 'Chiudi'; + + @override + String get about => 'Informazioni'; + + @override + String get appVersion => 'Versione App'; + + @override + String get appName => 'Nome App'; + + @override + String get aboutMeshCoreSar => 'Informazioni su MeshCore SAR'; + + @override + String get aboutDescription => + 'Un\'applicazione di Ricerca e Soccorso progettata per i team di emergenza. Le caratteristiche includono:\n\n• Rete mesh BLE per comunicazione dispositivo-a-dispositivo\n• Mappe offline con opzioni di livelli multipli\n• Tracciamento in tempo reale dei membri del team\n• Marcatori tattici SAR (persona trovata, incendio, area di appoggio)\n• Gestione contatti e messaggistica\n• Tracciamento GPS con direzione bussola\n• Caching dei tile della mappa per uso offline'; + + @override + String get technologiesUsed => 'Tecnologie Utilizzate:'; + + @override + String get technologiesList => + '• Flutter per lo sviluppo multipiattaforma\n• BLE (Bluetooth Low Energy) per la rete mesh\n• OpenStreetMap per la mappatura\n• Provider per la gestione dello stato\n• SharedPreferences per l\'archiviazione locale'; + + @override + String get developer => 'Sviluppatore'; + + @override + String get packageName => 'Nome Pacchetto'; + + @override + String get sampleData => 'Dati di Esempio'; + + @override + String get sampleDataDescription => + 'Carica o cancella contatti di esempio, messaggi di canale e marcatori SAR per test'; + + @override + String get loadSampleData => 'Carica Dati di Esempio'; + + @override + String get clearAllData => 'Cancella Tutti i Dati'; + + @override + String get clearAllDataConfirmTitle => 'Cancella Tutti i Dati'; + + @override + String get clearAllDataConfirmMessage => + 'Questo cancellerà tutti i contatti e i marcatori SAR. Sei sicuro?'; + + @override + String get clear => 'Cancella'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Caricati $teamCount membri del team, $channelCount canali, $sarCount marcatori SAR, $messageCount messaggi'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Impossibile caricare dati di esempio: $error'; + } + + @override + String get allDataCleared => 'Tutti i dati cancellati'; + + @override + String get failedToStartBackgroundTracking => + 'Impossibile avviare il tracciamento in background. Verifica le autorizzazioni e la connessione BLE.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Trasmissione posizione: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'Il PIN predefinito per i dispositivi senza schermo è 123456. Problemi di accoppiamento? Dimentica il dispositivo bluetooth nelle impostazioni di sistema.'; + + @override + String get noMessagesYet => 'Nessun messaggio ancora'; + + @override + String get pullDownToSync => + 'Trascina verso il basso per sincronizzare i messaggi'; + + @override + String get deleteContact => 'Elimina Contatto'; + + @override + String get delete => 'Elimina'; + + @override + String get viewOnMap => 'Visualizza su Mappa'; + + @override + String get refresh => 'Aggiorna'; + + @override + String get sendDirectMessage => 'Invia Messaggio Diretto'; + + @override + String get resetPath => 'Resetta Percorso (Ri-instrada)'; + + @override + String get publicKeyCopied => 'Chiave pubblica copiata negli appunti'; + + @override + String copiedToClipboard(String label) { + return '$label copiato negli appunti'; + } + + @override + String get pleaseEnterPassword => 'Inserisci una password'; + + @override + String failedToSyncContacts(String error) { + return 'Impossibile sincronizzare i contatti: $error'; + } + + @override + String get loggedInSuccessfully => + 'Accesso effettuato con successo! In attesa dei messaggi della stanza...'; + + @override + String get loginFailed => 'Accesso fallito - password errata'; + + @override + String loggingIn(String roomName) { + return 'Accesso a $roomName in corso...'; + } + + @override + String failedToSendLogin(String error) { + return 'Impossibile inviare l\'accesso: $error'; + } + + @override + String get lowLocationAccuracy => 'Precisione Posizione Bassa'; + + @override + String get continue_ => 'Continua'; + + @override + String get sendSarMarker => 'Invia marcatore SAR'; + + @override + String get deleteDrawing => 'Elimina Disegno'; + + @override + String get drawLine => 'Disegna Linea'; + + @override + String get drawLineDesc => 'Disegna una linea a mano libera sulla mappa'; + + @override + String get drawRectangle => 'Disegna Rettangolo'; + + @override + String get drawRectangleDesc => 'Disegna un\'area rettangolare sulla mappa'; + + @override + String get shareDrawings => 'Condividi Disegni'; + + @override + String get clearAllDrawings => 'Cancella Tutti i Disegni'; + + @override + String get clearAll => 'Cancella Tutto'; + + @override + String get noLocalDrawings => 'Nessun disegno locale da condividere'; + + @override + String get publicChannel => 'Canale Pubblico'; + + @override + String get broadcastToAll => 'Trasmetti a tutti i nodi vicini (effimero)'; + + @override + String get storedPermanently => 'Archiviato permanentemente nella stanza'; + + @override + String get notConnectedToDevice => 'Non connesso al dispositivo'; + + @override + String get directMessage => 'Messaggio Diretto'; + + @override + String directMessageSentTo(String contactName) { + return 'Messaggio diretto inviato a $contactName'; + } + + @override + String failedToSend(String error) { + return 'Invio fallito: $error'; + } + + @override + String directMessageInfo(String contactName) { + return 'Questo messaggio verrà inviato direttamente a $contactName. Apparirà anche nel feed dei messaggi principali.'; + } + + @override + String get typeYourMessage => 'Scrivi il tuo messaggio...'; + + @override + String get quickLocationMarker => 'Marcatore posizione rapido'; + + @override + String get markerType => 'Tipo Marcatore'; + + @override + String get sendTo => 'Invia A'; + + @override + String get noDestinationsAvailable => 'Nessuna destinazione disponibile.'; + + @override + String get selectDestination => 'Seleziona destinazione...'; + + @override + String get ephemeralBroadcastInfo => + 'Effimero: Trasmissione via etere solamente. Non archiviato - i nodi devono essere online.'; + + @override + String get persistentRoomInfo => + 'Persistente: Archiviato in modo immutabile nella stanza. Sincronizzato automaticamente e conservato offline.'; + + @override + String get location => 'Posizione'; + + @override + String get fromMap => 'Dalla Mappa'; + + @override + String get gettingLocation => 'Ottenimento posizione...'; + + @override + String get locationError => 'Errore Posizione'; + + @override + String get retry => 'Riprova'; + + @override + String get refreshLocation => 'Aggiorna posizione'; + + @override + String accuracyMeters(int accuracy) { + return 'Precisione: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Note (facoltativo)'; + + @override + String get addAdditionalInformation => 'Aggiungi informazioni aggiuntive...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'La precisione della posizione è ±${accuracy}m. Potrebbe non essere abbastanza accurata per le operazioni SAR.\n\nContinuare comunque?'; + } + + @override + String get loginToRoom => 'Accedi alla Stanza'; + + @override + String get enterPasswordInfo => + 'Inserisci la password per accedere a questa stanza. La password verrà salvata per usi futuri.'; + + @override + String get password => 'Password'; + + @override + String get enterRoomPassword => 'Inserisci password stanza'; + + @override + String get loggingInDots => 'Accesso in corso...'; + + @override + String get login => 'Accedi'; + + @override + String failedToAddRoom(String error) { + return 'Impossibile aggiungere la stanza al dispositivo: $error\n\nLa stanza potrebbe non aver ancora trasmesso.\nProva ad attendere che la stanza trasmetta.'; + } + + @override + String get direct => 'Diretto'; + + @override + String get flood => 'Flood'; + + @override + String get admin => 'Admin'; + + @override + String get loggedIn => 'Connesso'; + + @override + String get noGpsData => 'Nessun dato GPS'; + + @override + String get distance => 'Distanza'; + + @override + String pingingDirect(String name) { + return 'Ping $name (diretto via percorso)...'; + } + + @override + String pingingFlood(String name) { + return 'Ping $name (flooding - nessun percorso)...'; + } + + @override + String directPingTimeout(String name) { + return 'Timeout ping diretto - nuovo tentativo $name con flooding...'; + } + + @override + String pingSuccessful(String name, String fallback) { + return 'Ping riuscito a $name$fallback'; + } + + @override + String get viaFloodingFallback => ' (via fallback flooding)'; + + @override + String pingFailed(String name) { + return 'Ping fallito a $name - nessuna risposta ricevuta'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Sei sicuro di voler eliminare \"$name\"?\n\nQuesto rimuoverà il contatto sia dall\'app che dal dispositivo radio companion.'; + } + + @override + String removingContact(String name) { + return 'Rimozione di $name...'; + } + + @override + String contactRemoved(String name) { + return 'Contatto \"$name\" rimosso'; + } + + @override + String failedToRemoveContact(String error) { + return 'Impossibile rimuovere il contatto: $error'; + } + + @override + String get type => 'Tipo'; + + @override + String get publicKey => 'Chiave Pubblica'; + + @override + String get lastSeen => 'Ultima Visita'; + + @override + String get roomStatus => 'Stato Stanza'; + + @override + String get loginStatus => 'Stato Accesso'; + + @override + String get notLoggedIn => 'Non Connesso'; + + @override + String get adminAccess => 'Accesso Admin'; + + @override + String get yes => 'Sì'; + + @override + String get no => 'No'; + + @override + String get permissions => 'Permessi'; + + @override + String get passwordSaved => 'Password Salvata'; + + @override + String get locationColon => 'Posizione:'; + + @override + String get telemetry => 'Telemetria'; + + @override + String requestingTelemetry(String name) { + return 'Richiesta telemetria da $name...'; + } + + @override + String get voltage => 'Tensione'; + + @override + String get battery => 'Batteria'; + + @override + String get temperature => 'Temperatura'; + + @override + String get humidity => 'Umidità'; + + @override + String get pressure => 'Pressione'; + + @override + String get gpsTelemetry => 'GPS (Telemetria)'; + + @override + String get updated => 'Aggiornato'; + + @override + String pathResetInfo(String name) { + return 'Percorso resettato per $name. Il prossimo messaggio troverà un nuovo instradamento.'; + } + + @override + String get reLoginToRoom => 'Riaccedi alla Stanza'; + + @override + String get heading => 'Direzione'; + + @override + String get elevation => 'Elevazione'; + + @override + String get accuracy => 'Precisione'; + + @override + String get filterMarkers => 'Filtra Marcatori'; + + @override + String get filterMarkersTooltip => 'Filtra marcatori'; + + @override + String get contactsFilter => 'Contatti'; + + @override + String get repeatersFilter => 'Ripetitori'; + + @override + String get sarMarkers => 'Marcatori SAR'; + + @override + String get foundPerson => 'Persona Trovata'; + + @override + String get fire => 'Incendio'; + + @override + String get stagingArea => 'Area di Appoggio'; + + @override + String get showAll => 'Mostra Tutto'; + + @override + String get nearbyContacts => 'Contatti Vicini'; + + @override + String get locationUnavailable => 'Posizione non disponibile'; + + @override + String get ahead => 'avanti'; + + @override + String degreesRight(int degrees) { + return '$degrees° destra'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° sinistra'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Nessun contatto ancora'; + + @override + String get connectToDeviceToLoadContacts => + 'Connetti a un dispositivo per caricare i contatti'; + + @override + String get teamMembers => 'Membri del Team'; + + @override + String get repeaters => 'Ripetitori'; + + @override + String get rooms => 'Stanze'; + + @override + String get channels => 'Canali'; + + @override + String get cacheStatistics => 'Statistiche Cache'; + + @override + String get totalTiles => 'Tile Totali'; + + @override + String get cacheSize => 'Dimensione Cache'; + + @override + String get storeName => 'Nome Archivio'; + + @override + String get noCacheStatistics => 'Nessuna statistica cache disponibile'; + + @override + String get downloadRegion => 'Scarica Regione'; + + @override + String get mapLayer => 'Livello Mappa'; + + @override + String get regionBounds => 'Limiti Regione'; + + @override + String get north => 'Nord'; + + @override + String get south => 'Sud'; + + @override + String get east => 'Est'; + + @override + String get west => 'Ovest'; + + @override + String get zoomLevels => 'Livelli di Zoom'; + + @override + String minZoom(int zoom) { + return 'Min: $zoom'; + } + + @override + String maxZoom(int zoom) { + return 'Max: $zoom'; + } + + @override + String get downloadingDots => 'Scaricamento in corso...'; + + @override + String get cancelDownload => 'Annulla Download'; + + @override + String get downloadRegionButton => 'Scarica Regione'; + + @override + String get downloadNote => + 'Nota: Regioni grandi o livelli di zoom elevati possono richiedere tempo e spazio di archiviazione significativi.'; + + @override + String get cacheManagement => 'Gestione Cache'; + + @override + String get clearAllMaps => 'Cancella Tutte le Mappe'; + + @override + String get clearMapsConfirmTitle => 'Cancella Tutte le Mappe'; + + @override + String get clearMapsConfirmMessage => + 'Sei sicuro di voler eliminare tutte le mappe scaricate? Questa azione non può essere annullata.'; + + @override + String get mapDownloadCompleted => 'Download mappa completato!'; + + @override + String get cacheClearedSuccessfully => 'Cache cancellata con successo!'; + + @override + String get downloadCancelled => 'Download annullato'; + + @override + String get startingDownload => 'Avvio download...'; + + @override + String get downloadingMapTiles => 'Scaricamento tile mappa...'; + + @override + String get downloadCompletedSuccessfully => + 'Download completato con successo!'; + + @override + String get cancellingDownload => 'Annullamento download...'; + + @override + String errorLoadingStats(String error) { + return 'Errore nel caricamento delle statistiche: $error'; + } + + @override + String downloadFailed(String error) { + return 'Download fallito: $error'; + } + + @override + String cancelFailed(String error) { + return 'Annullamento fallito: $error'; + } + + @override + String clearCacheFailed(String error) { + return 'Cancellazione cache fallita: $error'; + } + + @override + String minZoomError(String error) { + return 'Zoom minimo: $error'; + } + + @override + String maxZoomError(String error) { + return 'Zoom massimo: $error'; + } + + @override + String get minZoomGreaterThanMax => + 'Lo zoom minimo deve essere minore o uguale allo zoom massimo'; + + @override + String get selectMapLayer => 'Seleziona Livello Mappa'; + + @override + String get mapOptions => 'Opzioni Mappa'; + + @override + String get showLegend => 'Mostra Legenda'; + + @override + String get displayMarkerTypeCounts => + 'Visualizza conteggio tipi di marcatori'; + + @override + String get rotateMapWithHeading => 'Ruota Mappa con Direzione'; + + @override + String get mapFollowsDirection => + 'La mappa segue la tua direzione quando ti muovi'; + + @override + String get showMapDebugInfo => 'Mostra Info Debug Mappa'; + + @override + String get displayZoomLevelBounds => 'Visualizza livello di zoom e limiti'; + + @override + String get fullscreenMode => 'Modalità Schermo Intero'; + + @override + String get hideUiFullMapView => + 'Nascondi tutti i controlli UI per la visualizzazione completa della mappa'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'ESRI Satellite'; + + @override + String get downloadVisibleArea => 'Scarica area visibile'; + + @override + String get initializingMap => 'Inizializzazione mappa...'; + + @override + String get dragToPosition => 'Trascina per Posizionare'; + + @override + String get createSarMarker => 'Crea Marcatore SAR'; + + @override + String get compass => 'Bussola'; + + @override + String get navigationAndContacts => 'Navigazione e Contatti'; + + @override + String get sarAlert => 'ALLERTA SAR'; + + @override + String get messageSentToPublicChannel => + 'Messaggio inviato al canale pubblico'; + + @override + String get pleaseSelectRoomToSendSar => + 'Seleziona una stanza per inviare il marcatore SAR'; + + @override + String failedToSendSarMarker(String error) { + return 'Impossibile inviare il marcatore SAR: $error'; + } + + @override + String sarMarkerSentTo(String roomName) { + return 'Marcatore SAR inviato a $roomName'; + } + + @override + String get notConnectedCannotSync => + 'Non connesso - impossibile sincronizzare i messaggi'; + + @override + String syncedMessageCount(int count) { + return 'Sincronizzati $count messaggio(i)'; + } + + @override + String get noNewMessages => 'Nessun nuovo messaggio'; + + @override + String syncFailed(String error) { + return 'Sincronizzazione fallita: $error'; + } + + @override + String get failedToResendMessage => 'Impossibile reinviare il messaggio'; + + @override + String get retryingMessage => 'Nuovo tentativo messaggio...'; + + @override + String retryFailed(String error) { + return 'Nuovo tentativo fallito: $error'; + } + + @override + String get textCopiedToClipboard => 'Testo copiato negli appunti'; + + @override + String get cannotReplySenderMissing => + 'Impossibile rispondere: informazioni mittente mancanti'; + + @override + String get cannotReplyContactNotFound => + 'Impossibile rispondere: contatto non trovato'; + + @override + String get messageDeleted => 'Messaggio eliminato'; + + @override + String get refreshedContacts => 'Contatti aggiornati'; + + @override + String get justNow => 'Proprio ora'; + + @override + String minutesAgo(int minutes) { + return '${minutes}m fa'; + } + + @override + String hoursAgo(int hours) { + return '${hours}h fa'; + } + + @override + String daysAgo(int days) { + return '${days}g fa'; + } + + @override + String secondsAgo(int seconds) { + return '${seconds}s fa'; + } + + @override + String get sending => 'Invio...'; + + @override + String get sent => 'Inviato'; + + @override + String get delivered => 'Consegnato'; + + @override + String deliveredWithTime(int time) { + return 'Consegnato (${time}ms)'; + } + + @override + String get failed => 'Fallito'; + + @override + String get sarMarkerFoundPerson => 'Persona Trovata'; + + @override + String get sarMarkerFire => 'Posizione Incendio'; + + @override + String get sarMarkerStagingArea => 'Area di Appoggio'; + + @override + String get sarMarkerObject => 'Oggetto Trovato'; + + @override + String get from => 'Da'; + + @override + String get coordinates => 'Coordinate'; + + @override + String get tapToViewOnMap => 'Tocca per visualizzare sulla mappa'; + + @override + String get radioSettings => 'Impostazioni Radio'; + + @override + String get frequencyMHz => 'Frequenza (MHz)'; + + @override + String get frequencyExample => 'es., 869.618'; + + @override + String get bandwidth => 'Larghezza di Banda'; + + @override + String get spreadingFactor => 'Fattore di Spreading'; + + @override + String get codingRate => 'Tasso di Codifica'; + + @override + String get txPowerDbm => 'Potenza TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Max: $power dBm'; + } + + @override + String get you => 'Tu'; + + @override + String get offlineVectorMaps => 'Mappe Vettoriali Offline'; + + @override + String get offlineVectorMapsDescription => + 'Importa e gestisci tile di mappe vettoriali offline (formato MBTiles) per l\'uso senza connessione internet'; + + @override + String get importMbtiles => 'Importa File MBTiles'; + + @override + String get importMbtilesNote => + 'Supporta file MBTiles con tile vettoriali (formato PBF/MVT). Gli estratti Geofabrik funzionano benissimo!'; + + @override + String get noMbtilesFiles => 'Nessuna mappa vettoriale offline trovata'; + + @override + String get mbtilesImportedSuccessfully => + 'File MBTiles importato con successo'; + + @override + String get failedToImportMbtiles => 'Impossibile importare il file MBTiles'; + + @override + String get deleteMbtilesConfirmTitle => 'Elimina Mappa Offline'; + + @override + String deleteMbtilesConfirmMessage(String name) { + return 'Sei sicuro di voler eliminare \"$name\"? Questo rimuoverà permanentemente la mappa offline.'; + } + + @override + String get mbtilesDeletedSuccessfully => + 'Mappa offline eliminata con successo'; + + @override + String get failedToDeleteMbtiles => 'Impossibile eliminare la mappa offline'; + + @override + String get vectorTiles => 'Tile Vettoriali'; + + @override + String get schema => 'Schema'; + + @override + String get unknown => 'Sconosciuto'; + + @override + String get bounds => 'Limiti'; + + @override + String get onlineLayers => 'Livelli Online'; + + @override + String get offlineLayers => 'Livelli Offline'; + + @override + String get locationTrail => 'Traccia Posizione'; + + @override + String get showTrailOnMap => 'Mostra Traccia sulla Mappa'; + + @override + String get trailVisible => 'La traccia è visibile sulla mappa'; + + @override + String get trailHiddenRecording => + 'La traccia è nascosta (ancora in registrazione)'; + + @override + String get duration => 'Durata'; + + @override + String get points => 'Punti'; + + @override + String get clearTrail => 'Cancella Traccia'; + + @override + String get clearTrailQuestion => 'Cancellare Traccia?'; + + @override + String get clearTrailConfirmation => + 'Sei sicuro di voler cancellare la traccia posizione attuale? Questa azione non può essere annullata.'; + + @override + String get noTrailRecorded => 'Nessuna traccia registrata ancora'; + + @override + String get startTrackingToRecord => + 'Avvia il tracciamento posizione per registrare la tua traccia'; + + @override + String get trailControls => 'Controlli Traccia'; + + @override + String get deviceInformation => 'Informazioni Dispositivo'; + + @override + String get bleName => 'Nome BLE'; + + @override + String get meshName => 'Nome Mesh'; + + @override + String get notSet => 'Non impostato'; + + @override + String get model => 'Modello'; + + @override + String get version => 'Versione'; + + @override + String get buildDate => 'Data Build'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Contatti Max'; + + @override + String get maxChannels => 'Canali Max'; + + @override + String get publicInfo => 'Informazioni Pubbliche'; + + @override + String get meshNetworkName => 'Nome Rete Mesh'; + + @override + String get nameBroadcastInMesh => 'Nome trasmesso negli annunci mesh'; + + @override + String get telemetryAndLocationSharing => + 'Telemetria e Condivisione Posizione'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Usa posizione attuale'; + + @override + String get noneUnknown => 'Nessuno/Sconosciuto'; + + @override + String get chatNode => 'Nodo Chat'; + + @override + String get repeater => 'Ripetitore'; + + @override + String get roomChannel => 'Stanza/Canale'; + + @override + String typeNumber(int number) { + return 'Tipo $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Copiato $label negli appunti'; + } + + @override + String failedToSave(String error) { + return 'Impossibile salvare: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Impossibile ottenere la posizione: $error'; + } +} diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index bc56795..4cab5a4 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -1108,4 +1108,125 @@ class AppLocalizationsSl extends AppLocalizations { @override String get offlineLayers => 'Brezpovezne plasti'; + + @override + String get locationTrail => 'Sledilna pot'; + + @override + String get showTrailOnMap => 'Prikaži pot na zemljevidu'; + + @override + String get trailVisible => 'Pot je vidna na zemljevidu'; + + @override + String get trailHiddenRecording => 'Pot je skrita (še se snema)'; + + @override + String get duration => 'Trajanje'; + + @override + String get points => 'Točke'; + + @override + String get clearTrail => 'Počisti pot'; + + @override + String get clearTrailQuestion => 'Počisti pot?'; + + @override + String get clearTrailConfirmation => + 'Ste prepričani, da želite počistiti trenutno sledilno pot? Tega dejanja ni mogoče razveljaviti.'; + + @override + String get noTrailRecorded => 'Še ni posnete poti'; + + @override + String get startTrackingToRecord => + 'Začnite sledenje lokacije za snemanje poti'; + + @override + String get trailControls => 'Nadzor poti'; + + @override + String get deviceInformation => 'Informacije o napravi'; + + @override + String get bleName => 'BLE ime'; + + @override + String get meshName => 'Mesh ime'; + + @override + String get notSet => 'Ni nastavljeno'; + + @override + String get model => 'Model'; + + @override + String get version => 'Različica'; + + @override + String get buildDate => 'Datum izdelave'; + + @override + String get firmware => 'Vdelana programska oprema'; + + @override + String get maxContacts => 'Maks. stikov'; + + @override + String get maxChannels => 'Maks. kanalov'; + + @override + String get publicInfo => 'Javne informacije'; + + @override + String get meshNetworkName => 'Ime mesh omrežja'; + + @override + String get nameBroadcastInMesh => 'Ime, ki se oddaja v mesh oglasih'; + + @override + String get telemetryAndLocationSharing => 'Telemetrija in deljenje lokacije'; + + @override + String get lat => 'Šir'; + + @override + String get lon => 'Dol'; + + @override + String get useCurrentLocation => 'Uporabi trenutno lokacijo'; + + @override + String get noneUnknown => 'Brez/Neznano'; + + @override + String get chatNode => 'Vozlišče za klepet'; + + @override + String get repeater => 'Ojačevalnik'; + + @override + String get roomChannel => 'Soba/Kanal'; + + @override + String typeNumber(int number) { + return 'Tip $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Kopirano $label v odložišče'; + } + + @override + String failedToSave(String error) { + return 'Shranjevanje ni uspelo: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Pridobivanje lokacije ni uspelo: $error'; + } } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 2599399..f23b856 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -632,5 +632,81 @@ "onlineLayers": "Spletne plasti", - "offlineLayers": "Brezpovezne plasti" + "offlineLayers": "Brezpovezne plasti", + + "locationTrail": "Sledilna pot", + + "showTrailOnMap": "Prikaži pot na zemljevidu", + + "trailVisible": "Pot je vidna na zemljevidu", + + "trailHiddenRecording": "Pot je skrita (še se snema)", + + "distance": "Razdalja", + + "duration": "Trajanje", + + "points": "Točke", + + "clearTrail": "Počisti pot", + + "clearTrailQuestion": "Počisti pot?", + + "clearTrailConfirmation": "Ste prepričani, da želite počistiti trenutno sledilno pot? Tega dejanja ni mogoče razveljaviti.", + + "noTrailRecorded": "Še ni posnete poti", + + "startTrackingToRecord": "Začnite sledenje lokacije za snemanje poti", + + "trailControls": "Nadzor poti", + + "deviceInformation": "Informacije o napravi", + + "bleName": "BLE ime", + + "meshName": "Mesh ime", + + "notSet": "Ni nastavljeno", + + "model": "Model", + + "version": "Različica", + + "buildDate": "Datum izdelave", + + "firmware": "Vdelana programska oprema", + + "maxContacts": "Maks. stikov", + + "maxChannels": "Maks. kanalov", + + "publicInfo": "Javne informacije", + + "meshNetworkName": "Ime mesh omrežja", + + "nameBroadcastInMesh": "Ime, ki se oddaja v mesh oglasih", + + "telemetryAndLocationSharing": "Telemetrija in deljenje lokacije", + + "lat": "Šir", + + "lon": "Dol", + + "useCurrentLocation": "Uporabi trenutno lokacijo", + + "noneUnknown": "Brez/Neznano", + + "chatNode": "Vozlišče za klepet", + + "repeater": "Ojačevalnik", + + "roomChannel": "Soba/Kanal", + + "typeNumber": "Tip {number}", + + "copiedToClipboardShort": "Kopirano {label} v odložišče", + + "failedToSave": "Shranjevanje ni uspelo: {error}", + + "failedToGetLocation": "Pridobivanje lokacije ni uspelo: {error}" } diff --git a/lib/screens/device_config_screen.dart b/lib/screens/device_config_screen.dart index 074ccff..89cbe1e 100644 --- a/lib/screens/device_config_screen.dart +++ b/lib/screens/device_config_screen.dart @@ -209,7 +209,7 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text('Failed to save: $e'), + content: Text(AppLocalizations.of(context)!.failedToSave(e.toString())), backgroundColor: Colors.red, ), ); @@ -282,7 +282,7 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text('Failed to save: $e'), + content: Text(AppLocalizations.of(context)!.failedToSave(e.toString())), backgroundColor: Colors.red, ), ); @@ -367,7 +367,7 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { ScaffoldMessenger.of( context, - ).showSnackBar(SnackBar(content: Text('Failed to get location: $e'))); + ).showSnackBar(SnackBar(content: Text(AppLocalizations.of(context)!.failedToGetLocation(e.toString())))); } } } @@ -446,35 +446,35 @@ class _DeviceConfigScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Device Information', + AppLocalizations.of(context)!.deviceInformation, style: theme.textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), - _InfoRow('BLE Name', deviceInfo.deviceName ?? 'Unknown'), - _InfoRow('Mesh Name', deviceInfo.selfName ?? 'Not set'), - _InfoRow('Type', _getDeviceTypeString(deviceInfo.deviceType)), - _InfoRow('Model', deviceInfo.manufacturerModel ?? 'Unknown'), - _InfoRow('Version', deviceInfo.semanticVersion ?? 'Unknown'), + _InfoRow(AppLocalizations.of(context)!.bleName, deviceInfo.deviceName ?? AppLocalizations.of(context)!.unknown), + _InfoRow(AppLocalizations.of(context)!.meshName, deviceInfo.selfName ?? AppLocalizations.of(context)!.notSet), + _InfoRow(AppLocalizations.of(context)!.type, _getDeviceTypeString(context, deviceInfo.deviceType)), + _InfoRow(AppLocalizations.of(context)!.model, deviceInfo.manufacturerModel ?? AppLocalizations.of(context)!.unknown), + _InfoRow(AppLocalizations.of(context)!.version, deviceInfo.semanticVersion ?? AppLocalizations.of(context)!.unknown), _InfoRow( - 'Build Date', - deviceInfo.firmwareBuildDate ?? 'Unknown', + AppLocalizations.of(context)!.buildDate, + deviceInfo.firmwareBuildDate ?? AppLocalizations.of(context)!.unknown, ), _InfoRow( - 'Firmware', + AppLocalizations.of(context)!.firmware, 'v${deviceInfo.firmwareVersion?.toString() ?? "?"}', ), _InfoRow( - 'Max Contacts', - deviceInfo.maxContacts?.toString() ?? 'Unknown', + AppLocalizations.of(context)!.maxContacts, + deviceInfo.maxContacts?.toString() ?? AppLocalizations.of(context)!.unknown, ), _InfoRow( - 'Max Channels', - deviceInfo.maxChannels?.toString() ?? 'Unknown', + AppLocalizations.of(context)!.maxChannels, + deviceInfo.maxChannels?.toString() ?? AppLocalizations.of(context)!.unknown, ), _CopyableInfoRow( - 'Public Key', + AppLocalizations.of(context)!.publicKey, _getPublicKeyHex(deviceInfo.publicKey), ), ], @@ -495,7 +495,7 @@ class _DeviceConfigScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'Public Info', + AppLocalizations.of(context)!.publicInfo, style: theme.textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, ), @@ -518,10 +518,10 @@ class _DeviceConfigScreenState extends State { // Mesh Network Name TextField( controller: _nameController, - decoration: const InputDecoration( - labelText: 'Mesh Network Name', - border: OutlineInputBorder(), - helperText: 'Name broadcast in mesh advertisements', + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.meshNetworkName, + border: const OutlineInputBorder(), + helperText: AppLocalizations.of(context)!.nameBroadcastInMesh, ), ), const SizedBox(height: 8), @@ -531,7 +531,7 @@ class _DeviceConfigScreenState extends State { children: [ Expanded( child: Text( - 'Telemetry & Location Sharing', + AppLocalizations.of(context)!.telemetryAndLocationSharing, style: theme.textTheme.bodyMedium, ), ), @@ -554,9 +554,9 @@ class _DeviceConfigScreenState extends State { Expanded( child: TextField( controller: _latController, - decoration: const InputDecoration( - labelText: 'Lat', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.lat, + border: const OutlineInputBorder(), isDense: true, ), keyboardType: const TextInputType.numberWithOptions( @@ -569,9 +569,9 @@ class _DeviceConfigScreenState extends State { Expanded( child: TextField( controller: _lonController, - decoration: const InputDecoration( - labelText: 'Lon', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.lon, + border: const OutlineInputBorder(), isDense: true, ), keyboardType: const TextInputType.numberWithOptions( @@ -584,7 +584,7 @@ class _DeviceConfigScreenState extends State { IconButton.filled( onPressed: _useCurrentLocation, icon: const Icon(Icons.my_location, size: 20), - tooltip: 'Use current location', + tooltip: AppLocalizations.of(context)!.useCurrentLocation, ), ], ), @@ -729,19 +729,19 @@ class _DeviceConfigScreenState extends State { ); } - String _getDeviceTypeString(int? deviceType) { - if (deviceType == null) return 'Unknown'; + String _getDeviceTypeString(BuildContext context, int? deviceType) { + if (deviceType == null) return AppLocalizations.of(context)!.unknown; switch (deviceType) { case 0: - return 'None/Unknown'; + return AppLocalizations.of(context)!.noneUnknown; case 1: - return 'Chat Node'; + return AppLocalizations.of(context)!.chatNode; case 2: - return 'Repeater'; + return AppLocalizations.of(context)!.repeater; case 3: - return 'Room/Channel'; + return AppLocalizations.of(context)!.roomChannel; default: - return 'Type $deviceType'; + return AppLocalizations.of(context)!.typeNumber(deviceType); } } @@ -815,7 +815,7 @@ class _CopyableInfoRow extends StatelessWidget { Clipboard.setData(ClipboardData(text: value)); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text('Copied $label to clipboard'), + content: Text(AppLocalizations.of(context)!.copiedToClipboardShort(label)), duration: const Duration(seconds: 2), backgroundColor: Colors.green, ), diff --git a/lib/screens/map_tab.dart b/lib/screens/map_tab.dart index 1480d34..52b0157 100644 --- a/lib/screens/map_tab.dart +++ b/lib/screens/map_tab.dart @@ -1353,9 +1353,6 @@ class _MapTabState extends State with AutomaticKeepAliveClientMixin { objectCount: messagesProvider.objectMarkers.length, ), ), - // Trail stats overlay (top-left, below legend if shown) - if (!_isFullscreen) - const TrailStatsOverlay(), // Map controls - right side (hidden in fullscreen mode) if (!_isFullscreen) Positioned( diff --git a/lib/services/ble/ble_response_handler.dart b/lib/services/ble/ble_response_handler.dart index 2920a49..339f8eb 100644 --- a/lib/services/ble/ble_response_handler.dart +++ b/lib/services/ble/ble_response_handler.dart @@ -245,7 +245,8 @@ class BleResponseHandler { void _handleContact(BufferReader reader) { try { final contact = FrameParser.parseContact(reader); - print(' ✅ [Contact] Parsed successfully'); + print(' ✅ [Contact] Parsed successfully: ${contact.advName}'); + print(' outPathLen: ${contact.outPathLen} (${contact.pathDescription})'); _pendingContacts.add(contact); onContactReceived?.call(contact); } catch (e) { @@ -468,7 +469,8 @@ class BleResponseHandler { void _handleNewAdvert(BufferReader reader) { try { final contact = FrameParser.parseContact(reader); - print(' ✅ [NewAdvert] Parsed successfully'); + print(' ✅ [NewAdvert] Parsed successfully: ${contact.advName}'); + print(' outPathLen: ${contact.outPathLen} (${contact.pathDescription})'); onContactReceived?.call(contact); } catch (e) { print(' ❌ [NewAdvert] Parsing error: $e'); diff --git a/lib/widgets/map/trail_controls.dart b/lib/widgets/map/trail_controls.dart index a7056e9..b740f54 100644 --- a/lib/widgets/map/trail_controls.dart +++ b/lib/widgets/map/trail_controls.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../providers/map_provider.dart'; +import '../../l10n/app_localizations.dart'; /// Trail management controls widget class TrailControls extends StatelessWidget { @@ -8,31 +9,52 @@ class TrailControls extends StatelessWidget { void _showTrailMenu(BuildContext context) { final mapProvider = Provider.of(context, listen: false); + final l10n = AppLocalizations.of(context)!; showModalBottomSheet( context: context, - builder: (context) => Container( - padding: const EdgeInsets.all(16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - const Icon(Icons.timeline, size: 24), - const SizedBox(width: 12), - const Text( - 'Location Trail', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, + isScrollControlled: true, + builder: (context) => StatefulBuilder( + builder: (context, setModalState) => Container( + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + const Icon(Icons.timeline, size: 24), + const SizedBox(width: 12), + Text( + l10n.locationTrail, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), - ), - ], - ), - const SizedBox(height: 20), + ], + ), + const SizedBox(height: 20), - // Trail stats + // Trail visibility toggle + SwitchListTile( + secondary: const Icon(Icons.visibility), + title: Text(l10n.showTrailOnMap), + subtitle: Text( + mapProvider.isTrailVisible + ? l10n.trailVisible + : l10n.trailHiddenRecording, + ), + value: mapProvider.isTrailVisible, + onChanged: (value) { + mapProvider.toggleTrailVisibility(); + setModalState(() {}); // Update modal UI + }, + ), + const Divider(), + const SizedBox(height: 8), + + // Trail stats if (mapProvider.currentTrail != null && mapProvider.currentTrail!.points.isNotEmpty) Container( padding: const EdgeInsets.all(12), @@ -46,19 +68,19 @@ class TrailControls extends StatelessWidget { children: [ _buildStatRow( icon: Icons.straighten, - label: 'Distance', + label: l10n.distance, value: _formatDistance(mapProvider.totalTrailDistance), ), const SizedBox(height: 8), _buildStatRow( icon: Icons.access_time, - label: 'Duration', + label: l10n.duration, value: _formatDuration(mapProvider.trailDuration), ), const SizedBox(height: 8), _buildStatRow( icon: Icons.place, - label: 'Points', + label: l10n.points, value: '${mapProvider.currentTrail!.points.length}', ), ], @@ -71,10 +93,10 @@ class TrailControls extends StatelessWidget { if (mapProvider.currentTrail != null && mapProvider.currentTrail!.points.isNotEmpty) ElevatedButton.icon( onPressed: () { - _showClearConfirmation(context, mapProvider); + _showClearConfirmation(context, mapProvider, l10n); }, icon: const Icon(Icons.delete_outline), - label: const Text('Clear Trail'), + label: Text(l10n.clearTrail), style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Colors.white, @@ -84,24 +106,24 @@ class TrailControls extends StatelessWidget { // No trail message if (mapProvider.currentTrail == null || mapProvider.currentTrail!.points.isEmpty) - const Padding( - padding: EdgeInsets.all(16), + Padding( + padding: const EdgeInsets.all(16), child: Center( child: Column( children: [ - Icon(Icons.timeline, size: 48, color: Colors.grey), - SizedBox(height: 8), + const Icon(Icons.timeline, size: 48, color: Colors.grey), + const SizedBox(height: 8), Text( - 'No trail recorded yet', - style: TextStyle( + l10n.noTrailRecorded, + style: const TextStyle( color: Colors.grey, fontSize: 16, ), ), - SizedBox(height: 8), + const SizedBox(height: 8), Text( - 'Start location tracking to record your trail', - style: TextStyle( + l10n.startTrackingToRecord, + style: const TextStyle( color: Colors.grey, fontSize: 12, ), @@ -115,28 +137,27 @@ class TrailControls extends StatelessWidget { const SizedBox(height: 8), // Close button - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('Close'), - ), - ], + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(l10n.close), + ), + ], + ), ), ), ); } - void _showClearConfirmation(BuildContext context, MapProvider mapProvider) { + void _showClearConfirmation(BuildContext context, MapProvider mapProvider, AppLocalizations l10n) { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('Clear Trail?'), - content: const Text( - 'Are you sure you want to clear the current location trail? This action cannot be undone.', - ), + title: Text(l10n.clearTrailQuestion), + content: Text(l10n.clearTrailConfirmation), actions: [ TextButton( onPressed: () => Navigator.pop(context), - child: const Text('Cancel'), + child: Text(l10n.cancel), ), TextButton( onPressed: () { @@ -145,7 +166,7 @@ class TrailControls extends StatelessWidget { Navigator.pop(context); // Close bottom sheet }, style: TextButton.styleFrom(foregroundColor: Colors.red), - child: const Text('Clear'), + child: Text(l10n.clearTrail), ), ], ), @@ -204,9 +225,10 @@ class TrailControls extends StatelessWidget { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context)!; return FloatingActionButton.small( heroTag: 'trail_controls', - tooltip: 'Trail Controls', + tooltip: l10n.trailControls, onPressed: () => _showTrailMenu(context), child: const Icon(Icons.timeline), );