diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 2ce1169..92d9f73 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -46,11 +46,11 @@ class AppLocalizationsPl extends AppLocalizations { @override String get locationPermissionPermanentlyDenied => - 'Location permission permanently denied. Please enable in Settings.'; + 'Dostęp do lokalizacji został trwale zablokowany. Włącz go w Ustawieniach.'; @override String get locationPermissionRequired => - 'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.'; + 'Dostęp do lokalizacji jest wymagany do śledzenia GPS i koordynacji zespołu. Możesz go włączyć później w Ustawieniach.'; @override String get locationServicesDisabled => @@ -61,7 +61,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String failedToAdvertise(String error) { - return 'Failed to advertise: $error'; + return 'Nie udało się rozgłosić: $error'; } @override @@ -83,42 +83,42 @@ class AppLocalizationsPl extends AppLocalizations { String get dark => 'Ciemny'; @override - String get blueLightTheme => 'Blue light theme'; + String get blueLightTheme => 'Niebieski jasny motyw'; @override - String get blueDarkTheme => 'Blue dark theme'; + String get blueDarkTheme => 'Niebieski ciemny motyw'; @override - String get sarRed => 'SAR Red'; + String get sarRed => 'SAR Czerwony'; @override - String get alertEmergencyMode => 'Alert/Emergency mode'; + String get alertEmergencyMode => 'Tryb alarmowy/awaryjny'; @override - String get sarGreen => 'SAR Green'; + String get sarGreen => 'SAR Zielony'; @override - String get safeAllClearMode => 'Safe/All Clear mode'; + String get safeAllClearMode => 'Tryb bezpieczny/wszystko jasne'; @override - String get autoSystem => 'Auto (System)'; + String get autoSystem => 'Automatyczny (system)'; @override - String get followSystemTheme => 'Follow system theme'; + String get followSystemTheme => 'Dopasuj do motywu systemowego'; @override - String get showRxTxIndicators => 'Show RX/TX Indicators'; + String get showRxTxIndicators => 'Pokaż wskaźniki RX/TX'; @override String get displayPacketActivity => - 'Display packet activity indicators in top bar'; + 'Wyświetlaj wskaźniki aktywności pakietów na górnym pasku'; @override - String get disableMap => 'Disable Map'; + String get disableMap => 'Wyłącz mapę'; @override String get disableMapDescription => - 'Hide the map tab to reduce battery usage'; + 'Ukryj kartę mapy, aby zmniejszyć zużycie baterii'; @override String get language => 'Język'; @@ -139,37 +139,37 @@ class AppLocalizationsPl extends AppLocalizations { String get about => 'Informacje'; @override - String get appVersion => 'App Version'; + String get appVersion => 'Wersja aplikacji'; @override - String get appName => 'App Name'; + String get appName => 'Nazwa aplikacji'; @override - String get aboutMeshCoreSar => 'About MeshCore SAR'; + String get aboutMeshCoreSar => 'O 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'; + 'Aplikacja poszukiwawczo-ratownicza zaprojektowana dla zespołów reagowania kryzysowego. Funkcje obejmują:\n\n• Sieć BLE mesh do komunikacji urządzenie-urządzenie\n• Mapy offline z wieloma warstwami\n• Śledzenie członków zespołu w czasie rzeczywistym\n• Taktyczne znaczniki SAR (odnaleziona osoba, pożar, strefa zbiórki)\n• Zarządzanie kontaktami i wiadomościami\n• Śledzenie GPS z kompasem\n• Buforowanie kafelków mapy do użytku offline'; @override - String get technologiesUsed => 'Technologies Used:'; + String get technologiesUsed => 'Użyte technologie:'; @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'; + '• Flutter do rozwoju wieloplatformowego\n• BLE (Bluetooth Low Energy) do sieci mesh\n• OpenStreetMap do map\n• Provider do zarządzania stanem\n• SharedPreferences do pamięci lokalnej'; @override - String get moreInfo => 'More Info'; + String get moreInfo => 'Więcej informacji'; @override - String get packageName => 'Package Name'; + String get packageName => 'Nazwa pakietu'; @override String get sampleData => 'Dane przykładowe'; @override String get sampleDataDescription => - 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + 'Wczytaj lub wyczyść przykładowe kontakty, wiadomości kanałów i znaczniki SAR do testów'; @override String get loadSampleData => 'Wczytaj dane przykładowe'; @@ -178,11 +178,11 @@ class AppLocalizationsPl extends AppLocalizations { String get clearAllData => 'Wyczyść wszystkie dane'; @override - String get clearAllDataConfirmTitle => 'Clear All Data'; + String get clearAllDataConfirmTitle => 'Wyczyść wszystkie dane'; @override String get clearAllDataConfirmMessage => - 'This will clear all contacts and SAR markers. Are you sure?'; + 'To wyczyści wszystkie kontakty i znaczniki SAR. Czy na pewno?'; @override String get clear => 'Wyczyść'; @@ -194,29 +194,29 @@ class AppLocalizationsPl extends AppLocalizations { int sarCount, int messageCount, ) { - return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + return 'Wczytano $teamCount członków zespołu, $channelCount kanałów, $sarCount znaczników SAR, $messageCount wiadomości'; } @override String failedToLoadSampleData(String error) { - return 'Failed to load sample data: $error'; + return 'Nie udało się wczytać danych przykładowych: $error'; } @override - String get allDataCleared => 'All data cleared'; + String get allDataCleared => 'Wszystkie dane wyczyszczono'; @override String get failedToStartBackgroundTracking => - 'Failed to start background tracking. Check permissions and BLE connection.'; + 'Nie udało się uruchomić śledzenia w tle. Sprawdź uprawnienia i połączenie BLE.'; @override String locationBroadcast(String latitude, String longitude) { - return 'Location broadcast: $latitude, $longitude'; + return 'Nadawanie lokalizacji: $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.'; + 'Domyślny PIN dla urządzeń bez ekranu to 123456. Problem z parowaniem? Zapomnij urządzenie Bluetooth w ustawieniach systemu.'; @override String get noMessagesYet => 'Brak wiadomości'; @@ -238,14 +238,14 @@ class AppLocalizationsPl extends AppLocalizations { String get refresh => 'Odśwież'; @override - String get resetPath => 'Reset Path (Re-route)'; + String get resetPath => 'Resetuj trasę (wyznacz ponownie)'; @override - String get publicKeyCopied => 'Public key copied to clipboard'; + String get publicKeyCopied => 'Klucz publiczny skopiowano do schowka'; @override String copiedToClipboard(String label) { - return '$label copied to clipboard'; + return 'Skopiowano $label do schowka'; } @override @@ -253,7 +253,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String failedToSyncContacts(String error) { - return 'Failed to sync contacts: $error'; + return 'Nie udało się zsynchronizować kontaktów: $error'; } @override @@ -270,7 +270,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String failedToSendLogin(String error) { - return 'Failed to send login: $error'; + return 'Nie udało się wysłać logowania: $error'; } @override @@ -292,37 +292,38 @@ class AppLocalizationsPl extends AppLocalizations { String get drawLine => 'Rysuj linię'; @override - String get drawLineDesc => 'Draw a freehand line on the map'; + String get drawLineDesc => 'Narysuj odręczną linię na mapie'; @override String get drawRectangle => 'Rysuj prostokąt'; @override - String get drawRectangleDesc => 'Draw a rectangular area on the map'; + String get drawRectangleDesc => 'Narysuj prostokątny obszar na mapie'; @override String get measureDistance => 'Mierz odległość'; @override - String get measureDistanceDesc => 'Long press two points to measure'; + String get measureDistanceDesc => 'Przytrzymaj dwa punkty, aby zmierzyć'; @override String get clearMeasurement => 'Wyczyść pomiar'; @override String distanceLabel(String distance) { - return 'Distance: $distance'; + return 'Odległość: $distance'; } @override - String get longPressForSecondPoint => 'Long press for second point'; + String get longPressForSecondPoint => 'Przytrzymaj dla drugiego punktu'; @override - String get longPressToStartMeasurement => 'Long press to set first point'; + String get longPressToStartMeasurement => + 'Przytrzymaj, aby ustawić pierwszy punkt'; @override String get longPressToStartNewMeasurement => - 'Long press to start new measurement'; + 'Przytrzymaj, aby rozpocząć nowy pomiar'; @override String get shareDrawings => 'Udostępnij rysunki'; @@ -331,21 +332,21 @@ class AppLocalizationsPl extends AppLocalizations { String get clearAllDrawings => 'Wyczyść wszystkie rysunki'; @override - String get completeLine => 'Complete Line'; + String get completeLine => 'Zakończ linię'; @override String broadcastDrawingsToTeam(int count, String plural) { - return 'Broadcast $count drawing$plural to team'; + return 'Nadaj $count rysunek$plural do zespołu'; } @override String removeAllDrawings(int count, String plural) { - return 'Remove all $count drawing$plural'; + return 'Usuń wszystkie $count rysunek$plural'; } @override String deleteAllDrawingsConfirm(int count, String plural) { - return 'Delete all $count drawing$plural from the map?'; + return 'Usunąć wszystkie $count rysunek$plural z mapy?'; } @override @@ -353,26 +354,26 @@ class AppLocalizationsPl extends AppLocalizations { @override String shareDrawingsCount(int count, String plural) { - return 'Share $count Drawing$plural'; + return 'Udostępnij $count rysunek$plural'; } @override String get showReceivedDrawings => 'Pokaż odebrane rysunki'; @override - String get showingAllDrawings => 'Showing all drawings'; + String get showingAllDrawings => 'Pokazywane są wszystkie rysunki'; @override - String get showingOnlyYourDrawings => 'Showing only your drawings'; + String get showingOnlyYourDrawings => 'Pokazywane są tylko twoje rysunki'; @override String get showSarMarkers => 'Pokaż znaczniki SAR'; @override - String get showingSarMarkers => 'Showing SAR markers'; + String get showingSarMarkers => 'Pokazywane są znaczniki SAR'; @override - String get hidingSarMarkers => 'Hiding SAR markers'; + String get hidingSarMarkers => 'Ukrywanie znaczników SAR'; @override String get clearAll => 'Wyczyść wszystko'; @@ -381,10 +382,11 @@ class AppLocalizationsPl extends AppLocalizations { String get publicChannel => 'Kanał publiczny'; @override - String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + String get broadcastToAll => + 'Nadaj do wszystkich pobliskich węzłów (tymczasowo)'; @override - String get storedPermanently => 'Stored permanently in room'; + String get storedPermanently => 'Przechowywane na stałe w pokoju'; @override String get notConnectedToDevice => 'Brak połączenia z urządzeniem'; @@ -402,24 +404,24 @@ class AppLocalizationsPl extends AppLocalizations { String get sendTo => 'Wyślij do'; @override - String get noDestinationsAvailable => 'No destinations available.'; + String get noDestinationsAvailable => 'Brak dostępnych odbiorców.'; @override String get selectDestination => 'Wybierz odbiorcę...'; @override String get ephemeralBroadcastInfo => - 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + 'Tymczasowe: nadawane tylko drogą radiową. Nie jest zapisywane - węzły muszą być online.'; @override String get persistentRoomInfo => - 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + 'Trwałe: zapisywane niezmiennie w pokoju. Synchronizowane automatycznie i zachowywane offline.'; @override String get location => 'Lokalizacja'; @override - String get fromMap => 'From Map'; + String get fromMap => 'Z mapy'; @override String get gettingLocation => 'Pobieranie lokalizacji...'; @@ -435,18 +437,18 @@ class AppLocalizationsPl extends AppLocalizations { @override String accuracyMeters(int accuracy) { - return 'Accuracy: ±${accuracy}m'; + return 'Dokładność: ±${accuracy}m'; } @override String get notesOptional => 'Notatki (opcjonalnie)'; @override - String get addAdditionalInformation => 'Add additional information...'; + String get addAdditionalInformation => 'Dodaj dodatkowe informacje...'; @override String lowAccuracyWarning(int accuracy) { - return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + return 'Dokładność lokalizacji wynosi ±${accuracy}m. To może nie być wystarczająco dokładne dla działań SAR.\n\nKontynuować mimo to?'; } @override @@ -454,7 +456,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String get enterPasswordInfo => - 'Enter the password to access this room. The password will be saved for future use.'; + 'Wprowadź hasło, aby uzyskać dostęp do tego pokoju. Hasło zostanie zapisane na przyszłość.'; @override String get password => 'Hasło'; @@ -470,14 +472,14 @@ class AppLocalizationsPl extends AppLocalizations { @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.'; + return 'Nie udało się dodać pokoju do urządzenia: $error\n\nPokój mógł jeszcze nie rozpocząć nadawania.\nSpróbuj poczekać, aż pokój zacznie nadawać.'; } @override String get direct => 'Bezpośrednie'; @override - String get flood => 'Flood'; + String get flood => 'Rozgłoszeniowo'; @override String get loggedIn => 'Zalogowano'; @@ -490,22 +492,22 @@ class AppLocalizationsPl extends AppLocalizations { @override String directPingTimeout(String name) { - return 'Direct ping timeout - retrying $name with flooding...'; + return 'Przekroczono czas bezpośredniego ping - ponawianie dla $name przez flooding...'; } @override String pingFailed(String name) { - return 'Ping failed to $name - no response received'; + return 'Ping do $name nie powiódł się - nie otrzymano odpowiedzi'; } @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.'; + return 'Czy na pewno chcesz usunąć „$name”?\n\nTo usunie kontakt zarówno z aplikacji, jak i z towarzyszącego urządzenia radiowego.'; } @override String failedToRemoveContact(String error) { - return 'Failed to remove contact: $error'; + return 'Nie udało się usunąć kontaktu: $error'; } @override @@ -527,7 +529,7 @@ class AppLocalizationsPl extends AppLocalizations { String get notLoggedIn => 'Niezalogowany'; @override - String get adminAccess => 'Admin Access'; + String get adminAccess => 'Dostęp administratora'; @override String get yes => 'Tak'; @@ -539,10 +541,10 @@ class AppLocalizationsPl extends AppLocalizations { String get permissions => 'Uprawnienia'; @override - String get passwordSaved => 'Password Saved'; + String get passwordSaved => 'Hasło zapisano'; @override - String get locationColon => 'Location:'; + String get locationColon => 'Lokalizacja:'; @override String get telemetry => 'Telemetria'; @@ -563,18 +565,18 @@ class AppLocalizationsPl extends AppLocalizations { String get pressure => 'Ciśnienie'; @override - String get gpsTelemetry => 'GPS (Telemetry)'; + String get gpsTelemetry => 'GPS (telemetria)'; @override String get updated => 'Zaktualizowano'; @override String pathResetInfo(String name) { - return 'Path reset for $name. Next message will find a new route.'; + return 'Trasa dla $name została zresetowana. Następna wiadomość znajdzie nową trasę.'; } @override - String get reLoginToRoom => 'Re-Login to Room'; + String get reLoginToRoom => 'Zaloguj ponownie do pokoju'; @override String get heading => 'Kierunek'; @@ -595,7 +597,7 @@ class AppLocalizationsPl extends AppLocalizations { String get filterMarkers => 'Filtruj znaczniki'; @override - String get filterMarkersTooltip => 'Filter markers'; + String get filterMarkersTooltip => 'Filtruj znaczniki'; @override String get contactsFilter => 'Kontakty'; @@ -622,21 +624,21 @@ class AppLocalizationsPl extends AppLocalizations { String get locationUnavailable => 'Lokalizacja niedostępna'; @override - String get ahead => 'ahead'; + String get ahead => 'przed tobą'; @override String degreesRight(int degrees) { - return '$degrees° right'; + return '$degrees° w prawo'; } @override String degreesLeft(int degrees) { - return '$degrees° left'; + return '$degrees° w lewo'; } @override String latLonFormat(String latitude, String longitude) { - return 'Lat: $latitude Lon: $longitude'; + return 'Szer.: $latitude Dł.: $longitude'; } @override @@ -644,7 +646,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String get connectToDeviceToLoadContacts => - 'Connect to a device to load contacts'; + 'Połącz się z urządzeniem, aby wczytać kontakty'; @override String get teamMembers => 'Członkowie zespołu'; @@ -680,7 +682,7 @@ class AppLocalizationsPl extends AppLocalizations { String get googleTerrain => 'Google Teren'; @override - String get dragToPosition => 'Drag to Position'; + String get dragToPosition => 'Przeciągnij do pozycji'; @override String get createSarMarker => 'Utwórz znacznik SAR'; @@ -689,39 +691,40 @@ class AppLocalizationsPl extends AppLocalizations { String get compass => 'Kompas'; @override - String get navigationAndContacts => 'Navigation & Contacts'; + String get navigationAndContacts => 'Nawigacja i kontakty'; @override String get sarAlert => 'ALERT SAR'; @override - String get textCopiedToClipboard => 'Text copied to clipboard'; + String get textCopiedToClipboard => 'Tekst skopiowano do schowka'; @override String get cannotReplySenderMissing => - 'Cannot reply: sender information missing'; + 'Nie można odpowiedzieć: brak informacji o nadawcy'; @override - String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + String get cannotReplyContactNotFound => + 'Nie można odpowiedzieć: nie znaleziono kontaktu'; @override String get copyText => 'Kopiuj tekst'; @override - String get saveAsTemplate => 'Save as Template'; + String get saveAsTemplate => 'Zapisz jako szablon'; @override - String get templateSaved => 'Template saved successfully'; + String get templateSaved => 'Szablon zapisano pomyślnie'; @override - String get templateAlreadyExists => 'Template with this emoji already exists'; + String get templateAlreadyExists => 'Szablon z tym emoji już istnieje'; @override String get deleteMessage => 'Usuń wiadomość'; @override String get deleteMessageConfirmation => - 'Are you sure you want to delete this message?'; + 'Czy na pewno chcesz usunąć tę wiadomość?'; @override String get shareLocation => 'Udostępnij lokalizację'; @@ -733,11 +736,11 @@ class AppLocalizationsPl extends AppLocalizations { String lon, String url, ) { - return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + return '$markerInfo\n\nWspółrzędne: $lat, $lon\n\nGoogle Maps: $url'; } @override - String get sarLocationShare => 'SAR Location'; + String get sarLocationShare => 'Lokalizacja SAR'; @override String get justNow => 'Przed chwilą'; @@ -773,7 +776,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String deliveredWithTime(int time) { - return 'Delivered (${time}ms)'; + return 'Dostarczono (${time}ms)'; } @override @@ -784,29 +787,29 @@ class AppLocalizationsPl extends AppLocalizations { @override String deliveredToContacts(int delivered, int total) { - return 'Delivered to $delivered/$total contacts'; + return 'Dostarczono do $delivered/$total kontaktów'; } @override - String get allDelivered => 'All delivered'; + String get allDelivered => 'Wszystko dostarczono'; @override - String get recipientDetails => 'Recipient Details'; + String get recipientDetails => 'Szczegóły odbiorcy'; @override String get pending => 'Oczekujące'; @override - String get sarMarkerFoundPerson => 'Found Person'; + String get sarMarkerFoundPerson => 'Odnaleziona osoba'; @override - String get sarMarkerFire => 'Fire Location'; + String get sarMarkerFire => 'Miejsce pożaru'; @override - String get sarMarkerStagingArea => 'Staging Area'; + String get sarMarkerStagingArea => 'Strefa zbiórki'; @override - String get sarMarkerObject => 'Object Found'; + String get sarMarkerObject => 'Odnaleziony obiekt'; @override String get from => 'Od'; @@ -824,7 +827,7 @@ class AppLocalizationsPl extends AppLocalizations { String get frequencyMHz => 'Częstotliwość (MHz)'; @override - String get frequencyExample => 'e.g., 869.618'; + String get frequencyExample => 'np. 869.618'; @override String get bandwidth => 'Szerokość pasma'; @@ -869,10 +872,10 @@ class AppLocalizationsPl extends AppLocalizations { String get showTrailOnMap => 'Pokaż ślad na mapie'; @override - String get trailVisible => 'Trail is visible on the map'; + String get trailVisible => 'Ślad jest widoczny na mapie'; @override - String get trailHiddenRecording => 'Trail is hidden (still recording)'; + String get trailHiddenRecording => 'Ślad jest ukryty (nadal nagrywany)'; @override String get duration => 'Czas trwania'; @@ -884,18 +887,18 @@ class AppLocalizationsPl extends AppLocalizations { String get clearTrail => 'Wyczyść ślad'; @override - String get clearTrailQuestion => 'Clear Trail?'; + String get clearTrailQuestion => 'Wyczyścić ślad?'; @override String get clearTrailConfirmation => - 'Are you sure you want to clear the current location trail? This action cannot be undone.'; + 'Czy na pewno chcesz wyczyścić bieżący ślad lokalizacji? Tego działania nie można cofnąć.'; @override String get noTrailRecorded => 'Brak zapisanego śladu'; @override String get startTrackingToRecord => - 'Start location tracking to record your trail'; + 'Rozpocznij śledzenie lokalizacji, aby zapisać ślad'; @override String get trailControls => 'Sterowanie śladem'; @@ -904,19 +907,19 @@ class AppLocalizationsPl extends AppLocalizations { String get contactTrails => 'Ślady kontaktów'; @override - String get showAllContactTrails => 'Show All Contact Trails'; + String get showAllContactTrails => 'Pokaż wszystkie ślady kontaktów'; @override String get noContactsWithLocationHistory => - 'No contacts with location history'; + 'Brak kontaktów z historią lokalizacji'; @override String showingTrailsForContacts(int count) { - return 'Showing trails for $count contacts'; + return 'Pokazywane są ślady dla $count kontaktów'; } @override - String get individualContactTrails => 'Individual Contact Trails'; + String get individualContactTrails => 'Indywidualne ślady kontaktów'; @override String get deviceInformation => 'Informacje o urządzeniu'; @@ -949,16 +952,17 @@ class AppLocalizationsPl extends AppLocalizations { String get maxChannels => 'Maks. kanałów'; @override - String get publicInfo => 'Public Info'; + String get publicInfo => 'Informacje publiczne'; @override - String get meshNetworkName => 'Mesh Network Name'; + String get meshNetworkName => 'Nazwa sieci mesh'; @override - String get nameBroadcastInMesh => 'Name broadcast in mesh advertisements'; + String get nameBroadcastInMesh => 'Nazwa nadawana w ogłoszeniach mesh'; @override - String get telemetryAndLocationSharing => 'Telemetry & Location Sharing'; + String get telemetryAndLocationSharing => + 'Telemetria i udostępnianie lokalizacji'; @override String get lat => 'Szer.'; @@ -970,42 +974,42 @@ class AppLocalizationsPl extends AppLocalizations { String get useCurrentLocation => 'Użyj bieżącej lokalizacji'; @override - String get noneUnknown => 'None/Unknown'; + String get noneUnknown => 'Brak/Nieznane'; @override - String get chatNode => 'Chat Node'; + String get chatNode => 'Węzeł czatu'; @override String get repeater => 'Przekaźnik'; @override - String get roomChannel => 'Room/Channel'; + String get roomChannel => 'Pokój/Kanał'; @override String typeNumber(int number) { - return 'Type $number'; + return 'Typ $number'; } @override String copiedToClipboardShort(String label) { - return 'Copied $label to clipboard'; + return 'Skopiowano $label do schowka'; } @override String failedToSave(String error) { - return 'Failed to save: $error'; + return 'Nie udało się zapisać: $error'; } @override String failedToGetLocation(String error) { - return 'Failed to get location: $error'; + return 'Nie udało się pobrać lokalizacji: $error'; } @override String get sarTemplates => 'Szablony SAR'; @override - String get manageSarTemplates => 'Manage cursor on target templates'; + String get manageSarTemplates => 'Zarządzaj szablonami SAR'; @override String get addTemplate => 'Dodaj szablon'; @@ -1051,7 +1055,7 @@ class AppLocalizationsPl extends AppLocalizations { @override String deleteTemplateConfirmation(String name) { - return 'Delete template \'$name\'?'; + return 'Usunąć szablon „$name”?'; } @override @@ -1068,9 +1072,9 @@ class AppLocalizationsPl extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Imported $count templates', - one: 'Imported 1 template', - zero: 'No templates imported', + other: 'Zaimportowano $count szablonów', + one: 'Zaimportowano 1 szablon', + zero: 'Nie zaimportowano szablonów', ); return '$_temp0'; } @@ -1080,8 +1084,8 @@ class AppLocalizationsPl extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Exported $count templates to clipboard', - one: 'Exported 1 template to clipboard', + other: 'Wyeksportowano $count szablonów do schowka', + one: 'Wyeksportowano 1 szablon do schowka', ); return '$_temp0'; } @@ -1091,13 +1095,13 @@ class AppLocalizationsPl extends AppLocalizations { @override String get resetToDefaultsConfirmation => - 'This will delete all custom templates and restore the 4 default templates. Continue?'; + 'To usunie wszystkie własne szablony i przywróci 4 domyślne szablony. Kontynuować?'; @override String get reset => 'Resetuj'; @override - String get resetComplete => 'Templates reset to defaults'; + String get resetComplete => 'Szablony przywrócono do domyślnych'; @override String get noTemplates => 'Brak dostępnych szablonów'; @@ -1118,21 +1122,23 @@ class AppLocalizationsPl extends AppLocalizations { String get checking => 'Sprawdzanie...'; @override - String get locationPermissionGrantedAlways => 'Granted (Always)'; + String get locationPermissionGrantedAlways => 'Przyznano (zawsze)'; @override - String get locationPermissionGrantedWhileInUse => 'Granted (While In Use)'; + String get locationPermissionGrantedWhileInUse => + 'Przyznano (podczas użycia)'; @override - String get locationPermissionDeniedTapToRequest => 'Denied - Tap to request'; + String get locationPermissionDeniedTapToRequest => + 'Odrzucono - dotknij, aby poprosić'; @override String get locationPermissionPermanentlyDeniedOpenSettings => - 'Permanently Denied - Open Settings'; + 'Trwale odrzucono - otwórz ustawienia'; @override String get locationPermissionDialogContent => - 'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'; + 'Dostęp do lokalizacji został trwale odrzucony. Włącz go w ustawieniach urządzenia, aby używać GPS i udostępniania lokalizacji.'; @override String get openSettings => 'Otwórz ustawienia'; @@ -1142,23 +1148,23 @@ class AppLocalizationsPl extends AppLocalizations { @override String get locationPermissionRequiredForGps => - 'Location permission is required for GPS tracking and location sharing.'; + 'Dostęp do lokalizacji jest wymagany do śledzenia GPS i udostępniania lokalizacji.'; @override String get locationPermissionAlreadyGranted => - 'Location permission is already granted.'; + 'Dostęp do lokalizacji został już przyznany.'; @override - String get sarNavyBlue => 'SAR Navy Blue'; + String get sarNavyBlue => 'SAR Granatowy'; @override - String get sarNavyBlueDescription => 'Professional/Operations Mode'; + String get sarNavyBlueDescription => 'Tryb profesjonalny/operacyjny'; @override String get selectRecipient => 'Wybierz odbiorcę'; @override - String get broadcastToAllNearby => 'Broadcast to all nearby'; + String get broadcastToAllNearby => 'Nadaj do wszystkich w pobliżu'; @override String get searchRecipients => 'Szukaj odbiorców...'; @@ -1182,28 +1188,28 @@ class AppLocalizationsPl extends AppLocalizations { String get channel => 'Kanał'; @override - String get samplePoliceLead => 'Police Lead'; + String get samplePoliceLead => 'Dowódca policji'; @override - String get sampleDroneOperator => 'Drone Operator'; + String get sampleDroneOperator => 'Operator drona'; @override - String get sampleFirefighterAlpha => 'Firefighter'; + String get sampleFirefighterAlpha => 'Strażak'; @override - String get sampleMedicCharlie => 'Medic'; + String get sampleMedicCharlie => 'Ratownik medyczny'; @override - String get sampleCommandDelta => 'Command'; + String get sampleCommandDelta => 'Dowództwo'; @override - String get sampleFireEngine => 'Fire Engine'; + String get sampleFireEngine => 'Wóz strażacki'; @override - String get sampleAirSupport => 'Air Support'; + String get sampleAirSupport => 'Wsparcie lotnicze'; @override - String get sampleBaseCoordinator => 'Base Coordinator'; + String get sampleBaseCoordinator => 'Koordynator bazy'; @override String get channelEmergency => 'Alarmowy'; @@ -1215,127 +1221,135 @@ class AppLocalizationsPl extends AppLocalizations { String get channelUpdates => 'Aktualizacje'; @override - String get sampleTeamMember => 'Sample Team Member'; + String get sampleTeamMember => 'Przykładowy członek zespołu'; @override - String get sampleScout => 'Sample Scout'; + String get sampleScout => 'Przykładowy zwiadowca'; @override - String get sampleBase => 'Sample Base'; + String get sampleBase => 'Przykładowa baza'; @override - String get sampleSearcher => 'Sample Searcher'; + String get sampleSearcher => 'Przykładowy poszukiwacz'; @override - String get sampleObjectBackpack => ' Backpack found - blue color'; + String get sampleObjectBackpack => ' Znaleziono plecak - kolor niebieski'; @override - String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + String get sampleObjectVehicle => ' Porzucony pojazd - sprawdzić właściciela'; @override - String get sampleObjectCamping => ' Camping equipment discovered'; + String get sampleObjectCamping => ' Znaleziono sprzęt kempingowy'; @override - String get sampleObjectTrailMarker => ' Trail marker found off-path'; + String get sampleObjectTrailMarker => + ' Znaleziono znacznik szlaku poza trasą'; @override - String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + String get sampleMsgAllTeamsCheckIn => 'Wszystkie zespoły - meldunek'; @override - String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + String get sampleMsgWeatherUpdate => + 'Aktualizacja pogody: bezchmurnie, temp. 18°C'; @override - String get sampleMsgBaseCamp => 'Base camp established at staging area'; + String get sampleMsgBaseCamp => 'Bazę założono w strefie zbiórki'; @override - String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + String get sampleMsgTeamAlpha => 'Zespół przemieszcza się do sektora 2'; @override - String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + String get sampleMsgRadioCheck => + 'Kontrola radiowa - wszystkie stacje proszone o odpowiedź'; @override - String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + String get sampleMsgWaterSupply => 'Woda dostępna w punkcie kontrolnym 3'; @override - String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + String get sampleMsgTeamBravo => 'Zespół melduje: sektor 1 czysty'; @override - String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + String get sampleMsgEtaRallyPoint => + 'Szacowany czas dotarcia do punktu zbiórki: 15 minut'; @override - String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + String get sampleMsgSupplyDrop => 'Zrzut zaopatrzenia potwierdzony na 14:00'; @override - String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + String get sampleMsgDroneSurvey => + 'Rozpoznanie dronem zakończone - brak wyników'; @override - String get sampleMsgTeamCharlie => 'Team requesting backup'; + String get sampleMsgTeamCharlie => 'Zespół prosi o wsparcie'; @override - String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + String get sampleMsgRadioDiscipline => + 'Wszystkie jednostki: zachować dyscyplinę radiową'; @override String get sampleMsgUrgentMedical => - 'URGENT: Medical assistance needed at sector 4'; + 'PILNE: potrzebna pomoc medyczna w sektorze 4'; @override - String get sampleMsgAdultMale => ' Adult male, conscious'; + String get sampleMsgAdultMale => ' Dorosły mężczyzna, przytomny'; @override - String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + String get sampleMsgFireSpotted => 'Wykryto pożar - współrzędne w drodze'; @override - String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + String get sampleMsgSpreadingRapidly => ' Szybko się rozprzestrzenia!'; @override - String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + String get sampleMsgPriorityHelicopter => + 'PRIORYTET: potrzebne wsparcie śmigłowca'; @override String get sampleMsgMedicalTeamEnRoute => - 'Medical team en route to your location'; + 'Zespół medyczny jest w drodze do twojej lokalizacji'; @override - String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + String get sampleMsgEvacHelicopter => 'ETA śmigłowca ewakuacyjnego 10 minut'; @override - String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + String get sampleMsgEmergencyResolved => + 'Sytuacja opanowana - wszystko jasne'; @override - String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + String get sampleMsgEmergencyStagingArea => ' Strefa zbiórki awaryjnej'; @override String get sampleMsgEmergencyServices => - 'Emergency services notified and responding'; + 'Służby ratunkowe zostały powiadomione i jadą na miejsce'; @override - String get sampleAlphaTeamLead => 'Team Lead'; + String get sampleAlphaTeamLead => 'Lider zespołu'; @override - String get sampleBravoScout => 'Scout'; + String get sampleBravoScout => 'Zwiadowca'; @override - String get sampleCharlieMedic => 'Medic'; + String get sampleCharlieMedic => 'Ratownik medyczny'; @override - String get sampleDeltaNavigator => 'Navigator'; + String get sampleDeltaNavigator => 'Nawigator'; @override - String get sampleEchoSupport => 'Support'; + String get sampleEchoSupport => 'Wsparcie'; @override - String get sampleBaseCommand => 'Base Command'; + String get sampleBaseCommand => 'Dowództwo bazy'; @override - String get sampleFieldCoordinator => 'Field Coordinator'; + String get sampleFieldCoordinator => 'Koordynator terenowy'; @override - String get sampleMedicalTeam => 'Medical Team'; + String get sampleMedicalTeam => 'Zespół medyczny'; @override String get mapDrawing => 'Rysunek mapy'; @override - String get navigateToDrawing => 'Navigate to Drawing'; + String get navigateToDrawing => 'Nawiguj do rysunku'; @override String get copyCoordinates => 'Kopiuj współrzędne'; @@ -1362,34 +1376,34 @@ class AppLocalizationsPl extends AppLocalizations { String get longitudeLabel => 'Długość geograficzna'; @override - String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + String get exampleCoordinates => 'Przykład: 46.0569, 14.5058'; @override String get shareDrawing => 'Udostępnij rysunek'; @override - String get shareWithAllNearbyDevices => 'Share with all nearby devices'; + String get shareWithAllNearbyDevices => + 'Udostępnij wszystkim pobliskim urządzeniom'; @override - String get shareToRoom => 'Share to Room'; + String get shareToRoom => 'Udostępnij do pokoju'; @override - String get sendToPersistentStorage => 'Send to persistent room storage'; + String get sendToPersistentStorage => 'Wyślij do trwałego magazynu pokoju'; @override - String get deleteDrawingConfirm => - 'Are you sure you want to delete this drawing?'; + String get deleteDrawingConfirm => 'Czy na pewno chcesz usunąć ten rysunek?'; @override - String get drawingDeleted => 'Drawing deleted'; + String get drawingDeleted => 'Rysunek usunięto'; @override String yourDrawingsCount(int count) { - return 'Your Drawings ($count)'; + return 'Twoje rysunki ($count)'; } @override - String get shared => 'Shared'; + String get shared => 'Udostępniono'; @override String get line => 'Linia'; @@ -1413,43 +1427,43 @@ class AppLocalizationsPl extends AppLocalizations { String get updateLater => 'Później'; @override - String get cadastralParcels => 'Cadastral Parcels'; + String get cadastralParcels => 'Działki katastralne'; @override - String get forestRoads => 'Forest Roads'; + String get forestRoads => 'Drogi leśne'; @override - String get wmsOverlays => 'WMS Overlays'; + String get wmsOverlays => 'Nakładki WMS'; @override - String get hikingTrails => 'Hiking Trails'; + String get hikingTrails => 'Szlaki piesze'; @override - String get mainRoads => 'Main Roads'; + String get mainRoads => 'Drogi główne'; @override - String get houseNumbers => 'House Numbers'; + String get houseNumbers => 'Numery budynków'; @override - String get fireHazardZones => 'Fire Hazard Zones'; + String get fireHazardZones => 'Strefy zagrożenia pożarowego'; @override - String get historicalFires => 'Historical Fires'; + String get historicalFires => 'Historyczne pożary'; @override - String get firebreaks => 'Firebreaks'; + String get firebreaks => 'Pasy przeciwpożarowe'; @override - String get krasFireZones => 'Kras Fire Zones'; + String get krasFireZones => 'Strefy pożarowe Krasu'; @override - String get placeNames => 'Place Names'; + String get placeNames => 'Nazwy miejsc'; @override - String get municipalityBorders => 'Municipality Borders'; + String get municipalityBorders => 'Granice gmin'; @override - String get topographicMap => 'Topographic Map 1:25000'; + String get topographicMap => 'Mapa topograficzna 1:25000'; @override String get recentMessages => 'Ostatnie wiadomości'; @@ -1471,54 +1485,55 @@ class AppLocalizationsPl extends AppLocalizations { @override String get channelSecretHelp => - 'This secret must be shared with all team members who need access to this channel'; + 'Ten sekret musi być współdzielony ze wszystkimi członkami zespołu, którzy potrzebują dostępu do tego kanału'; @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.'; + 'Kanały hash (#team): sekret jest generowany automatycznie z nazwy. Ta sama nazwa = ten sam kanał na wszystkich urządzeniach.\n\nKanały prywatne: użyj jawnego sekretu. Dołączyć mogą tylko osoby znające sekret.'; @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.'; + 'Kanał hash: sekret zostanie wygenerowany automatycznie z nazwy kanału. Każdy używający tej samej nazwy dołączy do tego samego kanału.'; @override - String get channelNameRequired => 'Channel name is required'; + String get channelNameRequired => 'Nazwa kanału jest wymagana'; @override - String get channelNameTooLong => 'Channel name must be 31 characters or less'; + String get channelNameTooLong => + 'Nazwa kanału może mieć maksymalnie 31 znaków'; @override - String get channelSecretRequired => 'Channel secret is required'; + String get channelSecretRequired => 'Sekret kanału jest wymagany'; @override String get channelSecretTooLong => - 'Channel secret must be 32 characters or less'; + 'Sekret kanału może mieć maksymalnie 32 znaki'; @override - String get invalidAsciiCharacters => 'Only ASCII characters are allowed'; + String get invalidAsciiCharacters => 'Dozwolone są tylko znaki ASCII'; @override - String get channelCreatedSuccessfully => 'Channel created successfully'; + String get channelCreatedSuccessfully => 'Kanał utworzono pomyślnie'; @override String channelCreationFailed(String error) { - return 'Failed to create channel: $error'; + return 'Nie udało się utworzyć kanału: $error'; } @override - String get deleteChannel => 'Delete Channel'; + String get deleteChannel => 'Usuń kanał'; @override String deleteChannelConfirmation(String channelName) { - return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + return 'Czy na pewno chcesz usunąć kanał „$channelName”? Tej operacji nie można cofnąć.'; } @override - String get channelDeletedSuccessfully => 'Channel deleted successfully'; + String get channelDeletedSuccessfully => 'Kanał usunięto pomyślnie'; @override String channelDeletionFailed(String error) { - return 'Failed to delete channel: $error'; + return 'Nie udało się usunąć kanału: $error'; } @override @@ -1541,79 +1556,84 @@ class AppLocalizationsPl extends AppLocalizations { @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.'; + 'Potężne narzędzie komunikacji poza siecią do operacji poszukiwawczo-ratowniczych. Połącz się ze swoim zespołem przy użyciu technologii radia mesh, gdy tradycyjne sieci są niedostępne.'; @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.'; + 'Połącz smartfon z urządzeniem radiowym MeshCore przez Bluetooth, aby rozpocząć komunikację poza siecią.'; @override - String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + String get wizardConnectingFeature1 => 'Skanuj pobliskie urządzenia MeshCore'; @override - String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + String get wizardConnectingFeature2 => 'Sparuj radio przez Bluetooth'; @override String get wizardConnectingFeature3 => - 'Works completely offline - no internet required'; + 'Działa całkowicie offline - internet nie jest wymagany'; @override String get wizardChannelTitle => 'Kanały'; @override String get wizardChannelDescription => - 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + 'Nadawaj wiadomości do wszystkich na kanale, idealne do ogłoszeń i koordynacji całego zespołu.'; @override String get wizardChannelFeature1 => - 'Public Channel for general team communication'; + 'Kanał publiczny do ogólnej komunikacji zespołu'; @override String get wizardChannelFeature2 => - 'Create custom channels for specific groups'; + 'Twórz własne kanały dla konkretnych grup'; @override String get wizardChannelFeature3 => - 'Messages are automatically relayed by the mesh'; + 'Wiadomości są automatycznie przekazywane przez 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.'; + 'Członkowie zespołu pojawiają się automatycznie, gdy dołączają do sieci mesh. Wyślij im wiadomość bezpośrednią lub zobacz ich lokalizację.'; @override - String get wizardContactsFeature1 => 'Contacts discovered automatically'; + String get wizardContactsFeature1 => 'Kontakty wykrywane automatycznie'; @override - String get wizardContactsFeature2 => 'Send private direct messages'; + String get wizardContactsFeature2 => + 'Wysyłaj prywatne wiadomości bezpośrednie'; @override - String get wizardContactsFeature3 => 'View battery level and last seen time'; + String get wizardContactsFeature3 => + 'Podgląd poziomu baterii i czasu ostatniej aktywności'; @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.'; + 'Śledź swój zespół w czasie rzeczywistym i oznaczaj ważne lokalizacje dla działań poszukiwawczo-ratowniczych.'; @override String get wizardMapFeature1 => - 'SAR markers for found persons, fires, and staging areas'; + 'Znaczniki SAR dla odnalezionych osób, pożarów i stref zbiórki'; @override - String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + String get wizardMapFeature2 => + 'Śledzenie GPS członków zespołu w czasie rzeczywistym'; @override - String get wizardMapFeature3 => 'Download offline maps for remote areas'; + String get wizardMapFeature3 => + 'Pobieraj mapy offline dla odległych obszarów'; @override - String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + String get wizardMapFeature4 => + 'Rysuj kształty i udostępniaj informacje taktyczne'; @override String get viewWelcomeTutorial => 'Pokaż samouczek powitalny'; @@ -1623,12 +1643,12 @@ class AppLocalizationsPl extends AppLocalizations { @override String directMessagesInfo(int count) { - return 'Direct messages with ACKs. Sent to $count team members.'; + return 'Wiadomości bezpośrednie z ACK. Wysłano do $count członków zespołu.'; } @override String sarMarkerSentToContacts(int count) { - return 'SAR marker sent to $count contacts'; + return 'Znacznik SAR wysłano do $count kontaktów'; } @override @@ -1641,72 +1661,72 @@ class AppLocalizationsPl extends AppLocalizations { String get technicalDetails => 'Szczegóły techniczne'; @override - String get messageTechnicalDetails => 'Message technical details'; + String get messageTechnicalDetails => 'Szczegóły techniczne wiadomości'; @override - String get linkQuality => 'Link quality'; + String get linkQuality => 'Jakość łącza'; @override - String get delivery => 'Delivery'; + String get delivery => 'Dostarczenie'; @override String get status => 'Status'; @override - String get expectedAckTag => 'Expected ACK tag'; + String get expectedAckTag => 'Oczekiwany znacznik ACK'; @override - String get roundTrip => 'Round-trip'; + String get roundTrip => 'Czas podróży w obie strony'; @override - String get retryAttempt => 'Retry attempt'; + String get retryAttempt => 'Próba ponowienia'; @override - String get floodFallback => 'Flood fallback'; + String get floodFallback => 'Awaryjny flooding'; @override - String get identity => 'Identity'; + String get identity => 'Tożsamość'; @override - String get messageId => 'Message ID'; + String get messageId => 'ID wiadomości'; @override - String get sender => 'Sender'; + String get sender => 'Nadawca'; @override - String get senderKey => 'Sender key'; + String get senderKey => 'Klucz nadawcy'; @override - String get recipient => 'Recipient'; + String get recipient => 'Odbiorca'; @override - String get recipientKey => 'Recipient key'; + String get recipientKey => 'Klucz odbiorcy'; @override String get voice => 'Głos'; @override - String get voiceId => 'Voice ID'; + String get voiceId => 'ID głosu'; @override - String get envelope => 'Envelope'; + String get envelope => 'Koperta'; @override - String get sessionProgress => 'Session progress'; + String get sessionProgress => 'Postęp sesji'; @override String get complete => 'Zakończono'; @override - String get rawDump => 'Raw dump'; + String get rawDump => 'Surowy zrzut'; @override String get cannotRetryMissingRecipient => - 'Cannot retry: recipient information missing'; + 'Nie można ponowić: brak informacji o odbiorcy'; @override String get voiceUnavailable => 'Głos jest obecnie niedostępny'; @override - String get requestingVoice => 'Requesting voice'; + String get requestingVoice => 'Pobieranie głosu'; } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 9e88a77..ba995bb 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -145,24 +145,24 @@ class AppLocalizationsPt extends AppLocalizations { String get appName => 'Nome do app'; @override - String get aboutMeshCoreSar => 'About MeshCore SAR'; + String get aboutMeshCoreSar => 'Sobre o 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'; + 'Um aplicativo de Busca e Resgate projetado para equipes de resposta a emergências. Os recursos incluem:\n\n• Rede mesh BLE para comunicação entre dispositivos\n• Mapas offline com múltiplas opções de camadas\n• Rastreamento em tempo real dos membros da equipe\n• Marcadores táticos SAR (pessoa encontrada, incêndio, área de apoio)\n• Gerenciamento de contatos e mensagens\n• Rastreamento GPS com rumo da bússola\n• Cache de blocos de mapa para uso offline'; @override - String get technologiesUsed => 'Technologies Used:'; + String get technologiesUsed => 'Tecnologias utilizadas:'; @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'; + '• Flutter para desenvolvimento multiplataforma\n• BLE (Bluetooth Low Energy) para rede mesh\n• OpenStreetMap para mapas\n• Provider para gerenciamento de estado\n• SharedPreferences para armazenamento local'; @override String get moreInfo => 'Mais informações'; @override - String get packageName => 'Package Name'; + String get packageName => 'Nome do pacote'; @override String get sampleData => 'Dados de exemplo'; @@ -194,7 +194,7 @@ class AppLocalizationsPt extends AppLocalizations { int sarCount, int messageCount, ) { - return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + return 'Carregados $teamCount membros da equipe, $channelCount canais, $sarCount marcadores SAR, $messageCount mensagens'; } @override @@ -216,7 +216,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String get defaultPinInfo => - 'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'; + 'O PIN padrão para dispositivos sem tela é 123456. Problemas ao parear? Esqueça o dispositivo Bluetooth nas configurações do sistema.'; @override String get noMessagesYet => 'Ainda não há mensagens'; @@ -325,7 +325,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String get longPressToStartNewMeasurement => - 'Long press to start new measurement'; + 'Pressione e segure para iniciar uma nova medição'; @override String get shareDrawings => 'Compartilhar desenhos'; @@ -338,17 +338,17 @@ class AppLocalizationsPt extends AppLocalizations { @override String broadcastDrawingsToTeam(int count, String plural) { - return 'Broadcast $count drawing$plural to team'; + return 'Transmitir $count desenho$plural para a equipe'; } @override String removeAllDrawings(int count, String plural) { - return 'Remove all $count drawing$plural'; + return 'Remover todos os $count desenho$plural'; } @override String deleteAllDrawingsConfirm(int count, String plural) { - return 'Delete all $count drawing$plural from the map?'; + return 'Excluir todos os $count desenho$plural do mapa?'; } @override @@ -356,7 +356,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String shareDrawingsCount(int count, String plural) { - return 'Share $count Drawing$plural'; + return 'Compartilhar $count desenho$plural'; } @override @@ -412,11 +412,11 @@ class AppLocalizationsPt extends AppLocalizations { @override String get ephemeralBroadcastInfo => - 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + 'Efêmero: transmitido apenas pelo ar. Não é armazenado; os nós precisam estar online.'; @override String get persistentRoomInfo => - 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + 'Persistente: armazenado de forma imutável na sala. Sincronizado automaticamente e preservado offline.'; @override String get location => 'Localização'; @@ -449,7 +449,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String lowAccuracyWarning(int accuracy) { - return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + return 'A precisão da localização é ±${accuracy}m. Isso pode não ser preciso o suficiente para operações SAR.\n\nDeseja continuar mesmo assim?'; } @override @@ -457,7 +457,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String get enterPasswordInfo => - 'Enter the password to access this room. The password will be saved for future use.'; + 'Digite a senha para acessar esta sala. A senha será salva para uso futuro.'; @override String get password => 'Senha'; @@ -473,7 +473,7 @@ class AppLocalizationsPt extends AppLocalizations { @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.'; + return 'Falha ao adicionar a sala ao dispositivo: $error\n\nA sala talvez ainda não tenha sido anunciada.\nTente esperar a sala começar a transmitir.'; } @override @@ -493,7 +493,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String directPingTimeout(String name) { - return 'Direct ping timeout - retrying $name with flooding...'; + return 'Tempo limite do ping direto - tentando novamente $name com flooding...'; } @override @@ -503,7 +503,7 @@ class AppLocalizationsPt extends AppLocalizations { @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.'; + return 'Tem certeza de que deseja excluir \"$name\"?\n\nIsso removerá o contato tanto do aplicativo quanto do dispositivo de rádio associado.'; } @override @@ -573,7 +573,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String pathResetInfo(String name) { - return 'Path reset for $name. Next message will find a new route.'; + return 'Rota redefinida para $name. A próxima mensagem encontrará um novo caminho.'; } @override @@ -598,7 +598,7 @@ class AppLocalizationsPt extends AppLocalizations { String get filterMarkers => 'Filtrar marcadores'; @override - String get filterMarkersTooltip => 'Filter markers'; + String get filterMarkersTooltip => 'Filtrar marcadores'; @override String get contactsFilter => 'Contatos'; @@ -639,7 +639,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String latLonFormat(String latitude, String longitude) { - return 'Lat: $latitude Lon: $longitude'; + return 'Lat.: $latitude Lon.: $longitude'; } @override @@ -703,22 +703,23 @@ class AppLocalizationsPt extends AppLocalizations { @override String get cannotReplySenderMissing => - 'Cannot reply: sender information missing'; + 'Não é possível responder: faltam informações do remetente'; @override - String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + String get cannotReplyContactNotFound => + 'Não é possível responder: contato não encontrado'; @override String get copyText => 'Copiar texto'; @override - String get saveAsTemplate => 'Save as Template'; + String get saveAsTemplate => 'Salvar como modelo'; @override - String get templateSaved => 'Template saved successfully'; + String get templateSaved => 'Modelo salvo com sucesso'; @override - String get templateAlreadyExists => 'Template with this emoji already exists'; + String get templateAlreadyExists => 'Já existe um modelo com este emoji'; @override String get deleteMessage => 'Excluir mensagem'; @@ -737,7 +738,7 @@ class AppLocalizationsPt extends AppLocalizations { String lon, String url, ) { - return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + return '$markerInfo\n\nCoordenadas: $lat, $lon\n\nGoogle Maps: $url'; } @override @@ -788,29 +789,29 @@ class AppLocalizationsPt extends AppLocalizations { @override String deliveredToContacts(int delivered, int total) { - return 'Delivered to $delivered/$total contacts'; + return 'Entregue a $delivered/$total contatos'; } @override - String get allDelivered => 'All delivered'; + String get allDelivered => 'Todos entregues'; @override - String get recipientDetails => 'Recipient Details'; + String get recipientDetails => 'Detalhes do destinatário'; @override String get pending => 'Pendente'; @override - String get sarMarkerFoundPerson => 'Found Person'; + String get sarMarkerFoundPerson => 'Pessoa encontrada'; @override - String get sarMarkerFire => 'Fire Location'; + String get sarMarkerFire => 'Local do incêndio'; @override - String get sarMarkerStagingArea => 'Staging Area'; + String get sarMarkerStagingArea => 'Área de apoio'; @override - String get sarMarkerObject => 'Object Found'; + String get sarMarkerObject => 'Objeto encontrado'; @override String get from => 'De'; @@ -828,7 +829,7 @@ class AppLocalizationsPt extends AppLocalizations { String get frequencyMHz => 'Frequência (MHz)'; @override - String get frequencyExample => 'e.g., 869.618'; + String get frequencyExample => 'ex.: 869.618'; @override String get bandwidth => 'Largura de banda'; @@ -916,7 +917,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String showingTrailsForContacts(int count) { - return 'Showing trails for $count contacts'; + return 'Mostrando trilhas de $count contatos'; } @override @@ -966,10 +967,10 @@ class AppLocalizationsPt extends AppLocalizations { 'Telemetria e compartilhamento de localização'; @override - String get lat => 'Lat'; + String get lat => 'Lat.'; @override - String get lon => 'Lon'; + String get lon => 'Lon.'; @override String get useCurrentLocation => 'Usar localização atual'; @@ -988,7 +989,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String typeNumber(int number) { - return 'Type $number'; + return 'Tipo $number'; } @override @@ -1010,7 +1011,7 @@ class AppLocalizationsPt extends AppLocalizations { String get sarTemplates => 'Modelos SAR'; @override - String get manageSarTemplates => 'Manage cursor on target templates'; + String get manageSarTemplates => 'Gerenciar modelos SAR'; @override String get addTemplate => 'Adicionar modelo'; @@ -1073,9 +1074,9 @@ class AppLocalizationsPt extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Imported $count templates', - one: 'Imported 1 template', - zero: 'No templates imported', + other: '$count modelos importados', + one: '1 modelo importado', + zero: 'Nenhum modelo importado', ); return '$_temp0'; } @@ -1085,8 +1086,8 @@ class AppLocalizationsPt extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Exported $count templates to clipboard', - one: 'Exported 1 template to clipboard', + other: '$count modelos exportados para a área de transferência', + one: '1 modelo exportado para a área de transferência', ); return '$_temp0'; } @@ -1188,28 +1189,28 @@ class AppLocalizationsPt extends AppLocalizations { String get channel => 'Canal'; @override - String get samplePoliceLead => 'Police Lead'; + String get samplePoliceLead => 'Chefe da polícia'; @override - String get sampleDroneOperator => 'Drone Operator'; + String get sampleDroneOperator => 'Operador de drone'; @override - String get sampleFirefighterAlpha => 'Firefighter'; + String get sampleFirefighterAlpha => 'Bombeiro'; @override - String get sampleMedicCharlie => 'Medic'; + String get sampleMedicCharlie => 'Paramédico'; @override - String get sampleCommandDelta => 'Command'; + String get sampleCommandDelta => 'Comando'; @override - String get sampleFireEngine => 'Fire Engine'; + String get sampleFireEngine => 'Caminhão de bombeiros'; @override - String get sampleAirSupport => 'Air Support'; + String get sampleAirSupport => 'Apoio aéreo'; @override - String get sampleBaseCoordinator => 'Base Coordinator'; + String get sampleBaseCoordinator => 'Coordenador da base'; @override String get channelEmergency => 'Emergência'; @@ -1221,127 +1222,138 @@ class AppLocalizationsPt extends AppLocalizations { String get channelUpdates => 'Atualizações'; @override - String get sampleTeamMember => 'Sample Team Member'; + String get sampleTeamMember => 'Membro de equipe de exemplo'; @override - String get sampleScout => 'Sample Scout'; + String get sampleScout => 'Batedor de exemplo'; @override - String get sampleBase => 'Sample Base'; + String get sampleBase => 'Base de exemplo'; @override - String get sampleSearcher => 'Sample Searcher'; + String get sampleSearcher => 'Buscador de exemplo'; @override - String get sampleObjectBackpack => ' Backpack found - blue color'; + String get sampleObjectBackpack => ' Mochila encontrada - cor azul'; @override - String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + String get sampleObjectVehicle => + ' Veículo abandonado - verificar proprietário'; @override - String get sampleObjectCamping => ' Camping equipment discovered'; + String get sampleObjectCamping => ' Equipamento de camping encontrado'; @override - String get sampleObjectTrailMarker => ' Trail marker found off-path'; + String get sampleObjectTrailMarker => + ' Marco de trilha encontrado fora da rota'; @override - String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + String get sampleMsgAllTeamsCheckIn => 'Todas as equipes, façam check-in'; @override - String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + String get sampleMsgWeatherUpdate => + 'Atualização do tempo: céu limpo, temp. 18°C'; @override - String get sampleMsgBaseCamp => 'Base camp established at staging area'; + String get sampleMsgBaseCamp => 'Base estabelecida na área de apoio'; @override - String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + String get sampleMsgTeamAlpha => 'Equipe deslocando-se para o setor 2'; @override - String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + String get sampleMsgRadioCheck => + 'Teste de rádio - todas as estações respondam'; @override - String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + String get sampleMsgWaterSupply => + 'Abastecimento de água disponível no ponto de controle 3'; @override - String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + String get sampleMsgTeamBravo => 'Equipe informa: setor 1 livre'; @override - String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + String get sampleMsgEtaRallyPoint => + 'ETA para o ponto de reunião: 15 minutos'; @override - String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + String get sampleMsgSupplyDrop => + 'Entrega de suprimentos confirmada para 14:00'; @override - String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + String get sampleMsgDroneSurvey => + 'Levantamento com drone concluído - nada encontrado'; @override - String get sampleMsgTeamCharlie => 'Team requesting backup'; + String get sampleMsgTeamCharlie => 'Equipe solicitando reforço'; @override - String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + String get sampleMsgRadioDiscipline => + 'Todas as unidades: mantenham disciplina de rádio'; @override String get sampleMsgUrgentMedical => - 'URGENT: Medical assistance needed at sector 4'; + 'URGENTE: assistência médica necessária no setor 4'; @override - String get sampleMsgAdultMale => ' Adult male, conscious'; + String get sampleMsgAdultMale => ' Homem adulto, consciente'; @override - String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + String get sampleMsgFireSpotted => 'Incêndio avistado - coordenadas a seguir'; @override - String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + String get sampleMsgSpreadingRapidly => ' Se espalhando rapidamente!'; @override - String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + String get sampleMsgPriorityHelicopter => + 'PRIORIDADE: necessidade de apoio de helicóptero'; @override String get sampleMsgMedicalTeamEnRoute => - 'Medical team en route to your location'; + 'Equipe médica a caminho da sua localização'; @override - String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + String get sampleMsgEvacHelicopter => + 'ETA do helicóptero de evacuação: 10 minutos'; @override - String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + String get sampleMsgEmergencyResolved => 'Emergência resolvida - tudo limpo'; @override - String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + String get sampleMsgEmergencyStagingArea => ' Área de apoio de emergência'; @override String get sampleMsgEmergencyServices => - 'Emergency services notified and responding'; + 'Serviços de emergência notificados e em deslocamento'; @override - String get sampleAlphaTeamLead => 'Team Lead'; + String get sampleAlphaTeamLead => 'Líder da equipe'; @override - String get sampleBravoScout => 'Scout'; + String get sampleBravoScout => 'Batedor'; @override - String get sampleCharlieMedic => 'Medic'; + String get sampleCharlieMedic => 'Paramédico'; @override - String get sampleDeltaNavigator => 'Navigator'; + String get sampleDeltaNavigator => 'Navegador'; @override - String get sampleEchoSupport => 'Support'; + String get sampleEchoSupport => 'Apoio'; @override - String get sampleBaseCommand => 'Base Command'; + String get sampleBaseCommand => 'Comando da base'; @override - String get sampleFieldCoordinator => 'Field Coordinator'; + String get sampleFieldCoordinator => 'Coordenador de campo'; @override - String get sampleMedicalTeam => 'Medical Team'; + String get sampleMedicalTeam => 'Equipe médica'; @override String get mapDrawing => 'Desenho do mapa'; @override - String get navigateToDrawing => 'Navigate to Drawing'; + String get navigateToDrawing => 'Navegar até o desenho'; @override String get copyCoordinates => 'Copiar coordenadas'; @@ -1368,7 +1380,7 @@ class AppLocalizationsPt extends AppLocalizations { String get longitudeLabel => 'Longitude'; @override - String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + String get exampleCoordinates => 'Exemplo: 46.0569, 14.5058'; @override String get shareDrawing => 'Compartilhar desenho'; @@ -1393,7 +1405,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String yourDrawingsCount(int count) { - return 'Your Drawings ($count)'; + return 'Seus desenhos ($count)'; } @override @@ -1421,43 +1433,43 @@ class AppLocalizationsPt extends AppLocalizations { String get updateLater => 'Mais tarde'; @override - String get cadastralParcels => 'Cadastral Parcels'; + String get cadastralParcels => 'Parcelas cadastrais'; @override - String get forestRoads => 'Forest Roads'; + String get forestRoads => 'Estradas florestais'; @override - String get wmsOverlays => 'WMS Overlays'; + String get wmsOverlays => 'Sobreposições WMS'; @override - String get hikingTrails => 'Hiking Trails'; + String get hikingTrails => 'Trilhas de caminhada'; @override - String get mainRoads => 'Main Roads'; + String get mainRoads => 'Estradas principais'; @override - String get houseNumbers => 'House Numbers'; + String get houseNumbers => 'Números de porta'; @override - String get fireHazardZones => 'Fire Hazard Zones'; + String get fireHazardZones => 'Zonas de risco de incêndio'; @override - String get historicalFires => 'Historical Fires'; + String get historicalFires => 'Incêndios históricos'; @override - String get firebreaks => 'Firebreaks'; + String get firebreaks => 'Aceiros'; @override - String get krasFireZones => 'Kras Fire Zones'; + String get krasFireZones => 'Zonas de incêndio do Karst'; @override - String get placeNames => 'Place Names'; + String get placeNames => 'Topônimos'; @override - String get municipalityBorders => 'Municipality Borders'; + String get municipalityBorders => 'Limites municipais'; @override - String get topographicMap => 'Topographic Map 1:25000'; + String get topographicMap => 'Mapa topográfico 1:25000'; @override String get recentMessages => 'Mensagens recentes'; @@ -1479,28 +1491,29 @@ class AppLocalizationsPt extends AppLocalizations { @override String get channelSecretHelp => - 'This secret must be shared with all team members who need access to this channel'; + 'Este segredo deve ser compartilhado com todos os membros da equipe que precisam de acesso a este canal'; @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.'; + 'Canais hash (#team): o segredo é gerado automaticamente a partir do nome. Mesmo nome = mesmo canal em todos os dispositivos.\n\nCanais privados: use um segredo explícito. Somente quem tiver o segredo poderá entrar.'; @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.'; + 'Canal hash: o segredo será gerado automaticamente a partir do nome do canal. Qualquer pessoa usando o mesmo nome entrará no mesmo canal.'; @override String get channelNameRequired => 'O nome do canal é obrigatório'; @override - String get channelNameTooLong => 'Channel name must be 31 characters or less'; + String get channelNameTooLong => + 'O nome do canal deve ter no máximo 31 caracteres'; @override String get channelSecretRequired => 'O segredo do canal é obrigatório'; @override String get channelSecretTooLong => - 'Channel secret must be 32 characters or less'; + 'O segredo do canal deve ter no máximo 32 caracteres'; @override String get invalidAsciiCharacters => @@ -1519,7 +1532,7 @@ class AppLocalizationsPt extends AppLocalizations { @override String deleteChannelConfirmation(String channelName) { - return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + return 'Tem certeza de que deseja excluir o canal \"$channelName\"? Esta ação não pode ser desfeita.'; } @override @@ -1550,79 +1563,84 @@ class AppLocalizationsPt extends AppLocalizations { @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.'; + 'Uma poderosa ferramenta de comunicação off-grid para operações de busca e resgate. Conecte-se com sua equipe usando tecnologia de rádio mesh quando as redes tradicionais não estiverem disponíveis.'; @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.'; + 'Conecte seu smartphone a um dispositivo de rádio MeshCore via Bluetooth para começar a se comunicar off-grid.'; @override - String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + String get wizardConnectingFeature1 => + 'Procure dispositivos MeshCore próximos'; @override - String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + String get wizardConnectingFeature2 => + 'Emparelhe com seu rádio via Bluetooth'; @override String get wizardConnectingFeature3 => - 'Works completely offline - no internet required'; + 'Funciona totalmente offline - internet não é necessária'; @override String get wizardChannelTitle => 'Canais'; @override String get wizardChannelDescription => - 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + 'Transmita mensagens para todos em um canal, ideal para anúncios e coordenação de toda a equipe.'; @override String get wizardChannelFeature1 => - 'Public Channel for general team communication'; + 'Canal público para comunicação geral da equipe'; @override String get wizardChannelFeature2 => - 'Create custom channels for specific groups'; + 'Crie canais personalizados para grupos específicos'; @override String get wizardChannelFeature3 => - 'Messages are automatically relayed by the mesh'; + 'As mensagens são retransmitidas automaticamente pela malha'; @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.'; + 'Os membros da sua equipe aparecem automaticamente à medida que entram na rede mesh. Envie mensagens diretas ou veja a localização deles.'; @override - String get wizardContactsFeature1 => 'Contacts discovered automatically'; + String get wizardContactsFeature1 => 'Contatos descobertos automaticamente'; @override - String get wizardContactsFeature2 => 'Send private direct messages'; + String get wizardContactsFeature2 => 'Envie mensagens diretas privadas'; @override - String get wizardContactsFeature3 => 'View battery level and last seen time'; + String get wizardContactsFeature3 => + 'Veja o nível de bateria e o horário da última visualização'; @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.'; + 'Acompanhe sua equipe em tempo real e marque locais importantes para operações de busca e resgate.'; @override String get wizardMapFeature1 => - 'SAR markers for found persons, fires, and staging areas'; + 'Marcadores SAR para pessoas encontradas, incêndios e áreas de apoio'; @override - String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + String get wizardMapFeature2 => + 'Rastreamento GPS em tempo real dos membros da equipe'; @override - String get wizardMapFeature3 => 'Download offline maps for remote areas'; + String get wizardMapFeature3 => 'Baixe mapas offline para áreas remotas'; @override - String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + String get wizardMapFeature4 => + 'Desenhe formas e compartilhe informações táticas'; @override String get viewWelcomeTutorial => 'Ver tutorial de boas-vindas'; @@ -1632,12 +1650,12 @@ class AppLocalizationsPt extends AppLocalizations { @override String directMessagesInfo(int count) { - return 'Direct messages with ACKs. Sent to $count team members.'; + return 'Mensagens diretas com ACKs. Enviadas para $count membros da equipe.'; } @override String sarMarkerSentToContacts(int count) { - return 'SAR marker sent to $count contacts'; + return 'Marcador SAR enviado para $count contatos'; } @override @@ -1650,72 +1668,72 @@ class AppLocalizationsPt extends AppLocalizations { String get technicalDetails => 'Detalhes técnicos'; @override - String get messageTechnicalDetails => 'Message technical details'; + String get messageTechnicalDetails => 'Detalhes técnicos da mensagem'; @override - String get linkQuality => 'Link quality'; + String get linkQuality => 'Qualidade do link'; @override - String get delivery => 'Delivery'; + String get delivery => 'Entrega'; @override String get status => 'Status'; @override - String get expectedAckTag => 'Expected ACK tag'; + String get expectedAckTag => 'Tag ACK esperada'; @override - String get roundTrip => 'Round-trip'; + String get roundTrip => 'Ida e volta'; @override - String get retryAttempt => 'Retry attempt'; + String get retryAttempt => 'Tentativa de repetição'; @override - String get floodFallback => 'Flood fallback'; + String get floodFallback => 'Fallback de flooding'; @override - String get identity => 'Identity'; + String get identity => 'Identidade'; @override - String get messageId => 'Message ID'; + String get messageId => 'ID da mensagem'; @override - String get sender => 'Sender'; + String get sender => 'Remetente'; @override - String get senderKey => 'Sender key'; + String get senderKey => 'Chave do remetente'; @override - String get recipient => 'Recipient'; + String get recipient => 'Destinatário'; @override - String get recipientKey => 'Recipient key'; + String get recipientKey => 'Chave do destinatário'; @override String get voice => 'Voz'; @override - String get voiceId => 'Voice ID'; + String get voiceId => 'ID de voz'; @override String get envelope => 'Envelope'; @override - String get sessionProgress => 'Session progress'; + String get sessionProgress => 'Progresso da sessão'; @override String get complete => 'Concluído'; @override - String get rawDump => 'Raw dump'; + String get rawDump => 'Dump bruto'; @override String get cannotRetryMissingRecipient => - 'Cannot retry: recipient information missing'; + 'Não é possível repetir: faltam informações do destinatário'; @override String get voiceUnavailable => 'A voz não está disponível no momento'; @override - String get requestingVoice => 'Requesting voice'; + String get requestingVoice => 'Solicitando voz'; } diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 05f4526..1929f41 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -145,31 +145,31 @@ class AppLocalizationsTr extends AppLocalizations { String get appName => 'Uygulama adı'; @override - String get aboutMeshCoreSar => 'About MeshCore SAR'; + String get aboutMeshCoreSar => 'MeshCore SAR hakkında'; @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'; + 'Acil durum müdahale ekipleri için tasarlanmış bir Arama ve Kurtarma uygulaması. Özellikler:\n\n• Cihazdan cihaza iletişim için BLE mesh ağı\n• Birden çok katman seçeneğiyle çevrimdışı haritalar\n• Ekip üyelerinin gerçek zamanlı takibi\n• SAR taktik işaretleri (bulunan kişi, yangın, toplanma alanı)\n• Kişi yönetimi ve mesajlaşma\n• Pusula yönüyle GPS takibi\n• Çevrimdışı kullanım için harita karo önbelleği'; @override - String get technologiesUsed => 'Technologies Used:'; + String get technologiesUsed => 'Kullanılan teknolojiler:'; @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'; + '• Çok platformlu geliştirme için Flutter\n• Mesh ağı için BLE (Bluetooth Low Energy)\n• Haritalama için OpenStreetMap\n• Durum yönetimi için Provider\n• Yerel depolama için SharedPreferences'; @override String get moreInfo => 'Daha fazla bilgi'; @override - String get packageName => 'Package Name'; + String get packageName => 'Paket adı'; @override String get sampleData => 'Örnek veriler'; @override String get sampleDataDescription => - 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + 'Test için örnek kişiler, kanal mesajları ve SAR işaretleri yükleyin veya temizleyin'; @override String get loadSampleData => 'Örnek verileri yükle'; @@ -194,7 +194,7 @@ class AppLocalizationsTr extends AppLocalizations { int sarCount, int messageCount, ) { - return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + return '$teamCount ekip üyesi, $channelCount kanal, $sarCount SAR işareti, $messageCount mesaj yüklendi'; } @override @@ -207,16 +207,16 @@ class AppLocalizationsTr extends AppLocalizations { @override String get failedToStartBackgroundTracking => - 'Failed to start background tracking. Check permissions and BLE connection.'; + 'Arka plan takibi başlatılamadı. İzinleri ve BLE bağlantısını kontrol edin.'; @override String locationBroadcast(String latitude, String longitude) { - return 'Location broadcast: $latitude, $longitude'; + return 'Konum yayını: $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.'; + 'Ekranı olmayan cihazlar için varsayılan PIN 123456’dır. Eşleştirme sorunu mu yaşıyorsunuz? Sistem ayarlarından Bluetooth cihazını unutun.'; @override String get noMessagesYet => 'Henüz mesaj yok'; @@ -237,7 +237,7 @@ class AppLocalizationsTr extends AppLocalizations { String get refresh => 'Yenile'; @override - String get resetPath => 'Reset Path (Re-route)'; + String get resetPath => 'Yolu sıfırla (yeniden yönlendir)'; @override String get publicKeyCopied => 'Genel anahtar panoya kopyalandı'; @@ -314,14 +314,15 @@ class AppLocalizationsTr extends AppLocalizations { } @override - String get longPressForSecondPoint => 'Long press for second point'; + String get longPressForSecondPoint => 'İkinci nokta için uzun basın'; @override - String get longPressToStartMeasurement => 'Long press to set first point'; + String get longPressToStartMeasurement => + 'İlk noktayı ayarlamak için uzun basın'; @override String get longPressToStartNewMeasurement => - 'Long press to start new measurement'; + 'Yeni ölçüm başlatmak için uzun basın'; @override String get shareDrawings => 'Çizimleri paylaş'; @@ -330,21 +331,21 @@ class AppLocalizationsTr extends AppLocalizations { String get clearAllDrawings => 'Tüm çizimleri temizle'; @override - String get completeLine => 'Complete Line'; + String get completeLine => 'Çizgiyi tamamla'; @override String broadcastDrawingsToTeam(int count, String plural) { - return 'Broadcast $count drawing$plural to team'; + return '$count çizim$plural ekibe yayınla'; } @override String removeAllDrawings(int count, String plural) { - return 'Remove all $count drawing$plural'; + return 'Tüm $count çizim$plural kaldır'; } @override String deleteAllDrawingsConfirm(int count, String plural) { - return 'Delete all $count drawing$plural from the map?'; + return 'Haritadaki tüm $count çizim$plural silinsin mi?'; } @override @@ -352,7 +353,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String shareDrawingsCount(int count, String plural) { - return 'Share $count Drawing$plural'; + return '$count çizim$plural paylaş'; } @override @@ -381,7 +382,7 @@ class AppLocalizationsTr extends AppLocalizations { String get publicChannel => 'Genel kanal'; @override - String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + String get broadcastToAll => 'Yakındaki tüm düğümlere yayınla (geçici)'; @override String get storedPermanently => 'Odada kalıcı olarak saklanır'; @@ -409,11 +410,11 @@ class AppLocalizationsTr extends AppLocalizations { @override String get ephemeralBroadcastInfo => - 'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'; + 'Geçici: yalnızca havadan yayınlanır. Saklanmaz; düğümlerin çevrimiçi olması gerekir.'; @override String get persistentRoomInfo => - 'Persistent: Stored immutably in room. Synced automatically and preserved offline.'; + 'Kalıcı: odada değişmez şekilde saklanır. Otomatik olarak eşitlenir ve çevrimdışı korunur.'; @override String get location => 'Konum'; @@ -446,7 +447,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String lowAccuracyWarning(int accuracy) { - return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + return 'Konum doğruluğu ±${accuracy}m. Bu, SAR operasyonları için yeterince doğru olmayabilir.\n\nYine de devam edilsin mi?'; } @override @@ -454,7 +455,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get enterPasswordInfo => - 'Enter the password to access this room. The password will be saved for future use.'; + 'Bu odaya erişmek için parolayı girin. Parola daha sonra kullanılmak üzere kaydedilecektir.'; @override String get password => 'Parola'; @@ -470,14 +471,14 @@ class AppLocalizationsTr extends AppLocalizations { @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.'; + return 'Oda cihaza eklenemedi: $error\n\nOda henüz yayın yapmamış olabilir.\nYayın yapmasını beklemeyi deneyin.'; } @override String get direct => 'Doğrudan'; @override - String get flood => 'Flood'; + String get flood => 'Yayılım'; @override String get loggedIn => 'Giriş yapıldı'; @@ -490,7 +491,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String directPingTimeout(String name) { - return 'Direct ping timeout - retrying $name with flooding...'; + return 'Doğrudan ping zaman aşımına uğradı - $name flooding ile yeniden deneniyor...'; } @override @@ -500,7 +501,7 @@ class AppLocalizationsTr extends AppLocalizations { @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.'; + return '\"$name\" kişisini silmek istediğinizden emin misiniz?\n\nBu işlem kişiyi hem uygulamadan hem de bağlı radyo cihazından kaldıracaktır.'; } @override @@ -570,7 +571,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String pathResetInfo(String name) { - return 'Path reset for $name. Next message will find a new route.'; + return '$name için yol sıfırlandı. Sonraki mesaj yeni bir rota bulacak.'; } @override @@ -595,7 +596,7 @@ class AppLocalizationsTr extends AppLocalizations { String get filterMarkers => 'İşaretleri filtrele'; @override - String get filterMarkersTooltip => 'Filter markers'; + String get filterMarkersTooltip => 'İşaretleri filtrele'; @override String get contactsFilter => 'Kişiler'; @@ -636,7 +637,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String latLonFormat(String latitude, String longitude) { - return 'Lat: $latitude Lon: $longitude'; + return 'Enl: $latitude Boy: $longitude'; } @override @@ -699,22 +700,22 @@ class AppLocalizationsTr extends AppLocalizations { @override String get cannotReplySenderMissing => - 'Cannot reply: sender information missing'; + 'Yanıtlanamıyor: gönderen bilgisi eksik'; @override - String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + String get cannotReplyContactNotFound => 'Yanıtlanamıyor: kişi bulunamadı'; @override String get copyText => 'Metni kopyala'; @override - String get saveAsTemplate => 'Save as Template'; + String get saveAsTemplate => 'Şablon olarak kaydet'; @override - String get templateSaved => 'Template saved successfully'; + String get templateSaved => 'Şablon başarıyla kaydedildi'; @override - String get templateAlreadyExists => 'Template with this emoji already exists'; + String get templateAlreadyExists => 'Bu emoji ile bir şablon zaten var'; @override String get deleteMessage => 'Mesajı sil'; @@ -733,7 +734,7 @@ class AppLocalizationsTr extends AppLocalizations { String lon, String url, ) { - return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + return '$markerInfo\n\nKoordinatlar: $lat, $lon\n\nGoogle Maps: $url'; } @override @@ -784,29 +785,29 @@ class AppLocalizationsTr extends AppLocalizations { @override String deliveredToContacts(int delivered, int total) { - return 'Delivered to $delivered/$total contacts'; + return '$delivered/$total kişiye teslim edildi'; } @override - String get allDelivered => 'All delivered'; + String get allDelivered => 'Hepsi teslim edildi'; @override - String get recipientDetails => 'Recipient Details'; + String get recipientDetails => 'Alıcı ayrıntıları'; @override String get pending => 'Bekliyor'; @override - String get sarMarkerFoundPerson => 'Found Person'; + String get sarMarkerFoundPerson => 'Bulunan kişi'; @override - String get sarMarkerFire => 'Fire Location'; + String get sarMarkerFire => 'Yangın konumu'; @override - String get sarMarkerStagingArea => 'Staging Area'; + String get sarMarkerStagingArea => 'Toplanma alanı'; @override - String get sarMarkerObject => 'Object Found'; + String get sarMarkerObject => 'Bulunan nesne'; @override String get from => 'Kimden'; @@ -824,7 +825,7 @@ class AppLocalizationsTr extends AppLocalizations { String get frequencyMHz => 'Frekans (MHz)'; @override - String get frequencyExample => 'e.g., 869.618'; + String get frequencyExample => 'örn. 869.618'; @override String get bandwidth => 'Bant genişliği'; @@ -888,7 +889,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get clearTrailConfirmation => - 'Are you sure you want to clear the current location trail? This action cannot be undone.'; + 'Geçerli konum izini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.'; @override String get noTrailRecorded => 'Henüz iz kaydedilmedi'; @@ -911,11 +912,11 @@ class AppLocalizationsTr extends AppLocalizations { @override String showingTrailsForContacts(int count) { - return 'Showing trails for $count contacts'; + return '$count kişi için izler gösteriliyor'; } @override - String get individualContactTrails => 'Individual Contact Trails'; + String get individualContactTrails => 'Tek tek kişi izleri'; @override String get deviceInformation => 'Cihaz bilgileri'; @@ -954,7 +955,7 @@ class AppLocalizationsTr extends AppLocalizations { String get meshNetworkName => 'Mesh ağ adı'; @override - String get nameBroadcastInMesh => 'Name broadcast in mesh advertisements'; + String get nameBroadcastInMesh => 'Mesh duyurularında yayınlanan ad'; @override String get telemetryAndLocationSharing => 'Telemetri ve konum paylaşımı'; @@ -982,12 +983,12 @@ class AppLocalizationsTr extends AppLocalizations { @override String typeNumber(int number) { - return 'Type $number'; + return 'Tür $number'; } @override String copiedToClipboardShort(String label) { - return 'Copied $label to clipboard'; + return '$label panoya kopyalandı'; } @override @@ -1004,7 +1005,7 @@ class AppLocalizationsTr extends AppLocalizations { String get sarTemplates => 'SAR şablonları'; @override - String get manageSarTemplates => 'Manage cursor on target templates'; + String get manageSarTemplates => 'SAR şablonlarını yönet'; @override String get addTemplate => 'Şablon ekle'; @@ -1067,9 +1068,9 @@ class AppLocalizationsTr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Imported $count templates', - one: 'Imported 1 template', - zero: 'No templates imported', + other: '$count şablon içe aktarıldı', + one: '1 şablon içe aktarıldı', + zero: 'Şablon içe aktarılmadı', ); return '$_temp0'; } @@ -1079,8 +1080,8 @@ class AppLocalizationsTr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Exported $count templates to clipboard', - one: 'Exported 1 template to clipboard', + other: '$count şablon panoya aktarıldı', + one: '1 şablon panoya aktarıldı', ); return '$_temp0'; } @@ -1090,7 +1091,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get resetToDefaultsConfirmation => - 'This will delete all custom templates and restore the 4 default templates. Continue?'; + 'Bu işlem tüm özel şablonları silecek ve 4 varsayılan şablonu geri yükleyecek. Devam edilsin mi?'; @override String get reset => 'Sıfırla'; @@ -1134,7 +1135,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get locationPermissionDialogContent => - 'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'; + 'Konum izni kalıcı olarak reddedildi. GPS takibi ve konum paylaşımını kullanmak için lütfen cihaz ayarlarından etkinleştirin.'; @override String get openSettings => 'Ayarları aç'; @@ -1150,16 +1151,16 @@ class AppLocalizationsTr extends AppLocalizations { String get locationPermissionAlreadyGranted => 'Konum izni zaten verilmiş.'; @override - String get sarNavyBlue => 'SAR Navy Blue'; + String get sarNavyBlue => 'SAR Lacivert'; @override - String get sarNavyBlueDescription => 'Professional/Operations Mode'; + String get sarNavyBlueDescription => 'Profesyonel/Operasyon modu'; @override String get selectRecipient => 'Alıcı seç'; @override - String get broadcastToAllNearby => 'Broadcast to all nearby'; + String get broadcastToAllNearby => 'Yakındaki herkese yayınla'; @override String get searchRecipients => 'Alıcı ara...'; @@ -1183,28 +1184,28 @@ class AppLocalizationsTr extends AppLocalizations { String get channel => 'Kanal'; @override - String get samplePoliceLead => 'Police Lead'; + String get samplePoliceLead => 'Polis lideri'; @override - String get sampleDroneOperator => 'Drone Operator'; + String get sampleDroneOperator => 'Drone operatörü'; @override - String get sampleFirefighterAlpha => 'Firefighter'; + String get sampleFirefighterAlpha => 'İtfaiyeci'; @override - String get sampleMedicCharlie => 'Medic'; + String get sampleMedicCharlie => 'Sağlık görevlisi'; @override - String get sampleCommandDelta => 'Command'; + String get sampleCommandDelta => 'Komuta'; @override - String get sampleFireEngine => 'Fire Engine'; + String get sampleFireEngine => 'İtfaiye aracı'; @override - String get sampleAirSupport => 'Air Support'; + String get sampleAirSupport => 'Hava desteği'; @override - String get sampleBaseCoordinator => 'Base Coordinator'; + String get sampleBaseCoordinator => 'Üs koordinatörü'; @override String get channelEmergency => 'Acil durum'; @@ -1216,127 +1217,131 @@ class AppLocalizationsTr extends AppLocalizations { String get channelUpdates => 'Güncellemeler'; @override - String get sampleTeamMember => 'Sample Team Member'; + String get sampleTeamMember => 'Örnek ekip üyesi'; @override - String get sampleScout => 'Sample Scout'; + String get sampleScout => 'Örnek keşifçi'; @override - String get sampleBase => 'Sample Base'; + String get sampleBase => 'Örnek üs'; @override - String get sampleSearcher => 'Sample Searcher'; + String get sampleSearcher => 'Örnek arayıcı'; @override - String get sampleObjectBackpack => ' Backpack found - blue color'; + String get sampleObjectBackpack => ' Sırt çantası bulundu - mavi renk'; @override - String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + String get sampleObjectVehicle => ' Terk edilmiş araç - sahibi kontrol edin'; @override - String get sampleObjectCamping => ' Camping equipment discovered'; + String get sampleObjectCamping => ' Kamp ekipmanı bulundu'; @override - String get sampleObjectTrailMarker => ' Trail marker found off-path'; + String get sampleObjectTrailMarker => ' Yol dışında patika işareti bulundu'; @override - String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + String get sampleMsgAllTeamsCheckIn => 'Tüm ekipler durum bildirimi yapsın'; @override - String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + String get sampleMsgWeatherUpdate => + 'Hava durumu: açık gökyüzü, sıcaklık 18°C'; @override - String get sampleMsgBaseCamp => 'Base camp established at staging area'; + String get sampleMsgBaseCamp => 'Üs kampı toplanma alanında kuruldu'; @override - String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + String get sampleMsgTeamAlpha => 'Ekip sektör 2’ye ilerliyor'; @override - String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + String get sampleMsgRadioCheck => + 'Telsiz kontrolü - tüm istasyonlar yanıt versin'; @override - String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + String get sampleMsgWaterSupply => + 'Su ikmali 3 numaralı kontrol noktasında mevcut'; @override - String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + String get sampleMsgTeamBravo => 'Ekip raporu: sektör 1 temiz'; @override - String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + String get sampleMsgEtaRallyPoint => + 'Toplanma noktasına tahmini varış: 15 dakika'; @override - String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + String get sampleMsgSupplyDrop => 'İkmal bırakma 14:00 için onaylandı'; @override - String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + String get sampleMsgDroneSurvey => 'Drone taraması tamamlandı - bulgu yok'; @override - String get sampleMsgTeamCharlie => 'Team requesting backup'; + String get sampleMsgTeamCharlie => 'Ekip takviye istiyor'; @override - String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + String get sampleMsgRadioDiscipline => + 'Tüm birimler: telsiz disiplinini koruyun'; @override - String get sampleMsgUrgentMedical => - 'URGENT: Medical assistance needed at sector 4'; + String get sampleMsgUrgentMedical => 'ACİL: sektör 4’te tıbbi yardım gerekli'; @override - String get sampleMsgAdultMale => ' Adult male, conscious'; + String get sampleMsgAdultMale => ' Yetişkin erkek, bilinci açık'; @override - String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + String get sampleMsgFireSpotted => 'Yangın görüldü - koordinatlar geliyor'; @override - String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + String get sampleMsgSpreadingRapidly => ' Hızla yayılıyor!'; @override - String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + String get sampleMsgPriorityHelicopter => + 'ÖNCELİK: helikopter desteği gerekli'; @override - String get sampleMsgMedicalTeamEnRoute => - 'Medical team en route to your location'; + String get sampleMsgMedicalTeamEnRoute => 'Tıbbi ekip konumunuza geliyor'; @override - String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + String get sampleMsgEvacHelicopter => 'Tahliye helikopteri ETA 10 dakika'; @override - String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + String get sampleMsgEmergencyResolved => 'Acil durum çözüldü - tehlike yok'; @override - String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + String get sampleMsgEmergencyStagingArea => ' Acil durum toplanma alanı'; @override String get sampleMsgEmergencyServices => - 'Emergency services notified and responding'; + 'Acil servisler bilgilendirildi ve müdahale ediyor'; @override - String get sampleAlphaTeamLead => 'Team Lead'; + String get sampleAlphaTeamLead => 'Ekip lideri'; @override - String get sampleBravoScout => 'Scout'; + String get sampleBravoScout => 'Keşifçi'; @override - String get sampleCharlieMedic => 'Medic'; + String get sampleCharlieMedic => 'Sağlık görevlisi'; @override - String get sampleDeltaNavigator => 'Navigator'; + String get sampleDeltaNavigator => 'Navigatör'; @override - String get sampleEchoSupport => 'Support'; + String get sampleEchoSupport => 'Destek'; @override - String get sampleBaseCommand => 'Base Command'; + String get sampleBaseCommand => 'Üs komutası'; @override - String get sampleFieldCoordinator => 'Field Coordinator'; + String get sampleFieldCoordinator => 'Saha koordinatörü'; @override - String get sampleMedicalTeam => 'Medical Team'; + String get sampleMedicalTeam => 'Tıbbi ekip'; @override String get mapDrawing => 'Harita çizimi'; @override - String get navigateToDrawing => 'Navigate to Drawing'; + String get navigateToDrawing => 'Çizime git'; @override String get copyCoordinates => 'Koordinatları kopyala'; @@ -1363,7 +1368,7 @@ class AppLocalizationsTr extends AppLocalizations { String get longitudeLabel => 'Boylam'; @override - String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + String get exampleCoordinates => 'Örnek: 46.0569, 14.5058'; @override String get shareDrawing => 'Çizimi paylaş'; @@ -1379,14 +1384,14 @@ class AppLocalizationsTr extends AppLocalizations { @override String get deleteDrawingConfirm => - 'Are you sure you want to delete this drawing?'; + 'Bu çizimi silmek istediğinizden emin misiniz?'; @override String get drawingDeleted => 'Çizim silindi'; @override String yourDrawingsCount(int count) { - return 'Your Drawings ($count)'; + return 'Çizimleriniz ($count)'; } @override @@ -1414,43 +1419,43 @@ class AppLocalizationsTr extends AppLocalizations { String get updateLater => 'Daha sonra'; @override - String get cadastralParcels => 'Cadastral Parcels'; + String get cadastralParcels => 'Kadastro parselleri'; @override - String get forestRoads => 'Forest Roads'; + String get forestRoads => 'Orman yolları'; @override - String get wmsOverlays => 'WMS Overlays'; + String get wmsOverlays => 'WMS katmanları'; @override - String get hikingTrails => 'Hiking Trails'; + String get hikingTrails => 'Yürüyüş parkurları'; @override - String get mainRoads => 'Main Roads'; + String get mainRoads => 'Ana yollar'; @override - String get houseNumbers => 'House Numbers'; + String get houseNumbers => 'Kapı numaraları'; @override - String get fireHazardZones => 'Fire Hazard Zones'; + String get fireHazardZones => 'Yangın tehlike bölgeleri'; @override - String get historicalFires => 'Historical Fires'; + String get historicalFires => 'Geçmiş yangınlar'; @override - String get firebreaks => 'Firebreaks'; + String get firebreaks => 'Yangın şeritleri'; @override - String get krasFireZones => 'Kras Fire Zones'; + String get krasFireZones => 'Kras yangın bölgeleri'; @override - String get placeNames => 'Place Names'; + String get placeNames => 'Yer adları'; @override - String get municipalityBorders => 'Municipality Borders'; + String get municipalityBorders => 'Belediye sınırları'; @override - String get topographicMap => 'Topographic Map 1:25000'; + String get topographicMap => 'Topoğrafik harita 1:25000'; @override String get recentMessages => 'Son mesajlar'; @@ -1472,28 +1477,28 @@ class AppLocalizationsTr extends AppLocalizations { @override String get channelSecretHelp => - 'This secret must be shared with all team members who need access to this channel'; + 'Bu sır, bu kanala erişmesi gereken tüm ekip üyeleriyle paylaşılmalıdır'; @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.'; + 'Hash kanallar (#team): sır, isimden otomatik üretilir. Aynı isim = tüm cihazlarda aynı kanal.\n\nÖzel kanallar: açık bir sır kullanın. Yalnızca sırrı bilenler katılabilir.'; @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.'; + 'Hash kanal: sır kanal adından otomatik üretilecektir. Aynı adı kullanan herkes aynı kanala katılır.'; @override String get channelNameRequired => 'Kanal adı gerekli'; @override - String get channelNameTooLong => 'Channel name must be 31 characters or less'; + String get channelNameTooLong => 'Kanal adı en fazla 31 karakter olabilir'; @override String get channelSecretRequired => 'Kanal sırrı gerekli'; @override String get channelSecretTooLong => - 'Channel secret must be 32 characters or less'; + 'Kanal sırrı en fazla 32 karakter olabilir'; @override String get invalidAsciiCharacters => @@ -1512,7 +1517,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String deleteChannelConfirmation(String channelName) { - return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + return '\"$channelName\" kanalını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.'; } @override @@ -1543,79 +1548,83 @@ class AppLocalizationsTr extends AppLocalizations { @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.'; + 'Arama ve kurtarma operasyonları için güçlü bir şebeke dışı iletişim aracı. Geleneksel ağlar kullanılamadığında ekibinizle mesh radyo teknolojisi üzerinden bağlantı kurun.'; @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.'; + 'Şebeke dışı iletişime başlamak için akıllı telefonunuzu Bluetooth üzerinden bir MeshCore radyo cihazına bağlayın.'; @override - String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + String get wizardConnectingFeature1 => + 'Yakındaki MeshCore cihazlarını tarayın'; @override - String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + String get wizardConnectingFeature2 => + 'Radyonuzla Bluetooth üzerinden eşleşin'; @override String get wizardConnectingFeature3 => - 'Works completely offline - no internet required'; + 'Tamamen çevrimdışı çalışır - internet gerekmez'; @override String get wizardChannelTitle => 'Kanallar'; @override String get wizardChannelDescription => - 'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'; + 'Bir kanaldaki herkese mesaj yayınlayın; ekip genelindeki duyurular ve koordinasyon için idealdir.'; @override String get wizardChannelFeature1 => - 'Public Channel for general team communication'; + 'Genel ekip iletişimi için herkese açık kanal'; @override String get wizardChannelFeature2 => - 'Create custom channels for specific groups'; + 'Belirli gruplar için özel kanallar oluşturun'; @override String get wizardChannelFeature3 => - 'Messages are automatically relayed by the mesh'; + 'Mesajlar mesh tarafından otomatik iletilir'; @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.'; + 'Ekip üyeleriniz mesh ağına katıldıkça otomatik olarak görünür. Onlara doğrudan mesaj gönderin veya konumlarını görüntüleyin.'; @override - String get wizardContactsFeature1 => 'Contacts discovered automatically'; + String get wizardContactsFeature1 => 'Kişiler otomatik bulunur'; @override - String get wizardContactsFeature2 => 'Send private direct messages'; + String get wizardContactsFeature2 => 'Özel doğrudan mesaj gönderin'; @override - String get wizardContactsFeature3 => 'View battery level and last seen time'; + String get wizardContactsFeature3 => + 'Pil seviyesini ve son görülme zamanını görüntüleyin'; @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.'; + 'Ekibinizi gerçek zamanlı izleyin ve arama kurtarma operasyonları için önemli konumları işaretleyin.'; @override String get wizardMapFeature1 => - 'SAR markers for found persons, fires, and staging areas'; + 'Bulunan kişiler, yangınlar ve toplanma alanları için SAR işaretleri'; @override - String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + String get wizardMapFeature2 => 'Ekip üyelerinin gerçek zamanlı GPS takibi'; @override - String get wizardMapFeature3 => 'Download offline maps for remote areas'; + String get wizardMapFeature3 => + 'Uzak bölgeler için çevrimdışı haritalar indirin'; @override - String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + String get wizardMapFeature4 => 'Şekiller çizin ve taktik bilgileri paylaşın'; @override String get viewWelcomeTutorial => 'Karşılama eğitimini görüntüle'; @@ -1625,12 +1634,12 @@ class AppLocalizationsTr extends AppLocalizations { @override String directMessagesInfo(int count) { - return 'Direct messages with ACKs. Sent to $count team members.'; + return 'ACK’li doğrudan mesajlar. $count ekip üyesine gönderildi.'; } @override String sarMarkerSentToContacts(int count) { - return 'SAR marker sent to $count contacts'; + return 'SAR işareti $count kişiye gönderildi'; } @override @@ -1643,72 +1652,72 @@ class AppLocalizationsTr extends AppLocalizations { String get technicalDetails => 'Teknik ayrıntılar'; @override - String get messageTechnicalDetails => 'Message technical details'; + String get messageTechnicalDetails => 'Mesaj teknik ayrıntıları'; @override - String get linkQuality => 'Link quality'; + String get linkQuality => 'Bağlantı kalitesi'; @override - String get delivery => 'Delivery'; + String get delivery => 'Teslimat'; @override String get status => 'Durum'; @override - String get expectedAckTag => 'Expected ACK tag'; + String get expectedAckTag => 'Beklenen ACK etiketi'; @override - String get roundTrip => 'Round-trip'; + String get roundTrip => 'Gidiş dönüş'; @override - String get retryAttempt => 'Retry attempt'; + String get retryAttempt => 'Yeniden deneme sayısı'; @override - String get floodFallback => 'Flood fallback'; + String get floodFallback => 'Flood yedeği'; @override - String get identity => 'Identity'; + String get identity => 'Kimlik'; @override - String get messageId => 'Message ID'; + String get messageId => 'Mesaj kimliği'; @override - String get sender => 'Sender'; + String get sender => 'Gönderen'; @override - String get senderKey => 'Sender key'; + String get senderKey => 'Gönderen anahtarı'; @override - String get recipient => 'Recipient'; + String get recipient => 'Alıcı'; @override - String get recipientKey => 'Recipient key'; + String get recipientKey => 'Alıcı anahtarı'; @override String get voice => 'Ses'; @override - String get voiceId => 'Voice ID'; + String get voiceId => 'Ses kimliği'; @override - String get envelope => 'Envelope'; + String get envelope => 'Zarf'; @override - String get sessionProgress => 'Session progress'; + String get sessionProgress => 'Oturum ilerlemesi'; @override String get complete => 'Tamamlandı'; @override - String get rawDump => 'Raw dump'; + String get rawDump => 'Ham döküm'; @override String get cannotRetryMissingRecipient => - 'Cannot retry: recipient information missing'; + 'Yeniden denenemiyor: alıcı bilgisi eksik'; @override String get voiceUnavailable => 'Ses şu anda kullanılamıyor'; @override - String get requestingVoice => 'Requesting voice'; + String get requestingVoice => 'Ses isteniyor'; } diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index d8b66a5..2c44003 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -46,11 +46,11 @@ class AppLocalizationsUk extends AppLocalizations { @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.'; + 'Для GPS-відстеження та координації команди потрібен дозвіл на геолокацію. Ви можете ввімкнути його пізніше в Налаштуваннях.'; @override String get locationServicesDisabled => @@ -61,7 +61,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String failedToAdvertise(String error) { - return 'Failed to advertise: $error'; + return 'Не вдалося транслювати: $error'; } @override @@ -83,42 +83,42 @@ class AppLocalizationsUk extends AppLocalizations { String get dark => 'Темна'; @override - String get blueLightTheme => 'Blue light theme'; + String get blueLightTheme => 'Світло-синя тема'; @override - String get blueDarkTheme => 'Blue dark theme'; + String get blueDarkTheme => 'Темно-синя тема'; @override - String get sarRed => 'SAR Red'; + String get sarRed => 'SAR Червоний'; @override - String get alertEmergencyMode => 'Alert/Emergency mode'; + String get alertEmergencyMode => 'Режим тривоги/надзвичайної ситуації'; @override - String get sarGreen => 'SAR Green'; + String get sarGreen => 'SAR Зелений'; @override - String get safeAllClearMode => 'Safe/All Clear mode'; + String get safeAllClearMode => 'Безпечний режим/усе чисто'; @override - String get autoSystem => 'Auto (System)'; + String get autoSystem => 'Авто (система)'; @override - String get followSystemTheme => 'Follow system theme'; + String get followSystemTheme => 'Слідувати системній темі'; @override - String get showRxTxIndicators => 'Show RX/TX Indicators'; + String get showRxTxIndicators => 'Показувати індикатори RX/TX'; @override String get displayPacketActivity => - 'Display packet activity indicators in top bar'; + 'Показувати індикатори активності пакетів у верхній панелі'; @override - String get disableMap => 'Disable Map'; + String get disableMap => 'Вимкнути мапу'; @override String get disableMapDescription => - 'Hide the map tab to reduce battery usage'; + 'Приховати вкладку мапи для зменшення споживання батареї'; @override String get language => 'Мова'; @@ -139,37 +139,37 @@ class AppLocalizationsUk extends AppLocalizations { String get about => 'Про програму'; @override - String get appVersion => 'App Version'; + String get appVersion => 'Версія застосунку'; @override - String get appName => 'App Name'; + String get appName => 'Назва застосунку'; @override - String get aboutMeshCoreSar => 'About MeshCore SAR'; + String get aboutMeshCoreSar => 'Про 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'; + 'Застосунок для пошуку та рятування, створений для команд екстреного реагування. Можливості:\n\n• BLE mesh-мережа для зв’язку між пристроями\n• Офлайн-мапи з кількома шарами\n• Відстеження членів команди в реальному часі\n• Тактичні маркери SAR (знайдена людина, пожежа, зона збору)\n• Керування контактами та повідомленнями\n• GPS-відстеження з компасом\n• Кешування тайлів мапи для офлайн-використання'; @override - String get technologiesUsed => 'Technologies Used:'; + String get technologiesUsed => 'Використані технології:'; @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'; + '• Flutter для кросплатформної розробки\n• BLE (Bluetooth Low Energy) для mesh-мережі\n• OpenStreetMap для мап\n• Provider для керування станом\n• SharedPreferences для локального зберігання'; @override - String get moreInfo => 'More Info'; + String get moreInfo => 'Більше інформації'; @override - String get packageName => 'Package Name'; + String get packageName => 'Назва пакета'; @override String get sampleData => 'Тестові дані'; @override String get sampleDataDescription => - 'Load or clear sample contacts, channel messages, and SAR markers for testing'; + 'Завантажити або очистити тестові контакти, повідомлення каналів і маркери SAR для перевірки'; @override String get loadSampleData => 'Завантажити тестові дані'; @@ -178,11 +178,11 @@ class AppLocalizationsUk extends AppLocalizations { String get clearAllData => 'Очистити всі дані'; @override - String get clearAllDataConfirmTitle => 'Clear All Data'; + String get clearAllDataConfirmTitle => 'Очистити всі дані'; @override String get clearAllDataConfirmMessage => - 'This will clear all contacts and SAR markers. Are you sure?'; + 'Це очистить усі контакти та маркери SAR. Ви впевнені?'; @override String get clear => 'Очистити'; @@ -194,29 +194,29 @@ class AppLocalizationsUk extends AppLocalizations { int sarCount, int messageCount, ) { - return 'Loaded $teamCount team members, $channelCount channels, $sarCount SAR markers, $messageCount messages'; + return 'Завантажено $teamCount членів команди, $channelCount каналів, $sarCount маркерів SAR, $messageCount повідомлень'; } @override String failedToLoadSampleData(String error) { - return 'Failed to load sample data: $error'; + return 'Не вдалося завантажити тестові дані: $error'; } @override - String get allDataCleared => 'All data cleared'; + String get allDataCleared => 'Усі дані очищено'; @override String get failedToStartBackgroundTracking => - 'Failed to start background tracking. Check permissions and BLE connection.'; + 'Не вдалося запустити фонове відстеження. Перевірте дозволи та BLE-з’єднання.'; @override String locationBroadcast(String latitude, String longitude) { - return 'Location broadcast: $latitude, $longitude'; + return 'Трансляція місцезнаходження: $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.'; + 'Стандартний PIN для пристроїв без екрана - 123456. Проблеми зі сполученням? Видаліть Bluetooth-пристрій у системних налаштуваннях.'; @override String get noMessagesYet => 'Повідомлень ще немає'; @@ -238,14 +238,14 @@ class AppLocalizationsUk extends AppLocalizations { String get refresh => 'Оновити'; @override - String get resetPath => 'Reset Path (Re-route)'; + String get resetPath => 'Скинути маршрут (побудувати заново)'; @override - String get publicKeyCopied => 'Public key copied to clipboard'; + String get publicKeyCopied => 'Публічний ключ скопійовано в буфер обміну'; @override String copiedToClipboard(String label) { - return '$label copied to clipboard'; + return '$label скопійовано в буфер обміну'; } @override @@ -253,7 +253,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String failedToSyncContacts(String error) { - return 'Failed to sync contacts: $error'; + return 'Не вдалося синхронізувати контакти: $error'; } @override @@ -270,7 +270,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String failedToSendLogin(String error) { - return 'Failed to send login: $error'; + return 'Не вдалося надіслати вхід: $error'; } @override @@ -292,37 +292,38 @@ class AppLocalizationsUk extends AppLocalizations { String get drawLine => 'Намалювати лінію'; @override - String get drawLineDesc => 'Draw a freehand line on the map'; + String get drawLineDesc => 'Намалювати довільну лінію на мапі'; @override String get drawRectangle => 'Намалювати прямокутник'; @override - String get drawRectangleDesc => 'Draw a rectangular area on the map'; + String get drawRectangleDesc => 'Намалювати прямокутну область на мапі'; @override String get measureDistance => 'Виміряти відстань'; @override - String get measureDistanceDesc => 'Long press two points to measure'; + String get measureDistanceDesc => 'Затисніть дві точки, щоб виміряти'; @override String get clearMeasurement => 'Очистити вимірювання'; @override String distanceLabel(String distance) { - return 'Distance: $distance'; + return 'Відстань: $distance'; } @override - String get longPressForSecondPoint => 'Long press for second point'; + String get longPressForSecondPoint => 'Затисніть для другої точки'; @override - String get longPressToStartMeasurement => 'Long press to set first point'; + String get longPressToStartMeasurement => + 'Затисніть, щоб встановити першу точку'; @override String get longPressToStartNewMeasurement => - 'Long press to start new measurement'; + 'Затисніть, щоб почати нове вимірювання'; @override String get shareDrawings => 'Поділитися рисунками'; @@ -331,21 +332,21 @@ class AppLocalizationsUk extends AppLocalizations { String get clearAllDrawings => 'Очистити всі рисунки'; @override - String get completeLine => 'Complete Line'; + String get completeLine => 'Завершити лінію'; @override String broadcastDrawingsToTeam(int count, String plural) { - return 'Broadcast $count drawing$plural to team'; + return 'Транслювати $count рисунок$plural команді'; } @override String removeAllDrawings(int count, String plural) { - return 'Remove all $count drawing$plural'; + return 'Видалити всі $count рисунок$plural'; } @override String deleteAllDrawingsConfirm(int count, String plural) { - return 'Delete all $count drawing$plural from the map?'; + return 'Видалити всі $count рисунок$plural з мапи?'; } @override @@ -353,26 +354,26 @@ class AppLocalizationsUk extends AppLocalizations { @override String shareDrawingsCount(int count, String plural) { - return 'Share $count Drawing$plural'; + return 'Поділитися $count рисунок$plural'; } @override String get showReceivedDrawings => 'Показати отримані рисунки'; @override - String get showingAllDrawings => 'Showing all drawings'; + String get showingAllDrawings => 'Показуються всі рисунки'; @override - String get showingOnlyYourDrawings => 'Showing only your drawings'; + String get showingOnlyYourDrawings => 'Показуються лише ваші рисунки'; @override String get showSarMarkers => 'Показати маркери SAR'; @override - String get showingSarMarkers => 'Showing SAR markers'; + String get showingSarMarkers => 'Показуються маркери SAR'; @override - String get hidingSarMarkers => 'Hiding SAR markers'; + String get hidingSarMarkers => 'Приховування маркерів SAR'; @override String get clearAll => 'Очистити все'; @@ -381,10 +382,10 @@ class AppLocalizationsUk extends AppLocalizations { String get publicChannel => 'Публічний канал'; @override - String get broadcastToAll => 'Broadcast to all nearby nodes (ephemeral)'; + String get broadcastToAll => 'Транслювати всім сусіднім вузлам (тимчасово)'; @override - String get storedPermanently => 'Stored permanently in room'; + String get storedPermanently => 'Постійно збережено в кімнаті'; @override String get notConnectedToDevice => 'Не підключено до пристрою'; @@ -402,24 +403,24 @@ class AppLocalizationsUk extends AppLocalizations { String get sendTo => 'Надіслати до'; @override - String get noDestinationsAvailable => 'No destinations available.'; + String get noDestinationsAvailable => 'Немає доступних отримувачів.'; @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'; + String get fromMap => 'З мапи'; @override String get gettingLocation => 'Отримання місцезнаходження...'; @@ -435,18 +436,18 @@ class AppLocalizationsUk extends AppLocalizations { @override String accuracyMeters(int accuracy) { - return 'Accuracy: ±${accuracy}m'; + return 'Точність: ±$accuracyм'; } @override String get notesOptional => 'Нотатки (необов’язково)'; @override - String get addAdditionalInformation => 'Add additional information...'; + String get addAdditionalInformation => 'Додайте додаткову інформацію...'; @override String lowAccuracyWarning(int accuracy) { - return 'Location accuracy is ±${accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'; + return 'Точність місцезнаходження становить ±$accuracyм. Це може бути недостатньо точно для операцій SAR.\n\nПродовжити все одно?'; } @override @@ -454,7 +455,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get enterPasswordInfo => - 'Enter the password to access this room. The password will be saved for future use.'; + 'Введіть пароль для доступу до цієї кімнати. Пароль буде збережено для подальшого використання.'; @override String get password => 'Пароль'; @@ -470,14 +471,14 @@ class AppLocalizationsUk extends AppLocalizations { @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.'; + return 'Не вдалося додати кімнату до пристрою: $error\n\nМожливо, кімната ще не почала трансляцію.\nСпробуйте зачекати, поки вона почне транслюватися.'; } @override String get direct => 'Напряму'; @override - String get flood => 'Flood'; + String get flood => 'Широкомовно'; @override String get loggedIn => 'Увійшли'; @@ -490,22 +491,22 @@ class AppLocalizationsUk extends AppLocalizations { @override String directPingTimeout(String name) { - return 'Direct ping timeout - retrying $name with flooding...'; + return 'Час очікування прямого ping вичерпано - повторна спроба для $name через flooding...'; } @override String pingFailed(String name) { - return 'Ping failed to $name - no response received'; + return 'Ping до $name не вдався - відповіді не отримано'; } @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.'; + return 'Ви впевнені, що хочете видалити \"$name\"?\n\nЦе видалить контакт і з застосунку, і з пов’язаного радіопристрою.'; } @override String failedToRemoveContact(String error) { - return 'Failed to remove contact: $error'; + return 'Не вдалося видалити контакт: $error'; } @override @@ -527,7 +528,7 @@ class AppLocalizationsUk extends AppLocalizations { String get notLoggedIn => 'Не увійшли'; @override - String get adminAccess => 'Admin Access'; + String get adminAccess => 'Доступ адміністратора'; @override String get yes => 'Так'; @@ -539,10 +540,10 @@ class AppLocalizationsUk extends AppLocalizations { String get permissions => 'Дозволи'; @override - String get passwordSaved => 'Password Saved'; + String get passwordSaved => 'Пароль збережено'; @override - String get locationColon => 'Location:'; + String get locationColon => 'Місцезнаходження:'; @override String get telemetry => 'Телеметрія'; @@ -563,18 +564,18 @@ class AppLocalizationsUk extends AppLocalizations { String get pressure => 'Тиск'; @override - String get gpsTelemetry => 'GPS (Telemetry)'; + String get gpsTelemetry => 'GPS (телеметрія)'; @override String get updated => 'Оновлено'; @override String pathResetInfo(String name) { - return 'Path reset for $name. Next message will find a new route.'; + return 'Маршрут для $name скинуто. Наступне повідомлення знайде новий маршрут.'; } @override - String get reLoginToRoom => 'Re-Login to Room'; + String get reLoginToRoom => 'Повторно увійти до кімнати'; @override String get heading => 'Напрямок'; @@ -595,7 +596,7 @@ class AppLocalizationsUk extends AppLocalizations { String get filterMarkers => 'Фільтрувати маркери'; @override - String get filterMarkersTooltip => 'Filter markers'; + String get filterMarkersTooltip => 'Фільтрувати маркери'; @override String get contactsFilter => 'Контакти'; @@ -622,21 +623,21 @@ class AppLocalizationsUk extends AppLocalizations { String get locationUnavailable => 'Місцезнаходження недоступне'; @override - String get ahead => 'ahead'; + String get ahead => 'попереду'; @override String degreesRight(int degrees) { - return '$degrees° right'; + return '$degrees° праворуч'; } @override String degreesLeft(int degrees) { - return '$degrees° left'; + return '$degrees° ліворуч'; } @override String latLonFormat(String latitude, String longitude) { - return 'Lat: $latitude Lon: $longitude'; + return 'Шир.: $latitude Довг.: $longitude'; } @override @@ -644,7 +645,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get connectToDeviceToLoadContacts => - 'Connect to a device to load contacts'; + 'Підключіться до пристрою, щоб завантажити контакти'; @override String get teamMembers => 'Члени команди'; @@ -680,7 +681,7 @@ class AppLocalizationsUk extends AppLocalizations { String get googleTerrain => 'Google Рельєф'; @override - String get dragToPosition => 'Drag to Position'; + String get dragToPosition => 'Перетягніть у позицію'; @override String get createSarMarker => 'Створити маркер SAR'; @@ -689,39 +690,40 @@ class AppLocalizationsUk extends AppLocalizations { String get compass => 'Компас'; @override - String get navigationAndContacts => 'Navigation & Contacts'; + String get navigationAndContacts => 'Навігація та контакти'; @override String get sarAlert => 'ТРИВОГА SAR'; @override - String get textCopiedToClipboard => 'Text copied to clipboard'; + String get textCopiedToClipboard => 'Текст скопійовано в буфер обміну'; @override String get cannotReplySenderMissing => - 'Cannot reply: sender information missing'; + 'Неможливо відповісти: відсутня інформація про відправника'; @override - String get cannotReplyContactNotFound => 'Cannot reply: contact not found'; + String get cannotReplyContactNotFound => + 'Неможливо відповісти: контакт не знайдено'; @override String get copyText => 'Копіювати текст'; @override - String get saveAsTemplate => 'Save as Template'; + String get saveAsTemplate => 'Зберегти як шаблон'; @override - String get templateSaved => 'Template saved successfully'; + String get templateSaved => 'Шаблон успішно збережено'; @override - String get templateAlreadyExists => 'Template with this emoji already exists'; + String get templateAlreadyExists => 'Шаблон із цим emoji уже існує'; @override String get deleteMessage => 'Видалити повідомлення'; @override String get deleteMessageConfirmation => - 'Are you sure you want to delete this message?'; + 'Ви впевнені, що хочете видалити це повідомлення?'; @override String get shareLocation => 'Поділитися місцезнаходженням'; @@ -733,11 +735,11 @@ class AppLocalizationsUk extends AppLocalizations { String lon, String url, ) { - return '$markerInfo\n\nCoordinates: $lat, $lon\n\nGoogle Maps: $url'; + return '$markerInfo\n\nКоординати: $lat, $lon\n\nGoogle Maps: $url'; } @override - String get sarLocationShare => 'SAR Location'; + String get sarLocationShare => 'Місцезнаходження SAR'; @override String get justNow => 'Щойно'; @@ -773,7 +775,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String deliveredWithTime(int time) { - return 'Delivered (${time}ms)'; + return 'Доставлено (${time}ms)'; } @override @@ -784,29 +786,29 @@ class AppLocalizationsUk extends AppLocalizations { @override String deliveredToContacts(int delivered, int total) { - return 'Delivered to $delivered/$total contacts'; + return 'Доставлено $delivered/$total контактам'; } @override - String get allDelivered => 'All delivered'; + String get allDelivered => 'Усе доставлено'; @override - String get recipientDetails => 'Recipient Details'; + String get recipientDetails => 'Деталі отримувача'; @override String get pending => 'Очікує'; @override - String get sarMarkerFoundPerson => 'Found Person'; + String get sarMarkerFoundPerson => 'Знайдена людина'; @override - String get sarMarkerFire => 'Fire Location'; + String get sarMarkerFire => 'Місце пожежі'; @override - String get sarMarkerStagingArea => 'Staging Area'; + String get sarMarkerStagingArea => 'Зона збору'; @override - String get sarMarkerObject => 'Object Found'; + String get sarMarkerObject => 'Знайдений об’єкт'; @override String get from => 'Від'; @@ -824,7 +826,7 @@ class AppLocalizationsUk extends AppLocalizations { String get frequencyMHz => 'Частота (MHz)'; @override - String get frequencyExample => 'e.g., 869.618'; + String get frequencyExample => 'напр., 869.618'; @override String get bandwidth => 'Ширина смуги'; @@ -869,10 +871,10 @@ class AppLocalizationsUk extends AppLocalizations { String get showTrailOnMap => 'Показати слід на мапі'; @override - String get trailVisible => 'Trail is visible on the map'; + String get trailVisible => 'Слід видно на мапі'; @override - String get trailHiddenRecording => 'Trail is hidden (still recording)'; + String get trailHiddenRecording => 'Слід прихований (запис триває)'; @override String get duration => 'Тривалість'; @@ -884,18 +886,18 @@ class AppLocalizationsUk extends AppLocalizations { String get clearTrail => 'Очистити слід'; @override - String get clearTrailQuestion => 'Clear Trail?'; + String get clearTrailQuestion => 'Очистити слід?'; @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 => 'Керування слідом'; @@ -904,19 +906,19 @@ class AppLocalizationsUk extends AppLocalizations { String get contactTrails => 'Сліди контактів'; @override - String get showAllContactTrails => 'Show All Contact Trails'; + String get showAllContactTrails => 'Показати всі сліди контактів'; @override String get noContactsWithLocationHistory => - 'No contacts with location history'; + 'Немає контактів з історією місцезнаходження'; @override String showingTrailsForContacts(int count) { - return 'Showing trails for $count contacts'; + return 'Показуються сліди для $count контактів'; } @override - String get individualContactTrails => 'Individual Contact Trails'; + String get individualContactTrails => 'Окремі сліди контактів'; @override String get deviceInformation => 'Інформація про пристрій'; @@ -949,16 +951,17 @@ class AppLocalizationsUk extends AppLocalizations { String get maxChannels => 'Макс. каналів'; @override - String get publicInfo => 'Public Info'; + String get publicInfo => 'Публічна інформація'; @override - String get meshNetworkName => 'Mesh Network Name'; + String get meshNetworkName => 'Назва mesh-мережі'; @override - String get nameBroadcastInMesh => 'Name broadcast in mesh advertisements'; + String get nameBroadcastInMesh => 'Ім’я, що транслюється в mesh-оголошеннях'; @override - String get telemetryAndLocationSharing => 'Telemetry & Location Sharing'; + String get telemetryAndLocationSharing => + 'Телеметрія та поширення місцезнаходження'; @override String get lat => 'Шир.'; @@ -970,42 +973,42 @@ class AppLocalizationsUk extends AppLocalizations { String get useCurrentLocation => 'Використати поточне місцезнаходження'; @override - String get noneUnknown => 'None/Unknown'; + String get noneUnknown => 'Немає/Невідомо'; @override - String get chatNode => 'Chat Node'; + String get chatNode => 'Вузол чату'; @override String get repeater => 'Ретранслятор'; @override - String get roomChannel => 'Room/Channel'; + String get roomChannel => 'Кімната/Канал'; @override String typeNumber(int number) { - return 'Type $number'; + return 'Тип $number'; } @override String copiedToClipboardShort(String label) { - return 'Copied $label to clipboard'; + return '$label скопійовано в буфер обміну'; } @override String failedToSave(String error) { - return 'Failed to save: $error'; + return 'Не вдалося зберегти: $error'; } @override String failedToGetLocation(String error) { - return 'Failed to get location: $error'; + return 'Не вдалося отримати місцезнаходження: $error'; } @override String get sarTemplates => 'Шаблони SAR'; @override - String get manageSarTemplates => 'Manage cursor on target templates'; + String get manageSarTemplates => 'Керувати шаблонами SAR'; @override String get addTemplate => 'Додати шаблон'; @@ -1051,7 +1054,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String deleteTemplateConfirmation(String name) { - return 'Delete template \'$name\'?'; + return 'Видалити шаблон \"$name\"?'; } @override @@ -1068,9 +1071,9 @@ class AppLocalizationsUk extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Imported $count templates', - one: 'Imported 1 template', - zero: 'No templates imported', + other: 'Імпортовано $count шаблонів', + one: 'Імпортовано 1 шаблон', + zero: 'Шаблони не імпортовано', ); return '$_temp0'; } @@ -1080,8 +1083,8 @@ class AppLocalizationsUk extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Exported $count templates to clipboard', - one: 'Exported 1 template to clipboard', + other: 'Експортовано $count шаблонів у буфер обміну', + one: 'Експортовано 1 шаблон у буфер обміну', ); return '$_temp0'; } @@ -1091,13 +1094,13 @@ class AppLocalizationsUk extends AppLocalizations { @override String get resetToDefaultsConfirmation => - 'This will delete all custom templates and restore the 4 default templates. Continue?'; + 'Це видалить усі користувацькі шаблони та відновить 4 стандартні шаблони. Продовжити?'; @override String get reset => 'Скинути'; @override - String get resetComplete => 'Templates reset to defaults'; + String get resetComplete => 'Шаблони скинуто до стандартних'; @override String get noTemplates => 'Немає доступних шаблонів'; @@ -1118,21 +1121,23 @@ class AppLocalizationsUk extends AppLocalizations { String get checking => 'Перевірка...'; @override - String get locationPermissionGrantedAlways => 'Granted (Always)'; + String get locationPermissionGrantedAlways => 'Надано (Завжди)'; @override - String get locationPermissionGrantedWhileInUse => 'Granted (While In Use)'; + String get locationPermissionGrantedWhileInUse => + 'Надано (Під час використання)'; @override - String get locationPermissionDeniedTapToRequest => 'Denied - Tap to request'; + String get locationPermissionDeniedTapToRequest => + 'Відхилено - торкніться, щоб запросити'; @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.'; + 'Дозвіл на геолокацію назавжди відхилено. Увімкніть його в налаштуваннях пристрою, щоб використовувати GPS та поширення місцезнаходження.'; @override String get openSettings => 'Відкрити налаштування'; @@ -1142,23 +1147,23 @@ class AppLocalizationsUk extends AppLocalizations { @override String get locationPermissionRequiredForGps => - 'Location permission is required for GPS tracking and location sharing.'; + 'Для GPS-відстеження та поширення місцезнаходження потрібен дозвіл на геолокацію.'; @override String get locationPermissionAlreadyGranted => - 'Location permission is already granted.'; + 'Дозвіл на геолокацію вже надано.'; @override - String get sarNavyBlue => 'SAR Navy Blue'; + String get sarNavyBlue => 'SAR Темно-синій'; @override - String get sarNavyBlueDescription => 'Professional/Operations Mode'; + String get sarNavyBlueDescription => 'Професійний/операційний режим'; @override String get selectRecipient => 'Вибрати отримувача'; @override - String get broadcastToAllNearby => 'Broadcast to all nearby'; + String get broadcastToAllNearby => 'Транслювати всім поблизу'; @override String get searchRecipients => 'Пошук отримувачів...'; @@ -1182,28 +1187,28 @@ class AppLocalizationsUk extends AppLocalizations { String get channel => 'Канал'; @override - String get samplePoliceLead => 'Police Lead'; + String get samplePoliceLead => 'Керівник поліції'; @override - String get sampleDroneOperator => 'Drone Operator'; + String get sampleDroneOperator => 'Оператор дрона'; @override - String get sampleFirefighterAlpha => 'Firefighter'; + String get sampleFirefighterAlpha => 'Пожежник'; @override - String get sampleMedicCharlie => 'Medic'; + String get sampleMedicCharlie => 'Медик'; @override - String get sampleCommandDelta => 'Command'; + String get sampleCommandDelta => 'Командування'; @override - String get sampleFireEngine => 'Fire Engine'; + String get sampleFireEngine => 'Пожежна машина'; @override - String get sampleAirSupport => 'Air Support'; + String get sampleAirSupport => 'Повітряна підтримка'; @override - String get sampleBaseCoordinator => 'Base Coordinator'; + String get sampleBaseCoordinator => 'Координатор бази'; @override String get channelEmergency => 'Надзвичайна ситуація'; @@ -1215,127 +1220,138 @@ class AppLocalizationsUk extends AppLocalizations { String get channelUpdates => 'Оновлення'; @override - String get sampleTeamMember => 'Sample Team Member'; + String get sampleTeamMember => 'Тестовий член команди'; @override - String get sampleScout => 'Sample Scout'; + String get sampleScout => 'Тестовий розвідник'; @override - String get sampleBase => 'Sample Base'; + String get sampleBase => 'Тестова база'; @override - String get sampleSearcher => 'Sample Searcher'; + String get sampleSearcher => 'Тестовий пошуковець'; @override - String get sampleObjectBackpack => ' Backpack found - blue color'; + String get sampleObjectBackpack => ' Знайдено рюкзак - синього кольору'; @override - String get sampleObjectVehicle => ' Vehicle abandoned - check for owner'; + String get sampleObjectVehicle => + ' Покинутий транспорт - перевірити власника'; @override - String get sampleObjectCamping => ' Camping equipment discovered'; + String get sampleObjectCamping => ' Знайдено туристичне спорядження'; @override - String get sampleObjectTrailMarker => ' Trail marker found off-path'; + String get sampleObjectTrailMarker => + ' Знайдено маркер стежки поза маршрутом'; @override - String get sampleMsgAllTeamsCheckIn => 'All teams check in'; + String get sampleMsgAllTeamsCheckIn => 'Усі команди - дайте відмітку'; @override - String get sampleMsgWeatherUpdate => 'Weather update: Clear skies, temp 18°C'; + String get sampleMsgWeatherUpdate => + 'Оновлення погоди: ясно, температура 18°C'; @override - String get sampleMsgBaseCamp => 'Base camp established at staging area'; + String get sampleMsgBaseCamp => 'Базовий табір розгорнуто в зоні збору'; @override - String get sampleMsgTeamAlpha => 'Team moving to sector 2'; + String get sampleMsgTeamAlpha => 'Команда рухається до сектора 2'; @override - String get sampleMsgRadioCheck => 'Radio check - all stations respond'; + String get sampleMsgRadioCheck => + 'Перевірка радіо - усім станціям відповісти'; @override - String get sampleMsgWaterSupply => 'Water supply available at checkpoint 3'; + String get sampleMsgWaterSupply => + 'Запас води доступний на контрольній точці 3'; @override - String get sampleMsgTeamBravo => 'Team reporting: sector 1 clear'; + String get sampleMsgTeamBravo => 'Команда доповідає: сектор 1 чистий'; @override - String get sampleMsgEtaRallyPoint => 'ETA to rally point: 15 minutes'; + String get sampleMsgEtaRallyPoint => + 'Орієнтовний час до точки збору: 15 хвилин'; @override - String get sampleMsgSupplyDrop => 'Supply drop confirmed for 14:00'; + String get sampleMsgSupplyDrop => 'Скидання постачання підтверджено на 14:00'; @override - String get sampleMsgDroneSurvey => 'Drone survey completed - no findings'; + String get sampleMsgDroneSurvey => + 'Обстеження дроном завершено - результатів немає'; @override - String get sampleMsgTeamCharlie => 'Team requesting backup'; + String get sampleMsgTeamCharlie => 'Команда просить підкріплення'; @override - String get sampleMsgRadioDiscipline => 'All units: maintain radio discipline'; + String get sampleMsgRadioDiscipline => + 'Усім підрозділам: дотримуйтеся радіодисципліни'; @override String get sampleMsgUrgentMedical => - 'URGENT: Medical assistance needed at sector 4'; + 'ТЕРМІНОВО: потрібна медична допомога в секторі 4'; @override - String get sampleMsgAdultMale => ' Adult male, conscious'; + String get sampleMsgAdultMale => ' Дорослий чоловік, при свідомості'; @override - String get sampleMsgFireSpotted => 'Fire spotted - coordinates incoming'; + String get sampleMsgFireSpotted => 'Помічено пожежу - координати надходять'; @override - String get sampleMsgSpreadingRapidly => ' Spreading rapidly!'; + String get sampleMsgSpreadingRapidly => ' Швидко поширюється!'; @override - String get sampleMsgPriorityHelicopter => 'PRIORITY: Need helicopter support'; + String get sampleMsgPriorityHelicopter => + 'ПРІОРИТЕТ: потрібна підтримка гелікоптера'; @override String get sampleMsgMedicalTeamEnRoute => - 'Medical team en route to your location'; + 'Медична команда прямує до вашого місця'; @override - String get sampleMsgEvacHelicopter => 'Evac helicopter ETA 10 minutes'; + String get sampleMsgEvacHelicopter => + 'ETA евакуаційного гелікоптера 10 хвилин'; @override - String get sampleMsgEmergencyResolved => 'Emergency resolved - all clear'; + String get sampleMsgEmergencyResolved => + 'Надзвичайну ситуацію вирішено - все чисто'; @override - String get sampleMsgEmergencyStagingArea => ' Emergency staging area'; + String get sampleMsgEmergencyStagingArea => ' Аварійна зона збору'; @override String get sampleMsgEmergencyServices => - 'Emergency services notified and responding'; + 'Екстрені служби повідомлені та вже реагують'; @override - String get sampleAlphaTeamLead => 'Team Lead'; + String get sampleAlphaTeamLead => 'Керівник команди'; @override - String get sampleBravoScout => 'Scout'; + String get sampleBravoScout => 'Розвідник'; @override - String get sampleCharlieMedic => 'Medic'; + String get sampleCharlieMedic => 'Медик'; @override - String get sampleDeltaNavigator => 'Navigator'; + String get sampleDeltaNavigator => 'Навігатор'; @override - String get sampleEchoSupport => 'Support'; + String get sampleEchoSupport => 'Підтримка'; @override - String get sampleBaseCommand => 'Base Command'; + String get sampleBaseCommand => 'Командування бази'; @override - String get sampleFieldCoordinator => 'Field Coordinator'; + String get sampleFieldCoordinator => 'Польовий координатор'; @override - String get sampleMedicalTeam => 'Medical Team'; + String get sampleMedicalTeam => 'Медична команда'; @override String get mapDrawing => 'Рисунок на мапі'; @override - String get navigateToDrawing => 'Navigate to Drawing'; + String get navigateToDrawing => 'Перейти до рисунка'; @override String get copyCoordinates => 'Копіювати координати'; @@ -1362,34 +1378,35 @@ class AppLocalizationsUk extends AppLocalizations { String get longitudeLabel => 'Довгота'; @override - String get exampleCoordinates => 'Example: 46.0569, 14.5058'; + String get exampleCoordinates => 'Приклад: 46.0569, 14.5058'; @override String get shareDrawing => 'Поділитися рисунком'; @override - String get shareWithAllNearbyDevices => 'Share with all nearby devices'; + String get shareWithAllNearbyDevices => + 'Поділитися з усіма пристроями поблизу'; @override - String get shareToRoom => 'Share to Room'; + String get shareToRoom => 'Поділитися в кімнату'; @override - String get sendToPersistentStorage => 'Send to persistent room storage'; + String get sendToPersistentStorage => 'Надіслати в постійне сховище кімнати'; @override String get deleteDrawingConfirm => - 'Are you sure you want to delete this drawing?'; + 'Ви впевнені, що хочете видалити цей рисунок?'; @override - String get drawingDeleted => 'Drawing deleted'; + String get drawingDeleted => 'Рисунок видалено'; @override String yourDrawingsCount(int count) { - return 'Your Drawings ($count)'; + return 'Ваші рисунки ($count)'; } @override - String get shared => 'Shared'; + String get shared => 'Спільний'; @override String get line => 'Лінія'; @@ -1413,43 +1430,43 @@ class AppLocalizationsUk extends AppLocalizations { String get updateLater => 'Пізніше'; @override - String get cadastralParcels => 'Cadastral Parcels'; + String get cadastralParcels => 'Кадастрові ділянки'; @override - String get forestRoads => 'Forest Roads'; + String get forestRoads => 'Лісові дороги'; @override - String get wmsOverlays => 'WMS Overlays'; + String get wmsOverlays => 'Накладки WMS'; @override - String get hikingTrails => 'Hiking Trails'; + String get hikingTrails => 'Пішохідні стежки'; @override - String get mainRoads => 'Main Roads'; + String get mainRoads => 'Основні дороги'; @override - String get houseNumbers => 'House Numbers'; + String get houseNumbers => 'Номери будинків'; @override - String get fireHazardZones => 'Fire Hazard Zones'; + String get fireHazardZones => 'Зони пожежної небезпеки'; @override - String get historicalFires => 'Historical Fires'; + String get historicalFires => 'Історичні пожежі'; @override - String get firebreaks => 'Firebreaks'; + String get firebreaks => 'Протипожежні смуги'; @override - String get krasFireZones => 'Kras Fire Zones'; + String get krasFireZones => 'Пожежні зони Красу'; @override - String get placeNames => 'Place Names'; + String get placeNames => 'Назви місць'; @override - String get municipalityBorders => 'Municipality Borders'; + String get municipalityBorders => 'Межі громад'; @override - String get topographicMap => 'Topographic Map 1:25000'; + String get topographicMap => 'Топографічна мапа 1:25000'; @override String get recentMessages => 'Останні повідомлення'; @@ -1471,54 +1488,55 @@ class AppLocalizationsUk extends AppLocalizations { @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.'; + 'Hash-канали (#team): секрет автоматично генерується з назви. Однакова назва = той самий канал на всіх пристроях.\n\nПриватні канали: використовуйте явний секрет. Приєднатися можуть лише ті, хто його знає.'; @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.'; + 'Hash-канал: секрет буде автоматично згенерований з назви каналу. Кожен, хто використовує ту саму назву, приєднається до того самого каналу.'; @override - String get channelNameRequired => 'Channel name is required'; + String get channelNameRequired => 'Назва каналу обов’язкова'; @override - String get channelNameTooLong => 'Channel name must be 31 characters or less'; + String get channelNameTooLong => + 'Назва каналу має бути не довшою за 31 символ'; @override - String get channelSecretRequired => 'Channel secret is required'; + String get channelSecretRequired => 'Секрет каналу обов’язковий'; @override String get channelSecretTooLong => - 'Channel secret must be 32 characters or less'; + 'Секрет каналу має бути не довшим за 32 символи'; @override - String get invalidAsciiCharacters => 'Only ASCII characters are allowed'; + String get invalidAsciiCharacters => 'Дозволені лише символи ASCII'; @override - String get channelCreatedSuccessfully => 'Channel created successfully'; + String get channelCreatedSuccessfully => 'Канал успішно створено'; @override String channelCreationFailed(String error) { - return 'Failed to create channel: $error'; + return 'Не вдалося створити канал: $error'; } @override - String get deleteChannel => 'Delete Channel'; + String get deleteChannel => 'Видалити канал'; @override String deleteChannelConfirmation(String channelName) { - return 'Are you sure you want to delete channel \"$channelName\"? This action cannot be undone.'; + return 'Ви впевнені, що хочете видалити канал \"$channelName\"? Цю дію не можна скасувати.'; } @override - String get channelDeletedSuccessfully => 'Channel deleted successfully'; + String get channelDeletedSuccessfully => 'Канал успішно видалено'; @override String channelDeletionFailed(String error) { - return 'Failed to delete channel: $error'; + return 'Не вдалося видалити канал: $error'; } @override @@ -1541,79 +1559,84 @@ class AppLocalizationsUk extends AppLocalizations { @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.'; + 'Потужний інструмент офлайн-комунікації для операцій пошуку та рятування. Зв’язуйтеся зі своєю командою за допомогою mesh-радіо, коли традиційні мережі недоступні.'; @override String get wizardConnectingTitle => 'Підключення до радіо'; @override String get wizardConnectingDescription => - 'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'; + 'Підключіть смартфон до радіопристрою MeshCore через Bluetooth, щоб почати спілкування поза мережею.'; @override - String get wizardConnectingFeature1 => 'Scan for nearby MeshCore devices'; + String get wizardConnectingFeature1 => 'Скануйте сусідні пристрої MeshCore'; @override - String get wizardConnectingFeature2 => 'Pair with your radio via Bluetooth'; + String get wizardConnectingFeature2 => + 'Сполучіть свій радіопристрій через 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'; + 'Повідомлення автоматично ретранслюються 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.'; + 'Члени вашої команди з’являються автоматично, коли приєднуються до mesh-мережі. Надсилайте їм прямі повідомлення або переглядайте їхнє місцезнаходження.'; @override - String get wizardContactsFeature1 => 'Contacts discovered automatically'; + String get wizardContactsFeature1 => 'Контакти виявляються автоматично'; @override - String get wizardContactsFeature2 => 'Send private direct messages'; + String get wizardContactsFeature2 => 'Надсилайте приватні прямі повідомлення'; @override - String get wizardContactsFeature3 => 'View battery level and last seen time'; + String get wizardContactsFeature3 => + 'Переглядайте рівень батареї та час останньої появи'; @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'; + 'Маркери SAR для знайдених людей, пожеж і зон збору'; @override - String get wizardMapFeature2 => 'Real-time GPS tracking of team members'; + String get wizardMapFeature2 => + 'GPS-відстеження членів команди в реальному часі'; @override - String get wizardMapFeature3 => 'Download offline maps for remote areas'; + String get wizardMapFeature3 => + 'Завантажуйте офлайн-мапи для віддалених районів'; @override - String get wizardMapFeature4 => 'Draw shapes and share tactical information'; + String get wizardMapFeature4 => + 'Малюйте фігури та діліться тактичною інформацією'; @override String get viewWelcomeTutorial => 'Переглянути вступний посібник'; @@ -1623,12 +1646,12 @@ class AppLocalizationsUk extends AppLocalizations { @override String directMessagesInfo(int count) { - return 'Direct messages with ACKs. Sent to $count team members.'; + return 'Прямі повідомлення з ACK. Надіслано $count членам команди.'; } @override String sarMarkerSentToContacts(int count) { - return 'SAR marker sent to $count contacts'; + return 'Маркер SAR надіслано $count контактам'; } @override @@ -1641,72 +1664,72 @@ class AppLocalizationsUk extends AppLocalizations { String get technicalDetails => 'Технічні деталі'; @override - String get messageTechnicalDetails => 'Message technical details'; + String get messageTechnicalDetails => 'Технічні деталі повідомлення'; @override - String get linkQuality => 'Link quality'; + String get linkQuality => 'Якість зв’язку'; @override - String get delivery => 'Delivery'; + String get delivery => 'Доставка'; @override String get status => 'Статус'; @override - String get expectedAckTag => 'Expected ACK tag'; + String get expectedAckTag => 'Очікуваний тег ACK'; @override - String get roundTrip => 'Round-trip'; + String get roundTrip => 'Час в обидва боки'; @override - String get retryAttempt => 'Retry attempt'; + String get retryAttempt => 'Спроба повтору'; @override - String get floodFallback => 'Flood fallback'; + String get floodFallback => 'Резервний flooding'; @override - String get identity => 'Identity'; + String get identity => 'Ідентичність'; @override - String get messageId => 'Message ID'; + String get messageId => 'ID повідомлення'; @override - String get sender => 'Sender'; + String get sender => 'Відправник'; @override - String get senderKey => 'Sender key'; + String get senderKey => 'Ключ відправника'; @override - String get recipient => 'Recipient'; + String get recipient => 'Отримувач'; @override - String get recipientKey => 'Recipient key'; + String get recipientKey => 'Ключ отримувача'; @override String get voice => 'Голос'; @override - String get voiceId => 'Voice ID'; + String get voiceId => 'ID голосу'; @override - String get envelope => 'Envelope'; + String get envelope => 'Конверт'; @override - String get sessionProgress => 'Session progress'; + String get sessionProgress => 'Прогрес сеансу'; @override String get complete => 'Завершено'; @override - String get rawDump => 'Raw dump'; + String get rawDump => 'Сирий дамп'; @override String get cannotRetryMissingRecipient => - 'Cannot retry: recipient information missing'; + 'Неможливо повторити: відсутня інформація про отримувача'; @override String get voiceUnavailable => 'Голос зараз недоступний'; @override - String get requestingVoice => 'Requesting voice'; + String get requestingVoice => 'Запит голосу'; } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 020f931..ab80d13 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -48,11 +48,11 @@ "@locationPermissionDenied": { "description": "Error when location permission is denied" }, - "locationPermissionPermanentlyDenied": "Location permission permanently denied. Please enable in Settings.", + "locationPermissionPermanentlyDenied": "Dostęp do lokalizacji został trwale zablokowany. Włącz go w Ustawieniach.", "@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": "Dostęp do lokalizacji jest wymagany do śledzenia GPS i koordynacji zespołu. Możesz go włączyć później w Ustawieniach.", "@locationPermissionRequired": { "description": "Message when location permission is needed" }, @@ -64,7 +64,7 @@ "@failedToGetGpsLocation": { "description": "Error when GPS location cannot be obtained" }, - "failedToAdvertise": "Failed to advertise: {error}", + "failedToAdvertise": "Nie udało się rozgłosić: {error}", "@failedToAdvertise": { "description": "Error message for failed advertisement", "placeholders": { @@ -97,51 +97,51 @@ "@dark": { "description": "Dark theme option" }, - "blueLightTheme": "Blue light theme", + "blueLightTheme": "Niebieski jasny motyw", "@blueLightTheme": { "description": "Description for blue light theme" }, - "blueDarkTheme": "Blue dark theme", + "blueDarkTheme": "Niebieski ciemny motyw", "@blueDarkTheme": { "description": "Description for blue dark theme" }, - "sarRed": "SAR Red", + "sarRed": "SAR Czerwony", "@sarRed": { "description": "SAR Red theme option" }, - "alertEmergencyMode": "Alert/Emergency mode", + "alertEmergencyMode": "Tryb alarmowy/awaryjny", "@alertEmergencyMode": { "description": "Description for SAR Red theme" }, - "sarGreen": "SAR Green", + "sarGreen": "SAR Zielony", "@sarGreen": { "description": "SAR Green theme option" }, - "safeAllClearMode": "Safe/All Clear mode", + "safeAllClearMode": "Tryb bezpieczny/wszystko jasne", "@safeAllClearMode": { "description": "Description for SAR Green theme" }, - "autoSystem": "Auto (System)", + "autoSystem": "Automatyczny (system)", "@autoSystem": { "description": "Auto/System theme option" }, - "followSystemTheme": "Follow system theme", + "followSystemTheme": "Dopasuj do motywu systemowego", "@followSystemTheme": { "description": "Description for system theme" }, - "showRxTxIndicators": "Show RX/TX Indicators", + "showRxTxIndicators": "Pokaż wskaźniki RX/TX", "@showRxTxIndicators": { "description": "Setting to show RX/TX indicators" }, - "displayPacketActivity": "Display packet activity indicators in top bar", + "displayPacketActivity": "Wyświetlaj wskaźniki aktywności pakietów na górnym pasku", "@displayPacketActivity": { "description": "Description for RX/TX indicators setting" }, - "disableMap": "Disable Map", + "disableMap": "Wyłącz mapę", "@disableMap": { "description": "Setting to disable the map tab" }, - "disableMapDescription": "Hide the map tab to reduce battery usage", + "disableMapDescription": "Ukryj kartę mapy, aby zmniejszyć zużycie baterii", "@disableMapDescription": { "description": "Description for disable map setting" }, @@ -169,35 +169,35 @@ "@about": { "description": "About section header" }, - "appVersion": "App Version", + "appVersion": "Wersja aplikacji", "@appVersion": { "description": "App version label" }, - "appName": "App Name", + "appName": "Nazwa aplikacji", "@appName": { "description": "App name label" }, - "aboutMeshCoreSar": "About MeshCore SAR", + "aboutMeshCoreSar": "O 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": "Aplikacja poszukiwawczo-ratownicza zaprojektowana dla zespołów reagowania kryzysowego. Funkcje obejmują:\n\n• Sieć BLE mesh do komunikacji urządzenie-urządzenie\n• Mapy offline z wieloma warstwami\n• Śledzenie członków zespołu w czasie rzeczywistym\n• Taktyczne znaczniki SAR (odnaleziona osoba, pożar, strefa zbiórki)\n• Zarządzanie kontaktami i wiadomościami\n• Śledzenie GPS z kompasem\n• Buforowanie kafelków mapy do użytku offline", "@aboutDescription": { "description": "About dialog description" }, - "technologiesUsed": "Technologies Used:", + "technologiesUsed": "Użyte technologie:", "@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": "• Flutter do rozwoju wieloplatformowego\n• BLE (Bluetooth Low Energy) do sieci mesh\n• OpenStreetMap do map\n• Provider do zarządzania stanem\n• SharedPreferences do pamięci lokalnej", "@technologiesList": { "description": "List of technologies used" }, - "moreInfo": "More Info", + "moreInfo": "Więcej informacji", "@moreInfo": { "description": "More info button label" }, - "packageName": "Package Name", + "packageName": "Nazwa pakietu", "@packageName": { "description": "Package name label" }, @@ -205,7 +205,7 @@ "@sampleData": { "description": "Sample data section header" }, - "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "sampleDataDescription": "Wczytaj lub wyczyść przykładowe kontakty, wiadomości kanałów i znaczniki SAR do testów", "@sampleDataDescription": { "description": "Sample data section description" }, @@ -217,11 +217,11 @@ "@clearAllData": { "description": "Clear all data button" }, - "clearAllDataConfirmTitle": "Clear All Data", + "clearAllDataConfirmTitle": "Wyczyść wszystkie dane", "@clearAllDataConfirmTitle": { "description": "Clear data confirmation dialog title" }, - "clearAllDataConfirmMessage": "This will clear all contacts and SAR markers. Are you sure?", + "clearAllDataConfirmMessage": "To wyczyści wszystkie kontakty i znaczniki SAR. Czy na pewno?", "@clearAllDataConfirmMessage": { "description": "Clear data confirmation message" }, @@ -229,7 +229,7 @@ "@clear": { "description": "Clear button label" }, - "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "loadedSampleData": "Wczytano {teamCount} członków zespołu, {channelCount} kanałów, {sarCount} znaczników SAR, {messageCount} wiadomości", "@loadedSampleData": { "description": "Success message after loading sample data", "placeholders": { @@ -247,7 +247,7 @@ } } }, - "failedToLoadSampleData": "Failed to load sample data: {error}", + "failedToLoadSampleData": "Nie udało się wczytać danych przykładowych: {error}", "@failedToLoadSampleData": { "description": "Error message when sample data fails to load", "placeholders": { @@ -256,15 +256,15 @@ } } }, - "allDataCleared": "All data cleared", + "allDataCleared": "Wszystkie dane wyczyszczono", "@allDataCleared": { "description": "Success message after clearing all data" }, - "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "failedToStartBackgroundTracking": "Nie udało się uruchomić śledzenia w tle. Sprawdź uprawnienia i połączenie BLE.", "@failedToStartBackgroundTracking": { "description": "Error message when background tracking fails to start" }, - "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "locationBroadcast": "Nadawanie lokalizacji: {latitude}, {longitude}", "@locationBroadcast": { "description": "Success message for location broadcast", "placeholders": { @@ -276,7 +276,7 @@ } } }, - "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "defaultPinInfo": "Domyślny PIN dla urządzeń bez ekranu to 123456. Problem z parowaniem? Zapomnij urządzenie Bluetooth w ustawieniach systemu.", "@defaultPinInfo": { "description": "Information about default PIN for pairing" }, @@ -304,15 +304,15 @@ "@refresh": { "description": "Refresh button label" }, - "resetPath": "Reset Path (Re-route)", + "resetPath": "Resetuj trasę (wyznacz ponownie)", "@resetPath": { "description": "Action to reset contact path for re-routing" }, - "publicKeyCopied": "Public key copied to clipboard", + "publicKeyCopied": "Klucz publiczny skopiowano do schowka", "@publicKeyCopied": { "description": "Success message when public key is copied" }, - "copiedToClipboard": "{label} copied to clipboard", + "copiedToClipboard": "Skopiowano {label} do schowka", "@copiedToClipboard": { "description": "Success message when a value is copied to clipboard", "placeholders": { @@ -325,7 +325,7 @@ "@pleaseEnterPassword": { "description": "Validation message for empty password field" }, - "failedToSyncContacts": "Failed to sync contacts: {error}", + "failedToSyncContacts": "Nie udało się zsynchronizować kontaktów: {error}", "@failedToSyncContacts": { "description": "Error message when contact sync fails", "placeholders": { @@ -351,7 +351,7 @@ } } }, - "failedToSendLogin": "Failed to send login: {error}", + "failedToSendLogin": "Nie udało się wysłać logowania: {error}", "@failedToSendLogin": { "description": "Error message when login command fails to send", "placeholders": { @@ -384,7 +384,7 @@ "@drawLine": { "description": "Map drawing mode: line" }, - "drawLineDesc": "Draw a freehand line on the map", + "drawLineDesc": "Narysuj odręczną linię na mapie", "@drawLineDesc": { "description": "Description for line drawing mode" }, @@ -392,7 +392,7 @@ "@drawRectangle": { "description": "Map drawing mode: rectangle" }, - "drawRectangleDesc": "Draw a rectangular area on the map", + "drawRectangleDesc": "Narysuj prostokątny obszar na mapie", "@drawRectangleDesc": { "description": "Description for rectangle drawing mode" }, @@ -400,7 +400,7 @@ "@measureDistance": { "description": "Map drawing mode: measure distance" }, - "measureDistanceDesc": "Long press two points to measure", + "measureDistanceDesc": "Przytrzymaj dwa punkty, aby zmierzyć", "@measureDistanceDesc": { "description": "Description for distance measurement mode" }, @@ -408,7 +408,7 @@ "@clearMeasurement": { "description": "Tooltip to clear measurement" }, - "distanceLabel": "Distance: {distance}", + "distanceLabel": "Odległość: {distance}", "@distanceLabel": { "description": "Label showing measured distance", "placeholders": { @@ -417,15 +417,15 @@ } } }, - "longPressForSecondPoint": "Long press for second point", + "longPressForSecondPoint": "Przytrzymaj dla drugiego punktu", "@longPressForSecondPoint": { "description": "Instruction when first measurement point is set" }, - "longPressToStartMeasurement": "Long press to set first point", + "longPressToStartMeasurement": "Przytrzymaj, aby ustawić pierwszy punkt", "@longPressToStartMeasurement": { "description": "Instruction to start measurement" }, - "longPressToStartNewMeasurement": "Long press to start new measurement", + "longPressToStartNewMeasurement": "Przytrzymaj, aby rozpocząć nowy pomiar", "@longPressToStartNewMeasurement": { "description": "Instruction to restart measurement after completion" }, @@ -437,11 +437,11 @@ "@clearAllDrawings": { "description": "Action to clear all local drawings" }, - "completeLine": "Complete Line", + "completeLine": "Zakończ linię", "@completeLine": { "description": "Tooltip to complete drawing a line" }, - "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "broadcastDrawingsToTeam": "Nadaj {count} rysunek{plural} do zespołu", "@broadcastDrawingsToTeam": { "description": "Subtitle showing how many drawings will be broadcast", "placeholders": { @@ -453,7 +453,7 @@ } } }, - "removeAllDrawings": "Remove all {count} drawing{plural}", + "removeAllDrawings": "Usuń wszystkie {count} rysunek{plural}", "@removeAllDrawings": { "description": "Subtitle for remove all drawings action", "placeholders": { @@ -465,7 +465,7 @@ } } }, - "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "deleteAllDrawingsConfirm": "Usunąć wszystkie {count} rysunek{plural} z mapy?", "@deleteAllDrawingsConfirm": { "description": "Confirmation dialog message for deleting all drawings", "placeholders": { @@ -481,7 +481,7 @@ "@drawing": { "description": "Generic drawing label" }, - "shareDrawingsCount": "Share {count} Drawing{plural}", + "shareDrawingsCount": "Udostępnij {count} rysunek{plural}", "@shareDrawingsCount": { "description": "Title for share drawings dialog", "placeholders": { @@ -497,11 +497,11 @@ "@showReceivedDrawings": { "description": "Toggle to show/hide received drawings from other team members" }, - "showingAllDrawings": "Showing all drawings", + "showingAllDrawings": "Pokazywane są wszystkie rysunki", "@showingAllDrawings": { "description": "Subtitle when received drawings are visible" }, - "showingOnlyYourDrawings": "Showing only your drawings", + "showingOnlyYourDrawings": "Pokazywane są tylko twoje rysunki", "@showingOnlyYourDrawings": { "description": "Subtitle when received drawings are hidden" }, @@ -509,11 +509,11 @@ "@showSarMarkers": { "description": "Toggle to show/hide SAR markers on map" }, - "showingSarMarkers": "Showing SAR markers", + "showingSarMarkers": "Pokazywane są znaczniki SAR", "@showingSarMarkers": { "description": "Subtitle when SAR markers are visible" }, - "hidingSarMarkers": "Hiding SAR markers", + "hidingSarMarkers": "Ukrywanie znaczników SAR", "@hidingSarMarkers": { "description": "Subtitle when SAR markers are hidden" }, @@ -525,11 +525,11 @@ "@publicChannel": { "description": "Public channel option for sharing" }, - "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "broadcastToAll": "Nadaj do wszystkich pobliskich węzłów (tymczasowo)", "@broadcastToAll": { "description": "Description for public channel broadcast" }, - "storedPermanently": "Stored permanently in room", + "storedPermanently": "Przechowywane na stałe w pokoju", "@storedPermanently": { "description": "Description for room storage permanence" }, @@ -553,7 +553,7 @@ "@sendTo": { "description": "Label for destination selection section" }, - "noDestinationsAvailable": "No destinations available.", + "noDestinationsAvailable": "Brak dostępnych odbiorców.", "@noDestinationsAvailable": { "description": "Warning when no rooms or channels exist" }, @@ -561,11 +561,11 @@ "@selectDestination": { "description": "Placeholder for destination dropdown" }, - "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "ephemeralBroadcastInfo": "Tymczasowe: nadawane tylko drogą radiową. Nie jest zapisywane - węzły muszą być online.", "@ephemeralBroadcastInfo": { "description": "Information about ephemeral channel broadcasts" }, - "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "persistentRoomInfo": "Trwałe: zapisywane niezmiennie w pokoju. Synchronizowane automatycznie i zachowywane offline.", "@persistentRoomInfo": { "description": "Information about persistent room storage" }, @@ -573,7 +573,7 @@ "@location": { "description": "Label for location section" }, - "fromMap": "From Map", + "fromMap": "Z mapy", "@fromMap": { "description": "Badge showing location is from map tap" }, @@ -593,7 +593,7 @@ "@refreshLocation": { "description": "Tooltip for refresh location button" }, - "accuracyMeters": "Accuracy: ±{accuracy}m", + "accuracyMeters": "Dokładność: ±{accuracy}m", "@accuracyMeters": { "description": "Display of GPS accuracy in meters", "placeholders": { @@ -606,11 +606,11 @@ "@notesOptional": { "description": "Label for optional notes field" }, - "addAdditionalInformation": "Add additional information...", + "addAdditionalInformation": "Dodaj dodatkowe informacje...", "@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": "Dokładność lokalizacji wynosi ±{accuracy}m. To może nie być wystarczająco dokładne dla działań SAR.\n\nKontynuować mimo to?", "@lowAccuracyWarning": { "description": "Warning dialog content for low GPS accuracy", "placeholders": { @@ -623,7 +623,7 @@ "@loginToRoom": { "description": "Title for room login dialog" }, - "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "enterPasswordInfo": "Wprowadź hasło, aby uzyskać dostęp do tego pokoju. Hasło zostanie zapisane na przyszłość.", "@enterPasswordInfo": { "description": "Information about room password" }, @@ -643,7 +643,7 @@ "@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": "Nie udało się dodać pokoju do urządzenia: {error}\n\nPokój mógł jeszcze nie rozpocząć nadawania.\nSpróbuj poczekać, aż pokój zacznie nadawać.", "@failedToAddRoom": { "description": "Error message when adding room fails", "placeholders": { @@ -656,7 +656,7 @@ "@direct": { "description": "Direct routing indicator" }, - "flood": "Flood", + "flood": "Rozgłoszeniowo", "@flood": { "description": "Flood routing indicator" }, @@ -672,7 +672,7 @@ "@distance": { "description": "Distance label" }, - "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "directPingTimeout": "Przekroczono czas bezpośredniego ping - ponawianie dla {name} przez flooding...", "@directPingTimeout": { "description": "Warning when direct ping times out", "placeholders": { @@ -681,7 +681,7 @@ } } }, - "pingFailed": "Ping failed to {name} - no response received", + "pingFailed": "Ping do {name} nie powiódł się - nie otrzymano odpowiedzi", "@pingFailed": { "description": "Error message when ping fails", "placeholders": { @@ -690,7 +690,7 @@ } } }, - "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": "Czy na pewno chcesz usunąć „{name}”?\n\nTo usunie kontakt zarówno z aplikacji, jak i z towarzyszącego urządzenia radiowego.", "@deleteContactConfirmation": { "description": "Confirmation message for deleting contact", "placeholders": { @@ -699,7 +699,7 @@ } } }, - "failedToRemoveContact": "Failed to remove contact: {error}", + "failedToRemoveContact": "Nie udało się usunąć kontaktu: {error}", "@failedToRemoveContact": { "description": "Error message when contact removal fails", "placeholders": { @@ -732,7 +732,7 @@ "@notLoggedIn": { "description": "Not logged in status" }, - "adminAccess": "Admin Access", + "adminAccess": "Dostęp administratora", "@adminAccess": { "description": "Admin access label" }, @@ -748,11 +748,11 @@ "@permissions": { "description": "Permissions label" }, - "passwordSaved": "Password Saved", + "passwordSaved": "Hasło zapisano", "@passwordSaved": { "description": "Password saved label" }, - "locationColon": "Location:", + "locationColon": "Lokalizacja:", "@locationColon": { "description": "Location section header" }, @@ -780,7 +780,7 @@ "@pressure": { "description": "Pressure label" }, - "gpsTelemetry": "GPS (Telemetry)", + "gpsTelemetry": "GPS (telemetria)", "@gpsTelemetry": { "description": "GPS from telemetry label" }, @@ -788,7 +788,7 @@ "@updated": { "description": "Updated timestamp label" }, - "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "pathResetInfo": "Trasa dla {name} została zresetowana. Następna wiadomość znajdzie nową trasę.", "@pathResetInfo": { "description": "Info message after path reset", "placeholders": { @@ -797,7 +797,7 @@ } } }, - "reLoginToRoom": "Re-Login to Room", + "reLoginToRoom": "Zaloguj ponownie do pokoju", "@reLoginToRoom": { "description": "Button to re-login to room" }, @@ -825,7 +825,7 @@ "@filterMarkers": { "description": "Title for filter markers dialog" }, - "filterMarkersTooltip": "Filter markers", + "filterMarkersTooltip": "Filtruj znaczniki", "@filterMarkersTooltip": { "description": "Tooltip for filter button" }, @@ -861,11 +861,11 @@ "@locationUnavailable": { "description": "Message when GPS location is unavailable" }, - "ahead": "ahead", + "ahead": "przed tobą", "@ahead": { "description": "Relative bearing direction - ahead" }, - "degreesRight": "{degrees}° right", + "degreesRight": "{degrees}° w prawo", "@degreesRight": { "description": "Relative bearing direction - right", "placeholders": { @@ -874,7 +874,7 @@ } } }, - "degreesLeft": "{degrees}° left", + "degreesLeft": "{degrees}° w lewo", "@degreesLeft": { "description": "Relative bearing direction - left", "placeholders": { @@ -883,7 +883,7 @@ } } }, - "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "latLonFormat": "Szer.: {latitude} Dł.: {longitude}", "@latLonFormat": { "description": "Latitude and longitude display format", "placeholders": { @@ -899,7 +899,7 @@ "@noContactsYet": { "description": "Empty state message when there are no contacts" }, - "connectToDeviceToLoadContacts": "Connect to a device to load contacts", + "connectToDeviceToLoadContacts": "Połącz się z urządzeniem, aby wczytać kontakty", "@connectToDeviceToLoadContacts": { "description": "Instruction to connect device to load contacts" }, @@ -947,7 +947,7 @@ "@googleTerrain": { "description": "Google Terrain layer name (topographic)" }, - "dragToPosition": "Drag to Position", + "dragToPosition": "Przeciągnij do pozycji", "@dragToPosition": { "description": "Label when dragging a pin on map" }, @@ -959,7 +959,7 @@ "@compass": { "description": "Compass title in detailed compass dialog" }, - "navigationAndContacts": "Navigation & Contacts", + "navigationAndContacts": "Nawigacja i kontakty", "@navigationAndContacts": { "description": "Subtitle for compass dialog" }, @@ -967,15 +967,15 @@ "@sarAlert": { "description": "Label for SAR alert badge on messages" }, - "textCopiedToClipboard": "Text copied to clipboard", + "textCopiedToClipboard": "Tekst skopiowano do schowka", "@textCopiedToClipboard": { "description": "Success message when text is copied" }, - "cannotReplySenderMissing": "Cannot reply: sender information missing", + "cannotReplySenderMissing": "Nie można odpowiedzieć: brak informacji o nadawcy", "@cannotReplySenderMissing": { "description": "Error when sender info is missing for reply" }, - "cannotReplyContactNotFound": "Cannot reply: contact not found", + "cannotReplyContactNotFound": "Nie można odpowiedzieć: nie znaleziono kontaktu", "@cannotReplyContactNotFound": { "description": "Error when contact not found for reply" }, @@ -983,15 +983,15 @@ "@copyText": { "description": "Option to copy message text to clipboard" }, - "saveAsTemplate": "Save as Template", + "saveAsTemplate": "Zapisz jako szablon", "@saveAsTemplate": { "description": "Option to save SAR message as a reusable template" }, - "templateSaved": "Template saved successfully", + "templateSaved": "Szablon zapisano pomyślnie", "@templateSaved": { "description": "Success message when SAR template is saved" }, - "templateAlreadyExists": "Template with this emoji already exists", + "templateAlreadyExists": "Szablon z tym emoji już istnieje", "@templateAlreadyExists": { "description": "Error message when trying to save duplicate template" }, @@ -999,7 +999,7 @@ "@deleteMessage": { "description": "Dialog title for deleting a message" }, - "deleteMessageConfirmation": "Are you sure you want to delete this message?", + "deleteMessageConfirmation": "Czy na pewno chcesz usunąć tę wiadomość?", "@deleteMessageConfirmation": { "description": "Confirmation text for message deletion" }, @@ -1007,7 +1007,7 @@ "@shareLocation": { "description": "Option to share SAR marker location" }, - "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "shareLocationText": "{markerInfo}\n\nWspółrzędne: {lat}, {lon}\n\nGoogle Maps: {url}", "@shareLocationText": { "description": "Formatted text for sharing SAR marker location", "placeholders": { @@ -1025,7 +1025,7 @@ } } }, - "sarLocationShare": "SAR Location", + "sarLocationShare": "Lokalizacja SAR", "@sarLocationShare": { "description": "Subject line when sharing SAR marker location" }, @@ -1081,7 +1081,7 @@ "@delivered": { "description": "Delivery status: delivered" }, - "deliveredWithTime": "Delivered ({time}ms)", + "deliveredWithTime": "Dostarczono ({time}ms)", "@deliveredWithTime": { "description": "Delivery status with round-trip time", "placeholders": { @@ -1098,7 +1098,7 @@ "@broadcast": { "description": "Delivery status for channel messages (no echoes yet)" }, - "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "deliveredToContacts": "Dostarczono do {delivered}/{total} kontaktów", "@deliveredToContacts": { "description": "Grouped message delivery count", "placeholders": { @@ -1110,11 +1110,11 @@ } } }, - "allDelivered": "All delivered", + "allDelivered": "Wszystko dostarczono", "@allDelivered": { "description": "Status when all recipients received the message" }, - "recipientDetails": "Recipient Details", + "recipientDetails": "Szczegóły odbiorcy", "@recipientDetails": { "description": "Header for expandable recipient list" }, @@ -1122,19 +1122,19 @@ "@pending": { "description": "Delivery status: pending/waiting" }, - "sarMarkerFoundPerson": "Found Person", + "sarMarkerFoundPerson": "Odnaleziona osoba", "@sarMarkerFoundPerson": { "description": "SAR marker type: found person" }, - "sarMarkerFire": "Fire Location", + "sarMarkerFire": "Miejsce pożaru", "@sarMarkerFire": { "description": "SAR marker type: fire" }, - "sarMarkerStagingArea": "Staging Area", + "sarMarkerStagingArea": "Strefa zbiórki", "@sarMarkerStagingArea": { "description": "SAR marker type: staging area" }, - "sarMarkerObject": "Object Found", + "sarMarkerObject": "Odnaleziony obiekt", "@sarMarkerObject": { "description": "SAR marker type: object" }, @@ -1158,7 +1158,7 @@ "@frequencyMHz": { "description": "Label for radio frequency field" }, - "frequencyExample": "e.g., 869.618", + "frequencyExample": "np. 869.618", "@frequencyExample": { "description": "Helper text example for frequency" }, @@ -1225,11 +1225,11 @@ "@showTrailOnMap": { "description": "Toggle to show/hide trail on map" }, - "trailVisible": "Trail is visible on the map", + "trailVisible": "Ślad jest widoczny na mapie", "@trailVisible": { "description": "Trail visibility status - visible" }, - "trailHiddenRecording": "Trail is hidden (still recording)", + "trailHiddenRecording": "Ślad jest ukryty (nadal nagrywany)", "@trailHiddenRecording": { "description": "Trail visibility status - hidden but recording" }, @@ -1245,11 +1245,11 @@ "@clearTrail": { "description": "Button to clear location trail" }, - "clearTrailQuestion": "Clear Trail?", + "clearTrailQuestion": "Wyczyścić ślad?", "@clearTrailQuestion": { "description": "Confirmation dialog title" }, - "clearTrailConfirmation": "Are you sure you want to clear the current location trail? This action cannot be undone.", + "clearTrailConfirmation": "Czy na pewno chcesz wyczyścić bieżący ślad lokalizacji? Tego działania nie można cofnąć.", "@clearTrailConfirmation": { "description": "Confirmation dialog message" }, @@ -1257,7 +1257,7 @@ "@noTrailRecorded": { "description": "Message when no trail exists" }, - "startTrackingToRecord": "Start location tracking to record your trail", + "startTrackingToRecord": "Rozpocznij śledzenie lokalizacji, aby zapisać ślad", "@startTrackingToRecord": { "description": "Instructions to start trail recording" }, @@ -1269,15 +1269,15 @@ "@contactTrails": { "description": "Contact trails section header" }, - "showAllContactTrails": "Show All Contact Trails", + "showAllContactTrails": "Pokaż wszystkie ślady kontaktów", "@showAllContactTrails": { "description": "Toggle label to show all contact trails" }, - "noContactsWithLocationHistory": "No contacts with location history", + "noContactsWithLocationHistory": "Brak kontaktów z historią lokalizacji", "@noContactsWithLocationHistory": { "description": "Subtitle when no contacts have trails" }, - "showingTrailsForContacts": "Showing trails for {count} contacts", + "showingTrailsForContacts": "Pokazywane są ślady dla {count} kontaktów", "@showingTrailsForContacts": { "description": "Subtitle showing number of contacts with trails", "placeholders": { @@ -1286,7 +1286,7 @@ } } }, - "individualContactTrails": "Individual Contact Trails", + "individualContactTrails": "Indywidualne ślady kontaktów", "@individualContactTrails": { "description": "Expansion tile title for individual contact trails" }, @@ -1330,19 +1330,19 @@ "@maxChannels": { "description": "Maximum channels capacity label" }, - "publicInfo": "Public Info", + "publicInfo": "Informacje publiczne", "@publicInfo": { "description": "Public information section header" }, - "meshNetworkName": "Mesh Network Name", + "meshNetworkName": "Nazwa sieci mesh", "@meshNetworkName": { "description": "Mesh network name field label" }, - "nameBroadcastInMesh": "Name broadcast in mesh advertisements", + "nameBroadcastInMesh": "Nazwa nadawana w ogłoszeniach mesh", "@nameBroadcastInMesh": { "description": "Helper text for mesh network name field" }, - "telemetryAndLocationSharing": "Telemetry & Location Sharing", + "telemetryAndLocationSharing": "Telemetria i udostępnianie lokalizacji", "@telemetryAndLocationSharing": { "description": "Telemetry and location sharing toggle label" }, @@ -1358,11 +1358,11 @@ "@useCurrentLocation": { "description": "Tooltip for use current location button" }, - "noneUnknown": "None/Unknown", + "noneUnknown": "Brak/Nieznane", "@noneUnknown": { "description": "Device type: none or unknown" }, - "chatNode": "Chat Node", + "chatNode": "Węzeł czatu", "@chatNode": { "description": "Device type: chat node" }, @@ -1370,11 +1370,11 @@ "@repeater": { "description": "Device type: repeater" }, - "roomChannel": "Room/Channel", + "roomChannel": "Pokój/Kanał", "@roomChannel": { "description": "Device type: room or channel" }, - "typeNumber": "Type {number}", + "typeNumber": "Typ {number}", "@typeNumber": { "description": "Generic device type with number", "placeholders": { @@ -1383,7 +1383,7 @@ } } }, - "copiedToClipboardShort": "Copied {label} to clipboard", + "copiedToClipboardShort": "Skopiowano {label} do schowka", "@copiedToClipboardShort": { "description": "Short success message when copying to clipboard", "placeholders": { @@ -1392,7 +1392,7 @@ } } }, - "failedToSave": "Failed to save: {error}", + "failedToSave": "Nie udało się zapisać: {error}", "@failedToSave": { "description": "Generic error message for save failures", "placeholders": { @@ -1401,7 +1401,7 @@ } } }, - "failedToGetLocation": "Failed to get location: {error}", + "failedToGetLocation": "Nie udało się pobrać lokalizacji: {error}", "@failedToGetLocation": { "description": "Error message when getting location fails", "placeholders": { @@ -1414,7 +1414,7 @@ "@sarTemplates": { "description": "SAR templates menu title" }, - "manageSarTemplates": "Manage cursor on target templates", + "manageSarTemplates": "Zarządzaj szablonami SAR", "@manageSarTemplates": { "description": "Subtitle for SAR templates settings" }, @@ -1474,7 +1474,7 @@ "@exportToClipboard": { "description": "Button to export templates to clipboard" }, - "deleteTemplateConfirmation": "Delete template '{name}'?", + "deleteTemplateConfirmation": "Usunąć szablon „{name}”?", "@deleteTemplateConfirmation": { "description": "Confirmation message for template deletion", "placeholders": { @@ -1495,7 +1495,7 @@ "@templateDeleted": { "description": "Success message when template is deleted" }, - "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "templatesImported": "{count, plural, =0{Nie zaimportowano szablonów} =1{Zaimportowano 1 szablon} other{Zaimportowano {count} szablonów}}", "@templatesImported": { "description": "Success message after importing templates", "placeholders": { @@ -1504,7 +1504,7 @@ } } }, - "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "templatesExported": "{count, plural, =1{Wyeksportowano 1 szablon do schowka} other{Wyeksportowano {count} szablonów do schowka}}", "@templatesExported": { "description": "Success message after exporting templates", "placeholders": { @@ -1517,7 +1517,7 @@ "@resetToDefaults": { "description": "Action to reset templates to defaults" }, - "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "resetToDefaultsConfirmation": "To usunie wszystkie własne szablony i przywróci 4 domyślne szablony. Kontynuować?", "@resetToDefaultsConfirmation": { "description": "Confirmation message for reset to defaults" }, @@ -1525,7 +1525,7 @@ "@reset": { "description": "Reset button label" }, - "resetComplete": "Templates reset to defaults", + "resetComplete": "Szablony przywrócono do domyślnych", "@resetComplete": { "description": "Success message after reset" }, @@ -1553,23 +1553,23 @@ "@checking": { "description": "Loading state indicator" }, - "locationPermissionGrantedAlways": "Granted (Always)", + "locationPermissionGrantedAlways": "Przyznano (zawsze)", "@locationPermissionGrantedAlways": { "description": "Location permission status: granted always" }, - "locationPermissionGrantedWhileInUse": "Granted (While In Use)", + "locationPermissionGrantedWhileInUse": "Przyznano (podczas użycia)", "@locationPermissionGrantedWhileInUse": { "description": "Location permission status: granted while in use" }, - "locationPermissionDeniedTapToRequest": "Denied - Tap to request", + "locationPermissionDeniedTapToRequest": "Odrzucono - dotknij, aby poprosić", "@locationPermissionDeniedTapToRequest": { "description": "Location permission status: denied, user can request" }, - "locationPermissionPermanentlyDeniedOpenSettings": "Permanently Denied - Open Settings", + "locationPermissionPermanentlyDeniedOpenSettings": "Trwale odrzucono - otwórz ustawienia", "@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": "Dostęp do lokalizacji został trwale odrzucony. Włącz go w ustawieniach urządzenia, aby używać GPS i udostępniania lokalizacji.", "@locationPermissionDialogContent": { "description": "Content for location permission dialog when permanently denied" }, @@ -1581,19 +1581,19 @@ "@locationPermissionGranted": { "description": "Success message when location permission is granted" }, - "locationPermissionRequiredForGps": "Location permission is required for GPS tracking and location sharing.", + "locationPermissionRequiredForGps": "Dostęp do lokalizacji jest wymagany do śledzenia GPS i udostępniania lokalizacji.", "@locationPermissionRequiredForGps": { "description": "Info message about location permission requirement" }, - "locationPermissionAlreadyGranted": "Location permission is already granted.", + "locationPermissionAlreadyGranted": "Dostęp do lokalizacji został już przyznany.", "@locationPermissionAlreadyGranted": { "description": "Info message when permission is already granted" }, - "sarNavyBlue": "SAR Navy Blue", + "sarNavyBlue": "SAR Granatowy", "@sarNavyBlue": { "description": "SAR Navy Blue theme name" }, - "sarNavyBlueDescription": "Professional/Operations Mode", + "sarNavyBlueDescription": "Tryb profesjonalny/operacyjny", "@sarNavyBlueDescription": { "description": "Description for SAR Navy Blue theme" }, @@ -1601,7 +1601,7 @@ "@selectRecipient": { "description": "Title for recipient selector sheet" }, - "broadcastToAllNearby": "Broadcast to all nearby", + "broadcastToAllNearby": "Nadaj do wszystkich w pobliżu", "@broadcastToAllNearby": { "description": "Subtitle for public channel option" }, @@ -1633,35 +1633,35 @@ "@channel": { "description": "Channel label in notifications" }, - "samplePoliceLead": "Police Lead", + "samplePoliceLead": "Dowódca policji", "@samplePoliceLead": { "description": "Sample team member name" }, - "sampleDroneOperator": "Drone Operator", + "sampleDroneOperator": "Operator drona", "@sampleDroneOperator": { "description": "Sample team member name" }, - "sampleFirefighterAlpha": "Firefighter", + "sampleFirefighterAlpha": "Strażak", "@sampleFirefighterAlpha": { "description": "Sample team member name" }, - "sampleMedicCharlie": "Medic", + "sampleMedicCharlie": "Ratownik medyczny", "@sampleMedicCharlie": { "description": "Sample team member name" }, - "sampleCommandDelta": "Command", + "sampleCommandDelta": "Dowództwo", "@sampleCommandDelta": { "description": "Sample team member name" }, - "sampleFireEngine": "Fire Engine", + "sampleFireEngine": "Wóz strażacki", "@sampleFireEngine": { "description": "Sample team member name" }, - "sampleAirSupport": "Air Support", + "sampleAirSupport": "Wsparcie lotnicze", "@sampleAirSupport": { "description": "Sample team member name" }, - "sampleBaseCoordinator": "Base Coordinator", + "sampleBaseCoordinator": "Koordynator bazy", "@sampleBaseCoordinator": { "description": "Sample team member name" }, @@ -1677,155 +1677,155 @@ "@channelUpdates": { "description": "Updates channel name" }, - "sampleTeamMember": "Sample Team Member", + "sampleTeamMember": "Przykładowy członek zespołu", "@sampleTeamMember": { "description": "Sample sender name" }, - "sampleScout": "Sample Scout", + "sampleScout": "Przykładowy zwiadowca", "@sampleScout": { "description": "Sample sender name" }, - "sampleBase": "Sample Base", + "sampleBase": "Przykładowa baza", "@sampleBase": { "description": "Sample sender name" }, - "sampleSearcher": "Sample Searcher", + "sampleSearcher": "Przykładowy poszukiwacz", "@sampleSearcher": { "description": "Sample sender name" }, - "sampleObjectBackpack": " Backpack found - blue color", + "sampleObjectBackpack": " Znaleziono plecak - kolor niebieski", "@sampleObjectBackpack": { "description": "Sample object note" }, - "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "sampleObjectVehicle": " Porzucony pojazd - sprawdzić właściciela", "@sampleObjectVehicle": { "description": "Sample object note" }, - "sampleObjectCamping": " Camping equipment discovered", + "sampleObjectCamping": " Znaleziono sprzęt kempingowy", "@sampleObjectCamping": { "description": "Sample object note" }, - "sampleObjectTrailMarker": " Trail marker found off-path", + "sampleObjectTrailMarker": " Znaleziono znacznik szlaku poza trasą", "@sampleObjectTrailMarker": { "description": "Sample object note" }, - "sampleMsgAllTeamsCheckIn": "All teams check in", + "sampleMsgAllTeamsCheckIn": "Wszystkie zespoły - meldunek", "@sampleMsgAllTeamsCheckIn": { "description": "Sample channel message" }, - "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "sampleMsgWeatherUpdate": "Aktualizacja pogody: bezchmurnie, temp. 18°C", "@sampleMsgWeatherUpdate": { "description": "Sample channel message" }, - "sampleMsgBaseCamp": "Base camp established at staging area", + "sampleMsgBaseCamp": "Bazę założono w strefie zbiórki", "@sampleMsgBaseCamp": { "description": "Sample channel message" }, - "sampleMsgTeamAlpha": "Team moving to sector 2", + "sampleMsgTeamAlpha": "Zespół przemieszcza się do sektora 2", "@sampleMsgTeamAlpha": { "description": "Sample channel message" }, - "sampleMsgRadioCheck": "Radio check - all stations respond", + "sampleMsgRadioCheck": "Kontrola radiowa - wszystkie stacje proszone o odpowiedź", "@sampleMsgRadioCheck": { "description": "Sample channel message" }, - "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "sampleMsgWaterSupply": "Woda dostępna w punkcie kontrolnym 3", "@sampleMsgWaterSupply": { "description": "Sample channel message" }, - "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "sampleMsgTeamBravo": "Zespół melduje: sektor 1 czysty", "@sampleMsgTeamBravo": { "description": "Sample channel message" }, - "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "sampleMsgEtaRallyPoint": "Szacowany czas dotarcia do punktu zbiórki: 15 minut", "@sampleMsgEtaRallyPoint": { "description": "Sample channel message" }, - "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "sampleMsgSupplyDrop": "Zrzut zaopatrzenia potwierdzony na 14:00", "@sampleMsgSupplyDrop": { "description": "Sample channel message" }, - "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "sampleMsgDroneSurvey": "Rozpoznanie dronem zakończone - brak wyników", "@sampleMsgDroneSurvey": { "description": "Sample channel message" }, - "sampleMsgTeamCharlie": "Team requesting backup", + "sampleMsgTeamCharlie": "Zespół prosi o wsparcie", "@sampleMsgTeamCharlie": { "description": "Sample channel message" }, - "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "sampleMsgRadioDiscipline": "Wszystkie jednostki: zachować dyscyplinę radiową", "@sampleMsgRadioDiscipline": { "description": "Sample channel message" }, - "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "sampleMsgUrgentMedical": "PILNE: potrzebna pomoc medyczna w sektorze 4", "@sampleMsgUrgentMedical": { "description": "Sample emergency message" }, - "sampleMsgAdultMale": " Adult male, conscious", + "sampleMsgAdultMale": " Dorosły mężczyzna, przytomny", "@sampleMsgAdultMale": { "description": "Sample emergency message note" }, - "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "sampleMsgFireSpotted": "Wykryto pożar - współrzędne w drodze", "@sampleMsgFireSpotted": { "description": "Sample emergency message" }, - "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "sampleMsgSpreadingRapidly": " Szybko się rozprzestrzenia!", "@sampleMsgSpreadingRapidly": { "description": "Sample emergency message note" }, - "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "sampleMsgPriorityHelicopter": "PRIORYTET: potrzebne wsparcie śmigłowca", "@sampleMsgPriorityHelicopter": { "description": "Sample emergency message" }, - "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "sampleMsgMedicalTeamEnRoute": "Zespół medyczny jest w drodze do twojej lokalizacji", "@sampleMsgMedicalTeamEnRoute": { "description": "Sample emergency message" }, - "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "sampleMsgEvacHelicopter": "ETA śmigłowca ewakuacyjnego 10 minut", "@sampleMsgEvacHelicopter": { "description": "Sample emergency message" }, - "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "sampleMsgEmergencyResolved": "Sytuacja opanowana - wszystko jasne", "@sampleMsgEmergencyResolved": { "description": "Sample emergency message" }, - "sampleMsgEmergencyStagingArea": " Emergency staging area", + "sampleMsgEmergencyStagingArea": " Strefa zbiórki awaryjnej", "@sampleMsgEmergencyStagingArea": { "description": "Sample emergency message note" }, - "sampleMsgEmergencyServices": "Emergency services notified and responding", + "sampleMsgEmergencyServices": "Służby ratunkowe zostały powiadomione i jadą na miejsce", "@sampleMsgEmergencyServices": { "description": "Sample emergency message" }, - "sampleAlphaTeamLead": "Team Lead", + "sampleAlphaTeamLead": "Lider zespołu", "@sampleAlphaTeamLead": { "description": "Sample team name" }, - "sampleBravoScout": "Scout", + "sampleBravoScout": "Zwiadowca", "@sampleBravoScout": { "description": "Sample team name" }, - "sampleCharlieMedic": "Medic", + "sampleCharlieMedic": "Ratownik medyczny", "@sampleCharlieMedic": { "description": "Sample team name" }, - "sampleDeltaNavigator": "Navigator", + "sampleDeltaNavigator": "Nawigator", "@sampleDeltaNavigator": { "description": "Sample team name" }, - "sampleEchoSupport": "Support", + "sampleEchoSupport": "Wsparcie", "@sampleEchoSupport": { "description": "Sample team name" }, - "sampleBaseCommand": "Base Command", + "sampleBaseCommand": "Dowództwo bazy", "@sampleBaseCommand": { "description": "Sample team name" }, - "sampleFieldCoordinator": "Field Coordinator", + "sampleFieldCoordinator": "Koordynator terenowy", "@sampleFieldCoordinator": { "description": "Sample team name" }, - "sampleMedicalTeam": "Medical Team", + "sampleMedicalTeam": "Zespół medyczny", "@sampleMedicalTeam": { "description": "Sample team name" }, @@ -1833,7 +1833,7 @@ "@mapDrawing": { "description": "Label for map drawing messages" }, - "navigateToDrawing": "Navigate to Drawing", + "navigateToDrawing": "Nawiguj do rysunku", "@navigateToDrawing": { "description": "Option to navigate to drawing on map" }, @@ -1869,7 +1869,7 @@ "@longitudeLabel": { "description": "Label for longitude input field" }, - "exampleCoordinates": "Example: 46.0569, 14.5058", + "exampleCoordinates": "Przykład: 46.0569, 14.5058", "@exampleCoordinates": { "description": "Example coordinate format hint" }, @@ -1877,27 +1877,27 @@ "@shareDrawing": { "description": "Title for share single drawing dialog" }, - "shareWithAllNearbyDevices": "Share with all nearby devices", + "shareWithAllNearbyDevices": "Udostępnij wszystkim pobliskim urządzeniom", "@shareWithAllNearbyDevices": { "description": "Subtitle for public channel sharing option" }, - "shareToRoom": "Share to Room", + "shareToRoom": "Udostępnij do pokoju", "@shareToRoom": { "description": "Header for room sharing section" }, - "sendToPersistentStorage": "Send to persistent room storage", + "sendToPersistentStorage": "Wyślij do trwałego magazynu pokoju", "@sendToPersistentStorage": { "description": "Subtitle for room sharing option" }, - "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "deleteDrawingConfirm": "Czy na pewno chcesz usunąć ten rysunek?", "@deleteDrawingConfirm": { "description": "Confirmation message for deleting a single drawing" }, - "drawingDeleted": "Drawing deleted", + "drawingDeleted": "Rysunek usunięto", "@drawingDeleted": { "description": "Success message after deleting a drawing" }, - "yourDrawingsCount": "Your Drawings ({count})", + "yourDrawingsCount": "Twoje rysunki ({count})", "@yourDrawingsCount": { "description": "Header showing count of user's drawings", "placeholders": { @@ -1906,7 +1906,7 @@ } } }, - "shared": "Shared", + "shared": "Udostępniono", "@shared": { "description": "Status label for shared drawings" }, @@ -1938,55 +1938,55 @@ "@updateLater": { "description": "Button to dismiss update dialog" }, - "cadastralParcels": "Cadastral Parcels", + "cadastralParcels": "Działki katastralne", "@cadastralParcels": { "description": "Label for cadastral parcels WMS overlay layer" }, - "forestRoads": "Forest Roads", + "forestRoads": "Drogi leśne", "@forestRoads": { "description": "Label for forest roads WMS overlay layer" }, - "wmsOverlays": "WMS Overlays", + "wmsOverlays": "Nakładki WMS", "@wmsOverlays": { "description": "Section header for WMS overlay layers in layer selector" }, - "hikingTrails": "Hiking Trails", + "hikingTrails": "Szlaki piesze", "@hikingTrails": { "description": "Label for hiking/mountain trails WMS overlay layer" }, - "mainRoads": "Main Roads", + "mainRoads": "Drogi główne", "@mainRoads": { "description": "Label for main roads WMS overlay layer" }, - "houseNumbers": "House Numbers", + "houseNumbers": "Numery budynków", "@houseNumbers": { "description": "Label for house numbers WMS overlay layer" }, - "fireHazardZones": "Fire Hazard Zones", + "fireHazardZones": "Strefy zagrożenia pożarowego", "@fireHazardZones": { "description": "Label for fire hazard risk zones WMS overlay layer" }, - "historicalFires": "Historical Fires", + "historicalFires": "Historyczne pożary", "@historicalFires": { "description": "Label for historical forest fires WMS overlay layer" }, - "firebreaks": "Firebreaks", + "firebreaks": "Pasy przeciwpożarowe", "@firebreaks": { "description": "Label for firebreaks WMS overlay layer" }, - "krasFireZones": "Kras Fire Zones", + "krasFireZones": "Strefy pożarowe Krasu", "@krasFireZones": { "description": "Label for Kras fire zones WMS overlay layer" }, - "placeNames": "Place Names", + "placeNames": "Nazwy miejsc", "@placeNames": { "description": "Label for geographic place names WMS overlay layer" }, - "municipalityBorders": "Municipality Borders", + "municipalityBorders": "Granice gmin", "@municipalityBorders": { "description": "Label for municipality borders WMS overlay layer" }, - "topographicMap": "Topographic Map 1:25000", + "topographicMap": "Mapa topograficzna 1:25000", "@topographicMap": { "description": "Label for DTK25 topographic base map layer" }, @@ -2014,43 +2014,43 @@ "@channelSecretHint": { "description": "Hint for channel secret field" }, - "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "channelSecretHelp": "Ten sekret musi być współdzielony ze wszystkimi członkami zespołu, którzy potrzebują dostępu do tego kanału", "@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": "Kanały hash (#team): sekret jest generowany automatycznie z nazwy. Ta sama nazwa = ten sam kanał na wszystkich urządzeniach.\n\nKanały prywatne: użyj jawnego sekretu. Dołączyć mogą tylko osoby znające sekret.", "@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": "Kanał hash: sekret zostanie wygenerowany automatycznie z nazwy kanału. Każdy używający tej samej nazwy dołączy do tego samego kanału.", "@hashChannelInfo": { "description": "Help text for hash channels (# prefix)" }, - "channelNameRequired": "Channel name is required", + "channelNameRequired": "Nazwa kanału jest wymagana", "@channelNameRequired": { "description": "Validation error for empty channel name" }, - "channelNameTooLong": "Channel name must be 31 characters or less", + "channelNameTooLong": "Nazwa kanału może mieć maksymalnie 31 znaków", "@channelNameTooLong": { "description": "Validation error for channel name too long" }, - "channelSecretRequired": "Channel secret is required", + "channelSecretRequired": "Sekret kanału jest wymagany", "@channelSecretRequired": { "description": "Validation error for empty channel secret" }, - "channelSecretTooLong": "Channel secret must be 32 characters or less", + "channelSecretTooLong": "Sekret kanału może mieć maksymalnie 32 znaki", "@channelSecretTooLong": { "description": "Validation error for channel secret too long" }, - "invalidAsciiCharacters": "Only ASCII characters are allowed", + "invalidAsciiCharacters": "Dozwolone są tylko znaki ASCII", "@invalidAsciiCharacters": { "description": "Validation error for non-ASCII characters" }, - "channelCreatedSuccessfully": "Channel created successfully", + "channelCreatedSuccessfully": "Kanał utworzono pomyślnie", "@channelCreatedSuccessfully": { "description": "Success message after creating channel" }, - "channelCreationFailed": "Failed to create channel: {error}", + "channelCreationFailed": "Nie udało się utworzyć kanału: {error}", "@channelCreationFailed": { "description": "Error message when channel creation fails", "placeholders": { @@ -2059,11 +2059,11 @@ } } }, - "deleteChannel": "Delete Channel", + "deleteChannel": "Usuń kanał", "@deleteChannel": { "description": "Delete channel button/menu item" }, - "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "deleteChannelConfirmation": "Czy na pewno chcesz usunąć kanał „{channelName}”? Tej operacji nie można cofnąć.", "@deleteChannelConfirmation": { "description": "Confirmation dialog when deleting a channel", "placeholders": { @@ -2072,11 +2072,11 @@ } } }, - "channelDeletedSuccessfully": "Channel deleted successfully", + "channelDeletedSuccessfully": "Kanał usunięto pomyślnie", "@channelDeletedSuccessfully": { "description": "Success message after deleting channel" }, - "channelDeletionFailed": "Failed to delete channel: {error}", + "channelDeletionFailed": "Nie udało się usunąć kanału: {error}", "@channelDeletionFailed": { "description": "Error message when channel deletion fails", "placeholders": { @@ -2109,7 +2109,7 @@ "@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": "Potężne narzędzie komunikacji poza siecią do operacji poszukiwawczo-ratowniczych. Połącz się ze swoim zespołem przy użyciu technologii radia mesh, gdy tradycyjne sieci są niedostępne.", "@wizardWelcomeDescription": { "description": "Welcome wizard first page description" }, @@ -2117,19 +2117,19 @@ "@wizardConnectingTitle": { "description": "Wizard connecting page title" }, - "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "wizardConnectingDescription": "Połącz smartfon z urządzeniem radiowym MeshCore przez Bluetooth, aby rozpocząć komunikację poza siecią.", "@wizardConnectingDescription": { "description": "Wizard connecting page description" }, - "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "wizardConnectingFeature1": "Skanuj pobliskie urządzenia MeshCore", "@wizardConnectingFeature1": { "description": "Wizard connecting feature 1" }, - "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "wizardConnectingFeature2": "Sparuj radio przez Bluetooth", "@wizardConnectingFeature2": { "description": "Wizard connecting feature 2" }, - "wizardConnectingFeature3": "Works completely offline - no internet required", + "wizardConnectingFeature3": "Działa całkowicie offline - internet nie jest wymagany", "@wizardConnectingFeature3": { "description": "Wizard connecting feature 3" }, @@ -2137,19 +2137,19 @@ "@wizardChannelTitle": { "description": "Wizard channel page title" }, - "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "wizardChannelDescription": "Nadawaj wiadomości do wszystkich na kanale, idealne do ogłoszeń i koordynacji całego zespołu.", "@wizardChannelDescription": { "description": "Wizard channel page description" }, - "wizardChannelFeature1": "Public Channel for general team communication", + "wizardChannelFeature1": "Kanał publiczny do ogólnej komunikacji zespołu", "@wizardChannelFeature1": { "description": "Wizard channel feature 1" }, - "wizardChannelFeature2": "Create custom channels for specific groups", + "wizardChannelFeature2": "Twórz własne kanały dla konkretnych grup", "@wizardChannelFeature2": { "description": "Wizard channel feature 2" }, - "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "wizardChannelFeature3": "Wiadomości są automatycznie przekazywane przez mesh", "@wizardChannelFeature3": { "description": "Wizard channel feature 3" }, @@ -2157,19 +2157,19 @@ "@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": "Członkowie zespołu pojawiają się automatycznie, gdy dołączają do sieci mesh. Wyślij im wiadomość bezpośrednią lub zobacz ich lokalizację.", "@wizardContactsDescription": { "description": "Wizard contacts page description" }, - "wizardContactsFeature1": "Contacts discovered automatically", + "wizardContactsFeature1": "Kontakty wykrywane automatycznie", "@wizardContactsFeature1": { "description": "Wizard contacts feature 1" }, - "wizardContactsFeature2": "Send private direct messages", + "wizardContactsFeature2": "Wysyłaj prywatne wiadomości bezpośrednie", "@wizardContactsFeature2": { "description": "Wizard contacts feature 2" }, - "wizardContactsFeature3": "View battery level and last seen time", + "wizardContactsFeature3": "Podgląd poziomu baterii i czasu ostatniej aktywności", "@wizardContactsFeature3": { "description": "Wizard contacts feature 3" }, @@ -2177,23 +2177,23 @@ "@wizardMapTitle": { "description": "Wizard map page title" }, - "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "wizardMapDescription": "Śledź swój zespół w czasie rzeczywistym i oznaczaj ważne lokalizacje dla działań poszukiwawczo-ratowniczych.", "@wizardMapDescription": { "description": "Wizard map page description" }, - "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "wizardMapFeature1": "Znaczniki SAR dla odnalezionych osób, pożarów i stref zbiórki", "@wizardMapFeature1": { "description": "Wizard map feature 1" }, - "wizardMapFeature2": "Real-time GPS tracking of team members", + "wizardMapFeature2": "Śledzenie GPS członków zespołu w czasie rzeczywistym", "@wizardMapFeature2": { "description": "Wizard map feature 2" }, - "wizardMapFeature3": "Download offline maps for remote areas", + "wizardMapFeature3": "Pobieraj mapy offline dla odległych obszarów", "@wizardMapFeature3": { "description": "Wizard map feature 3" }, - "wizardMapFeature4": "Draw shapes and share tactical information", + "wizardMapFeature4": "Rysuj kształty i udostępniaj informacje taktyczne", "@wizardMapFeature4": { "description": "Wizard map feature 4" }, @@ -2205,7 +2205,7 @@ "@allTeamContacts": { "description": "Destination option to send SAR marker to all team contacts" }, - "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "directMessagesInfo": "Wiadomości bezpośrednie z ACK. Wysłano do {count} członków zespołu.", "@directMessagesInfo": { "description": "Information about sending to all contacts", "placeholders": { @@ -2214,7 +2214,7 @@ } } }, - "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "sarMarkerSentToContacts": "Znacznik SAR wysłano do {count} kontaktów", "@sarMarkerSentToContacts": { "description": "Success message after sending SAR marker to all contacts", "placeholders": { @@ -2231,50 +2231,50 @@ "@reply": {}, "technicalDetails": "Szczegóły techniczne", "@technicalDetails": {}, - "messageTechnicalDetails": "Message technical details", + "messageTechnicalDetails": "Szczegóły techniczne wiadomości", "@messageTechnicalDetails": {}, - "linkQuality": "Link quality", + "linkQuality": "Jakość łącza", "@linkQuality": {}, - "delivery": "Delivery", + "delivery": "Dostarczenie", "@delivery": {}, "status": "Status", "@status": {}, - "expectedAckTag": "Expected ACK tag", + "expectedAckTag": "Oczekiwany znacznik ACK", "@expectedAckTag": {}, - "roundTrip": "Round-trip", + "roundTrip": "Czas podróży w obie strony", "@roundTrip": {}, - "retryAttempt": "Retry attempt", + "retryAttempt": "Próba ponowienia", "@retryAttempt": {}, - "floodFallback": "Flood fallback", + "floodFallback": "Awaryjny flooding", "@floodFallback": {}, - "identity": "Identity", + "identity": "Tożsamość", "@identity": {}, - "messageId": "Message ID", + "messageId": "ID wiadomości", "@messageId": {}, - "sender": "Sender", + "sender": "Nadawca", "@sender": {}, - "senderKey": "Sender key", + "senderKey": "Klucz nadawcy", "@senderKey": {}, - "recipient": "Recipient", + "recipient": "Odbiorca", "@recipient": {}, - "recipientKey": "Recipient key", + "recipientKey": "Klucz odbiorcy", "@recipientKey": {}, "voice": "Głos", "@voice": {}, - "voiceId": "Voice ID", + "voiceId": "ID głosu", "@voiceId": {}, - "envelope": "Envelope", + "envelope": "Koperta", "@envelope": {}, - "sessionProgress": "Session progress", + "sessionProgress": "Postęp sesji", "@sessionProgress": {}, "complete": "Zakończono", "@complete": {}, - "rawDump": "Raw dump", + "rawDump": "Surowy zrzut", "@rawDump": {}, - "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "cannotRetryMissingRecipient": "Nie można ponowić: brak informacji o odbiorcy", "@cannotRetryMissingRecipient": {}, "voiceUnavailable": "Głos jest obecnie niedostępny", "@voiceUnavailable": {}, - "requestingVoice": "Requesting voice", + "requestingVoice": "Pobieranie głosu", "@requestingVoice": {} } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index ef38599..7d4f906 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -177,19 +177,19 @@ "@appName": { "description": "App name label" }, - "aboutMeshCoreSar": "About MeshCore SAR", + "aboutMeshCoreSar": "Sobre o 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": "Um aplicativo de Busca e Resgate projetado para equipes de resposta a emergências. Os recursos incluem:\n\n• Rede mesh BLE para comunicação entre dispositivos\n• Mapas offline com múltiplas opções de camadas\n• Rastreamento em tempo real dos membros da equipe\n• Marcadores táticos SAR (pessoa encontrada, incêndio, área de apoio)\n• Gerenciamento de contatos e mensagens\n• Rastreamento GPS com rumo da bússola\n• Cache de blocos de mapa para uso offline", "@aboutDescription": { "description": "About dialog description" }, - "technologiesUsed": "Technologies Used:", + "technologiesUsed": "Tecnologias utilizadas:", "@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": "• Flutter para desenvolvimento multiplataforma\n• BLE (Bluetooth Low Energy) para rede mesh\n• OpenStreetMap para mapas\n• Provider para gerenciamento de estado\n• SharedPreferences para armazenamento local", "@technologiesList": { "description": "List of technologies used" }, @@ -197,7 +197,7 @@ "@moreInfo": { "description": "More info button label" }, - "packageName": "Package Name", + "packageName": "Nome do pacote", "@packageName": { "description": "Package name label" }, @@ -229,7 +229,7 @@ "@clear": { "description": "Clear button label" }, - "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "loadedSampleData": "Carregados {teamCount} membros da equipe, {channelCount} canais, {sarCount} marcadores SAR, {messageCount} mensagens", "@loadedSampleData": { "description": "Success message after loading sample data", "placeholders": { @@ -276,7 +276,7 @@ } } }, - "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "defaultPinInfo": "O PIN padrão para dispositivos sem tela é 123456. Problemas ao parear? Esqueça o dispositivo Bluetooth nas configurações do sistema.", "@defaultPinInfo": { "description": "Information about default PIN for pairing" }, @@ -425,7 +425,7 @@ "@longPressToStartMeasurement": { "description": "Instruction to start measurement" }, - "longPressToStartNewMeasurement": "Long press to start new measurement", + "longPressToStartNewMeasurement": "Pressione e segure para iniciar uma nova medição", "@longPressToStartNewMeasurement": { "description": "Instruction to restart measurement after completion" }, @@ -441,7 +441,7 @@ "@completeLine": { "description": "Tooltip to complete drawing a line" }, - "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "broadcastDrawingsToTeam": "Transmitir {count} desenho{plural} para a equipe", "@broadcastDrawingsToTeam": { "description": "Subtitle showing how many drawings will be broadcast", "placeholders": { @@ -453,7 +453,7 @@ } } }, - "removeAllDrawings": "Remove all {count} drawing{plural}", + "removeAllDrawings": "Remover todos os {count} desenho{plural}", "@removeAllDrawings": { "description": "Subtitle for remove all drawings action", "placeholders": { @@ -465,7 +465,7 @@ } } }, - "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "deleteAllDrawingsConfirm": "Excluir todos os {count} desenho{plural} do mapa?", "@deleteAllDrawingsConfirm": { "description": "Confirmation dialog message for deleting all drawings", "placeholders": { @@ -481,7 +481,7 @@ "@drawing": { "description": "Generic drawing label" }, - "shareDrawingsCount": "Share {count} Drawing{plural}", + "shareDrawingsCount": "Compartilhar {count} desenho{plural}", "@shareDrawingsCount": { "description": "Title for share drawings dialog", "placeholders": { @@ -561,11 +561,11 @@ "@selectDestination": { "description": "Placeholder for destination dropdown" }, - "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "ephemeralBroadcastInfo": "Efêmero: transmitido apenas pelo ar. Não é armazenado; os nós precisam estar online.", "@ephemeralBroadcastInfo": { "description": "Information about ephemeral channel broadcasts" }, - "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "persistentRoomInfo": "Persistente: armazenado de forma imutável na sala. Sincronizado automaticamente e preservado offline.", "@persistentRoomInfo": { "description": "Information about persistent room storage" }, @@ -610,7 +610,7 @@ "@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": "A precisão da localização é ±{accuracy}m. Isso pode não ser preciso o suficiente para operações SAR.\n\nDeseja continuar mesmo assim?", "@lowAccuracyWarning": { "description": "Warning dialog content for low GPS accuracy", "placeholders": { @@ -623,7 +623,7 @@ "@loginToRoom": { "description": "Title for room login dialog" }, - "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "enterPasswordInfo": "Digite a senha para acessar esta sala. A senha será salva para uso futuro.", "@enterPasswordInfo": { "description": "Information about room password" }, @@ -643,7 +643,7 @@ "@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": "Falha ao adicionar a sala ao dispositivo: {error}\n\nA sala talvez ainda não tenha sido anunciada.\nTente esperar a sala começar a transmitir.", "@failedToAddRoom": { "description": "Error message when adding room fails", "placeholders": { @@ -672,7 +672,7 @@ "@distance": { "description": "Distance label" }, - "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "directPingTimeout": "Tempo limite do ping direto - tentando novamente {name} com flooding...", "@directPingTimeout": { "description": "Warning when direct ping times out", "placeholders": { @@ -690,7 +690,7 @@ } } }, - "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": "Tem certeza de que deseja excluir \"{name}\"?\n\nIsso removerá o contato tanto do aplicativo quanto do dispositivo de rádio associado.", "@deleteContactConfirmation": { "description": "Confirmation message for deleting contact", "placeholders": { @@ -788,7 +788,7 @@ "@updated": { "description": "Updated timestamp label" }, - "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "pathResetInfo": "Rota redefinida para {name}. A próxima mensagem encontrará um novo caminho.", "@pathResetInfo": { "description": "Info message after path reset", "placeholders": { @@ -825,7 +825,7 @@ "@filterMarkers": { "description": "Title for filter markers dialog" }, - "filterMarkersTooltip": "Filter markers", + "filterMarkersTooltip": "Filtrar marcadores", "@filterMarkersTooltip": { "description": "Tooltip for filter button" }, @@ -883,7 +883,7 @@ } } }, - "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "latLonFormat": "Lat.: {latitude} Lon.: {longitude}", "@latLonFormat": { "description": "Latitude and longitude display format", "placeholders": { @@ -971,11 +971,11 @@ "@textCopiedToClipboard": { "description": "Success message when text is copied" }, - "cannotReplySenderMissing": "Cannot reply: sender information missing", + "cannotReplySenderMissing": "Não é possível responder: faltam informações do remetente", "@cannotReplySenderMissing": { "description": "Error when sender info is missing for reply" }, - "cannotReplyContactNotFound": "Cannot reply: contact not found", + "cannotReplyContactNotFound": "Não é possível responder: contato não encontrado", "@cannotReplyContactNotFound": { "description": "Error when contact not found for reply" }, @@ -983,15 +983,15 @@ "@copyText": { "description": "Option to copy message text to clipboard" }, - "saveAsTemplate": "Save as Template", + "saveAsTemplate": "Salvar como modelo", "@saveAsTemplate": { "description": "Option to save SAR message as a reusable template" }, - "templateSaved": "Template saved successfully", + "templateSaved": "Modelo salvo com sucesso", "@templateSaved": { "description": "Success message when SAR template is saved" }, - "templateAlreadyExists": "Template with this emoji already exists", + "templateAlreadyExists": "Já existe um modelo com este emoji", "@templateAlreadyExists": { "description": "Error message when trying to save duplicate template" }, @@ -1007,7 +1007,7 @@ "@shareLocation": { "description": "Option to share SAR marker location" }, - "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "shareLocationText": "{markerInfo}\n\nCoordenadas: {lat}, {lon}\n\nGoogle Maps: {url}", "@shareLocationText": { "description": "Formatted text for sharing SAR marker location", "placeholders": { @@ -1098,7 +1098,7 @@ "@broadcast": { "description": "Delivery status for channel messages (no echoes yet)" }, - "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "deliveredToContacts": "Entregue a {delivered}/{total} contatos", "@deliveredToContacts": { "description": "Grouped message delivery count", "placeholders": { @@ -1110,11 +1110,11 @@ } } }, - "allDelivered": "All delivered", + "allDelivered": "Todos entregues", "@allDelivered": { "description": "Status when all recipients received the message" }, - "recipientDetails": "Recipient Details", + "recipientDetails": "Detalhes do destinatário", "@recipientDetails": { "description": "Header for expandable recipient list" }, @@ -1122,19 +1122,19 @@ "@pending": { "description": "Delivery status: pending/waiting" }, - "sarMarkerFoundPerson": "Found Person", + "sarMarkerFoundPerson": "Pessoa encontrada", "@sarMarkerFoundPerson": { "description": "SAR marker type: found person" }, - "sarMarkerFire": "Fire Location", + "sarMarkerFire": "Local do incêndio", "@sarMarkerFire": { "description": "SAR marker type: fire" }, - "sarMarkerStagingArea": "Staging Area", + "sarMarkerStagingArea": "Área de apoio", "@sarMarkerStagingArea": { "description": "SAR marker type: staging area" }, - "sarMarkerObject": "Object Found", + "sarMarkerObject": "Objeto encontrado", "@sarMarkerObject": { "description": "SAR marker type: object" }, @@ -1158,7 +1158,7 @@ "@frequencyMHz": { "description": "Label for radio frequency field" }, - "frequencyExample": "e.g., 869.618", + "frequencyExample": "ex.: 869.618", "@frequencyExample": { "description": "Helper text example for frequency" }, @@ -1277,7 +1277,7 @@ "@noContactsWithLocationHistory": { "description": "Subtitle when no contacts have trails" }, - "showingTrailsForContacts": "Showing trails for {count} contacts", + "showingTrailsForContacts": "Mostrando trilhas de {count} contatos", "@showingTrailsForContacts": { "description": "Subtitle showing number of contacts with trails", "placeholders": { @@ -1346,11 +1346,11 @@ "@telemetryAndLocationSharing": { "description": "Telemetry and location sharing toggle label" }, - "lat": "Lat", + "lat": "Lat.", "@lat": { "description": "Latitude field label (short form)" }, - "lon": "Lon", + "lon": "Lon.", "@lon": { "description": "Longitude field label (short form)" }, @@ -1374,7 +1374,7 @@ "@roomChannel": { "description": "Device type: room or channel" }, - "typeNumber": "Type {number}", + "typeNumber": "Tipo {number}", "@typeNumber": { "description": "Generic device type with number", "placeholders": { @@ -1414,7 +1414,7 @@ "@sarTemplates": { "description": "SAR templates menu title" }, - "manageSarTemplates": "Manage cursor on target templates", + "manageSarTemplates": "Gerenciar modelos SAR", "@manageSarTemplates": { "description": "Subtitle for SAR templates settings" }, @@ -1495,7 +1495,7 @@ "@templateDeleted": { "description": "Success message when template is deleted" }, - "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "templatesImported": "{count, plural, =0{Nenhum modelo importado} =1{1 modelo importado} other{{count} modelos importados}}", "@templatesImported": { "description": "Success message after importing templates", "placeholders": { @@ -1504,7 +1504,7 @@ } } }, - "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "templatesExported": "{count, plural, =1{1 modelo exportado para a área de transferência} other{{count} modelos exportados para a área de transferência}}", "@templatesExported": { "description": "Success message after exporting templates", "placeholders": { @@ -1633,35 +1633,35 @@ "@channel": { "description": "Channel label in notifications" }, - "samplePoliceLead": "Police Lead", + "samplePoliceLead": "Chefe da polícia", "@samplePoliceLead": { "description": "Sample team member name" }, - "sampleDroneOperator": "Drone Operator", + "sampleDroneOperator": "Operador de drone", "@sampleDroneOperator": { "description": "Sample team member name" }, - "sampleFirefighterAlpha": "Firefighter", + "sampleFirefighterAlpha": "Bombeiro", "@sampleFirefighterAlpha": { "description": "Sample team member name" }, - "sampleMedicCharlie": "Medic", + "sampleMedicCharlie": "Paramédico", "@sampleMedicCharlie": { "description": "Sample team member name" }, - "sampleCommandDelta": "Command", + "sampleCommandDelta": "Comando", "@sampleCommandDelta": { "description": "Sample team member name" }, - "sampleFireEngine": "Fire Engine", + "sampleFireEngine": "Caminhão de bombeiros", "@sampleFireEngine": { "description": "Sample team member name" }, - "sampleAirSupport": "Air Support", + "sampleAirSupport": "Apoio aéreo", "@sampleAirSupport": { "description": "Sample team member name" }, - "sampleBaseCoordinator": "Base Coordinator", + "sampleBaseCoordinator": "Coordenador da base", "@sampleBaseCoordinator": { "description": "Sample team member name" }, @@ -1677,155 +1677,155 @@ "@channelUpdates": { "description": "Updates channel name" }, - "sampleTeamMember": "Sample Team Member", + "sampleTeamMember": "Membro de equipe de exemplo", "@sampleTeamMember": { "description": "Sample sender name" }, - "sampleScout": "Sample Scout", + "sampleScout": "Batedor de exemplo", "@sampleScout": { "description": "Sample sender name" }, - "sampleBase": "Sample Base", + "sampleBase": "Base de exemplo", "@sampleBase": { "description": "Sample sender name" }, - "sampleSearcher": "Sample Searcher", + "sampleSearcher": "Buscador de exemplo", "@sampleSearcher": { "description": "Sample sender name" }, - "sampleObjectBackpack": " Backpack found - blue color", + "sampleObjectBackpack": " Mochila encontrada - cor azul", "@sampleObjectBackpack": { "description": "Sample object note" }, - "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "sampleObjectVehicle": " Veículo abandonado - verificar proprietário", "@sampleObjectVehicle": { "description": "Sample object note" }, - "sampleObjectCamping": " Camping equipment discovered", + "sampleObjectCamping": " Equipamento de camping encontrado", "@sampleObjectCamping": { "description": "Sample object note" }, - "sampleObjectTrailMarker": " Trail marker found off-path", + "sampleObjectTrailMarker": " Marco de trilha encontrado fora da rota", "@sampleObjectTrailMarker": { "description": "Sample object note" }, - "sampleMsgAllTeamsCheckIn": "All teams check in", + "sampleMsgAllTeamsCheckIn": "Todas as equipes, façam check-in", "@sampleMsgAllTeamsCheckIn": { "description": "Sample channel message" }, - "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "sampleMsgWeatherUpdate": "Atualização do tempo: céu limpo, temp. 18°C", "@sampleMsgWeatherUpdate": { "description": "Sample channel message" }, - "sampleMsgBaseCamp": "Base camp established at staging area", + "sampleMsgBaseCamp": "Base estabelecida na área de apoio", "@sampleMsgBaseCamp": { "description": "Sample channel message" }, - "sampleMsgTeamAlpha": "Team moving to sector 2", + "sampleMsgTeamAlpha": "Equipe deslocando-se para o setor 2", "@sampleMsgTeamAlpha": { "description": "Sample channel message" }, - "sampleMsgRadioCheck": "Radio check - all stations respond", + "sampleMsgRadioCheck": "Teste de rádio - todas as estações respondam", "@sampleMsgRadioCheck": { "description": "Sample channel message" }, - "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "sampleMsgWaterSupply": "Abastecimento de água disponível no ponto de controle 3", "@sampleMsgWaterSupply": { "description": "Sample channel message" }, - "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "sampleMsgTeamBravo": "Equipe informa: setor 1 livre", "@sampleMsgTeamBravo": { "description": "Sample channel message" }, - "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "sampleMsgEtaRallyPoint": "ETA para o ponto de reunião: 15 minutos", "@sampleMsgEtaRallyPoint": { "description": "Sample channel message" }, - "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "sampleMsgSupplyDrop": "Entrega de suprimentos confirmada para 14:00", "@sampleMsgSupplyDrop": { "description": "Sample channel message" }, - "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "sampleMsgDroneSurvey": "Levantamento com drone concluído - nada encontrado", "@sampleMsgDroneSurvey": { "description": "Sample channel message" }, - "sampleMsgTeamCharlie": "Team requesting backup", + "sampleMsgTeamCharlie": "Equipe solicitando reforço", "@sampleMsgTeamCharlie": { "description": "Sample channel message" }, - "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "sampleMsgRadioDiscipline": "Todas as unidades: mantenham disciplina de rádio", "@sampleMsgRadioDiscipline": { "description": "Sample channel message" }, - "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "sampleMsgUrgentMedical": "URGENTE: assistência médica necessária no setor 4", "@sampleMsgUrgentMedical": { "description": "Sample emergency message" }, - "sampleMsgAdultMale": " Adult male, conscious", + "sampleMsgAdultMale": " Homem adulto, consciente", "@sampleMsgAdultMale": { "description": "Sample emergency message note" }, - "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "sampleMsgFireSpotted": "Incêndio avistado - coordenadas a seguir", "@sampleMsgFireSpotted": { "description": "Sample emergency message" }, - "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "sampleMsgSpreadingRapidly": " Se espalhando rapidamente!", "@sampleMsgSpreadingRapidly": { "description": "Sample emergency message note" }, - "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "sampleMsgPriorityHelicopter": "PRIORIDADE: necessidade de apoio de helicóptero", "@sampleMsgPriorityHelicopter": { "description": "Sample emergency message" }, - "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "sampleMsgMedicalTeamEnRoute": "Equipe médica a caminho da sua localização", "@sampleMsgMedicalTeamEnRoute": { "description": "Sample emergency message" }, - "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "sampleMsgEvacHelicopter": "ETA do helicóptero de evacuação: 10 minutos", "@sampleMsgEvacHelicopter": { "description": "Sample emergency message" }, - "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "sampleMsgEmergencyResolved": "Emergência resolvida - tudo limpo", "@sampleMsgEmergencyResolved": { "description": "Sample emergency message" }, - "sampleMsgEmergencyStagingArea": " Emergency staging area", + "sampleMsgEmergencyStagingArea": " Área de apoio de emergência", "@sampleMsgEmergencyStagingArea": { "description": "Sample emergency message note" }, - "sampleMsgEmergencyServices": "Emergency services notified and responding", + "sampleMsgEmergencyServices": "Serviços de emergência notificados e em deslocamento", "@sampleMsgEmergencyServices": { "description": "Sample emergency message" }, - "sampleAlphaTeamLead": "Team Lead", + "sampleAlphaTeamLead": "Líder da equipe", "@sampleAlphaTeamLead": { "description": "Sample team name" }, - "sampleBravoScout": "Scout", + "sampleBravoScout": "Batedor", "@sampleBravoScout": { "description": "Sample team name" }, - "sampleCharlieMedic": "Medic", + "sampleCharlieMedic": "Paramédico", "@sampleCharlieMedic": { "description": "Sample team name" }, - "sampleDeltaNavigator": "Navigator", + "sampleDeltaNavigator": "Navegador", "@sampleDeltaNavigator": { "description": "Sample team name" }, - "sampleEchoSupport": "Support", + "sampleEchoSupport": "Apoio", "@sampleEchoSupport": { "description": "Sample team name" }, - "sampleBaseCommand": "Base Command", + "sampleBaseCommand": "Comando da base", "@sampleBaseCommand": { "description": "Sample team name" }, - "sampleFieldCoordinator": "Field Coordinator", + "sampleFieldCoordinator": "Coordenador de campo", "@sampleFieldCoordinator": { "description": "Sample team name" }, - "sampleMedicalTeam": "Medical Team", + "sampleMedicalTeam": "Equipe médica", "@sampleMedicalTeam": { "description": "Sample team name" }, @@ -1833,7 +1833,7 @@ "@mapDrawing": { "description": "Label for map drawing messages" }, - "navigateToDrawing": "Navigate to Drawing", + "navigateToDrawing": "Navegar até o desenho", "@navigateToDrawing": { "description": "Option to navigate to drawing on map" }, @@ -1869,7 +1869,7 @@ "@longitudeLabel": { "description": "Label for longitude input field" }, - "exampleCoordinates": "Example: 46.0569, 14.5058", + "exampleCoordinates": "Exemplo: 46.0569, 14.5058", "@exampleCoordinates": { "description": "Example coordinate format hint" }, @@ -1897,7 +1897,7 @@ "@drawingDeleted": { "description": "Success message after deleting a drawing" }, - "yourDrawingsCount": "Your Drawings ({count})", + "yourDrawingsCount": "Seus desenhos ({count})", "@yourDrawingsCount": { "description": "Header showing count of user's drawings", "placeholders": { @@ -1938,55 +1938,55 @@ "@updateLater": { "description": "Button to dismiss update dialog" }, - "cadastralParcels": "Cadastral Parcels", + "cadastralParcels": "Parcelas cadastrais", "@cadastralParcels": { "description": "Label for cadastral parcels WMS overlay layer" }, - "forestRoads": "Forest Roads", + "forestRoads": "Estradas florestais", "@forestRoads": { "description": "Label for forest roads WMS overlay layer" }, - "wmsOverlays": "WMS Overlays", + "wmsOverlays": "Sobreposições WMS", "@wmsOverlays": { "description": "Section header for WMS overlay layers in layer selector" }, - "hikingTrails": "Hiking Trails", + "hikingTrails": "Trilhas de caminhada", "@hikingTrails": { "description": "Label for hiking/mountain trails WMS overlay layer" }, - "mainRoads": "Main Roads", + "mainRoads": "Estradas principais", "@mainRoads": { "description": "Label for main roads WMS overlay layer" }, - "houseNumbers": "House Numbers", + "houseNumbers": "Números de porta", "@houseNumbers": { "description": "Label for house numbers WMS overlay layer" }, - "fireHazardZones": "Fire Hazard Zones", + "fireHazardZones": "Zonas de risco de incêndio", "@fireHazardZones": { "description": "Label for fire hazard risk zones WMS overlay layer" }, - "historicalFires": "Historical Fires", + "historicalFires": "Incêndios históricos", "@historicalFires": { "description": "Label for historical forest fires WMS overlay layer" }, - "firebreaks": "Firebreaks", + "firebreaks": "Aceiros", "@firebreaks": { "description": "Label for firebreaks WMS overlay layer" }, - "krasFireZones": "Kras Fire Zones", + "krasFireZones": "Zonas de incêndio do Karst", "@krasFireZones": { "description": "Label for Kras fire zones WMS overlay layer" }, - "placeNames": "Place Names", + "placeNames": "Topônimos", "@placeNames": { "description": "Label for geographic place names WMS overlay layer" }, - "municipalityBorders": "Municipality Borders", + "municipalityBorders": "Limites municipais", "@municipalityBorders": { "description": "Label for municipality borders WMS overlay layer" }, - "topographicMap": "Topographic Map 1:25000", + "topographicMap": "Mapa topográfico 1:25000", "@topographicMap": { "description": "Label for DTK25 topographic base map layer" }, @@ -2014,15 +2014,15 @@ "@channelSecretHint": { "description": "Hint for channel secret field" }, - "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "channelSecretHelp": "Este segredo deve ser compartilhado com todos os membros da equipe que precisam de acesso a este canal", "@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": "Canais hash (#team): o segredo é gerado automaticamente a partir do nome. Mesmo nome = mesmo canal em todos os dispositivos.\n\nCanais privados: use um segredo explícito. Somente quem tiver o segredo poderá entrar.", "@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": "Canal hash: o segredo será gerado automaticamente a partir do nome do canal. Qualquer pessoa usando o mesmo nome entrará no mesmo canal.", "@hashChannelInfo": { "description": "Help text for hash channels (# prefix)" }, @@ -2030,7 +2030,7 @@ "@channelNameRequired": { "description": "Validation error for empty channel name" }, - "channelNameTooLong": "Channel name must be 31 characters or less", + "channelNameTooLong": "O nome do canal deve ter no máximo 31 caracteres", "@channelNameTooLong": { "description": "Validation error for channel name too long" }, @@ -2038,7 +2038,7 @@ "@channelSecretRequired": { "description": "Validation error for empty channel secret" }, - "channelSecretTooLong": "Channel secret must be 32 characters or less", + "channelSecretTooLong": "O segredo do canal deve ter no máximo 32 caracteres", "@channelSecretTooLong": { "description": "Validation error for channel secret too long" }, @@ -2063,7 +2063,7 @@ "@deleteChannel": { "description": "Delete channel button/menu item" }, - "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "deleteChannelConfirmation": "Tem certeza de que deseja excluir o canal \"{channelName}\"? Esta ação não pode ser desfeita.", "@deleteChannelConfirmation": { "description": "Confirmation dialog when deleting a channel", "placeholders": { @@ -2109,7 +2109,7 @@ "@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": "Uma poderosa ferramenta de comunicação off-grid para operações de busca e resgate. Conecte-se com sua equipe usando tecnologia de rádio mesh quando as redes tradicionais não estiverem disponíveis.", "@wizardWelcomeDescription": { "description": "Welcome wizard first page description" }, @@ -2117,19 +2117,19 @@ "@wizardConnectingTitle": { "description": "Wizard connecting page title" }, - "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "wizardConnectingDescription": "Conecte seu smartphone a um dispositivo de rádio MeshCore via Bluetooth para começar a se comunicar off-grid.", "@wizardConnectingDescription": { "description": "Wizard connecting page description" }, - "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "wizardConnectingFeature1": "Procure dispositivos MeshCore próximos", "@wizardConnectingFeature1": { "description": "Wizard connecting feature 1" }, - "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "wizardConnectingFeature2": "Emparelhe com seu rádio via Bluetooth", "@wizardConnectingFeature2": { "description": "Wizard connecting feature 2" }, - "wizardConnectingFeature3": "Works completely offline - no internet required", + "wizardConnectingFeature3": "Funciona totalmente offline - internet não é necessária", "@wizardConnectingFeature3": { "description": "Wizard connecting feature 3" }, @@ -2137,19 +2137,19 @@ "@wizardChannelTitle": { "description": "Wizard channel page title" }, - "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "wizardChannelDescription": "Transmita mensagens para todos em um canal, ideal para anúncios e coordenação de toda a equipe.", "@wizardChannelDescription": { "description": "Wizard channel page description" }, - "wizardChannelFeature1": "Public Channel for general team communication", + "wizardChannelFeature1": "Canal público para comunicação geral da equipe", "@wizardChannelFeature1": { "description": "Wizard channel feature 1" }, - "wizardChannelFeature2": "Create custom channels for specific groups", + "wizardChannelFeature2": "Crie canais personalizados para grupos específicos", "@wizardChannelFeature2": { "description": "Wizard channel feature 2" }, - "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "wizardChannelFeature3": "As mensagens são retransmitidas automaticamente pela malha", "@wizardChannelFeature3": { "description": "Wizard channel feature 3" }, @@ -2157,19 +2157,19 @@ "@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": "Os membros da sua equipe aparecem automaticamente à medida que entram na rede mesh. Envie mensagens diretas ou veja a localização deles.", "@wizardContactsDescription": { "description": "Wizard contacts page description" }, - "wizardContactsFeature1": "Contacts discovered automatically", + "wizardContactsFeature1": "Contatos descobertos automaticamente", "@wizardContactsFeature1": { "description": "Wizard contacts feature 1" }, - "wizardContactsFeature2": "Send private direct messages", + "wizardContactsFeature2": "Envie mensagens diretas privadas", "@wizardContactsFeature2": { "description": "Wizard contacts feature 2" }, - "wizardContactsFeature3": "View battery level and last seen time", + "wizardContactsFeature3": "Veja o nível de bateria e o horário da última visualização", "@wizardContactsFeature3": { "description": "Wizard contacts feature 3" }, @@ -2177,23 +2177,23 @@ "@wizardMapTitle": { "description": "Wizard map page title" }, - "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "wizardMapDescription": "Acompanhe sua equipe em tempo real e marque locais importantes para operações de busca e resgate.", "@wizardMapDescription": { "description": "Wizard map page description" }, - "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "wizardMapFeature1": "Marcadores SAR para pessoas encontradas, incêndios e áreas de apoio", "@wizardMapFeature1": { "description": "Wizard map feature 1" }, - "wizardMapFeature2": "Real-time GPS tracking of team members", + "wizardMapFeature2": "Rastreamento GPS em tempo real dos membros da equipe", "@wizardMapFeature2": { "description": "Wizard map feature 2" }, - "wizardMapFeature3": "Download offline maps for remote areas", + "wizardMapFeature3": "Baixe mapas offline para áreas remotas", "@wizardMapFeature3": { "description": "Wizard map feature 3" }, - "wizardMapFeature4": "Draw shapes and share tactical information", + "wizardMapFeature4": "Desenhe formas e compartilhe informações táticas", "@wizardMapFeature4": { "description": "Wizard map feature 4" }, @@ -2205,7 +2205,7 @@ "@allTeamContacts": { "description": "Destination option to send SAR marker to all team contacts" }, - "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "directMessagesInfo": "Mensagens diretas com ACKs. Enviadas para {count} membros da equipe.", "@directMessagesInfo": { "description": "Information about sending to all contacts", "placeholders": { @@ -2214,7 +2214,7 @@ } } }, - "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "sarMarkerSentToContacts": "Marcador SAR enviado para {count} contatos", "@sarMarkerSentToContacts": { "description": "Success message after sending SAR marker to all contacts", "placeholders": { @@ -2231,50 +2231,50 @@ "@reply": {}, "technicalDetails": "Detalhes técnicos", "@technicalDetails": {}, - "messageTechnicalDetails": "Message technical details", + "messageTechnicalDetails": "Detalhes técnicos da mensagem", "@messageTechnicalDetails": {}, - "linkQuality": "Link quality", + "linkQuality": "Qualidade do link", "@linkQuality": {}, - "delivery": "Delivery", + "delivery": "Entrega", "@delivery": {}, "status": "Status", "@status": {}, - "expectedAckTag": "Expected ACK tag", + "expectedAckTag": "Tag ACK esperada", "@expectedAckTag": {}, - "roundTrip": "Round-trip", + "roundTrip": "Ida e volta", "@roundTrip": {}, - "retryAttempt": "Retry attempt", + "retryAttempt": "Tentativa de repetição", "@retryAttempt": {}, - "floodFallback": "Flood fallback", + "floodFallback": "Fallback de flooding", "@floodFallback": {}, - "identity": "Identity", + "identity": "Identidade", "@identity": {}, - "messageId": "Message ID", + "messageId": "ID da mensagem", "@messageId": {}, - "sender": "Sender", + "sender": "Remetente", "@sender": {}, - "senderKey": "Sender key", + "senderKey": "Chave do remetente", "@senderKey": {}, - "recipient": "Recipient", + "recipient": "Destinatário", "@recipient": {}, - "recipientKey": "Recipient key", + "recipientKey": "Chave do destinatário", "@recipientKey": {}, "voice": "Voz", "@voice": {}, - "voiceId": "Voice ID", + "voiceId": "ID de voz", "@voiceId": {}, "envelope": "Envelope", "@envelope": {}, - "sessionProgress": "Session progress", + "sessionProgress": "Progresso da sessão", "@sessionProgress": {}, "complete": "Concluído", "@complete": {}, - "rawDump": "Raw dump", + "rawDump": "Dump bruto", "@rawDump": {}, - "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "cannotRetryMissingRecipient": "Não é possível repetir: faltam informações do destinatário", "@cannotRetryMissingRecipient": {}, "voiceUnavailable": "A voz não está disponível no momento", "@voiceUnavailable": {}, - "requestingVoice": "Requesting voice", + "requestingVoice": "Solicitando voz", "@requestingVoice": {} } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index b406913..fd5f5f6 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -177,19 +177,19 @@ "@appName": { "description": "App name label" }, - "aboutMeshCoreSar": "About MeshCore SAR", + "aboutMeshCoreSar": "MeshCore SAR hakkında", "@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": "Acil durum müdahale ekipleri için tasarlanmış bir Arama ve Kurtarma uygulaması. Özellikler:\n\n• Cihazdan cihaza iletişim için BLE mesh ağı\n• Birden çok katman seçeneğiyle çevrimdışı haritalar\n• Ekip üyelerinin gerçek zamanlı takibi\n• SAR taktik işaretleri (bulunan kişi, yangın, toplanma alanı)\n• Kişi yönetimi ve mesajlaşma\n• Pusula yönüyle GPS takibi\n• Çevrimdışı kullanım için harita karo önbelleği", "@aboutDescription": { "description": "About dialog description" }, - "technologiesUsed": "Technologies Used:", + "technologiesUsed": "Kullanılan teknolojiler:", "@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": "• Çok platformlu geliştirme için Flutter\n• Mesh ağı için BLE (Bluetooth Low Energy)\n• Haritalama için OpenStreetMap\n• Durum yönetimi için Provider\n• Yerel depolama için SharedPreferences", "@technologiesList": { "description": "List of technologies used" }, @@ -197,7 +197,7 @@ "@moreInfo": { "description": "More info button label" }, - "packageName": "Package Name", + "packageName": "Paket adı", "@packageName": { "description": "Package name label" }, @@ -205,7 +205,7 @@ "@sampleData": { "description": "Sample data section header" }, - "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "sampleDataDescription": "Test için örnek kişiler, kanal mesajları ve SAR işaretleri yükleyin veya temizleyin", "@sampleDataDescription": { "description": "Sample data section description" }, @@ -229,7 +229,7 @@ "@clear": { "description": "Clear button label" }, - "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "loadedSampleData": "{teamCount} ekip üyesi, {channelCount} kanal, {sarCount} SAR işareti, {messageCount} mesaj yüklendi", "@loadedSampleData": { "description": "Success message after loading sample data", "placeholders": { @@ -260,11 +260,11 @@ "@allDataCleared": { "description": "Success message after clearing all data" }, - "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "failedToStartBackgroundTracking": "Arka plan takibi başlatılamadı. İzinleri ve BLE bağlantısını kontrol edin.", "@failedToStartBackgroundTracking": { "description": "Error message when background tracking fails to start" }, - "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "locationBroadcast": "Konum yayını: {latitude}, {longitude}", "@locationBroadcast": { "description": "Success message for location broadcast", "placeholders": { @@ -276,7 +276,7 @@ } } }, - "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "defaultPinInfo": "Ekranı olmayan cihazlar için varsayılan PIN 123456’dır. Eşleştirme sorunu mu yaşıyorsunuz? Sistem ayarlarından Bluetooth cihazını unutun.", "@defaultPinInfo": { "description": "Information about default PIN for pairing" }, @@ -304,7 +304,7 @@ "@refresh": { "description": "Refresh button label" }, - "resetPath": "Reset Path (Re-route)", + "resetPath": "Yolu sıfırla (yeniden yönlendir)", "@resetPath": { "description": "Action to reset contact path for re-routing" }, @@ -417,15 +417,15 @@ } } }, - "longPressForSecondPoint": "Long press for second point", + "longPressForSecondPoint": "İkinci nokta için uzun basın", "@longPressForSecondPoint": { "description": "Instruction when first measurement point is set" }, - "longPressToStartMeasurement": "Long press to set first point", + "longPressToStartMeasurement": "İlk noktayı ayarlamak için uzun basın", "@longPressToStartMeasurement": { "description": "Instruction to start measurement" }, - "longPressToStartNewMeasurement": "Long press to start new measurement", + "longPressToStartNewMeasurement": "Yeni ölçüm başlatmak için uzun basın", "@longPressToStartNewMeasurement": { "description": "Instruction to restart measurement after completion" }, @@ -437,11 +437,11 @@ "@clearAllDrawings": { "description": "Action to clear all local drawings" }, - "completeLine": "Complete Line", + "completeLine": "Çizgiyi tamamla", "@completeLine": { "description": "Tooltip to complete drawing a line" }, - "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "broadcastDrawingsToTeam": "{count} çizim{plural} ekibe yayınla", "@broadcastDrawingsToTeam": { "description": "Subtitle showing how many drawings will be broadcast", "placeholders": { @@ -453,7 +453,7 @@ } } }, - "removeAllDrawings": "Remove all {count} drawing{plural}", + "removeAllDrawings": "Tüm {count} çizim{plural} kaldır", "@removeAllDrawings": { "description": "Subtitle for remove all drawings action", "placeholders": { @@ -465,7 +465,7 @@ } } }, - "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "deleteAllDrawingsConfirm": "Haritadaki tüm {count} çizim{plural} silinsin mi?", "@deleteAllDrawingsConfirm": { "description": "Confirmation dialog message for deleting all drawings", "placeholders": { @@ -481,7 +481,7 @@ "@drawing": { "description": "Generic drawing label" }, - "shareDrawingsCount": "Share {count} Drawing{plural}", + "shareDrawingsCount": "{count} çizim{plural} paylaş", "@shareDrawingsCount": { "description": "Title for share drawings dialog", "placeholders": { @@ -525,7 +525,7 @@ "@publicChannel": { "description": "Public channel option for sharing" }, - "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "broadcastToAll": "Yakındaki tüm düğümlere yayınla (geçici)", "@broadcastToAll": { "description": "Description for public channel broadcast" }, @@ -561,11 +561,11 @@ "@selectDestination": { "description": "Placeholder for destination dropdown" }, - "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "ephemeralBroadcastInfo": "Geçici: yalnızca havadan yayınlanır. Saklanmaz; düğümlerin çevrimiçi olması gerekir.", "@ephemeralBroadcastInfo": { "description": "Information about ephemeral channel broadcasts" }, - "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "persistentRoomInfo": "Kalıcı: odada değişmez şekilde saklanır. Otomatik olarak eşitlenir ve çevrimdışı korunur.", "@persistentRoomInfo": { "description": "Information about persistent room storage" }, @@ -610,7 +610,7 @@ "@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": "Konum doğruluğu ±{accuracy}m. Bu, SAR operasyonları için yeterince doğru olmayabilir.\n\nYine de devam edilsin mi?", "@lowAccuracyWarning": { "description": "Warning dialog content for low GPS accuracy", "placeholders": { @@ -623,7 +623,7 @@ "@loginToRoom": { "description": "Title for room login dialog" }, - "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "enterPasswordInfo": "Bu odaya erişmek için parolayı girin. Parola daha sonra kullanılmak üzere kaydedilecektir.", "@enterPasswordInfo": { "description": "Information about room password" }, @@ -643,7 +643,7 @@ "@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": "Oda cihaza eklenemedi: {error}\n\nOda henüz yayın yapmamış olabilir.\nYayın yapmasını beklemeyi deneyin.", "@failedToAddRoom": { "description": "Error message when adding room fails", "placeholders": { @@ -656,7 +656,7 @@ "@direct": { "description": "Direct routing indicator" }, - "flood": "Flood", + "flood": "Yayılım", "@flood": { "description": "Flood routing indicator" }, @@ -672,7 +672,7 @@ "@distance": { "description": "Distance label" }, - "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "directPingTimeout": "Doğrudan ping zaman aşımına uğradı - {name} flooding ile yeniden deneniyor...", "@directPingTimeout": { "description": "Warning when direct ping times out", "placeholders": { @@ -690,7 +690,7 @@ } } }, - "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": "\"{name}\" kişisini silmek istediğinizden emin misiniz?\n\nBu işlem kişiyi hem uygulamadan hem de bağlı radyo cihazından kaldıracaktır.", "@deleteContactConfirmation": { "description": "Confirmation message for deleting contact", "placeholders": { @@ -788,7 +788,7 @@ "@updated": { "description": "Updated timestamp label" }, - "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "pathResetInfo": "{name} için yol sıfırlandı. Sonraki mesaj yeni bir rota bulacak.", "@pathResetInfo": { "description": "Info message after path reset", "placeholders": { @@ -825,7 +825,7 @@ "@filterMarkers": { "description": "Title for filter markers dialog" }, - "filterMarkersTooltip": "Filter markers", + "filterMarkersTooltip": "İşaretleri filtrele", "@filterMarkersTooltip": { "description": "Tooltip for filter button" }, @@ -883,7 +883,7 @@ } } }, - "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "latLonFormat": "Enl: {latitude} Boy: {longitude}", "@latLonFormat": { "description": "Latitude and longitude display format", "placeholders": { @@ -971,11 +971,11 @@ "@textCopiedToClipboard": { "description": "Success message when text is copied" }, - "cannotReplySenderMissing": "Cannot reply: sender information missing", + "cannotReplySenderMissing": "Yanıtlanamıyor: gönderen bilgisi eksik", "@cannotReplySenderMissing": { "description": "Error when sender info is missing for reply" }, - "cannotReplyContactNotFound": "Cannot reply: contact not found", + "cannotReplyContactNotFound": "Yanıtlanamıyor: kişi bulunamadı", "@cannotReplyContactNotFound": { "description": "Error when contact not found for reply" }, @@ -983,15 +983,15 @@ "@copyText": { "description": "Option to copy message text to clipboard" }, - "saveAsTemplate": "Save as Template", + "saveAsTemplate": "Şablon olarak kaydet", "@saveAsTemplate": { "description": "Option to save SAR message as a reusable template" }, - "templateSaved": "Template saved successfully", + "templateSaved": "Şablon başarıyla kaydedildi", "@templateSaved": { "description": "Success message when SAR template is saved" }, - "templateAlreadyExists": "Template with this emoji already exists", + "templateAlreadyExists": "Bu emoji ile bir şablon zaten var", "@templateAlreadyExists": { "description": "Error message when trying to save duplicate template" }, @@ -1007,7 +1007,7 @@ "@shareLocation": { "description": "Option to share SAR marker location" }, - "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "shareLocationText": "{markerInfo}\n\nKoordinatlar: {lat}, {lon}\n\nGoogle Maps: {url}", "@shareLocationText": { "description": "Formatted text for sharing SAR marker location", "placeholders": { @@ -1098,7 +1098,7 @@ "@broadcast": { "description": "Delivery status for channel messages (no echoes yet)" }, - "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "deliveredToContacts": "{delivered}/{total} kişiye teslim edildi", "@deliveredToContacts": { "description": "Grouped message delivery count", "placeholders": { @@ -1110,11 +1110,11 @@ } } }, - "allDelivered": "All delivered", + "allDelivered": "Hepsi teslim edildi", "@allDelivered": { "description": "Status when all recipients received the message" }, - "recipientDetails": "Recipient Details", + "recipientDetails": "Alıcı ayrıntıları", "@recipientDetails": { "description": "Header for expandable recipient list" }, @@ -1122,19 +1122,19 @@ "@pending": { "description": "Delivery status: pending/waiting" }, - "sarMarkerFoundPerson": "Found Person", + "sarMarkerFoundPerson": "Bulunan kişi", "@sarMarkerFoundPerson": { "description": "SAR marker type: found person" }, - "sarMarkerFire": "Fire Location", + "sarMarkerFire": "Yangın konumu", "@sarMarkerFire": { "description": "SAR marker type: fire" }, - "sarMarkerStagingArea": "Staging Area", + "sarMarkerStagingArea": "Toplanma alanı", "@sarMarkerStagingArea": { "description": "SAR marker type: staging area" }, - "sarMarkerObject": "Object Found", + "sarMarkerObject": "Bulunan nesne", "@sarMarkerObject": { "description": "SAR marker type: object" }, @@ -1158,7 +1158,7 @@ "@frequencyMHz": { "description": "Label for radio frequency field" }, - "frequencyExample": "e.g., 869.618", + "frequencyExample": "örn. 869.618", "@frequencyExample": { "description": "Helper text example for frequency" }, @@ -1249,7 +1249,7 @@ "@clearTrailQuestion": { "description": "Confirmation dialog title" }, - "clearTrailConfirmation": "Are you sure you want to clear the current location trail? This action cannot be undone.", + "clearTrailConfirmation": "Geçerli konum izini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "@clearTrailConfirmation": { "description": "Confirmation dialog message" }, @@ -1277,7 +1277,7 @@ "@noContactsWithLocationHistory": { "description": "Subtitle when no contacts have trails" }, - "showingTrailsForContacts": "Showing trails for {count} contacts", + "showingTrailsForContacts": "{count} kişi için izler gösteriliyor", "@showingTrailsForContacts": { "description": "Subtitle showing number of contacts with trails", "placeholders": { @@ -1286,7 +1286,7 @@ } } }, - "individualContactTrails": "Individual Contact Trails", + "individualContactTrails": "Tek tek kişi izleri", "@individualContactTrails": { "description": "Expansion tile title for individual contact trails" }, @@ -1338,7 +1338,7 @@ "@meshNetworkName": { "description": "Mesh network name field label" }, - "nameBroadcastInMesh": "Name broadcast in mesh advertisements", + "nameBroadcastInMesh": "Mesh duyurularında yayınlanan ad", "@nameBroadcastInMesh": { "description": "Helper text for mesh network name field" }, @@ -1374,7 +1374,7 @@ "@roomChannel": { "description": "Device type: room or channel" }, - "typeNumber": "Type {number}", + "typeNumber": "Tür {number}", "@typeNumber": { "description": "Generic device type with number", "placeholders": { @@ -1383,7 +1383,7 @@ } } }, - "copiedToClipboardShort": "Copied {label} to clipboard", + "copiedToClipboardShort": "{label} panoya kopyalandı", "@copiedToClipboardShort": { "description": "Short success message when copying to clipboard", "placeholders": { @@ -1414,7 +1414,7 @@ "@sarTemplates": { "description": "SAR templates menu title" }, - "manageSarTemplates": "Manage cursor on target templates", + "manageSarTemplates": "SAR şablonlarını yönet", "@manageSarTemplates": { "description": "Subtitle for SAR templates settings" }, @@ -1495,7 +1495,7 @@ "@templateDeleted": { "description": "Success message when template is deleted" }, - "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "templatesImported": "{count, plural, =0{Şablon içe aktarılmadı} =1{1 şablon içe aktarıldı} other{{count} şablon içe aktarıldı}}", "@templatesImported": { "description": "Success message after importing templates", "placeholders": { @@ -1504,7 +1504,7 @@ } } }, - "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "templatesExported": "{count, plural, =1{1 şablon panoya aktarıldı} other{{count} şablon panoya aktarıldı}}", "@templatesExported": { "description": "Success message after exporting templates", "placeholders": { @@ -1517,7 +1517,7 @@ "@resetToDefaults": { "description": "Action to reset templates to defaults" }, - "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "resetToDefaultsConfirmation": "Bu işlem tüm özel şablonları silecek ve 4 varsayılan şablonu geri yükleyecek. Devam edilsin mi?", "@resetToDefaultsConfirmation": { "description": "Confirmation message for reset to defaults" }, @@ -1569,7 +1569,7 @@ "@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": "Konum izni kalıcı olarak reddedildi. GPS takibi ve konum paylaşımını kullanmak için lütfen cihaz ayarlarından etkinleştirin.", "@locationPermissionDialogContent": { "description": "Content for location permission dialog when permanently denied" }, @@ -1589,11 +1589,11 @@ "@locationPermissionAlreadyGranted": { "description": "Info message when permission is already granted" }, - "sarNavyBlue": "SAR Navy Blue", + "sarNavyBlue": "SAR Lacivert", "@sarNavyBlue": { "description": "SAR Navy Blue theme name" }, - "sarNavyBlueDescription": "Professional/Operations Mode", + "sarNavyBlueDescription": "Profesyonel/Operasyon modu", "@sarNavyBlueDescription": { "description": "Description for SAR Navy Blue theme" }, @@ -1601,7 +1601,7 @@ "@selectRecipient": { "description": "Title for recipient selector sheet" }, - "broadcastToAllNearby": "Broadcast to all nearby", + "broadcastToAllNearby": "Yakındaki herkese yayınla", "@broadcastToAllNearby": { "description": "Subtitle for public channel option" }, @@ -1633,35 +1633,35 @@ "@channel": { "description": "Channel label in notifications" }, - "samplePoliceLead": "Police Lead", + "samplePoliceLead": "Polis lideri", "@samplePoliceLead": { "description": "Sample team member name" }, - "sampleDroneOperator": "Drone Operator", + "sampleDroneOperator": "Drone operatörü", "@sampleDroneOperator": { "description": "Sample team member name" }, - "sampleFirefighterAlpha": "Firefighter", + "sampleFirefighterAlpha": "İtfaiyeci", "@sampleFirefighterAlpha": { "description": "Sample team member name" }, - "sampleMedicCharlie": "Medic", + "sampleMedicCharlie": "Sağlık görevlisi", "@sampleMedicCharlie": { "description": "Sample team member name" }, - "sampleCommandDelta": "Command", + "sampleCommandDelta": "Komuta", "@sampleCommandDelta": { "description": "Sample team member name" }, - "sampleFireEngine": "Fire Engine", + "sampleFireEngine": "İtfaiye aracı", "@sampleFireEngine": { "description": "Sample team member name" }, - "sampleAirSupport": "Air Support", + "sampleAirSupport": "Hava desteği", "@sampleAirSupport": { "description": "Sample team member name" }, - "sampleBaseCoordinator": "Base Coordinator", + "sampleBaseCoordinator": "Üs koordinatörü", "@sampleBaseCoordinator": { "description": "Sample team member name" }, @@ -1677,155 +1677,155 @@ "@channelUpdates": { "description": "Updates channel name" }, - "sampleTeamMember": "Sample Team Member", + "sampleTeamMember": "Örnek ekip üyesi", "@sampleTeamMember": { "description": "Sample sender name" }, - "sampleScout": "Sample Scout", + "sampleScout": "Örnek keşifçi", "@sampleScout": { "description": "Sample sender name" }, - "sampleBase": "Sample Base", + "sampleBase": "Örnek üs", "@sampleBase": { "description": "Sample sender name" }, - "sampleSearcher": "Sample Searcher", + "sampleSearcher": "Örnek arayıcı", "@sampleSearcher": { "description": "Sample sender name" }, - "sampleObjectBackpack": " Backpack found - blue color", + "sampleObjectBackpack": " Sırt çantası bulundu - mavi renk", "@sampleObjectBackpack": { "description": "Sample object note" }, - "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "sampleObjectVehicle": " Terk edilmiş araç - sahibi kontrol edin", "@sampleObjectVehicle": { "description": "Sample object note" }, - "sampleObjectCamping": " Camping equipment discovered", + "sampleObjectCamping": " Kamp ekipmanı bulundu", "@sampleObjectCamping": { "description": "Sample object note" }, - "sampleObjectTrailMarker": " Trail marker found off-path", + "sampleObjectTrailMarker": " Yol dışında patika işareti bulundu", "@sampleObjectTrailMarker": { "description": "Sample object note" }, - "sampleMsgAllTeamsCheckIn": "All teams check in", + "sampleMsgAllTeamsCheckIn": "Tüm ekipler durum bildirimi yapsın", "@sampleMsgAllTeamsCheckIn": { "description": "Sample channel message" }, - "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "sampleMsgWeatherUpdate": "Hava durumu: açık gökyüzü, sıcaklık 18°C", "@sampleMsgWeatherUpdate": { "description": "Sample channel message" }, - "sampleMsgBaseCamp": "Base camp established at staging area", + "sampleMsgBaseCamp": "Üs kampı toplanma alanında kuruldu", "@sampleMsgBaseCamp": { "description": "Sample channel message" }, - "sampleMsgTeamAlpha": "Team moving to sector 2", + "sampleMsgTeamAlpha": "Ekip sektör 2’ye ilerliyor", "@sampleMsgTeamAlpha": { "description": "Sample channel message" }, - "sampleMsgRadioCheck": "Radio check - all stations respond", + "sampleMsgRadioCheck": "Telsiz kontrolü - tüm istasyonlar yanıt versin", "@sampleMsgRadioCheck": { "description": "Sample channel message" }, - "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "sampleMsgWaterSupply": "Su ikmali 3 numaralı kontrol noktasında mevcut", "@sampleMsgWaterSupply": { "description": "Sample channel message" }, - "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "sampleMsgTeamBravo": "Ekip raporu: sektör 1 temiz", "@sampleMsgTeamBravo": { "description": "Sample channel message" }, - "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "sampleMsgEtaRallyPoint": "Toplanma noktasına tahmini varış: 15 dakika", "@sampleMsgEtaRallyPoint": { "description": "Sample channel message" }, - "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "sampleMsgSupplyDrop": "İkmal bırakma 14:00 için onaylandı", "@sampleMsgSupplyDrop": { "description": "Sample channel message" }, - "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "sampleMsgDroneSurvey": "Drone taraması tamamlandı - bulgu yok", "@sampleMsgDroneSurvey": { "description": "Sample channel message" }, - "sampleMsgTeamCharlie": "Team requesting backup", + "sampleMsgTeamCharlie": "Ekip takviye istiyor", "@sampleMsgTeamCharlie": { "description": "Sample channel message" }, - "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "sampleMsgRadioDiscipline": "Tüm birimler: telsiz disiplinini koruyun", "@sampleMsgRadioDiscipline": { "description": "Sample channel message" }, - "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "sampleMsgUrgentMedical": "ACİL: sektör 4’te tıbbi yardım gerekli", "@sampleMsgUrgentMedical": { "description": "Sample emergency message" }, - "sampleMsgAdultMale": " Adult male, conscious", + "sampleMsgAdultMale": " Yetişkin erkek, bilinci açık", "@sampleMsgAdultMale": { "description": "Sample emergency message note" }, - "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "sampleMsgFireSpotted": "Yangın görüldü - koordinatlar geliyor", "@sampleMsgFireSpotted": { "description": "Sample emergency message" }, - "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "sampleMsgSpreadingRapidly": " Hızla yayılıyor!", "@sampleMsgSpreadingRapidly": { "description": "Sample emergency message note" }, - "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "sampleMsgPriorityHelicopter": "ÖNCELİK: helikopter desteği gerekli", "@sampleMsgPriorityHelicopter": { "description": "Sample emergency message" }, - "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "sampleMsgMedicalTeamEnRoute": "Tıbbi ekip konumunuza geliyor", "@sampleMsgMedicalTeamEnRoute": { "description": "Sample emergency message" }, - "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "sampleMsgEvacHelicopter": "Tahliye helikopteri ETA 10 dakika", "@sampleMsgEvacHelicopter": { "description": "Sample emergency message" }, - "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "sampleMsgEmergencyResolved": "Acil durum çözüldü - tehlike yok", "@sampleMsgEmergencyResolved": { "description": "Sample emergency message" }, - "sampleMsgEmergencyStagingArea": " Emergency staging area", + "sampleMsgEmergencyStagingArea": " Acil durum toplanma alanı", "@sampleMsgEmergencyStagingArea": { "description": "Sample emergency message note" }, - "sampleMsgEmergencyServices": "Emergency services notified and responding", + "sampleMsgEmergencyServices": "Acil servisler bilgilendirildi ve müdahale ediyor", "@sampleMsgEmergencyServices": { "description": "Sample emergency message" }, - "sampleAlphaTeamLead": "Team Lead", + "sampleAlphaTeamLead": "Ekip lideri", "@sampleAlphaTeamLead": { "description": "Sample team name" }, - "sampleBravoScout": "Scout", + "sampleBravoScout": "Keşifçi", "@sampleBravoScout": { "description": "Sample team name" }, - "sampleCharlieMedic": "Medic", + "sampleCharlieMedic": "Sağlık görevlisi", "@sampleCharlieMedic": { "description": "Sample team name" }, - "sampleDeltaNavigator": "Navigator", + "sampleDeltaNavigator": "Navigatör", "@sampleDeltaNavigator": { "description": "Sample team name" }, - "sampleEchoSupport": "Support", + "sampleEchoSupport": "Destek", "@sampleEchoSupport": { "description": "Sample team name" }, - "sampleBaseCommand": "Base Command", + "sampleBaseCommand": "Üs komutası", "@sampleBaseCommand": { "description": "Sample team name" }, - "sampleFieldCoordinator": "Field Coordinator", + "sampleFieldCoordinator": "Saha koordinatörü", "@sampleFieldCoordinator": { "description": "Sample team name" }, - "sampleMedicalTeam": "Medical Team", + "sampleMedicalTeam": "Tıbbi ekip", "@sampleMedicalTeam": { "description": "Sample team name" }, @@ -1833,7 +1833,7 @@ "@mapDrawing": { "description": "Label for map drawing messages" }, - "navigateToDrawing": "Navigate to Drawing", + "navigateToDrawing": "Çizime git", "@navigateToDrawing": { "description": "Option to navigate to drawing on map" }, @@ -1869,7 +1869,7 @@ "@longitudeLabel": { "description": "Label for longitude input field" }, - "exampleCoordinates": "Example: 46.0569, 14.5058", + "exampleCoordinates": "Örnek: 46.0569, 14.5058", "@exampleCoordinates": { "description": "Example coordinate format hint" }, @@ -1889,7 +1889,7 @@ "@sendToPersistentStorage": { "description": "Subtitle for room sharing option" }, - "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "deleteDrawingConfirm": "Bu çizimi silmek istediğinizden emin misiniz?", "@deleteDrawingConfirm": { "description": "Confirmation message for deleting a single drawing" }, @@ -1897,7 +1897,7 @@ "@drawingDeleted": { "description": "Success message after deleting a drawing" }, - "yourDrawingsCount": "Your Drawings ({count})", + "yourDrawingsCount": "Çizimleriniz ({count})", "@yourDrawingsCount": { "description": "Header showing count of user's drawings", "placeholders": { @@ -1938,55 +1938,55 @@ "@updateLater": { "description": "Button to dismiss update dialog" }, - "cadastralParcels": "Cadastral Parcels", + "cadastralParcels": "Kadastro parselleri", "@cadastralParcels": { "description": "Label for cadastral parcels WMS overlay layer" }, - "forestRoads": "Forest Roads", + "forestRoads": "Orman yolları", "@forestRoads": { "description": "Label for forest roads WMS overlay layer" }, - "wmsOverlays": "WMS Overlays", + "wmsOverlays": "WMS katmanları", "@wmsOverlays": { "description": "Section header for WMS overlay layers in layer selector" }, - "hikingTrails": "Hiking Trails", + "hikingTrails": "Yürüyüş parkurları", "@hikingTrails": { "description": "Label for hiking/mountain trails WMS overlay layer" }, - "mainRoads": "Main Roads", + "mainRoads": "Ana yollar", "@mainRoads": { "description": "Label for main roads WMS overlay layer" }, - "houseNumbers": "House Numbers", + "houseNumbers": "Kapı numaraları", "@houseNumbers": { "description": "Label for house numbers WMS overlay layer" }, - "fireHazardZones": "Fire Hazard Zones", + "fireHazardZones": "Yangın tehlike bölgeleri", "@fireHazardZones": { "description": "Label for fire hazard risk zones WMS overlay layer" }, - "historicalFires": "Historical Fires", + "historicalFires": "Geçmiş yangınlar", "@historicalFires": { "description": "Label for historical forest fires WMS overlay layer" }, - "firebreaks": "Firebreaks", + "firebreaks": "Yangın şeritleri", "@firebreaks": { "description": "Label for firebreaks WMS overlay layer" }, - "krasFireZones": "Kras Fire Zones", + "krasFireZones": "Kras yangın bölgeleri", "@krasFireZones": { "description": "Label for Kras fire zones WMS overlay layer" }, - "placeNames": "Place Names", + "placeNames": "Yer adları", "@placeNames": { "description": "Label for geographic place names WMS overlay layer" }, - "municipalityBorders": "Municipality Borders", + "municipalityBorders": "Belediye sınırları", "@municipalityBorders": { "description": "Label for municipality borders WMS overlay layer" }, - "topographicMap": "Topographic Map 1:25000", + "topographicMap": "Topoğrafik harita 1:25000", "@topographicMap": { "description": "Label for DTK25 topographic base map layer" }, @@ -2014,15 +2014,15 @@ "@channelSecretHint": { "description": "Hint for channel secret field" }, - "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "channelSecretHelp": "Bu sır, bu kanala erişmesi gereken tüm ekip üyeleriyle paylaşılmalıdır", "@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": "Hash kanallar (#team): sır, isimden otomatik üretilir. Aynı isim = tüm cihazlarda aynı kanal.\n\nÖzel kanallar: açık bir sır kullanın. Yalnızca sırrı bilenler katılabilir.", "@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": "Hash kanal: sır kanal adından otomatik üretilecektir. Aynı adı kullanan herkes aynı kanala katılır.", "@hashChannelInfo": { "description": "Help text for hash channels (# prefix)" }, @@ -2030,7 +2030,7 @@ "@channelNameRequired": { "description": "Validation error for empty channel name" }, - "channelNameTooLong": "Channel name must be 31 characters or less", + "channelNameTooLong": "Kanal adı en fazla 31 karakter olabilir", "@channelNameTooLong": { "description": "Validation error for channel name too long" }, @@ -2038,7 +2038,7 @@ "@channelSecretRequired": { "description": "Validation error for empty channel secret" }, - "channelSecretTooLong": "Channel secret must be 32 characters or less", + "channelSecretTooLong": "Kanal sırrı en fazla 32 karakter olabilir", "@channelSecretTooLong": { "description": "Validation error for channel secret too long" }, @@ -2063,7 +2063,7 @@ "@deleteChannel": { "description": "Delete channel button/menu item" }, - "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "deleteChannelConfirmation": "\"{channelName}\" kanalını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "@deleteChannelConfirmation": { "description": "Confirmation dialog when deleting a channel", "placeholders": { @@ -2109,7 +2109,7 @@ "@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": "Arama ve kurtarma operasyonları için güçlü bir şebeke dışı iletişim aracı. Geleneksel ağlar kullanılamadığında ekibinizle mesh radyo teknolojisi üzerinden bağlantı kurun.", "@wizardWelcomeDescription": { "description": "Welcome wizard first page description" }, @@ -2117,19 +2117,19 @@ "@wizardConnectingTitle": { "description": "Wizard connecting page title" }, - "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "wizardConnectingDescription": "Şebeke dışı iletişime başlamak için akıllı telefonunuzu Bluetooth üzerinden bir MeshCore radyo cihazına bağlayın.", "@wizardConnectingDescription": { "description": "Wizard connecting page description" }, - "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "wizardConnectingFeature1": "Yakındaki MeshCore cihazlarını tarayın", "@wizardConnectingFeature1": { "description": "Wizard connecting feature 1" }, - "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "wizardConnectingFeature2": "Radyonuzla Bluetooth üzerinden eşleşin", "@wizardConnectingFeature2": { "description": "Wizard connecting feature 2" }, - "wizardConnectingFeature3": "Works completely offline - no internet required", + "wizardConnectingFeature3": "Tamamen çevrimdışı çalışır - internet gerekmez", "@wizardConnectingFeature3": { "description": "Wizard connecting feature 3" }, @@ -2137,19 +2137,19 @@ "@wizardChannelTitle": { "description": "Wizard channel page title" }, - "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "wizardChannelDescription": "Bir kanaldaki herkese mesaj yayınlayın; ekip genelindeki duyurular ve koordinasyon için idealdir.", "@wizardChannelDescription": { "description": "Wizard channel page description" }, - "wizardChannelFeature1": "Public Channel for general team communication", + "wizardChannelFeature1": "Genel ekip iletişimi için herkese açık kanal", "@wizardChannelFeature1": { "description": "Wizard channel feature 1" }, - "wizardChannelFeature2": "Create custom channels for specific groups", + "wizardChannelFeature2": "Belirli gruplar için özel kanallar oluşturun", "@wizardChannelFeature2": { "description": "Wizard channel feature 2" }, - "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "wizardChannelFeature3": "Mesajlar mesh tarafından otomatik iletilir", "@wizardChannelFeature3": { "description": "Wizard channel feature 3" }, @@ -2157,19 +2157,19 @@ "@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": "Ekip üyeleriniz mesh ağına katıldıkça otomatik olarak görünür. Onlara doğrudan mesaj gönderin veya konumlarını görüntüleyin.", "@wizardContactsDescription": { "description": "Wizard contacts page description" }, - "wizardContactsFeature1": "Contacts discovered automatically", + "wizardContactsFeature1": "Kişiler otomatik bulunur", "@wizardContactsFeature1": { "description": "Wizard contacts feature 1" }, - "wizardContactsFeature2": "Send private direct messages", + "wizardContactsFeature2": "Özel doğrudan mesaj gönderin", "@wizardContactsFeature2": { "description": "Wizard contacts feature 2" }, - "wizardContactsFeature3": "View battery level and last seen time", + "wizardContactsFeature3": "Pil seviyesini ve son görülme zamanını görüntüleyin", "@wizardContactsFeature3": { "description": "Wizard contacts feature 3" }, @@ -2177,23 +2177,23 @@ "@wizardMapTitle": { "description": "Wizard map page title" }, - "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "wizardMapDescription": "Ekibinizi gerçek zamanlı izleyin ve arama kurtarma operasyonları için önemli konumları işaretleyin.", "@wizardMapDescription": { "description": "Wizard map page description" }, - "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "wizardMapFeature1": "Bulunan kişiler, yangınlar ve toplanma alanları için SAR işaretleri", "@wizardMapFeature1": { "description": "Wizard map feature 1" }, - "wizardMapFeature2": "Real-time GPS tracking of team members", + "wizardMapFeature2": "Ekip üyelerinin gerçek zamanlı GPS takibi", "@wizardMapFeature2": { "description": "Wizard map feature 2" }, - "wizardMapFeature3": "Download offline maps for remote areas", + "wizardMapFeature3": "Uzak bölgeler için çevrimdışı haritalar indirin", "@wizardMapFeature3": { "description": "Wizard map feature 3" }, - "wizardMapFeature4": "Draw shapes and share tactical information", + "wizardMapFeature4": "Şekiller çizin ve taktik bilgileri paylaşın", "@wizardMapFeature4": { "description": "Wizard map feature 4" }, @@ -2205,7 +2205,7 @@ "@allTeamContacts": { "description": "Destination option to send SAR marker to all team contacts" }, - "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "directMessagesInfo": "ACK’li doğrudan mesajlar. {count} ekip üyesine gönderildi.", "@directMessagesInfo": { "description": "Information about sending to all contacts", "placeholders": { @@ -2214,7 +2214,7 @@ } } }, - "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "sarMarkerSentToContacts": "SAR işareti {count} kişiye gönderildi", "@sarMarkerSentToContacts": { "description": "Success message after sending SAR marker to all contacts", "placeholders": { @@ -2231,50 +2231,50 @@ "@reply": {}, "technicalDetails": "Teknik ayrıntılar", "@technicalDetails": {}, - "messageTechnicalDetails": "Message technical details", + "messageTechnicalDetails": "Mesaj teknik ayrıntıları", "@messageTechnicalDetails": {}, - "linkQuality": "Link quality", + "linkQuality": "Bağlantı kalitesi", "@linkQuality": {}, - "delivery": "Delivery", + "delivery": "Teslimat", "@delivery": {}, "status": "Durum", "@status": {}, - "expectedAckTag": "Expected ACK tag", + "expectedAckTag": "Beklenen ACK etiketi", "@expectedAckTag": {}, - "roundTrip": "Round-trip", + "roundTrip": "Gidiş dönüş", "@roundTrip": {}, - "retryAttempt": "Retry attempt", + "retryAttempt": "Yeniden deneme sayısı", "@retryAttempt": {}, - "floodFallback": "Flood fallback", + "floodFallback": "Flood yedeği", "@floodFallback": {}, - "identity": "Identity", + "identity": "Kimlik", "@identity": {}, - "messageId": "Message ID", + "messageId": "Mesaj kimliği", "@messageId": {}, - "sender": "Sender", + "sender": "Gönderen", "@sender": {}, - "senderKey": "Sender key", + "senderKey": "Gönderen anahtarı", "@senderKey": {}, - "recipient": "Recipient", + "recipient": "Alıcı", "@recipient": {}, - "recipientKey": "Recipient key", + "recipientKey": "Alıcı anahtarı", "@recipientKey": {}, "voice": "Ses", "@voice": {}, - "voiceId": "Voice ID", + "voiceId": "Ses kimliği", "@voiceId": {}, - "envelope": "Envelope", + "envelope": "Zarf", "@envelope": {}, - "sessionProgress": "Session progress", + "sessionProgress": "Oturum ilerlemesi", "@sessionProgress": {}, "complete": "Tamamlandı", "@complete": {}, - "rawDump": "Raw dump", + "rawDump": "Ham döküm", "@rawDump": {}, - "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "cannotRetryMissingRecipient": "Yeniden denenemiyor: alıcı bilgisi eksik", "@cannotRetryMissingRecipient": {}, "voiceUnavailable": "Ses şu anda kullanılamıyor", "@voiceUnavailable": {}, - "requestingVoice": "Requesting voice", + "requestingVoice": "Ses isteniyor", "@requestingVoice": {} } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 15373f3..7066613 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -48,11 +48,11 @@ "@locationPermissionDenied": { "description": "Error when location permission is denied" }, - "locationPermissionPermanentlyDenied": "Location permission permanently denied. Please enable in Settings.", + "locationPermissionPermanentlyDenied": "Дозвіл на геолокацію назавжди відхилено. Увімкніть його в Налаштуваннях.", "@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": "Для GPS-відстеження та координації команди потрібен дозвіл на геолокацію. Ви можете ввімкнути його пізніше в Налаштуваннях.", "@locationPermissionRequired": { "description": "Message when location permission is needed" }, @@ -64,7 +64,7 @@ "@failedToGetGpsLocation": { "description": "Error when GPS location cannot be obtained" }, - "failedToAdvertise": "Failed to advertise: {error}", + "failedToAdvertise": "Не вдалося транслювати: {error}", "@failedToAdvertise": { "description": "Error message for failed advertisement", "placeholders": { @@ -97,51 +97,51 @@ "@dark": { "description": "Dark theme option" }, - "blueLightTheme": "Blue light theme", + "blueLightTheme": "Світло-синя тема", "@blueLightTheme": { "description": "Description for blue light theme" }, - "blueDarkTheme": "Blue dark theme", + "blueDarkTheme": "Темно-синя тема", "@blueDarkTheme": { "description": "Description for blue dark theme" }, - "sarRed": "SAR Red", + "sarRed": "SAR Червоний", "@sarRed": { "description": "SAR Red theme option" }, - "alertEmergencyMode": "Alert/Emergency mode", + "alertEmergencyMode": "Режим тривоги/надзвичайної ситуації", "@alertEmergencyMode": { "description": "Description for SAR Red theme" }, - "sarGreen": "SAR Green", + "sarGreen": "SAR Зелений", "@sarGreen": { "description": "SAR Green theme option" }, - "safeAllClearMode": "Safe/All Clear mode", + "safeAllClearMode": "Безпечний режим/усе чисто", "@safeAllClearMode": { "description": "Description for SAR Green theme" }, - "autoSystem": "Auto (System)", + "autoSystem": "Авто (система)", "@autoSystem": { "description": "Auto/System theme option" }, - "followSystemTheme": "Follow system theme", + "followSystemTheme": "Слідувати системній темі", "@followSystemTheme": { "description": "Description for system theme" }, - "showRxTxIndicators": "Show RX/TX Indicators", + "showRxTxIndicators": "Показувати індикатори RX/TX", "@showRxTxIndicators": { "description": "Setting to show RX/TX indicators" }, - "displayPacketActivity": "Display packet activity indicators in top bar", + "displayPacketActivity": "Показувати індикатори активності пакетів у верхній панелі", "@displayPacketActivity": { "description": "Description for RX/TX indicators setting" }, - "disableMap": "Disable Map", + "disableMap": "Вимкнути мапу", "@disableMap": { "description": "Setting to disable the map tab" }, - "disableMapDescription": "Hide the map tab to reduce battery usage", + "disableMapDescription": "Приховати вкладку мапи для зменшення споживання батареї", "@disableMapDescription": { "description": "Description for disable map setting" }, @@ -169,35 +169,35 @@ "@about": { "description": "About section header" }, - "appVersion": "App Version", + "appVersion": "Версія застосунку", "@appVersion": { "description": "App version label" }, - "appName": "App Name", + "appName": "Назва застосунку", "@appName": { "description": "App name label" }, - "aboutMeshCoreSar": "About MeshCore SAR", + "aboutMeshCoreSar": "Про 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": "Застосунок для пошуку та рятування, створений для команд екстреного реагування. Можливості:\n\n• BLE mesh-мережа для зв’язку між пристроями\n• Офлайн-мапи з кількома шарами\n• Відстеження членів команди в реальному часі\n• Тактичні маркери SAR (знайдена людина, пожежа, зона збору)\n• Керування контактами та повідомленнями\n• GPS-відстеження з компасом\n• Кешування тайлів мапи для офлайн-використання", "@aboutDescription": { "description": "About dialog description" }, - "technologiesUsed": "Technologies Used:", + "technologiesUsed": "Використані технології:", "@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": "• Flutter для кросплатформної розробки\n• BLE (Bluetooth Low Energy) для mesh-мережі\n• OpenStreetMap для мап\n• Provider для керування станом\n• SharedPreferences для локального зберігання", "@technologiesList": { "description": "List of technologies used" }, - "moreInfo": "More Info", + "moreInfo": "Більше інформації", "@moreInfo": { "description": "More info button label" }, - "packageName": "Package Name", + "packageName": "Назва пакета", "@packageName": { "description": "Package name label" }, @@ -205,7 +205,7 @@ "@sampleData": { "description": "Sample data section header" }, - "sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing", + "sampleDataDescription": "Завантажити або очистити тестові контакти, повідомлення каналів і маркери SAR для перевірки", "@sampleDataDescription": { "description": "Sample data section description" }, @@ -217,11 +217,11 @@ "@clearAllData": { "description": "Clear all data button" }, - "clearAllDataConfirmTitle": "Clear All Data", + "clearAllDataConfirmTitle": "Очистити всі дані", "@clearAllDataConfirmTitle": { "description": "Clear data confirmation dialog title" }, - "clearAllDataConfirmMessage": "This will clear all contacts and SAR markers. Are you sure?", + "clearAllDataConfirmMessage": "Це очистить усі контакти та маркери SAR. Ви впевнені?", "@clearAllDataConfirmMessage": { "description": "Clear data confirmation message" }, @@ -229,7 +229,7 @@ "@clear": { "description": "Clear button label" }, - "loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages", + "loadedSampleData": "Завантажено {teamCount} членів команди, {channelCount} каналів, {sarCount} маркерів SAR, {messageCount} повідомлень", "@loadedSampleData": { "description": "Success message after loading sample data", "placeholders": { @@ -247,7 +247,7 @@ } } }, - "failedToLoadSampleData": "Failed to load sample data: {error}", + "failedToLoadSampleData": "Не вдалося завантажити тестові дані: {error}", "@failedToLoadSampleData": { "description": "Error message when sample data fails to load", "placeholders": { @@ -256,15 +256,15 @@ } } }, - "allDataCleared": "All data cleared", + "allDataCleared": "Усі дані очищено", "@allDataCleared": { "description": "Success message after clearing all data" }, - "failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.", + "failedToStartBackgroundTracking": "Не вдалося запустити фонове відстеження. Перевірте дозволи та BLE-з’єднання.", "@failedToStartBackgroundTracking": { "description": "Error message when background tracking fails to start" }, - "locationBroadcast": "Location broadcast: {latitude}, {longitude}", + "locationBroadcast": "Трансляція місцезнаходження: {latitude}, {longitude}", "@locationBroadcast": { "description": "Success message for location broadcast", "placeholders": { @@ -276,7 +276,7 @@ } } }, - "defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.", + "defaultPinInfo": "Стандартний PIN для пристроїв без екрана - 123456. Проблеми зі сполученням? Видаліть Bluetooth-пристрій у системних налаштуваннях.", "@defaultPinInfo": { "description": "Information about default PIN for pairing" }, @@ -304,15 +304,15 @@ "@refresh": { "description": "Refresh button label" }, - "resetPath": "Reset Path (Re-route)", + "resetPath": "Скинути маршрут (побудувати заново)", "@resetPath": { "description": "Action to reset contact path for re-routing" }, - "publicKeyCopied": "Public key copied to clipboard", + "publicKeyCopied": "Публічний ключ скопійовано в буфер обміну", "@publicKeyCopied": { "description": "Success message when public key is copied" }, - "copiedToClipboard": "{label} copied to clipboard", + "copiedToClipboard": "{label} скопійовано в буфер обміну", "@copiedToClipboard": { "description": "Success message when a value is copied to clipboard", "placeholders": { @@ -325,7 +325,7 @@ "@pleaseEnterPassword": { "description": "Validation message for empty password field" }, - "failedToSyncContacts": "Failed to sync contacts: {error}", + "failedToSyncContacts": "Не вдалося синхронізувати контакти: {error}", "@failedToSyncContacts": { "description": "Error message when contact sync fails", "placeholders": { @@ -351,7 +351,7 @@ } } }, - "failedToSendLogin": "Failed to send login: {error}", + "failedToSendLogin": "Не вдалося надіслати вхід: {error}", "@failedToSendLogin": { "description": "Error message when login command fails to send", "placeholders": { @@ -384,7 +384,7 @@ "@drawLine": { "description": "Map drawing mode: line" }, - "drawLineDesc": "Draw a freehand line on the map", + "drawLineDesc": "Намалювати довільну лінію на мапі", "@drawLineDesc": { "description": "Description for line drawing mode" }, @@ -392,7 +392,7 @@ "@drawRectangle": { "description": "Map drawing mode: rectangle" }, - "drawRectangleDesc": "Draw a rectangular area on the map", + "drawRectangleDesc": "Намалювати прямокутну область на мапі", "@drawRectangleDesc": { "description": "Description for rectangle drawing mode" }, @@ -400,7 +400,7 @@ "@measureDistance": { "description": "Map drawing mode: measure distance" }, - "measureDistanceDesc": "Long press two points to measure", + "measureDistanceDesc": "Затисніть дві точки, щоб виміряти", "@measureDistanceDesc": { "description": "Description for distance measurement mode" }, @@ -408,7 +408,7 @@ "@clearMeasurement": { "description": "Tooltip to clear measurement" }, - "distanceLabel": "Distance: {distance}", + "distanceLabel": "Відстань: {distance}", "@distanceLabel": { "description": "Label showing measured distance", "placeholders": { @@ -417,15 +417,15 @@ } } }, - "longPressForSecondPoint": "Long press for second point", + "longPressForSecondPoint": "Затисніть для другої точки", "@longPressForSecondPoint": { "description": "Instruction when first measurement point is set" }, - "longPressToStartMeasurement": "Long press to set first point", + "longPressToStartMeasurement": "Затисніть, щоб встановити першу точку", "@longPressToStartMeasurement": { "description": "Instruction to start measurement" }, - "longPressToStartNewMeasurement": "Long press to start new measurement", + "longPressToStartNewMeasurement": "Затисніть, щоб почати нове вимірювання", "@longPressToStartNewMeasurement": { "description": "Instruction to restart measurement after completion" }, @@ -437,11 +437,11 @@ "@clearAllDrawings": { "description": "Action to clear all local drawings" }, - "completeLine": "Complete Line", + "completeLine": "Завершити лінію", "@completeLine": { "description": "Tooltip to complete drawing a line" }, - "broadcastDrawingsToTeam": "Broadcast {count} drawing{plural} to team", + "broadcastDrawingsToTeam": "Транслювати {count} рисунок{plural} команді", "@broadcastDrawingsToTeam": { "description": "Subtitle showing how many drawings will be broadcast", "placeholders": { @@ -453,7 +453,7 @@ } } }, - "removeAllDrawings": "Remove all {count} drawing{plural}", + "removeAllDrawings": "Видалити всі {count} рисунок{plural}", "@removeAllDrawings": { "description": "Subtitle for remove all drawings action", "placeholders": { @@ -465,7 +465,7 @@ } } }, - "deleteAllDrawingsConfirm": "Delete all {count} drawing{plural} from the map?", + "deleteAllDrawingsConfirm": "Видалити всі {count} рисунок{plural} з мапи?", "@deleteAllDrawingsConfirm": { "description": "Confirmation dialog message for deleting all drawings", "placeholders": { @@ -481,7 +481,7 @@ "@drawing": { "description": "Generic drawing label" }, - "shareDrawingsCount": "Share {count} Drawing{plural}", + "shareDrawingsCount": "Поділитися {count} рисунок{plural}", "@shareDrawingsCount": { "description": "Title for share drawings dialog", "placeholders": { @@ -497,11 +497,11 @@ "@showReceivedDrawings": { "description": "Toggle to show/hide received drawings from other team members" }, - "showingAllDrawings": "Showing all drawings", + "showingAllDrawings": "Показуються всі рисунки", "@showingAllDrawings": { "description": "Subtitle when received drawings are visible" }, - "showingOnlyYourDrawings": "Showing only your drawings", + "showingOnlyYourDrawings": "Показуються лише ваші рисунки", "@showingOnlyYourDrawings": { "description": "Subtitle when received drawings are hidden" }, @@ -509,11 +509,11 @@ "@showSarMarkers": { "description": "Toggle to show/hide SAR markers on map" }, - "showingSarMarkers": "Showing SAR markers", + "showingSarMarkers": "Показуються маркери SAR", "@showingSarMarkers": { "description": "Subtitle when SAR markers are visible" }, - "hidingSarMarkers": "Hiding SAR markers", + "hidingSarMarkers": "Приховування маркерів SAR", "@hidingSarMarkers": { "description": "Subtitle when SAR markers are hidden" }, @@ -525,11 +525,11 @@ "@publicChannel": { "description": "Public channel option for sharing" }, - "broadcastToAll": "Broadcast to all nearby nodes (ephemeral)", + "broadcastToAll": "Транслювати всім сусіднім вузлам (тимчасово)", "@broadcastToAll": { "description": "Description for public channel broadcast" }, - "storedPermanently": "Stored permanently in room", + "storedPermanently": "Постійно збережено в кімнаті", "@storedPermanently": { "description": "Description for room storage permanence" }, @@ -553,7 +553,7 @@ "@sendTo": { "description": "Label for destination selection section" }, - "noDestinationsAvailable": "No destinations available.", + "noDestinationsAvailable": "Немає доступних отримувачів.", "@noDestinationsAvailable": { "description": "Warning when no rooms or channels exist" }, @@ -561,11 +561,11 @@ "@selectDestination": { "description": "Placeholder for destination dropdown" }, - "ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.", + "ephemeralBroadcastInfo": "Тимчасове: транслюється лише по радіо. Не зберігається - вузли мають бути онлайн.", "@ephemeralBroadcastInfo": { "description": "Information about ephemeral channel broadcasts" }, - "persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.", + "persistentRoomInfo": "Постійне: незмінно зберігається в кімнаті. Автоматично синхронізується і зберігається офлайн.", "@persistentRoomInfo": { "description": "Information about persistent room storage" }, @@ -573,7 +573,7 @@ "@location": { "description": "Label for location section" }, - "fromMap": "From Map", + "fromMap": "З мапи", "@fromMap": { "description": "Badge showing location is from map tap" }, @@ -593,7 +593,7 @@ "@refreshLocation": { "description": "Tooltip for refresh location button" }, - "accuracyMeters": "Accuracy: ±{accuracy}m", + "accuracyMeters": "Точність: ±{accuracy}м", "@accuracyMeters": { "description": "Display of GPS accuracy in meters", "placeholders": { @@ -606,11 +606,11 @@ "@notesOptional": { "description": "Label for optional notes field" }, - "addAdditionalInformation": "Add additional information...", + "addAdditionalInformation": "Додайте додаткову інформацію...", "@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": "Точність місцезнаходження становить ±{accuracy}м. Це може бути недостатньо точно для операцій SAR.\n\nПродовжити все одно?", "@lowAccuracyWarning": { "description": "Warning dialog content for low GPS accuracy", "placeholders": { @@ -623,7 +623,7 @@ "@loginToRoom": { "description": "Title for room login dialog" }, - "enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.", + "enterPasswordInfo": "Введіть пароль для доступу до цієї кімнати. Пароль буде збережено для подальшого використання.", "@enterPasswordInfo": { "description": "Information about room password" }, @@ -643,7 +643,7 @@ "@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": "Не вдалося додати кімнату до пристрою: {error}\n\nМожливо, кімната ще не почала трансляцію.\nСпробуйте зачекати, поки вона почне транслюватися.", "@failedToAddRoom": { "description": "Error message when adding room fails", "placeholders": { @@ -656,7 +656,7 @@ "@direct": { "description": "Direct routing indicator" }, - "flood": "Flood", + "flood": "Широкомовно", "@flood": { "description": "Flood routing indicator" }, @@ -672,7 +672,7 @@ "@distance": { "description": "Distance label" }, - "directPingTimeout": "Direct ping timeout - retrying {name} with flooding...", + "directPingTimeout": "Час очікування прямого ping вичерпано - повторна спроба для {name} через flooding...", "@directPingTimeout": { "description": "Warning when direct ping times out", "placeholders": { @@ -681,7 +681,7 @@ } } }, - "pingFailed": "Ping failed to {name} - no response received", + "pingFailed": "Ping до {name} не вдався - відповіді не отримано", "@pingFailed": { "description": "Error message when ping fails", "placeholders": { @@ -690,7 +690,7 @@ } } }, - "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": "Ви впевнені, що хочете видалити \"{name}\"?\n\nЦе видалить контакт і з застосунку, і з пов’язаного радіопристрою.", "@deleteContactConfirmation": { "description": "Confirmation message for deleting contact", "placeholders": { @@ -699,7 +699,7 @@ } } }, - "failedToRemoveContact": "Failed to remove contact: {error}", + "failedToRemoveContact": "Не вдалося видалити контакт: {error}", "@failedToRemoveContact": { "description": "Error message when contact removal fails", "placeholders": { @@ -732,7 +732,7 @@ "@notLoggedIn": { "description": "Not logged in status" }, - "adminAccess": "Admin Access", + "adminAccess": "Доступ адміністратора", "@adminAccess": { "description": "Admin access label" }, @@ -748,11 +748,11 @@ "@permissions": { "description": "Permissions label" }, - "passwordSaved": "Password Saved", + "passwordSaved": "Пароль збережено", "@passwordSaved": { "description": "Password saved label" }, - "locationColon": "Location:", + "locationColon": "Місцезнаходження:", "@locationColon": { "description": "Location section header" }, @@ -780,7 +780,7 @@ "@pressure": { "description": "Pressure label" }, - "gpsTelemetry": "GPS (Telemetry)", + "gpsTelemetry": "GPS (телеметрія)", "@gpsTelemetry": { "description": "GPS from telemetry label" }, @@ -788,7 +788,7 @@ "@updated": { "description": "Updated timestamp label" }, - "pathResetInfo": "Path reset for {name}. Next message will find a new route.", + "pathResetInfo": "Маршрут для {name} скинуто. Наступне повідомлення знайде новий маршрут.", "@pathResetInfo": { "description": "Info message after path reset", "placeholders": { @@ -797,7 +797,7 @@ } } }, - "reLoginToRoom": "Re-Login to Room", + "reLoginToRoom": "Повторно увійти до кімнати", "@reLoginToRoom": { "description": "Button to re-login to room" }, @@ -825,7 +825,7 @@ "@filterMarkers": { "description": "Title for filter markers dialog" }, - "filterMarkersTooltip": "Filter markers", + "filterMarkersTooltip": "Фільтрувати маркери", "@filterMarkersTooltip": { "description": "Tooltip for filter button" }, @@ -861,11 +861,11 @@ "@locationUnavailable": { "description": "Message when GPS location is unavailable" }, - "ahead": "ahead", + "ahead": "попереду", "@ahead": { "description": "Relative bearing direction - ahead" }, - "degreesRight": "{degrees}° right", + "degreesRight": "{degrees}° праворуч", "@degreesRight": { "description": "Relative bearing direction - right", "placeholders": { @@ -874,7 +874,7 @@ } } }, - "degreesLeft": "{degrees}° left", + "degreesLeft": "{degrees}° ліворуч", "@degreesLeft": { "description": "Relative bearing direction - left", "placeholders": { @@ -883,7 +883,7 @@ } } }, - "latLonFormat": "Lat: {latitude} Lon: {longitude}", + "latLonFormat": "Шир.: {latitude} Довг.: {longitude}", "@latLonFormat": { "description": "Latitude and longitude display format", "placeholders": { @@ -899,7 +899,7 @@ "@noContactsYet": { "description": "Empty state message when there are no contacts" }, - "connectToDeviceToLoadContacts": "Connect to a device to load contacts", + "connectToDeviceToLoadContacts": "Підключіться до пристрою, щоб завантажити контакти", "@connectToDeviceToLoadContacts": { "description": "Instruction to connect device to load contacts" }, @@ -947,7 +947,7 @@ "@googleTerrain": { "description": "Google Terrain layer name (topographic)" }, - "dragToPosition": "Drag to Position", + "dragToPosition": "Перетягніть у позицію", "@dragToPosition": { "description": "Label when dragging a pin on map" }, @@ -959,7 +959,7 @@ "@compass": { "description": "Compass title in detailed compass dialog" }, - "navigationAndContacts": "Navigation & Contacts", + "navigationAndContacts": "Навігація та контакти", "@navigationAndContacts": { "description": "Subtitle for compass dialog" }, @@ -967,15 +967,15 @@ "@sarAlert": { "description": "Label for SAR alert badge on messages" }, - "textCopiedToClipboard": "Text copied to clipboard", + "textCopiedToClipboard": "Текст скопійовано в буфер обміну", "@textCopiedToClipboard": { "description": "Success message when text is copied" }, - "cannotReplySenderMissing": "Cannot reply: sender information missing", + "cannotReplySenderMissing": "Неможливо відповісти: відсутня інформація про відправника", "@cannotReplySenderMissing": { "description": "Error when sender info is missing for reply" }, - "cannotReplyContactNotFound": "Cannot reply: contact not found", + "cannotReplyContactNotFound": "Неможливо відповісти: контакт не знайдено", "@cannotReplyContactNotFound": { "description": "Error when contact not found for reply" }, @@ -983,15 +983,15 @@ "@copyText": { "description": "Option to copy message text to clipboard" }, - "saveAsTemplate": "Save as Template", + "saveAsTemplate": "Зберегти як шаблон", "@saveAsTemplate": { "description": "Option to save SAR message as a reusable template" }, - "templateSaved": "Template saved successfully", + "templateSaved": "Шаблон успішно збережено", "@templateSaved": { "description": "Success message when SAR template is saved" }, - "templateAlreadyExists": "Template with this emoji already exists", + "templateAlreadyExists": "Шаблон із цим emoji уже існує", "@templateAlreadyExists": { "description": "Error message when trying to save duplicate template" }, @@ -999,7 +999,7 @@ "@deleteMessage": { "description": "Dialog title for deleting a message" }, - "deleteMessageConfirmation": "Are you sure you want to delete this message?", + "deleteMessageConfirmation": "Ви впевнені, що хочете видалити це повідомлення?", "@deleteMessageConfirmation": { "description": "Confirmation text for message deletion" }, @@ -1007,7 +1007,7 @@ "@shareLocation": { "description": "Option to share SAR marker location" }, - "shareLocationText": "{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}", + "shareLocationText": "{markerInfo}\n\nКоординати: {lat}, {lon}\n\nGoogle Maps: {url}", "@shareLocationText": { "description": "Formatted text for sharing SAR marker location", "placeholders": { @@ -1025,7 +1025,7 @@ } } }, - "sarLocationShare": "SAR Location", + "sarLocationShare": "Місцезнаходження SAR", "@sarLocationShare": { "description": "Subject line when sharing SAR marker location" }, @@ -1081,7 +1081,7 @@ "@delivered": { "description": "Delivery status: delivered" }, - "deliveredWithTime": "Delivered ({time}ms)", + "deliveredWithTime": "Доставлено ({time}ms)", "@deliveredWithTime": { "description": "Delivery status with round-trip time", "placeholders": { @@ -1098,7 +1098,7 @@ "@broadcast": { "description": "Delivery status for channel messages (no echoes yet)" }, - "deliveredToContacts": "Delivered to {delivered}/{total} contacts", + "deliveredToContacts": "Доставлено {delivered}/{total} контактам", "@deliveredToContacts": { "description": "Grouped message delivery count", "placeholders": { @@ -1110,11 +1110,11 @@ } } }, - "allDelivered": "All delivered", + "allDelivered": "Усе доставлено", "@allDelivered": { "description": "Status when all recipients received the message" }, - "recipientDetails": "Recipient Details", + "recipientDetails": "Деталі отримувача", "@recipientDetails": { "description": "Header for expandable recipient list" }, @@ -1122,19 +1122,19 @@ "@pending": { "description": "Delivery status: pending/waiting" }, - "sarMarkerFoundPerson": "Found Person", + "sarMarkerFoundPerson": "Знайдена людина", "@sarMarkerFoundPerson": { "description": "SAR marker type: found person" }, - "sarMarkerFire": "Fire Location", + "sarMarkerFire": "Місце пожежі", "@sarMarkerFire": { "description": "SAR marker type: fire" }, - "sarMarkerStagingArea": "Staging Area", + "sarMarkerStagingArea": "Зона збору", "@sarMarkerStagingArea": { "description": "SAR marker type: staging area" }, - "sarMarkerObject": "Object Found", + "sarMarkerObject": "Знайдений об’єкт", "@sarMarkerObject": { "description": "SAR marker type: object" }, @@ -1158,7 +1158,7 @@ "@frequencyMHz": { "description": "Label for radio frequency field" }, - "frequencyExample": "e.g., 869.618", + "frequencyExample": "напр., 869.618", "@frequencyExample": { "description": "Helper text example for frequency" }, @@ -1225,11 +1225,11 @@ "@showTrailOnMap": { "description": "Toggle to show/hide trail on map" }, - "trailVisible": "Trail is visible on the map", + "trailVisible": "Слід видно на мапі", "@trailVisible": { "description": "Trail visibility status - visible" }, - "trailHiddenRecording": "Trail is hidden (still recording)", + "trailHiddenRecording": "Слід прихований (запис триває)", "@trailHiddenRecording": { "description": "Trail visibility status - hidden but recording" }, @@ -1245,11 +1245,11 @@ "@clearTrail": { "description": "Button to clear location trail" }, - "clearTrailQuestion": "Clear Trail?", + "clearTrailQuestion": "Очистити слід?", "@clearTrailQuestion": { "description": "Confirmation dialog title" }, - "clearTrailConfirmation": "Are you sure you want to clear the current location trail? This action cannot be undone.", + "clearTrailConfirmation": "Ви впевнені, що хочете очистити поточний слід місцезнаходження? Цю дію не можна скасувати.", "@clearTrailConfirmation": { "description": "Confirmation dialog message" }, @@ -1257,7 +1257,7 @@ "@noTrailRecorded": { "description": "Message when no trail exists" }, - "startTrackingToRecord": "Start location tracking to record your trail", + "startTrackingToRecord": "Почніть відстеження місцезнаходження, щоб записати слід", "@startTrackingToRecord": { "description": "Instructions to start trail recording" }, @@ -1269,15 +1269,15 @@ "@contactTrails": { "description": "Contact trails section header" }, - "showAllContactTrails": "Show All Contact Trails", + "showAllContactTrails": "Показати всі сліди контактів", "@showAllContactTrails": { "description": "Toggle label to show all contact trails" }, - "noContactsWithLocationHistory": "No contacts with location history", + "noContactsWithLocationHistory": "Немає контактів з історією місцезнаходження", "@noContactsWithLocationHistory": { "description": "Subtitle when no contacts have trails" }, - "showingTrailsForContacts": "Showing trails for {count} contacts", + "showingTrailsForContacts": "Показуються сліди для {count} контактів", "@showingTrailsForContacts": { "description": "Subtitle showing number of contacts with trails", "placeholders": { @@ -1286,7 +1286,7 @@ } } }, - "individualContactTrails": "Individual Contact Trails", + "individualContactTrails": "Окремі сліди контактів", "@individualContactTrails": { "description": "Expansion tile title for individual contact trails" }, @@ -1330,19 +1330,19 @@ "@maxChannels": { "description": "Maximum channels capacity label" }, - "publicInfo": "Public Info", + "publicInfo": "Публічна інформація", "@publicInfo": { "description": "Public information section header" }, - "meshNetworkName": "Mesh Network Name", + "meshNetworkName": "Назва mesh-мережі", "@meshNetworkName": { "description": "Mesh network name field label" }, - "nameBroadcastInMesh": "Name broadcast in mesh advertisements", + "nameBroadcastInMesh": "Ім’я, що транслюється в mesh-оголошеннях", "@nameBroadcastInMesh": { "description": "Helper text for mesh network name field" }, - "telemetryAndLocationSharing": "Telemetry & Location Sharing", + "telemetryAndLocationSharing": "Телеметрія та поширення місцезнаходження", "@telemetryAndLocationSharing": { "description": "Telemetry and location sharing toggle label" }, @@ -1358,11 +1358,11 @@ "@useCurrentLocation": { "description": "Tooltip for use current location button" }, - "noneUnknown": "None/Unknown", + "noneUnknown": "Немає/Невідомо", "@noneUnknown": { "description": "Device type: none or unknown" }, - "chatNode": "Chat Node", + "chatNode": "Вузол чату", "@chatNode": { "description": "Device type: chat node" }, @@ -1370,11 +1370,11 @@ "@repeater": { "description": "Device type: repeater" }, - "roomChannel": "Room/Channel", + "roomChannel": "Кімната/Канал", "@roomChannel": { "description": "Device type: room or channel" }, - "typeNumber": "Type {number}", + "typeNumber": "Тип {number}", "@typeNumber": { "description": "Generic device type with number", "placeholders": { @@ -1383,7 +1383,7 @@ } } }, - "copiedToClipboardShort": "Copied {label} to clipboard", + "copiedToClipboardShort": "{label} скопійовано в буфер обміну", "@copiedToClipboardShort": { "description": "Short success message when copying to clipboard", "placeholders": { @@ -1392,7 +1392,7 @@ } } }, - "failedToSave": "Failed to save: {error}", + "failedToSave": "Не вдалося зберегти: {error}", "@failedToSave": { "description": "Generic error message for save failures", "placeholders": { @@ -1401,7 +1401,7 @@ } } }, - "failedToGetLocation": "Failed to get location: {error}", + "failedToGetLocation": "Не вдалося отримати місцезнаходження: {error}", "@failedToGetLocation": { "description": "Error message when getting location fails", "placeholders": { @@ -1414,7 +1414,7 @@ "@sarTemplates": { "description": "SAR templates menu title" }, - "manageSarTemplates": "Manage cursor on target templates", + "manageSarTemplates": "Керувати шаблонами SAR", "@manageSarTemplates": { "description": "Subtitle for SAR templates settings" }, @@ -1474,7 +1474,7 @@ "@exportToClipboard": { "description": "Button to export templates to clipboard" }, - "deleteTemplateConfirmation": "Delete template '{name}'?", + "deleteTemplateConfirmation": "Видалити шаблон \"{name}\"?", "@deleteTemplateConfirmation": { "description": "Confirmation message for template deletion", "placeholders": { @@ -1495,7 +1495,7 @@ "@templateDeleted": { "description": "Success message when template is deleted" }, - "templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}", + "templatesImported": "{count, plural, =0{Шаблони не імпортовано} =1{Імпортовано 1 шаблон} other{Імпортовано {count} шаблонів}}", "@templatesImported": { "description": "Success message after importing templates", "placeholders": { @@ -1504,7 +1504,7 @@ } } }, - "templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}", + "templatesExported": "{count, plural, =1{Експортовано 1 шаблон у буфер обміну} other{Експортовано {count} шаблонів у буфер обміну}}", "@templatesExported": { "description": "Success message after exporting templates", "placeholders": { @@ -1517,7 +1517,7 @@ "@resetToDefaults": { "description": "Action to reset templates to defaults" }, - "resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?", + "resetToDefaultsConfirmation": "Це видалить усі користувацькі шаблони та відновить 4 стандартні шаблони. Продовжити?", "@resetToDefaultsConfirmation": { "description": "Confirmation message for reset to defaults" }, @@ -1525,7 +1525,7 @@ "@reset": { "description": "Reset button label" }, - "resetComplete": "Templates reset to defaults", + "resetComplete": "Шаблони скинуто до стандартних", "@resetComplete": { "description": "Success message after reset" }, @@ -1553,23 +1553,23 @@ "@checking": { "description": "Loading state indicator" }, - "locationPermissionGrantedAlways": "Granted (Always)", + "locationPermissionGrantedAlways": "Надано (Завжди)", "@locationPermissionGrantedAlways": { "description": "Location permission status: granted always" }, - "locationPermissionGrantedWhileInUse": "Granted (While In Use)", + "locationPermissionGrantedWhileInUse": "Надано (Під час використання)", "@locationPermissionGrantedWhileInUse": { "description": "Location permission status: granted while in use" }, - "locationPermissionDeniedTapToRequest": "Denied - Tap to request", + "locationPermissionDeniedTapToRequest": "Відхилено - торкніться, щоб запросити", "@locationPermissionDeniedTapToRequest": { "description": "Location permission status: denied, user can request" }, - "locationPermissionPermanentlyDeniedOpenSettings": "Permanently Denied - Open Settings", + "locationPermissionPermanentlyDeniedOpenSettings": "Назавжди відхилено - відкрити налаштування", "@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": "Дозвіл на геолокацію назавжди відхилено. Увімкніть його в налаштуваннях пристрою, щоб використовувати GPS та поширення місцезнаходження.", "@locationPermissionDialogContent": { "description": "Content for location permission dialog when permanently denied" }, @@ -1581,19 +1581,19 @@ "@locationPermissionGranted": { "description": "Success message when location permission is granted" }, - "locationPermissionRequiredForGps": "Location permission is required for GPS tracking and location sharing.", + "locationPermissionRequiredForGps": "Для GPS-відстеження та поширення місцезнаходження потрібен дозвіл на геолокацію.", "@locationPermissionRequiredForGps": { "description": "Info message about location permission requirement" }, - "locationPermissionAlreadyGranted": "Location permission is already granted.", + "locationPermissionAlreadyGranted": "Дозвіл на геолокацію вже надано.", "@locationPermissionAlreadyGranted": { "description": "Info message when permission is already granted" }, - "sarNavyBlue": "SAR Navy Blue", + "sarNavyBlue": "SAR Темно-синій", "@sarNavyBlue": { "description": "SAR Navy Blue theme name" }, - "sarNavyBlueDescription": "Professional/Operations Mode", + "sarNavyBlueDescription": "Професійний/операційний режим", "@sarNavyBlueDescription": { "description": "Description for SAR Navy Blue theme" }, @@ -1601,7 +1601,7 @@ "@selectRecipient": { "description": "Title for recipient selector sheet" }, - "broadcastToAllNearby": "Broadcast to all nearby", + "broadcastToAllNearby": "Транслювати всім поблизу", "@broadcastToAllNearby": { "description": "Subtitle for public channel option" }, @@ -1633,35 +1633,35 @@ "@channel": { "description": "Channel label in notifications" }, - "samplePoliceLead": "Police Lead", + "samplePoliceLead": "Керівник поліції", "@samplePoliceLead": { "description": "Sample team member name" }, - "sampleDroneOperator": "Drone Operator", + "sampleDroneOperator": "Оператор дрона", "@sampleDroneOperator": { "description": "Sample team member name" }, - "sampleFirefighterAlpha": "Firefighter", + "sampleFirefighterAlpha": "Пожежник", "@sampleFirefighterAlpha": { "description": "Sample team member name" }, - "sampleMedicCharlie": "Medic", + "sampleMedicCharlie": "Медик", "@sampleMedicCharlie": { "description": "Sample team member name" }, - "sampleCommandDelta": "Command", + "sampleCommandDelta": "Командування", "@sampleCommandDelta": { "description": "Sample team member name" }, - "sampleFireEngine": "Fire Engine", + "sampleFireEngine": "Пожежна машина", "@sampleFireEngine": { "description": "Sample team member name" }, - "sampleAirSupport": "Air Support", + "sampleAirSupport": "Повітряна підтримка", "@sampleAirSupport": { "description": "Sample team member name" }, - "sampleBaseCoordinator": "Base Coordinator", + "sampleBaseCoordinator": "Координатор бази", "@sampleBaseCoordinator": { "description": "Sample team member name" }, @@ -1677,155 +1677,155 @@ "@channelUpdates": { "description": "Updates channel name" }, - "sampleTeamMember": "Sample Team Member", + "sampleTeamMember": "Тестовий член команди", "@sampleTeamMember": { "description": "Sample sender name" }, - "sampleScout": "Sample Scout", + "sampleScout": "Тестовий розвідник", "@sampleScout": { "description": "Sample sender name" }, - "sampleBase": "Sample Base", + "sampleBase": "Тестова база", "@sampleBase": { "description": "Sample sender name" }, - "sampleSearcher": "Sample Searcher", + "sampleSearcher": "Тестовий пошуковець", "@sampleSearcher": { "description": "Sample sender name" }, - "sampleObjectBackpack": " Backpack found - blue color", + "sampleObjectBackpack": " Знайдено рюкзак - синього кольору", "@sampleObjectBackpack": { "description": "Sample object note" }, - "sampleObjectVehicle": " Vehicle abandoned - check for owner", + "sampleObjectVehicle": " Покинутий транспорт - перевірити власника", "@sampleObjectVehicle": { "description": "Sample object note" }, - "sampleObjectCamping": " Camping equipment discovered", + "sampleObjectCamping": " Знайдено туристичне спорядження", "@sampleObjectCamping": { "description": "Sample object note" }, - "sampleObjectTrailMarker": " Trail marker found off-path", + "sampleObjectTrailMarker": " Знайдено маркер стежки поза маршрутом", "@sampleObjectTrailMarker": { "description": "Sample object note" }, - "sampleMsgAllTeamsCheckIn": "All teams check in", + "sampleMsgAllTeamsCheckIn": "Усі команди - дайте відмітку", "@sampleMsgAllTeamsCheckIn": { "description": "Sample channel message" }, - "sampleMsgWeatherUpdate": "Weather update: Clear skies, temp 18°C", + "sampleMsgWeatherUpdate": "Оновлення погоди: ясно, температура 18°C", "@sampleMsgWeatherUpdate": { "description": "Sample channel message" }, - "sampleMsgBaseCamp": "Base camp established at staging area", + "sampleMsgBaseCamp": "Базовий табір розгорнуто в зоні збору", "@sampleMsgBaseCamp": { "description": "Sample channel message" }, - "sampleMsgTeamAlpha": "Team moving to sector 2", + "sampleMsgTeamAlpha": "Команда рухається до сектора 2", "@sampleMsgTeamAlpha": { "description": "Sample channel message" }, - "sampleMsgRadioCheck": "Radio check - all stations respond", + "sampleMsgRadioCheck": "Перевірка радіо - усім станціям відповісти", "@sampleMsgRadioCheck": { "description": "Sample channel message" }, - "sampleMsgWaterSupply": "Water supply available at checkpoint 3", + "sampleMsgWaterSupply": "Запас води доступний на контрольній точці 3", "@sampleMsgWaterSupply": { "description": "Sample channel message" }, - "sampleMsgTeamBravo": "Team reporting: sector 1 clear", + "sampleMsgTeamBravo": "Команда доповідає: сектор 1 чистий", "@sampleMsgTeamBravo": { "description": "Sample channel message" }, - "sampleMsgEtaRallyPoint": "ETA to rally point: 15 minutes", + "sampleMsgEtaRallyPoint": "Орієнтовний час до точки збору: 15 хвилин", "@sampleMsgEtaRallyPoint": { "description": "Sample channel message" }, - "sampleMsgSupplyDrop": "Supply drop confirmed for 14:00", + "sampleMsgSupplyDrop": "Скидання постачання підтверджено на 14:00", "@sampleMsgSupplyDrop": { "description": "Sample channel message" }, - "sampleMsgDroneSurvey": "Drone survey completed - no findings", + "sampleMsgDroneSurvey": "Обстеження дроном завершено - результатів немає", "@sampleMsgDroneSurvey": { "description": "Sample channel message" }, - "sampleMsgTeamCharlie": "Team requesting backup", + "sampleMsgTeamCharlie": "Команда просить підкріплення", "@sampleMsgTeamCharlie": { "description": "Sample channel message" }, - "sampleMsgRadioDiscipline": "All units: maintain radio discipline", + "sampleMsgRadioDiscipline": "Усім підрозділам: дотримуйтеся радіодисципліни", "@sampleMsgRadioDiscipline": { "description": "Sample channel message" }, - "sampleMsgUrgentMedical": "URGENT: Medical assistance needed at sector 4", + "sampleMsgUrgentMedical": "ТЕРМІНОВО: потрібна медична допомога в секторі 4", "@sampleMsgUrgentMedical": { "description": "Sample emergency message" }, - "sampleMsgAdultMale": " Adult male, conscious", + "sampleMsgAdultMale": " Дорослий чоловік, при свідомості", "@sampleMsgAdultMale": { "description": "Sample emergency message note" }, - "sampleMsgFireSpotted": "Fire spotted - coordinates incoming", + "sampleMsgFireSpotted": "Помічено пожежу - координати надходять", "@sampleMsgFireSpotted": { "description": "Sample emergency message" }, - "sampleMsgSpreadingRapidly": " Spreading rapidly!", + "sampleMsgSpreadingRapidly": " Швидко поширюється!", "@sampleMsgSpreadingRapidly": { "description": "Sample emergency message note" }, - "sampleMsgPriorityHelicopter": "PRIORITY: Need helicopter support", + "sampleMsgPriorityHelicopter": "ПРІОРИТЕТ: потрібна підтримка гелікоптера", "@sampleMsgPriorityHelicopter": { "description": "Sample emergency message" }, - "sampleMsgMedicalTeamEnRoute": "Medical team en route to your location", + "sampleMsgMedicalTeamEnRoute": "Медична команда прямує до вашого місця", "@sampleMsgMedicalTeamEnRoute": { "description": "Sample emergency message" }, - "sampleMsgEvacHelicopter": "Evac helicopter ETA 10 minutes", + "sampleMsgEvacHelicopter": "ETA евакуаційного гелікоптера 10 хвилин", "@sampleMsgEvacHelicopter": { "description": "Sample emergency message" }, - "sampleMsgEmergencyResolved": "Emergency resolved - all clear", + "sampleMsgEmergencyResolved": "Надзвичайну ситуацію вирішено - все чисто", "@sampleMsgEmergencyResolved": { "description": "Sample emergency message" }, - "sampleMsgEmergencyStagingArea": " Emergency staging area", + "sampleMsgEmergencyStagingArea": " Аварійна зона збору", "@sampleMsgEmergencyStagingArea": { "description": "Sample emergency message note" }, - "sampleMsgEmergencyServices": "Emergency services notified and responding", + "sampleMsgEmergencyServices": "Екстрені служби повідомлені та вже реагують", "@sampleMsgEmergencyServices": { "description": "Sample emergency message" }, - "sampleAlphaTeamLead": "Team Lead", + "sampleAlphaTeamLead": "Керівник команди", "@sampleAlphaTeamLead": { "description": "Sample team name" }, - "sampleBravoScout": "Scout", + "sampleBravoScout": "Розвідник", "@sampleBravoScout": { "description": "Sample team name" }, - "sampleCharlieMedic": "Medic", + "sampleCharlieMedic": "Медик", "@sampleCharlieMedic": { "description": "Sample team name" }, - "sampleDeltaNavigator": "Navigator", + "sampleDeltaNavigator": "Навігатор", "@sampleDeltaNavigator": { "description": "Sample team name" }, - "sampleEchoSupport": "Support", + "sampleEchoSupport": "Підтримка", "@sampleEchoSupport": { "description": "Sample team name" }, - "sampleBaseCommand": "Base Command", + "sampleBaseCommand": "Командування бази", "@sampleBaseCommand": { "description": "Sample team name" }, - "sampleFieldCoordinator": "Field Coordinator", + "sampleFieldCoordinator": "Польовий координатор", "@sampleFieldCoordinator": { "description": "Sample team name" }, - "sampleMedicalTeam": "Medical Team", + "sampleMedicalTeam": "Медична команда", "@sampleMedicalTeam": { "description": "Sample team name" }, @@ -1833,7 +1833,7 @@ "@mapDrawing": { "description": "Label for map drawing messages" }, - "navigateToDrawing": "Navigate to Drawing", + "navigateToDrawing": "Перейти до рисунка", "@navigateToDrawing": { "description": "Option to navigate to drawing on map" }, @@ -1869,7 +1869,7 @@ "@longitudeLabel": { "description": "Label for longitude input field" }, - "exampleCoordinates": "Example: 46.0569, 14.5058", + "exampleCoordinates": "Приклад: 46.0569, 14.5058", "@exampleCoordinates": { "description": "Example coordinate format hint" }, @@ -1877,27 +1877,27 @@ "@shareDrawing": { "description": "Title for share single drawing dialog" }, - "shareWithAllNearbyDevices": "Share with all nearby devices", + "shareWithAllNearbyDevices": "Поділитися з усіма пристроями поблизу", "@shareWithAllNearbyDevices": { "description": "Subtitle for public channel sharing option" }, - "shareToRoom": "Share to Room", + "shareToRoom": "Поділитися в кімнату", "@shareToRoom": { "description": "Header for room sharing section" }, - "sendToPersistentStorage": "Send to persistent room storage", + "sendToPersistentStorage": "Надіслати в постійне сховище кімнати", "@sendToPersistentStorage": { "description": "Subtitle for room sharing option" }, - "deleteDrawingConfirm": "Are you sure you want to delete this drawing?", + "deleteDrawingConfirm": "Ви впевнені, що хочете видалити цей рисунок?", "@deleteDrawingConfirm": { "description": "Confirmation message for deleting a single drawing" }, - "drawingDeleted": "Drawing deleted", + "drawingDeleted": "Рисунок видалено", "@drawingDeleted": { "description": "Success message after deleting a drawing" }, - "yourDrawingsCount": "Your Drawings ({count})", + "yourDrawingsCount": "Ваші рисунки ({count})", "@yourDrawingsCount": { "description": "Header showing count of user's drawings", "placeholders": { @@ -1906,7 +1906,7 @@ } } }, - "shared": "Shared", + "shared": "Спільний", "@shared": { "description": "Status label for shared drawings" }, @@ -1938,55 +1938,55 @@ "@updateLater": { "description": "Button to dismiss update dialog" }, - "cadastralParcels": "Cadastral Parcels", + "cadastralParcels": "Кадастрові ділянки", "@cadastralParcels": { "description": "Label for cadastral parcels WMS overlay layer" }, - "forestRoads": "Forest Roads", + "forestRoads": "Лісові дороги", "@forestRoads": { "description": "Label for forest roads WMS overlay layer" }, - "wmsOverlays": "WMS Overlays", + "wmsOverlays": "Накладки WMS", "@wmsOverlays": { "description": "Section header for WMS overlay layers in layer selector" }, - "hikingTrails": "Hiking Trails", + "hikingTrails": "Пішохідні стежки", "@hikingTrails": { "description": "Label for hiking/mountain trails WMS overlay layer" }, - "mainRoads": "Main Roads", + "mainRoads": "Основні дороги", "@mainRoads": { "description": "Label for main roads WMS overlay layer" }, - "houseNumbers": "House Numbers", + "houseNumbers": "Номери будинків", "@houseNumbers": { "description": "Label for house numbers WMS overlay layer" }, - "fireHazardZones": "Fire Hazard Zones", + "fireHazardZones": "Зони пожежної небезпеки", "@fireHazardZones": { "description": "Label for fire hazard risk zones WMS overlay layer" }, - "historicalFires": "Historical Fires", + "historicalFires": "Історичні пожежі", "@historicalFires": { "description": "Label for historical forest fires WMS overlay layer" }, - "firebreaks": "Firebreaks", + "firebreaks": "Протипожежні смуги", "@firebreaks": { "description": "Label for firebreaks WMS overlay layer" }, - "krasFireZones": "Kras Fire Zones", + "krasFireZones": "Пожежні зони Красу", "@krasFireZones": { "description": "Label for Kras fire zones WMS overlay layer" }, - "placeNames": "Place Names", + "placeNames": "Назви місць", "@placeNames": { "description": "Label for geographic place names WMS overlay layer" }, - "municipalityBorders": "Municipality Borders", + "municipalityBorders": "Межі громад", "@municipalityBorders": { "description": "Label for municipality borders WMS overlay layer" }, - "topographicMap": "Topographic Map 1:25000", + "topographicMap": "Топографічна мапа 1:25000", "@topographicMap": { "description": "Label for DTK25 topographic base map layer" }, @@ -2014,43 +2014,43 @@ "@channelSecretHint": { "description": "Hint for channel secret field" }, - "channelSecretHelp": "This secret must be shared with all team members who need access to this channel", + "channelSecretHelp": "Цей секрет має бути спільним для всіх членів команди, яким потрібен доступ до цього каналу", "@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": "Hash-канали (#team): секрет автоматично генерується з назви. Однакова назва = той самий канал на всіх пристроях.\n\nПриватні канали: використовуйте явний секрет. Приєднатися можуть лише ті, хто його знає.", "@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": "Hash-канал: секрет буде автоматично згенерований з назви каналу. Кожен, хто використовує ту саму назву, приєднається до того самого каналу.", "@hashChannelInfo": { "description": "Help text for hash channels (# prefix)" }, - "channelNameRequired": "Channel name is required", + "channelNameRequired": "Назва каналу обов’язкова", "@channelNameRequired": { "description": "Validation error for empty channel name" }, - "channelNameTooLong": "Channel name must be 31 characters or less", + "channelNameTooLong": "Назва каналу має бути не довшою за 31 символ", "@channelNameTooLong": { "description": "Validation error for channel name too long" }, - "channelSecretRequired": "Channel secret is required", + "channelSecretRequired": "Секрет каналу обов’язковий", "@channelSecretRequired": { "description": "Validation error for empty channel secret" }, - "channelSecretTooLong": "Channel secret must be 32 characters or less", + "channelSecretTooLong": "Секрет каналу має бути не довшим за 32 символи", "@channelSecretTooLong": { "description": "Validation error for channel secret too long" }, - "invalidAsciiCharacters": "Only ASCII characters are allowed", + "invalidAsciiCharacters": "Дозволені лише символи ASCII", "@invalidAsciiCharacters": { "description": "Validation error for non-ASCII characters" }, - "channelCreatedSuccessfully": "Channel created successfully", + "channelCreatedSuccessfully": "Канал успішно створено", "@channelCreatedSuccessfully": { "description": "Success message after creating channel" }, - "channelCreationFailed": "Failed to create channel: {error}", + "channelCreationFailed": "Не вдалося створити канал: {error}", "@channelCreationFailed": { "description": "Error message when channel creation fails", "placeholders": { @@ -2059,11 +2059,11 @@ } } }, - "deleteChannel": "Delete Channel", + "deleteChannel": "Видалити канал", "@deleteChannel": { "description": "Delete channel button/menu item" }, - "deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.", + "deleteChannelConfirmation": "Ви впевнені, що хочете видалити канал \"{channelName}\"? Цю дію не можна скасувати.", "@deleteChannelConfirmation": { "description": "Confirmation dialog when deleting a channel", "placeholders": { @@ -2072,11 +2072,11 @@ } } }, - "channelDeletedSuccessfully": "Channel deleted successfully", + "channelDeletedSuccessfully": "Канал успішно видалено", "@channelDeletedSuccessfully": { "description": "Success message after deleting channel" }, - "channelDeletionFailed": "Failed to delete channel: {error}", + "channelDeletionFailed": "Не вдалося видалити канал: {error}", "@channelDeletionFailed": { "description": "Error message when channel deletion fails", "placeholders": { @@ -2109,7 +2109,7 @@ "@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": "Потужний інструмент офлайн-комунікації для операцій пошуку та рятування. Зв’язуйтеся зі своєю командою за допомогою mesh-радіо, коли традиційні мережі недоступні.", "@wizardWelcomeDescription": { "description": "Welcome wizard first page description" }, @@ -2117,19 +2117,19 @@ "@wizardConnectingTitle": { "description": "Wizard connecting page title" }, - "wizardConnectingDescription": "Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.", + "wizardConnectingDescription": "Підключіть смартфон до радіопристрою MeshCore через Bluetooth, щоб почати спілкування поза мережею.", "@wizardConnectingDescription": { "description": "Wizard connecting page description" }, - "wizardConnectingFeature1": "Scan for nearby MeshCore devices", + "wizardConnectingFeature1": "Скануйте сусідні пристрої MeshCore", "@wizardConnectingFeature1": { "description": "Wizard connecting feature 1" }, - "wizardConnectingFeature2": "Pair with your radio via Bluetooth", + "wizardConnectingFeature2": "Сполучіть свій радіопристрій через Bluetooth", "@wizardConnectingFeature2": { "description": "Wizard connecting feature 2" }, - "wizardConnectingFeature3": "Works completely offline - no internet required", + "wizardConnectingFeature3": "Працює повністю офлайн - інтернет не потрібен", "@wizardConnectingFeature3": { "description": "Wizard connecting feature 3" }, @@ -2137,19 +2137,19 @@ "@wizardChannelTitle": { "description": "Wizard channel page title" }, - "wizardChannelDescription": "Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.", + "wizardChannelDescription": "Транслюйте повідомлення всім у каналі - ідеально для загальнокомандних оголошень і координації.", "@wizardChannelDescription": { "description": "Wizard channel page description" }, - "wizardChannelFeature1": "Public Channel for general team communication", + "wizardChannelFeature1": "Публічний канал для загального спілкування команди", "@wizardChannelFeature1": { "description": "Wizard channel feature 1" }, - "wizardChannelFeature2": "Create custom channels for specific groups", + "wizardChannelFeature2": "Створюйте власні канали для окремих груп", "@wizardChannelFeature2": { "description": "Wizard channel feature 2" }, - "wizardChannelFeature3": "Messages are automatically relayed by the mesh", + "wizardChannelFeature3": "Повідомлення автоматично ретранслюються mesh-мережею", "@wizardChannelFeature3": { "description": "Wizard channel feature 3" }, @@ -2157,19 +2157,19 @@ "@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": "Члени вашої команди з’являються автоматично, коли приєднуються до mesh-мережі. Надсилайте їм прямі повідомлення або переглядайте їхнє місцезнаходження.", "@wizardContactsDescription": { "description": "Wizard contacts page description" }, - "wizardContactsFeature1": "Contacts discovered automatically", + "wizardContactsFeature1": "Контакти виявляються автоматично", "@wizardContactsFeature1": { "description": "Wizard contacts feature 1" }, - "wizardContactsFeature2": "Send private direct messages", + "wizardContactsFeature2": "Надсилайте приватні прямі повідомлення", "@wizardContactsFeature2": { "description": "Wizard contacts feature 2" }, - "wizardContactsFeature3": "View battery level and last seen time", + "wizardContactsFeature3": "Переглядайте рівень батареї та час останньої появи", "@wizardContactsFeature3": { "description": "Wizard contacts feature 3" }, @@ -2177,23 +2177,23 @@ "@wizardMapTitle": { "description": "Wizard map page title" }, - "wizardMapDescription": "Track your team in real-time and mark important locations for search and rescue operations.", + "wizardMapDescription": "Відстежуйте команду в реальному часі та позначайте важливі місця для операцій пошуку та рятування.", "@wizardMapDescription": { "description": "Wizard map page description" }, - "wizardMapFeature1": "SAR markers for found persons, fires, and staging areas", + "wizardMapFeature1": "Маркери SAR для знайдених людей, пожеж і зон збору", "@wizardMapFeature1": { "description": "Wizard map feature 1" }, - "wizardMapFeature2": "Real-time GPS tracking of team members", + "wizardMapFeature2": "GPS-відстеження членів команди в реальному часі", "@wizardMapFeature2": { "description": "Wizard map feature 2" }, - "wizardMapFeature3": "Download offline maps for remote areas", + "wizardMapFeature3": "Завантажуйте офлайн-мапи для віддалених районів", "@wizardMapFeature3": { "description": "Wizard map feature 3" }, - "wizardMapFeature4": "Draw shapes and share tactical information", + "wizardMapFeature4": "Малюйте фігури та діліться тактичною інформацією", "@wizardMapFeature4": { "description": "Wizard map feature 4" }, @@ -2205,7 +2205,7 @@ "@allTeamContacts": { "description": "Destination option to send SAR marker to all team contacts" }, - "directMessagesInfo": "Direct messages with ACKs. Sent to {count} team members.", + "directMessagesInfo": "Прямі повідомлення з ACK. Надіслано {count} членам команди.", "@directMessagesInfo": { "description": "Information about sending to all contacts", "placeholders": { @@ -2214,7 +2214,7 @@ } } }, - "sarMarkerSentToContacts": "SAR marker sent to {count} contacts", + "sarMarkerSentToContacts": "Маркер SAR надіслано {count} контактам", "@sarMarkerSentToContacts": { "description": "Success message after sending SAR marker to all contacts", "placeholders": { @@ -2231,50 +2231,50 @@ "@reply": {}, "technicalDetails": "Технічні деталі", "@technicalDetails": {}, - "messageTechnicalDetails": "Message technical details", + "messageTechnicalDetails": "Технічні деталі повідомлення", "@messageTechnicalDetails": {}, - "linkQuality": "Link quality", + "linkQuality": "Якість зв’язку", "@linkQuality": {}, - "delivery": "Delivery", + "delivery": "Доставка", "@delivery": {}, "status": "Статус", "@status": {}, - "expectedAckTag": "Expected ACK tag", + "expectedAckTag": "Очікуваний тег ACK", "@expectedAckTag": {}, - "roundTrip": "Round-trip", + "roundTrip": "Час в обидва боки", "@roundTrip": {}, - "retryAttempt": "Retry attempt", + "retryAttempt": "Спроба повтору", "@retryAttempt": {}, - "floodFallback": "Flood fallback", + "floodFallback": "Резервний flooding", "@floodFallback": {}, - "identity": "Identity", + "identity": "Ідентичність", "@identity": {}, - "messageId": "Message ID", + "messageId": "ID повідомлення", "@messageId": {}, - "sender": "Sender", + "sender": "Відправник", "@sender": {}, - "senderKey": "Sender key", + "senderKey": "Ключ відправника", "@senderKey": {}, - "recipient": "Recipient", + "recipient": "Отримувач", "@recipient": {}, - "recipientKey": "Recipient key", + "recipientKey": "Ключ отримувача", "@recipientKey": {}, "voice": "Голос", "@voice": {}, - "voiceId": "Voice ID", + "voiceId": "ID голосу", "@voiceId": {}, - "envelope": "Envelope", + "envelope": "Конверт", "@envelope": {}, - "sessionProgress": "Session progress", + "sessionProgress": "Прогрес сеансу", "@sessionProgress": {}, "complete": "Завершено", "@complete": {}, - "rawDump": "Raw dump", + "rawDump": "Сирий дамп", "@rawDump": {}, - "cannotRetryMissingRecipient": "Cannot retry: recipient information missing", + "cannotRetryMissingRecipient": "Неможливо повторити: відсутня інформація про отримувача", "@cannotRetryMissingRecipient": {}, "voiceUnavailable": "Голос зараз недоступний", "@voiceUnavailable": {}, - "requestingVoice": "Requesting voice", + "requestingVoice": "Запит голосу", "@requestingVoice": {} } diff --git a/lib/screens/messages_tab.dart b/lib/screens/messages_tab.dart index 8d45534..7a710f0 100644 --- a/lib/screens/messages_tab.dart +++ b/lib/screens/messages_tab.dart @@ -267,6 +267,7 @@ class _MessagesTabState extends State { /// Show recipient selector bottom sheet void _showRecipientSelector() { final contactsProvider = context.read(); + final messagesProvider = context.read(); // Filter contacts by type final contacts = contactsProvider.contacts @@ -287,6 +288,13 @@ class _MessagesTabState extends State { contacts: contacts, rooms: rooms, channels: channels, + unreadCount: messagesProvider.unreadCount, + unreadCountsByPublicKey: { + for (final contact in [...contacts, ...rooms, ...channels]) + contact.publicKeyHex: messagesProvider.getUnreadCountForDestination( + contact, + ), + }, currentDestinationType: _destinationType, currentRecipientPublicKey: _selectedRecipient?.publicKeyHex, onSelect: _onRecipientSelected, diff --git a/lib/widgets/messages/recipient_selector_sheet.dart b/lib/widgets/messages/recipient_selector_sheet.dart index 15a3bbc..8c921af 100644 --- a/lib/widgets/messages/recipient_selector_sheet.dart +++ b/lib/widgets/messages/recipient_selector_sheet.dart @@ -8,6 +8,8 @@ class RecipientSelectorSheet extends StatefulWidget { final List contacts; final List rooms; final List channels; + final int unreadCount; + final Map unreadCountsByPublicKey; final String? currentDestinationType; final String? currentRecipientPublicKey; final Function(String type, Contact? recipient) onSelect; @@ -17,6 +19,8 @@ class RecipientSelectorSheet extends StatefulWidget { required this.contacts, required this.rooms, required this.channels, + required this.unreadCount, + required this.unreadCountsByPublicKey, this.currentDestinationType, this.currentRecipientPublicKey, required this.onSelect, @@ -143,6 +147,7 @@ class _RecipientSelectorSheetState extends State { icon: Icons.all_inbox, title: l10n.showAll, subtitle: 'All messages', + unreadCount: widget.unreadCount, isSelected: _isSelected('all', null), onTap: () { widget.onSelect('all', null); @@ -186,6 +191,9 @@ class _RecipientSelectorSheetState extends State { subtitle: channel.isPublicChannel ? l10n.broadcastToAllNearby : '${l10n.channel} ${channel.publicKey[1]}', // Show slot number + unreadCount: + widget.unreadCountsByPublicKey[channel.publicKeyHex] ?? + 0, isSelected: _isSelected('channel', channel), onTap: () { widget.onSelect('channel', channel); @@ -231,6 +239,9 @@ class _RecipientSelectorSheetState extends State { contact: contact, title: contact.displayName, subtitle: contact.publicKeyShort, + unreadCount: + widget.unreadCountsByPublicKey[contact.publicKeyHex] ?? + 0, isSelected: _isSelected('contact', contact), onTap: () { widget.onSelect('contact', contact); @@ -276,6 +287,8 @@ class _RecipientSelectorSheetState extends State { contact: room, title: room.displayName, subtitle: room.publicKeyShort, + unreadCount: + widget.unreadCountsByPublicKey[room.publicKeyHex] ?? 0, isSelected: _isSelected('room', room), onTap: () { widget.onSelect('room', room); @@ -326,6 +339,7 @@ class _RecipientSelectorSheetState extends State { required Contact contact, required String title, required String subtitle, + required int unreadCount, required bool isSelected, required VoidCallback onTap, }) { @@ -351,12 +365,11 @@ class _RecipientSelectorSheetState extends State { ).textTheme.bodySmall?.color?.withValues(alpha: 0.6), ), ), - trailing: isSelected - ? Icon( - Icons.check_circle, - color: Theme.of(context).colorScheme.primary, - ) - : null, + trailing: _buildTrailing( + context, + unreadCount: unreadCount, + isSelected: isSelected, + ), onTap: onTap, ); } @@ -366,6 +379,7 @@ class _RecipientSelectorSheetState extends State { required IconData icon, required String title, required String subtitle, + required int unreadCount, required bool isSelected, required VoidCallback onTap, }) { @@ -395,13 +409,51 @@ class _RecipientSelectorSheetState extends State { ).textTheme.bodySmall?.color?.withValues(alpha: 0.6), ), ), - trailing: isSelected - ? Icon( - Icons.check_circle, - color: Theme.of(context).colorScheme.primary, - ) - : null, + trailing: _buildTrailing( + context, + unreadCount: unreadCount, + isSelected: isSelected, + ), onTap: onTap, ); } + + Widget? _buildTrailing( + BuildContext context, { + required int unreadCount, + required bool isSelected, + }) { + if (unreadCount <= 0 && !isSelected) { + return null; + } + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (unreadCount > 0) + Container( + key: Key('unread-badge-$unreadCount'), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primary, + borderRadius: BorderRadius.circular(999), + ), + child: Text( + unreadCount > 99 ? '99+' : '$unreadCount', + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimary, + fontSize: 12, + fontWeight: FontWeight.w700, + ), + ), + ), + if (unreadCount > 0 && isSelected) const SizedBox(width: 8), + if (isSelected) + Icon( + Icons.check_circle, + color: Theme.of(context).colorScheme.primary, + ), + ], + ); + } }