diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 751c641..38d0fe1 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -12,8 +12,12 @@ import 'app_localizations_es.dart'; import 'app_localizations_fr.dart'; import 'app_localizations_hr.dart'; import 'app_localizations_it.dart'; +import 'app_localizations_pl.dart'; +import 'app_localizations_pt.dart'; import 'app_localizations_ru.dart'; import 'app_localizations_sl.dart'; +import 'app_localizations_tr.dart'; +import 'app_localizations_uk.dart'; import 'app_localizations_zh.dart'; // ignore_for_file: type=lint @@ -109,8 +113,12 @@ abstract class AppLocalizations { Locale('fr'), Locale('hr'), Locale('it'), + Locale('pl'), + Locale('pt'), Locale('ru'), Locale('sl'), + Locale('tr'), + Locale('uk'), Locale('zh'), ]; @@ -3215,8 +3223,12 @@ class _AppLocalizationsDelegate 'fr', 'hr', 'it', + 'pl', + 'pt', 'ru', 'sl', + 'tr', + 'uk', 'zh', ].contains(locale.languageCode); @@ -3241,10 +3253,18 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsHr(); case 'it': return AppLocalizationsIt(); + case 'pl': + return AppLocalizationsPl(); + case 'pt': + return AppLocalizationsPt(); case 'ru': return AppLocalizationsRu(); case 'sl': return AppLocalizationsSl(); + case 'tr': + return AppLocalizationsTr(); + case 'uk': + return AppLocalizationsUk(); case 'zh': return AppLocalizationsZh(); } diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart new file mode 100644 index 0000000..2ce1169 --- /dev/null +++ b/lib/l10n/app_localizations_pl.dart @@ -0,0 +1,1712 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Polish (`pl`). +class AppLocalizationsPl extends AppLocalizations { + AppLocalizationsPl([String locale = 'pl']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Wiadomości'; + + @override + String get contacts => 'Kontakty'; + + @override + String get map => 'Mapa'; + + @override + String get settings => 'Ustawienia'; + + @override + String get connect => 'Połącz'; + + @override + String get disconnect => 'Rozłącz'; + + @override + String get noDevicesFound => 'Nie znaleziono urządzeń'; + + @override + String get scanAgain => 'Skanuj ponownie'; + + @override + String get tapToConnect => 'Dotknij, aby połączyć'; + + @override + String get deviceNotConnected => 'Urządzenie nie jest połączone'; + + @override + String get locationPermissionDenied => 'Odmówiono dostępu do lokalizacji'; + + @override + String get locationPermissionPermanentlyDenied => + 'Location permission permanently denied. Please enable in Settings.'; + + @override + String get locationPermissionRequired => + 'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.'; + + @override + String get locationServicesDisabled => + 'Usługi lokalizacji są wyłączone. Włącz je w Ustawieniach.'; + + @override + String get failedToGetGpsLocation => 'Nie udało się pobrać lokalizacji GPS'; + + @override + String failedToAdvertise(String error) { + return 'Failed to advertise: $error'; + } + + @override + String get cancelReconnection => 'Anuluj ponowne łączenie'; + + @override + String get general => 'Ogólne'; + + @override + String get theme => 'Motyw'; + + @override + String get chooseTheme => 'Wybierz motyw'; + + @override + String get light => 'Jasny'; + + @override + String get dark => 'Ciemny'; + + @override + String get blueLightTheme => 'Blue light theme'; + + @override + String get blueDarkTheme => 'Blue dark theme'; + + @override + String get sarRed => 'SAR Red'; + + @override + String get alertEmergencyMode => 'Alert/Emergency mode'; + + @override + String get sarGreen => 'SAR Green'; + + @override + String get safeAllClearMode => 'Safe/All Clear mode'; + + @override + String get autoSystem => 'Auto (System)'; + + @override + String get followSystemTheme => 'Follow system theme'; + + @override + String get showRxTxIndicators => 'Show RX/TX Indicators'; + + @override + String get displayPacketActivity => + 'Display packet activity indicators in top bar'; + + @override + String get disableMap => 'Disable Map'; + + @override + String get disableMapDescription => + 'Hide the map tab to reduce battery usage'; + + @override + String get language => 'Język'; + + @override + String get chooseLanguage => 'Wybierz język'; + + @override + String get save => 'Zapisz'; + + @override + String get cancel => 'Anuluj'; + + @override + String get close => 'Zamknij'; + + @override + String get about => 'Informacje'; + + @override + String get appVersion => 'App Version'; + + @override + String get appName => 'App Name'; + + @override + String get aboutMeshCoreSar => 'About MeshCore SAR'; + + @override + String get aboutDescription => + 'A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use'; + + @override + String get technologiesUsed => 'Technologies Used:'; + + @override + String get technologiesList => + '• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage'; + + @override + String get moreInfo => 'More Info'; + + @override + String get packageName => 'Package Name'; + + @override + String get sampleData => 'Dane przykładowe'; + + @override + String get sampleDataDescription => + 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + + @override + String get loadSampleData => 'Wczytaj dane przykładowe'; + + @override + String get clearAllData => 'Wyczyść wszystkie dane'; + + @override + String get clearAllDataConfirmTitle => 'Clear All Data'; + + @override + String get clearAllDataConfirmMessage => + 'This will clear all contacts and SAR markers. Are you sure?'; + + @override + String get clear => 'Wyczyść'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Failed to load sample data: $error'; + } + + @override + String get allDataCleared => 'All data cleared'; + + @override + String get failedToStartBackgroundTracking => + 'Failed to start background tracking. Check permissions and BLE connection.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Location broadcast: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'; + + @override + String get noMessagesYet => 'Brak wiadomości'; + + @override + String get pullDownToSync => + 'Przeciągnij w dół, aby zsynchronizować wiadomości'; + + @override + String get deleteContact => 'Usuń kontakt'; + + @override + String get delete => 'Usuń'; + + @override + String get viewOnMap => 'Pokaż na mapie'; + + @override + String get refresh => 'Odśwież'; + + @override + String get resetPath => 'Reset Path (Re-route)'; + + @override + String get publicKeyCopied => 'Public key copied to clipboard'; + + @override + String copiedToClipboard(String label) { + return '$label copied to clipboard'; + } + + @override + String get pleaseEnterPassword => 'Wprowadź hasło'; + + @override + String failedToSyncContacts(String error) { + return 'Failed to sync contacts: $error'; + } + + @override + String get loggedInSuccessfully => + 'Zalogowano pomyślnie! Oczekiwanie na wiadomości z pokoju...'; + + @override + String get loginFailed => 'Logowanie nie powiodło się - nieprawidłowe hasło'; + + @override + String loggingIn(String roomName) { + return 'Logowanie do $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Failed to send login: $error'; + } + + @override + String get lowLocationAccuracy => 'Niska dokładność lokalizacji'; + + @override + String get continue_ => 'Kontynuuj'; + + @override + String get sendSarMarker => 'Wyślij znacznik SAR'; + + @override + String get deleteDrawing => 'Usuń rysunek'; + + @override + String get drawingTools => 'Narzędzia rysowania'; + + @override + String get drawLine => 'Rysuj linię'; + + @override + String get drawLineDesc => 'Draw a freehand line on the map'; + + @override + String get drawRectangle => 'Rysuj prostokąt'; + + @override + String get drawRectangleDesc => 'Draw a rectangular area on the map'; + + @override + String get measureDistance => 'Mierz odległość'; + + @override + String get measureDistanceDesc => 'Long press two points to measure'; + + @override + String get clearMeasurement => 'Wyczyść pomiar'; + + @override + String distanceLabel(String distance) { + return 'Distance: $distance'; + } + + @override + String get longPressForSecondPoint => 'Long press for second point'; + + @override + String get longPressToStartMeasurement => 'Long press to set first point'; + + @override + String get longPressToStartNewMeasurement => + 'Long press to start new measurement'; + + @override + String get shareDrawings => 'Udostępnij rysunki'; + + @override + String get clearAllDrawings => 'Wyczyść wszystkie rysunki'; + + @override + String get completeLine => 'Complete Line'; + + @override + String broadcastDrawingsToTeam(int count, String plural) { + return 'Broadcast $count drawing$plural to team'; + } + + @override + String removeAllDrawings(int count, String plural) { + return 'Remove all $count drawing$plural'; + } + + @override + String deleteAllDrawingsConfirm(int count, String plural) { + return 'Delete all $count drawing$plural from the map?'; + } + + @override + String get drawing => 'Rysunek'; + + @override + String shareDrawingsCount(int count, String plural) { + return 'Share $count Drawing$plural'; + } + + @override + String get showReceivedDrawings => 'Pokaż odebrane rysunki'; + + @override + String get showingAllDrawings => 'Showing all drawings'; + + @override + String get showingOnlyYourDrawings => 'Showing only your drawings'; + + @override + String get showSarMarkers => 'Pokaż znaczniki SAR'; + + @override + String get showingSarMarkers => 'Showing SAR markers'; + + @override + String get hidingSarMarkers => 'Hiding SAR markers'; + + @override + String get clearAll => 'Wyczyść wszystko'; + + @override + String get publicChannel => 'Kanał publiczny'; + + @override + String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + + @override + String get storedPermanently => 'Stored permanently in room'; + + @override + String get notConnectedToDevice => 'Brak połączenia z urządzeniem'; + + @override + String get typeYourMessage => 'Wpisz wiadomość...'; + + @override + String get quickLocationMarker => 'Szybki znacznik lokalizacji'; + + @override + String get markerType => 'Typ znacznika'; + + @override + String get sendTo => 'Wyślij do'; + + @override + String get noDestinationsAvailable => 'No destinations available.'; + + @override + String get selectDestination => 'Wybierz odbiorcę...'; + + @override + String get ephemeralBroadcastInfo => + 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + + @override + String get persistentRoomInfo => + 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + + @override + String get location => 'Lokalizacja'; + + @override + String get fromMap => 'From Map'; + + @override + String get gettingLocation => 'Pobieranie lokalizacji...'; + + @override + String get locationError => 'Błąd lokalizacji'; + + @override + String get retry => 'Ponów'; + + @override + String get refreshLocation => 'Odśwież lokalizację'; + + @override + String accuracyMeters(int accuracy) { + return 'Accuracy: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notatki (opcjonalnie)'; + + @override + String get addAdditionalInformation => 'Add additional information...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + } + + @override + String get loginToRoom => 'Zaloguj do pokoju'; + + @override + String get enterPasswordInfo => + 'Enter the password to access this room. The password will be saved for future use.'; + + @override + String get password => 'Hasło'; + + @override + String get enterRoomPassword => 'Wpisz hasło pokoju'; + + @override + String get loggingInDots => 'Logowanie...'; + + @override + String get login => 'Zaloguj'; + + @override + String failedToAddRoom(String error) { + return 'Failed to add room to device: $error\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'; + } + + @override + String get direct => 'Bezpośrednie'; + + @override + String get flood => 'Flood'; + + @override + String get loggedIn => 'Zalogowano'; + + @override + String get noGpsData => 'Brak danych GPS'; + + @override + String get distance => 'Odległość'; + + @override + String directPingTimeout(String name) { + return 'Direct ping timeout - retrying $name with flooding...'; + } + + @override + String pingFailed(String name) { + return 'Ping failed to $name - no response received'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Are you sure you want to delete \"$name\"?\n\nThis will remove the contact from both the app and the companion radio device.'; + } + + @override + String failedToRemoveContact(String error) { + return 'Failed to remove contact: $error'; + } + + @override + String get type => 'Typ'; + + @override + String get publicKey => 'Klucz publiczny'; + + @override + String get lastSeen => 'Ostatnio widziany'; + + @override + String get roomStatus => 'Status pokoju'; + + @override + String get loginStatus => 'Status logowania'; + + @override + String get notLoggedIn => 'Niezalogowany'; + + @override + String get adminAccess => 'Admin Access'; + + @override + String get yes => 'Tak'; + + @override + String get no => 'Nie'; + + @override + String get permissions => 'Uprawnienia'; + + @override + String get passwordSaved => 'Password Saved'; + + @override + String get locationColon => 'Location:'; + + @override + String get telemetry => 'Telemetria'; + + @override + String get voltage => 'Napięcie'; + + @override + String get battery => 'Bateria'; + + @override + String get temperature => 'Temperatura'; + + @override + String get humidity => 'Wilgotność'; + + @override + String get pressure => 'Ciśnienie'; + + @override + String get gpsTelemetry => 'GPS (Telemetry)'; + + @override + String get updated => 'Zaktualizowano'; + + @override + String pathResetInfo(String name) { + return 'Path reset for $name. Next message will find a new route.'; + } + + @override + String get reLoginToRoom => 'Re-Login to Room'; + + @override + String get heading => 'Kierunek'; + + @override + String get elevation => 'Wysokość'; + + @override + String get accuracy => 'Dokładność'; + + @override + String get bearing => 'Namiar'; + + @override + String get direction => 'Kierunek'; + + @override + String get filterMarkers => 'Filtruj znaczniki'; + + @override + String get filterMarkersTooltip => 'Filter markers'; + + @override + String get contactsFilter => 'Kontakty'; + + @override + String get repeatersFilter => 'Przekaźniki'; + + @override + String get sarMarkers => 'Znaczniki SAR'; + + @override + String get foundPerson => 'Odnaleziona osoba'; + + @override + String get fire => 'Pożar'; + + @override + String get stagingArea => 'Punkt zbiórki'; + + @override + String get showAll => 'Pokaż wszystko'; + + @override + String get locationUnavailable => 'Lokalizacja niedostępna'; + + @override + String get ahead => 'ahead'; + + @override + String degreesRight(int degrees) { + return '$degrees° right'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° left'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Brak kontaktów'; + + @override + String get connectToDeviceToLoadContacts => + 'Connect to a device to load contacts'; + + @override + String get teamMembers => 'Członkowie zespołu'; + + @override + String get repeaters => 'Przekaźniki'; + + @override + String get rooms => 'Pokoje'; + + @override + String get channels => 'Kanały'; + + @override + String get selectMapLayer => 'Wybierz warstwę mapy'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'Satelita ESRI'; + + @override + String get googleHybrid => 'Google Hybrydowa'; + + @override + String get googleRoadmap => 'Google Drogowa'; + + @override + String get googleTerrain => 'Google Teren'; + + @override + String get dragToPosition => 'Drag to Position'; + + @override + String get createSarMarker => 'Utwórz znacznik SAR'; + + @override + String get compass => 'Kompas'; + + @override + String get navigationAndContacts => 'Navigation & Contacts'; + + @override + String get sarAlert => 'ALERT SAR'; + + @override + String get textCopiedToClipboard => 'Text copied to clipboard'; + + @override + String get cannotReplySenderMissing => + 'Cannot reply: sender information missing'; + + @override + String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + + @override + String get copyText => 'Kopiuj tekst'; + + @override + String get saveAsTemplate => 'Save as Template'; + + @override + String get templateSaved => 'Template saved successfully'; + + @override + String get templateAlreadyExists => 'Template with this emoji already exists'; + + @override + String get deleteMessage => 'Usuń wiadomość'; + + @override + String get deleteMessageConfirmation => + 'Are you sure you want to delete this message?'; + + @override + String get shareLocation => 'Udostępnij lokalizację'; + + @override + String shareLocationText( + String markerInfo, + String lat, + String lon, + String url, + ) { + return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + } + + @override + String get sarLocationShare => 'SAR Location'; + + @override + String get justNow => 'Przed chwilą'; + + @override + String minutesAgo(int minutes) { + return '$minutes min temu'; + } + + @override + String hoursAgo(int hours) { + return '$hours godz. temu'; + } + + @override + String daysAgo(int days) { + return '$days dni temu'; + } + + @override + String secondsAgo(int seconds) { + return '$seconds sek. temu'; + } + + @override + String get sending => 'Wysyłanie...'; + + @override + String get sent => 'Wysłano'; + + @override + String get delivered => 'Dostarczono'; + + @override + String deliveredWithTime(int time) { + return 'Delivered (${time}ms)'; + } + + @override + String get failed => 'Niepowodzenie'; + + @override + String get broadcast => 'Nadawanie'; + + @override + String deliveredToContacts(int delivered, int total) { + return 'Delivered to $delivered/$total contacts'; + } + + @override + String get allDelivered => 'All delivered'; + + @override + String get recipientDetails => 'Recipient Details'; + + @override + String get pending => 'Oczekujące'; + + @override + String get sarMarkerFoundPerson => 'Found Person'; + + @override + String get sarMarkerFire => 'Fire Location'; + + @override + String get sarMarkerStagingArea => 'Staging Area'; + + @override + String get sarMarkerObject => 'Object Found'; + + @override + String get from => 'Od'; + + @override + String get coordinates => 'Współrzędne'; + + @override + String get tapToViewOnMap => 'Dotknij, aby zobaczyć na mapie'; + + @override + String get radioSettings => 'Ustawienia radia'; + + @override + String get frequencyMHz => 'Częstotliwość (MHz)'; + + @override + String get frequencyExample => 'e.g., 869.618'; + + @override + String get bandwidth => 'Szerokość pasma'; + + @override + String get spreadingFactor => 'Współczynnik rozpraszania'; + + @override + String get codingRate => 'Szybkość kodowania'; + + @override + String get txPowerDbm => 'Moc TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Maks: $power dBm'; + } + + @override + String get you => 'Ty'; + + @override + String exportFailed(String error) { + return 'Eksport nie powiódł się: $error'; + } + + @override + String importFailed(String error) { + return 'Import nie powiódł się: $error'; + } + + @override + String get unknown => 'Nieznane'; + + @override + String get onlineLayers => 'Warstwy online'; + + @override + String get locationTrail => 'Ślad lokalizacji'; + + @override + String get showTrailOnMap => 'Pokaż ślad na mapie'; + + @override + String get trailVisible => 'Trail is visible on the map'; + + @override + String get trailHiddenRecording => 'Trail is hidden (still recording)'; + + @override + String get duration => 'Czas trwania'; + + @override + String get points => 'Punkty'; + + @override + String get clearTrail => 'Wyczyść ślad'; + + @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 => 'Brak zapisanego śladu'; + + @override + String get startTrackingToRecord => + 'Start location tracking to record your trail'; + + @override + String get trailControls => 'Sterowanie śladem'; + + @override + String get contactTrails => 'Ślady kontaktów'; + + @override + String get showAllContactTrails => 'Show All Contact Trails'; + + @override + String get noContactsWithLocationHistory => + 'No contacts with location history'; + + @override + String showingTrailsForContacts(int count) { + return 'Showing trails for $count contacts'; + } + + @override + String get individualContactTrails => 'Individual Contact Trails'; + + @override + String get deviceInformation => 'Informacje o urządzeniu'; + + @override + String get bleName => 'Nazwa BLE'; + + @override + String get meshName => 'Nazwa mesh'; + + @override + String get notSet => 'Nie ustawiono'; + + @override + String get model => 'Model'; + + @override + String get version => 'Wersja'; + + @override + String get buildDate => 'Data kompilacji'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Maks. kontaktów'; + + @override + String get maxChannels => 'Maks. kanałów'; + + @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 => 'Szer.'; + + @override + String get lon => 'Dł.'; + + @override + String get useCurrentLocation => 'Użyj bieżącej lokalizacji'; + + @override + String get noneUnknown => 'None/Unknown'; + + @override + String get chatNode => 'Chat Node'; + + @override + String get repeater => 'Przekaźnik'; + + @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'; + } + + @override + String get sarTemplates => 'Szablony SAR'; + + @override + String get manageSarTemplates => 'Manage cursor on target templates'; + + @override + String get addTemplate => 'Dodaj szablon'; + + @override + String get editTemplate => 'Edytuj szablon'; + + @override + String get deleteTemplate => 'Usuń szablon'; + + @override + String get templateName => 'Nazwa szablonu'; + + @override + String get templateNameHint => 'np. Odnaleziona osoba'; + + @override + String get templateEmoji => 'Emoji'; + + @override + String get emojiRequired => 'Emoji jest wymagane'; + + @override + String get nameRequired => 'Nazwa jest wymagana'; + + @override + String get templateDescription => 'Opis (opcjonalnie)'; + + @override + String get templateDescriptionHint => 'Dodaj dodatkowy kontekst...'; + + @override + String get templateColor => 'Kolor'; + + @override + String get previewFormat => 'Podgląd (format wiadomości SAR)'; + + @override + String get importFromClipboard => 'Importuj'; + + @override + String get exportToClipboard => 'Eksportuj'; + + @override + String deleteTemplateConfirmation(String name) { + return 'Delete template \'$name\'?'; + } + + @override + String get templateAdded => 'Dodano szablon'; + + @override + String get templateUpdated => 'Zaktualizowano szablon'; + + @override + String get templateDeleted => 'Usunięto szablon'; + + @override + String templatesImported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Imported $count templates', + one: 'Imported 1 template', + zero: 'No templates imported', + ); + return '$_temp0'; + } + + @override + String templatesExported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Exported $count templates to clipboard', + one: 'Exported 1 template to clipboard', + ); + return '$_temp0'; + } + + @override + String get resetToDefaults => 'Przywróć domyślne'; + + @override + String get resetToDefaultsConfirmation => + 'This will delete all custom templates and restore the 4 default templates. Continue?'; + + @override + String get reset => 'Resetuj'; + + @override + String get resetComplete => 'Templates reset to defaults'; + + @override + String get noTemplates => 'Brak dostępnych szablonów'; + + @override + String get tapAddToCreate => 'Dotknij +, aby utworzyć pierwszy szablon'; + + @override + String get ok => 'OK'; + + @override + String get permissionsSection => 'Uprawnienia'; + + @override + String get locationPermission => 'Uprawnienie lokalizacji'; + + @override + String get checking => 'Sprawdzanie...'; + + @override + String get locationPermissionGrantedAlways => 'Granted (Always)'; + + @override + String get locationPermissionGrantedWhileInUse => 'Granted (While In Use)'; + + @override + String get locationPermissionDeniedTapToRequest => 'Denied - Tap to request'; + + @override + String get locationPermissionPermanentlyDeniedOpenSettings => + 'Permanently Denied - Open Settings'; + + @override + String get locationPermissionDialogContent => + 'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'; + + @override + String get openSettings => 'Otwórz ustawienia'; + + @override + String get locationPermissionGranted => 'Przyznano uprawnienie lokalizacji!'; + + @override + String get locationPermissionRequiredForGps => + 'Location permission is required for GPS tracking and location sharing.'; + + @override + String get locationPermissionAlreadyGranted => + 'Location permission is already granted.'; + + @override + String get sarNavyBlue => 'SAR Navy Blue'; + + @override + String get sarNavyBlueDescription => 'Professional/Operations Mode'; + + @override + String get selectRecipient => 'Wybierz odbiorcę'; + + @override + String get broadcastToAllNearby => 'Broadcast to all nearby'; + + @override + String get searchRecipients => 'Szukaj odbiorców...'; + + @override + String get noContactsFound => 'Nie znaleziono kontaktów'; + + @override + String get noRoomsFound => 'Nie znaleziono pokoi'; + + @override + String get noRecipientsAvailable => 'Brak dostępnych odbiorców'; + + @override + String get noChannelsFound => 'Nie znaleziono kanałów'; + + @override + String get newMessage => 'Nowa wiadomość'; + + @override + String get channel => 'Kanał'; + + @override + String get samplePoliceLead => 'Police Lead'; + + @override + String get sampleDroneOperator => 'Drone Operator'; + + @override + String get sampleFirefighterAlpha => 'Firefighter'; + + @override + String get sampleMedicCharlie => 'Medic'; + + @override + String get sampleCommandDelta => 'Command'; + + @override + String get sampleFireEngine => 'Fire Engine'; + + @override + String get sampleAirSupport => 'Air Support'; + + @override + String get sampleBaseCoordinator => 'Base Coordinator'; + + @override + String get channelEmergency => 'Alarmowy'; + + @override + String get channelCoordination => 'Koordynacja'; + + @override + String get channelUpdates => 'Aktualizacje'; + + @override + String get sampleTeamMember => 'Sample Team Member'; + + @override + String get sampleScout => 'Sample Scout'; + + @override + String get sampleBase => 'Sample Base'; + + @override + String get sampleSearcher => 'Sample Searcher'; + + @override + String get sampleObjectBackpack => ' Backpack found - blue color'; + + @override + String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + + @override + String get sampleObjectCamping => ' Camping equipment discovered'; + + @override + String get sampleObjectTrailMarker => ' Trail marker found off-path'; + + @override + String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + + @override + String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + + @override + String get sampleMsgBaseCamp => 'Base camp established at staging area'; + + @override + String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + + @override + String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + + @override + String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + + @override + String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + + @override + String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + + @override + String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + + @override + String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + + @override + String get sampleMsgTeamCharlie => 'Team requesting backup'; + + @override + String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + + @override + String get sampleMsgUrgentMedical => + 'URGENT: Medical assistance needed at sector 4'; + + @override + String get sampleMsgAdultMale => ' Adult male, conscious'; + + @override + String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + + @override + String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + + @override + String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + + @override + String get sampleMsgMedicalTeamEnRoute => + 'Medical team en route to your location'; + + @override + String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + + @override + String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + + @override + String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + + @override + String get sampleMsgEmergencyServices => + 'Emergency services notified and responding'; + + @override + String get sampleAlphaTeamLead => 'Team Lead'; + + @override + String get sampleBravoScout => 'Scout'; + + @override + String get sampleCharlieMedic => 'Medic'; + + @override + String get sampleDeltaNavigator => 'Navigator'; + + @override + String get sampleEchoSupport => 'Support'; + + @override + String get sampleBaseCommand => 'Base Command'; + + @override + String get sampleFieldCoordinator => 'Field Coordinator'; + + @override + String get sampleMedicalTeam => 'Medical Team'; + + @override + String get mapDrawing => 'Rysunek mapy'; + + @override + String get navigateToDrawing => 'Navigate to Drawing'; + + @override + String get copyCoordinates => 'Kopiuj współrzędne'; + + @override + String get hideFromMap => 'Ukryj na mapie'; + + @override + String get lineDrawing => 'Rysunek linii'; + + @override + String get rectangleDrawing => 'Rysunek prostokąta'; + + @override + String get manualCoordinates => 'Współrzędne ręczne'; + + @override + String get enterCoordinatesManually => 'Wprowadź współrzędne ręcznie'; + + @override + String get latitudeLabel => 'Szerokość geograficzna'; + + @override + String get longitudeLabel => 'Długość geograficzna'; + + @override + String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + + @override + String get shareDrawing => 'Udostępnij rysunek'; + + @override + String get shareWithAllNearbyDevices => 'Share with all nearby devices'; + + @override + String get shareToRoom => 'Share to Room'; + + @override + String get sendToPersistentStorage => 'Send to persistent room storage'; + + @override + String get deleteDrawingConfirm => + 'Are you sure you want to delete this drawing?'; + + @override + String get drawingDeleted => 'Drawing deleted'; + + @override + String yourDrawingsCount(int count) { + return 'Your Drawings ($count)'; + } + + @override + String get shared => 'Shared'; + + @override + String get line => 'Linia'; + + @override + String get rectangle => 'Prostokąt'; + + @override + String get updateAvailable => 'Dostępna aktualizacja'; + + @override + String get currentVersion => 'Bieżąca'; + + @override + String get latestVersion => 'Najnowsza'; + + @override + String get downloadUpdate => 'Pobierz'; + + @override + String get updateLater => 'Później'; + + @override + String get cadastralParcels => 'Cadastral Parcels'; + + @override + String get forestRoads => 'Forest Roads'; + + @override + String get wmsOverlays => 'WMS Overlays'; + + @override + String get hikingTrails => 'Hiking Trails'; + + @override + String get mainRoads => 'Main Roads'; + + @override + String get houseNumbers => 'House Numbers'; + + @override + String get fireHazardZones => 'Fire Hazard Zones'; + + @override + String get historicalFires => 'Historical Fires'; + + @override + String get firebreaks => 'Firebreaks'; + + @override + String get krasFireZones => 'Kras Fire Zones'; + + @override + String get placeNames => 'Place Names'; + + @override + String get municipalityBorders => 'Municipality Borders'; + + @override + String get topographicMap => 'Topographic Map 1:25000'; + + @override + String get recentMessages => 'Ostatnie wiadomości'; + + @override + String get addChannel => 'Dodaj kanał'; + + @override + String get channelName => 'Nazwa kanału'; + + @override + String get channelNameHint => 'np. Zespół Ratunkowy Alfa'; + + @override + String get channelSecret => 'Sekret kanału'; + + @override + String get channelSecretHint => 'Wspólne hasło dla tego kanału'; + + @override + String get channelSecretHelp => + 'This secret must be shared with all team members who need access to this channel'; + + @override + String get channelTypesInfo => + 'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'; + + @override + String get hashChannelInfo => + 'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'; + + @override + String get channelNameRequired => 'Channel name is required'; + + @override + String get channelNameTooLong => 'Channel name must be 31 characters or less'; + + @override + String get channelSecretRequired => 'Channel secret is required'; + + @override + String get channelSecretTooLong => + 'Channel secret must be 32 characters or less'; + + @override + String get invalidAsciiCharacters => 'Only ASCII characters are allowed'; + + @override + String get channelCreatedSuccessfully => 'Channel created successfully'; + + @override + String channelCreationFailed(String error) { + return 'Failed to create channel: $error'; + } + + @override + String get deleteChannel => 'Delete Channel'; + + @override + String deleteChannelConfirmation(String channelName) { + return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + } + + @override + String get channelDeletedSuccessfully => 'Channel deleted successfully'; + + @override + String channelDeletionFailed(String error) { + return 'Failed to delete channel: $error'; + } + + @override + String get createChannel => 'Utwórz kanał'; + + @override + String get wizardBack => 'Wstecz'; + + @override + String get wizardSkip => 'Pomiń'; + + @override + String get wizardNext => 'Dalej'; + + @override + String get wizardGetStarted => 'Zaczynaj'; + + @override + String get wizardWelcomeTitle => 'Witamy w MeshCore SAR'; + + @override + String get wizardWelcomeDescription => + 'A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.'; + + @override + String get wizardConnectingTitle => 'Łączenie z radiem'; + + @override + String get wizardConnectingDescription => + 'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'; + + @override + String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + + @override + String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + + @override + String get wizardConnectingFeature3 => + 'Works completely offline - no internet required'; + + @override + String get wizardChannelTitle => 'Kanały'; + + @override + String get wizardChannelDescription => + 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + + @override + String get wizardChannelFeature1 => + 'Public Channel for general team communication'; + + @override + String get wizardChannelFeature2 => + 'Create custom channels for specific groups'; + + @override + String get wizardChannelFeature3 => + 'Messages are automatically relayed by the mesh'; + + @override + String get wizardContactsTitle => 'Kontakty'; + + @override + String get wizardContactsDescription => + 'Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.'; + + @override + String get wizardContactsFeature1 => 'Contacts discovered automatically'; + + @override + String get wizardContactsFeature2 => 'Send private direct messages'; + + @override + String get wizardContactsFeature3 => 'View battery level and last seen time'; + + @override + String get wizardMapTitle => 'Mapa i lokalizacja'; + + @override + String get wizardMapDescription => + 'Track your team in real-time and mark important locations for search and rescue operations.'; + + @override + String get wizardMapFeature1 => + 'SAR markers for found persons, fires, and staging areas'; + + @override + String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + + @override + String get wizardMapFeature3 => 'Download offline maps for remote areas'; + + @override + String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + + @override + String get viewWelcomeTutorial => 'Pokaż samouczek powitalny'; + + @override + String get allTeamContacts => 'Wszystkie kontakty zespołu'; + + @override + String directMessagesInfo(int count) { + return 'Direct messages with ACKs. Sent to $count team members.'; + } + + @override + String sarMarkerSentToContacts(int count) { + return 'SAR marker sent to $count contacts'; + } + + @override + String get noContactsAvailable => 'Brak kontaktów zespołu'; + + @override + String get reply => 'Odpowiedz'; + + @override + String get technicalDetails => 'Szczegóły techniczne'; + + @override + String get messageTechnicalDetails => 'Message technical details'; + + @override + String get linkQuality => 'Link quality'; + + @override + String get delivery => 'Delivery'; + + @override + String get status => 'Status'; + + @override + String get expectedAckTag => 'Expected ACK tag'; + + @override + String get roundTrip => 'Round-trip'; + + @override + String get retryAttempt => 'Retry attempt'; + + @override + String get floodFallback => 'Flood fallback'; + + @override + String get identity => 'Identity'; + + @override + String get messageId => 'Message ID'; + + @override + String get sender => 'Sender'; + + @override + String get senderKey => 'Sender key'; + + @override + String get recipient => 'Recipient'; + + @override + String get recipientKey => 'Recipient key'; + + @override + String get voice => 'Głos'; + + @override + String get voiceId => 'Voice ID'; + + @override + String get envelope => 'Envelope'; + + @override + String get sessionProgress => 'Session progress'; + + @override + String get complete => 'Zakończono'; + + @override + String get rawDump => 'Raw dump'; + + @override + String get cannotRetryMissingRecipient => + 'Cannot retry: recipient information missing'; + + @override + String get voiceUnavailable => 'Głos jest obecnie niedostępny'; + + @override + String get requestingVoice => 'Requesting voice'; +} diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart new file mode 100644 index 0000000..9e88a77 --- /dev/null +++ b/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,1721 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Mensagens'; + + @override + String get contacts => 'Contatos'; + + @override + String get map => 'Mapa'; + + @override + String get settings => 'Configurações'; + + @override + String get connect => 'Conectar'; + + @override + String get disconnect => 'Desconectar'; + + @override + String get noDevicesFound => 'Nenhum dispositivo encontrado'; + + @override + String get scanAgain => 'Escanear novamente'; + + @override + String get tapToConnect => 'Toque para conectar'; + + @override + String get deviceNotConnected => 'Dispositivo não conectado'; + + @override + String get locationPermissionDenied => 'Permissão de localização negada'; + + @override + String get locationPermissionPermanentlyDenied => + 'Permissão de localização negada permanentemente. Ative-a em Configurações.'; + + @override + String get locationPermissionRequired => + 'A permissão de localização é necessária para rastreamento GPS e coordenação da equipe. Você pode ativá-la depois em Configurações.'; + + @override + String get locationServicesDisabled => + 'Os serviços de localização estão desativados. Ative-os em Configurações.'; + + @override + String get failedToGetGpsLocation => 'Falha ao obter localização GPS'; + + @override + String failedToAdvertise(String error) { + return 'Falha ao anunciar: $error'; + } + + @override + String get cancelReconnection => 'Cancelar reconexão'; + + @override + String get general => 'Geral'; + + @override + String get theme => 'Tema'; + + @override + String get chooseTheme => 'Escolher tema'; + + @override + String get light => 'Claro'; + + @override + String get dark => 'Escuro'; + + @override + String get blueLightTheme => 'Tema azul claro'; + + @override + String get blueDarkTheme => 'Tema azul escuro'; + + @override + String get sarRed => 'SAR Vermelho'; + + @override + String get alertEmergencyMode => 'Modo de alerta/emergência'; + + @override + String get sarGreen => 'SAR Verde'; + + @override + String get safeAllClearMode => 'Modo seguro/tudo limpo'; + + @override + String get autoSystem => 'Automático (Sistema)'; + + @override + String get followSystemTheme => 'Seguir tema do sistema'; + + @override + String get showRxTxIndicators => 'Mostrar indicadores RX/TX'; + + @override + String get displayPacketActivity => + 'Exibir indicadores de atividade de pacotes na barra superior'; + + @override + String get disableMap => 'Desativar mapa'; + + @override + String get disableMapDescription => + 'Ocultar a aba de mapa para reduzir o uso de bateria'; + + @override + String get language => 'Idioma'; + + @override + String get chooseLanguage => 'Escolher idioma'; + + @override + String get save => 'Salvar'; + + @override + String get cancel => 'Cancelar'; + + @override + String get close => 'Fechar'; + + @override + String get about => 'Sobre'; + + @override + String get appVersion => 'Versão do app'; + + @override + String get appName => 'Nome do app'; + + @override + String get aboutMeshCoreSar => 'About MeshCore SAR'; + + @override + String get aboutDescription => + 'A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use'; + + @override + String get technologiesUsed => 'Technologies Used:'; + + @override + String get technologiesList => + '• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage'; + + @override + String get moreInfo => 'Mais informações'; + + @override + String get packageName => 'Package Name'; + + @override + String get sampleData => 'Dados de exemplo'; + + @override + String get sampleDataDescription => + 'Carregar ou limpar contatos, mensagens de canal e marcadores SAR de exemplo para testes'; + + @override + String get loadSampleData => 'Carregar dados de exemplo'; + + @override + String get clearAllData => 'Limpar todos os dados'; + + @override + String get clearAllDataConfirmTitle => 'Limpar todos os dados'; + + @override + String get clearAllDataConfirmMessage => + 'Isso limpará todos os contatos e marcadores SAR. Tem certeza?'; + + @override + String get clear => 'Limpar'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Falha ao carregar dados de exemplo: $error'; + } + + @override + String get allDataCleared => 'Todos os dados foram limpos'; + + @override + String get failedToStartBackgroundTracking => + 'Falha ao iniciar rastreamento em segundo plano. Verifique permissões e conexão BLE.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Transmissão de localização: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'; + + @override + String get noMessagesYet => 'Ainda não há mensagens'; + + @override + String get pullDownToSync => 'Puxe para baixo para sincronizar mensagens'; + + @override + String get deleteContact => 'Excluir contato'; + + @override + String get delete => 'Excluir'; + + @override + String get viewOnMap => 'Ver no mapa'; + + @override + String get refresh => 'Atualizar'; + + @override + String get resetPath => 'Redefinir rota'; + + @override + String get publicKeyCopied => + 'Chave pública copiada para a área de transferência'; + + @override + String copiedToClipboard(String label) { + return '$label copiado para a área de transferência'; + } + + @override + String get pleaseEnterPassword => 'Digite uma senha'; + + @override + String failedToSyncContacts(String error) { + return 'Falha ao sincronizar contatos: $error'; + } + + @override + String get loggedInSuccessfully => + 'Login realizado com sucesso! Aguardando mensagens da sala...'; + + @override + String get loginFailed => 'Falha no login - senha incorreta'; + + @override + String loggingIn(String roomName) { + return 'Entrando em $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Falha ao enviar login: $error'; + } + + @override + String get lowLocationAccuracy => 'Baixa precisão de localização'; + + @override + String get continue_ => 'Continuar'; + + @override + String get sendSarMarker => 'Enviar marcador SAR'; + + @override + String get deleteDrawing => 'Excluir desenho'; + + @override + String get drawingTools => 'Ferramentas de desenho'; + + @override + String get drawLine => 'Desenhar linha'; + + @override + String get drawLineDesc => 'Desenhar uma linha livre no mapa'; + + @override + String get drawRectangle => 'Desenhar retângulo'; + + @override + String get drawRectangleDesc => 'Desenhar uma área retangular no mapa'; + + @override + String get measureDistance => 'Medir distância'; + + @override + String get measureDistanceDesc => + 'Pressione longamente dois pontos para medir'; + + @override + String get clearMeasurement => 'Limpar medição'; + + @override + String distanceLabel(String distance) { + return 'Distância: $distance'; + } + + @override + String get longPressForSecondPoint => + 'Pressione longamente para o segundo ponto'; + + @override + String get longPressToStartMeasurement => + 'Pressione longamente para definir o primeiro ponto'; + + @override + String get longPressToStartNewMeasurement => + 'Long press to start new measurement'; + + @override + String get shareDrawings => 'Compartilhar desenhos'; + + @override + String get clearAllDrawings => 'Limpar todos os desenhos'; + + @override + String get completeLine => 'Concluir linha'; + + @override + String broadcastDrawingsToTeam(int count, String plural) { + return 'Broadcast $count drawing$plural to team'; + } + + @override + String removeAllDrawings(int count, String plural) { + return 'Remove all $count drawing$plural'; + } + + @override + String deleteAllDrawingsConfirm(int count, String plural) { + return 'Delete all $count drawing$plural from the map?'; + } + + @override + String get drawing => 'Desenho'; + + @override + String shareDrawingsCount(int count, String plural) { + return 'Share $count Drawing$plural'; + } + + @override + String get showReceivedDrawings => 'Mostrar desenhos recebidos'; + + @override + String get showingAllDrawings => 'Mostrando todos os desenhos'; + + @override + String get showingOnlyYourDrawings => 'Mostrando apenas seus desenhos'; + + @override + String get showSarMarkers => 'Mostrar marcadores SAR'; + + @override + String get showingSarMarkers => 'Mostrando marcadores SAR'; + + @override + String get hidingSarMarkers => 'Ocultando marcadores SAR'; + + @override + String get clearAll => 'Limpar tudo'; + + @override + String get publicChannel => 'Canal público'; + + @override + String get broadcastToAll => 'Transmitir para todos os nós próximos'; + + @override + String get storedPermanently => 'Armazenado permanentemente na sala'; + + @override + String get notConnectedToDevice => 'Não conectado ao dispositivo'; + + @override + String get typeYourMessage => 'Digite sua mensagem...'; + + @override + String get quickLocationMarker => 'Marcador rápido de localização'; + + @override + String get markerType => 'Tipo de marcador'; + + @override + String get sendTo => 'Enviar para'; + + @override + String get noDestinationsAvailable => 'Nenhum destino disponível.'; + + @override + String get selectDestination => 'Selecione o destino...'; + + @override + String get ephemeralBroadcastInfo => + 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + + @override + String get persistentRoomInfo => + 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + + @override + String get location => 'Localização'; + + @override + String get fromMap => 'Do mapa'; + + @override + String get gettingLocation => 'Obtendo localização...'; + + @override + String get locationError => 'Erro de localização'; + + @override + String get retry => 'Tentar novamente'; + + @override + String get refreshLocation => 'Atualizar localização'; + + @override + String accuracyMeters(int accuracy) { + return 'Precisão: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notas (opcional)'; + + @override + String get addAdditionalInformation => 'Adicionar informações extras...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + } + + @override + String get loginToRoom => 'Entrar na sala'; + + @override + String get enterPasswordInfo => + 'Enter the password to access this room. The password will be saved for future use.'; + + @override + String get password => 'Senha'; + + @override + String get enterRoomPassword => 'Digite a senha da sala'; + + @override + String get loggingInDots => 'Entrando...'; + + @override + String get login => 'Entrar'; + + @override + String failedToAddRoom(String error) { + return 'Failed to add room to device: $error\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'; + } + + @override + String get direct => 'Direto'; + + @override + String get flood => 'Inundação'; + + @override + String get loggedIn => 'Conectado'; + + @override + String get noGpsData => 'Sem dados GPS'; + + @override + String get distance => 'Distância'; + + @override + String directPingTimeout(String name) { + return 'Direct ping timeout - retrying $name with flooding...'; + } + + @override + String pingFailed(String name) { + return 'Falha no ping para $name - nenhuma resposta recebida'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Are you sure you want to delete \"$name\"?\n\nThis will remove the contact from both the app and the companion radio device.'; + } + + @override + String failedToRemoveContact(String error) { + return 'Falha ao remover contato: $error'; + } + + @override + String get type => 'Tipo'; + + @override + String get publicKey => 'Chave pública'; + + @override + String get lastSeen => 'Visto por último'; + + @override + String get roomStatus => 'Status da sala'; + + @override + String get loginStatus => 'Status do login'; + + @override + String get notLoggedIn => 'Não conectado'; + + @override + String get adminAccess => 'Acesso de administrador'; + + @override + String get yes => 'Sim'; + + @override + String get no => 'Não'; + + @override + String get permissions => 'Permissões'; + + @override + String get passwordSaved => 'Senha salva'; + + @override + String get locationColon => 'Localização:'; + + @override + String get telemetry => 'Telemetria'; + + @override + String get voltage => 'Voltagem'; + + @override + String get battery => 'Bateria'; + + @override + String get temperature => 'Temperatura'; + + @override + String get humidity => 'Umidade'; + + @override + String get pressure => 'Pressão'; + + @override + String get gpsTelemetry => 'GPS (telemetria)'; + + @override + String get updated => 'Atualizado'; + + @override + String pathResetInfo(String name) { + return 'Path reset for $name. Next message will find a new route.'; + } + + @override + String get reLoginToRoom => 'Entrar novamente na sala'; + + @override + String get heading => 'Direção'; + + @override + String get elevation => 'Elevação'; + + @override + String get accuracy => 'Precisão'; + + @override + String get bearing => 'Rumo'; + + @override + String get direction => 'Direção'; + + @override + String get filterMarkers => 'Filtrar marcadores'; + + @override + String get filterMarkersTooltip => 'Filter markers'; + + @override + String get contactsFilter => 'Contatos'; + + @override + String get repeatersFilter => 'Repetidores'; + + @override + String get sarMarkers => 'Marcadores SAR'; + + @override + String get foundPerson => 'Pessoa encontrada'; + + @override + String get fire => 'Incêndio'; + + @override + String get stagingArea => 'Área de apoio'; + + @override + String get showAll => 'Mostrar tudo'; + + @override + String get locationUnavailable => 'Localização indisponível'; + + @override + String get ahead => 'à frente'; + + @override + String degreesRight(int degrees) { + return '$degrees° à direita'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° à esquerda'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Ainda não há contatos'; + + @override + String get connectToDeviceToLoadContacts => + 'Conecte-se a um dispositivo para carregar contatos'; + + @override + String get teamMembers => 'Membros da equipe'; + + @override + String get repeaters => 'Repetidores'; + + @override + String get rooms => 'Salas'; + + @override + String get channels => 'Canais'; + + @override + String get selectMapLayer => 'Selecionar camada do mapa'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'Satélite ESRI'; + + @override + String get googleHybrid => 'Google Híbrido'; + + @override + String get googleRoadmap => 'Google Mapa'; + + @override + String get googleTerrain => 'Google Terreno'; + + @override + String get dragToPosition => 'Arraste para a posição'; + + @override + String get createSarMarker => 'Criar marcador SAR'; + + @override + String get compass => 'Bússola'; + + @override + String get navigationAndContacts => 'Navegação e contatos'; + + @override + String get sarAlert => 'ALERTA SAR'; + + @override + String get textCopiedToClipboard => + 'Texto copiado para a área de transferência'; + + @override + String get cannotReplySenderMissing => + 'Cannot reply: sender information missing'; + + @override + String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + + @override + String get copyText => 'Copiar texto'; + + @override + String get saveAsTemplate => 'Save as Template'; + + @override + String get templateSaved => 'Template saved successfully'; + + @override + String get templateAlreadyExists => 'Template with this emoji already exists'; + + @override + String get deleteMessage => 'Excluir mensagem'; + + @override + String get deleteMessageConfirmation => + 'Tem certeza de que deseja excluir esta mensagem?'; + + @override + String get shareLocation => 'Compartilhar localização'; + + @override + String shareLocationText( + String markerInfo, + String lat, + String lon, + String url, + ) { + return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + } + + @override + String get sarLocationShare => 'Localização SAR'; + + @override + String get justNow => 'Agora mesmo'; + + @override + String minutesAgo(int minutes) { + return 'há $minutes min'; + } + + @override + String hoursAgo(int hours) { + return 'há $hours h'; + } + + @override + String daysAgo(int days) { + return 'há $days d'; + } + + @override + String secondsAgo(int seconds) { + return 'há $seconds s'; + } + + @override + String get sending => 'Enviando...'; + + @override + String get sent => 'Enviado'; + + @override + String get delivered => 'Entregue'; + + @override + String deliveredWithTime(int time) { + return 'Entregue (${time}ms)'; + } + + @override + String get failed => 'Falhou'; + + @override + String get broadcast => 'Transmitir'; + + @override + String deliveredToContacts(int delivered, int total) { + return 'Delivered to $delivered/$total contacts'; + } + + @override + String get allDelivered => 'All delivered'; + + @override + String get recipientDetails => 'Recipient Details'; + + @override + String get pending => 'Pendente'; + + @override + String get sarMarkerFoundPerson => 'Found Person'; + + @override + String get sarMarkerFire => 'Fire Location'; + + @override + String get sarMarkerStagingArea => 'Staging Area'; + + @override + String get sarMarkerObject => 'Object Found'; + + @override + String get from => 'De'; + + @override + String get coordinates => 'Coordenadas'; + + @override + String get tapToViewOnMap => 'Toque para ver no mapa'; + + @override + String get radioSettings => 'Configurações do rádio'; + + @override + String get frequencyMHz => 'Frequência (MHz)'; + + @override + String get frequencyExample => 'e.g., 869.618'; + + @override + String get bandwidth => 'Largura de banda'; + + @override + String get spreadingFactor => 'Fator de espalhamento'; + + @override + String get codingRate => 'Taxa de codificação'; + + @override + String get txPowerDbm => 'Potência TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Máx: $power dBm'; + } + + @override + String get you => 'Você'; + + @override + String exportFailed(String error) { + return 'Falha na exportação: $error'; + } + + @override + String importFailed(String error) { + return 'Falha na importação: $error'; + } + + @override + String get unknown => 'Desconhecido'; + + @override + String get onlineLayers => 'Camadas online'; + + @override + String get locationTrail => 'Trilha de localização'; + + @override + String get showTrailOnMap => 'Mostrar trilha no mapa'; + + @override + String get trailVisible => 'A trilha está visível no mapa'; + + @override + String get trailHiddenRecording => 'A trilha está oculta (ainda gravando)'; + + @override + String get duration => 'Duração'; + + @override + String get points => 'Pontos'; + + @override + String get clearTrail => 'Limpar trilha'; + + @override + String get clearTrailQuestion => 'Limpar trilha?'; + + @override + String get clearTrailConfirmation => + 'Tem certeza de que deseja limpar a trilha de localização atual?'; + + @override + String get noTrailRecorded => 'Nenhuma trilha gravada ainda'; + + @override + String get startTrackingToRecord => + 'Inicie o rastreamento de localização para gravar sua trilha'; + + @override + String get trailControls => 'Controles da trilha'; + + @override + String get contactTrails => 'Trilhas dos contatos'; + + @override + String get showAllContactTrails => 'Mostrar todas as trilhas dos contatos'; + + @override + String get noContactsWithLocationHistory => + 'Nenhum contato com histórico de localização'; + + @override + String showingTrailsForContacts(int count) { + return 'Showing trails for $count contacts'; + } + + @override + String get individualContactTrails => 'Trilhas individuais dos contatos'; + + @override + String get deviceInformation => 'Informações do dispositivo'; + + @override + String get bleName => 'Nome BLE'; + + @override + String get meshName => 'Nome da mesh'; + + @override + String get notSet => 'Não definido'; + + @override + String get model => 'Modelo'; + + @override + String get version => 'Versão'; + + @override + String get buildDate => 'Data de build'; + + @override + String get firmware => 'Firmware'; + + @override + String get maxContacts => 'Máx. de contatos'; + + @override + String get maxChannels => 'Máx. de canais'; + + @override + String get publicInfo => 'Informações públicas'; + + @override + String get meshNetworkName => 'Nome da rede mesh'; + + @override + String get nameBroadcastInMesh => 'Nome transmitido nos anúncios mesh'; + + @override + String get telemetryAndLocationSharing => + 'Telemetria e compartilhamento de localização'; + + @override + String get lat => 'Lat'; + + @override + String get lon => 'Lon'; + + @override + String get useCurrentLocation => 'Usar localização atual'; + + @override + String get noneUnknown => 'Nenhum/Desconhecido'; + + @override + String get chatNode => 'Nó de chat'; + + @override + String get repeater => 'Repetidor'; + + @override + String get roomChannel => 'Sala/Canal'; + + @override + String typeNumber(int number) { + return 'Type $number'; + } + + @override + String copiedToClipboardShort(String label) { + return '$label copiado para a área de transferência'; + } + + @override + String failedToSave(String error) { + return 'Falha ao salvar: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Falha ao obter localização: $error'; + } + + @override + String get sarTemplates => 'Modelos SAR'; + + @override + String get manageSarTemplates => 'Manage cursor on target templates'; + + @override + String get addTemplate => 'Adicionar modelo'; + + @override + String get editTemplate => 'Editar modelo'; + + @override + String get deleteTemplate => 'Excluir modelo'; + + @override + String get templateName => 'Nome do modelo'; + + @override + String get templateNameHint => 'ex.: Pessoa encontrada'; + + @override + String get templateEmoji => 'Emoji'; + + @override + String get emojiRequired => 'Emoji é obrigatório'; + + @override + String get nameRequired => 'Nome é obrigatório'; + + @override + String get templateDescription => 'Descrição (opcional)'; + + @override + String get templateDescriptionHint => 'Adicionar contexto extra...'; + + @override + String get templateColor => 'Cor'; + + @override + String get previewFormat => 'Pré-visualização (formato de mensagem SAR)'; + + @override + String get importFromClipboard => 'Importar'; + + @override + String get exportToClipboard => 'Exportar'; + + @override + String deleteTemplateConfirmation(String name) { + return 'Excluir o modelo “$name”?'; + } + + @override + String get templateAdded => 'Modelo adicionado'; + + @override + String get templateUpdated => 'Modelo atualizado'; + + @override + String get templateDeleted => 'Modelo excluído'; + + @override + String templatesImported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Imported $count templates', + one: 'Imported 1 template', + zero: 'No templates imported', + ); + return '$_temp0'; + } + + @override + String templatesExported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Exported $count templates to clipboard', + one: 'Exported 1 template to clipboard', + ); + return '$_temp0'; + } + + @override + String get resetToDefaults => 'Restaurar padrão'; + + @override + String get resetToDefaultsConfirmation => + 'Isso excluirá todos os modelos personalizados e restaurará os 4 modelos padrão. Continuar?'; + + @override + String get reset => 'Redefinir'; + + @override + String get resetComplete => 'Modelos redefinidos para o padrão'; + + @override + String get noTemplates => 'Nenhum modelo disponível'; + + @override + String get tapAddToCreate => 'Toque em + para criar seu primeiro modelo'; + + @override + String get ok => 'OK'; + + @override + String get permissionsSection => 'Permissões'; + + @override + String get locationPermission => 'Permissão de localização'; + + @override + String get checking => 'Verificando...'; + + @override + String get locationPermissionGrantedAlways => 'Concedida (Sempre)'; + + @override + String get locationPermissionGrantedWhileInUse => 'Concedida (Durante o uso)'; + + @override + String get locationPermissionDeniedTapToRequest => + 'Negada - toque para solicitar'; + + @override + String get locationPermissionPermanentlyDeniedOpenSettings => + 'Negada permanentemente - abrir configurações'; + + @override + String get locationPermissionDialogContent => + 'A permissão de localização foi negada permanentemente. Ative-a nas configurações do dispositivo.'; + + @override + String get openSettings => 'Abrir configurações'; + + @override + String get locationPermissionGranted => 'Permissão de localização concedida!'; + + @override + String get locationPermissionRequiredForGps => + 'A permissão de localização é necessária para rastreamento GPS e compartilhamento de localização.'; + + @override + String get locationPermissionAlreadyGranted => + 'A permissão de localização já foi concedida.'; + + @override + String get sarNavyBlue => 'SAR Azul Marinho'; + + @override + String get sarNavyBlueDescription => 'Modo profissional/operações'; + + @override + String get selectRecipient => 'Selecionar destinatário'; + + @override + String get broadcastToAllNearby => 'Transmitir para todos os próximos'; + + @override + String get searchRecipients => 'Pesquisar destinatários...'; + + @override + String get noContactsFound => 'Nenhum contato encontrado'; + + @override + String get noRoomsFound => 'Nenhuma sala encontrada'; + + @override + String get noRecipientsAvailable => 'Nenhum destinatário disponível'; + + @override + String get noChannelsFound => 'Nenhum canal encontrado'; + + @override + String get newMessage => 'Nova mensagem'; + + @override + String get channel => 'Canal'; + + @override + String get samplePoliceLead => 'Police Lead'; + + @override + String get sampleDroneOperator => 'Drone Operator'; + + @override + String get sampleFirefighterAlpha => 'Firefighter'; + + @override + String get sampleMedicCharlie => 'Medic'; + + @override + String get sampleCommandDelta => 'Command'; + + @override + String get sampleFireEngine => 'Fire Engine'; + + @override + String get sampleAirSupport => 'Air Support'; + + @override + String get sampleBaseCoordinator => 'Base Coordinator'; + + @override + String get channelEmergency => 'Emergência'; + + @override + String get channelCoordination => 'Coordenação'; + + @override + String get channelUpdates => 'Atualizações'; + + @override + String get sampleTeamMember => 'Sample Team Member'; + + @override + String get sampleScout => 'Sample Scout'; + + @override + String get sampleBase => 'Sample Base'; + + @override + String get sampleSearcher => 'Sample Searcher'; + + @override + String get sampleObjectBackpack => ' Backpack found - blue color'; + + @override + String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + + @override + String get sampleObjectCamping => ' Camping equipment discovered'; + + @override + String get sampleObjectTrailMarker => ' Trail marker found off-path'; + + @override + String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + + @override + String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + + @override + String get sampleMsgBaseCamp => 'Base camp established at staging area'; + + @override + String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + + @override + String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + + @override + String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + + @override + String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + + @override + String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + + @override + String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + + @override + String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + + @override + String get sampleMsgTeamCharlie => 'Team requesting backup'; + + @override + String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + + @override + String get sampleMsgUrgentMedical => + 'URGENT: Medical assistance needed at sector 4'; + + @override + String get sampleMsgAdultMale => ' Adult male, conscious'; + + @override + String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + + @override + String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + + @override + String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + + @override + String get sampleMsgMedicalTeamEnRoute => + 'Medical team en route to your location'; + + @override + String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + + @override + String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + + @override + String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + + @override + String get sampleMsgEmergencyServices => + 'Emergency services notified and responding'; + + @override + String get sampleAlphaTeamLead => 'Team Lead'; + + @override + String get sampleBravoScout => 'Scout'; + + @override + String get sampleCharlieMedic => 'Medic'; + + @override + String get sampleDeltaNavigator => 'Navigator'; + + @override + String get sampleEchoSupport => 'Support'; + + @override + String get sampleBaseCommand => 'Base Command'; + + @override + String get sampleFieldCoordinator => 'Field Coordinator'; + + @override + String get sampleMedicalTeam => 'Medical Team'; + + @override + String get mapDrawing => 'Desenho do mapa'; + + @override + String get navigateToDrawing => 'Navigate to Drawing'; + + @override + String get copyCoordinates => 'Copiar coordenadas'; + + @override + String get hideFromMap => 'Ocultar do mapa'; + + @override + String get lineDrawing => 'Desenho de linha'; + + @override + String get rectangleDrawing => 'Desenho de retângulo'; + + @override + String get manualCoordinates => 'Coordenadas manuais'; + + @override + String get enterCoordinatesManually => 'Inserir coordenadas manualmente'; + + @override + String get latitudeLabel => 'Latitude'; + + @override + String get longitudeLabel => 'Longitude'; + + @override + String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + + @override + String get shareDrawing => 'Compartilhar desenho'; + + @override + String get shareWithAllNearbyDevices => + 'Compartilhar com todos os dispositivos próximos'; + + @override + String get shareToRoom => 'Compartilhar na sala'; + + @override + String get sendToPersistentStorage => + 'Enviar para armazenamento persistente da sala'; + + @override + String get deleteDrawingConfirm => + 'Tem certeza de que deseja excluir este desenho?'; + + @override + String get drawingDeleted => 'Desenho excluído'; + + @override + String yourDrawingsCount(int count) { + return 'Your Drawings ($count)'; + } + + @override + String get shared => 'Compartilhado'; + + @override + String get line => 'Linha'; + + @override + String get rectangle => 'Retângulo'; + + @override + String get updateAvailable => 'Atualização disponível'; + + @override + String get currentVersion => 'Atual'; + + @override + String get latestVersion => 'Mais recente'; + + @override + String get downloadUpdate => 'Baixar'; + + @override + String get updateLater => 'Mais tarde'; + + @override + String get cadastralParcels => 'Cadastral Parcels'; + + @override + String get forestRoads => 'Forest Roads'; + + @override + String get wmsOverlays => 'WMS Overlays'; + + @override + String get hikingTrails => 'Hiking Trails'; + + @override + String get mainRoads => 'Main Roads'; + + @override + String get houseNumbers => 'House Numbers'; + + @override + String get fireHazardZones => 'Fire Hazard Zones'; + + @override + String get historicalFires => 'Historical Fires'; + + @override + String get firebreaks => 'Firebreaks'; + + @override + String get krasFireZones => 'Kras Fire Zones'; + + @override + String get placeNames => 'Place Names'; + + @override + String get municipalityBorders => 'Municipality Borders'; + + @override + String get topographicMap => 'Topographic Map 1:25000'; + + @override + String get recentMessages => 'Mensagens recentes'; + + @override + String get addChannel => 'Adicionar canal'; + + @override + String get channelName => 'Nome do canal'; + + @override + String get channelNameHint => 'ex.: Equipe de Resgate Alfa'; + + @override + String get channelSecret => 'Segredo do canal'; + + @override + String get channelSecretHint => 'Senha compartilhada para este canal'; + + @override + String get channelSecretHelp => + 'This secret must be shared with all team members who need access to this channel'; + + @override + String get channelTypesInfo => + 'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'; + + @override + String get hashChannelInfo => + 'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'; + + @override + String get channelNameRequired => 'O nome do canal é obrigatório'; + + @override + String get channelNameTooLong => 'Channel name must be 31 characters or less'; + + @override + String get channelSecretRequired => 'O segredo do canal é obrigatório'; + + @override + String get channelSecretTooLong => + 'Channel secret must be 32 characters or less'; + + @override + String get invalidAsciiCharacters => + 'Somente caracteres ASCII são permitidos'; + + @override + String get channelCreatedSuccessfully => 'Canal criado com sucesso'; + + @override + String channelCreationFailed(String error) { + return 'Falha ao criar canal: $error'; + } + + @override + String get deleteChannel => 'Excluir canal'; + + @override + String deleteChannelConfirmation(String channelName) { + return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + } + + @override + String get channelDeletedSuccessfully => 'Canal excluído com sucesso'; + + @override + String channelDeletionFailed(String error) { + return 'Falha ao excluir canal: $error'; + } + + @override + String get createChannel => 'Criar canal'; + + @override + String get wizardBack => 'Voltar'; + + @override + String get wizardSkip => 'Pular'; + + @override + String get wizardNext => 'Próximo'; + + @override + String get wizardGetStarted => 'Começar'; + + @override + String get wizardWelcomeTitle => 'Bem-vindo ao MeshCore SAR'; + + @override + String get wizardWelcomeDescription => + 'A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.'; + + @override + String get wizardConnectingTitle => 'Conectando ao seu rádio'; + + @override + String get wizardConnectingDescription => + 'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'; + + @override + String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + + @override + String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + + @override + String get wizardConnectingFeature3 => + 'Works completely offline - no internet required'; + + @override + String get wizardChannelTitle => 'Canais'; + + @override + String get wizardChannelDescription => + 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + + @override + String get wizardChannelFeature1 => + 'Public Channel for general team communication'; + + @override + String get wizardChannelFeature2 => + 'Create custom channels for specific groups'; + + @override + String get wizardChannelFeature3 => + 'Messages are automatically relayed by the mesh'; + + @override + String get wizardContactsTitle => 'Contatos'; + + @override + String get wizardContactsDescription => + 'Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.'; + + @override + String get wizardContactsFeature1 => 'Contacts discovered automatically'; + + @override + String get wizardContactsFeature2 => 'Send private direct messages'; + + @override + String get wizardContactsFeature3 => 'View battery level and last seen time'; + + @override + String get wizardMapTitle => 'Mapa e localização'; + + @override + String get wizardMapDescription => + 'Track your team in real-time and mark important locations for search and rescue operations.'; + + @override + String get wizardMapFeature1 => + 'SAR markers for found persons, fires, and staging areas'; + + @override + String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + + @override + String get wizardMapFeature3 => 'Download offline maps for remote areas'; + + @override + String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + + @override + String get viewWelcomeTutorial => 'Ver tutorial de boas-vindas'; + + @override + String get allTeamContacts => 'Todos os contatos da equipe'; + + @override + String directMessagesInfo(int count) { + return 'Direct messages with ACKs. Sent to $count team members.'; + } + + @override + String sarMarkerSentToContacts(int count) { + return 'SAR marker sent to $count contacts'; + } + + @override + String get noContactsAvailable => 'Nenhum contato da equipe disponível'; + + @override + String get reply => 'Responder'; + + @override + String get technicalDetails => 'Detalhes técnicos'; + + @override + String get messageTechnicalDetails => 'Message technical details'; + + @override + String get linkQuality => 'Link quality'; + + @override + String get delivery => 'Delivery'; + + @override + String get status => 'Status'; + + @override + String get expectedAckTag => 'Expected ACK tag'; + + @override + String get roundTrip => 'Round-trip'; + + @override + String get retryAttempt => 'Retry attempt'; + + @override + String get floodFallback => 'Flood fallback'; + + @override + String get identity => 'Identity'; + + @override + String get messageId => 'Message ID'; + + @override + String get sender => 'Sender'; + + @override + String get senderKey => 'Sender key'; + + @override + String get recipient => 'Recipient'; + + @override + String get recipientKey => 'Recipient key'; + + @override + String get voice => 'Voz'; + + @override + String get voiceId => 'Voice ID'; + + @override + String get envelope => 'Envelope'; + + @override + String get sessionProgress => 'Session progress'; + + @override + String get complete => 'Concluído'; + + @override + String get rawDump => 'Raw dump'; + + @override + String get cannotRetryMissingRecipient => + 'Cannot retry: recipient information missing'; + + @override + String get voiceUnavailable => 'A voz não está disponível no momento'; + + @override + String get requestingVoice => 'Requesting voice'; +} diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart new file mode 100644 index 0000000..05f4526 --- /dev/null +++ b/lib/l10n/app_localizations_tr.dart @@ -0,0 +1,1714 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Turkish (`tr`). +class AppLocalizationsTr extends AppLocalizations { + AppLocalizationsTr([String locale = 'tr']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Mesajlar'; + + @override + String get contacts => 'Kişiler'; + + @override + String get map => 'Harita'; + + @override + String get settings => 'Ayarlar'; + + @override + String get connect => 'Bağlan'; + + @override + String get disconnect => 'Bağlantıyı kes'; + + @override + String get noDevicesFound => 'Cihaz bulunamadı'; + + @override + String get scanAgain => 'Tekrar tara'; + + @override + String get tapToConnect => 'Bağlanmak için dokunun'; + + @override + String get deviceNotConnected => 'Cihaz bağlı değil'; + + @override + String get locationPermissionDenied => 'Konum izni reddedildi'; + + @override + String get locationPermissionPermanentlyDenied => + 'Konum izni kalıcı olarak reddedildi. Lütfen Ayarlar bölümünden etkinleştirin.'; + + @override + String get locationPermissionRequired => + 'GPS takibi ve ekip koordinasyonu için konum izni gereklidir. Daha sonra Ayarlar bölümünden etkinleştirebilirsiniz.'; + + @override + String get locationServicesDisabled => + 'Konum servisleri kapalı. Lütfen Ayarlar bölümünden etkinleştirin.'; + + @override + String get failedToGetGpsLocation => 'GPS konumu alınamadı'; + + @override + String failedToAdvertise(String error) { + return 'Yayın başarısız: $error'; + } + + @override + String get cancelReconnection => 'Yeniden bağlanmayı iptal et'; + + @override + String get general => 'Genel'; + + @override + String get theme => 'Tema'; + + @override + String get chooseTheme => 'Tema seç'; + + @override + String get light => 'Açık'; + + @override + String get dark => 'Koyu'; + + @override + String get blueLightTheme => 'Mavi açık tema'; + + @override + String get blueDarkTheme => 'Mavi koyu tema'; + + @override + String get sarRed => 'SAR Kırmızı'; + + @override + String get alertEmergencyMode => 'Uyarı/Acil durum modu'; + + @override + String get sarGreen => 'SAR Yeşil'; + + @override + String get safeAllClearMode => 'Güvenli/Tamam modu'; + + @override + String get autoSystem => 'Otomatik (Sistem)'; + + @override + String get followSystemTheme => 'Sistem temasını takip et'; + + @override + String get showRxTxIndicators => 'RX/TX göstergelerini göster'; + + @override + String get displayPacketActivity => + 'Üst çubukta paket etkinliği göstergelerini göster'; + + @override + String get disableMap => 'Haritayı devre dışı bırak'; + + @override + String get disableMapDescription => + 'Pil kullanımını azaltmak için harita sekmesini gizle'; + + @override + String get language => 'Dil'; + + @override + String get chooseLanguage => 'Dil seç'; + + @override + String get save => 'Kaydet'; + + @override + String get cancel => 'İptal'; + + @override + String get close => 'Kapat'; + + @override + String get about => 'Hakkında'; + + @override + String get appVersion => 'Uygulama sürümü'; + + @override + String get appName => 'Uygulama adı'; + + @override + String get aboutMeshCoreSar => 'About MeshCore SAR'; + + @override + String get aboutDescription => + 'A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use'; + + @override + String get technologiesUsed => 'Technologies Used:'; + + @override + String get technologiesList => + '• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage'; + + @override + String get moreInfo => 'Daha fazla bilgi'; + + @override + String get packageName => 'Package Name'; + + @override + String get sampleData => 'Örnek veriler'; + + @override + String get sampleDataDescription => + 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + + @override + String get loadSampleData => 'Örnek verileri yükle'; + + @override + String get clearAllData => 'Tüm verileri temizle'; + + @override + String get clearAllDataConfirmTitle => 'Tüm verileri temizle'; + + @override + String get clearAllDataConfirmMessage => + 'Bu işlem tüm kişileri ve SAR işaretlerini temizleyecek. Emin misiniz?'; + + @override + String get clear => 'Temizle'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Örnek veriler yüklenemedi: $error'; + } + + @override + String get allDataCleared => 'Tüm veriler temizlendi'; + + @override + String get failedToStartBackgroundTracking => + 'Failed to start background tracking. Check permissions and BLE connection.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Location broadcast: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'; + + @override + String get noMessagesYet => 'Henüz mesaj yok'; + + @override + String get pullDownToSync => 'Mesajları senkronize etmek için aşağı çekin'; + + @override + String get deleteContact => 'Kişiyi sil'; + + @override + String get delete => 'Sil'; + + @override + String get viewOnMap => 'Haritada görüntüle'; + + @override + String get refresh => 'Yenile'; + + @override + String get resetPath => 'Reset Path (Re-route)'; + + @override + String get publicKeyCopied => 'Genel anahtar panoya kopyalandı'; + + @override + String copiedToClipboard(String label) { + return '$label panoya kopyalandı'; + } + + @override + String get pleaseEnterPassword => 'Lütfen bir parola girin'; + + @override + String failedToSyncContacts(String error) { + return 'Kişiler senkronize edilemedi: $error'; + } + + @override + String get loggedInSuccessfully => + 'Giriş başarılı! Oda mesajları bekleniyor...'; + + @override + String get loginFailed => 'Giriş başarısız - yanlış parola'; + + @override + String loggingIn(String roomName) { + return '$roomName odasına giriş yapılıyor...'; + } + + @override + String failedToSendLogin(String error) { + return 'Giriş gönderilemedi: $error'; + } + + @override + String get lowLocationAccuracy => 'Düşük konum doğruluğu'; + + @override + String get continue_ => 'Devam et'; + + @override + String get sendSarMarker => 'SAR işareti gönder'; + + @override + String get deleteDrawing => 'Çizimi sil'; + + @override + String get drawingTools => 'Çizim araçları'; + + @override + String get drawLine => 'Çizgi çiz'; + + @override + String get drawLineDesc => 'Harita üzerinde serbest çizgi çiz'; + + @override + String get drawRectangle => 'Dikdörtgen çiz'; + + @override + String get drawRectangleDesc => 'Harita üzerinde dikdörtgen alan çiz'; + + @override + String get measureDistance => 'Mesafe ölç'; + + @override + String get measureDistanceDesc => 'Ölçmek için iki noktaya uzun basın'; + + @override + String get clearMeasurement => 'Ölçümü temizle'; + + @override + String distanceLabel(String distance) { + return 'Mesafe: $distance'; + } + + @override + String get longPressForSecondPoint => 'Long press for second point'; + + @override + String get longPressToStartMeasurement => 'Long press to set first point'; + + @override + String get longPressToStartNewMeasurement => + 'Long press to start new measurement'; + + @override + String get shareDrawings => 'Çizimleri paylaş'; + + @override + String get clearAllDrawings => 'Tüm çizimleri temizle'; + + @override + String get completeLine => 'Complete Line'; + + @override + String broadcastDrawingsToTeam(int count, String plural) { + return 'Broadcast $count drawing$plural to team'; + } + + @override + String removeAllDrawings(int count, String plural) { + return 'Remove all $count drawing$plural'; + } + + @override + String deleteAllDrawingsConfirm(int count, String plural) { + return 'Delete all $count drawing$plural from the map?'; + } + + @override + String get drawing => 'Çizim'; + + @override + String shareDrawingsCount(int count, String plural) { + return 'Share $count Drawing$plural'; + } + + @override + String get showReceivedDrawings => 'Alınan çizimleri göster'; + + @override + String get showingAllDrawings => 'Tüm çizimler gösteriliyor'; + + @override + String get showingOnlyYourDrawings => + 'Yalnızca sizin çizimleriniz gösteriliyor'; + + @override + String get showSarMarkers => 'SAR işaretlerini göster'; + + @override + String get showingSarMarkers => 'SAR işaretleri gösteriliyor'; + + @override + String get hidingSarMarkers => 'SAR işaretleri gizleniyor'; + + @override + String get clearAll => 'Tümünü temizle'; + + @override + String get publicChannel => 'Genel kanal'; + + @override + String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + + @override + String get storedPermanently => 'Odada kalıcı olarak saklanır'; + + @override + String get notConnectedToDevice => 'Cihaza bağlı değil'; + + @override + String get typeYourMessage => 'Mesajınızı yazın...'; + + @override + String get quickLocationMarker => 'Hızlı konum işareti'; + + @override + String get markerType => 'İşaret türü'; + + @override + String get sendTo => 'Gönder'; + + @override + String get noDestinationsAvailable => 'Kullanılabilir hedef yok.'; + + @override + String get selectDestination => 'Hedef seçin...'; + + @override + String get ephemeralBroadcastInfo => + 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + + @override + String get persistentRoomInfo => + 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + + @override + String get location => 'Konum'; + + @override + String get fromMap => 'Haritadan'; + + @override + String get gettingLocation => 'Konum alınıyor...'; + + @override + String get locationError => 'Konum hatası'; + + @override + String get retry => 'Tekrar dene'; + + @override + String get refreshLocation => 'Konumu yenile'; + + @override + String accuracyMeters(int accuracy) { + return 'Doğruluk: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Notlar (isteğe bağlı)'; + + @override + String get addAdditionalInformation => 'Ek bilgi ekleyin...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + } + + @override + String get loginToRoom => 'Odaya giriş yap'; + + @override + String get enterPasswordInfo => + 'Enter the password to access this room. The password will be saved for future use.'; + + @override + String get password => 'Parola'; + + @override + String get enterRoomPassword => 'Oda parolasını girin'; + + @override + String get loggingInDots => 'Giriş yapılıyor...'; + + @override + String get login => 'Giriş yap'; + + @override + String failedToAddRoom(String error) { + return 'Failed to add room to device: $error\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'; + } + + @override + String get direct => 'Doğrudan'; + + @override + String get flood => 'Flood'; + + @override + String get loggedIn => 'Giriş yapıldı'; + + @override + String get noGpsData => 'GPS verisi yok'; + + @override + String get distance => 'Mesafe'; + + @override + String directPingTimeout(String name) { + return 'Direct ping timeout - retrying $name with flooding...'; + } + + @override + String pingFailed(String name) { + return '$name için ping başarısız - yanıt alınamadı'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Are you sure you want to delete \"$name\"?\n\nThis will remove the contact from both the app and the companion radio device.'; + } + + @override + String failedToRemoveContact(String error) { + return 'Kişi kaldırılamadı: $error'; + } + + @override + String get type => 'Tür'; + + @override + String get publicKey => 'Genel anahtar'; + + @override + String get lastSeen => 'Son görülme'; + + @override + String get roomStatus => 'Oda durumu'; + + @override + String get loginStatus => 'Giriş durumu'; + + @override + String get notLoggedIn => 'Giriş yapılmadı'; + + @override + String get adminAccess => 'Yönetici erişimi'; + + @override + String get yes => 'Evet'; + + @override + String get no => 'Hayır'; + + @override + String get permissions => 'İzinler'; + + @override + String get passwordSaved => 'Parola kaydedildi'; + + @override + String get locationColon => 'Konum:'; + + @override + String get telemetry => 'Telemetri'; + + @override + String get voltage => 'Voltaj'; + + @override + String get battery => 'Pil'; + + @override + String get temperature => 'Sıcaklık'; + + @override + String get humidity => 'Nem'; + + @override + String get pressure => 'Basınç'; + + @override + String get gpsTelemetry => 'GPS (telemetri)'; + + @override + String get updated => 'Güncellendi'; + + @override + String pathResetInfo(String name) { + return 'Path reset for $name. Next message will find a new route.'; + } + + @override + String get reLoginToRoom => 'Odaya yeniden giriş yap'; + + @override + String get heading => 'Yön'; + + @override + String get elevation => 'Rakım'; + + @override + String get accuracy => 'Doğruluk'; + + @override + String get bearing => 'İstikamet'; + + @override + String get direction => 'Yön'; + + @override + String get filterMarkers => 'İşaretleri filtrele'; + + @override + String get filterMarkersTooltip => 'Filter markers'; + + @override + String get contactsFilter => 'Kişiler'; + + @override + String get repeatersFilter => 'Tekrarlayıcılar'; + + @override + String get sarMarkers => 'SAR işaretleri'; + + @override + String get foundPerson => 'Bulunan kişi'; + + @override + String get fire => 'Yangın'; + + @override + String get stagingArea => 'Toplanma alanı'; + + @override + String get showAll => 'Tümünü göster'; + + @override + String get locationUnavailable => 'Konum kullanılamıyor'; + + @override + String get ahead => 'ileride'; + + @override + String degreesRight(int degrees) { + return '$degrees° sağda'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° solda'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Henüz kişi yok'; + + @override + String get connectToDeviceToLoadContacts => + 'Kişileri yüklemek için bir cihaza bağlanın'; + + @override + String get teamMembers => 'Ekip üyeleri'; + + @override + String get repeaters => 'Tekrarlayıcılar'; + + @override + String get rooms => 'Odalar'; + + @override + String get channels => 'Kanallar'; + + @override + String get selectMapLayer => 'Harita katmanını seç'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'ESRI Uydu'; + + @override + String get googleHybrid => 'Google Hibrit'; + + @override + String get googleRoadmap => 'Google Yol Haritası'; + + @override + String get googleTerrain => 'Google Arazi'; + + @override + String get dragToPosition => 'Konuma sürükle'; + + @override + String get createSarMarker => 'SAR işareti oluştur'; + + @override + String get compass => 'Pusula'; + + @override + String get navigationAndContacts => 'Navigasyon ve kişiler'; + + @override + String get sarAlert => 'SAR ALARMI'; + + @override + String get textCopiedToClipboard => 'Metin panoya kopyalandı'; + + @override + String get cannotReplySenderMissing => + 'Cannot reply: sender information missing'; + + @override + String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + + @override + String get copyText => 'Metni kopyala'; + + @override + String get saveAsTemplate => 'Save as Template'; + + @override + String get templateSaved => 'Template saved successfully'; + + @override + String get templateAlreadyExists => 'Template with this emoji already exists'; + + @override + String get deleteMessage => 'Mesajı sil'; + + @override + String get deleteMessageConfirmation => + 'Bu mesajı silmek istediğinizden emin misiniz?'; + + @override + String get shareLocation => 'Konumu paylaş'; + + @override + String shareLocationText( + String markerInfo, + String lat, + String lon, + String url, + ) { + return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + } + + @override + String get sarLocationShare => 'SAR konumu'; + + @override + String get justNow => 'Az önce'; + + @override + String minutesAgo(int minutes) { + return '$minutes dk önce'; + } + + @override + String hoursAgo(int hours) { + return '$hours sa önce'; + } + + @override + String daysAgo(int days) { + return '$days g önce'; + } + + @override + String secondsAgo(int seconds) { + return '$seconds sn önce'; + } + + @override + String get sending => 'Gönderiliyor...'; + + @override + String get sent => 'Gönderildi'; + + @override + String get delivered => 'Teslim edildi'; + + @override + String deliveredWithTime(int time) { + return 'Teslim edildi (${time}ms)'; + } + + @override + String get failed => 'Başarısız'; + + @override + String get broadcast => 'Yayın'; + + @override + String deliveredToContacts(int delivered, int total) { + return 'Delivered to $delivered/$total contacts'; + } + + @override + String get allDelivered => 'All delivered'; + + @override + String get recipientDetails => 'Recipient Details'; + + @override + String get pending => 'Bekliyor'; + + @override + String get sarMarkerFoundPerson => 'Found Person'; + + @override + String get sarMarkerFire => 'Fire Location'; + + @override + String get sarMarkerStagingArea => 'Staging Area'; + + @override + String get sarMarkerObject => 'Object Found'; + + @override + String get from => 'Kimden'; + + @override + String get coordinates => 'Koordinatlar'; + + @override + String get tapToViewOnMap => 'Haritada görüntülemek için dokunun'; + + @override + String get radioSettings => 'Radyo ayarları'; + + @override + String get frequencyMHz => 'Frekans (MHz)'; + + @override + String get frequencyExample => 'e.g., 869.618'; + + @override + String get bandwidth => 'Bant genişliği'; + + @override + String get spreadingFactor => 'Yayılma faktörü'; + + @override + String get codingRate => 'Kodlama oranı'; + + @override + String get txPowerDbm => 'TX gücü (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Maks: $power dBm'; + } + + @override + String get you => 'Siz'; + + @override + String exportFailed(String error) { + return 'Dışa aktarma başarısız: $error'; + } + + @override + String importFailed(String error) { + return 'İçe aktarma başarısız: $error'; + } + + @override + String get unknown => 'Bilinmiyor'; + + @override + String get onlineLayers => 'Çevrimiçi katmanlar'; + + @override + String get locationTrail => 'Konum izi'; + + @override + String get showTrailOnMap => 'İzi haritada göster'; + + @override + String get trailVisible => 'İz haritada görünüyor'; + + @override + String get trailHiddenRecording => 'İz gizli (kayıt devam ediyor)'; + + @override + String get duration => 'Süre'; + + @override + String get points => 'Noktalar'; + + @override + String get clearTrail => 'İzi temizle'; + + @override + String get clearTrailQuestion => 'İz temizlensin mi?'; + + @override + String get clearTrailConfirmation => + 'Are you sure you want to clear the current location trail? This action cannot be undone.'; + + @override + String get noTrailRecorded => 'Henüz iz kaydedilmedi'; + + @override + String get startTrackingToRecord => + 'İzi kaydetmek için konum takibini başlatın'; + + @override + String get trailControls => 'İz kontrolleri'; + + @override + String get contactTrails => 'Kişi izleri'; + + @override + String get showAllContactTrails => 'Tüm kişi izlerini göster'; + + @override + String get noContactsWithLocationHistory => 'Konum geçmişi olan kişi yok'; + + @override + String showingTrailsForContacts(int count) { + return 'Showing trails for $count contacts'; + } + + @override + String get individualContactTrails => 'Individual Contact Trails'; + + @override + String get deviceInformation => 'Cihaz bilgileri'; + + @override + String get bleName => 'BLE adı'; + + @override + String get meshName => 'Mesh adı'; + + @override + String get notSet => 'Ayarlanmadı'; + + @override + String get model => 'Model'; + + @override + String get version => 'Sürüm'; + + @override + String get buildDate => 'Derleme tarihi'; + + @override + String get firmware => 'Bellenim'; + + @override + String get maxContacts => 'Maks kişi'; + + @override + String get maxChannels => 'Maks kanal'; + + @override + String get publicInfo => 'Genel bilgiler'; + + @override + String get meshNetworkName => 'Mesh ağ adı'; + + @override + String get nameBroadcastInMesh => 'Name broadcast in mesh advertisements'; + + @override + String get telemetryAndLocationSharing => 'Telemetri ve konum paylaşımı'; + + @override + String get lat => 'Enl.'; + + @override + String get lon => 'Boyl.'; + + @override + String get useCurrentLocation => 'Geçerli konumu kullan'; + + @override + String get noneUnknown => 'Yok/Bilinmiyor'; + + @override + String get chatNode => 'Sohbet düğümü'; + + @override + String get repeater => 'Tekrarlayıcı'; + + @override + String get roomChannel => 'Oda/Kanal'; + + @override + String typeNumber(int number) { + return 'Type $number'; + } + + @override + String copiedToClipboardShort(String label) { + return 'Copied $label to clipboard'; + } + + @override + String failedToSave(String error) { + return 'Kaydetme başarısız: $error'; + } + + @override + String failedToGetLocation(String error) { + return 'Konum alınamadı: $error'; + } + + @override + String get sarTemplates => 'SAR şablonları'; + + @override + String get manageSarTemplates => 'Manage cursor on target templates'; + + @override + String get addTemplate => 'Şablon ekle'; + + @override + String get editTemplate => 'Şablonu düzenle'; + + @override + String get deleteTemplate => 'Şablonu sil'; + + @override + String get templateName => 'Şablon adı'; + + @override + String get templateNameHint => 'örn. Bulunan kişi'; + + @override + String get templateEmoji => 'Emoji'; + + @override + String get emojiRequired => 'Emoji gerekli'; + + @override + String get nameRequired => 'Ad gerekli'; + + @override + String get templateDescription => 'Açıklama (isteğe bağlı)'; + + @override + String get templateDescriptionHint => 'Ek bağlam ekleyin...'; + + @override + String get templateColor => 'Renk'; + + @override + String get previewFormat => 'Önizleme (SAR mesaj biçimi)'; + + @override + String get importFromClipboard => 'İçe aktar'; + + @override + String get exportToClipboard => 'Dışa aktar'; + + @override + String deleteTemplateConfirmation(String name) { + return '“$name” şablonu silinsin mi?'; + } + + @override + String get templateAdded => 'Şablon eklendi'; + + @override + String get templateUpdated => 'Şablon güncellendi'; + + @override + String get templateDeleted => 'Şablon silindi'; + + @override + String templatesImported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Imported $count templates', + one: 'Imported 1 template', + zero: 'No templates imported', + ); + return '$_temp0'; + } + + @override + String templatesExported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Exported $count templates to clipboard', + one: 'Exported 1 template to clipboard', + ); + return '$_temp0'; + } + + @override + String get resetToDefaults => 'Varsayılanlara sıfırla'; + + @override + String get resetToDefaultsConfirmation => + 'This will delete all custom templates and restore the 4 default templates. Continue?'; + + @override + String get reset => 'Sıfırla'; + + @override + String get resetComplete => 'Şablonlar varsayılana sıfırlandı'; + + @override + String get noTemplates => 'Kullanılabilir şablon yok'; + + @override + String get tapAddToCreate => + 'İlk şablonunuzu oluşturmak için + işaretine dokunun'; + + @override + String get ok => 'Tamam'; + + @override + String get permissionsSection => 'İzinler'; + + @override + String get locationPermission => 'Konum izni'; + + @override + String get checking => 'Kontrol ediliyor...'; + + @override + String get locationPermissionGrantedAlways => 'Verildi (Her zaman)'; + + @override + String get locationPermissionGrantedWhileInUse => + 'Verildi (Kullanım sırasında)'; + + @override + String get locationPermissionDeniedTapToRequest => + 'Reddedildi - istemek için dokunun'; + + @override + String get locationPermissionPermanentlyDeniedOpenSettings => + 'Kalıcı olarak reddedildi - ayarları aç'; + + @override + String get locationPermissionDialogContent => + 'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'; + + @override + String get openSettings => 'Ayarları aç'; + + @override + String get locationPermissionGranted => 'Konum izni verildi!'; + + @override + String get locationPermissionRequiredForGps => + 'GPS takibi ve konum paylaşımı için konum izni gereklidir.'; + + @override + String get locationPermissionAlreadyGranted => 'Konum izni zaten verilmiş.'; + + @override + String get sarNavyBlue => 'SAR Navy Blue'; + + @override + String get sarNavyBlueDescription => 'Professional/Operations Mode'; + + @override + String get selectRecipient => 'Alıcı seç'; + + @override + String get broadcastToAllNearby => 'Broadcast to all nearby'; + + @override + String get searchRecipients => 'Alıcı ara...'; + + @override + String get noContactsFound => 'Kişi bulunamadı'; + + @override + String get noRoomsFound => 'Oda bulunamadı'; + + @override + String get noRecipientsAvailable => 'Kullanılabilir alıcı yok'; + + @override + String get noChannelsFound => 'Kanal bulunamadı'; + + @override + String get newMessage => 'Yeni mesaj'; + + @override + String get channel => 'Kanal'; + + @override + String get samplePoliceLead => 'Police Lead'; + + @override + String get sampleDroneOperator => 'Drone Operator'; + + @override + String get sampleFirefighterAlpha => 'Firefighter'; + + @override + String get sampleMedicCharlie => 'Medic'; + + @override + String get sampleCommandDelta => 'Command'; + + @override + String get sampleFireEngine => 'Fire Engine'; + + @override + String get sampleAirSupport => 'Air Support'; + + @override + String get sampleBaseCoordinator => 'Base Coordinator'; + + @override + String get channelEmergency => 'Acil durum'; + + @override + String get channelCoordination => 'Koordinasyon'; + + @override + String get channelUpdates => 'Güncellemeler'; + + @override + String get sampleTeamMember => 'Sample Team Member'; + + @override + String get sampleScout => 'Sample Scout'; + + @override + String get sampleBase => 'Sample Base'; + + @override + String get sampleSearcher => 'Sample Searcher'; + + @override + String get sampleObjectBackpack => ' Backpack found - blue color'; + + @override + String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + + @override + String get sampleObjectCamping => ' Camping equipment discovered'; + + @override + String get sampleObjectTrailMarker => ' Trail marker found off-path'; + + @override + String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + + @override + String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + + @override + String get sampleMsgBaseCamp => 'Base camp established at staging area'; + + @override + String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + + @override + String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + + @override + String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + + @override + String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + + @override + String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + + @override + String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + + @override + String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + + @override + String get sampleMsgTeamCharlie => 'Team requesting backup'; + + @override + String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + + @override + String get sampleMsgUrgentMedical => + 'URGENT: Medical assistance needed at sector 4'; + + @override + String get sampleMsgAdultMale => ' Adult male, conscious'; + + @override + String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + + @override + String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + + @override + String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + + @override + String get sampleMsgMedicalTeamEnRoute => + 'Medical team en route to your location'; + + @override + String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + + @override + String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + + @override + String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + + @override + String get sampleMsgEmergencyServices => + 'Emergency services notified and responding'; + + @override + String get sampleAlphaTeamLead => 'Team Lead'; + + @override + String get sampleBravoScout => 'Scout'; + + @override + String get sampleCharlieMedic => 'Medic'; + + @override + String get sampleDeltaNavigator => 'Navigator'; + + @override + String get sampleEchoSupport => 'Support'; + + @override + String get sampleBaseCommand => 'Base Command'; + + @override + String get sampleFieldCoordinator => 'Field Coordinator'; + + @override + String get sampleMedicalTeam => 'Medical Team'; + + @override + String get mapDrawing => 'Harita çizimi'; + + @override + String get navigateToDrawing => 'Navigate to Drawing'; + + @override + String get copyCoordinates => 'Koordinatları kopyala'; + + @override + String get hideFromMap => 'Haritadan gizle'; + + @override + String get lineDrawing => 'Çizgi çizimi'; + + @override + String get rectangleDrawing => 'Dikdörtgen çizimi'; + + @override + String get manualCoordinates => 'Manuel koordinatlar'; + + @override + String get enterCoordinatesManually => 'Koordinatları manuel girin'; + + @override + String get latitudeLabel => 'Enlem'; + + @override + String get longitudeLabel => 'Boylam'; + + @override + String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + + @override + String get shareDrawing => 'Çizimi paylaş'; + + @override + String get shareWithAllNearbyDevices => 'Yakındaki tüm cihazlarla paylaş'; + + @override + String get shareToRoom => 'Odaya paylaş'; + + @override + String get sendToPersistentStorage => 'Kalıcı oda depolamasına gönder'; + + @override + String get deleteDrawingConfirm => + 'Are you sure you want to delete this drawing?'; + + @override + String get drawingDeleted => 'Çizim silindi'; + + @override + String yourDrawingsCount(int count) { + return 'Your Drawings ($count)'; + } + + @override + String get shared => 'Paylaşıldı'; + + @override + String get line => 'Çizgi'; + + @override + String get rectangle => 'Dikdörtgen'; + + @override + String get updateAvailable => 'Güncelleme mevcut'; + + @override + String get currentVersion => 'Geçerli'; + + @override + String get latestVersion => 'En son'; + + @override + String get downloadUpdate => 'İndir'; + + @override + String get updateLater => 'Daha sonra'; + + @override + String get cadastralParcels => 'Cadastral Parcels'; + + @override + String get forestRoads => 'Forest Roads'; + + @override + String get wmsOverlays => 'WMS Overlays'; + + @override + String get hikingTrails => 'Hiking Trails'; + + @override + String get mainRoads => 'Main Roads'; + + @override + String get houseNumbers => 'House Numbers'; + + @override + String get fireHazardZones => 'Fire Hazard Zones'; + + @override + String get historicalFires => 'Historical Fires'; + + @override + String get firebreaks => 'Firebreaks'; + + @override + String get krasFireZones => 'Kras Fire Zones'; + + @override + String get placeNames => 'Place Names'; + + @override + String get municipalityBorders => 'Municipality Borders'; + + @override + String get topographicMap => 'Topographic Map 1:25000'; + + @override + String get recentMessages => 'Son mesajlar'; + + @override + String get addChannel => 'Kanal ekle'; + + @override + String get channelName => 'Kanal adı'; + + @override + String get channelNameHint => 'örn. Kurtarma Ekibi Alfa'; + + @override + String get channelSecret => 'Kanal sırrı'; + + @override + String get channelSecretHint => 'Bu kanal için paylaşılan parola'; + + @override + String get channelSecretHelp => + 'This secret must be shared with all team members who need access to this channel'; + + @override + String get channelTypesInfo => + 'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'; + + @override + String get hashChannelInfo => + 'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'; + + @override + String get channelNameRequired => 'Kanal adı gerekli'; + + @override + String get channelNameTooLong => 'Channel name must be 31 characters or less'; + + @override + String get channelSecretRequired => 'Kanal sırrı gerekli'; + + @override + String get channelSecretTooLong => + 'Channel secret must be 32 characters or less'; + + @override + String get invalidAsciiCharacters => + 'Yalnızca ASCII karakterlere izin verilir'; + + @override + String get channelCreatedSuccessfully => 'Kanal başarıyla oluşturuldu'; + + @override + String channelCreationFailed(String error) { + return 'Kanal oluşturulamadı: $error'; + } + + @override + String get deleteChannel => 'Kanalı sil'; + + @override + String deleteChannelConfirmation(String channelName) { + return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + } + + @override + String get channelDeletedSuccessfully => 'Kanal başarıyla silindi'; + + @override + String channelDeletionFailed(String error) { + return 'Kanal silinemedi: $error'; + } + + @override + String get createChannel => 'Kanal oluştur'; + + @override + String get wizardBack => 'Geri'; + + @override + String get wizardSkip => 'Atla'; + + @override + String get wizardNext => 'İleri'; + + @override + String get wizardGetStarted => 'Başla'; + + @override + String get wizardWelcomeTitle => 'MeshCore SAR uygulamasına hoş geldiniz'; + + @override + String get wizardWelcomeDescription => + 'A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.'; + + @override + String get wizardConnectingTitle => 'Radyonuza bağlanma'; + + @override + String get wizardConnectingDescription => + 'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'; + + @override + String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + + @override + String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + + @override + String get wizardConnectingFeature3 => + 'Works completely offline - no internet required'; + + @override + String get wizardChannelTitle => 'Kanallar'; + + @override + String get wizardChannelDescription => + 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + + @override + String get wizardChannelFeature1 => + 'Public Channel for general team communication'; + + @override + String get wizardChannelFeature2 => + 'Create custom channels for specific groups'; + + @override + String get wizardChannelFeature3 => + 'Messages are automatically relayed by the mesh'; + + @override + String get wizardContactsTitle => 'Kişiler'; + + @override + String get wizardContactsDescription => + 'Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.'; + + @override + String get wizardContactsFeature1 => 'Contacts discovered automatically'; + + @override + String get wizardContactsFeature2 => 'Send private direct messages'; + + @override + String get wizardContactsFeature3 => 'View battery level and last seen time'; + + @override + String get wizardMapTitle => 'Harita ve konum'; + + @override + String get wizardMapDescription => + 'Track your team in real-time and mark important locations for search and rescue operations.'; + + @override + String get wizardMapFeature1 => + 'SAR markers for found persons, fires, and staging areas'; + + @override + String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + + @override + String get wizardMapFeature3 => 'Download offline maps for remote areas'; + + @override + String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + + @override + String get viewWelcomeTutorial => 'Karşılama eğitimini görüntüle'; + + @override + String get allTeamContacts => 'Tüm ekip kişileri'; + + @override + String directMessagesInfo(int count) { + return 'Direct messages with ACKs. Sent to $count team members.'; + } + + @override + String sarMarkerSentToContacts(int count) { + return 'SAR marker sent to $count contacts'; + } + + @override + String get noContactsAvailable => 'Ekip kişisi yok'; + + @override + String get reply => 'Yanıtla'; + + @override + String get technicalDetails => 'Teknik ayrıntılar'; + + @override + String get messageTechnicalDetails => 'Message technical details'; + + @override + String get linkQuality => 'Link quality'; + + @override + String get delivery => 'Delivery'; + + @override + String get status => 'Durum'; + + @override + String get expectedAckTag => 'Expected ACK tag'; + + @override + String get roundTrip => 'Round-trip'; + + @override + String get retryAttempt => 'Retry attempt'; + + @override + String get floodFallback => 'Flood fallback'; + + @override + String get identity => 'Identity'; + + @override + String get messageId => 'Message ID'; + + @override + String get sender => 'Sender'; + + @override + String get senderKey => 'Sender key'; + + @override + String get recipient => 'Recipient'; + + @override + String get recipientKey => 'Recipient key'; + + @override + String get voice => 'Ses'; + + @override + String get voiceId => 'Voice ID'; + + @override + String get envelope => 'Envelope'; + + @override + String get sessionProgress => 'Session progress'; + + @override + String get complete => 'Tamamlandı'; + + @override + String get rawDump => 'Raw dump'; + + @override + String get cannotRetryMissingRecipient => + 'Cannot retry: recipient information missing'; + + @override + String get voiceUnavailable => 'Ses şu anda kullanılamıyor'; + + @override + String get requestingVoice => 'Requesting voice'; +} diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart new file mode 100644 index 0000000..d8b66a5 --- /dev/null +++ b/lib/l10n/app_localizations_uk.dart @@ -0,0 +1,1712 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Ukrainian (`uk`). +class AppLocalizationsUk extends AppLocalizations { + AppLocalizationsUk([String locale = 'uk']) : super(locale); + + @override + String get appTitle => 'MeshCore SAR'; + + @override + String get messages => 'Повідомлення'; + + @override + String get contacts => 'Контакти'; + + @override + String get map => 'Мапа'; + + @override + String get settings => 'Налаштування'; + + @override + String get connect => 'Підключити'; + + @override + String get disconnect => 'Відключити'; + + @override + String get noDevicesFound => 'Пристроїв не знайдено'; + + @override + String get scanAgain => 'Сканувати знову'; + + @override + String get tapToConnect => 'Торкніться, щоб підключитися'; + + @override + String get deviceNotConnected => 'Пристрій не підключено'; + + @override + String get locationPermissionDenied => 'Доступ до геолокації відхилено'; + + @override + String get locationPermissionPermanentlyDenied => + 'Location permission permanently denied. Please enable in Settings.'; + + @override + String get locationPermissionRequired => + 'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.'; + + @override + String get locationServicesDisabled => + 'Служби геолокації вимкнені. Увімкніть їх у Налаштуваннях.'; + + @override + String get failedToGetGpsLocation => 'Не вдалося отримати GPS-координати'; + + @override + String failedToAdvertise(String error) { + return 'Failed to advertise: $error'; + } + + @override + String get cancelReconnection => 'Скасувати повторне підключення'; + + @override + String get general => 'Загальні'; + + @override + String get theme => 'Тема'; + + @override + String get chooseTheme => 'Вибрати тему'; + + @override + String get light => 'Світла'; + + @override + String get dark => 'Темна'; + + @override + String get blueLightTheme => 'Blue light theme'; + + @override + String get blueDarkTheme => 'Blue dark theme'; + + @override + String get sarRed => 'SAR Red'; + + @override + String get alertEmergencyMode => 'Alert/Emergency mode'; + + @override + String get sarGreen => 'SAR Green'; + + @override + String get safeAllClearMode => 'Safe/All Clear mode'; + + @override + String get autoSystem => 'Auto (System)'; + + @override + String get followSystemTheme => 'Follow system theme'; + + @override + String get showRxTxIndicators => 'Show RX/TX Indicators'; + + @override + String get displayPacketActivity => + 'Display packet activity indicators in top bar'; + + @override + String get disableMap => 'Disable Map'; + + @override + String get disableMapDescription => + 'Hide the map tab to reduce battery usage'; + + @override + String get language => 'Мова'; + + @override + String get chooseLanguage => 'Вибрати мову'; + + @override + String get save => 'Зберегти'; + + @override + String get cancel => 'Скасувати'; + + @override + String get close => 'Закрити'; + + @override + String get about => 'Про програму'; + + @override + String get appVersion => 'App Version'; + + @override + String get appName => 'App Name'; + + @override + String get aboutMeshCoreSar => 'About MeshCore SAR'; + + @override + String get aboutDescription => + 'A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use'; + + @override + String get technologiesUsed => 'Technologies Used:'; + + @override + String get technologiesList => + '• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage'; + + @override + String get moreInfo => 'More Info'; + + @override + String get packageName => 'Package Name'; + + @override + String get sampleData => 'Тестові дані'; + + @override + String get sampleDataDescription => + 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + + @override + String get loadSampleData => 'Завантажити тестові дані'; + + @override + String get clearAllData => 'Очистити всі дані'; + + @override + String get clearAllDataConfirmTitle => 'Clear All Data'; + + @override + String get clearAllDataConfirmMessage => + 'This will clear all contacts and SAR markers. Are you sure?'; + + @override + String get clear => 'Очистити'; + + @override + String loadedSampleData( + int teamCount, + int channelCount, + int sarCount, + int messageCount, + ) { + return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + } + + @override + String failedToLoadSampleData(String error) { + return 'Failed to load sample data: $error'; + } + + @override + String get allDataCleared => 'All data cleared'; + + @override + String get failedToStartBackgroundTracking => + 'Failed to start background tracking. Check permissions and BLE connection.'; + + @override + String locationBroadcast(String latitude, String longitude) { + return 'Location broadcast: $latitude, $longitude'; + } + + @override + String get defaultPinInfo => + 'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'; + + @override + String get noMessagesYet => 'Повідомлень ще немає'; + + @override + String get pullDownToSync => + 'Потягніть вниз, щоб синхронізувати повідомлення'; + + @override + String get deleteContact => 'Видалити контакт'; + + @override + String get delete => 'Видалити'; + + @override + String get viewOnMap => 'Показати на мапі'; + + @override + String get refresh => 'Оновити'; + + @override + String get resetPath => 'Reset Path (Re-route)'; + + @override + String get publicKeyCopied => 'Public key copied to clipboard'; + + @override + String copiedToClipboard(String label) { + return '$label copied to clipboard'; + } + + @override + String get pleaseEnterPassword => 'Будь ласка, введіть пароль'; + + @override + String failedToSyncContacts(String error) { + return 'Failed to sync contacts: $error'; + } + + @override + String get loggedInSuccessfully => + 'Вхід виконано успішно! Очікування повідомлень кімнати...'; + + @override + String get loginFailed => 'Помилка входу - неправильний пароль'; + + @override + String loggingIn(String roomName) { + return 'Вхід до $roomName...'; + } + + @override + String failedToSendLogin(String error) { + return 'Failed to send login: $error'; + } + + @override + String get lowLocationAccuracy => 'Низька точність геолокації'; + + @override + String get continue_ => 'Продовжити'; + + @override + String get sendSarMarker => 'Надіслати маркер SAR'; + + @override + String get deleteDrawing => 'Видалити рисунок'; + + @override + String get drawingTools => 'Інструменти малювання'; + + @override + String get drawLine => 'Намалювати лінію'; + + @override + String get drawLineDesc => 'Draw a freehand line on the map'; + + @override + String get drawRectangle => 'Намалювати прямокутник'; + + @override + String get drawRectangleDesc => 'Draw a rectangular area on the map'; + + @override + String get measureDistance => 'Виміряти відстань'; + + @override + String get measureDistanceDesc => 'Long press two points to measure'; + + @override + String get clearMeasurement => 'Очистити вимірювання'; + + @override + String distanceLabel(String distance) { + return 'Distance: $distance'; + } + + @override + String get longPressForSecondPoint => 'Long press for second point'; + + @override + String get longPressToStartMeasurement => 'Long press to set first point'; + + @override + String get longPressToStartNewMeasurement => + 'Long press to start new measurement'; + + @override + String get shareDrawings => 'Поділитися рисунками'; + + @override + String get clearAllDrawings => 'Очистити всі рисунки'; + + @override + String get completeLine => 'Complete Line'; + + @override + String broadcastDrawingsToTeam(int count, String plural) { + return 'Broadcast $count drawing$plural to team'; + } + + @override + String removeAllDrawings(int count, String plural) { + return 'Remove all $count drawing$plural'; + } + + @override + String deleteAllDrawingsConfirm(int count, String plural) { + return 'Delete all $count drawing$plural from the map?'; + } + + @override + String get drawing => 'Рисунок'; + + @override + String shareDrawingsCount(int count, String plural) { + return 'Share $count Drawing$plural'; + } + + @override + String get showReceivedDrawings => 'Показати отримані рисунки'; + + @override + String get showingAllDrawings => 'Showing all drawings'; + + @override + String get showingOnlyYourDrawings => 'Showing only your drawings'; + + @override + String get showSarMarkers => 'Показати маркери SAR'; + + @override + String get showingSarMarkers => 'Showing SAR markers'; + + @override + String get hidingSarMarkers => 'Hiding SAR markers'; + + @override + String get clearAll => 'Очистити все'; + + @override + String get publicChannel => 'Публічний канал'; + + @override + String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + + @override + String get storedPermanently => 'Stored permanently in room'; + + @override + String get notConnectedToDevice => 'Не підключено до пристрою'; + + @override + String get typeYourMessage => 'Введіть повідомлення...'; + + @override + String get quickLocationMarker => 'Швидкий маркер місця'; + + @override + String get markerType => 'Тип маркера'; + + @override + String get sendTo => 'Надіслати до'; + + @override + String get noDestinationsAvailable => 'No destinations available.'; + + @override + String get selectDestination => 'Виберіть отримувача...'; + + @override + String get ephemeralBroadcastInfo => + 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + + @override + String get persistentRoomInfo => + 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + + @override + String get location => 'Місцезнаходження'; + + @override + String get fromMap => 'From Map'; + + @override + String get gettingLocation => 'Отримання місцезнаходження...'; + + @override + String get locationError => 'Помилка геолокації'; + + @override + String get retry => 'Повторити'; + + @override + String get refreshLocation => 'Оновити місцезнаходження'; + + @override + String accuracyMeters(int accuracy) { + return 'Accuracy: ±${accuracy}m'; + } + + @override + String get notesOptional => 'Нотатки (необов’язково)'; + + @override + String get addAdditionalInformation => 'Add additional information...'; + + @override + String lowAccuracyWarning(int accuracy) { + return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + } + + @override + String get loginToRoom => 'Увійти до кімнати'; + + @override + String get enterPasswordInfo => + 'Enter the password to access this room. The password will be saved for future use.'; + + @override + String get password => 'Пароль'; + + @override + String get enterRoomPassword => 'Введіть пароль кімнати'; + + @override + String get loggingInDots => 'Вхід...'; + + @override + String get login => 'Увійти'; + + @override + String failedToAddRoom(String error) { + return 'Failed to add room to device: $error\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'; + } + + @override + String get direct => 'Напряму'; + + @override + String get flood => 'Flood'; + + @override + String get loggedIn => 'Увійшли'; + + @override + String get noGpsData => 'Немає GPS-даних'; + + @override + String get distance => 'Відстань'; + + @override + String directPingTimeout(String name) { + return 'Direct ping timeout - retrying $name with flooding...'; + } + + @override + String pingFailed(String name) { + return 'Ping failed to $name - no response received'; + } + + @override + String deleteContactConfirmation(String name) { + return 'Are you sure you want to delete \"$name\"?\n\nThis will remove the contact from both the app and the companion radio device.'; + } + + @override + String failedToRemoveContact(String error) { + return 'Failed to remove contact: $error'; + } + + @override + String get type => 'Тип'; + + @override + String get publicKey => 'Публічний ключ'; + + @override + String get lastSeen => 'Востаннє бачили'; + + @override + String get roomStatus => 'Стан кімнати'; + + @override + String get loginStatus => 'Стан входу'; + + @override + String get notLoggedIn => 'Не увійшли'; + + @override + String get adminAccess => 'Admin Access'; + + @override + String get yes => 'Так'; + + @override + String get no => 'Ні'; + + @override + String get permissions => 'Дозволи'; + + @override + String get passwordSaved => 'Password Saved'; + + @override + String get locationColon => 'Location:'; + + @override + String get telemetry => 'Телеметрія'; + + @override + String get voltage => 'Напруга'; + + @override + String get battery => 'Батарея'; + + @override + String get temperature => 'Температура'; + + @override + String get humidity => 'Вологість'; + + @override + String get pressure => 'Тиск'; + + @override + String get gpsTelemetry => 'GPS (Telemetry)'; + + @override + String get updated => 'Оновлено'; + + @override + String pathResetInfo(String name) { + return 'Path reset for $name. Next message will find a new route.'; + } + + @override + String get reLoginToRoom => 'Re-Login to Room'; + + @override + String get heading => 'Напрямок'; + + @override + String get elevation => 'Висота'; + + @override + String get accuracy => 'Точність'; + + @override + String get bearing => 'Пеленг'; + + @override + String get direction => 'Напрямок'; + + @override + String get filterMarkers => 'Фільтрувати маркери'; + + @override + String get filterMarkersTooltip => 'Filter markers'; + + @override + String get contactsFilter => 'Контакти'; + + @override + String get repeatersFilter => 'Ретранслятори'; + + @override + String get sarMarkers => 'Маркери SAR'; + + @override + String get foundPerson => 'Знайдена людина'; + + @override + String get fire => 'Пожежа'; + + @override + String get stagingArea => 'Зона збору'; + + @override + String get showAll => 'Показати все'; + + @override + String get locationUnavailable => 'Місцезнаходження недоступне'; + + @override + String get ahead => 'ahead'; + + @override + String degreesRight(int degrees) { + return '$degrees° right'; + } + + @override + String degreesLeft(int degrees) { + return '$degrees° left'; + } + + @override + String latLonFormat(String latitude, String longitude) { + return 'Lat: $latitude Lon: $longitude'; + } + + @override + String get noContactsYet => 'Контактів ще немає'; + + @override + String get connectToDeviceToLoadContacts => + 'Connect to a device to load contacts'; + + @override + String get teamMembers => 'Члени команди'; + + @override + String get repeaters => 'Ретранслятори'; + + @override + String get rooms => 'Кімнати'; + + @override + String get channels => 'Канали'; + + @override + String get selectMapLayer => 'Вибрати шар мапи'; + + @override + String get openStreetMap => 'OpenStreetMap'; + + @override + String get openTopoMap => 'OpenTopoMap'; + + @override + String get esriSatellite => 'ESRI Супутник'; + + @override + String get googleHybrid => 'Google Гібрид'; + + @override + String get googleRoadmap => 'Google Дорожня карта'; + + @override + String get googleTerrain => 'Google Рельєф'; + + @override + String get dragToPosition => 'Drag to Position'; + + @override + String get createSarMarker => 'Створити маркер SAR'; + + @override + String get compass => 'Компас'; + + @override + String get navigationAndContacts => 'Navigation & Contacts'; + + @override + String get sarAlert => 'ТРИВОГА SAR'; + + @override + String get textCopiedToClipboard => 'Text copied to clipboard'; + + @override + String get cannotReplySenderMissing => + 'Cannot reply: sender information missing'; + + @override + String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + + @override + String get copyText => 'Копіювати текст'; + + @override + String get saveAsTemplate => 'Save as Template'; + + @override + String get templateSaved => 'Template saved successfully'; + + @override + String get templateAlreadyExists => 'Template with this emoji already exists'; + + @override + String get deleteMessage => 'Видалити повідомлення'; + + @override + String get deleteMessageConfirmation => + 'Are you sure you want to delete this message?'; + + @override + String get shareLocation => 'Поділитися місцезнаходженням'; + + @override + String shareLocationText( + String markerInfo, + String lat, + String lon, + String url, + ) { + return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + } + + @override + String get sarLocationShare => 'SAR Location'; + + @override + String get justNow => 'Щойно'; + + @override + String minutesAgo(int minutes) { + return '$minutes хв тому'; + } + + @override + String hoursAgo(int hours) { + return '$hours год тому'; + } + + @override + String daysAgo(int days) { + return '$days дн тому'; + } + + @override + String secondsAgo(int seconds) { + return '$seconds с тому'; + } + + @override + String get sending => 'Надсилання...'; + + @override + String get sent => 'Надіслано'; + + @override + String get delivered => 'Доставлено'; + + @override + String deliveredWithTime(int time) { + return 'Delivered (${time}ms)'; + } + + @override + String get failed => 'Помилка'; + + @override + String get broadcast => 'Трансляція'; + + @override + String deliveredToContacts(int delivered, int total) { + return 'Delivered to $delivered/$total contacts'; + } + + @override + String get allDelivered => 'All delivered'; + + @override + String get recipientDetails => 'Recipient Details'; + + @override + String get pending => 'Очікує'; + + @override + String get sarMarkerFoundPerson => 'Found Person'; + + @override + String get sarMarkerFire => 'Fire Location'; + + @override + String get sarMarkerStagingArea => 'Staging Area'; + + @override + String get sarMarkerObject => 'Object Found'; + + @override + String get from => 'Від'; + + @override + String get coordinates => 'Координати'; + + @override + String get tapToViewOnMap => 'Торкніться, щоб переглянути на мапі'; + + @override + String get radioSettings => 'Налаштування радіо'; + + @override + String get frequencyMHz => 'Частота (MHz)'; + + @override + String get frequencyExample => 'e.g., 869.618'; + + @override + String get bandwidth => 'Ширина смуги'; + + @override + String get spreadingFactor => 'Коефіцієнт розширення'; + + @override + String get codingRate => 'Швидкість кодування'; + + @override + String get txPowerDbm => 'Потужність TX (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Макс: $power dBm'; + } + + @override + String get you => 'Ви'; + + @override + String exportFailed(String error) { + return 'Помилка експорту: $error'; + } + + @override + String importFailed(String error) { + return 'Помилка імпорту: $error'; + } + + @override + String get unknown => 'Невідомо'; + + @override + String get onlineLayers => 'Онлайн-шари'; + + @override + String get locationTrail => 'Слід місцезнаходження'; + + @override + String get showTrailOnMap => 'Показати слід на мапі'; + + @override + String get trailVisible => 'Trail is visible on the map'; + + @override + String get trailHiddenRecording => 'Trail is hidden (still recording)'; + + @override + String get duration => 'Тривалість'; + + @override + String get points => 'Точки'; + + @override + String get clearTrail => 'Очистити слід'; + + @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 => 'Слід ще не записано'; + + @override + String get startTrackingToRecord => + 'Start location tracking to record your trail'; + + @override + String get trailControls => 'Керування слідом'; + + @override + String get contactTrails => 'Сліди контактів'; + + @override + String get showAllContactTrails => 'Show All Contact Trails'; + + @override + String get noContactsWithLocationHistory => + 'No contacts with location history'; + + @override + String showingTrailsForContacts(int count) { + return 'Showing trails for $count contacts'; + } + + @override + String get individualContactTrails => 'Individual Contact Trails'; + + @override + String get deviceInformation => 'Інформація про пристрій'; + + @override + String get bleName => 'Назва BLE'; + + @override + String get meshName => 'Назва mesh'; + + @override + String get notSet => 'Не задано'; + + @override + String get model => 'Модель'; + + @override + String get version => 'Версія'; + + @override + String get buildDate => 'Дата збірки'; + + @override + String get firmware => 'Прошивка'; + + @override + String get maxContacts => 'Макс. контактів'; + + @override + String get maxChannels => 'Макс. каналів'; + + @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 => 'Шир.'; + + @override + String get lon => 'Довг.'; + + @override + String get useCurrentLocation => 'Використати поточне місцезнаходження'; + + @override + String get noneUnknown => 'None/Unknown'; + + @override + String get chatNode => 'Chat Node'; + + @override + String get 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'; + } + + @override + String get sarTemplates => 'Шаблони SAR'; + + @override + String get manageSarTemplates => 'Manage cursor on target templates'; + + @override + String get addTemplate => 'Додати шаблон'; + + @override + String get editTemplate => 'Редагувати шаблон'; + + @override + String get deleteTemplate => 'Видалити шаблон'; + + @override + String get templateName => 'Назва шаблону'; + + @override + String get templateNameHint => 'напр. Знайдена людина'; + + @override + String get templateEmoji => 'Emoji'; + + @override + String get emojiRequired => 'Emoji обов’язковий'; + + @override + String get nameRequired => 'Назва обов’язкова'; + + @override + String get templateDescription => 'Опис (необов’язково)'; + + @override + String get templateDescriptionHint => 'Додайте додатковий контекст...'; + + @override + String get templateColor => 'Колір'; + + @override + String get previewFormat => 'Попередній перегляд (формат повідомлення SAR)'; + + @override + String get importFromClipboard => 'Імпорт'; + + @override + String get exportToClipboard => 'Експорт'; + + @override + String deleteTemplateConfirmation(String name) { + return 'Delete template \'$name\'?'; + } + + @override + String get templateAdded => 'Шаблон додано'; + + @override + String get templateUpdated => 'Шаблон оновлено'; + + @override + String get templateDeleted => 'Шаблон видалено'; + + @override + String templatesImported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Imported $count templates', + one: 'Imported 1 template', + zero: 'No templates imported', + ); + return '$_temp0'; + } + + @override + String templatesExported(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Exported $count templates to clipboard', + one: 'Exported 1 template to clipboard', + ); + return '$_temp0'; + } + + @override + String get resetToDefaults => 'Скинути до стандартних'; + + @override + String get resetToDefaultsConfirmation => + 'This will delete all custom templates and restore the 4 default templates. Continue?'; + + @override + String get reset => 'Скинути'; + + @override + String get resetComplete => 'Templates reset to defaults'; + + @override + String get noTemplates => 'Немає доступних шаблонів'; + + @override + String get tapAddToCreate => 'Торкніться +, щоб створити перший шаблон'; + + @override + String get ok => 'OK'; + + @override + String get permissionsSection => 'Дозволи'; + + @override + String get locationPermission => 'Дозвіл на геолокацію'; + + @override + String get checking => 'Перевірка...'; + + @override + String get locationPermissionGrantedAlways => 'Granted (Always)'; + + @override + String get locationPermissionGrantedWhileInUse => 'Granted (While In Use)'; + + @override + String get locationPermissionDeniedTapToRequest => 'Denied - Tap to request'; + + @override + String get locationPermissionPermanentlyDeniedOpenSettings => + 'Permanently Denied - Open Settings'; + + @override + String get locationPermissionDialogContent => + 'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'; + + @override + String get openSettings => 'Відкрити налаштування'; + + @override + String get locationPermissionGranted => 'Дозвіл на геолокацію надано!'; + + @override + String get locationPermissionRequiredForGps => + 'Location permission is required for GPS tracking and location sharing.'; + + @override + String get locationPermissionAlreadyGranted => + 'Location permission is already granted.'; + + @override + String get sarNavyBlue => 'SAR Navy Blue'; + + @override + String get sarNavyBlueDescription => 'Professional/Operations Mode'; + + @override + String get selectRecipient => 'Вибрати отримувача'; + + @override + String get broadcastToAllNearby => 'Broadcast to all nearby'; + + @override + String get searchRecipients => 'Пошук отримувачів...'; + + @override + String get noContactsFound => 'Контактів не знайдено'; + + @override + String get noRoomsFound => 'Кімнат не знайдено'; + + @override + String get noRecipientsAvailable => 'Немає доступних отримувачів'; + + @override + String get noChannelsFound => 'Каналів не знайдено'; + + @override + String get newMessage => 'Нове повідомлення'; + + @override + String get channel => 'Канал'; + + @override + String get samplePoliceLead => 'Police Lead'; + + @override + String get sampleDroneOperator => 'Drone Operator'; + + @override + String get sampleFirefighterAlpha => 'Firefighter'; + + @override + String get sampleMedicCharlie => 'Medic'; + + @override + String get sampleCommandDelta => 'Command'; + + @override + String get sampleFireEngine => 'Fire Engine'; + + @override + String get sampleAirSupport => 'Air Support'; + + @override + String get sampleBaseCoordinator => 'Base Coordinator'; + + @override + String get channelEmergency => 'Надзвичайна ситуація'; + + @override + String get channelCoordination => 'Координація'; + + @override + String get channelUpdates => 'Оновлення'; + + @override + String get sampleTeamMember => 'Sample Team Member'; + + @override + String get sampleScout => 'Sample Scout'; + + @override + String get sampleBase => 'Sample Base'; + + @override + String get sampleSearcher => 'Sample Searcher'; + + @override + String get sampleObjectBackpack => ' Backpack found - blue color'; + + @override + String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + + @override + String get sampleObjectCamping => ' Camping equipment discovered'; + + @override + String get sampleObjectTrailMarker => ' Trail marker found off-path'; + + @override + String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + + @override + String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + + @override + String get sampleMsgBaseCamp => 'Base camp established at staging area'; + + @override + String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + + @override + String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + + @override + String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + + @override + String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + + @override + String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + + @override + String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + + @override + String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + + @override + String get sampleMsgTeamCharlie => 'Team requesting backup'; + + @override + String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + + @override + String get sampleMsgUrgentMedical => + 'URGENT: Medical assistance needed at sector 4'; + + @override + String get sampleMsgAdultMale => ' Adult male, conscious'; + + @override + String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + + @override + String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + + @override + String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + + @override + String get sampleMsgMedicalTeamEnRoute => + 'Medical team en route to your location'; + + @override + String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + + @override + String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + + @override + String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + + @override + String get sampleMsgEmergencyServices => + 'Emergency services notified and responding'; + + @override + String get sampleAlphaTeamLead => 'Team Lead'; + + @override + String get sampleBravoScout => 'Scout'; + + @override + String get sampleCharlieMedic => 'Medic'; + + @override + String get sampleDeltaNavigator => 'Navigator'; + + @override + String get sampleEchoSupport => 'Support'; + + @override + String get sampleBaseCommand => 'Base Command'; + + @override + String get sampleFieldCoordinator => 'Field Coordinator'; + + @override + String get sampleMedicalTeam => 'Medical Team'; + + @override + String get mapDrawing => 'Рисунок на мапі'; + + @override + String get navigateToDrawing => 'Navigate to Drawing'; + + @override + String get copyCoordinates => 'Копіювати координати'; + + @override + String get hideFromMap => 'Приховати з мапи'; + + @override + String get lineDrawing => 'Лінійний рисунок'; + + @override + String get rectangleDrawing => 'Рисунок прямокутника'; + + @override + String get manualCoordinates => 'Ручні координати'; + + @override + String get enterCoordinatesManually => 'Введіть координати вручну'; + + @override + String get latitudeLabel => 'Широта'; + + @override + String get longitudeLabel => 'Довгота'; + + @override + String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + + @override + String get shareDrawing => 'Поділитися рисунком'; + + @override + String get shareWithAllNearbyDevices => 'Share with all nearby devices'; + + @override + String get shareToRoom => 'Share to Room'; + + @override + String get sendToPersistentStorage => 'Send to persistent room storage'; + + @override + String get deleteDrawingConfirm => + 'Are you sure you want to delete this drawing?'; + + @override + String get drawingDeleted => 'Drawing deleted'; + + @override + String yourDrawingsCount(int count) { + return 'Your Drawings ($count)'; + } + + @override + String get shared => 'Shared'; + + @override + String get line => 'Лінія'; + + @override + String get rectangle => 'Прямокутник'; + + @override + String get updateAvailable => 'Доступне оновлення'; + + @override + String get currentVersion => 'Поточна'; + + @override + String get latestVersion => 'Остання'; + + @override + String get downloadUpdate => 'Завантажити'; + + @override + String get updateLater => 'Пізніше'; + + @override + String get cadastralParcels => 'Cadastral Parcels'; + + @override + String get forestRoads => 'Forest Roads'; + + @override + String get wmsOverlays => 'WMS Overlays'; + + @override + String get hikingTrails => 'Hiking Trails'; + + @override + String get mainRoads => 'Main Roads'; + + @override + String get houseNumbers => 'House Numbers'; + + @override + String get fireHazardZones => 'Fire Hazard Zones'; + + @override + String get historicalFires => 'Historical Fires'; + + @override + String get firebreaks => 'Firebreaks'; + + @override + String get krasFireZones => 'Kras Fire Zones'; + + @override + String get placeNames => 'Place Names'; + + @override + String get municipalityBorders => 'Municipality Borders'; + + @override + String get topographicMap => 'Topographic Map 1:25000'; + + @override + String get recentMessages => 'Останні повідомлення'; + + @override + String get addChannel => 'Додати канал'; + + @override + String get channelName => 'Назва каналу'; + + @override + String get channelNameHint => 'напр. Рятувальна команда Альфа'; + + @override + String get channelSecret => 'Секрет каналу'; + + @override + String get channelSecretHint => 'Спільний пароль для цього каналу'; + + @override + String get channelSecretHelp => + 'This secret must be shared with all team members who need access to this channel'; + + @override + String get channelTypesInfo => + 'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'; + + @override + String get hashChannelInfo => + 'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'; + + @override + String get channelNameRequired => 'Channel name is required'; + + @override + String get channelNameTooLong => 'Channel name must be 31 characters or less'; + + @override + String get channelSecretRequired => 'Channel secret is required'; + + @override + String get channelSecretTooLong => + 'Channel secret must be 32 characters or less'; + + @override + String get invalidAsciiCharacters => 'Only ASCII characters are allowed'; + + @override + String get channelCreatedSuccessfully => 'Channel created successfully'; + + @override + String channelCreationFailed(String error) { + return 'Failed to create channel: $error'; + } + + @override + String get deleteChannel => 'Delete Channel'; + + @override + String deleteChannelConfirmation(String channelName) { + return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + } + + @override + String get channelDeletedSuccessfully => 'Channel deleted successfully'; + + @override + String channelDeletionFailed(String error) { + return 'Failed to delete channel: $error'; + } + + @override + String get createChannel => 'Створити канал'; + + @override + String get wizardBack => 'Назад'; + + @override + String get wizardSkip => 'Пропустити'; + + @override + String get wizardNext => 'Далі'; + + @override + String get wizardGetStarted => 'Почати'; + + @override + String get wizardWelcomeTitle => 'Ласкаво просимо до MeshCore SAR'; + + @override + String get wizardWelcomeDescription => + 'A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.'; + + @override + String get wizardConnectingTitle => 'Підключення до радіо'; + + @override + String get wizardConnectingDescription => + 'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'; + + @override + String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + + @override + String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + + @override + String get wizardConnectingFeature3 => + 'Works completely offline - no internet required'; + + @override + String get wizardChannelTitle => 'Канали'; + + @override + String get wizardChannelDescription => + 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + + @override + String get wizardChannelFeature1 => + 'Public Channel for general team communication'; + + @override + String get wizardChannelFeature2 => + 'Create custom channels for specific groups'; + + @override + String get wizardChannelFeature3 => + 'Messages are automatically relayed by the mesh'; + + @override + String get wizardContactsTitle => 'Контакти'; + + @override + String get wizardContactsDescription => + 'Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.'; + + @override + String get wizardContactsFeature1 => 'Contacts discovered automatically'; + + @override + String get wizardContactsFeature2 => 'Send private direct messages'; + + @override + String get wizardContactsFeature3 => 'View battery level and last seen time'; + + @override + String get wizardMapTitle => 'Мапа та місцезнаходження'; + + @override + String get wizardMapDescription => + 'Track your team in real-time and mark important locations for search and rescue operations.'; + + @override + String get wizardMapFeature1 => + 'SAR markers for found persons, fires, and staging areas'; + + @override + String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + + @override + String get wizardMapFeature3 => 'Download offline maps for remote areas'; + + @override + String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + + @override + String get viewWelcomeTutorial => 'Переглянути вступний посібник'; + + @override + String get allTeamContacts => 'Усі контакти команди'; + + @override + String directMessagesInfo(int count) { + return 'Direct messages with ACKs. Sent to $count team members.'; + } + + @override + String sarMarkerSentToContacts(int count) { + return 'SAR marker sent to $count contacts'; + } + + @override + String get noContactsAvailable => 'Немає доступних контактів команди'; + + @override + String get reply => 'Відповісти'; + + @override + String get technicalDetails => 'Технічні деталі'; + + @override + String get messageTechnicalDetails => 'Message technical details'; + + @override + String get linkQuality => 'Link quality'; + + @override + String get delivery => 'Delivery'; + + @override + String get status => 'Статус'; + + @override + String get expectedAckTag => 'Expected ACK tag'; + + @override + String get roundTrip => 'Round-trip'; + + @override + String get retryAttempt => 'Retry attempt'; + + @override + String get floodFallback => 'Flood fallback'; + + @override + String get identity => 'Identity'; + + @override + String get messageId => 'Message ID'; + + @override + String get sender => 'Sender'; + + @override + String get senderKey => 'Sender key'; + + @override + String get recipient => 'Recipient'; + + @override + String get recipientKey => 'Recipient key'; + + @override + String get voice => 'Голос'; + + @override + String get voiceId => 'Voice ID'; + + @override + String get envelope => 'Envelope'; + + @override + String get sessionProgress => 'Session progress'; + + @override + String get complete => 'Завершено'; + + @override + String get rawDump => 'Raw dump'; + + @override + String get cannotRetryMissingRecipient => + 'Cannot retry: recipient information missing'; + + @override + String get voiceUnavailable => 'Голос зараз недоступний'; + + @override + String get requestingVoice => 'Requesting voice'; +} diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb new file mode 100644 index 0000000..020f931 --- /dev/null +++ b/lib/l10n/app_pl.arb @@ -0,0 +1,2280 @@ +{ + "@@locale": "pl", + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "The application title" + }, + "messages": "Wiadomości", + "@messages": { + "description": "Messages tab label" + }, + "contacts": "Kontakty", + "@contacts": { + "description": "Contacts tab label" + }, + "map": "Mapa", + "@map": { + "description": "Map tab label" + }, + "settings": "Ustawienia", + "@settings": { + "description": "Settings screen title" + }, + "connect": "Połącz", + "@connect": { + "description": "Connect button label" + }, + "disconnect": "Rozłącz", + "@disconnect": { + "description": "Disconnect button label" + }, + "noDevicesFound": "Nie znaleziono urządzeń", + "@noDevicesFound": { + "description": "Text shown when no BLE devices are found" + }, + "scanAgain": "Skanuj ponownie", + "@scanAgain": { + "description": "Button to restart BLE scanning" + }, + "tapToConnect": "Dotknij, aby połączyć", + "@tapToConnect": { + "description": "Subtitle text for device in scan list" + }, + "deviceNotConnected": "Urządzenie nie jest połączone", + "@deviceNotConnected": { + "description": "Error message when device is not connected" + }, + "locationPermissionDenied": "Odmówiono dostępu do lokalizacji", + "@locationPermissionDenied": { + "description": "Error when location permission is denied" + }, + "locationPermissionPermanentlyDenied": "Location permission permanently denied. Please enable in Settings.", + "@locationPermissionPermanentlyDenied": { + "description": "Error when location permission is permanently denied" + }, + "locationPermissionRequired": "Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.", + "@locationPermissionRequired": { + "description": "Message when location permission is needed" + }, + "locationServicesDisabled": "Usługi lokalizacji są wyłączone. Włącz je w Ustawieniach.", + "@locationServicesDisabled": { + "description": "Error when location services are disabled" + }, + "failedToGetGpsLocation": "Nie udało się pobrać lokalizacji GPS", + "@failedToGetGpsLocation": { + "description": "Error when GPS location cannot be obtained" + }, + "failedToAdvertise": "Failed to advertise: {error}", + "@failedToAdvertise": { + "description": "Error message for failed advertisement", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "cancelReconnection": "Anuluj ponowne łączenie", + "@cancelReconnection": { + "description": "Tooltip for cancel reconnection button" + }, + "general": "Ogólne", + "@general": { + "description": "General settings section header" + }, + "theme": "Motyw", + "@theme": { + "description": "Theme setting label" + }, + "chooseTheme": "Wybierz motyw", + "@chooseTheme": { + "description": "Theme selection dialog title" + }, + "light": "Jasny", + "@light": { + "description": "Light theme option" + }, + "dark": "Ciemny", + "@dark": { + "description": "Dark theme option" + }, + "blueLightTheme": "Blue light theme", + "@blueLightTheme": { + "description": "Description for blue light theme" + }, + "blueDarkTheme": "Blue dark theme", + "@blueDarkTheme": { + "description": "Description for blue dark theme" + }, + "sarRed": "SAR Red", + "@sarRed": { + "description": "SAR Red theme option" + }, + "alertEmergencyMode": "Alert/Emergency mode", + "@alertEmergencyMode": { + "description": "Description for SAR Red theme" + }, + "sarGreen": "SAR Green", + "@sarGreen": { + "description": "SAR Green theme option" + }, + "safeAllClearMode": "Safe/All Clear mode", + "@safeAllClearMode": { + "description": "Description for SAR Green theme" + }, + "autoSystem": "Auto (System)", + "@autoSystem": { + "description": "Auto/System theme option" + }, + "followSystemTheme": "Follow system theme", + "@followSystemTheme": { + "description": "Description for system theme" + }, + "showRxTxIndicators": "Show RX/TX Indicators", + "@showRxTxIndicators": { + "description": "Setting to show RX/TX indicators" + }, + "displayPacketActivity": "Display packet activity indicators in top bar", + "@displayPacketActivity": { + "description": "Description for RX/TX indicators setting" + }, + "disableMap": "Disable Map", + "@disableMap": { + "description": "Setting to disable the map tab" + }, + "disableMapDescription": "Hide the map tab to reduce battery usage", + "@disableMapDescription": { + "description": "Description for disable map setting" + }, + "language": "Język", + "@language": { + "description": "Language setting label" + }, + "chooseLanguage": "Wybierz język", + "@chooseLanguage": { + "description": "Language selection dialog title" + }, + "save": "Zapisz", + "@save": { + "description": "Save button label" + }, + "cancel": "Anuluj", + "@cancel": { + "description": "Cancel button label" + }, + "close": "Zamknij", + "@close": { + "description": "Close button label" + }, + "about": "Informacje", + "@about": { + "description": "About section header" + }, + "appVersion": "App Version", + "@appVersion": { + "description": "App version label" + }, + "appName": "App Name", + "@appName": { + "description": "App name label" + }, + "aboutMeshCoreSar": "About MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "About dialog title" + }, + "aboutDescription": "A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use", + "@aboutDescription": { + "description": "About dialog description" + }, + "technologiesUsed": "Technologies Used:", + "@technologiesUsed": { + "description": "Technologies used section title" + }, + "technologiesList": "• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage", + "@technologiesList": { + "description": "List of technologies used" + }, + "moreInfo": "More Info", + "@moreInfo": { + "description": "More info button label" + }, + "packageName": "Package Name", + "@packageName": { + "description": "Package name label" + }, + "sampleData": "Dane przykładowe", + "@sampleData": { + "description": "Sample data section header" + }, + "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "@sampleDataDescription": { + "description": "Sample data section description" + }, + "loadSampleData": "Wczytaj dane przykładowe", + "@loadSampleData": { + "description": "Load sample data button" + }, + "clearAllData": "Wyczyść wszystkie dane", + "@clearAllData": { + "description": "Clear all data button" + }, + "clearAllDataConfirmTitle": "Clear All Data", + "@clearAllDataConfirmTitle": { + "description": "Clear data confirmation dialog title" + }, + "clearAllDataConfirmMessage": "This will clear all contacts and SAR markers. Are you sure?", + "@clearAllDataConfirmMessage": { + "description": "Clear data confirmation message" + }, + "clear": "Wyczyść", + "@clear": { + "description": "Clear button label" + }, + "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "@loadedSampleData": { + "description": "Success message after loading sample data", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + "failedToLoadSampleData": "Failed to load sample data: {error}", + "@failedToLoadSampleData": { + "description": "Error message when sample data fails to load", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "allDataCleared": "All data cleared", + "@allDataCleared": { + "description": "Success message after clearing all data" + }, + "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "@failedToStartBackgroundTracking": { + "description": "Error message when background tracking fails to start" + }, + "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Success message for location broadcast", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "@defaultPinInfo": { + "description": "Information about default PIN for pairing" + }, + "noMessagesYet": "Brak wiadomości", + "@noMessagesYet": { + "description": "Empty state message when there are no messages" + }, + "pullDownToSync": "Przeciągnij w dół, aby zsynchronizować wiadomości", + "@pullDownToSync": { + "description": "Instruction to pull down to refresh messages" + }, + "deleteContact": "Usuń kontakt", + "@deleteContact": { + "description": "Delete contact action label" + }, + "delete": "Usuń", + "@delete": { + "description": "Delete button label" + }, + "viewOnMap": "Pokaż na mapie", + "@viewOnMap": { + "description": "Action to view contact location on map" + }, + "refresh": "Odśwież", + "@refresh": { + "description": "Refresh button label" + }, + "resetPath": "Reset Path (Re-route)", + "@resetPath": { + "description": "Action to reset contact path for re-routing" + }, + "publicKeyCopied": "Public key copied to clipboard", + "@publicKeyCopied": { + "description": "Success message when public key is copied" + }, + "copiedToClipboard": "{label} copied to clipboard", + "@copiedToClipboard": { + "description": "Success message when a value is copied to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "pleaseEnterPassword": "Wprowadź hasło", + "@pleaseEnterPassword": { + "description": "Validation message for empty password field" + }, + "failedToSyncContacts": "Failed to sync contacts: {error}", + "@failedToSyncContacts": { + "description": "Error message when contact sync fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "loggedInSuccessfully": "Zalogowano pomyślnie! Oczekiwanie na wiadomości z pokoju...", + "@loggedInSuccessfully": { + "description": "Success message after successful room login" + }, + "loginFailed": "Logowanie nie powiodło się - nieprawidłowe hasło", + "@loginFailed": { + "description": "Error message when room login fails" + }, + "loggingIn": "Logowanie do {roomName}...", + "@loggingIn": { + "description": "Status message during room login process", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "failedToSendLogin": "Failed to send login: {error}", + "@failedToSendLogin": { + "description": "Error message when login command fails to send", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "lowLocationAccuracy": "Niska dokładność lokalizacji", + "@lowLocationAccuracy": { + "description": "Warning title for low GPS accuracy" + }, + "continue_": "Kontynuuj", + "@continue_": { + "description": "Continue button label" + }, + "sendSarMarker": "Wyślij znacznik SAR", + "@sendSarMarker": { + "description": "Action to send SAR marker" + }, + "deleteDrawing": "Usuń rysunek", + "@deleteDrawing": { + "description": "Action to delete a map drawing" + }, + "drawingTools": "Narzędzia rysowania", + "@drawingTools": { + "description": "Drawing tools section or menu title" + }, + "drawLine": "Rysuj linię", + "@drawLine": { + "description": "Map drawing mode: line" + }, + "drawLineDesc": "Draw a freehand line on the map", + "@drawLineDesc": { + "description": "Description for line drawing mode" + }, + "drawRectangle": "Rysuj prostokąt", + "@drawRectangle": { + "description": "Map drawing mode: rectangle" + }, + "drawRectangleDesc": "Draw a rectangular area on the map", + "@drawRectangleDesc": { + "description": "Description for rectangle drawing mode" + }, + "measureDistance": "Mierz odległość", + "@measureDistance": { + "description": "Map drawing mode: measure distance" + }, + "measureDistanceDesc": "Long press two points to measure", + "@measureDistanceDesc": { + "description": "Description for distance measurement mode" + }, + "clearMeasurement": "Wyczyść pomiar", + "@clearMeasurement": { + "description": "Tooltip to clear measurement" + }, + "distanceLabel": "Distance: {distance}", + "@distanceLabel": { + "description": "Label showing measured distance", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + "longPressForSecondPoint": "Long press for second point", + "@longPressForSecondPoint": { + "description": "Instruction when first measurement point is set" + }, + "longPressToStartMeasurement": "Long press to set first point", + "@longPressToStartMeasurement": { + "description": "Instruction to start measurement" + }, + "longPressToStartNewMeasurement": "Long press to start new measurement", + "@longPressToStartNewMeasurement": { + "description": "Instruction to restart measurement after completion" + }, + "shareDrawings": "Udostępnij rysunki", + "@shareDrawings": { + "description": "Action to share drawings to network" + }, + "clearAllDrawings": "Wyczyść wszystkie rysunki", + "@clearAllDrawings": { + "description": "Action to clear all local drawings" + }, + "completeLine": "Complete Line", + "@completeLine": { + "description": "Tooltip to complete drawing a line" + }, + "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "@broadcastDrawingsToTeam": { + "description": "Subtitle showing how many drawings will be broadcast", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "removeAllDrawings": "Remove all {count} drawing{plural}", + "@removeAllDrawings": { + "description": "Subtitle for remove all drawings action", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "@deleteAllDrawingsConfirm": { + "description": "Confirmation dialog message for deleting all drawings", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "drawing": "Rysunek", + "@drawing": { + "description": "Generic drawing label" + }, + "shareDrawingsCount": "Share {count} Drawing{plural}", + "@shareDrawingsCount": { + "description": "Title for share drawings dialog", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "showReceivedDrawings": "Pokaż odebrane rysunki", + "@showReceivedDrawings": { + "description": "Toggle to show/hide received drawings from other team members" + }, + "showingAllDrawings": "Showing all drawings", + "@showingAllDrawings": { + "description": "Subtitle when received drawings are visible" + }, + "showingOnlyYourDrawings": "Showing only your drawings", + "@showingOnlyYourDrawings": { + "description": "Subtitle when received drawings are hidden" + }, + "showSarMarkers": "Pokaż znaczniki SAR", + "@showSarMarkers": { + "description": "Toggle to show/hide SAR markers on map" + }, + "showingSarMarkers": "Showing SAR markers", + "@showingSarMarkers": { + "description": "Subtitle when SAR markers are visible" + }, + "hidingSarMarkers": "Hiding SAR markers", + "@hidingSarMarkers": { + "description": "Subtitle when SAR markers are hidden" + }, + "clearAll": "Wyczyść wszystko", + "@clearAll": { + "description": "Clear all button label" + }, + "publicChannel": "Kanał publiczny", + "@publicChannel": { + "description": "Public channel option for sharing" + }, + "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "@broadcastToAll": { + "description": "Description for public channel broadcast" + }, + "storedPermanently": "Stored permanently in room", + "@storedPermanently": { + "description": "Description for room storage permanence" + }, + "notConnectedToDevice": "Brak połączenia z urządzeniem", + "@notConnectedToDevice": { + "description": "Error message when device is not connected for direct messaging" + }, + "typeYourMessage": "Wpisz wiadomość...", + "@typeYourMessage": { + "description": "Placeholder text for message input field" + }, + "quickLocationMarker": "Szybki znacznik lokalizacji", + "@quickLocationMarker": { + "description": "Subtitle for SAR marker sheet header" + }, + "markerType": "Typ znacznika", + "@markerType": { + "description": "Label for marker type selection section" + }, + "sendTo": "Wyślij do", + "@sendTo": { + "description": "Label for destination selection section" + }, + "noDestinationsAvailable": "No destinations available.", + "@noDestinationsAvailable": { + "description": "Warning when no rooms or channels exist" + }, + "selectDestination": "Wybierz odbiorcę...", + "@selectDestination": { + "description": "Placeholder for destination dropdown" + }, + "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "@ephemeralBroadcastInfo": { + "description": "Information about ephemeral channel broadcasts" + }, + "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "@persistentRoomInfo": { + "description": "Information about persistent room storage" + }, + "location": "Lokalizacja", + "@location": { + "description": "Label for location section" + }, + "fromMap": "From Map", + "@fromMap": { + "description": "Badge showing location is from map tap" + }, + "gettingLocation": "Pobieranie lokalizacji...", + "@gettingLocation": { + "description": "Loading message while fetching GPS location" + }, + "locationError": "Błąd lokalizacji", + "@locationError": { + "description": "Title for location error messages" + }, + "retry": "Ponów", + "@retry": { + "description": "Retry button label" + }, + "refreshLocation": "Odśwież lokalizację", + "@refreshLocation": { + "description": "Tooltip for refresh location button" + }, + "accuracyMeters": "Accuracy: ±{accuracy}m", + "@accuracyMeters": { + "description": "Display of GPS accuracy in meters", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "notesOptional": "Notatki (opcjonalnie)", + "@notesOptional": { + "description": "Label for optional notes field" + }, + "addAdditionalInformation": "Add additional information...", + "@addAdditionalInformation": { + "description": "Placeholder for notes field" + }, + "lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?", + "@lowAccuracyWarning": { + "description": "Warning dialog content for low GPS accuracy", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "loginToRoom": "Zaloguj do pokoju", + "@loginToRoom": { + "description": "Title for room login dialog" + }, + "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "@enterPasswordInfo": { + "description": "Information about room password" + }, + "password": "Hasło", + "@password": { + "description": "Password field label" + }, + "enterRoomPassword": "Wpisz hasło pokoju", + "@enterRoomPassword": { + "description": "Password field hint" + }, + "loggingInDots": "Logowanie...", + "@loggingInDots": { + "description": "Button text while logging in" + }, + "login": "Zaloguj", + "@login": { + "description": "Login button label" + }, + "failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.", + "@failedToAddRoom": { + "description": "Error message when adding room fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "direct": "Bezpośrednie", + "@direct": { + "description": "Direct routing indicator" + }, + "flood": "Flood", + "@flood": { + "description": "Flood routing indicator" + }, + "loggedIn": "Zalogowano", + "@loggedIn": { + "description": "Logged in status badge" + }, + "noGpsData": "Brak danych GPS", + "@noGpsData": { + "description": "Message when GPS data is not available" + }, + "distance": "Odległość", + "@distance": { + "description": "Distance label" + }, + "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "@directPingTimeout": { + "description": "Warning when direct ping times out", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "pingFailed": "Ping failed to {name} - no response received", + "@pingFailed": { + "description": "Error message when ping fails", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.", + "@deleteContactConfirmation": { + "description": "Confirmation message for deleting contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "failedToRemoveContact": "Failed to remove contact: {error}", + "@failedToRemoveContact": { + "description": "Error message when contact removal fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "type": "Typ", + "@type": { + "description": "Contact type label" + }, + "publicKey": "Klucz publiczny", + "@publicKey": { + "description": "Public key label" + }, + "lastSeen": "Ostatnio widziany", + "@lastSeen": { + "description": "Last seen label" + }, + "roomStatus": "Status pokoju", + "@roomStatus": { + "description": "Room status section header" + }, + "loginStatus": "Status logowania", + "@loginStatus": { + "description": "Login status label" + }, + "notLoggedIn": "Niezalogowany", + "@notLoggedIn": { + "description": "Not logged in status" + }, + "adminAccess": "Admin Access", + "@adminAccess": { + "description": "Admin access label" + }, + "yes": "Tak", + "@yes": { + "description": "Yes answer" + }, + "no": "Nie", + "@no": { + "description": "No answer" + }, + "permissions": "Uprawnienia", + "@permissions": { + "description": "Permissions label" + }, + "passwordSaved": "Password Saved", + "@passwordSaved": { + "description": "Password saved label" + }, + "locationColon": "Location:", + "@locationColon": { + "description": "Location section header" + }, + "telemetry": "Telemetria", + "@telemetry": { + "description": "Telemetry section header" + }, + "voltage": "Napięcie", + "@voltage": { + "description": "Voltage label" + }, + "battery": "Bateria", + "@battery": { + "description": "Battery label" + }, + "temperature": "Temperatura", + "@temperature": { + "description": "Temperature label" + }, + "humidity": "Wilgotność", + "@humidity": { + "description": "Humidity label" + }, + "pressure": "Ciśnienie", + "@pressure": { + "description": "Pressure label" + }, + "gpsTelemetry": "GPS (Telemetry)", + "@gpsTelemetry": { + "description": "GPS from telemetry label" + }, + "updated": "Zaktualizowano", + "@updated": { + "description": "Updated timestamp label" + }, + "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "@pathResetInfo": { + "description": "Info message after path reset", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "reLoginToRoom": "Re-Login to Room", + "@reLoginToRoom": { + "description": "Button to re-login to room" + }, + "heading": "Kierunek", + "@heading": { + "description": "Compass heading label" + }, + "elevation": "Wysokość", + "@elevation": { + "description": "Elevation/altitude label" + }, + "accuracy": "Dokładność", + "@accuracy": { + "description": "GPS accuracy label" + }, + "bearing": "Namiar", + "@bearing": { + "description": "Bearing label in compass" + }, + "direction": "Kierunek", + "@direction": { + "description": "Direction label in compass" + }, + "filterMarkers": "Filtruj znaczniki", + "@filterMarkers": { + "description": "Title for filter markers dialog" + }, + "filterMarkersTooltip": "Filter markers", + "@filterMarkersTooltip": { + "description": "Tooltip for filter button" + }, + "contactsFilter": "Kontakty", + "@contactsFilter": { + "description": "Filter option for contacts" + }, + "repeatersFilter": "Przekaźniki", + "@repeatersFilter": { + "description": "Filter option for repeaters" + }, + "sarMarkers": "Znaczniki SAR", + "@sarMarkers": { + "description": "SAR markers section header" + }, + "foundPerson": "Odnaleziona osoba", + "@foundPerson": { + "description": "Found person SAR marker type" + }, + "fire": "Pożar", + "@fire": { + "description": "Fire SAR marker type" + }, + "stagingArea": "Punkt zbiórki", + "@stagingArea": { + "description": "Staging area SAR marker type" + }, + "showAll": "Pokaż wszystko", + "@showAll": { + "description": "Button to show all filters" + }, + "locationUnavailable": "Lokalizacja niedostępna", + "@locationUnavailable": { + "description": "Message when GPS location is unavailable" + }, + "ahead": "ahead", + "@ahead": { + "description": "Relative bearing direction - ahead" + }, + "degreesRight": "{degrees}° right", + "@degreesRight": { + "description": "Relative bearing direction - right", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "degreesLeft": "{degrees}° left", + "@degreesLeft": { + "description": "Relative bearing direction - left", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Latitude and longitude display format", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "noContactsYet": "Brak kontaktów", + "@noContactsYet": { + "description": "Empty state message when there are no contacts" + }, + "connectToDeviceToLoadContacts": "Connect to a device to load contacts", + "@connectToDeviceToLoadContacts": { + "description": "Instruction to connect device to load contacts" + }, + "teamMembers": "Członkowie zespołu", + "@teamMembers": { + "description": "Section header for team members (chat contacts)" + }, + "repeaters": "Przekaźniki", + "@repeaters": { + "description": "Section header for repeater nodes" + }, + "rooms": "Pokoje", + "@rooms": { + "description": "Section header for rooms" + }, + "channels": "Kanały", + "@channels": { + "description": "Section header for broadcast channels" + }, + "selectMapLayer": "Wybierz warstwę mapy", + "@selectMapLayer": { + "description": "Title for map layer selection dialog" + }, + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "OpenStreetMap layer name" + }, + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "OpenTopoMap layer name" + }, + "esriSatellite": "Satelita ESRI", + "@esriSatellite": { + "description": "ESRI Satellite imagery layer name" + }, + "googleHybrid": "Google Hybrydowa", + "@googleHybrid": { + "description": "Google Hybrid layer name (satellite + labels)" + }, + "googleRoadmap": "Google Drogowa", + "@googleRoadmap": { + "description": "Google Roadmap layer name (street map)" + }, + "googleTerrain": "Google Teren", + "@googleTerrain": { + "description": "Google Terrain layer name (topographic)" + }, + "dragToPosition": "Drag to Position", + "@dragToPosition": { + "description": "Label when dragging a pin on map" + }, + "createSarMarker": "Utwórz znacznik SAR", + "@createSarMarker": { + "description": "Label for creating SAR marker from pin" + }, + "compass": "Kompas", + "@compass": { + "description": "Compass title in detailed compass dialog" + }, + "navigationAndContacts": "Navigation & Contacts", + "@navigationAndContacts": { + "description": "Subtitle for compass dialog" + }, + "sarAlert": "ALERT SAR", + "@sarAlert": { + "description": "Label for SAR alert badge on messages" + }, + "textCopiedToClipboard": "Text copied to clipboard", + "@textCopiedToClipboard": { + "description": "Success message when text is copied" + }, + "cannotReplySenderMissing": "Cannot reply: sender information missing", + "@cannotReplySenderMissing": { + "description": "Error when sender info is missing for reply" + }, + "cannotReplyContactNotFound": "Cannot reply: contact not found", + "@cannotReplyContactNotFound": { + "description": "Error when contact not found for reply" + }, + "copyText": "Kopiuj tekst", + "@copyText": { + "description": "Option to copy message text to clipboard" + }, + "saveAsTemplate": "Save as Template", + "@saveAsTemplate": { + "description": "Option to save SAR message as a reusable template" + }, + "templateSaved": "Template saved successfully", + "@templateSaved": { + "description": "Success message when SAR template is saved" + }, + "templateAlreadyExists": "Template with this emoji already exists", + "@templateAlreadyExists": { + "description": "Error message when trying to save duplicate template" + }, + "deleteMessage": "Usuń wiadomość", + "@deleteMessage": { + "description": "Dialog title for deleting a message" + }, + "deleteMessageConfirmation": "Are you sure you want to delete this message?", + "@deleteMessageConfirmation": { + "description": "Confirmation text for message deletion" + }, + "shareLocation": "Udostępnij lokalizację", + "@shareLocation": { + "description": "Option to share SAR marker location" + }, + "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "@shareLocationText": { + "description": "Formatted text for sharing SAR marker location", + "placeholders": { + "markerInfo": { + "type": "String" + }, + "lat": { + "type": "String" + }, + "lon": { + "type": "String" + }, + "url": { + "type": "String" + } + } + }, + "sarLocationShare": "SAR Location", + "@sarLocationShare": { + "description": "Subject line when sharing SAR marker location" + }, + "justNow": "Przed chwilą", + "@justNow": { + "description": "Time indicator for very recent activity" + }, + "minutesAgo": "{minutes} min temu", + "@minutesAgo": { + "description": "Time indicator for minutes ago", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "hoursAgo": "{hours} godz. temu", + "@hoursAgo": { + "description": "Time indicator for hours ago", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "daysAgo": "{days} dni temu", + "@daysAgo": { + "description": "Time indicator for days ago", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "secondsAgo": "{seconds} sek. temu", + "@secondsAgo": { + "description": "Time indicator for seconds ago", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sending": "Wysyłanie...", + "@sending": { + "description": "Delivery status: sending" + }, + "sent": "Wysłano", + "@sent": { + "description": "Delivery status: sent" + }, + "delivered": "Dostarczono", + "@delivered": { + "description": "Delivery status: delivered" + }, + "deliveredWithTime": "Delivered ({time}ms)", + "@deliveredWithTime": { + "description": "Delivery status with round-trip time", + "placeholders": { + "time": { + "type": "int" + } + } + }, + "failed": "Niepowodzenie", + "@failed": { + "description": "Delivery status: failed" + }, + "broadcast": "Nadawanie", + "@broadcast": { + "description": "Delivery status for channel messages (no echoes yet)" + }, + "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "@deliveredToContacts": { + "description": "Grouped message delivery count", + "placeholders": { + "delivered": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "allDelivered": "All delivered", + "@allDelivered": { + "description": "Status when all recipients received the message" + }, + "recipientDetails": "Recipient Details", + "@recipientDetails": { + "description": "Header for expandable recipient list" + }, + "pending": "Oczekujące", + "@pending": { + "description": "Delivery status: pending/waiting" + }, + "sarMarkerFoundPerson": "Found Person", + "@sarMarkerFoundPerson": { + "description": "SAR marker type: found person" + }, + "sarMarkerFire": "Fire Location", + "@sarMarkerFire": { + "description": "SAR marker type: fire" + }, + "sarMarkerStagingArea": "Staging Area", + "@sarMarkerStagingArea": { + "description": "SAR marker type: staging area" + }, + "sarMarkerObject": "Object Found", + "@sarMarkerObject": { + "description": "SAR marker type: object" + }, + "from": "Od", + "@from": { + "description": "Sender label in notifications" + }, + "coordinates": "Współrzędne", + "@coordinates": { + "description": "Coordinates label" + }, + "tapToViewOnMap": "Dotknij, aby zobaczyć na mapie", + "@tapToViewOnMap": { + "description": "Notification action text" + }, + "radioSettings": "Ustawienia radia", + "@radioSettings": { + "description": "Section title for radio settings" + }, + "frequencyMHz": "Częstotliwość (MHz)", + "@frequencyMHz": { + "description": "Label for radio frequency field" + }, + "frequencyExample": "e.g., 869.618", + "@frequencyExample": { + "description": "Helper text example for frequency" + }, + "bandwidth": "Szerokość pasma", + "@bandwidth": { + "description": "Label for bandwidth dropdown" + }, + "spreadingFactor": "Współczynnik rozpraszania", + "@spreadingFactor": { + "description": "Label for spreading factor dropdown" + }, + "codingRate": "Szybkość kodowania", + "@codingRate": { + "description": "Label for coding rate dropdown" + }, + "txPowerDbm": "Moc TX (dBm)", + "@txPowerDbm": { + "description": "Label for TX power field" + }, + "maxPowerDbm": "Maks: {power} dBm", + "@maxPowerDbm": { + "description": "Helper text showing maximum TX power", + "placeholders": { + "power": { + "type": "int" + } + } + }, + "you": "Ty", + "@you": { + "description": "Label for the current user in message bubbles" + }, + "exportFailed": "Eksport nie powiódł się: {error}", + "@exportFailed": { + "description": "Error message when export fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "importFailed": "Import nie powiódł się: {error}", + "@importFailed": { + "description": "Error message when import fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "unknown": "Nieznane", + "@unknown": { + "description": "Unknown value label" + }, + "onlineLayers": "Warstwy online", + "@onlineLayers": { + "description": "Section header for online map layers" + }, + "locationTrail": "Ślad lokalizacji", + "@locationTrail": { + "description": "Location trail title" + }, + "showTrailOnMap": "Pokaż ślad na mapie", + "@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" + }, + "duration": "Czas trwania", + "@duration": { + "description": "Duration label" + }, + "points": "Punkty", + "@points": { + "description": "Trail points count label" + }, + "clearTrail": "Wyczyść ślad", + "@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": "Brak zapisanego śladu", + "@noTrailRecorded": { + "description": "Message when no trail exists" + }, + "startTrackingToRecord": "Start location tracking to record your trail", + "@startTrackingToRecord": { + "description": "Instructions to start trail recording" + }, + "trailControls": "Sterowanie śladem", + "@trailControls": { + "description": "Trail controls tooltip" + }, + "contactTrails": "Ślady kontaktów", + "@contactTrails": { + "description": "Contact trails section header" + }, + "showAllContactTrails": "Show All Contact Trails", + "@showAllContactTrails": { + "description": "Toggle label to show all contact trails" + }, + "noContactsWithLocationHistory": "No contacts with location history", + "@noContactsWithLocationHistory": { + "description": "Subtitle when no contacts have trails" + }, + "showingTrailsForContacts": "Showing trails for {count} contacts", + "@showingTrailsForContacts": { + "description": "Subtitle showing number of contacts with trails", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "individualContactTrails": "Individual Contact Trails", + "@individualContactTrails": { + "description": "Expansion tile title for individual contact trails" + }, + "deviceInformation": "Informacje o urządzeniu", + "@deviceInformation": { + "description": "Device information section header" + }, + "bleName": "Nazwa BLE", + "@bleName": { + "description": "Bluetooth Low Energy device name label" + }, + "meshName": "Nazwa mesh", + "@meshName": { + "description": "Mesh network name label" + }, + "notSet": "Nie ustawiono", + "@notSet": { + "description": "Label when a value is not set" + }, + "model": "Model", + "@model": { + "description": "Device model label" + }, + "version": "Wersja", + "@version": { + "description": "Version label" + }, + "buildDate": "Data kompilacji", + "@buildDate": { + "description": "Firmware build date label" + }, + "firmware": "Firmware", + "@firmware": { + "description": "Firmware label" + }, + "maxContacts": "Maks. kontaktów", + "@maxContacts": { + "description": "Maximum contacts capacity label" + }, + "maxChannels": "Maks. kanałów", + "@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": "Szer.", + "@lat": { + "description": "Latitude field label (short form)" + }, + "lon": "Dł.", + "@lon": { + "description": "Longitude field label (short form)" + }, + "useCurrentLocation": "Użyj bieżącej lokalizacji", + "@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": "Przekaźnik", + "@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" + } + } + }, + "sarTemplates": "Szablony SAR", + "@sarTemplates": { + "description": "SAR templates menu title" + }, + "manageSarTemplates": "Manage cursor on target templates", + "@manageSarTemplates": { + "description": "Subtitle for SAR templates settings" + }, + "addTemplate": "Dodaj szablon", + "@addTemplate": { + "description": "Button to add new SAR template" + }, + "editTemplate": "Edytuj szablon", + "@editTemplate": { + "description": "Dialog title for editing template" + }, + "deleteTemplate": "Usuń szablon", + "@deleteTemplate": { + "description": "Action to delete template" + }, + "templateName": "Nazwa szablonu", + "@templateName": { + "description": "Label for template name field" + }, + "templateNameHint": "np. Odnaleziona osoba", + "@templateNameHint": { + "description": "Hint text for template name" + }, + "templateEmoji": "Emoji", + "@templateEmoji": { + "description": "Label for template emoji field" + }, + "emojiRequired": "Emoji jest wymagane", + "@emojiRequired": { + "description": "Validation error when emoji field is empty" + }, + "nameRequired": "Nazwa jest wymagana", + "@nameRequired": { + "description": "Validation error when name field is empty" + }, + "templateDescription": "Opis (opcjonalnie)", + "@templateDescription": { + "description": "Label for template description field" + }, + "templateDescriptionHint": "Dodaj dodatkowy kontekst...", + "@templateDescriptionHint": { + "description": "Hint text for template description" + }, + "templateColor": "Kolor", + "@templateColor": { + "description": "Label for template color picker" + }, + "previewFormat": "Podgląd (format wiadomości SAR)", + "@previewFormat": { + "description": "Label for format preview" + }, + "importFromClipboard": "Importuj", + "@importFromClipboard": { + "description": "Button to import templates from clipboard" + }, + "exportToClipboard": "Eksportuj", + "@exportToClipboard": { + "description": "Button to export templates to clipboard" + }, + "deleteTemplateConfirmation": "Delete template '{name}'?", + "@deleteTemplateConfirmation": { + "description": "Confirmation message for template deletion", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "templateAdded": "Dodano szablon", + "@templateAdded": { + "description": "Success message when template is added" + }, + "templateUpdated": "Zaktualizowano szablon", + "@templateUpdated": { + "description": "Success message when template is updated" + }, + "templateDeleted": "Usunięto szablon", + "@templateDeleted": { + "description": "Success message when template is deleted" + }, + "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "@templatesImported": { + "description": "Success message after importing templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "@templatesExported": { + "description": "Success message after exporting templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "resetToDefaults": "Przywróć domyślne", + "@resetToDefaults": { + "description": "Action to reset templates to defaults" + }, + "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "@resetToDefaultsConfirmation": { + "description": "Confirmation message for reset to defaults" + }, + "reset": "Resetuj", + "@reset": { + "description": "Reset button label" + }, + "resetComplete": "Templates reset to defaults", + "@resetComplete": { + "description": "Success message after reset" + }, + "noTemplates": "Brak dostępnych szablonów", + "@noTemplates": { + "description": "Message when no templates exist" + }, + "tapAddToCreate": "Dotknij +, aby utworzyć pierwszy szablon", + "@tapAddToCreate": { + "description": "Helper text when no templates exist" + }, + "ok": "OK", + "@ok": { + "description": "OK button label" + }, + "permissionsSection": "Uprawnienia", + "@permissionsSection": { + "description": "Permissions section header" + }, + "locationPermission": "Uprawnienie lokalizacji", + "@locationPermission": { + "description": "Location permission label" + }, + "checking": "Sprawdzanie...", + "@checking": { + "description": "Loading state indicator" + }, + "locationPermissionGrantedAlways": "Granted (Always)", + "@locationPermissionGrantedAlways": { + "description": "Location permission status: granted always" + }, + "locationPermissionGrantedWhileInUse": "Granted (While In Use)", + "@locationPermissionGrantedWhileInUse": { + "description": "Location permission status: granted while in use" + }, + "locationPermissionDeniedTapToRequest": "Denied - Tap to request", + "@locationPermissionDeniedTapToRequest": { + "description": "Location permission status: denied, user can request" + }, + "locationPermissionPermanentlyDeniedOpenSettings": "Permanently Denied - Open Settings", + "@locationPermissionPermanentlyDeniedOpenSettings": { + "description": "Location permission status: permanently denied" + }, + "locationPermissionDialogContent": "Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.", + "@locationPermissionDialogContent": { + "description": "Content for location permission dialog when permanently denied" + }, + "openSettings": "Otwórz ustawienia", + "@openSettings": { + "description": "Button to open device settings" + }, + "locationPermissionGranted": "Przyznano uprawnienie lokalizacji!", + "@locationPermissionGranted": { + "description": "Success message when location permission is granted" + }, + "locationPermissionRequiredForGps": "Location permission is required for GPS tracking and location sharing.", + "@locationPermissionRequiredForGps": { + "description": "Info message about location permission requirement" + }, + "locationPermissionAlreadyGranted": "Location permission is already granted.", + "@locationPermissionAlreadyGranted": { + "description": "Info message when permission is already granted" + }, + "sarNavyBlue": "SAR Navy Blue", + "@sarNavyBlue": { + "description": "SAR Navy Blue theme name" + }, + "sarNavyBlueDescription": "Professional/Operations Mode", + "@sarNavyBlueDescription": { + "description": "Description for SAR Navy Blue theme" + }, + "selectRecipient": "Wybierz odbiorcę", + "@selectRecipient": { + "description": "Title for recipient selector sheet" + }, + "broadcastToAllNearby": "Broadcast to all nearby", + "@broadcastToAllNearby": { + "description": "Subtitle for public channel option" + }, + "searchRecipients": "Szukaj odbiorców...", + "@searchRecipients": { + "description": "Placeholder text for recipient search field" + }, + "noContactsFound": "Nie znaleziono kontaktów", + "@noContactsFound": { + "description": "Message when no contacts match search" + }, + "noRoomsFound": "Nie znaleziono pokoi", + "@noRoomsFound": { + "description": "Message when no rooms match search" + }, + "noRecipientsAvailable": "Brak dostępnych odbiorców", + "@noRecipientsAvailable": { + "description": "Message when no recipients exist (contacts, rooms, or channels)" + }, + "noChannelsFound": "Nie znaleziono kanałów", + "@noChannelsFound": { + "description": "Message when no channels match the search" + }, + "newMessage": "Nowa wiadomość", + "@newMessage": { + "description": "Notification title for new message" + }, + "channel": "Kanał", + "@channel": { + "description": "Channel label in notifications" + }, + "samplePoliceLead": "Police Lead", + "@samplePoliceLead": { + "description": "Sample team member name" + }, + "sampleDroneOperator": "Drone Operator", + "@sampleDroneOperator": { + "description": "Sample team member name" + }, + "sampleFirefighterAlpha": "Firefighter", + "@sampleFirefighterAlpha": { + "description": "Sample team member name" + }, + "sampleMedicCharlie": "Medic", + "@sampleMedicCharlie": { + "description": "Sample team member name" + }, + "sampleCommandDelta": "Command", + "@sampleCommandDelta": { + "description": "Sample team member name" + }, + "sampleFireEngine": "Fire Engine", + "@sampleFireEngine": { + "description": "Sample team member name" + }, + "sampleAirSupport": "Air Support", + "@sampleAirSupport": { + "description": "Sample team member name" + }, + "sampleBaseCoordinator": "Base Coordinator", + "@sampleBaseCoordinator": { + "description": "Sample team member name" + }, + "channelEmergency": "Alarmowy", + "@channelEmergency": { + "description": "Emergency channel name" + }, + "channelCoordination": "Koordynacja", + "@channelCoordination": { + "description": "Coordination channel name" + }, + "channelUpdates": "Aktualizacje", + "@channelUpdates": { + "description": "Updates channel name" + }, + "sampleTeamMember": "Sample Team Member", + "@sampleTeamMember": { + "description": "Sample sender name" + }, + "sampleScout": "Sample Scout", + "@sampleScout": { + "description": "Sample sender name" + }, + "sampleBase": "Sample Base", + "@sampleBase": { + "description": "Sample sender name" + }, + "sampleSearcher": "Sample Searcher", + "@sampleSearcher": { + "description": "Sample sender name" + }, + "sampleObjectBackpack": " Backpack found - blue color", + "@sampleObjectBackpack": { + "description": "Sample object note" + }, + "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "@sampleObjectVehicle": { + "description": "Sample object note" + }, + "sampleObjectCamping": " Camping equipment discovered", + "@sampleObjectCamping": { + "description": "Sample object note" + }, + "sampleObjectTrailMarker": " Trail marker found off-path", + "@sampleObjectTrailMarker": { + "description": "Sample object note" + }, + "sampleMsgAllTeamsCheckIn": "All teams check in", + "@sampleMsgAllTeamsCheckIn": { + "description": "Sample channel message" + }, + "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "@sampleMsgWeatherUpdate": { + "description": "Sample channel message" + }, + "sampleMsgBaseCamp": "Base camp established at staging area", + "@sampleMsgBaseCamp": { + "description": "Sample channel message" + }, + "sampleMsgTeamAlpha": "Team moving to sector 2", + "@sampleMsgTeamAlpha": { + "description": "Sample channel message" + }, + "sampleMsgRadioCheck": "Radio check - all stations respond", + "@sampleMsgRadioCheck": { + "description": "Sample channel message" + }, + "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "@sampleMsgWaterSupply": { + "description": "Sample channel message" + }, + "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "@sampleMsgTeamBravo": { + "description": "Sample channel message" + }, + "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "@sampleMsgEtaRallyPoint": { + "description": "Sample channel message" + }, + "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "@sampleMsgSupplyDrop": { + "description": "Sample channel message" + }, + "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "@sampleMsgDroneSurvey": { + "description": "Sample channel message" + }, + "sampleMsgTeamCharlie": "Team requesting backup", + "@sampleMsgTeamCharlie": { + "description": "Sample channel message" + }, + "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "@sampleMsgRadioDiscipline": { + "description": "Sample channel message" + }, + "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "@sampleMsgUrgentMedical": { + "description": "Sample emergency message" + }, + "sampleMsgAdultMale": " Adult male, conscious", + "@sampleMsgAdultMale": { + "description": "Sample emergency message note" + }, + "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "@sampleMsgFireSpotted": { + "description": "Sample emergency message" + }, + "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "@sampleMsgSpreadingRapidly": { + "description": "Sample emergency message note" + }, + "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "@sampleMsgPriorityHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "@sampleMsgMedicalTeamEnRoute": { + "description": "Sample emergency message" + }, + "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "@sampleMsgEvacHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "@sampleMsgEmergencyResolved": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyStagingArea": " Emergency staging area", + "@sampleMsgEmergencyStagingArea": { + "description": "Sample emergency message note" + }, + "sampleMsgEmergencyServices": "Emergency services notified and responding", + "@sampleMsgEmergencyServices": { + "description": "Sample emergency message" + }, + "sampleAlphaTeamLead": "Team Lead", + "@sampleAlphaTeamLead": { + "description": "Sample team name" + }, + "sampleBravoScout": "Scout", + "@sampleBravoScout": { + "description": "Sample team name" + }, + "sampleCharlieMedic": "Medic", + "@sampleCharlieMedic": { + "description": "Sample team name" + }, + "sampleDeltaNavigator": "Navigator", + "@sampleDeltaNavigator": { + "description": "Sample team name" + }, + "sampleEchoSupport": "Support", + "@sampleEchoSupport": { + "description": "Sample team name" + }, + "sampleBaseCommand": "Base Command", + "@sampleBaseCommand": { + "description": "Sample team name" + }, + "sampleFieldCoordinator": "Field Coordinator", + "@sampleFieldCoordinator": { + "description": "Sample team name" + }, + "sampleMedicalTeam": "Medical Team", + "@sampleMedicalTeam": { + "description": "Sample team name" + }, + "mapDrawing": "Rysunek mapy", + "@mapDrawing": { + "description": "Label for map drawing messages" + }, + "navigateToDrawing": "Navigate to Drawing", + "@navigateToDrawing": { + "description": "Option to navigate to drawing on map" + }, + "copyCoordinates": "Kopiuj współrzędne", + "@copyCoordinates": { + "description": "Option to copy coordinates to clipboard" + }, + "hideFromMap": "Ukryj na mapie", + "@hideFromMap": { + "description": "Option to hide drawing from map" + }, + "lineDrawing": "Rysunek linii", + "@lineDrawing": { + "description": "Label for line type drawings" + }, + "rectangleDrawing": "Rysunek prostokąta", + "@rectangleDrawing": { + "description": "Label for rectangle type drawings" + }, + "manualCoordinates": "Współrzędne ręczne", + "@manualCoordinates": { + "description": "Label for manual coordinate input toggle" + }, + "enterCoordinatesManually": "Wprowadź współrzędne ręcznie", + "@enterCoordinatesManually": { + "description": "Description for manual coordinate input option" + }, + "latitudeLabel": "Szerokość geograficzna", + "@latitudeLabel": { + "description": "Label for latitude input field" + }, + "longitudeLabel": "Długość geograficzna", + "@longitudeLabel": { + "description": "Label for longitude input field" + }, + "exampleCoordinates": "Example: 46.0569, 14.5058", + "@exampleCoordinates": { + "description": "Example coordinate format hint" + }, + "shareDrawing": "Udostępnij rysunek", + "@shareDrawing": { + "description": "Title for share single drawing dialog" + }, + "shareWithAllNearbyDevices": "Share with all nearby devices", + "@shareWithAllNearbyDevices": { + "description": "Subtitle for public channel sharing option" + }, + "shareToRoom": "Share to Room", + "@shareToRoom": { + "description": "Header for room sharing section" + }, + "sendToPersistentStorage": "Send to persistent room storage", + "@sendToPersistentStorage": { + "description": "Subtitle for room sharing option" + }, + "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "@deleteDrawingConfirm": { + "description": "Confirmation message for deleting a single drawing" + }, + "drawingDeleted": "Drawing deleted", + "@drawingDeleted": { + "description": "Success message after deleting a drawing" + }, + "yourDrawingsCount": "Your Drawings ({count})", + "@yourDrawingsCount": { + "description": "Header showing count of user's drawings", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shared": "Shared", + "@shared": { + "description": "Status label for shared drawings" + }, + "line": "Linia", + "@line": { + "description": "Line drawing type label" + }, + "rectangle": "Prostokąt", + "@rectangle": { + "description": "Rectangle drawing type label" + }, + "updateAvailable": "Dostępna aktualizacja", + "@updateAvailable": { + "description": "Title for update dialog when new version is available" + }, + "currentVersion": "Bieżąca", + "@currentVersion": { + "description": "Label for current app version" + }, + "latestVersion": "Najnowsza", + "@latestVersion": { + "description": "Label for latest available app version" + }, + "downloadUpdate": "Pobierz", + "@downloadUpdate": { + "description": "Button to download app update" + }, + "updateLater": "Później", + "@updateLater": { + "description": "Button to dismiss update dialog" + }, + "cadastralParcels": "Cadastral Parcels", + "@cadastralParcels": { + "description": "Label for cadastral parcels WMS overlay layer" + }, + "forestRoads": "Forest Roads", + "@forestRoads": { + "description": "Label for forest roads WMS overlay layer" + }, + "wmsOverlays": "WMS Overlays", + "@wmsOverlays": { + "description": "Section header for WMS overlay layers in layer selector" + }, + "hikingTrails": "Hiking Trails", + "@hikingTrails": { + "description": "Label for hiking/mountain trails WMS overlay layer" + }, + "mainRoads": "Main Roads", + "@mainRoads": { + "description": "Label for main roads WMS overlay layer" + }, + "houseNumbers": "House Numbers", + "@houseNumbers": { + "description": "Label for house numbers WMS overlay layer" + }, + "fireHazardZones": "Fire Hazard Zones", + "@fireHazardZones": { + "description": "Label for fire hazard risk zones WMS overlay layer" + }, + "historicalFires": "Historical Fires", + "@historicalFires": { + "description": "Label for historical forest fires WMS overlay layer" + }, + "firebreaks": "Firebreaks", + "@firebreaks": { + "description": "Label for firebreaks WMS overlay layer" + }, + "krasFireZones": "Kras Fire Zones", + "@krasFireZones": { + "description": "Label for Kras fire zones WMS overlay layer" + }, + "placeNames": "Place Names", + "@placeNames": { + "description": "Label for geographic place names WMS overlay layer" + }, + "municipalityBorders": "Municipality Borders", + "@municipalityBorders": { + "description": "Label for municipality borders WMS overlay layer" + }, + "topographicMap": "Topographic Map 1:25000", + "@topographicMap": { + "description": "Label for DTK25 topographic base map layer" + }, + "recentMessages": "Ostatnie wiadomości", + "@recentMessages": { + "description": "Header for recent messages overlay on map in fullscreen mode" + }, + "addChannel": "Dodaj kanał", + "@addChannel": { + "description": "Button to add a new channel" + }, + "channelName": "Nazwa kanału", + "@channelName": { + "description": "Label for channel name field" + }, + "channelNameHint": "np. Zespół Ratunkowy Alfa", + "@channelNameHint": { + "description": "Hint for channel name field" + }, + "channelSecret": "Sekret kanału", + "@channelSecret": { + "description": "Label for channel secret field" + }, + "channelSecretHint": "Wspólne hasło dla tego kanału", + "@channelSecretHint": { + "description": "Hint for channel secret field" + }, + "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "@channelSecretHelp": { + "description": "Help text explaining channel secret" + }, + "channelTypesInfo": "Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.", + "@channelTypesInfo": { + "description": "Information banner explaining hash and private channel types" + }, + "hashChannelInfo": "Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.", + "@hashChannelInfo": { + "description": "Help text for hash channels (# prefix)" + }, + "channelNameRequired": "Channel name is required", + "@channelNameRequired": { + "description": "Validation error for empty channel name" + }, + "channelNameTooLong": "Channel name must be 31 characters or less", + "@channelNameTooLong": { + "description": "Validation error for channel name too long" + }, + "channelSecretRequired": "Channel secret is required", + "@channelSecretRequired": { + "description": "Validation error for empty channel secret" + }, + "channelSecretTooLong": "Channel secret must be 32 characters or less", + "@channelSecretTooLong": { + "description": "Validation error for channel secret too long" + }, + "invalidAsciiCharacters": "Only ASCII characters are allowed", + "@invalidAsciiCharacters": { + "description": "Validation error for non-ASCII characters" + }, + "channelCreatedSuccessfully": "Channel created successfully", + "@channelCreatedSuccessfully": { + "description": "Success message after creating channel" + }, + "channelCreationFailed": "Failed to create channel: {error}", + "@channelCreationFailed": { + "description": "Error message when channel creation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "deleteChannel": "Delete Channel", + "@deleteChannel": { + "description": "Delete channel button/menu item" + }, + "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "@deleteChannelConfirmation": { + "description": "Confirmation dialog when deleting a channel", + "placeholders": { + "channelName": { + "type": "String" + } + } + }, + "channelDeletedSuccessfully": "Channel deleted successfully", + "@channelDeletedSuccessfully": { + "description": "Success message after deleting channel" + }, + "channelDeletionFailed": "Failed to delete channel: {error}", + "@channelDeletionFailed": { + "description": "Error message when channel deletion fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createChannel": "Utwórz kanał", + "@createChannel": { + "description": "Button text for creating a channel" + }, + "wizardBack": "Wstecz", + "@wizardBack": { + "description": "Wizard back button text" + }, + "wizardSkip": "Pomiń", + "@wizardSkip": { + "description": "Wizard skip button text" + }, + "wizardNext": "Dalej", + "@wizardNext": { + "description": "Wizard next button text" + }, + "wizardGetStarted": "Zaczynaj", + "@wizardGetStarted": { + "description": "Wizard final button text to complete onboarding" + }, + "wizardWelcomeTitle": "Witamy w MeshCore SAR", + "@wizardWelcomeTitle": { + "description": "Welcome wizard first page title" + }, + "wizardWelcomeDescription": "A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.", + "@wizardWelcomeDescription": { + "description": "Welcome wizard first page description" + }, + "wizardConnectingTitle": "Łączenie z radiem", + "@wizardConnectingTitle": { + "description": "Wizard connecting page title" + }, + "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "@wizardConnectingDescription": { + "description": "Wizard connecting page description" + }, + "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "@wizardConnectingFeature1": { + "description": "Wizard connecting feature 1" + }, + "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "@wizardConnectingFeature2": { + "description": "Wizard connecting feature 2" + }, + "wizardConnectingFeature3": "Works completely offline - no internet required", + "@wizardConnectingFeature3": { + "description": "Wizard connecting feature 3" + }, + "wizardChannelTitle": "Kanały", + "@wizardChannelTitle": { + "description": "Wizard channel page title" + }, + "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "@wizardChannelDescription": { + "description": "Wizard channel page description" + }, + "wizardChannelFeature1": "Public Channel for general team communication", + "@wizardChannelFeature1": { + "description": "Wizard channel feature 1" + }, + "wizardChannelFeature2": "Create custom channels for specific groups", + "@wizardChannelFeature2": { + "description": "Wizard channel feature 2" + }, + "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "@wizardChannelFeature3": { + "description": "Wizard channel feature 3" + }, + "wizardContactsTitle": "Kontakty", + "@wizardContactsTitle": { + "description": "Wizard contacts page title" + }, + "wizardContactsDescription": "Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.", + "@wizardContactsDescription": { + "description": "Wizard contacts page description" + }, + "wizardContactsFeature1": "Contacts discovered automatically", + "@wizardContactsFeature1": { + "description": "Wizard contacts feature 1" + }, + "wizardContactsFeature2": "Send private direct messages", + "@wizardContactsFeature2": { + "description": "Wizard contacts feature 2" + }, + "wizardContactsFeature3": "View battery level and last seen time", + "@wizardContactsFeature3": { + "description": "Wizard contacts feature 3" + }, + "wizardMapTitle": "Mapa i lokalizacja", + "@wizardMapTitle": { + "description": "Wizard map page title" + }, + "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "@wizardMapDescription": { + "description": "Wizard map page description" + }, + "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "@wizardMapFeature1": { + "description": "Wizard map feature 1" + }, + "wizardMapFeature2": "Real-time GPS tracking of team members", + "@wizardMapFeature2": { + "description": "Wizard map feature 2" + }, + "wizardMapFeature3": "Download offline maps for remote areas", + "@wizardMapFeature3": { + "description": "Wizard map feature 3" + }, + "wizardMapFeature4": "Draw shapes and share tactical information", + "@wizardMapFeature4": { + "description": "Wizard map feature 4" + }, + "viewWelcomeTutorial": "Pokaż samouczek powitalny", + "@viewWelcomeTutorial": { + "description": "Settings option to re-show welcome wizard" + }, + "allTeamContacts": "Wszystkie kontakty zespołu", + "@allTeamContacts": { + "description": "Destination option to send SAR marker to all team contacts" + }, + "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "@directMessagesInfo": { + "description": "Information about sending to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "@sarMarkerSentToContacts": { + "description": "Success message after sending SAR marker to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noContactsAvailable": "Brak kontaktów zespołu", + "@noContactsAvailable": { + "description": "Message when there are no chat contacts to send to" + }, + "reply": "Odpowiedz", + "@reply": {}, + "technicalDetails": "Szczegóły techniczne", + "@technicalDetails": {}, + "messageTechnicalDetails": "Message technical details", + "@messageTechnicalDetails": {}, + "linkQuality": "Link quality", + "@linkQuality": {}, + "delivery": "Delivery", + "@delivery": {}, + "status": "Status", + "@status": {}, + "expectedAckTag": "Expected ACK tag", + "@expectedAckTag": {}, + "roundTrip": "Round-trip", + "@roundTrip": {}, + "retryAttempt": "Retry attempt", + "@retryAttempt": {}, + "floodFallback": "Flood fallback", + "@floodFallback": {}, + "identity": "Identity", + "@identity": {}, + "messageId": "Message ID", + "@messageId": {}, + "sender": "Sender", + "@sender": {}, + "senderKey": "Sender key", + "@senderKey": {}, + "recipient": "Recipient", + "@recipient": {}, + "recipientKey": "Recipient key", + "@recipientKey": {}, + "voice": "Głos", + "@voice": {}, + "voiceId": "Voice ID", + "@voiceId": {}, + "envelope": "Envelope", + "@envelope": {}, + "sessionProgress": "Session progress", + "@sessionProgress": {}, + "complete": "Zakończono", + "@complete": {}, + "rawDump": "Raw dump", + "@rawDump": {}, + "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "@cannotRetryMissingRecipient": {}, + "voiceUnavailable": "Głos jest obecnie niedostępny", + "@voiceUnavailable": {}, + "requestingVoice": "Requesting voice", + "@requestingVoice": {} +} diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb new file mode 100644 index 0000000..ef38599 --- /dev/null +++ b/lib/l10n/app_pt.arb @@ -0,0 +1,2280 @@ +{ + "@@locale": "pt", + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "The application title" + }, + "messages": "Mensagens", + "@messages": { + "description": "Messages tab label" + }, + "contacts": "Contatos", + "@contacts": { + "description": "Contacts tab label" + }, + "map": "Mapa", + "@map": { + "description": "Map tab label" + }, + "settings": "Configurações", + "@settings": { + "description": "Settings screen title" + }, + "connect": "Conectar", + "@connect": { + "description": "Connect button label" + }, + "disconnect": "Desconectar", + "@disconnect": { + "description": "Disconnect button label" + }, + "noDevicesFound": "Nenhum dispositivo encontrado", + "@noDevicesFound": { + "description": "Text shown when no BLE devices are found" + }, + "scanAgain": "Escanear novamente", + "@scanAgain": { + "description": "Button to restart BLE scanning" + }, + "tapToConnect": "Toque para conectar", + "@tapToConnect": { + "description": "Subtitle text for device in scan list" + }, + "deviceNotConnected": "Dispositivo não conectado", + "@deviceNotConnected": { + "description": "Error message when device is not connected" + }, + "locationPermissionDenied": "Permissão de localização negada", + "@locationPermissionDenied": { + "description": "Error when location permission is denied" + }, + "locationPermissionPermanentlyDenied": "Permissão de localização negada permanentemente. Ative-a em Configurações.", + "@locationPermissionPermanentlyDenied": { + "description": "Error when location permission is permanently denied" + }, + "locationPermissionRequired": "A permissão de localização é necessária para rastreamento GPS e coordenação da equipe. Você pode ativá-la depois em Configurações.", + "@locationPermissionRequired": { + "description": "Message when location permission is needed" + }, + "locationServicesDisabled": "Os serviços de localização estão desativados. Ative-os em Configurações.", + "@locationServicesDisabled": { + "description": "Error when location services are disabled" + }, + "failedToGetGpsLocation": "Falha ao obter localização GPS", + "@failedToGetGpsLocation": { + "description": "Error when GPS location cannot be obtained" + }, + "failedToAdvertise": "Falha ao anunciar: {error}", + "@failedToAdvertise": { + "description": "Error message for failed advertisement", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "cancelReconnection": "Cancelar reconexão", + "@cancelReconnection": { + "description": "Tooltip for cancel reconnection button" + }, + "general": "Geral", + "@general": { + "description": "General settings section header" + }, + "theme": "Tema", + "@theme": { + "description": "Theme setting label" + }, + "chooseTheme": "Escolher tema", + "@chooseTheme": { + "description": "Theme selection dialog title" + }, + "light": "Claro", + "@light": { + "description": "Light theme option" + }, + "dark": "Escuro", + "@dark": { + "description": "Dark theme option" + }, + "blueLightTheme": "Tema azul claro", + "@blueLightTheme": { + "description": "Description for blue light theme" + }, + "blueDarkTheme": "Tema azul escuro", + "@blueDarkTheme": { + "description": "Description for blue dark theme" + }, + "sarRed": "SAR Vermelho", + "@sarRed": { + "description": "SAR Red theme option" + }, + "alertEmergencyMode": "Modo de alerta/emergência", + "@alertEmergencyMode": { + "description": "Description for SAR Red theme" + }, + "sarGreen": "SAR Verde", + "@sarGreen": { + "description": "SAR Green theme option" + }, + "safeAllClearMode": "Modo seguro/tudo limpo", + "@safeAllClearMode": { + "description": "Description for SAR Green theme" + }, + "autoSystem": "Automático (Sistema)", + "@autoSystem": { + "description": "Auto/System theme option" + }, + "followSystemTheme": "Seguir tema do sistema", + "@followSystemTheme": { + "description": "Description for system theme" + }, + "showRxTxIndicators": "Mostrar indicadores RX/TX", + "@showRxTxIndicators": { + "description": "Setting to show RX/TX indicators" + }, + "displayPacketActivity": "Exibir indicadores de atividade de pacotes na barra superior", + "@displayPacketActivity": { + "description": "Description for RX/TX indicators setting" + }, + "disableMap": "Desativar mapa", + "@disableMap": { + "description": "Setting to disable the map tab" + }, + "disableMapDescription": "Ocultar a aba de mapa para reduzir o uso de bateria", + "@disableMapDescription": { + "description": "Description for disable map setting" + }, + "language": "Idioma", + "@language": { + "description": "Language setting label" + }, + "chooseLanguage": "Escolher idioma", + "@chooseLanguage": { + "description": "Language selection dialog title" + }, + "save": "Salvar", + "@save": { + "description": "Save button label" + }, + "cancel": "Cancelar", + "@cancel": { + "description": "Cancel button label" + }, + "close": "Fechar", + "@close": { + "description": "Close button label" + }, + "about": "Sobre", + "@about": { + "description": "About section header" + }, + "appVersion": "Versão do app", + "@appVersion": { + "description": "App version label" + }, + "appName": "Nome do app", + "@appName": { + "description": "App name label" + }, + "aboutMeshCoreSar": "About MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "About dialog title" + }, + "aboutDescription": "A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use", + "@aboutDescription": { + "description": "About dialog description" + }, + "technologiesUsed": "Technologies Used:", + "@technologiesUsed": { + "description": "Technologies used section title" + }, + "technologiesList": "• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage", + "@technologiesList": { + "description": "List of technologies used" + }, + "moreInfo": "Mais informações", + "@moreInfo": { + "description": "More info button label" + }, + "packageName": "Package Name", + "@packageName": { + "description": "Package name label" + }, + "sampleData": "Dados de exemplo", + "@sampleData": { + "description": "Sample data section header" + }, + "sampleDataDescription": "Carregar ou limpar contatos, mensagens de canal e marcadores SAR de exemplo para testes", + "@sampleDataDescription": { + "description": "Sample data section description" + }, + "loadSampleData": "Carregar dados de exemplo", + "@loadSampleData": { + "description": "Load sample data button" + }, + "clearAllData": "Limpar todos os dados", + "@clearAllData": { + "description": "Clear all data button" + }, + "clearAllDataConfirmTitle": "Limpar todos os dados", + "@clearAllDataConfirmTitle": { + "description": "Clear data confirmation dialog title" + }, + "clearAllDataConfirmMessage": "Isso limpará todos os contatos e marcadores SAR. Tem certeza?", + "@clearAllDataConfirmMessage": { + "description": "Clear data confirmation message" + }, + "clear": "Limpar", + "@clear": { + "description": "Clear button label" + }, + "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "@loadedSampleData": { + "description": "Success message after loading sample data", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + "failedToLoadSampleData": "Falha ao carregar dados de exemplo: {error}", + "@failedToLoadSampleData": { + "description": "Error message when sample data fails to load", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "allDataCleared": "Todos os dados foram limpos", + "@allDataCleared": { + "description": "Success message after clearing all data" + }, + "failedToStartBackgroundTracking": "Falha ao iniciar rastreamento em segundo plano. Verifique permissões e conexão BLE.", + "@failedToStartBackgroundTracking": { + "description": "Error message when background tracking fails to start" + }, + "locationBroadcast": "Transmissão de localização: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Success message for location broadcast", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "@defaultPinInfo": { + "description": "Information about default PIN for pairing" + }, + "noMessagesYet": "Ainda não há mensagens", + "@noMessagesYet": { + "description": "Empty state message when there are no messages" + }, + "pullDownToSync": "Puxe para baixo para sincronizar mensagens", + "@pullDownToSync": { + "description": "Instruction to pull down to refresh messages" + }, + "deleteContact": "Excluir contato", + "@deleteContact": { + "description": "Delete contact action label" + }, + "delete": "Excluir", + "@delete": { + "description": "Delete button label" + }, + "viewOnMap": "Ver no mapa", + "@viewOnMap": { + "description": "Action to view contact location on map" + }, + "refresh": "Atualizar", + "@refresh": { + "description": "Refresh button label" + }, + "resetPath": "Redefinir rota", + "@resetPath": { + "description": "Action to reset contact path for re-routing" + }, + "publicKeyCopied": "Chave pública copiada para a área de transferência", + "@publicKeyCopied": { + "description": "Success message when public key is copied" + }, + "copiedToClipboard": "{label} copiado para a área de transferência", + "@copiedToClipboard": { + "description": "Success message when a value is copied to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "pleaseEnterPassword": "Digite uma senha", + "@pleaseEnterPassword": { + "description": "Validation message for empty password field" + }, + "failedToSyncContacts": "Falha ao sincronizar contatos: {error}", + "@failedToSyncContacts": { + "description": "Error message when contact sync fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "loggedInSuccessfully": "Login realizado com sucesso! Aguardando mensagens da sala...", + "@loggedInSuccessfully": { + "description": "Success message after successful room login" + }, + "loginFailed": "Falha no login - senha incorreta", + "@loginFailed": { + "description": "Error message when room login fails" + }, + "loggingIn": "Entrando em {roomName}...", + "@loggingIn": { + "description": "Status message during room login process", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "failedToSendLogin": "Falha ao enviar login: {error}", + "@failedToSendLogin": { + "description": "Error message when login command fails to send", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "lowLocationAccuracy": "Baixa precisão de localização", + "@lowLocationAccuracy": { + "description": "Warning title for low GPS accuracy" + }, + "continue_": "Continuar", + "@continue_": { + "description": "Continue button label" + }, + "sendSarMarker": "Enviar marcador SAR", + "@sendSarMarker": { + "description": "Action to send SAR marker" + }, + "deleteDrawing": "Excluir desenho", + "@deleteDrawing": { + "description": "Action to delete a map drawing" + }, + "drawingTools": "Ferramentas de desenho", + "@drawingTools": { + "description": "Drawing tools section or menu title" + }, + "drawLine": "Desenhar linha", + "@drawLine": { + "description": "Map drawing mode: line" + }, + "drawLineDesc": "Desenhar uma linha livre no mapa", + "@drawLineDesc": { + "description": "Description for line drawing mode" + }, + "drawRectangle": "Desenhar retângulo", + "@drawRectangle": { + "description": "Map drawing mode: rectangle" + }, + "drawRectangleDesc": "Desenhar uma área retangular no mapa", + "@drawRectangleDesc": { + "description": "Description for rectangle drawing mode" + }, + "measureDistance": "Medir distância", + "@measureDistance": { + "description": "Map drawing mode: measure distance" + }, + "measureDistanceDesc": "Pressione longamente dois pontos para medir", + "@measureDistanceDesc": { + "description": "Description for distance measurement mode" + }, + "clearMeasurement": "Limpar medição", + "@clearMeasurement": { + "description": "Tooltip to clear measurement" + }, + "distanceLabel": "Distância: {distance}", + "@distanceLabel": { + "description": "Label showing measured distance", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + "longPressForSecondPoint": "Pressione longamente para o segundo ponto", + "@longPressForSecondPoint": { + "description": "Instruction when first measurement point is set" + }, + "longPressToStartMeasurement": "Pressione longamente para definir o primeiro ponto", + "@longPressToStartMeasurement": { + "description": "Instruction to start measurement" + }, + "longPressToStartNewMeasurement": "Long press to start new measurement", + "@longPressToStartNewMeasurement": { + "description": "Instruction to restart measurement after completion" + }, + "shareDrawings": "Compartilhar desenhos", + "@shareDrawings": { + "description": "Action to share drawings to network" + }, + "clearAllDrawings": "Limpar todos os desenhos", + "@clearAllDrawings": { + "description": "Action to clear all local drawings" + }, + "completeLine": "Concluir linha", + "@completeLine": { + "description": "Tooltip to complete drawing a line" + }, + "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "@broadcastDrawingsToTeam": { + "description": "Subtitle showing how many drawings will be broadcast", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "removeAllDrawings": "Remove all {count} drawing{plural}", + "@removeAllDrawings": { + "description": "Subtitle for remove all drawings action", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "@deleteAllDrawingsConfirm": { + "description": "Confirmation dialog message for deleting all drawings", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "drawing": "Desenho", + "@drawing": { + "description": "Generic drawing label" + }, + "shareDrawingsCount": "Share {count} Drawing{plural}", + "@shareDrawingsCount": { + "description": "Title for share drawings dialog", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "showReceivedDrawings": "Mostrar desenhos recebidos", + "@showReceivedDrawings": { + "description": "Toggle to show/hide received drawings from other team members" + }, + "showingAllDrawings": "Mostrando todos os desenhos", + "@showingAllDrawings": { + "description": "Subtitle when received drawings are visible" + }, + "showingOnlyYourDrawings": "Mostrando apenas seus desenhos", + "@showingOnlyYourDrawings": { + "description": "Subtitle when received drawings are hidden" + }, + "showSarMarkers": "Mostrar marcadores SAR", + "@showSarMarkers": { + "description": "Toggle to show/hide SAR markers on map" + }, + "showingSarMarkers": "Mostrando marcadores SAR", + "@showingSarMarkers": { + "description": "Subtitle when SAR markers are visible" + }, + "hidingSarMarkers": "Ocultando marcadores SAR", + "@hidingSarMarkers": { + "description": "Subtitle when SAR markers are hidden" + }, + "clearAll": "Limpar tudo", + "@clearAll": { + "description": "Clear all button label" + }, + "publicChannel": "Canal público", + "@publicChannel": { + "description": "Public channel option for sharing" + }, + "broadcastToAll": "Transmitir para todos os nós próximos", + "@broadcastToAll": { + "description": "Description for public channel broadcast" + }, + "storedPermanently": "Armazenado permanentemente na sala", + "@storedPermanently": { + "description": "Description for room storage permanence" + }, + "notConnectedToDevice": "Não conectado ao dispositivo", + "@notConnectedToDevice": { + "description": "Error message when device is not connected for direct messaging" + }, + "typeYourMessage": "Digite sua mensagem...", + "@typeYourMessage": { + "description": "Placeholder text for message input field" + }, + "quickLocationMarker": "Marcador rápido de localização", + "@quickLocationMarker": { + "description": "Subtitle for SAR marker sheet header" + }, + "markerType": "Tipo de marcador", + "@markerType": { + "description": "Label for marker type selection section" + }, + "sendTo": "Enviar para", + "@sendTo": { + "description": "Label for destination selection section" + }, + "noDestinationsAvailable": "Nenhum destino disponível.", + "@noDestinationsAvailable": { + "description": "Warning when no rooms or channels exist" + }, + "selectDestination": "Selecione o destino...", + "@selectDestination": { + "description": "Placeholder for destination dropdown" + }, + "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "@ephemeralBroadcastInfo": { + "description": "Information about ephemeral channel broadcasts" + }, + "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "@persistentRoomInfo": { + "description": "Information about persistent room storage" + }, + "location": "Localização", + "@location": { + "description": "Label for location section" + }, + "fromMap": "Do mapa", + "@fromMap": { + "description": "Badge showing location is from map tap" + }, + "gettingLocation": "Obtendo localização...", + "@gettingLocation": { + "description": "Loading message while fetching GPS location" + }, + "locationError": "Erro de localização", + "@locationError": { + "description": "Title for location error messages" + }, + "retry": "Tentar novamente", + "@retry": { + "description": "Retry button label" + }, + "refreshLocation": "Atualizar localização", + "@refreshLocation": { + "description": "Tooltip for refresh location button" + }, + "accuracyMeters": "Precisão: ±{accuracy}m", + "@accuracyMeters": { + "description": "Display of GPS accuracy in meters", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "notesOptional": "Notas (opcional)", + "@notesOptional": { + "description": "Label for optional notes field" + }, + "addAdditionalInformation": "Adicionar informações extras...", + "@addAdditionalInformation": { + "description": "Placeholder for notes field" + }, + "lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?", + "@lowAccuracyWarning": { + "description": "Warning dialog content for low GPS accuracy", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "loginToRoom": "Entrar na sala", + "@loginToRoom": { + "description": "Title for room login dialog" + }, + "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "@enterPasswordInfo": { + "description": "Information about room password" + }, + "password": "Senha", + "@password": { + "description": "Password field label" + }, + "enterRoomPassword": "Digite a senha da sala", + "@enterRoomPassword": { + "description": "Password field hint" + }, + "loggingInDots": "Entrando...", + "@loggingInDots": { + "description": "Button text while logging in" + }, + "login": "Entrar", + "@login": { + "description": "Login button label" + }, + "failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.", + "@failedToAddRoom": { + "description": "Error message when adding room fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "direct": "Direto", + "@direct": { + "description": "Direct routing indicator" + }, + "flood": "Inundação", + "@flood": { + "description": "Flood routing indicator" + }, + "loggedIn": "Conectado", + "@loggedIn": { + "description": "Logged in status badge" + }, + "noGpsData": "Sem dados GPS", + "@noGpsData": { + "description": "Message when GPS data is not available" + }, + "distance": "Distância", + "@distance": { + "description": "Distance label" + }, + "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "@directPingTimeout": { + "description": "Warning when direct ping times out", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "pingFailed": "Falha no ping para {name} - nenhuma resposta recebida", + "@pingFailed": { + "description": "Error message when ping fails", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.", + "@deleteContactConfirmation": { + "description": "Confirmation message for deleting contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "failedToRemoveContact": "Falha ao remover contato: {error}", + "@failedToRemoveContact": { + "description": "Error message when contact removal fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "type": "Tipo", + "@type": { + "description": "Contact type label" + }, + "publicKey": "Chave pública", + "@publicKey": { + "description": "Public key label" + }, + "lastSeen": "Visto por último", + "@lastSeen": { + "description": "Last seen label" + }, + "roomStatus": "Status da sala", + "@roomStatus": { + "description": "Room status section header" + }, + "loginStatus": "Status do login", + "@loginStatus": { + "description": "Login status label" + }, + "notLoggedIn": "Não conectado", + "@notLoggedIn": { + "description": "Not logged in status" + }, + "adminAccess": "Acesso de administrador", + "@adminAccess": { + "description": "Admin access label" + }, + "yes": "Sim", + "@yes": { + "description": "Yes answer" + }, + "no": "Não", + "@no": { + "description": "No answer" + }, + "permissions": "Permissões", + "@permissions": { + "description": "Permissions label" + }, + "passwordSaved": "Senha salva", + "@passwordSaved": { + "description": "Password saved label" + }, + "locationColon": "Localização:", + "@locationColon": { + "description": "Location section header" + }, + "telemetry": "Telemetria", + "@telemetry": { + "description": "Telemetry section header" + }, + "voltage": "Voltagem", + "@voltage": { + "description": "Voltage label" + }, + "battery": "Bateria", + "@battery": { + "description": "Battery label" + }, + "temperature": "Temperatura", + "@temperature": { + "description": "Temperature label" + }, + "humidity": "Umidade", + "@humidity": { + "description": "Humidity label" + }, + "pressure": "Pressão", + "@pressure": { + "description": "Pressure label" + }, + "gpsTelemetry": "GPS (telemetria)", + "@gpsTelemetry": { + "description": "GPS from telemetry label" + }, + "updated": "Atualizado", + "@updated": { + "description": "Updated timestamp label" + }, + "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "@pathResetInfo": { + "description": "Info message after path reset", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "reLoginToRoom": "Entrar novamente na sala", + "@reLoginToRoom": { + "description": "Button to re-login to room" + }, + "heading": "Direção", + "@heading": { + "description": "Compass heading label" + }, + "elevation": "Elevação", + "@elevation": { + "description": "Elevation/altitude label" + }, + "accuracy": "Precisão", + "@accuracy": { + "description": "GPS accuracy label" + }, + "bearing": "Rumo", + "@bearing": { + "description": "Bearing label in compass" + }, + "direction": "Direção", + "@direction": { + "description": "Direction label in compass" + }, + "filterMarkers": "Filtrar marcadores", + "@filterMarkers": { + "description": "Title for filter markers dialog" + }, + "filterMarkersTooltip": "Filter markers", + "@filterMarkersTooltip": { + "description": "Tooltip for filter button" + }, + "contactsFilter": "Contatos", + "@contactsFilter": { + "description": "Filter option for contacts" + }, + "repeatersFilter": "Repetidores", + "@repeatersFilter": { + "description": "Filter option for repeaters" + }, + "sarMarkers": "Marcadores SAR", + "@sarMarkers": { + "description": "SAR markers section header" + }, + "foundPerson": "Pessoa encontrada", + "@foundPerson": { + "description": "Found person SAR marker type" + }, + "fire": "Incêndio", + "@fire": { + "description": "Fire SAR marker type" + }, + "stagingArea": "Área de apoio", + "@stagingArea": { + "description": "Staging area SAR marker type" + }, + "showAll": "Mostrar tudo", + "@showAll": { + "description": "Button to show all filters" + }, + "locationUnavailable": "Localização indisponível", + "@locationUnavailable": { + "description": "Message when GPS location is unavailable" + }, + "ahead": "à frente", + "@ahead": { + "description": "Relative bearing direction - ahead" + }, + "degreesRight": "{degrees}° à direita", + "@degreesRight": { + "description": "Relative bearing direction - right", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "degreesLeft": "{degrees}° à esquerda", + "@degreesLeft": { + "description": "Relative bearing direction - left", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Latitude and longitude display format", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "noContactsYet": "Ainda não há contatos", + "@noContactsYet": { + "description": "Empty state message when there are no contacts" + }, + "connectToDeviceToLoadContacts": "Conecte-se a um dispositivo para carregar contatos", + "@connectToDeviceToLoadContacts": { + "description": "Instruction to connect device to load contacts" + }, + "teamMembers": "Membros da equipe", + "@teamMembers": { + "description": "Section header for team members (chat contacts)" + }, + "repeaters": "Repetidores", + "@repeaters": { + "description": "Section header for repeater nodes" + }, + "rooms": "Salas", + "@rooms": { + "description": "Section header for rooms" + }, + "channels": "Canais", + "@channels": { + "description": "Section header for broadcast channels" + }, + "selectMapLayer": "Selecionar camada do mapa", + "@selectMapLayer": { + "description": "Title for map layer selection dialog" + }, + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "OpenStreetMap layer name" + }, + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "OpenTopoMap layer name" + }, + "esriSatellite": "Satélite ESRI", + "@esriSatellite": { + "description": "ESRI Satellite imagery layer name" + }, + "googleHybrid": "Google Híbrido", + "@googleHybrid": { + "description": "Google Hybrid layer name (satellite + labels)" + }, + "googleRoadmap": "Google Mapa", + "@googleRoadmap": { + "description": "Google Roadmap layer name (street map)" + }, + "googleTerrain": "Google Terreno", + "@googleTerrain": { + "description": "Google Terrain layer name (topographic)" + }, + "dragToPosition": "Arraste para a posição", + "@dragToPosition": { + "description": "Label when dragging a pin on map" + }, + "createSarMarker": "Criar marcador SAR", + "@createSarMarker": { + "description": "Label for creating SAR marker from pin" + }, + "compass": "Bússola", + "@compass": { + "description": "Compass title in detailed compass dialog" + }, + "navigationAndContacts": "Navegação e contatos", + "@navigationAndContacts": { + "description": "Subtitle for compass dialog" + }, + "sarAlert": "ALERTA SAR", + "@sarAlert": { + "description": "Label for SAR alert badge on messages" + }, + "textCopiedToClipboard": "Texto copiado para a área de transferência", + "@textCopiedToClipboard": { + "description": "Success message when text is copied" + }, + "cannotReplySenderMissing": "Cannot reply: sender information missing", + "@cannotReplySenderMissing": { + "description": "Error when sender info is missing for reply" + }, + "cannotReplyContactNotFound": "Cannot reply: contact not found", + "@cannotReplyContactNotFound": { + "description": "Error when contact not found for reply" + }, + "copyText": "Copiar texto", + "@copyText": { + "description": "Option to copy message text to clipboard" + }, + "saveAsTemplate": "Save as Template", + "@saveAsTemplate": { + "description": "Option to save SAR message as a reusable template" + }, + "templateSaved": "Template saved successfully", + "@templateSaved": { + "description": "Success message when SAR template is saved" + }, + "templateAlreadyExists": "Template with this emoji already exists", + "@templateAlreadyExists": { + "description": "Error message when trying to save duplicate template" + }, + "deleteMessage": "Excluir mensagem", + "@deleteMessage": { + "description": "Dialog title for deleting a message" + }, + "deleteMessageConfirmation": "Tem certeza de que deseja excluir esta mensagem?", + "@deleteMessageConfirmation": { + "description": "Confirmation text for message deletion" + }, + "shareLocation": "Compartilhar localização", + "@shareLocation": { + "description": "Option to share SAR marker location" + }, + "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "@shareLocationText": { + "description": "Formatted text for sharing SAR marker location", + "placeholders": { + "markerInfo": { + "type": "String" + }, + "lat": { + "type": "String" + }, + "lon": { + "type": "String" + }, + "url": { + "type": "String" + } + } + }, + "sarLocationShare": "Localização SAR", + "@sarLocationShare": { + "description": "Subject line when sharing SAR marker location" + }, + "justNow": "Agora mesmo", + "@justNow": { + "description": "Time indicator for very recent activity" + }, + "minutesAgo": "há {minutes} min", + "@minutesAgo": { + "description": "Time indicator for minutes ago", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "hoursAgo": "há {hours} h", + "@hoursAgo": { + "description": "Time indicator for hours ago", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "daysAgo": "há {days} d", + "@daysAgo": { + "description": "Time indicator for days ago", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "secondsAgo": "há {seconds} s", + "@secondsAgo": { + "description": "Time indicator for seconds ago", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sending": "Enviando...", + "@sending": { + "description": "Delivery status: sending" + }, + "sent": "Enviado", + "@sent": { + "description": "Delivery status: sent" + }, + "delivered": "Entregue", + "@delivered": { + "description": "Delivery status: delivered" + }, + "deliveredWithTime": "Entregue ({time}ms)", + "@deliveredWithTime": { + "description": "Delivery status with round-trip time", + "placeholders": { + "time": { + "type": "int" + } + } + }, + "failed": "Falhou", + "@failed": { + "description": "Delivery status: failed" + }, + "broadcast": "Transmitir", + "@broadcast": { + "description": "Delivery status for channel messages (no echoes yet)" + }, + "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "@deliveredToContacts": { + "description": "Grouped message delivery count", + "placeholders": { + "delivered": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "allDelivered": "All delivered", + "@allDelivered": { + "description": "Status when all recipients received the message" + }, + "recipientDetails": "Recipient Details", + "@recipientDetails": { + "description": "Header for expandable recipient list" + }, + "pending": "Pendente", + "@pending": { + "description": "Delivery status: pending/waiting" + }, + "sarMarkerFoundPerson": "Found Person", + "@sarMarkerFoundPerson": { + "description": "SAR marker type: found person" + }, + "sarMarkerFire": "Fire Location", + "@sarMarkerFire": { + "description": "SAR marker type: fire" + }, + "sarMarkerStagingArea": "Staging Area", + "@sarMarkerStagingArea": { + "description": "SAR marker type: staging area" + }, + "sarMarkerObject": "Object Found", + "@sarMarkerObject": { + "description": "SAR marker type: object" + }, + "from": "De", + "@from": { + "description": "Sender label in notifications" + }, + "coordinates": "Coordenadas", + "@coordinates": { + "description": "Coordinates label" + }, + "tapToViewOnMap": "Toque para ver no mapa", + "@tapToViewOnMap": { + "description": "Notification action text" + }, + "radioSettings": "Configurações do rádio", + "@radioSettings": { + "description": "Section title for radio settings" + }, + "frequencyMHz": "Frequência (MHz)", + "@frequencyMHz": { + "description": "Label for radio frequency field" + }, + "frequencyExample": "e.g., 869.618", + "@frequencyExample": { + "description": "Helper text example for frequency" + }, + "bandwidth": "Largura de banda", + "@bandwidth": { + "description": "Label for bandwidth dropdown" + }, + "spreadingFactor": "Fator de espalhamento", + "@spreadingFactor": { + "description": "Label for spreading factor dropdown" + }, + "codingRate": "Taxa de codificação", + "@codingRate": { + "description": "Label for coding rate dropdown" + }, + "txPowerDbm": "Potência TX (dBm)", + "@txPowerDbm": { + "description": "Label for TX power field" + }, + "maxPowerDbm": "Máx: {power} dBm", + "@maxPowerDbm": { + "description": "Helper text showing maximum TX power", + "placeholders": { + "power": { + "type": "int" + } + } + }, + "you": "Você", + "@you": { + "description": "Label for the current user in message bubbles" + }, + "exportFailed": "Falha na exportação: {error}", + "@exportFailed": { + "description": "Error message when export fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "importFailed": "Falha na importação: {error}", + "@importFailed": { + "description": "Error message when import fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "unknown": "Desconhecido", + "@unknown": { + "description": "Unknown value label" + }, + "onlineLayers": "Camadas online", + "@onlineLayers": { + "description": "Section header for online map layers" + }, + "locationTrail": "Trilha de localização", + "@locationTrail": { + "description": "Location trail title" + }, + "showTrailOnMap": "Mostrar trilha no mapa", + "@showTrailOnMap": { + "description": "Toggle to show/hide trail on map" + }, + "trailVisible": "A trilha está visível no mapa", + "@trailVisible": { + "description": "Trail visibility status - visible" + }, + "trailHiddenRecording": "A trilha está oculta (ainda gravando)", + "@trailHiddenRecording": { + "description": "Trail visibility status - hidden but recording" + }, + "duration": "Duração", + "@duration": { + "description": "Duration label" + }, + "points": "Pontos", + "@points": { + "description": "Trail points count label" + }, + "clearTrail": "Limpar trilha", + "@clearTrail": { + "description": "Button to clear location trail" + }, + "clearTrailQuestion": "Limpar trilha?", + "@clearTrailQuestion": { + "description": "Confirmation dialog title" + }, + "clearTrailConfirmation": "Tem certeza de que deseja limpar a trilha de localização atual?", + "@clearTrailConfirmation": { + "description": "Confirmation dialog message" + }, + "noTrailRecorded": "Nenhuma trilha gravada ainda", + "@noTrailRecorded": { + "description": "Message when no trail exists" + }, + "startTrackingToRecord": "Inicie o rastreamento de localização para gravar sua trilha", + "@startTrackingToRecord": { + "description": "Instructions to start trail recording" + }, + "trailControls": "Controles da trilha", + "@trailControls": { + "description": "Trail controls tooltip" + }, + "contactTrails": "Trilhas dos contatos", + "@contactTrails": { + "description": "Contact trails section header" + }, + "showAllContactTrails": "Mostrar todas as trilhas dos contatos", + "@showAllContactTrails": { + "description": "Toggle label to show all contact trails" + }, + "noContactsWithLocationHistory": "Nenhum contato com histórico de localização", + "@noContactsWithLocationHistory": { + "description": "Subtitle when no contacts have trails" + }, + "showingTrailsForContacts": "Showing trails for {count} contacts", + "@showingTrailsForContacts": { + "description": "Subtitle showing number of contacts with trails", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "individualContactTrails": "Trilhas individuais dos contatos", + "@individualContactTrails": { + "description": "Expansion tile title for individual contact trails" + }, + "deviceInformation": "Informações do dispositivo", + "@deviceInformation": { + "description": "Device information section header" + }, + "bleName": "Nome BLE", + "@bleName": { + "description": "Bluetooth Low Energy device name label" + }, + "meshName": "Nome da mesh", + "@meshName": { + "description": "Mesh network name label" + }, + "notSet": "Não definido", + "@notSet": { + "description": "Label when a value is not set" + }, + "model": "Modelo", + "@model": { + "description": "Device model label" + }, + "version": "Versão", + "@version": { + "description": "Version label" + }, + "buildDate": "Data de build", + "@buildDate": { + "description": "Firmware build date label" + }, + "firmware": "Firmware", + "@firmware": { + "description": "Firmware label" + }, + "maxContacts": "Máx. de contatos", + "@maxContacts": { + "description": "Maximum contacts capacity label" + }, + "maxChannels": "Máx. de canais", + "@maxChannels": { + "description": "Maximum channels capacity label" + }, + "publicInfo": "Informações públicas", + "@publicInfo": { + "description": "Public information section header" + }, + "meshNetworkName": "Nome da rede mesh", + "@meshNetworkName": { + "description": "Mesh network name field label" + }, + "nameBroadcastInMesh": "Nome transmitido nos anúncios mesh", + "@nameBroadcastInMesh": { + "description": "Helper text for mesh network name field" + }, + "telemetryAndLocationSharing": "Telemetria e compartilhamento de localização", + "@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": "Usar localização atual", + "@useCurrentLocation": { + "description": "Tooltip for use current location button" + }, + "noneUnknown": "Nenhum/Desconhecido", + "@noneUnknown": { + "description": "Device type: none or unknown" + }, + "chatNode": "Nó de chat", + "@chatNode": { + "description": "Device type: chat node" + }, + "repeater": "Repetidor", + "@repeater": { + "description": "Device type: repeater" + }, + "roomChannel": "Sala/Canal", + "@roomChannel": { + "description": "Device type: room or channel" + }, + "typeNumber": "Type {number}", + "@typeNumber": { + "description": "Generic device type with number", + "placeholders": { + "number": { + "type": "int" + } + } + }, + "copiedToClipboardShort": "{label} copiado para a área de transferência", + "@copiedToClipboardShort": { + "description": "Short success message when copying to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "failedToSave": "Falha ao salvar: {error}", + "@failedToSave": { + "description": "Generic error message for save failures", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "failedToGetLocation": "Falha ao obter localização: {error}", + "@failedToGetLocation": { + "description": "Error message when getting location fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "sarTemplates": "Modelos SAR", + "@sarTemplates": { + "description": "SAR templates menu title" + }, + "manageSarTemplates": "Manage cursor on target templates", + "@manageSarTemplates": { + "description": "Subtitle for SAR templates settings" + }, + "addTemplate": "Adicionar modelo", + "@addTemplate": { + "description": "Button to add new SAR template" + }, + "editTemplate": "Editar modelo", + "@editTemplate": { + "description": "Dialog title for editing template" + }, + "deleteTemplate": "Excluir modelo", + "@deleteTemplate": { + "description": "Action to delete template" + }, + "templateName": "Nome do modelo", + "@templateName": { + "description": "Label for template name field" + }, + "templateNameHint": "ex.: Pessoa encontrada", + "@templateNameHint": { + "description": "Hint text for template name" + }, + "templateEmoji": "Emoji", + "@templateEmoji": { + "description": "Label for template emoji field" + }, + "emojiRequired": "Emoji é obrigatório", + "@emojiRequired": { + "description": "Validation error when emoji field is empty" + }, + "nameRequired": "Nome é obrigatório", + "@nameRequired": { + "description": "Validation error when name field is empty" + }, + "templateDescription": "Descrição (opcional)", + "@templateDescription": { + "description": "Label for template description field" + }, + "templateDescriptionHint": "Adicionar contexto extra...", + "@templateDescriptionHint": { + "description": "Hint text for template description" + }, + "templateColor": "Cor", + "@templateColor": { + "description": "Label for template color picker" + }, + "previewFormat": "Pré-visualização (formato de mensagem SAR)", + "@previewFormat": { + "description": "Label for format preview" + }, + "importFromClipboard": "Importar", + "@importFromClipboard": { + "description": "Button to import templates from clipboard" + }, + "exportToClipboard": "Exportar", + "@exportToClipboard": { + "description": "Button to export templates to clipboard" + }, + "deleteTemplateConfirmation": "Excluir o modelo “{name}”?", + "@deleteTemplateConfirmation": { + "description": "Confirmation message for template deletion", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "templateAdded": "Modelo adicionado", + "@templateAdded": { + "description": "Success message when template is added" + }, + "templateUpdated": "Modelo atualizado", + "@templateUpdated": { + "description": "Success message when template is updated" + }, + "templateDeleted": "Modelo excluído", + "@templateDeleted": { + "description": "Success message when template is deleted" + }, + "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "@templatesImported": { + "description": "Success message after importing templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "@templatesExported": { + "description": "Success message after exporting templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "resetToDefaults": "Restaurar padrão", + "@resetToDefaults": { + "description": "Action to reset templates to defaults" + }, + "resetToDefaultsConfirmation": "Isso excluirá todos os modelos personalizados e restaurará os 4 modelos padrão. Continuar?", + "@resetToDefaultsConfirmation": { + "description": "Confirmation message for reset to defaults" + }, + "reset": "Redefinir", + "@reset": { + "description": "Reset button label" + }, + "resetComplete": "Modelos redefinidos para o padrão", + "@resetComplete": { + "description": "Success message after reset" + }, + "noTemplates": "Nenhum modelo disponível", + "@noTemplates": { + "description": "Message when no templates exist" + }, + "tapAddToCreate": "Toque em + para criar seu primeiro modelo", + "@tapAddToCreate": { + "description": "Helper text when no templates exist" + }, + "ok": "OK", + "@ok": { + "description": "OK button label" + }, + "permissionsSection": "Permissões", + "@permissionsSection": { + "description": "Permissions section header" + }, + "locationPermission": "Permissão de localização", + "@locationPermission": { + "description": "Location permission label" + }, + "checking": "Verificando...", + "@checking": { + "description": "Loading state indicator" + }, + "locationPermissionGrantedAlways": "Concedida (Sempre)", + "@locationPermissionGrantedAlways": { + "description": "Location permission status: granted always" + }, + "locationPermissionGrantedWhileInUse": "Concedida (Durante o uso)", + "@locationPermissionGrantedWhileInUse": { + "description": "Location permission status: granted while in use" + }, + "locationPermissionDeniedTapToRequest": "Negada - toque para solicitar", + "@locationPermissionDeniedTapToRequest": { + "description": "Location permission status: denied, user can request" + }, + "locationPermissionPermanentlyDeniedOpenSettings": "Negada permanentemente - abrir configurações", + "@locationPermissionPermanentlyDeniedOpenSettings": { + "description": "Location permission status: permanently denied" + }, + "locationPermissionDialogContent": "A permissão de localização foi negada permanentemente. Ative-a nas configurações do dispositivo.", + "@locationPermissionDialogContent": { + "description": "Content for location permission dialog when permanently denied" + }, + "openSettings": "Abrir configurações", + "@openSettings": { + "description": "Button to open device settings" + }, + "locationPermissionGranted": "Permissão de localização concedida!", + "@locationPermissionGranted": { + "description": "Success message when location permission is granted" + }, + "locationPermissionRequiredForGps": "A permissão de localização é necessária para rastreamento GPS e compartilhamento de localização.", + "@locationPermissionRequiredForGps": { + "description": "Info message about location permission requirement" + }, + "locationPermissionAlreadyGranted": "A permissão de localização já foi concedida.", + "@locationPermissionAlreadyGranted": { + "description": "Info message when permission is already granted" + }, + "sarNavyBlue": "SAR Azul Marinho", + "@sarNavyBlue": { + "description": "SAR Navy Blue theme name" + }, + "sarNavyBlueDescription": "Modo profissional/operações", + "@sarNavyBlueDescription": { + "description": "Description for SAR Navy Blue theme" + }, + "selectRecipient": "Selecionar destinatário", + "@selectRecipient": { + "description": "Title for recipient selector sheet" + }, + "broadcastToAllNearby": "Transmitir para todos os próximos", + "@broadcastToAllNearby": { + "description": "Subtitle for public channel option" + }, + "searchRecipients": "Pesquisar destinatários...", + "@searchRecipients": { + "description": "Placeholder text for recipient search field" + }, + "noContactsFound": "Nenhum contato encontrado", + "@noContactsFound": { + "description": "Message when no contacts match search" + }, + "noRoomsFound": "Nenhuma sala encontrada", + "@noRoomsFound": { + "description": "Message when no rooms match search" + }, + "noRecipientsAvailable": "Nenhum destinatário disponível", + "@noRecipientsAvailable": { + "description": "Message when no recipients exist (contacts, rooms, or channels)" + }, + "noChannelsFound": "Nenhum canal encontrado", + "@noChannelsFound": { + "description": "Message when no channels match the search" + }, + "newMessage": "Nova mensagem", + "@newMessage": { + "description": "Notification title for new message" + }, + "channel": "Canal", + "@channel": { + "description": "Channel label in notifications" + }, + "samplePoliceLead": "Police Lead", + "@samplePoliceLead": { + "description": "Sample team member name" + }, + "sampleDroneOperator": "Drone Operator", + "@sampleDroneOperator": { + "description": "Sample team member name" + }, + "sampleFirefighterAlpha": "Firefighter", + "@sampleFirefighterAlpha": { + "description": "Sample team member name" + }, + "sampleMedicCharlie": "Medic", + "@sampleMedicCharlie": { + "description": "Sample team member name" + }, + "sampleCommandDelta": "Command", + "@sampleCommandDelta": { + "description": "Sample team member name" + }, + "sampleFireEngine": "Fire Engine", + "@sampleFireEngine": { + "description": "Sample team member name" + }, + "sampleAirSupport": "Air Support", + "@sampleAirSupport": { + "description": "Sample team member name" + }, + "sampleBaseCoordinator": "Base Coordinator", + "@sampleBaseCoordinator": { + "description": "Sample team member name" + }, + "channelEmergency": "Emergência", + "@channelEmergency": { + "description": "Emergency channel name" + }, + "channelCoordination": "Coordenação", + "@channelCoordination": { + "description": "Coordination channel name" + }, + "channelUpdates": "Atualizações", + "@channelUpdates": { + "description": "Updates channel name" + }, + "sampleTeamMember": "Sample Team Member", + "@sampleTeamMember": { + "description": "Sample sender name" + }, + "sampleScout": "Sample Scout", + "@sampleScout": { + "description": "Sample sender name" + }, + "sampleBase": "Sample Base", + "@sampleBase": { + "description": "Sample sender name" + }, + "sampleSearcher": "Sample Searcher", + "@sampleSearcher": { + "description": "Sample sender name" + }, + "sampleObjectBackpack": " Backpack found - blue color", + "@sampleObjectBackpack": { + "description": "Sample object note" + }, + "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "@sampleObjectVehicle": { + "description": "Sample object note" + }, + "sampleObjectCamping": " Camping equipment discovered", + "@sampleObjectCamping": { + "description": "Sample object note" + }, + "sampleObjectTrailMarker": " Trail marker found off-path", + "@sampleObjectTrailMarker": { + "description": "Sample object note" + }, + "sampleMsgAllTeamsCheckIn": "All teams check in", + "@sampleMsgAllTeamsCheckIn": { + "description": "Sample channel message" + }, + "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "@sampleMsgWeatherUpdate": { + "description": "Sample channel message" + }, + "sampleMsgBaseCamp": "Base camp established at staging area", + "@sampleMsgBaseCamp": { + "description": "Sample channel message" + }, + "sampleMsgTeamAlpha": "Team moving to sector 2", + "@sampleMsgTeamAlpha": { + "description": "Sample channel message" + }, + "sampleMsgRadioCheck": "Radio check - all stations respond", + "@sampleMsgRadioCheck": { + "description": "Sample channel message" + }, + "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "@sampleMsgWaterSupply": { + "description": "Sample channel message" + }, + "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "@sampleMsgTeamBravo": { + "description": "Sample channel message" + }, + "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "@sampleMsgEtaRallyPoint": { + "description": "Sample channel message" + }, + "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "@sampleMsgSupplyDrop": { + "description": "Sample channel message" + }, + "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "@sampleMsgDroneSurvey": { + "description": "Sample channel message" + }, + "sampleMsgTeamCharlie": "Team requesting backup", + "@sampleMsgTeamCharlie": { + "description": "Sample channel message" + }, + "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "@sampleMsgRadioDiscipline": { + "description": "Sample channel message" + }, + "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "@sampleMsgUrgentMedical": { + "description": "Sample emergency message" + }, + "sampleMsgAdultMale": " Adult male, conscious", + "@sampleMsgAdultMale": { + "description": "Sample emergency message note" + }, + "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "@sampleMsgFireSpotted": { + "description": "Sample emergency message" + }, + "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "@sampleMsgSpreadingRapidly": { + "description": "Sample emergency message note" + }, + "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "@sampleMsgPriorityHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "@sampleMsgMedicalTeamEnRoute": { + "description": "Sample emergency message" + }, + "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "@sampleMsgEvacHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "@sampleMsgEmergencyResolved": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyStagingArea": " Emergency staging area", + "@sampleMsgEmergencyStagingArea": { + "description": "Sample emergency message note" + }, + "sampleMsgEmergencyServices": "Emergency services notified and responding", + "@sampleMsgEmergencyServices": { + "description": "Sample emergency message" + }, + "sampleAlphaTeamLead": "Team Lead", + "@sampleAlphaTeamLead": { + "description": "Sample team name" + }, + "sampleBravoScout": "Scout", + "@sampleBravoScout": { + "description": "Sample team name" + }, + "sampleCharlieMedic": "Medic", + "@sampleCharlieMedic": { + "description": "Sample team name" + }, + "sampleDeltaNavigator": "Navigator", + "@sampleDeltaNavigator": { + "description": "Sample team name" + }, + "sampleEchoSupport": "Support", + "@sampleEchoSupport": { + "description": "Sample team name" + }, + "sampleBaseCommand": "Base Command", + "@sampleBaseCommand": { + "description": "Sample team name" + }, + "sampleFieldCoordinator": "Field Coordinator", + "@sampleFieldCoordinator": { + "description": "Sample team name" + }, + "sampleMedicalTeam": "Medical Team", + "@sampleMedicalTeam": { + "description": "Sample team name" + }, + "mapDrawing": "Desenho do mapa", + "@mapDrawing": { + "description": "Label for map drawing messages" + }, + "navigateToDrawing": "Navigate to Drawing", + "@navigateToDrawing": { + "description": "Option to navigate to drawing on map" + }, + "copyCoordinates": "Copiar coordenadas", + "@copyCoordinates": { + "description": "Option to copy coordinates to clipboard" + }, + "hideFromMap": "Ocultar do mapa", + "@hideFromMap": { + "description": "Option to hide drawing from map" + }, + "lineDrawing": "Desenho de linha", + "@lineDrawing": { + "description": "Label for line type drawings" + }, + "rectangleDrawing": "Desenho de retângulo", + "@rectangleDrawing": { + "description": "Label for rectangle type drawings" + }, + "manualCoordinates": "Coordenadas manuais", + "@manualCoordinates": { + "description": "Label for manual coordinate input toggle" + }, + "enterCoordinatesManually": "Inserir coordenadas manualmente", + "@enterCoordinatesManually": { + "description": "Description for manual coordinate input option" + }, + "latitudeLabel": "Latitude", + "@latitudeLabel": { + "description": "Label for latitude input field" + }, + "longitudeLabel": "Longitude", + "@longitudeLabel": { + "description": "Label for longitude input field" + }, + "exampleCoordinates": "Example: 46.0569, 14.5058", + "@exampleCoordinates": { + "description": "Example coordinate format hint" + }, + "shareDrawing": "Compartilhar desenho", + "@shareDrawing": { + "description": "Title for share single drawing dialog" + }, + "shareWithAllNearbyDevices": "Compartilhar com todos os dispositivos próximos", + "@shareWithAllNearbyDevices": { + "description": "Subtitle for public channel sharing option" + }, + "shareToRoom": "Compartilhar na sala", + "@shareToRoom": { + "description": "Header for room sharing section" + }, + "sendToPersistentStorage": "Enviar para armazenamento persistente da sala", + "@sendToPersistentStorage": { + "description": "Subtitle for room sharing option" + }, + "deleteDrawingConfirm": "Tem certeza de que deseja excluir este desenho?", + "@deleteDrawingConfirm": { + "description": "Confirmation message for deleting a single drawing" + }, + "drawingDeleted": "Desenho excluído", + "@drawingDeleted": { + "description": "Success message after deleting a drawing" + }, + "yourDrawingsCount": "Your Drawings ({count})", + "@yourDrawingsCount": { + "description": "Header showing count of user's drawings", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shared": "Compartilhado", + "@shared": { + "description": "Status label for shared drawings" + }, + "line": "Linha", + "@line": { + "description": "Line drawing type label" + }, + "rectangle": "Retângulo", + "@rectangle": { + "description": "Rectangle drawing type label" + }, + "updateAvailable": "Atualização disponível", + "@updateAvailable": { + "description": "Title for update dialog when new version is available" + }, + "currentVersion": "Atual", + "@currentVersion": { + "description": "Label for current app version" + }, + "latestVersion": "Mais recente", + "@latestVersion": { + "description": "Label for latest available app version" + }, + "downloadUpdate": "Baixar", + "@downloadUpdate": { + "description": "Button to download app update" + }, + "updateLater": "Mais tarde", + "@updateLater": { + "description": "Button to dismiss update dialog" + }, + "cadastralParcels": "Cadastral Parcels", + "@cadastralParcels": { + "description": "Label for cadastral parcels WMS overlay layer" + }, + "forestRoads": "Forest Roads", + "@forestRoads": { + "description": "Label for forest roads WMS overlay layer" + }, + "wmsOverlays": "WMS Overlays", + "@wmsOverlays": { + "description": "Section header for WMS overlay layers in layer selector" + }, + "hikingTrails": "Hiking Trails", + "@hikingTrails": { + "description": "Label for hiking/mountain trails WMS overlay layer" + }, + "mainRoads": "Main Roads", + "@mainRoads": { + "description": "Label for main roads WMS overlay layer" + }, + "houseNumbers": "House Numbers", + "@houseNumbers": { + "description": "Label for house numbers WMS overlay layer" + }, + "fireHazardZones": "Fire Hazard Zones", + "@fireHazardZones": { + "description": "Label for fire hazard risk zones WMS overlay layer" + }, + "historicalFires": "Historical Fires", + "@historicalFires": { + "description": "Label for historical forest fires WMS overlay layer" + }, + "firebreaks": "Firebreaks", + "@firebreaks": { + "description": "Label for firebreaks WMS overlay layer" + }, + "krasFireZones": "Kras Fire Zones", + "@krasFireZones": { + "description": "Label for Kras fire zones WMS overlay layer" + }, + "placeNames": "Place Names", + "@placeNames": { + "description": "Label for geographic place names WMS overlay layer" + }, + "municipalityBorders": "Municipality Borders", + "@municipalityBorders": { + "description": "Label for municipality borders WMS overlay layer" + }, + "topographicMap": "Topographic Map 1:25000", + "@topographicMap": { + "description": "Label for DTK25 topographic base map layer" + }, + "recentMessages": "Mensagens recentes", + "@recentMessages": { + "description": "Header for recent messages overlay on map in fullscreen mode" + }, + "addChannel": "Adicionar canal", + "@addChannel": { + "description": "Button to add a new channel" + }, + "channelName": "Nome do canal", + "@channelName": { + "description": "Label for channel name field" + }, + "channelNameHint": "ex.: Equipe de Resgate Alfa", + "@channelNameHint": { + "description": "Hint for channel name field" + }, + "channelSecret": "Segredo do canal", + "@channelSecret": { + "description": "Label for channel secret field" + }, + "channelSecretHint": "Senha compartilhada para este canal", + "@channelSecretHint": { + "description": "Hint for channel secret field" + }, + "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "@channelSecretHelp": { + "description": "Help text explaining channel secret" + }, + "channelTypesInfo": "Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.", + "@channelTypesInfo": { + "description": "Information banner explaining hash and private channel types" + }, + "hashChannelInfo": "Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.", + "@hashChannelInfo": { + "description": "Help text for hash channels (# prefix)" + }, + "channelNameRequired": "O nome do canal é obrigatório", + "@channelNameRequired": { + "description": "Validation error for empty channel name" + }, + "channelNameTooLong": "Channel name must be 31 characters or less", + "@channelNameTooLong": { + "description": "Validation error for channel name too long" + }, + "channelSecretRequired": "O segredo do canal é obrigatório", + "@channelSecretRequired": { + "description": "Validation error for empty channel secret" + }, + "channelSecretTooLong": "Channel secret must be 32 characters or less", + "@channelSecretTooLong": { + "description": "Validation error for channel secret too long" + }, + "invalidAsciiCharacters": "Somente caracteres ASCII são permitidos", + "@invalidAsciiCharacters": { + "description": "Validation error for non-ASCII characters" + }, + "channelCreatedSuccessfully": "Canal criado com sucesso", + "@channelCreatedSuccessfully": { + "description": "Success message after creating channel" + }, + "channelCreationFailed": "Falha ao criar canal: {error}", + "@channelCreationFailed": { + "description": "Error message when channel creation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "deleteChannel": "Excluir canal", + "@deleteChannel": { + "description": "Delete channel button/menu item" + }, + "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "@deleteChannelConfirmation": { + "description": "Confirmation dialog when deleting a channel", + "placeholders": { + "channelName": { + "type": "String" + } + } + }, + "channelDeletedSuccessfully": "Canal excluído com sucesso", + "@channelDeletedSuccessfully": { + "description": "Success message after deleting channel" + }, + "channelDeletionFailed": "Falha ao excluir canal: {error}", + "@channelDeletionFailed": { + "description": "Error message when channel deletion fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createChannel": "Criar canal", + "@createChannel": { + "description": "Button text for creating a channel" + }, + "wizardBack": "Voltar", + "@wizardBack": { + "description": "Wizard back button text" + }, + "wizardSkip": "Pular", + "@wizardSkip": { + "description": "Wizard skip button text" + }, + "wizardNext": "Próximo", + "@wizardNext": { + "description": "Wizard next button text" + }, + "wizardGetStarted": "Começar", + "@wizardGetStarted": { + "description": "Wizard final button text to complete onboarding" + }, + "wizardWelcomeTitle": "Bem-vindo ao MeshCore SAR", + "@wizardWelcomeTitle": { + "description": "Welcome wizard first page title" + }, + "wizardWelcomeDescription": "A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.", + "@wizardWelcomeDescription": { + "description": "Welcome wizard first page description" + }, + "wizardConnectingTitle": "Conectando ao seu rádio", + "@wizardConnectingTitle": { + "description": "Wizard connecting page title" + }, + "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "@wizardConnectingDescription": { + "description": "Wizard connecting page description" + }, + "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "@wizardConnectingFeature1": { + "description": "Wizard connecting feature 1" + }, + "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "@wizardConnectingFeature2": { + "description": "Wizard connecting feature 2" + }, + "wizardConnectingFeature3": "Works completely offline - no internet required", + "@wizardConnectingFeature3": { + "description": "Wizard connecting feature 3" + }, + "wizardChannelTitle": "Canais", + "@wizardChannelTitle": { + "description": "Wizard channel page title" + }, + "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "@wizardChannelDescription": { + "description": "Wizard channel page description" + }, + "wizardChannelFeature1": "Public Channel for general team communication", + "@wizardChannelFeature1": { + "description": "Wizard channel feature 1" + }, + "wizardChannelFeature2": "Create custom channels for specific groups", + "@wizardChannelFeature2": { + "description": "Wizard channel feature 2" + }, + "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "@wizardChannelFeature3": { + "description": "Wizard channel feature 3" + }, + "wizardContactsTitle": "Contatos", + "@wizardContactsTitle": { + "description": "Wizard contacts page title" + }, + "wizardContactsDescription": "Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.", + "@wizardContactsDescription": { + "description": "Wizard contacts page description" + }, + "wizardContactsFeature1": "Contacts discovered automatically", + "@wizardContactsFeature1": { + "description": "Wizard contacts feature 1" + }, + "wizardContactsFeature2": "Send private direct messages", + "@wizardContactsFeature2": { + "description": "Wizard contacts feature 2" + }, + "wizardContactsFeature3": "View battery level and last seen time", + "@wizardContactsFeature3": { + "description": "Wizard contacts feature 3" + }, + "wizardMapTitle": "Mapa e localização", + "@wizardMapTitle": { + "description": "Wizard map page title" + }, + "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "@wizardMapDescription": { + "description": "Wizard map page description" + }, + "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "@wizardMapFeature1": { + "description": "Wizard map feature 1" + }, + "wizardMapFeature2": "Real-time GPS tracking of team members", + "@wizardMapFeature2": { + "description": "Wizard map feature 2" + }, + "wizardMapFeature3": "Download offline maps for remote areas", + "@wizardMapFeature3": { + "description": "Wizard map feature 3" + }, + "wizardMapFeature4": "Draw shapes and share tactical information", + "@wizardMapFeature4": { + "description": "Wizard map feature 4" + }, + "viewWelcomeTutorial": "Ver tutorial de boas-vindas", + "@viewWelcomeTutorial": { + "description": "Settings option to re-show welcome wizard" + }, + "allTeamContacts": "Todos os contatos da equipe", + "@allTeamContacts": { + "description": "Destination option to send SAR marker to all team contacts" + }, + "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "@directMessagesInfo": { + "description": "Information about sending to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "@sarMarkerSentToContacts": { + "description": "Success message after sending SAR marker to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noContactsAvailable": "Nenhum contato da equipe disponível", + "@noContactsAvailable": { + "description": "Message when there are no chat contacts to send to" + }, + "reply": "Responder", + "@reply": {}, + "technicalDetails": "Detalhes técnicos", + "@technicalDetails": {}, + "messageTechnicalDetails": "Message technical details", + "@messageTechnicalDetails": {}, + "linkQuality": "Link quality", + "@linkQuality": {}, + "delivery": "Delivery", + "@delivery": {}, + "status": "Status", + "@status": {}, + "expectedAckTag": "Expected ACK tag", + "@expectedAckTag": {}, + "roundTrip": "Round-trip", + "@roundTrip": {}, + "retryAttempt": "Retry attempt", + "@retryAttempt": {}, + "floodFallback": "Flood fallback", + "@floodFallback": {}, + "identity": "Identity", + "@identity": {}, + "messageId": "Message ID", + "@messageId": {}, + "sender": "Sender", + "@sender": {}, + "senderKey": "Sender key", + "@senderKey": {}, + "recipient": "Recipient", + "@recipient": {}, + "recipientKey": "Recipient key", + "@recipientKey": {}, + "voice": "Voz", + "@voice": {}, + "voiceId": "Voice ID", + "@voiceId": {}, + "envelope": "Envelope", + "@envelope": {}, + "sessionProgress": "Session progress", + "@sessionProgress": {}, + "complete": "Concluído", + "@complete": {}, + "rawDump": "Raw dump", + "@rawDump": {}, + "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "@cannotRetryMissingRecipient": {}, + "voiceUnavailable": "A voz não está disponível no momento", + "@voiceUnavailable": {}, + "requestingVoice": "Requesting voice", + "@requestingVoice": {} +} diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb new file mode 100644 index 0000000..b406913 --- /dev/null +++ b/lib/l10n/app_tr.arb @@ -0,0 +1,2280 @@ +{ + "@@locale": "tr", + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "The application title" + }, + "messages": "Mesajlar", + "@messages": { + "description": "Messages tab label" + }, + "contacts": "Kişiler", + "@contacts": { + "description": "Contacts tab label" + }, + "map": "Harita", + "@map": { + "description": "Map tab label" + }, + "settings": "Ayarlar", + "@settings": { + "description": "Settings screen title" + }, + "connect": "Bağlan", + "@connect": { + "description": "Connect button label" + }, + "disconnect": "Bağlantıyı kes", + "@disconnect": { + "description": "Disconnect button label" + }, + "noDevicesFound": "Cihaz bulunamadı", + "@noDevicesFound": { + "description": "Text shown when no BLE devices are found" + }, + "scanAgain": "Tekrar tara", + "@scanAgain": { + "description": "Button to restart BLE scanning" + }, + "tapToConnect": "Bağlanmak için dokunun", + "@tapToConnect": { + "description": "Subtitle text for device in scan list" + }, + "deviceNotConnected": "Cihaz bağlı değil", + "@deviceNotConnected": { + "description": "Error message when device is not connected" + }, + "locationPermissionDenied": "Konum izni reddedildi", + "@locationPermissionDenied": { + "description": "Error when location permission is denied" + }, + "locationPermissionPermanentlyDenied": "Konum izni kalıcı olarak reddedildi. Lütfen Ayarlar bölümünden etkinleştirin.", + "@locationPermissionPermanentlyDenied": { + "description": "Error when location permission is permanently denied" + }, + "locationPermissionRequired": "GPS takibi ve ekip koordinasyonu için konum izni gereklidir. Daha sonra Ayarlar bölümünden etkinleştirebilirsiniz.", + "@locationPermissionRequired": { + "description": "Message when location permission is needed" + }, + "locationServicesDisabled": "Konum servisleri kapalı. Lütfen Ayarlar bölümünden etkinleştirin.", + "@locationServicesDisabled": { + "description": "Error when location services are disabled" + }, + "failedToGetGpsLocation": "GPS konumu alınamadı", + "@failedToGetGpsLocation": { + "description": "Error when GPS location cannot be obtained" + }, + "failedToAdvertise": "Yayın başarısız: {error}", + "@failedToAdvertise": { + "description": "Error message for failed advertisement", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "cancelReconnection": "Yeniden bağlanmayı iptal et", + "@cancelReconnection": { + "description": "Tooltip for cancel reconnection button" + }, + "general": "Genel", + "@general": { + "description": "General settings section header" + }, + "theme": "Tema", + "@theme": { + "description": "Theme setting label" + }, + "chooseTheme": "Tema seç", + "@chooseTheme": { + "description": "Theme selection dialog title" + }, + "light": "Açık", + "@light": { + "description": "Light theme option" + }, + "dark": "Koyu", + "@dark": { + "description": "Dark theme option" + }, + "blueLightTheme": "Mavi açık tema", + "@blueLightTheme": { + "description": "Description for blue light theme" + }, + "blueDarkTheme": "Mavi koyu tema", + "@blueDarkTheme": { + "description": "Description for blue dark theme" + }, + "sarRed": "SAR Kırmızı", + "@sarRed": { + "description": "SAR Red theme option" + }, + "alertEmergencyMode": "Uyarı/Acil durum modu", + "@alertEmergencyMode": { + "description": "Description for SAR Red theme" + }, + "sarGreen": "SAR Yeşil", + "@sarGreen": { + "description": "SAR Green theme option" + }, + "safeAllClearMode": "Güvenli/Tamam modu", + "@safeAllClearMode": { + "description": "Description for SAR Green theme" + }, + "autoSystem": "Otomatik (Sistem)", + "@autoSystem": { + "description": "Auto/System theme option" + }, + "followSystemTheme": "Sistem temasını takip et", + "@followSystemTheme": { + "description": "Description for system theme" + }, + "showRxTxIndicators": "RX/TX göstergelerini göster", + "@showRxTxIndicators": { + "description": "Setting to show RX/TX indicators" + }, + "displayPacketActivity": "Üst çubukta paket etkinliği göstergelerini göster", + "@displayPacketActivity": { + "description": "Description for RX/TX indicators setting" + }, + "disableMap": "Haritayı devre dışı bırak", + "@disableMap": { + "description": "Setting to disable the map tab" + }, + "disableMapDescription": "Pil kullanımını azaltmak için harita sekmesini gizle", + "@disableMapDescription": { + "description": "Description for disable map setting" + }, + "language": "Dil", + "@language": { + "description": "Language setting label" + }, + "chooseLanguage": "Dil seç", + "@chooseLanguage": { + "description": "Language selection dialog title" + }, + "save": "Kaydet", + "@save": { + "description": "Save button label" + }, + "cancel": "İptal", + "@cancel": { + "description": "Cancel button label" + }, + "close": "Kapat", + "@close": { + "description": "Close button label" + }, + "about": "Hakkında", + "@about": { + "description": "About section header" + }, + "appVersion": "Uygulama sürümü", + "@appVersion": { + "description": "App version label" + }, + "appName": "Uygulama adı", + "@appName": { + "description": "App name label" + }, + "aboutMeshCoreSar": "About MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "About dialog title" + }, + "aboutDescription": "A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use", + "@aboutDescription": { + "description": "About dialog description" + }, + "technologiesUsed": "Technologies Used:", + "@technologiesUsed": { + "description": "Technologies used section title" + }, + "technologiesList": "• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage", + "@technologiesList": { + "description": "List of technologies used" + }, + "moreInfo": "Daha fazla bilgi", + "@moreInfo": { + "description": "More info button label" + }, + "packageName": "Package Name", + "@packageName": { + "description": "Package name label" + }, + "sampleData": "Örnek veriler", + "@sampleData": { + "description": "Sample data section header" + }, + "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "@sampleDataDescription": { + "description": "Sample data section description" + }, + "loadSampleData": "Örnek verileri yükle", + "@loadSampleData": { + "description": "Load sample data button" + }, + "clearAllData": "Tüm verileri temizle", + "@clearAllData": { + "description": "Clear all data button" + }, + "clearAllDataConfirmTitle": "Tüm verileri temizle", + "@clearAllDataConfirmTitle": { + "description": "Clear data confirmation dialog title" + }, + "clearAllDataConfirmMessage": "Bu işlem tüm kişileri ve SAR işaretlerini temizleyecek. Emin misiniz?", + "@clearAllDataConfirmMessage": { + "description": "Clear data confirmation message" + }, + "clear": "Temizle", + "@clear": { + "description": "Clear button label" + }, + "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "@loadedSampleData": { + "description": "Success message after loading sample data", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + "failedToLoadSampleData": "Örnek veriler yüklenemedi: {error}", + "@failedToLoadSampleData": { + "description": "Error message when sample data fails to load", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "allDataCleared": "Tüm veriler temizlendi", + "@allDataCleared": { + "description": "Success message after clearing all data" + }, + "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "@failedToStartBackgroundTracking": { + "description": "Error message when background tracking fails to start" + }, + "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Success message for location broadcast", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "@defaultPinInfo": { + "description": "Information about default PIN for pairing" + }, + "noMessagesYet": "Henüz mesaj yok", + "@noMessagesYet": { + "description": "Empty state message when there are no messages" + }, + "pullDownToSync": "Mesajları senkronize etmek için aşağı çekin", + "@pullDownToSync": { + "description": "Instruction to pull down to refresh messages" + }, + "deleteContact": "Kişiyi sil", + "@deleteContact": { + "description": "Delete contact action label" + }, + "delete": "Sil", + "@delete": { + "description": "Delete button label" + }, + "viewOnMap": "Haritada görüntüle", + "@viewOnMap": { + "description": "Action to view contact location on map" + }, + "refresh": "Yenile", + "@refresh": { + "description": "Refresh button label" + }, + "resetPath": "Reset Path (Re-route)", + "@resetPath": { + "description": "Action to reset contact path for re-routing" + }, + "publicKeyCopied": "Genel anahtar panoya kopyalandı", + "@publicKeyCopied": { + "description": "Success message when public key is copied" + }, + "copiedToClipboard": "{label} panoya kopyalandı", + "@copiedToClipboard": { + "description": "Success message when a value is copied to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "pleaseEnterPassword": "Lütfen bir parola girin", + "@pleaseEnterPassword": { + "description": "Validation message for empty password field" + }, + "failedToSyncContacts": "Kişiler senkronize edilemedi: {error}", + "@failedToSyncContacts": { + "description": "Error message when contact sync fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "loggedInSuccessfully": "Giriş başarılı! Oda mesajları bekleniyor...", + "@loggedInSuccessfully": { + "description": "Success message after successful room login" + }, + "loginFailed": "Giriş başarısız - yanlış parola", + "@loginFailed": { + "description": "Error message when room login fails" + }, + "loggingIn": "{roomName} odasına giriş yapılıyor...", + "@loggingIn": { + "description": "Status message during room login process", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "failedToSendLogin": "Giriş gönderilemedi: {error}", + "@failedToSendLogin": { + "description": "Error message when login command fails to send", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "lowLocationAccuracy": "Düşük konum doğruluğu", + "@lowLocationAccuracy": { + "description": "Warning title for low GPS accuracy" + }, + "continue_": "Devam et", + "@continue_": { + "description": "Continue button label" + }, + "sendSarMarker": "SAR işareti gönder", + "@sendSarMarker": { + "description": "Action to send SAR marker" + }, + "deleteDrawing": "Çizimi sil", + "@deleteDrawing": { + "description": "Action to delete a map drawing" + }, + "drawingTools": "Çizim araçları", + "@drawingTools": { + "description": "Drawing tools section or menu title" + }, + "drawLine": "Çizgi çiz", + "@drawLine": { + "description": "Map drawing mode: line" + }, + "drawLineDesc": "Harita üzerinde serbest çizgi çiz", + "@drawLineDesc": { + "description": "Description for line drawing mode" + }, + "drawRectangle": "Dikdörtgen çiz", + "@drawRectangle": { + "description": "Map drawing mode: rectangle" + }, + "drawRectangleDesc": "Harita üzerinde dikdörtgen alan çiz", + "@drawRectangleDesc": { + "description": "Description for rectangle drawing mode" + }, + "measureDistance": "Mesafe ölç", + "@measureDistance": { + "description": "Map drawing mode: measure distance" + }, + "measureDistanceDesc": "Ölçmek için iki noktaya uzun basın", + "@measureDistanceDesc": { + "description": "Description for distance measurement mode" + }, + "clearMeasurement": "Ölçümü temizle", + "@clearMeasurement": { + "description": "Tooltip to clear measurement" + }, + "distanceLabel": "Mesafe: {distance}", + "@distanceLabel": { + "description": "Label showing measured distance", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + "longPressForSecondPoint": "Long press for second point", + "@longPressForSecondPoint": { + "description": "Instruction when first measurement point is set" + }, + "longPressToStartMeasurement": "Long press to set first point", + "@longPressToStartMeasurement": { + "description": "Instruction to start measurement" + }, + "longPressToStartNewMeasurement": "Long press to start new measurement", + "@longPressToStartNewMeasurement": { + "description": "Instruction to restart measurement after completion" + }, + "shareDrawings": "Çizimleri paylaş", + "@shareDrawings": { + "description": "Action to share drawings to network" + }, + "clearAllDrawings": "Tüm çizimleri temizle", + "@clearAllDrawings": { + "description": "Action to clear all local drawings" + }, + "completeLine": "Complete Line", + "@completeLine": { + "description": "Tooltip to complete drawing a line" + }, + "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "@broadcastDrawingsToTeam": { + "description": "Subtitle showing how many drawings will be broadcast", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "removeAllDrawings": "Remove all {count} drawing{plural}", + "@removeAllDrawings": { + "description": "Subtitle for remove all drawings action", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "@deleteAllDrawingsConfirm": { + "description": "Confirmation dialog message for deleting all drawings", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "drawing": "Çizim", + "@drawing": { + "description": "Generic drawing label" + }, + "shareDrawingsCount": "Share {count} Drawing{plural}", + "@shareDrawingsCount": { + "description": "Title for share drawings dialog", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "showReceivedDrawings": "Alınan çizimleri göster", + "@showReceivedDrawings": { + "description": "Toggle to show/hide received drawings from other team members" + }, + "showingAllDrawings": "Tüm çizimler gösteriliyor", + "@showingAllDrawings": { + "description": "Subtitle when received drawings are visible" + }, + "showingOnlyYourDrawings": "Yalnızca sizin çizimleriniz gösteriliyor", + "@showingOnlyYourDrawings": { + "description": "Subtitle when received drawings are hidden" + }, + "showSarMarkers": "SAR işaretlerini göster", + "@showSarMarkers": { + "description": "Toggle to show/hide SAR markers on map" + }, + "showingSarMarkers": "SAR işaretleri gösteriliyor", + "@showingSarMarkers": { + "description": "Subtitle when SAR markers are visible" + }, + "hidingSarMarkers": "SAR işaretleri gizleniyor", + "@hidingSarMarkers": { + "description": "Subtitle when SAR markers are hidden" + }, + "clearAll": "Tümünü temizle", + "@clearAll": { + "description": "Clear all button label" + }, + "publicChannel": "Genel kanal", + "@publicChannel": { + "description": "Public channel option for sharing" + }, + "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "@broadcastToAll": { + "description": "Description for public channel broadcast" + }, + "storedPermanently": "Odada kalıcı olarak saklanır", + "@storedPermanently": { + "description": "Description for room storage permanence" + }, + "notConnectedToDevice": "Cihaza bağlı değil", + "@notConnectedToDevice": { + "description": "Error message when device is not connected for direct messaging" + }, + "typeYourMessage": "Mesajınızı yazın...", + "@typeYourMessage": { + "description": "Placeholder text for message input field" + }, + "quickLocationMarker": "Hızlı konum işareti", + "@quickLocationMarker": { + "description": "Subtitle for SAR marker sheet header" + }, + "markerType": "İşaret türü", + "@markerType": { + "description": "Label for marker type selection section" + }, + "sendTo": "Gönder", + "@sendTo": { + "description": "Label for destination selection section" + }, + "noDestinationsAvailable": "Kullanılabilir hedef yok.", + "@noDestinationsAvailable": { + "description": "Warning when no rooms or channels exist" + }, + "selectDestination": "Hedef seçin...", + "@selectDestination": { + "description": "Placeholder for destination dropdown" + }, + "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "@ephemeralBroadcastInfo": { + "description": "Information about ephemeral channel broadcasts" + }, + "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "@persistentRoomInfo": { + "description": "Information about persistent room storage" + }, + "location": "Konum", + "@location": { + "description": "Label for location section" + }, + "fromMap": "Haritadan", + "@fromMap": { + "description": "Badge showing location is from map tap" + }, + "gettingLocation": "Konum alınıyor...", + "@gettingLocation": { + "description": "Loading message while fetching GPS location" + }, + "locationError": "Konum hatası", + "@locationError": { + "description": "Title for location error messages" + }, + "retry": "Tekrar dene", + "@retry": { + "description": "Retry button label" + }, + "refreshLocation": "Konumu yenile", + "@refreshLocation": { + "description": "Tooltip for refresh location button" + }, + "accuracyMeters": "Doğruluk: ±{accuracy}m", + "@accuracyMeters": { + "description": "Display of GPS accuracy in meters", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "notesOptional": "Notlar (isteğe bağlı)", + "@notesOptional": { + "description": "Label for optional notes field" + }, + "addAdditionalInformation": "Ek bilgi ekleyin...", + "@addAdditionalInformation": { + "description": "Placeholder for notes field" + }, + "lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?", + "@lowAccuracyWarning": { + "description": "Warning dialog content for low GPS accuracy", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "loginToRoom": "Odaya giriş yap", + "@loginToRoom": { + "description": "Title for room login dialog" + }, + "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "@enterPasswordInfo": { + "description": "Information about room password" + }, + "password": "Parola", + "@password": { + "description": "Password field label" + }, + "enterRoomPassword": "Oda parolasını girin", + "@enterRoomPassword": { + "description": "Password field hint" + }, + "loggingInDots": "Giriş yapılıyor...", + "@loggingInDots": { + "description": "Button text while logging in" + }, + "login": "Giriş yap", + "@login": { + "description": "Login button label" + }, + "failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.", + "@failedToAddRoom": { + "description": "Error message when adding room fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "direct": "Doğrudan", + "@direct": { + "description": "Direct routing indicator" + }, + "flood": "Flood", + "@flood": { + "description": "Flood routing indicator" + }, + "loggedIn": "Giriş yapıldı", + "@loggedIn": { + "description": "Logged in status badge" + }, + "noGpsData": "GPS verisi yok", + "@noGpsData": { + "description": "Message when GPS data is not available" + }, + "distance": "Mesafe", + "@distance": { + "description": "Distance label" + }, + "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "@directPingTimeout": { + "description": "Warning when direct ping times out", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "pingFailed": "{name} için ping başarısız - yanıt alınamadı", + "@pingFailed": { + "description": "Error message when ping fails", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.", + "@deleteContactConfirmation": { + "description": "Confirmation message for deleting contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "failedToRemoveContact": "Kişi kaldırılamadı: {error}", + "@failedToRemoveContact": { + "description": "Error message when contact removal fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "type": "Tür", + "@type": { + "description": "Contact type label" + }, + "publicKey": "Genel anahtar", + "@publicKey": { + "description": "Public key label" + }, + "lastSeen": "Son görülme", + "@lastSeen": { + "description": "Last seen label" + }, + "roomStatus": "Oda durumu", + "@roomStatus": { + "description": "Room status section header" + }, + "loginStatus": "Giriş durumu", + "@loginStatus": { + "description": "Login status label" + }, + "notLoggedIn": "Giriş yapılmadı", + "@notLoggedIn": { + "description": "Not logged in status" + }, + "adminAccess": "Yönetici erişimi", + "@adminAccess": { + "description": "Admin access label" + }, + "yes": "Evet", + "@yes": { + "description": "Yes answer" + }, + "no": "Hayır", + "@no": { + "description": "No answer" + }, + "permissions": "İzinler", + "@permissions": { + "description": "Permissions label" + }, + "passwordSaved": "Parola kaydedildi", + "@passwordSaved": { + "description": "Password saved label" + }, + "locationColon": "Konum:", + "@locationColon": { + "description": "Location section header" + }, + "telemetry": "Telemetri", + "@telemetry": { + "description": "Telemetry section header" + }, + "voltage": "Voltaj", + "@voltage": { + "description": "Voltage label" + }, + "battery": "Pil", + "@battery": { + "description": "Battery label" + }, + "temperature": "Sıcaklık", + "@temperature": { + "description": "Temperature label" + }, + "humidity": "Nem", + "@humidity": { + "description": "Humidity label" + }, + "pressure": "Basınç", + "@pressure": { + "description": "Pressure label" + }, + "gpsTelemetry": "GPS (telemetri)", + "@gpsTelemetry": { + "description": "GPS from telemetry label" + }, + "updated": "Güncellendi", + "@updated": { + "description": "Updated timestamp label" + }, + "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "@pathResetInfo": { + "description": "Info message after path reset", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "reLoginToRoom": "Odaya yeniden giriş yap", + "@reLoginToRoom": { + "description": "Button to re-login to room" + }, + "heading": "Yön", + "@heading": { + "description": "Compass heading label" + }, + "elevation": "Rakım", + "@elevation": { + "description": "Elevation/altitude label" + }, + "accuracy": "Doğruluk", + "@accuracy": { + "description": "GPS accuracy label" + }, + "bearing": "İstikamet", + "@bearing": { + "description": "Bearing label in compass" + }, + "direction": "Yön", + "@direction": { + "description": "Direction label in compass" + }, + "filterMarkers": "İşaretleri filtrele", + "@filterMarkers": { + "description": "Title for filter markers dialog" + }, + "filterMarkersTooltip": "Filter markers", + "@filterMarkersTooltip": { + "description": "Tooltip for filter button" + }, + "contactsFilter": "Kişiler", + "@contactsFilter": { + "description": "Filter option for contacts" + }, + "repeatersFilter": "Tekrarlayıcılar", + "@repeatersFilter": { + "description": "Filter option for repeaters" + }, + "sarMarkers": "SAR işaretleri", + "@sarMarkers": { + "description": "SAR markers section header" + }, + "foundPerson": "Bulunan kişi", + "@foundPerson": { + "description": "Found person SAR marker type" + }, + "fire": "Yangın", + "@fire": { + "description": "Fire SAR marker type" + }, + "stagingArea": "Toplanma alanı", + "@stagingArea": { + "description": "Staging area SAR marker type" + }, + "showAll": "Tümünü göster", + "@showAll": { + "description": "Button to show all filters" + }, + "locationUnavailable": "Konum kullanılamıyor", + "@locationUnavailable": { + "description": "Message when GPS location is unavailable" + }, + "ahead": "ileride", + "@ahead": { + "description": "Relative bearing direction - ahead" + }, + "degreesRight": "{degrees}° sağda", + "@degreesRight": { + "description": "Relative bearing direction - right", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "degreesLeft": "{degrees}° solda", + "@degreesLeft": { + "description": "Relative bearing direction - left", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Latitude and longitude display format", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "noContactsYet": "Henüz kişi yok", + "@noContactsYet": { + "description": "Empty state message when there are no contacts" + }, + "connectToDeviceToLoadContacts": "Kişileri yüklemek için bir cihaza bağlanın", + "@connectToDeviceToLoadContacts": { + "description": "Instruction to connect device to load contacts" + }, + "teamMembers": "Ekip üyeleri", + "@teamMembers": { + "description": "Section header for team members (chat contacts)" + }, + "repeaters": "Tekrarlayıcılar", + "@repeaters": { + "description": "Section header for repeater nodes" + }, + "rooms": "Odalar", + "@rooms": { + "description": "Section header for rooms" + }, + "channels": "Kanallar", + "@channels": { + "description": "Section header for broadcast channels" + }, + "selectMapLayer": "Harita katmanını seç", + "@selectMapLayer": { + "description": "Title for map layer selection dialog" + }, + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "OpenStreetMap layer name" + }, + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "OpenTopoMap layer name" + }, + "esriSatellite": "ESRI Uydu", + "@esriSatellite": { + "description": "ESRI Satellite imagery layer name" + }, + "googleHybrid": "Google Hibrit", + "@googleHybrid": { + "description": "Google Hybrid layer name (satellite + labels)" + }, + "googleRoadmap": "Google Yol Haritası", + "@googleRoadmap": { + "description": "Google Roadmap layer name (street map)" + }, + "googleTerrain": "Google Arazi", + "@googleTerrain": { + "description": "Google Terrain layer name (topographic)" + }, + "dragToPosition": "Konuma sürükle", + "@dragToPosition": { + "description": "Label when dragging a pin on map" + }, + "createSarMarker": "SAR işareti oluştur", + "@createSarMarker": { + "description": "Label for creating SAR marker from pin" + }, + "compass": "Pusula", + "@compass": { + "description": "Compass title in detailed compass dialog" + }, + "navigationAndContacts": "Navigasyon ve kişiler", + "@navigationAndContacts": { + "description": "Subtitle for compass dialog" + }, + "sarAlert": "SAR ALARMI", + "@sarAlert": { + "description": "Label for SAR alert badge on messages" + }, + "textCopiedToClipboard": "Metin panoya kopyalandı", + "@textCopiedToClipboard": { + "description": "Success message when text is copied" + }, + "cannotReplySenderMissing": "Cannot reply: sender information missing", + "@cannotReplySenderMissing": { + "description": "Error when sender info is missing for reply" + }, + "cannotReplyContactNotFound": "Cannot reply: contact not found", + "@cannotReplyContactNotFound": { + "description": "Error when contact not found for reply" + }, + "copyText": "Metni kopyala", + "@copyText": { + "description": "Option to copy message text to clipboard" + }, + "saveAsTemplate": "Save as Template", + "@saveAsTemplate": { + "description": "Option to save SAR message as a reusable template" + }, + "templateSaved": "Template saved successfully", + "@templateSaved": { + "description": "Success message when SAR template is saved" + }, + "templateAlreadyExists": "Template with this emoji already exists", + "@templateAlreadyExists": { + "description": "Error message when trying to save duplicate template" + }, + "deleteMessage": "Mesajı sil", + "@deleteMessage": { + "description": "Dialog title for deleting a message" + }, + "deleteMessageConfirmation": "Bu mesajı silmek istediğinizden emin misiniz?", + "@deleteMessageConfirmation": { + "description": "Confirmation text for message deletion" + }, + "shareLocation": "Konumu paylaş", + "@shareLocation": { + "description": "Option to share SAR marker location" + }, + "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "@shareLocationText": { + "description": "Formatted text for sharing SAR marker location", + "placeholders": { + "markerInfo": { + "type": "String" + }, + "lat": { + "type": "String" + }, + "lon": { + "type": "String" + }, + "url": { + "type": "String" + } + } + }, + "sarLocationShare": "SAR konumu", + "@sarLocationShare": { + "description": "Subject line when sharing SAR marker location" + }, + "justNow": "Az önce", + "@justNow": { + "description": "Time indicator for very recent activity" + }, + "minutesAgo": "{minutes} dk önce", + "@minutesAgo": { + "description": "Time indicator for minutes ago", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "hoursAgo": "{hours} sa önce", + "@hoursAgo": { + "description": "Time indicator for hours ago", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "daysAgo": "{days} g önce", + "@daysAgo": { + "description": "Time indicator for days ago", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "secondsAgo": "{seconds} sn önce", + "@secondsAgo": { + "description": "Time indicator for seconds ago", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sending": "Gönderiliyor...", + "@sending": { + "description": "Delivery status: sending" + }, + "sent": "Gönderildi", + "@sent": { + "description": "Delivery status: sent" + }, + "delivered": "Teslim edildi", + "@delivered": { + "description": "Delivery status: delivered" + }, + "deliveredWithTime": "Teslim edildi ({time}ms)", + "@deliveredWithTime": { + "description": "Delivery status with round-trip time", + "placeholders": { + "time": { + "type": "int" + } + } + }, + "failed": "Başarısız", + "@failed": { + "description": "Delivery status: failed" + }, + "broadcast": "Yayın", + "@broadcast": { + "description": "Delivery status for channel messages (no echoes yet)" + }, + "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "@deliveredToContacts": { + "description": "Grouped message delivery count", + "placeholders": { + "delivered": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "allDelivered": "All delivered", + "@allDelivered": { + "description": "Status when all recipients received the message" + }, + "recipientDetails": "Recipient Details", + "@recipientDetails": { + "description": "Header for expandable recipient list" + }, + "pending": "Bekliyor", + "@pending": { + "description": "Delivery status: pending/waiting" + }, + "sarMarkerFoundPerson": "Found Person", + "@sarMarkerFoundPerson": { + "description": "SAR marker type: found person" + }, + "sarMarkerFire": "Fire Location", + "@sarMarkerFire": { + "description": "SAR marker type: fire" + }, + "sarMarkerStagingArea": "Staging Area", + "@sarMarkerStagingArea": { + "description": "SAR marker type: staging area" + }, + "sarMarkerObject": "Object Found", + "@sarMarkerObject": { + "description": "SAR marker type: object" + }, + "from": "Kimden", + "@from": { + "description": "Sender label in notifications" + }, + "coordinates": "Koordinatlar", + "@coordinates": { + "description": "Coordinates label" + }, + "tapToViewOnMap": "Haritada görüntülemek için dokunun", + "@tapToViewOnMap": { + "description": "Notification action text" + }, + "radioSettings": "Radyo ayarları", + "@radioSettings": { + "description": "Section title for radio settings" + }, + "frequencyMHz": "Frekans (MHz)", + "@frequencyMHz": { + "description": "Label for radio frequency field" + }, + "frequencyExample": "e.g., 869.618", + "@frequencyExample": { + "description": "Helper text example for frequency" + }, + "bandwidth": "Bant genişliği", + "@bandwidth": { + "description": "Label for bandwidth dropdown" + }, + "spreadingFactor": "Yayılma faktörü", + "@spreadingFactor": { + "description": "Label for spreading factor dropdown" + }, + "codingRate": "Kodlama oranı", + "@codingRate": { + "description": "Label for coding rate dropdown" + }, + "txPowerDbm": "TX gücü (dBm)", + "@txPowerDbm": { + "description": "Label for TX power field" + }, + "maxPowerDbm": "Maks: {power} dBm", + "@maxPowerDbm": { + "description": "Helper text showing maximum TX power", + "placeholders": { + "power": { + "type": "int" + } + } + }, + "you": "Siz", + "@you": { + "description": "Label for the current user in message bubbles" + }, + "exportFailed": "Dışa aktarma başarısız: {error}", + "@exportFailed": { + "description": "Error message when export fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "importFailed": "İçe aktarma başarısız: {error}", + "@importFailed": { + "description": "Error message when import fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "unknown": "Bilinmiyor", + "@unknown": { + "description": "Unknown value label" + }, + "onlineLayers": "Çevrimiçi katmanlar", + "@onlineLayers": { + "description": "Section header for online map layers" + }, + "locationTrail": "Konum izi", + "@locationTrail": { + "description": "Location trail title" + }, + "showTrailOnMap": "İzi haritada göster", + "@showTrailOnMap": { + "description": "Toggle to show/hide trail on map" + }, + "trailVisible": "İz haritada görünüyor", + "@trailVisible": { + "description": "Trail visibility status - visible" + }, + "trailHiddenRecording": "İz gizli (kayıt devam ediyor)", + "@trailHiddenRecording": { + "description": "Trail visibility status - hidden but recording" + }, + "duration": "Süre", + "@duration": { + "description": "Duration label" + }, + "points": "Noktalar", + "@points": { + "description": "Trail points count label" + }, + "clearTrail": "İzi temizle", + "@clearTrail": { + "description": "Button to clear location trail" + }, + "clearTrailQuestion": "İz temizlensin mi?", + "@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": "Henüz iz kaydedilmedi", + "@noTrailRecorded": { + "description": "Message when no trail exists" + }, + "startTrackingToRecord": "İzi kaydetmek için konum takibini başlatın", + "@startTrackingToRecord": { + "description": "Instructions to start trail recording" + }, + "trailControls": "İz kontrolleri", + "@trailControls": { + "description": "Trail controls tooltip" + }, + "contactTrails": "Kişi izleri", + "@contactTrails": { + "description": "Contact trails section header" + }, + "showAllContactTrails": "Tüm kişi izlerini göster", + "@showAllContactTrails": { + "description": "Toggle label to show all contact trails" + }, + "noContactsWithLocationHistory": "Konum geçmişi olan kişi yok", + "@noContactsWithLocationHistory": { + "description": "Subtitle when no contacts have trails" + }, + "showingTrailsForContacts": "Showing trails for {count} contacts", + "@showingTrailsForContacts": { + "description": "Subtitle showing number of contacts with trails", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "individualContactTrails": "Individual Contact Trails", + "@individualContactTrails": { + "description": "Expansion tile title for individual contact trails" + }, + "deviceInformation": "Cihaz bilgileri", + "@deviceInformation": { + "description": "Device information section header" + }, + "bleName": "BLE adı", + "@bleName": { + "description": "Bluetooth Low Energy device name label" + }, + "meshName": "Mesh adı", + "@meshName": { + "description": "Mesh network name label" + }, + "notSet": "Ayarlanmadı", + "@notSet": { + "description": "Label when a value is not set" + }, + "model": "Model", + "@model": { + "description": "Device model label" + }, + "version": "Sürüm", + "@version": { + "description": "Version label" + }, + "buildDate": "Derleme tarihi", + "@buildDate": { + "description": "Firmware build date label" + }, + "firmware": "Bellenim", + "@firmware": { + "description": "Firmware label" + }, + "maxContacts": "Maks kişi", + "@maxContacts": { + "description": "Maximum contacts capacity label" + }, + "maxChannels": "Maks kanal", + "@maxChannels": { + "description": "Maximum channels capacity label" + }, + "publicInfo": "Genel bilgiler", + "@publicInfo": { + "description": "Public information section header" + }, + "meshNetworkName": "Mesh ağ adı", + "@meshNetworkName": { + "description": "Mesh network name field label" + }, + "nameBroadcastInMesh": "Name broadcast in mesh advertisements", + "@nameBroadcastInMesh": { + "description": "Helper text for mesh network name field" + }, + "telemetryAndLocationSharing": "Telemetri ve konum paylaşımı", + "@telemetryAndLocationSharing": { + "description": "Telemetry and location sharing toggle label" + }, + "lat": "Enl.", + "@lat": { + "description": "Latitude field label (short form)" + }, + "lon": "Boyl.", + "@lon": { + "description": "Longitude field label (short form)" + }, + "useCurrentLocation": "Geçerli konumu kullan", + "@useCurrentLocation": { + "description": "Tooltip for use current location button" + }, + "noneUnknown": "Yok/Bilinmiyor", + "@noneUnknown": { + "description": "Device type: none or unknown" + }, + "chatNode": "Sohbet düğümü", + "@chatNode": { + "description": "Device type: chat node" + }, + "repeater": "Tekrarlayıcı", + "@repeater": { + "description": "Device type: repeater" + }, + "roomChannel": "Oda/Kanal", + "@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": "Kaydetme başarısız: {error}", + "@failedToSave": { + "description": "Generic error message for save failures", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "failedToGetLocation": "Konum alınamadı: {error}", + "@failedToGetLocation": { + "description": "Error message when getting location fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "sarTemplates": "SAR şablonları", + "@sarTemplates": { + "description": "SAR templates menu title" + }, + "manageSarTemplates": "Manage cursor on target templates", + "@manageSarTemplates": { + "description": "Subtitle for SAR templates settings" + }, + "addTemplate": "Şablon ekle", + "@addTemplate": { + "description": "Button to add new SAR template" + }, + "editTemplate": "Şablonu düzenle", + "@editTemplate": { + "description": "Dialog title for editing template" + }, + "deleteTemplate": "Şablonu sil", + "@deleteTemplate": { + "description": "Action to delete template" + }, + "templateName": "Şablon adı", + "@templateName": { + "description": "Label for template name field" + }, + "templateNameHint": "örn. Bulunan kişi", + "@templateNameHint": { + "description": "Hint text for template name" + }, + "templateEmoji": "Emoji", + "@templateEmoji": { + "description": "Label for template emoji field" + }, + "emojiRequired": "Emoji gerekli", + "@emojiRequired": { + "description": "Validation error when emoji field is empty" + }, + "nameRequired": "Ad gerekli", + "@nameRequired": { + "description": "Validation error when name field is empty" + }, + "templateDescription": "Açıklama (isteğe bağlı)", + "@templateDescription": { + "description": "Label for template description field" + }, + "templateDescriptionHint": "Ek bağlam ekleyin...", + "@templateDescriptionHint": { + "description": "Hint text for template description" + }, + "templateColor": "Renk", + "@templateColor": { + "description": "Label for template color picker" + }, + "previewFormat": "Önizleme (SAR mesaj biçimi)", + "@previewFormat": { + "description": "Label for format preview" + }, + "importFromClipboard": "İçe aktar", + "@importFromClipboard": { + "description": "Button to import templates from clipboard" + }, + "exportToClipboard": "Dışa aktar", + "@exportToClipboard": { + "description": "Button to export templates to clipboard" + }, + "deleteTemplateConfirmation": "“{name}” şablonu silinsin mi?", + "@deleteTemplateConfirmation": { + "description": "Confirmation message for template deletion", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "templateAdded": "Şablon eklendi", + "@templateAdded": { + "description": "Success message when template is added" + }, + "templateUpdated": "Şablon güncellendi", + "@templateUpdated": { + "description": "Success message when template is updated" + }, + "templateDeleted": "Şablon silindi", + "@templateDeleted": { + "description": "Success message when template is deleted" + }, + "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "@templatesImported": { + "description": "Success message after importing templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "@templatesExported": { + "description": "Success message after exporting templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "resetToDefaults": "Varsayılanlara sıfırla", + "@resetToDefaults": { + "description": "Action to reset templates to defaults" + }, + "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "@resetToDefaultsConfirmation": { + "description": "Confirmation message for reset to defaults" + }, + "reset": "Sıfırla", + "@reset": { + "description": "Reset button label" + }, + "resetComplete": "Şablonlar varsayılana sıfırlandı", + "@resetComplete": { + "description": "Success message after reset" + }, + "noTemplates": "Kullanılabilir şablon yok", + "@noTemplates": { + "description": "Message when no templates exist" + }, + "tapAddToCreate": "İlk şablonunuzu oluşturmak için + işaretine dokunun", + "@tapAddToCreate": { + "description": "Helper text when no templates exist" + }, + "ok": "Tamam", + "@ok": { + "description": "OK button label" + }, + "permissionsSection": "İzinler", + "@permissionsSection": { + "description": "Permissions section header" + }, + "locationPermission": "Konum izni", + "@locationPermission": { + "description": "Location permission label" + }, + "checking": "Kontrol ediliyor...", + "@checking": { + "description": "Loading state indicator" + }, + "locationPermissionGrantedAlways": "Verildi (Her zaman)", + "@locationPermissionGrantedAlways": { + "description": "Location permission status: granted always" + }, + "locationPermissionGrantedWhileInUse": "Verildi (Kullanım sırasında)", + "@locationPermissionGrantedWhileInUse": { + "description": "Location permission status: granted while in use" + }, + "locationPermissionDeniedTapToRequest": "Reddedildi - istemek için dokunun", + "@locationPermissionDeniedTapToRequest": { + "description": "Location permission status: denied, user can request" + }, + "locationPermissionPermanentlyDeniedOpenSettings": "Kalıcı olarak reddedildi - ayarları aç", + "@locationPermissionPermanentlyDeniedOpenSettings": { + "description": "Location permission status: permanently denied" + }, + "locationPermissionDialogContent": "Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.", + "@locationPermissionDialogContent": { + "description": "Content for location permission dialog when permanently denied" + }, + "openSettings": "Ayarları aç", + "@openSettings": { + "description": "Button to open device settings" + }, + "locationPermissionGranted": "Konum izni verildi!", + "@locationPermissionGranted": { + "description": "Success message when location permission is granted" + }, + "locationPermissionRequiredForGps": "GPS takibi ve konum paylaşımı için konum izni gereklidir.", + "@locationPermissionRequiredForGps": { + "description": "Info message about location permission requirement" + }, + "locationPermissionAlreadyGranted": "Konum izni zaten verilmiş.", + "@locationPermissionAlreadyGranted": { + "description": "Info message when permission is already granted" + }, + "sarNavyBlue": "SAR Navy Blue", + "@sarNavyBlue": { + "description": "SAR Navy Blue theme name" + }, + "sarNavyBlueDescription": "Professional/Operations Mode", + "@sarNavyBlueDescription": { + "description": "Description for SAR Navy Blue theme" + }, + "selectRecipient": "Alıcı seç", + "@selectRecipient": { + "description": "Title for recipient selector sheet" + }, + "broadcastToAllNearby": "Broadcast to all nearby", + "@broadcastToAllNearby": { + "description": "Subtitle for public channel option" + }, + "searchRecipients": "Alıcı ara...", + "@searchRecipients": { + "description": "Placeholder text for recipient search field" + }, + "noContactsFound": "Kişi bulunamadı", + "@noContactsFound": { + "description": "Message when no contacts match search" + }, + "noRoomsFound": "Oda bulunamadı", + "@noRoomsFound": { + "description": "Message when no rooms match search" + }, + "noRecipientsAvailable": "Kullanılabilir alıcı yok", + "@noRecipientsAvailable": { + "description": "Message when no recipients exist (contacts, rooms, or channels)" + }, + "noChannelsFound": "Kanal bulunamadı", + "@noChannelsFound": { + "description": "Message when no channels match the search" + }, + "newMessage": "Yeni mesaj", + "@newMessage": { + "description": "Notification title for new message" + }, + "channel": "Kanal", + "@channel": { + "description": "Channel label in notifications" + }, + "samplePoliceLead": "Police Lead", + "@samplePoliceLead": { + "description": "Sample team member name" + }, + "sampleDroneOperator": "Drone Operator", + "@sampleDroneOperator": { + "description": "Sample team member name" + }, + "sampleFirefighterAlpha": "Firefighter", + "@sampleFirefighterAlpha": { + "description": "Sample team member name" + }, + "sampleMedicCharlie": "Medic", + "@sampleMedicCharlie": { + "description": "Sample team member name" + }, + "sampleCommandDelta": "Command", + "@sampleCommandDelta": { + "description": "Sample team member name" + }, + "sampleFireEngine": "Fire Engine", + "@sampleFireEngine": { + "description": "Sample team member name" + }, + "sampleAirSupport": "Air Support", + "@sampleAirSupport": { + "description": "Sample team member name" + }, + "sampleBaseCoordinator": "Base Coordinator", + "@sampleBaseCoordinator": { + "description": "Sample team member name" + }, + "channelEmergency": "Acil durum", + "@channelEmergency": { + "description": "Emergency channel name" + }, + "channelCoordination": "Koordinasyon", + "@channelCoordination": { + "description": "Coordination channel name" + }, + "channelUpdates": "Güncellemeler", + "@channelUpdates": { + "description": "Updates channel name" + }, + "sampleTeamMember": "Sample Team Member", + "@sampleTeamMember": { + "description": "Sample sender name" + }, + "sampleScout": "Sample Scout", + "@sampleScout": { + "description": "Sample sender name" + }, + "sampleBase": "Sample Base", + "@sampleBase": { + "description": "Sample sender name" + }, + "sampleSearcher": "Sample Searcher", + "@sampleSearcher": { + "description": "Sample sender name" + }, + "sampleObjectBackpack": " Backpack found - blue color", + "@sampleObjectBackpack": { + "description": "Sample object note" + }, + "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "@sampleObjectVehicle": { + "description": "Sample object note" + }, + "sampleObjectCamping": " Camping equipment discovered", + "@sampleObjectCamping": { + "description": "Sample object note" + }, + "sampleObjectTrailMarker": " Trail marker found off-path", + "@sampleObjectTrailMarker": { + "description": "Sample object note" + }, + "sampleMsgAllTeamsCheckIn": "All teams check in", + "@sampleMsgAllTeamsCheckIn": { + "description": "Sample channel message" + }, + "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "@sampleMsgWeatherUpdate": { + "description": "Sample channel message" + }, + "sampleMsgBaseCamp": "Base camp established at staging area", + "@sampleMsgBaseCamp": { + "description": "Sample channel message" + }, + "sampleMsgTeamAlpha": "Team moving to sector 2", + "@sampleMsgTeamAlpha": { + "description": "Sample channel message" + }, + "sampleMsgRadioCheck": "Radio check - all stations respond", + "@sampleMsgRadioCheck": { + "description": "Sample channel message" + }, + "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "@sampleMsgWaterSupply": { + "description": "Sample channel message" + }, + "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "@sampleMsgTeamBravo": { + "description": "Sample channel message" + }, + "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "@sampleMsgEtaRallyPoint": { + "description": "Sample channel message" + }, + "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "@sampleMsgSupplyDrop": { + "description": "Sample channel message" + }, + "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "@sampleMsgDroneSurvey": { + "description": "Sample channel message" + }, + "sampleMsgTeamCharlie": "Team requesting backup", + "@sampleMsgTeamCharlie": { + "description": "Sample channel message" + }, + "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "@sampleMsgRadioDiscipline": { + "description": "Sample channel message" + }, + "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "@sampleMsgUrgentMedical": { + "description": "Sample emergency message" + }, + "sampleMsgAdultMale": " Adult male, conscious", + "@sampleMsgAdultMale": { + "description": "Sample emergency message note" + }, + "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "@sampleMsgFireSpotted": { + "description": "Sample emergency message" + }, + "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "@sampleMsgSpreadingRapidly": { + "description": "Sample emergency message note" + }, + "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "@sampleMsgPriorityHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "@sampleMsgMedicalTeamEnRoute": { + "description": "Sample emergency message" + }, + "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "@sampleMsgEvacHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "@sampleMsgEmergencyResolved": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyStagingArea": " Emergency staging area", + "@sampleMsgEmergencyStagingArea": { + "description": "Sample emergency message note" + }, + "sampleMsgEmergencyServices": "Emergency services notified and responding", + "@sampleMsgEmergencyServices": { + "description": "Sample emergency message" + }, + "sampleAlphaTeamLead": "Team Lead", + "@sampleAlphaTeamLead": { + "description": "Sample team name" + }, + "sampleBravoScout": "Scout", + "@sampleBravoScout": { + "description": "Sample team name" + }, + "sampleCharlieMedic": "Medic", + "@sampleCharlieMedic": { + "description": "Sample team name" + }, + "sampleDeltaNavigator": "Navigator", + "@sampleDeltaNavigator": { + "description": "Sample team name" + }, + "sampleEchoSupport": "Support", + "@sampleEchoSupport": { + "description": "Sample team name" + }, + "sampleBaseCommand": "Base Command", + "@sampleBaseCommand": { + "description": "Sample team name" + }, + "sampleFieldCoordinator": "Field Coordinator", + "@sampleFieldCoordinator": { + "description": "Sample team name" + }, + "sampleMedicalTeam": "Medical Team", + "@sampleMedicalTeam": { + "description": "Sample team name" + }, + "mapDrawing": "Harita çizimi", + "@mapDrawing": { + "description": "Label for map drawing messages" + }, + "navigateToDrawing": "Navigate to Drawing", + "@navigateToDrawing": { + "description": "Option to navigate to drawing on map" + }, + "copyCoordinates": "Koordinatları kopyala", + "@copyCoordinates": { + "description": "Option to copy coordinates to clipboard" + }, + "hideFromMap": "Haritadan gizle", + "@hideFromMap": { + "description": "Option to hide drawing from map" + }, + "lineDrawing": "Çizgi çizimi", + "@lineDrawing": { + "description": "Label for line type drawings" + }, + "rectangleDrawing": "Dikdörtgen çizimi", + "@rectangleDrawing": { + "description": "Label for rectangle type drawings" + }, + "manualCoordinates": "Manuel koordinatlar", + "@manualCoordinates": { + "description": "Label for manual coordinate input toggle" + }, + "enterCoordinatesManually": "Koordinatları manuel girin", + "@enterCoordinatesManually": { + "description": "Description for manual coordinate input option" + }, + "latitudeLabel": "Enlem", + "@latitudeLabel": { + "description": "Label for latitude input field" + }, + "longitudeLabel": "Boylam", + "@longitudeLabel": { + "description": "Label for longitude input field" + }, + "exampleCoordinates": "Example: 46.0569, 14.5058", + "@exampleCoordinates": { + "description": "Example coordinate format hint" + }, + "shareDrawing": "Çizimi paylaş", + "@shareDrawing": { + "description": "Title for share single drawing dialog" + }, + "shareWithAllNearbyDevices": "Yakındaki tüm cihazlarla paylaş", + "@shareWithAllNearbyDevices": { + "description": "Subtitle for public channel sharing option" + }, + "shareToRoom": "Odaya paylaş", + "@shareToRoom": { + "description": "Header for room sharing section" + }, + "sendToPersistentStorage": "Kalıcı oda depolamasına gönder", + "@sendToPersistentStorage": { + "description": "Subtitle for room sharing option" + }, + "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "@deleteDrawingConfirm": { + "description": "Confirmation message for deleting a single drawing" + }, + "drawingDeleted": "Çizim silindi", + "@drawingDeleted": { + "description": "Success message after deleting a drawing" + }, + "yourDrawingsCount": "Your Drawings ({count})", + "@yourDrawingsCount": { + "description": "Header showing count of user's drawings", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shared": "Paylaşıldı", + "@shared": { + "description": "Status label for shared drawings" + }, + "line": "Çizgi", + "@line": { + "description": "Line drawing type label" + }, + "rectangle": "Dikdörtgen", + "@rectangle": { + "description": "Rectangle drawing type label" + }, + "updateAvailable": "Güncelleme mevcut", + "@updateAvailable": { + "description": "Title for update dialog when new version is available" + }, + "currentVersion": "Geçerli", + "@currentVersion": { + "description": "Label for current app version" + }, + "latestVersion": "En son", + "@latestVersion": { + "description": "Label for latest available app version" + }, + "downloadUpdate": "İndir", + "@downloadUpdate": { + "description": "Button to download app update" + }, + "updateLater": "Daha sonra", + "@updateLater": { + "description": "Button to dismiss update dialog" + }, + "cadastralParcels": "Cadastral Parcels", + "@cadastralParcels": { + "description": "Label for cadastral parcels WMS overlay layer" + }, + "forestRoads": "Forest Roads", + "@forestRoads": { + "description": "Label for forest roads WMS overlay layer" + }, + "wmsOverlays": "WMS Overlays", + "@wmsOverlays": { + "description": "Section header for WMS overlay layers in layer selector" + }, + "hikingTrails": "Hiking Trails", + "@hikingTrails": { + "description": "Label for hiking/mountain trails WMS overlay layer" + }, + "mainRoads": "Main Roads", + "@mainRoads": { + "description": "Label for main roads WMS overlay layer" + }, + "houseNumbers": "House Numbers", + "@houseNumbers": { + "description": "Label for house numbers WMS overlay layer" + }, + "fireHazardZones": "Fire Hazard Zones", + "@fireHazardZones": { + "description": "Label for fire hazard risk zones WMS overlay layer" + }, + "historicalFires": "Historical Fires", + "@historicalFires": { + "description": "Label for historical forest fires WMS overlay layer" + }, + "firebreaks": "Firebreaks", + "@firebreaks": { + "description": "Label for firebreaks WMS overlay layer" + }, + "krasFireZones": "Kras Fire Zones", + "@krasFireZones": { + "description": "Label for Kras fire zones WMS overlay layer" + }, + "placeNames": "Place Names", + "@placeNames": { + "description": "Label for geographic place names WMS overlay layer" + }, + "municipalityBorders": "Municipality Borders", + "@municipalityBorders": { + "description": "Label for municipality borders WMS overlay layer" + }, + "topographicMap": "Topographic Map 1:25000", + "@topographicMap": { + "description": "Label for DTK25 topographic base map layer" + }, + "recentMessages": "Son mesajlar", + "@recentMessages": { + "description": "Header for recent messages overlay on map in fullscreen mode" + }, + "addChannel": "Kanal ekle", + "@addChannel": { + "description": "Button to add a new channel" + }, + "channelName": "Kanal adı", + "@channelName": { + "description": "Label for channel name field" + }, + "channelNameHint": "örn. Kurtarma Ekibi Alfa", + "@channelNameHint": { + "description": "Hint for channel name field" + }, + "channelSecret": "Kanal sırrı", + "@channelSecret": { + "description": "Label for channel secret field" + }, + "channelSecretHint": "Bu kanal için paylaşılan parola", + "@channelSecretHint": { + "description": "Hint for channel secret field" + }, + "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "@channelSecretHelp": { + "description": "Help text explaining channel secret" + }, + "channelTypesInfo": "Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.", + "@channelTypesInfo": { + "description": "Information banner explaining hash and private channel types" + }, + "hashChannelInfo": "Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.", + "@hashChannelInfo": { + "description": "Help text for hash channels (# prefix)" + }, + "channelNameRequired": "Kanal adı gerekli", + "@channelNameRequired": { + "description": "Validation error for empty channel name" + }, + "channelNameTooLong": "Channel name must be 31 characters or less", + "@channelNameTooLong": { + "description": "Validation error for channel name too long" + }, + "channelSecretRequired": "Kanal sırrı gerekli", + "@channelSecretRequired": { + "description": "Validation error for empty channel secret" + }, + "channelSecretTooLong": "Channel secret must be 32 characters or less", + "@channelSecretTooLong": { + "description": "Validation error for channel secret too long" + }, + "invalidAsciiCharacters": "Yalnızca ASCII karakterlere izin verilir", + "@invalidAsciiCharacters": { + "description": "Validation error for non-ASCII characters" + }, + "channelCreatedSuccessfully": "Kanal başarıyla oluşturuldu", + "@channelCreatedSuccessfully": { + "description": "Success message after creating channel" + }, + "channelCreationFailed": "Kanal oluşturulamadı: {error}", + "@channelCreationFailed": { + "description": "Error message when channel creation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "deleteChannel": "Kanalı sil", + "@deleteChannel": { + "description": "Delete channel button/menu item" + }, + "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "@deleteChannelConfirmation": { + "description": "Confirmation dialog when deleting a channel", + "placeholders": { + "channelName": { + "type": "String" + } + } + }, + "channelDeletedSuccessfully": "Kanal başarıyla silindi", + "@channelDeletedSuccessfully": { + "description": "Success message after deleting channel" + }, + "channelDeletionFailed": "Kanal silinemedi: {error}", + "@channelDeletionFailed": { + "description": "Error message when channel deletion fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createChannel": "Kanal oluştur", + "@createChannel": { + "description": "Button text for creating a channel" + }, + "wizardBack": "Geri", + "@wizardBack": { + "description": "Wizard back button text" + }, + "wizardSkip": "Atla", + "@wizardSkip": { + "description": "Wizard skip button text" + }, + "wizardNext": "İleri", + "@wizardNext": { + "description": "Wizard next button text" + }, + "wizardGetStarted": "Başla", + "@wizardGetStarted": { + "description": "Wizard final button text to complete onboarding" + }, + "wizardWelcomeTitle": "MeshCore SAR uygulamasına hoş geldiniz", + "@wizardWelcomeTitle": { + "description": "Welcome wizard first page title" + }, + "wizardWelcomeDescription": "A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.", + "@wizardWelcomeDescription": { + "description": "Welcome wizard first page description" + }, + "wizardConnectingTitle": "Radyonuza bağlanma", + "@wizardConnectingTitle": { + "description": "Wizard connecting page title" + }, + "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "@wizardConnectingDescription": { + "description": "Wizard connecting page description" + }, + "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "@wizardConnectingFeature1": { + "description": "Wizard connecting feature 1" + }, + "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "@wizardConnectingFeature2": { + "description": "Wizard connecting feature 2" + }, + "wizardConnectingFeature3": "Works completely offline - no internet required", + "@wizardConnectingFeature3": { + "description": "Wizard connecting feature 3" + }, + "wizardChannelTitle": "Kanallar", + "@wizardChannelTitle": { + "description": "Wizard channel page title" + }, + "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "@wizardChannelDescription": { + "description": "Wizard channel page description" + }, + "wizardChannelFeature1": "Public Channel for general team communication", + "@wizardChannelFeature1": { + "description": "Wizard channel feature 1" + }, + "wizardChannelFeature2": "Create custom channels for specific groups", + "@wizardChannelFeature2": { + "description": "Wizard channel feature 2" + }, + "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "@wizardChannelFeature3": { + "description": "Wizard channel feature 3" + }, + "wizardContactsTitle": "Kişiler", + "@wizardContactsTitle": { + "description": "Wizard contacts page title" + }, + "wizardContactsDescription": "Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.", + "@wizardContactsDescription": { + "description": "Wizard contacts page description" + }, + "wizardContactsFeature1": "Contacts discovered automatically", + "@wizardContactsFeature1": { + "description": "Wizard contacts feature 1" + }, + "wizardContactsFeature2": "Send private direct messages", + "@wizardContactsFeature2": { + "description": "Wizard contacts feature 2" + }, + "wizardContactsFeature3": "View battery level and last seen time", + "@wizardContactsFeature3": { + "description": "Wizard contacts feature 3" + }, + "wizardMapTitle": "Harita ve konum", + "@wizardMapTitle": { + "description": "Wizard map page title" + }, + "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "@wizardMapDescription": { + "description": "Wizard map page description" + }, + "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "@wizardMapFeature1": { + "description": "Wizard map feature 1" + }, + "wizardMapFeature2": "Real-time GPS tracking of team members", + "@wizardMapFeature2": { + "description": "Wizard map feature 2" + }, + "wizardMapFeature3": "Download offline maps for remote areas", + "@wizardMapFeature3": { + "description": "Wizard map feature 3" + }, + "wizardMapFeature4": "Draw shapes and share tactical information", + "@wizardMapFeature4": { + "description": "Wizard map feature 4" + }, + "viewWelcomeTutorial": "Karşılama eğitimini görüntüle", + "@viewWelcomeTutorial": { + "description": "Settings option to re-show welcome wizard" + }, + "allTeamContacts": "Tüm ekip kişileri", + "@allTeamContacts": { + "description": "Destination option to send SAR marker to all team contacts" + }, + "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "@directMessagesInfo": { + "description": "Information about sending to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "@sarMarkerSentToContacts": { + "description": "Success message after sending SAR marker to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noContactsAvailable": "Ekip kişisi yok", + "@noContactsAvailable": { + "description": "Message when there are no chat contacts to send to" + }, + "reply": "Yanıtla", + "@reply": {}, + "technicalDetails": "Teknik ayrıntılar", + "@technicalDetails": {}, + "messageTechnicalDetails": "Message technical details", + "@messageTechnicalDetails": {}, + "linkQuality": "Link quality", + "@linkQuality": {}, + "delivery": "Delivery", + "@delivery": {}, + "status": "Durum", + "@status": {}, + "expectedAckTag": "Expected ACK tag", + "@expectedAckTag": {}, + "roundTrip": "Round-trip", + "@roundTrip": {}, + "retryAttempt": "Retry attempt", + "@retryAttempt": {}, + "floodFallback": "Flood fallback", + "@floodFallback": {}, + "identity": "Identity", + "@identity": {}, + "messageId": "Message ID", + "@messageId": {}, + "sender": "Sender", + "@sender": {}, + "senderKey": "Sender key", + "@senderKey": {}, + "recipient": "Recipient", + "@recipient": {}, + "recipientKey": "Recipient key", + "@recipientKey": {}, + "voice": "Ses", + "@voice": {}, + "voiceId": "Voice ID", + "@voiceId": {}, + "envelope": "Envelope", + "@envelope": {}, + "sessionProgress": "Session progress", + "@sessionProgress": {}, + "complete": "Tamamlandı", + "@complete": {}, + "rawDump": "Raw dump", + "@rawDump": {}, + "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "@cannotRetryMissingRecipient": {}, + "voiceUnavailable": "Ses şu anda kullanılamıyor", + "@voiceUnavailable": {}, + "requestingVoice": "Requesting voice", + "@requestingVoice": {} +} diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb new file mode 100644 index 0000000..15373f3 --- /dev/null +++ b/lib/l10n/app_uk.arb @@ -0,0 +1,2280 @@ +{ + "@@locale": "uk", + "appTitle": "MeshCore SAR", + "@appTitle": { + "description": "The application title" + }, + "messages": "Повідомлення", + "@messages": { + "description": "Messages tab label" + }, + "contacts": "Контакти", + "@contacts": { + "description": "Contacts tab label" + }, + "map": "Мапа", + "@map": { + "description": "Map tab label" + }, + "settings": "Налаштування", + "@settings": { + "description": "Settings screen title" + }, + "connect": "Підключити", + "@connect": { + "description": "Connect button label" + }, + "disconnect": "Відключити", + "@disconnect": { + "description": "Disconnect button label" + }, + "noDevicesFound": "Пристроїв не знайдено", + "@noDevicesFound": { + "description": "Text shown when no BLE devices are found" + }, + "scanAgain": "Сканувати знову", + "@scanAgain": { + "description": "Button to restart BLE scanning" + }, + "tapToConnect": "Торкніться, щоб підключитися", + "@tapToConnect": { + "description": "Subtitle text for device in scan list" + }, + "deviceNotConnected": "Пристрій не підключено", + "@deviceNotConnected": { + "description": "Error message when device is not connected" + }, + "locationPermissionDenied": "Доступ до геолокації відхилено", + "@locationPermissionDenied": { + "description": "Error when location permission is denied" + }, + "locationPermissionPermanentlyDenied": "Location permission permanently denied. Please enable in Settings.", + "@locationPermissionPermanentlyDenied": { + "description": "Error when location permission is permanently denied" + }, + "locationPermissionRequired": "Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.", + "@locationPermissionRequired": { + "description": "Message when location permission is needed" + }, + "locationServicesDisabled": "Служби геолокації вимкнені. Увімкніть їх у Налаштуваннях.", + "@locationServicesDisabled": { + "description": "Error when location services are disabled" + }, + "failedToGetGpsLocation": "Не вдалося отримати GPS-координати", + "@failedToGetGpsLocation": { + "description": "Error when GPS location cannot be obtained" + }, + "failedToAdvertise": "Failed to advertise: {error}", + "@failedToAdvertise": { + "description": "Error message for failed advertisement", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "cancelReconnection": "Скасувати повторне підключення", + "@cancelReconnection": { + "description": "Tooltip for cancel reconnection button" + }, + "general": "Загальні", + "@general": { + "description": "General settings section header" + }, + "theme": "Тема", + "@theme": { + "description": "Theme setting label" + }, + "chooseTheme": "Вибрати тему", + "@chooseTheme": { + "description": "Theme selection dialog title" + }, + "light": "Світла", + "@light": { + "description": "Light theme option" + }, + "dark": "Темна", + "@dark": { + "description": "Dark theme option" + }, + "blueLightTheme": "Blue light theme", + "@blueLightTheme": { + "description": "Description for blue light theme" + }, + "blueDarkTheme": "Blue dark theme", + "@blueDarkTheme": { + "description": "Description for blue dark theme" + }, + "sarRed": "SAR Red", + "@sarRed": { + "description": "SAR Red theme option" + }, + "alertEmergencyMode": "Alert/Emergency mode", + "@alertEmergencyMode": { + "description": "Description for SAR Red theme" + }, + "sarGreen": "SAR Green", + "@sarGreen": { + "description": "SAR Green theme option" + }, + "safeAllClearMode": "Safe/All Clear mode", + "@safeAllClearMode": { + "description": "Description for SAR Green theme" + }, + "autoSystem": "Auto (System)", + "@autoSystem": { + "description": "Auto/System theme option" + }, + "followSystemTheme": "Follow system theme", + "@followSystemTheme": { + "description": "Description for system theme" + }, + "showRxTxIndicators": "Show RX/TX Indicators", + "@showRxTxIndicators": { + "description": "Setting to show RX/TX indicators" + }, + "displayPacketActivity": "Display packet activity indicators in top bar", + "@displayPacketActivity": { + "description": "Description for RX/TX indicators setting" + }, + "disableMap": "Disable Map", + "@disableMap": { + "description": "Setting to disable the map tab" + }, + "disableMapDescription": "Hide the map tab to reduce battery usage", + "@disableMapDescription": { + "description": "Description for disable map setting" + }, + "language": "Мова", + "@language": { + "description": "Language setting label" + }, + "chooseLanguage": "Вибрати мову", + "@chooseLanguage": { + "description": "Language selection dialog title" + }, + "save": "Зберегти", + "@save": { + "description": "Save button label" + }, + "cancel": "Скасувати", + "@cancel": { + "description": "Cancel button label" + }, + "close": "Закрити", + "@close": { + "description": "Close button label" + }, + "about": "Про програму", + "@about": { + "description": "About section header" + }, + "appVersion": "App Version", + "@appVersion": { + "description": "App version label" + }, + "appName": "App Name", + "@appName": { + "description": "App name label" + }, + "aboutMeshCoreSar": "About MeshCore SAR", + "@aboutMeshCoreSar": { + "description": "About dialog title" + }, + "aboutDescription": "A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use", + "@aboutDescription": { + "description": "About dialog description" + }, + "technologiesUsed": "Technologies Used:", + "@technologiesUsed": { + "description": "Technologies used section title" + }, + "technologiesList": "• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage", + "@technologiesList": { + "description": "List of technologies used" + }, + "moreInfo": "More Info", + "@moreInfo": { + "description": "More info button label" + }, + "packageName": "Package Name", + "@packageName": { + "description": "Package name label" + }, + "sampleData": "Тестові дані", + "@sampleData": { + "description": "Sample data section header" + }, + "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "@sampleDataDescription": { + "description": "Sample data section description" + }, + "loadSampleData": "Завантажити тестові дані", + "@loadSampleData": { + "description": "Load sample data button" + }, + "clearAllData": "Очистити всі дані", + "@clearAllData": { + "description": "Clear all data button" + }, + "clearAllDataConfirmTitle": "Clear All Data", + "@clearAllDataConfirmTitle": { + "description": "Clear data confirmation dialog title" + }, + "clearAllDataConfirmMessage": "This will clear all contacts and SAR markers. Are you sure?", + "@clearAllDataConfirmMessage": { + "description": "Clear data confirmation message" + }, + "clear": "Очистити", + "@clear": { + "description": "Clear button label" + }, + "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "@loadedSampleData": { + "description": "Success message after loading sample data", + "placeholders": { + "teamCount": { + "type": "int" + }, + "channelCount": { + "type": "int" + }, + "sarCount": { + "type": "int" + }, + "messageCount": { + "type": "int" + } + } + }, + "failedToLoadSampleData": "Failed to load sample data: {error}", + "@failedToLoadSampleData": { + "description": "Error message when sample data fails to load", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "allDataCleared": "All data cleared", + "@allDataCleared": { + "description": "Success message after clearing all data" + }, + "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "@failedToStartBackgroundTracking": { + "description": "Error message when background tracking fails to start" + }, + "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "@locationBroadcast": { + "description": "Success message for location broadcast", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "@defaultPinInfo": { + "description": "Information about default PIN for pairing" + }, + "noMessagesYet": "Повідомлень ще немає", + "@noMessagesYet": { + "description": "Empty state message when there are no messages" + }, + "pullDownToSync": "Потягніть вниз, щоб синхронізувати повідомлення", + "@pullDownToSync": { + "description": "Instruction to pull down to refresh messages" + }, + "deleteContact": "Видалити контакт", + "@deleteContact": { + "description": "Delete contact action label" + }, + "delete": "Видалити", + "@delete": { + "description": "Delete button label" + }, + "viewOnMap": "Показати на мапі", + "@viewOnMap": { + "description": "Action to view contact location on map" + }, + "refresh": "Оновити", + "@refresh": { + "description": "Refresh button label" + }, + "resetPath": "Reset Path (Re-route)", + "@resetPath": { + "description": "Action to reset contact path for re-routing" + }, + "publicKeyCopied": "Public key copied to clipboard", + "@publicKeyCopied": { + "description": "Success message when public key is copied" + }, + "copiedToClipboard": "{label} copied to clipboard", + "@copiedToClipboard": { + "description": "Success message when a value is copied to clipboard", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "pleaseEnterPassword": "Будь ласка, введіть пароль", + "@pleaseEnterPassword": { + "description": "Validation message for empty password field" + }, + "failedToSyncContacts": "Failed to sync contacts: {error}", + "@failedToSyncContacts": { + "description": "Error message when contact sync fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "loggedInSuccessfully": "Вхід виконано успішно! Очікування повідомлень кімнати...", + "@loggedInSuccessfully": { + "description": "Success message after successful room login" + }, + "loginFailed": "Помилка входу - неправильний пароль", + "@loginFailed": { + "description": "Error message when room login fails" + }, + "loggingIn": "Вхід до {roomName}...", + "@loggingIn": { + "description": "Status message during room login process", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "failedToSendLogin": "Failed to send login: {error}", + "@failedToSendLogin": { + "description": "Error message when login command fails to send", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "lowLocationAccuracy": "Низька точність геолокації", + "@lowLocationAccuracy": { + "description": "Warning title for low GPS accuracy" + }, + "continue_": "Продовжити", + "@continue_": { + "description": "Continue button label" + }, + "sendSarMarker": "Надіслати маркер SAR", + "@sendSarMarker": { + "description": "Action to send SAR marker" + }, + "deleteDrawing": "Видалити рисунок", + "@deleteDrawing": { + "description": "Action to delete a map drawing" + }, + "drawingTools": "Інструменти малювання", + "@drawingTools": { + "description": "Drawing tools section or menu title" + }, + "drawLine": "Намалювати лінію", + "@drawLine": { + "description": "Map drawing mode: line" + }, + "drawLineDesc": "Draw a freehand line on the map", + "@drawLineDesc": { + "description": "Description for line drawing mode" + }, + "drawRectangle": "Намалювати прямокутник", + "@drawRectangle": { + "description": "Map drawing mode: rectangle" + }, + "drawRectangleDesc": "Draw a rectangular area on the map", + "@drawRectangleDesc": { + "description": "Description for rectangle drawing mode" + }, + "measureDistance": "Виміряти відстань", + "@measureDistance": { + "description": "Map drawing mode: measure distance" + }, + "measureDistanceDesc": "Long press two points to measure", + "@measureDistanceDesc": { + "description": "Description for distance measurement mode" + }, + "clearMeasurement": "Очистити вимірювання", + "@clearMeasurement": { + "description": "Tooltip to clear measurement" + }, + "distanceLabel": "Distance: {distance}", + "@distanceLabel": { + "description": "Label showing measured distance", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + "longPressForSecondPoint": "Long press for second point", + "@longPressForSecondPoint": { + "description": "Instruction when first measurement point is set" + }, + "longPressToStartMeasurement": "Long press to set first point", + "@longPressToStartMeasurement": { + "description": "Instruction to start measurement" + }, + "longPressToStartNewMeasurement": "Long press to start new measurement", + "@longPressToStartNewMeasurement": { + "description": "Instruction to restart measurement after completion" + }, + "shareDrawings": "Поділитися рисунками", + "@shareDrawings": { + "description": "Action to share drawings to network" + }, + "clearAllDrawings": "Очистити всі рисунки", + "@clearAllDrawings": { + "description": "Action to clear all local drawings" + }, + "completeLine": "Complete Line", + "@completeLine": { + "description": "Tooltip to complete drawing a line" + }, + "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "@broadcastDrawingsToTeam": { + "description": "Subtitle showing how many drawings will be broadcast", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "removeAllDrawings": "Remove all {count} drawing{plural}", + "@removeAllDrawings": { + "description": "Subtitle for remove all drawings action", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "@deleteAllDrawingsConfirm": { + "description": "Confirmation dialog message for deleting all drawings", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "drawing": "Рисунок", + "@drawing": { + "description": "Generic drawing label" + }, + "shareDrawingsCount": "Share {count} Drawing{plural}", + "@shareDrawingsCount": { + "description": "Title for share drawings dialog", + "placeholders": { + "count": { + "type": "int" + }, + "plural": { + "type": "String" + } + } + }, + "showReceivedDrawings": "Показати отримані рисунки", + "@showReceivedDrawings": { + "description": "Toggle to show/hide received drawings from other team members" + }, + "showingAllDrawings": "Showing all drawings", + "@showingAllDrawings": { + "description": "Subtitle when received drawings are visible" + }, + "showingOnlyYourDrawings": "Showing only your drawings", + "@showingOnlyYourDrawings": { + "description": "Subtitle when received drawings are hidden" + }, + "showSarMarkers": "Показати маркери SAR", + "@showSarMarkers": { + "description": "Toggle to show/hide SAR markers on map" + }, + "showingSarMarkers": "Showing SAR markers", + "@showingSarMarkers": { + "description": "Subtitle when SAR markers are visible" + }, + "hidingSarMarkers": "Hiding SAR markers", + "@hidingSarMarkers": { + "description": "Subtitle when SAR markers are hidden" + }, + "clearAll": "Очистити все", + "@clearAll": { + "description": "Clear all button label" + }, + "publicChannel": "Публічний канал", + "@publicChannel": { + "description": "Public channel option for sharing" + }, + "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "@broadcastToAll": { + "description": "Description for public channel broadcast" + }, + "storedPermanently": "Stored permanently in room", + "@storedPermanently": { + "description": "Description for room storage permanence" + }, + "notConnectedToDevice": "Не підключено до пристрою", + "@notConnectedToDevice": { + "description": "Error message when device is not connected for direct messaging" + }, + "typeYourMessage": "Введіть повідомлення...", + "@typeYourMessage": { + "description": "Placeholder text for message input field" + }, + "quickLocationMarker": "Швидкий маркер місця", + "@quickLocationMarker": { + "description": "Subtitle for SAR marker sheet header" + }, + "markerType": "Тип маркера", + "@markerType": { + "description": "Label for marker type selection section" + }, + "sendTo": "Надіслати до", + "@sendTo": { + "description": "Label for destination selection section" + }, + "noDestinationsAvailable": "No destinations available.", + "@noDestinationsAvailable": { + "description": "Warning when no rooms or channels exist" + }, + "selectDestination": "Виберіть отримувача...", + "@selectDestination": { + "description": "Placeholder for destination dropdown" + }, + "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "@ephemeralBroadcastInfo": { + "description": "Information about ephemeral channel broadcasts" + }, + "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "@persistentRoomInfo": { + "description": "Information about persistent room storage" + }, + "location": "Місцезнаходження", + "@location": { + "description": "Label for location section" + }, + "fromMap": "From Map", + "@fromMap": { + "description": "Badge showing location is from map tap" + }, + "gettingLocation": "Отримання місцезнаходження...", + "@gettingLocation": { + "description": "Loading message while fetching GPS location" + }, + "locationError": "Помилка геолокації", + "@locationError": { + "description": "Title for location error messages" + }, + "retry": "Повторити", + "@retry": { + "description": "Retry button label" + }, + "refreshLocation": "Оновити місцезнаходження", + "@refreshLocation": { + "description": "Tooltip for refresh location button" + }, + "accuracyMeters": "Accuracy: ±{accuracy}m", + "@accuracyMeters": { + "description": "Display of GPS accuracy in meters", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "notesOptional": "Нотатки (необов’язково)", + "@notesOptional": { + "description": "Label for optional notes field" + }, + "addAdditionalInformation": "Add additional information...", + "@addAdditionalInformation": { + "description": "Placeholder for notes field" + }, + "lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?", + "@lowAccuracyWarning": { + "description": "Warning dialog content for low GPS accuracy", + "placeholders": { + "accuracy": { + "type": "int" + } + } + }, + "loginToRoom": "Увійти до кімнати", + "@loginToRoom": { + "description": "Title for room login dialog" + }, + "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "@enterPasswordInfo": { + "description": "Information about room password" + }, + "password": "Пароль", + "@password": { + "description": "Password field label" + }, + "enterRoomPassword": "Введіть пароль кімнати", + "@enterRoomPassword": { + "description": "Password field hint" + }, + "loggingInDots": "Вхід...", + "@loggingInDots": { + "description": "Button text while logging in" + }, + "login": "Увійти", + "@login": { + "description": "Login button label" + }, + "failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.", + "@failedToAddRoom": { + "description": "Error message when adding room fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "direct": "Напряму", + "@direct": { + "description": "Direct routing indicator" + }, + "flood": "Flood", + "@flood": { + "description": "Flood routing indicator" + }, + "loggedIn": "Увійшли", + "@loggedIn": { + "description": "Logged in status badge" + }, + "noGpsData": "Немає GPS-даних", + "@noGpsData": { + "description": "Message when GPS data is not available" + }, + "distance": "Відстань", + "@distance": { + "description": "Distance label" + }, + "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "@directPingTimeout": { + "description": "Warning when direct ping times out", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "pingFailed": "Ping failed to {name} - no response received", + "@pingFailed": { + "description": "Error message when ping fails", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.", + "@deleteContactConfirmation": { + "description": "Confirmation message for deleting contact", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "failedToRemoveContact": "Failed to remove contact: {error}", + "@failedToRemoveContact": { + "description": "Error message when contact removal fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "type": "Тип", + "@type": { + "description": "Contact type label" + }, + "publicKey": "Публічний ключ", + "@publicKey": { + "description": "Public key label" + }, + "lastSeen": "Востаннє бачили", + "@lastSeen": { + "description": "Last seen label" + }, + "roomStatus": "Стан кімнати", + "@roomStatus": { + "description": "Room status section header" + }, + "loginStatus": "Стан входу", + "@loginStatus": { + "description": "Login status label" + }, + "notLoggedIn": "Не увійшли", + "@notLoggedIn": { + "description": "Not logged in status" + }, + "adminAccess": "Admin Access", + "@adminAccess": { + "description": "Admin access label" + }, + "yes": "Так", + "@yes": { + "description": "Yes answer" + }, + "no": "Ні", + "@no": { + "description": "No answer" + }, + "permissions": "Дозволи", + "@permissions": { + "description": "Permissions label" + }, + "passwordSaved": "Password Saved", + "@passwordSaved": { + "description": "Password saved label" + }, + "locationColon": "Location:", + "@locationColon": { + "description": "Location section header" + }, + "telemetry": "Телеметрія", + "@telemetry": { + "description": "Telemetry section header" + }, + "voltage": "Напруга", + "@voltage": { + "description": "Voltage label" + }, + "battery": "Батарея", + "@battery": { + "description": "Battery label" + }, + "temperature": "Температура", + "@temperature": { + "description": "Temperature label" + }, + "humidity": "Вологість", + "@humidity": { + "description": "Humidity label" + }, + "pressure": "Тиск", + "@pressure": { + "description": "Pressure label" + }, + "gpsTelemetry": "GPS (Telemetry)", + "@gpsTelemetry": { + "description": "GPS from telemetry label" + }, + "updated": "Оновлено", + "@updated": { + "description": "Updated timestamp label" + }, + "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "@pathResetInfo": { + "description": "Info message after path reset", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "reLoginToRoom": "Re-Login to Room", + "@reLoginToRoom": { + "description": "Button to re-login to room" + }, + "heading": "Напрямок", + "@heading": { + "description": "Compass heading label" + }, + "elevation": "Висота", + "@elevation": { + "description": "Elevation/altitude label" + }, + "accuracy": "Точність", + "@accuracy": { + "description": "GPS accuracy label" + }, + "bearing": "Пеленг", + "@bearing": { + "description": "Bearing label in compass" + }, + "direction": "Напрямок", + "@direction": { + "description": "Direction label in compass" + }, + "filterMarkers": "Фільтрувати маркери", + "@filterMarkers": { + "description": "Title for filter markers dialog" + }, + "filterMarkersTooltip": "Filter markers", + "@filterMarkersTooltip": { + "description": "Tooltip for filter button" + }, + "contactsFilter": "Контакти", + "@contactsFilter": { + "description": "Filter option for contacts" + }, + "repeatersFilter": "Ретранслятори", + "@repeatersFilter": { + "description": "Filter option for repeaters" + }, + "sarMarkers": "Маркери SAR", + "@sarMarkers": { + "description": "SAR markers section header" + }, + "foundPerson": "Знайдена людина", + "@foundPerson": { + "description": "Found person SAR marker type" + }, + "fire": "Пожежа", + "@fire": { + "description": "Fire SAR marker type" + }, + "stagingArea": "Зона збору", + "@stagingArea": { + "description": "Staging area SAR marker type" + }, + "showAll": "Показати все", + "@showAll": { + "description": "Button to show all filters" + }, + "locationUnavailable": "Місцезнаходження недоступне", + "@locationUnavailable": { + "description": "Message when GPS location is unavailable" + }, + "ahead": "ahead", + "@ahead": { + "description": "Relative bearing direction - ahead" + }, + "degreesRight": "{degrees}° right", + "@degreesRight": { + "description": "Relative bearing direction - right", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "degreesLeft": "{degrees}° left", + "@degreesLeft": { + "description": "Relative bearing direction - left", + "placeholders": { + "degrees": { + "type": "int" + } + } + }, + "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "@latLonFormat": { + "description": "Latitude and longitude display format", + "placeholders": { + "latitude": { + "type": "String" + }, + "longitude": { + "type": "String" + } + } + }, + "noContactsYet": "Контактів ще немає", + "@noContactsYet": { + "description": "Empty state message when there are no contacts" + }, + "connectToDeviceToLoadContacts": "Connect to a device to load contacts", + "@connectToDeviceToLoadContacts": { + "description": "Instruction to connect device to load contacts" + }, + "teamMembers": "Члени команди", + "@teamMembers": { + "description": "Section header for team members (chat contacts)" + }, + "repeaters": "Ретранслятори", + "@repeaters": { + "description": "Section header for repeater nodes" + }, + "rooms": "Кімнати", + "@rooms": { + "description": "Section header for rooms" + }, + "channels": "Канали", + "@channels": { + "description": "Section header for broadcast channels" + }, + "selectMapLayer": "Вибрати шар мапи", + "@selectMapLayer": { + "description": "Title for map layer selection dialog" + }, + "openStreetMap": "OpenStreetMap", + "@openStreetMap": { + "description": "OpenStreetMap layer name" + }, + "openTopoMap": "OpenTopoMap", + "@openTopoMap": { + "description": "OpenTopoMap layer name" + }, + "esriSatellite": "ESRI Супутник", + "@esriSatellite": { + "description": "ESRI Satellite imagery layer name" + }, + "googleHybrid": "Google Гібрид", + "@googleHybrid": { + "description": "Google Hybrid layer name (satellite + labels)" + }, + "googleRoadmap": "Google Дорожня карта", + "@googleRoadmap": { + "description": "Google Roadmap layer name (street map)" + }, + "googleTerrain": "Google Рельєф", + "@googleTerrain": { + "description": "Google Terrain layer name (topographic)" + }, + "dragToPosition": "Drag to Position", + "@dragToPosition": { + "description": "Label when dragging a pin on map" + }, + "createSarMarker": "Створити маркер SAR", + "@createSarMarker": { + "description": "Label for creating SAR marker from pin" + }, + "compass": "Компас", + "@compass": { + "description": "Compass title in detailed compass dialog" + }, + "navigationAndContacts": "Navigation & Contacts", + "@navigationAndContacts": { + "description": "Subtitle for compass dialog" + }, + "sarAlert": "ТРИВОГА SAR", + "@sarAlert": { + "description": "Label for SAR alert badge on messages" + }, + "textCopiedToClipboard": "Text copied to clipboard", + "@textCopiedToClipboard": { + "description": "Success message when text is copied" + }, + "cannotReplySenderMissing": "Cannot reply: sender information missing", + "@cannotReplySenderMissing": { + "description": "Error when sender info is missing for reply" + }, + "cannotReplyContactNotFound": "Cannot reply: contact not found", + "@cannotReplyContactNotFound": { + "description": "Error when contact not found for reply" + }, + "copyText": "Копіювати текст", + "@copyText": { + "description": "Option to copy message text to clipboard" + }, + "saveAsTemplate": "Save as Template", + "@saveAsTemplate": { + "description": "Option to save SAR message as a reusable template" + }, + "templateSaved": "Template saved successfully", + "@templateSaved": { + "description": "Success message when SAR template is saved" + }, + "templateAlreadyExists": "Template with this emoji already exists", + "@templateAlreadyExists": { + "description": "Error message when trying to save duplicate template" + }, + "deleteMessage": "Видалити повідомлення", + "@deleteMessage": { + "description": "Dialog title for deleting a message" + }, + "deleteMessageConfirmation": "Are you sure you want to delete this message?", + "@deleteMessageConfirmation": { + "description": "Confirmation text for message deletion" + }, + "shareLocation": "Поділитися місцезнаходженням", + "@shareLocation": { + "description": "Option to share SAR marker location" + }, + "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "@shareLocationText": { + "description": "Formatted text for sharing SAR marker location", + "placeholders": { + "markerInfo": { + "type": "String" + }, + "lat": { + "type": "String" + }, + "lon": { + "type": "String" + }, + "url": { + "type": "String" + } + } + }, + "sarLocationShare": "SAR Location", + "@sarLocationShare": { + "description": "Subject line when sharing SAR marker location" + }, + "justNow": "Щойно", + "@justNow": { + "description": "Time indicator for very recent activity" + }, + "minutesAgo": "{minutes} хв тому", + "@minutesAgo": { + "description": "Time indicator for minutes ago", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "hoursAgo": "{hours} год тому", + "@hoursAgo": { + "description": "Time indicator for hours ago", + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "daysAgo": "{days} дн тому", + "@daysAgo": { + "description": "Time indicator for days ago", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "secondsAgo": "{seconds} с тому", + "@secondsAgo": { + "description": "Time indicator for seconds ago", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sending": "Надсилання...", + "@sending": { + "description": "Delivery status: sending" + }, + "sent": "Надіслано", + "@sent": { + "description": "Delivery status: sent" + }, + "delivered": "Доставлено", + "@delivered": { + "description": "Delivery status: delivered" + }, + "deliveredWithTime": "Delivered ({time}ms)", + "@deliveredWithTime": { + "description": "Delivery status with round-trip time", + "placeholders": { + "time": { + "type": "int" + } + } + }, + "failed": "Помилка", + "@failed": { + "description": "Delivery status: failed" + }, + "broadcast": "Трансляція", + "@broadcast": { + "description": "Delivery status for channel messages (no echoes yet)" + }, + "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "@deliveredToContacts": { + "description": "Grouped message delivery count", + "placeholders": { + "delivered": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "allDelivered": "All delivered", + "@allDelivered": { + "description": "Status when all recipients received the message" + }, + "recipientDetails": "Recipient Details", + "@recipientDetails": { + "description": "Header for expandable recipient list" + }, + "pending": "Очікує", + "@pending": { + "description": "Delivery status: pending/waiting" + }, + "sarMarkerFoundPerson": "Found Person", + "@sarMarkerFoundPerson": { + "description": "SAR marker type: found person" + }, + "sarMarkerFire": "Fire Location", + "@sarMarkerFire": { + "description": "SAR marker type: fire" + }, + "sarMarkerStagingArea": "Staging Area", + "@sarMarkerStagingArea": { + "description": "SAR marker type: staging area" + }, + "sarMarkerObject": "Object Found", + "@sarMarkerObject": { + "description": "SAR marker type: object" + }, + "from": "Від", + "@from": { + "description": "Sender label in notifications" + }, + "coordinates": "Координати", + "@coordinates": { + "description": "Coordinates label" + }, + "tapToViewOnMap": "Торкніться, щоб переглянути на мапі", + "@tapToViewOnMap": { + "description": "Notification action text" + }, + "radioSettings": "Налаштування радіо", + "@radioSettings": { + "description": "Section title for radio settings" + }, + "frequencyMHz": "Частота (MHz)", + "@frequencyMHz": { + "description": "Label for radio frequency field" + }, + "frequencyExample": "e.g., 869.618", + "@frequencyExample": { + "description": "Helper text example for frequency" + }, + "bandwidth": "Ширина смуги", + "@bandwidth": { + "description": "Label for bandwidth dropdown" + }, + "spreadingFactor": "Коефіцієнт розширення", + "@spreadingFactor": { + "description": "Label for spreading factor dropdown" + }, + "codingRate": "Швидкість кодування", + "@codingRate": { + "description": "Label for coding rate dropdown" + }, + "txPowerDbm": "Потужність TX (dBm)", + "@txPowerDbm": { + "description": "Label for TX power field" + }, + "maxPowerDbm": "Макс: {power} dBm", + "@maxPowerDbm": { + "description": "Helper text showing maximum TX power", + "placeholders": { + "power": { + "type": "int" + } + } + }, + "you": "Ви", + "@you": { + "description": "Label for the current user in message bubbles" + }, + "exportFailed": "Помилка експорту: {error}", + "@exportFailed": { + "description": "Error message when export fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "importFailed": "Помилка імпорту: {error}", + "@importFailed": { + "description": "Error message when import fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "unknown": "Невідомо", + "@unknown": { + "description": "Unknown value label" + }, + "onlineLayers": "Онлайн-шари", + "@onlineLayers": { + "description": "Section header for online map layers" + }, + "locationTrail": "Слід місцезнаходження", + "@locationTrail": { + "description": "Location trail title" + }, + "showTrailOnMap": "Показати слід на мапі", + "@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" + }, + "duration": "Тривалість", + "@duration": { + "description": "Duration label" + }, + "points": "Точки", + "@points": { + "description": "Trail points count label" + }, + "clearTrail": "Очистити слід", + "@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": "Слід ще не записано", + "@noTrailRecorded": { + "description": "Message when no trail exists" + }, + "startTrackingToRecord": "Start location tracking to record your trail", + "@startTrackingToRecord": { + "description": "Instructions to start trail recording" + }, + "trailControls": "Керування слідом", + "@trailControls": { + "description": "Trail controls tooltip" + }, + "contactTrails": "Сліди контактів", + "@contactTrails": { + "description": "Contact trails section header" + }, + "showAllContactTrails": "Show All Contact Trails", + "@showAllContactTrails": { + "description": "Toggle label to show all contact trails" + }, + "noContactsWithLocationHistory": "No contacts with location history", + "@noContactsWithLocationHistory": { + "description": "Subtitle when no contacts have trails" + }, + "showingTrailsForContacts": "Showing trails for {count} contacts", + "@showingTrailsForContacts": { + "description": "Subtitle showing number of contacts with trails", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "individualContactTrails": "Individual Contact Trails", + "@individualContactTrails": { + "description": "Expansion tile title for individual contact trails" + }, + "deviceInformation": "Інформація про пристрій", + "@deviceInformation": { + "description": "Device information section header" + }, + "bleName": "Назва BLE", + "@bleName": { + "description": "Bluetooth Low Energy device name label" + }, + "meshName": "Назва mesh", + "@meshName": { + "description": "Mesh network name label" + }, + "notSet": "Не задано", + "@notSet": { + "description": "Label when a value is not set" + }, + "model": "Модель", + "@model": { + "description": "Device model label" + }, + "version": "Версія", + "@version": { + "description": "Version label" + }, + "buildDate": "Дата збірки", + "@buildDate": { + "description": "Firmware build date label" + }, + "firmware": "Прошивка", + "@firmware": { + "description": "Firmware label" + }, + "maxContacts": "Макс. контактів", + "@maxContacts": { + "description": "Maximum contacts capacity label" + }, + "maxChannels": "Макс. каналів", + "@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": { + "description": "Latitude field label (short form)" + }, + "lon": "Довг.", + "@lon": { + "description": "Longitude field label (short form)" + }, + "useCurrentLocation": "Використати поточне місцезнаходження", + "@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": { + "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" + } + } + }, + "sarTemplates": "Шаблони SAR", + "@sarTemplates": { + "description": "SAR templates menu title" + }, + "manageSarTemplates": "Manage cursor on target templates", + "@manageSarTemplates": { + "description": "Subtitle for SAR templates settings" + }, + "addTemplate": "Додати шаблон", + "@addTemplate": { + "description": "Button to add new SAR template" + }, + "editTemplate": "Редагувати шаблон", + "@editTemplate": { + "description": "Dialog title for editing template" + }, + "deleteTemplate": "Видалити шаблон", + "@deleteTemplate": { + "description": "Action to delete template" + }, + "templateName": "Назва шаблону", + "@templateName": { + "description": "Label for template name field" + }, + "templateNameHint": "напр. Знайдена людина", + "@templateNameHint": { + "description": "Hint text for template name" + }, + "templateEmoji": "Emoji", + "@templateEmoji": { + "description": "Label for template emoji field" + }, + "emojiRequired": "Emoji обов’язковий", + "@emojiRequired": { + "description": "Validation error when emoji field is empty" + }, + "nameRequired": "Назва обов’язкова", + "@nameRequired": { + "description": "Validation error when name field is empty" + }, + "templateDescription": "Опис (необов’язково)", + "@templateDescription": { + "description": "Label for template description field" + }, + "templateDescriptionHint": "Додайте додатковий контекст...", + "@templateDescriptionHint": { + "description": "Hint text for template description" + }, + "templateColor": "Колір", + "@templateColor": { + "description": "Label for template color picker" + }, + "previewFormat": "Попередній перегляд (формат повідомлення SAR)", + "@previewFormat": { + "description": "Label for format preview" + }, + "importFromClipboard": "Імпорт", + "@importFromClipboard": { + "description": "Button to import templates from clipboard" + }, + "exportToClipboard": "Експорт", + "@exportToClipboard": { + "description": "Button to export templates to clipboard" + }, + "deleteTemplateConfirmation": "Delete template '{name}'?", + "@deleteTemplateConfirmation": { + "description": "Confirmation message for template deletion", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "templateAdded": "Шаблон додано", + "@templateAdded": { + "description": "Success message when template is added" + }, + "templateUpdated": "Шаблон оновлено", + "@templateUpdated": { + "description": "Success message when template is updated" + }, + "templateDeleted": "Шаблон видалено", + "@templateDeleted": { + "description": "Success message when template is deleted" + }, + "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "@templatesImported": { + "description": "Success message after importing templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "@templatesExported": { + "description": "Success message after exporting templates", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "resetToDefaults": "Скинути до стандартних", + "@resetToDefaults": { + "description": "Action to reset templates to defaults" + }, + "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "@resetToDefaultsConfirmation": { + "description": "Confirmation message for reset to defaults" + }, + "reset": "Скинути", + "@reset": { + "description": "Reset button label" + }, + "resetComplete": "Templates reset to defaults", + "@resetComplete": { + "description": "Success message after reset" + }, + "noTemplates": "Немає доступних шаблонів", + "@noTemplates": { + "description": "Message when no templates exist" + }, + "tapAddToCreate": "Торкніться +, щоб створити перший шаблон", + "@tapAddToCreate": { + "description": "Helper text when no templates exist" + }, + "ok": "OK", + "@ok": { + "description": "OK button label" + }, + "permissionsSection": "Дозволи", + "@permissionsSection": { + "description": "Permissions section header" + }, + "locationPermission": "Дозвіл на геолокацію", + "@locationPermission": { + "description": "Location permission label" + }, + "checking": "Перевірка...", + "@checking": { + "description": "Loading state indicator" + }, + "locationPermissionGrantedAlways": "Granted (Always)", + "@locationPermissionGrantedAlways": { + "description": "Location permission status: granted always" + }, + "locationPermissionGrantedWhileInUse": "Granted (While In Use)", + "@locationPermissionGrantedWhileInUse": { + "description": "Location permission status: granted while in use" + }, + "locationPermissionDeniedTapToRequest": "Denied - Tap to request", + "@locationPermissionDeniedTapToRequest": { + "description": "Location permission status: denied, user can request" + }, + "locationPermissionPermanentlyDeniedOpenSettings": "Permanently Denied - Open Settings", + "@locationPermissionPermanentlyDeniedOpenSettings": { + "description": "Location permission status: permanently denied" + }, + "locationPermissionDialogContent": "Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.", + "@locationPermissionDialogContent": { + "description": "Content for location permission dialog when permanently denied" + }, + "openSettings": "Відкрити налаштування", + "@openSettings": { + "description": "Button to open device settings" + }, + "locationPermissionGranted": "Дозвіл на геолокацію надано!", + "@locationPermissionGranted": { + "description": "Success message when location permission is granted" + }, + "locationPermissionRequiredForGps": "Location permission is required for GPS tracking and location sharing.", + "@locationPermissionRequiredForGps": { + "description": "Info message about location permission requirement" + }, + "locationPermissionAlreadyGranted": "Location permission is already granted.", + "@locationPermissionAlreadyGranted": { + "description": "Info message when permission is already granted" + }, + "sarNavyBlue": "SAR Navy Blue", + "@sarNavyBlue": { + "description": "SAR Navy Blue theme name" + }, + "sarNavyBlueDescription": "Professional/Operations Mode", + "@sarNavyBlueDescription": { + "description": "Description for SAR Navy Blue theme" + }, + "selectRecipient": "Вибрати отримувача", + "@selectRecipient": { + "description": "Title for recipient selector sheet" + }, + "broadcastToAllNearby": "Broadcast to all nearby", + "@broadcastToAllNearby": { + "description": "Subtitle for public channel option" + }, + "searchRecipients": "Пошук отримувачів...", + "@searchRecipients": { + "description": "Placeholder text for recipient search field" + }, + "noContactsFound": "Контактів не знайдено", + "@noContactsFound": { + "description": "Message when no contacts match search" + }, + "noRoomsFound": "Кімнат не знайдено", + "@noRoomsFound": { + "description": "Message when no rooms match search" + }, + "noRecipientsAvailable": "Немає доступних отримувачів", + "@noRecipientsAvailable": { + "description": "Message when no recipients exist (contacts, rooms, or channels)" + }, + "noChannelsFound": "Каналів не знайдено", + "@noChannelsFound": { + "description": "Message when no channels match the search" + }, + "newMessage": "Нове повідомлення", + "@newMessage": { + "description": "Notification title for new message" + }, + "channel": "Канал", + "@channel": { + "description": "Channel label in notifications" + }, + "samplePoliceLead": "Police Lead", + "@samplePoliceLead": { + "description": "Sample team member name" + }, + "sampleDroneOperator": "Drone Operator", + "@sampleDroneOperator": { + "description": "Sample team member name" + }, + "sampleFirefighterAlpha": "Firefighter", + "@sampleFirefighterAlpha": { + "description": "Sample team member name" + }, + "sampleMedicCharlie": "Medic", + "@sampleMedicCharlie": { + "description": "Sample team member name" + }, + "sampleCommandDelta": "Command", + "@sampleCommandDelta": { + "description": "Sample team member name" + }, + "sampleFireEngine": "Fire Engine", + "@sampleFireEngine": { + "description": "Sample team member name" + }, + "sampleAirSupport": "Air Support", + "@sampleAirSupport": { + "description": "Sample team member name" + }, + "sampleBaseCoordinator": "Base Coordinator", + "@sampleBaseCoordinator": { + "description": "Sample team member name" + }, + "channelEmergency": "Надзвичайна ситуація", + "@channelEmergency": { + "description": "Emergency channel name" + }, + "channelCoordination": "Координація", + "@channelCoordination": { + "description": "Coordination channel name" + }, + "channelUpdates": "Оновлення", + "@channelUpdates": { + "description": "Updates channel name" + }, + "sampleTeamMember": "Sample Team Member", + "@sampleTeamMember": { + "description": "Sample sender name" + }, + "sampleScout": "Sample Scout", + "@sampleScout": { + "description": "Sample sender name" + }, + "sampleBase": "Sample Base", + "@sampleBase": { + "description": "Sample sender name" + }, + "sampleSearcher": "Sample Searcher", + "@sampleSearcher": { + "description": "Sample sender name" + }, + "sampleObjectBackpack": " Backpack found - blue color", + "@sampleObjectBackpack": { + "description": "Sample object note" + }, + "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "@sampleObjectVehicle": { + "description": "Sample object note" + }, + "sampleObjectCamping": " Camping equipment discovered", + "@sampleObjectCamping": { + "description": "Sample object note" + }, + "sampleObjectTrailMarker": " Trail marker found off-path", + "@sampleObjectTrailMarker": { + "description": "Sample object note" + }, + "sampleMsgAllTeamsCheckIn": "All teams check in", + "@sampleMsgAllTeamsCheckIn": { + "description": "Sample channel message" + }, + "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "@sampleMsgWeatherUpdate": { + "description": "Sample channel message" + }, + "sampleMsgBaseCamp": "Base camp established at staging area", + "@sampleMsgBaseCamp": { + "description": "Sample channel message" + }, + "sampleMsgTeamAlpha": "Team moving to sector 2", + "@sampleMsgTeamAlpha": { + "description": "Sample channel message" + }, + "sampleMsgRadioCheck": "Radio check - all stations respond", + "@sampleMsgRadioCheck": { + "description": "Sample channel message" + }, + "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "@sampleMsgWaterSupply": { + "description": "Sample channel message" + }, + "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "@sampleMsgTeamBravo": { + "description": "Sample channel message" + }, + "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "@sampleMsgEtaRallyPoint": { + "description": "Sample channel message" + }, + "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "@sampleMsgSupplyDrop": { + "description": "Sample channel message" + }, + "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "@sampleMsgDroneSurvey": { + "description": "Sample channel message" + }, + "sampleMsgTeamCharlie": "Team requesting backup", + "@sampleMsgTeamCharlie": { + "description": "Sample channel message" + }, + "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "@sampleMsgRadioDiscipline": { + "description": "Sample channel message" + }, + "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "@sampleMsgUrgentMedical": { + "description": "Sample emergency message" + }, + "sampleMsgAdultMale": " Adult male, conscious", + "@sampleMsgAdultMale": { + "description": "Sample emergency message note" + }, + "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "@sampleMsgFireSpotted": { + "description": "Sample emergency message" + }, + "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "@sampleMsgSpreadingRapidly": { + "description": "Sample emergency message note" + }, + "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "@sampleMsgPriorityHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "@sampleMsgMedicalTeamEnRoute": { + "description": "Sample emergency message" + }, + "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "@sampleMsgEvacHelicopter": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "@sampleMsgEmergencyResolved": { + "description": "Sample emergency message" + }, + "sampleMsgEmergencyStagingArea": " Emergency staging area", + "@sampleMsgEmergencyStagingArea": { + "description": "Sample emergency message note" + }, + "sampleMsgEmergencyServices": "Emergency services notified and responding", + "@sampleMsgEmergencyServices": { + "description": "Sample emergency message" + }, + "sampleAlphaTeamLead": "Team Lead", + "@sampleAlphaTeamLead": { + "description": "Sample team name" + }, + "sampleBravoScout": "Scout", + "@sampleBravoScout": { + "description": "Sample team name" + }, + "sampleCharlieMedic": "Medic", + "@sampleCharlieMedic": { + "description": "Sample team name" + }, + "sampleDeltaNavigator": "Navigator", + "@sampleDeltaNavigator": { + "description": "Sample team name" + }, + "sampleEchoSupport": "Support", + "@sampleEchoSupport": { + "description": "Sample team name" + }, + "sampleBaseCommand": "Base Command", + "@sampleBaseCommand": { + "description": "Sample team name" + }, + "sampleFieldCoordinator": "Field Coordinator", + "@sampleFieldCoordinator": { + "description": "Sample team name" + }, + "sampleMedicalTeam": "Medical Team", + "@sampleMedicalTeam": { + "description": "Sample team name" + }, + "mapDrawing": "Рисунок на мапі", + "@mapDrawing": { + "description": "Label for map drawing messages" + }, + "navigateToDrawing": "Navigate to Drawing", + "@navigateToDrawing": { + "description": "Option to navigate to drawing on map" + }, + "copyCoordinates": "Копіювати координати", + "@copyCoordinates": { + "description": "Option to copy coordinates to clipboard" + }, + "hideFromMap": "Приховати з мапи", + "@hideFromMap": { + "description": "Option to hide drawing from map" + }, + "lineDrawing": "Лінійний рисунок", + "@lineDrawing": { + "description": "Label for line type drawings" + }, + "rectangleDrawing": "Рисунок прямокутника", + "@rectangleDrawing": { + "description": "Label for rectangle type drawings" + }, + "manualCoordinates": "Ручні координати", + "@manualCoordinates": { + "description": "Label for manual coordinate input toggle" + }, + "enterCoordinatesManually": "Введіть координати вручну", + "@enterCoordinatesManually": { + "description": "Description for manual coordinate input option" + }, + "latitudeLabel": "Широта", + "@latitudeLabel": { + "description": "Label for latitude input field" + }, + "longitudeLabel": "Довгота", + "@longitudeLabel": { + "description": "Label for longitude input field" + }, + "exampleCoordinates": "Example: 46.0569, 14.5058", + "@exampleCoordinates": { + "description": "Example coordinate format hint" + }, + "shareDrawing": "Поділитися рисунком", + "@shareDrawing": { + "description": "Title for share single drawing dialog" + }, + "shareWithAllNearbyDevices": "Share with all nearby devices", + "@shareWithAllNearbyDevices": { + "description": "Subtitle for public channel sharing option" + }, + "shareToRoom": "Share to Room", + "@shareToRoom": { + "description": "Header for room sharing section" + }, + "sendToPersistentStorage": "Send to persistent room storage", + "@sendToPersistentStorage": { + "description": "Subtitle for room sharing option" + }, + "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "@deleteDrawingConfirm": { + "description": "Confirmation message for deleting a single drawing" + }, + "drawingDeleted": "Drawing deleted", + "@drawingDeleted": { + "description": "Success message after deleting a drawing" + }, + "yourDrawingsCount": "Your Drawings ({count})", + "@yourDrawingsCount": { + "description": "Header showing count of user's drawings", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shared": "Shared", + "@shared": { + "description": "Status label for shared drawings" + }, + "line": "Лінія", + "@line": { + "description": "Line drawing type label" + }, + "rectangle": "Прямокутник", + "@rectangle": { + "description": "Rectangle drawing type label" + }, + "updateAvailable": "Доступне оновлення", + "@updateAvailable": { + "description": "Title for update dialog when new version is available" + }, + "currentVersion": "Поточна", + "@currentVersion": { + "description": "Label for current app version" + }, + "latestVersion": "Остання", + "@latestVersion": { + "description": "Label for latest available app version" + }, + "downloadUpdate": "Завантажити", + "@downloadUpdate": { + "description": "Button to download app update" + }, + "updateLater": "Пізніше", + "@updateLater": { + "description": "Button to dismiss update dialog" + }, + "cadastralParcels": "Cadastral Parcels", + "@cadastralParcels": { + "description": "Label for cadastral parcels WMS overlay layer" + }, + "forestRoads": "Forest Roads", + "@forestRoads": { + "description": "Label for forest roads WMS overlay layer" + }, + "wmsOverlays": "WMS Overlays", + "@wmsOverlays": { + "description": "Section header for WMS overlay layers in layer selector" + }, + "hikingTrails": "Hiking Trails", + "@hikingTrails": { + "description": "Label for hiking/mountain trails WMS overlay layer" + }, + "mainRoads": "Main Roads", + "@mainRoads": { + "description": "Label for main roads WMS overlay layer" + }, + "houseNumbers": "House Numbers", + "@houseNumbers": { + "description": "Label for house numbers WMS overlay layer" + }, + "fireHazardZones": "Fire Hazard Zones", + "@fireHazardZones": { + "description": "Label for fire hazard risk zones WMS overlay layer" + }, + "historicalFires": "Historical Fires", + "@historicalFires": { + "description": "Label for historical forest fires WMS overlay layer" + }, + "firebreaks": "Firebreaks", + "@firebreaks": { + "description": "Label for firebreaks WMS overlay layer" + }, + "krasFireZones": "Kras Fire Zones", + "@krasFireZones": { + "description": "Label for Kras fire zones WMS overlay layer" + }, + "placeNames": "Place Names", + "@placeNames": { + "description": "Label for geographic place names WMS overlay layer" + }, + "municipalityBorders": "Municipality Borders", + "@municipalityBorders": { + "description": "Label for municipality borders WMS overlay layer" + }, + "topographicMap": "Topographic Map 1:25000", + "@topographicMap": { + "description": "Label for DTK25 topographic base map layer" + }, + "recentMessages": "Останні повідомлення", + "@recentMessages": { + "description": "Header for recent messages overlay on map in fullscreen mode" + }, + "addChannel": "Додати канал", + "@addChannel": { + "description": "Button to add a new channel" + }, + "channelName": "Назва каналу", + "@channelName": { + "description": "Label for channel name field" + }, + "channelNameHint": "напр. Рятувальна команда Альфа", + "@channelNameHint": { + "description": "Hint for channel name field" + }, + "channelSecret": "Секрет каналу", + "@channelSecret": { + "description": "Label for channel secret field" + }, + "channelSecretHint": "Спільний пароль для цього каналу", + "@channelSecretHint": { + "description": "Hint for channel secret field" + }, + "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "@channelSecretHelp": { + "description": "Help text explaining channel secret" + }, + "channelTypesInfo": "Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.", + "@channelTypesInfo": { + "description": "Information banner explaining hash and private channel types" + }, + "hashChannelInfo": "Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.", + "@hashChannelInfo": { + "description": "Help text for hash channels (# prefix)" + }, + "channelNameRequired": "Channel name is required", + "@channelNameRequired": { + "description": "Validation error for empty channel name" + }, + "channelNameTooLong": "Channel name must be 31 characters or less", + "@channelNameTooLong": { + "description": "Validation error for channel name too long" + }, + "channelSecretRequired": "Channel secret is required", + "@channelSecretRequired": { + "description": "Validation error for empty channel secret" + }, + "channelSecretTooLong": "Channel secret must be 32 characters or less", + "@channelSecretTooLong": { + "description": "Validation error for channel secret too long" + }, + "invalidAsciiCharacters": "Only ASCII characters are allowed", + "@invalidAsciiCharacters": { + "description": "Validation error for non-ASCII characters" + }, + "channelCreatedSuccessfully": "Channel created successfully", + "@channelCreatedSuccessfully": { + "description": "Success message after creating channel" + }, + "channelCreationFailed": "Failed to create channel: {error}", + "@channelCreationFailed": { + "description": "Error message when channel creation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "deleteChannel": "Delete Channel", + "@deleteChannel": { + "description": "Delete channel button/menu item" + }, + "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "@deleteChannelConfirmation": { + "description": "Confirmation dialog when deleting a channel", + "placeholders": { + "channelName": { + "type": "String" + } + } + }, + "channelDeletedSuccessfully": "Channel deleted successfully", + "@channelDeletedSuccessfully": { + "description": "Success message after deleting channel" + }, + "channelDeletionFailed": "Failed to delete channel: {error}", + "@channelDeletionFailed": { + "description": "Error message when channel deletion fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createChannel": "Створити канал", + "@createChannel": { + "description": "Button text for creating a channel" + }, + "wizardBack": "Назад", + "@wizardBack": { + "description": "Wizard back button text" + }, + "wizardSkip": "Пропустити", + "@wizardSkip": { + "description": "Wizard skip button text" + }, + "wizardNext": "Далі", + "@wizardNext": { + "description": "Wizard next button text" + }, + "wizardGetStarted": "Почати", + "@wizardGetStarted": { + "description": "Wizard final button text to complete onboarding" + }, + "wizardWelcomeTitle": "Ласкаво просимо до MeshCore SAR", + "@wizardWelcomeTitle": { + "description": "Welcome wizard first page title" + }, + "wizardWelcomeDescription": "A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.", + "@wizardWelcomeDescription": { + "description": "Welcome wizard first page description" + }, + "wizardConnectingTitle": "Підключення до радіо", + "@wizardConnectingTitle": { + "description": "Wizard connecting page title" + }, + "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "@wizardConnectingDescription": { + "description": "Wizard connecting page description" + }, + "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "@wizardConnectingFeature1": { + "description": "Wizard connecting feature 1" + }, + "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "@wizardConnectingFeature2": { + "description": "Wizard connecting feature 2" + }, + "wizardConnectingFeature3": "Works completely offline - no internet required", + "@wizardConnectingFeature3": { + "description": "Wizard connecting feature 3" + }, + "wizardChannelTitle": "Канали", + "@wizardChannelTitle": { + "description": "Wizard channel page title" + }, + "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "@wizardChannelDescription": { + "description": "Wizard channel page description" + }, + "wizardChannelFeature1": "Public Channel for general team communication", + "@wizardChannelFeature1": { + "description": "Wizard channel feature 1" + }, + "wizardChannelFeature2": "Create custom channels for specific groups", + "@wizardChannelFeature2": { + "description": "Wizard channel feature 2" + }, + "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "@wizardChannelFeature3": { + "description": "Wizard channel feature 3" + }, + "wizardContactsTitle": "Контакти", + "@wizardContactsTitle": { + "description": "Wizard contacts page title" + }, + "wizardContactsDescription": "Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.", + "@wizardContactsDescription": { + "description": "Wizard contacts page description" + }, + "wizardContactsFeature1": "Contacts discovered automatically", + "@wizardContactsFeature1": { + "description": "Wizard contacts feature 1" + }, + "wizardContactsFeature2": "Send private direct messages", + "@wizardContactsFeature2": { + "description": "Wizard contacts feature 2" + }, + "wizardContactsFeature3": "View battery level and last seen time", + "@wizardContactsFeature3": { + "description": "Wizard contacts feature 3" + }, + "wizardMapTitle": "Мапа та місцезнаходження", + "@wizardMapTitle": { + "description": "Wizard map page title" + }, + "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "@wizardMapDescription": { + "description": "Wizard map page description" + }, + "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "@wizardMapFeature1": { + "description": "Wizard map feature 1" + }, + "wizardMapFeature2": "Real-time GPS tracking of team members", + "@wizardMapFeature2": { + "description": "Wizard map feature 2" + }, + "wizardMapFeature3": "Download offline maps for remote areas", + "@wizardMapFeature3": { + "description": "Wizard map feature 3" + }, + "wizardMapFeature4": "Draw shapes and share tactical information", + "@wizardMapFeature4": { + "description": "Wizard map feature 4" + }, + "viewWelcomeTutorial": "Переглянути вступний посібник", + "@viewWelcomeTutorial": { + "description": "Settings option to re-show welcome wizard" + }, + "allTeamContacts": "Усі контакти команди", + "@allTeamContacts": { + "description": "Destination option to send SAR marker to all team contacts" + }, + "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "@directMessagesInfo": { + "description": "Information about sending to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "@sarMarkerSentToContacts": { + "description": "Success message after sending SAR marker to all contacts", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noContactsAvailable": "Немає доступних контактів команди", + "@noContactsAvailable": { + "description": "Message when there are no chat contacts to send to" + }, + "reply": "Відповісти", + "@reply": {}, + "technicalDetails": "Технічні деталі", + "@technicalDetails": {}, + "messageTechnicalDetails": "Message technical details", + "@messageTechnicalDetails": {}, + "linkQuality": "Link quality", + "@linkQuality": {}, + "delivery": "Delivery", + "@delivery": {}, + "status": "Статус", + "@status": {}, + "expectedAckTag": "Expected ACK tag", + "@expectedAckTag": {}, + "roundTrip": "Round-trip", + "@roundTrip": {}, + "retryAttempt": "Retry attempt", + "@retryAttempt": {}, + "floodFallback": "Flood fallback", + "@floodFallback": {}, + "identity": "Identity", + "@identity": {}, + "messageId": "Message ID", + "@messageId": {}, + "sender": "Sender", + "@sender": {}, + "senderKey": "Sender key", + "@senderKey": {}, + "recipient": "Recipient", + "@recipient": {}, + "recipientKey": "Recipient key", + "@recipientKey": {}, + "voice": "Голос", + "@voice": {}, + "voiceId": "Voice ID", + "@voiceId": {}, + "envelope": "Envelope", + "@envelope": {}, + "sessionProgress": "Session progress", + "@sessionProgress": {}, + "complete": "Завершено", + "@complete": {}, + "rawDump": "Raw dump", + "@rawDump": {}, + "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "@cannotRetryMissingRecipient": {}, + "voiceUnavailable": "Голос зараз недоступний", + "@voiceUnavailable": {}, + "requestingVoice": "Requesting voice", + "@requestingVoice": {} +} diff --git a/lib/services/locale_preferences.dart b/lib/services/locale_preferences.dart index 273ac0e..aff4312 100644 --- a/lib/services/locale_preferences.dart +++ b/lib/services/locale_preferences.dart @@ -15,6 +15,10 @@ class LocalePreferences { Locale('fr'), // French Locale('it'), // Italian Locale('el'), // Greek + Locale('pt'), // Portuguese + Locale('tr'), // Turkish + Locale('pl'), // Polish + Locale('uk'), // Ukrainian Locale('ru'), // Russian Locale('zh'), // Chinese ]; @@ -66,6 +70,14 @@ class LocalePreferences { return 'Italiano'; case 'el': return 'Greek'; + case 'pt': + return 'Portuguese'; + case 'tr': + return 'Turkish'; + case 'pl': + return 'Polish'; + case 'uk': + return 'Ukrainian'; case 'ru': return 'Русский'; case 'zh': @@ -94,6 +106,14 @@ class LocalePreferences { return 'Italiano'; case 'el': return 'Ελληνικά'; + case 'pt': + return 'Português'; + case 'tr': + return 'Türkçe'; + case 'pl': + return 'Polski'; + case 'uk': + return 'Українська'; case 'ru': return 'Русский'; case 'zh':