feat: UX polish, localization, advert relocation, and map filter fixes

- i18n: translate connection screen + chat tab keys into 13 locales;
  add "Send my contact" (advert) strings in all locales
- feat: move self-advert from home header into composer "+" action menu
  (new lib/utils/advert_helper.dart, always shows Flood/Direct sheet)
- fix: hide-repeaters map toggle was bypassed in simple mode
- fix: simple mode map now shows only favourite chat contacts
- fix: wrap ListTiles in Material (contact_tile secondary actions,
  inferred contact group card) to satisfy Flutter ink assertions
- device-authoritative contact/channel sync and UX review fixes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Janez T
2026-06-12 10:01:10 +02:00
parent 3e1113035d
commit ba27843166
62 changed files with 12546 additions and 2521 deletions

View File

@@ -908,5 +908,125 @@
"enterRegionName": "Ime regije (npr. auckland)",
"noRegionsFound": "Na tem repetitorju ni najdenih regij.",
"regionScopeSet": "Obseg regije nastavljen na {name}",
"regionScopeCleared": "Obseg regije počiščen"
"regionScopeCleared": "Obseg regije počiščen",
"simpleMode": "Enostavni način",
"simpleModeDescription": "Samo klepet in zemljevid s priljubljenimi stiki",
"simpleModeRequiresLockedDestination": "Za uporabo enostavnega načina najprej omogočite »Zakleni cilj« s kanalom",
"noFavouriteContacts": "Ni priljubljenih stikov",
"selectDestinationFirst": "Najprej izberite kanal, stik ali sobo",
"recipientNoLongerAvailable": "Prejemnik ni več na voljo",
"failedToSendMessage": "Pošiljanje ni uspelo: {error}",
"tictactoeDirectOnly": "Križci in krožci delujejo samo v neposrednih sporočilih. Najprej izberite stik.",
"deviceKeyUnavailable": "Ključ naprave ni na voljo",
"imageCompressionFailed": "Stiskanje slike ni uspelo",
"imageFragmentationFailed": "Razdelitev slike ni uspela",
"failedToAnnounceImage": "Najava slike ni uspela",
"noRecipientSelected": "Prejemnik ni izbran",
"imageSendFailed": "Pošiljanje slike ni uspelo",
"microphonePermissionRequiredForVoice": "Za glasovna sporočila je potrebno dovoljenje za mikrofon",
"recordingDiscarded": "Posnetek je zavržen",
"publicChannelMediaWarning": "Pravkar boste poslali {mediaType} v javni kanal. To ni priporočljivo, ker lahko vsebino prejmejo vsi v omrežju mesh. Izberite zaseben ali označen kanal, razen če to res želite.",
"selectPrivateChannelToShareLocation": "Za deljenje lokacije izberite zaseben kanal.",
"stopSharingMyLocation": "Prenehaj deliti mojo lokacijo",
"shareMyLocation": "Deli mojo lokacijo",
"stopRecording": "Ustavi snemanje",
"recordVoice": "Posnemi glasovno sporočilo",
"moreActions": "Več dejanj",
"noMessagesInFilter": "V tem filtru ni sporočil",
"noMatchesInFilter": "V tem filtru ni zadetkov",
"syncFailed": "Sinhronizacija ni uspela: {error}",
"invalidLink": "Neveljavna povezava",
"cannotOpenLink": "Povezave ni mogoče odpreti",
"failedToOpenLink": "Odpiranje povezave ni uspelo",
"failedToResendMessage": "Ponovno pošiljanje sporočila ni uspelo",
"retryFailed": "Ponovni poskus ni uspel: {error}",
"deleteDrawingAndMessage": "Izbriši risbo in sporočilo",
"lastEchoRelay": "Posrednik zadnjega odmeva",
"lastEchoPath": "Pot zadnjega odmeva",
"lastEchoBytesReport": "Poročilo o bajtih zadnjega odmeva",
"noGpsCoordinatesAvailable": "GPS-koordinate niso na voljo",
"notASarMarker": "To ni SAR označevalec",
"failedToSaveTemplate": "Shranjevanje predloge ni uspelo: {error}",
"drawingNotFound": "Risbe ni mogoče najti",
"unknownDrawingType": "Neznana vrsta risbe",
"customMapMarker": "Označevalec karte po meri",
"customMapPointLabel": "Točka: {point}",
"mapIdLabel": "ID karte: {id}",
"cannotFetchVoice": "Glasovnega sporočila ni mogoče prenesti",
"senderContactUnknown": "Stik pošiljatelja ni znan. Najprej sinhronizirajte stike.",
"senderRouteUnknown": "Pot pošiljatelja ni znana. Najprej sinhronizirajte stike/poti.",
"messageTooFar": "Sporočilo je predaleč ({hops} skokov, največ {maxHops}).",
"senderRouteNoPathResponse": "Pot pošiljatelja se ni odzvala na preverjanje poti. Sinhronizirajte stike/poti in poskusite znova.",
"senderRouteNoRawResponse": "Pot pošiljatelja se ni odzvala na neposredni prenosni poti.",
"voiceFetchOverHops": "Prenos glasu prek {hops} skokov lahko traja dlje.",
"voiceReceiveCanceled": "Sprejem glasovnega sporočila je preklican",
"fetchingMissingVoiceFragments": "Pridobivanje manjkajočih glasovnih delov",
"receivingVoice": "Sprejemanje glasu",
"cannotFetchImage": "Slike ni mogoče prenesti",
"imageFetchOverHops": "Prenos slike prek {hops} skokov lahko traja dlje.",
"imageAlreadyBeingReceived": "Slika se že sprejema",
"loadImage": "Naloži sliko",
"imageFetchFailedToSendRequest": "Zahteve za prenos slike ni bilo mogoče poslati",
"imageUnavailable": "Slika trenutno ni na voljo",
"imageFetchTimedOut": "Prenos slike je potekel",
"imageReceiveCanceled": "Sprejem slike je preklican",
"closeImagePreview": "Zapri predogled slike",
"recordingReleaseToSend": "Snemanje ... spustite za pošiljanje glasu",
"sendingVoice": "Pošiljanje glasu ...",
"sendLongPressToRecordVoice": "Pošlji (dolg pritisk za snemanje glasu)",
"discardRecording": "Zavrzi posnetek",
"hopCount": "{count, plural, one{{count} skok} two{{count} skoka} few{{count} skoki} other{{count} skokov}}",
"channelsSectionDescription": "Oddajni kanali za bližnji promet v omrežju mesh",
"roomsSectionDescription": "Skupni prostori za stalno usklajevanje ekipe",
"contactsSectionDescription": "Osebe in naprave, ki jih lahko dosežete neposredno",
"noRecentChatters": "Ni nedavnih klepetalcev",
"public": "Javno",
"failedToSendTicTacToeMove": "Poteze pri križcih in krožcih ni bilo mogoče poslati",
"youWon": "Zmagali ste",
"opponentWon": "Zmagal je nasprotnik",
"gameDraw": "Neodločeno",
"yourTurn": "Vi ste na vrsti",
"opponentTurn": "Na vrsti je nasprotnik",
"pleaseEnterValidCoordinates": "Vnesite veljavne koordinate",
"locationNotAvailable": "Lokacija ni na voljo",
"customCaveMapPoint": "Točka jamske karte po meri",
"mapPoint": "Točka na karti",
"fetchingMissingImageFragments": "Pridobivanje manjkajočih delov …",
"loadingImage": "Nalaganje …",
"receivingImage": "Sprejemanje …",
"tapToLoad": "Tapnite za nalaganje",
"connectDevice": "Poveži napravo",
"chooseTransportSubtitle": "Izberite način povezave: Bluetooth, WiFi ali serijska",
"ble": "BLE",
"network": "Omrežje",
"serial": "Serijsko",
"scan": "Poišči",
"pressScanToSearchForDevices": "Pritisnite Poišči za iskanje naprav v bližini",
"failedToConnectToDevice": "Povezava z napravo {name} ni uspela",
"unknownDevice": "Neznana naprava",
"showingCachedResultsTapRefresh": "Prikazani so predpomnjeni rezultati. Za ponovno iskanje tapnite osveži.",
"scanningLocalNetworkOnPort": "Iskanje naprav MeshCore WiFi v lokalnem omrežju na vratih {port}",
"cancelScanAndAddServer": "Prekliči iskanje in dodaj strežnik",
"addServer": "Dodaj strežnik",
"scanningProgressIps": "Iskanje … {scanned}/{total} IP naslovov",
"cancelAndEnterManually": "Prekliči in vnesi ročno",
"noRecentOrDiscoveredServers": "Še ni nedavnih ali odkritih strežnikov",
"recentlyUsed": "Nedavno uporabljeno",
"connecting": "Povezovanje …",
"discoveredOnThisNetwork": "Odkrito v tem omrežju",
"serverNoLongerAvailable": "Strežnik na {host}:{port} ni več dosegljiv. Ponovite iskanje, da najdete aktivne strežnike.",
"failedToConnectToHost": "Povezava s strežnikom {host}:{port} ni uspela",
"enterValidIpAddress": "Vnesite veljaven IP naslov",
"enterValidTcpPort": "Vnesite veljavna vrata TCP",
"ipAddress": "IP naslov",
"tcpPort": "Vrata TCP",
"customServerPort": "Vrata strežnika po meri",
"chat": "Klepet",
"restoringPreviousLink": "Obnavljanje prejšnje povezave",
"noDeviceConnected": "Ni povezane naprave",
"sendAdvert": "Pošlji moj kontakt",
"advertMode": "Pošlji moj kontakt",
"advertModeSubtitle": "Izberite, kako daleč naj potujejo vaši kontaktni podatki.",
"floodAdvertSent": "Kontakt poslan z razprševanjem po omrežju",
"directAdvertSent": "Kontakt poslan neposredno bližnjim napravam"
}