Add multilingual localization

This commit is contained in:
Janez T
2026-03-08 20:50:53 +01:00
parent de5fb1e164
commit 2ab8681ac4
10 changed files with 1821 additions and 1691 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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\nBLE 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\nGPS 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\nRede 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\nRastreamento 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';
}

View File

@@ -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 123456dı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ı';
@@ -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 2ye 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 4te 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 'ACKli 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 => 'nderen';
@override
String get senderKey => 'Sender key';
String get senderKey => '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';
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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": {}
}

View File

@@ -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 123456dı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 2ye 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 4te 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": "ACKli 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": "nderen",
"@sender": {},
"senderKey": "Sender key",
"senderKey": "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": {}
}

File diff suppressed because it is too large Load Diff

View File

@@ -267,6 +267,7 @@ class _MessagesTabState extends State<MessagesTab> {
/// Show recipient selector bottom sheet
void _showRecipientSelector() {
final contactsProvider = context.read<ContactsProvider>();
final messagesProvider = context.read<MessagesProvider>();
// Filter contacts by type
final contacts = contactsProvider.contacts
@@ -287,6 +288,13 @@ class _MessagesTabState extends State<MessagesTab> {
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,

View File

@@ -8,6 +8,8 @@ class RecipientSelectorSheet extends StatefulWidget {
final List<Contact> contacts;
final List<Contact> rooms;
final List<Contact> channels;
final int unreadCount;
final Map<String, int> 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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
).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<RecipientSelectorSheet> {
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<RecipientSelectorSheet> {
).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,
),
],
);
}
}