{ "@@locale": "cs", "appTitle": "Šepot", "@appTitle": { "description": "Název aplikace — značka, nepřekládá se." }, "settingsLanguage": "Jazyk aplikace", "@settingsLanguage": { "description": "Nastavení: titulek dlaždice a dialogu pro volbu jazyka rozhraní." }, "languageSystem": "Podle systému", "@languageSystem": { "description": "Volba jazyka: řídit se jazykem zařízení." }, "commonUnknownContact": "Neznámý", "@commonUnknownContact": { "description": "Titulek AppBar chatu, když kontakt nebyl nalezen | Fallback displayName nově založeného kontaktu z rosteru skupinové pozvánky (_handleGroupInvite), když člen nemá jméno — objeví se jako jméno kontaktu v seznamu kontaktů a chatu. | Fallback displayName v _findOrCreateContact pro neznámého odesílatele bez jména v profilu — identický text jako ř. 967, stejný klíč." }, "verifyVerified": "Ověřeno", "@verifyVerified": { "description": "Stav ověření kontaktu pod jménem v AppBar chatu (klepnutí vede na safety number) | Titulek AlertDialogu po skenu QR, když bezpečnostní čísla souhlasí" }, "verifyUnverified": "Neověřeno", "@verifyUnverified": { "description": "Stav ověření kontaktu pod jménem v AppBar chatu" }, "chatMenuVerifyContact": "Ověřit kontakt", "@chatMenuVerifyContact": { "description": "Položka popup menu (⋮) v chatu 1:1 | Titulek položky v bottom sheetu (long-press na kontakt) — vede na obrazovku ověření safety number" }, "chatDisappearingMessages": "Mizící zprávy", "@chatDisappearingMessages": { "description": "Položka popup menu chatu 1:1; stejný text i ve skupinovém menu (ř. 350) a jako titulek SimpleDialog (ř. 1125) — jeden klíč | Položka popup menu skupinového chatu — sdílený klíč s ř. 173 | Titulek SimpleDialog výběru TTL — sdílený klíč s ř. 173/350" }, "chatMenuUnblockContact": "Odblokovat kontakt", "@chatMenuUnblockContact": { "description": "Položka popup menu chatu, když je kontakt blokovaný" }, "chatMenuBlockContact": "Blokovat kontakt", "@chatMenuBlockContact": { "description": "Položka popup menu chatu" }, "reportAndBlock": "Nahlásit a zablokovat", "@reportAndBlock": { "description": "Položka popup menu chatu (červená); stejný text = titulek dialogu (ř. 637) a potvrzovací tlačítko (ř. 649) | Titulek AlertDialogu nahlášení — sdílený klíč s ř. 188 a 649 | Potvrzovací tlačítko dialogu nahlášení (červené) — sdílený klíč" }, "errorGeneric": "Chyba: {error}", "@errorGeneric": { "description": "Chybový stav při načítání konverzace (1:1 chat, střed obrazovky) | Chybový stav při načítání konverzace (skupinový chat) — sdílený klíč s ř. 250 | SnackBar — obecná chyba při nastavování nátlakového PINu; kandidát na sdílený klíč napříč appkou", "placeholders": { "error": { "type": "String" } } }, "groupsYouLeftGroup": "Už nejsi ve skupině", "@groupsYouLeftGroup": { "description": "Podtitulek AppBar skupinového chatu po opuštění skupiny; POZOR gender (opustil/opustila)" }, "groupsMemberCount": "{count, plural, one{1 člen} few{{count} členové} many{{count} člena} other{{count} členů}}", "@groupsMemberCount": { "description": "Podtitulek AppBar skupinového chatu — počet členů, klepnutí otevře seznam.", "placeholders": { "count": { "type": "int" } } }, "groupsMembers": "Členové", "@groupsMembers": { "description": "Položka popup menu skupinového chatu" }, "groupsRename": "Přejmenovat skupinu", "@groupsRename": { "description": "Položka popup menu skupiny; stejný text = titulek dialogu přejmenování (ř. 522) — jeden klíč | Titulek AlertDialog přejmenování skupiny — sdílený klíč s ř. 348" }, "groupsLeave": "Opustit skupinu", "@groupsLeave": { "description": "Položka popup menu skupiny (červená)" }, "groupsLeftBanner": "Už nejsi ve skupině. Historie zůstává, nové zprávy nedorazí.", "@groupsLeftBanner": { "description": "Banner místo input baru ve skupině, kterou uživatel opustil; POZOR gender" }, "groupsMembersWithCount": "Členové ({count})", "@groupsMembersWithCount": { "description": "Nadpis bottom sheetu se seznamem členů skupiny", "placeholders": { "count": { "type": "int" } } }, "groupsYou": "Ty", "@groupsYou": { "description": "Fallback jména vlastního avataru v seznamu členů skupiny | Titulek ListTile vlastní osoby v seznamu členů skupiny — stejný klíč jako ř. 486" }, "groupsFounder": "Zakladatel", "@groupsFounder": { "description": "Subtitle člena, který skupinu založil, v seznamu členů" }, "groupsNameHint": "Název skupiny", "@groupsNameHint": { "description": "hintText TextFieldu v dialogu přejmenování skupiny | labelText textového pole pro jméno skupiny (max 64 znaků)" }, "commonCancel": "Zrušit", "@commonCancel": { "description": "Tlačítko zrušení v dialogu přejmenování skupiny | Tlačítko zrušení v dialogu opuštění skupiny — sdílený klíč | Tlačítko zrušení v dialogu nahlášení — sdílený klíč" }, "commonSave": "Uložit", "@commonSave": { "description": "Potvrzovací tlačítko dialogu přejmenování skupiny" }, "groupsRenameFailed": "Přejmenování selhalo: {error}", "@groupsRenameFailed": { "description": "SnackBar při selhání přejmenování skupiny", "placeholders": { "error": { "type": "String" } } }, "groupsLeaveConfirmTitle": "Opustit skupinu?", "@groupsLeaveConfirmTitle": { "description": "Titulek potvrzovacího AlertDialogu opuštění skupiny" }, "groupsLeaveConfirmBody": "Ostatní uvidí, že už ve skupině nejsi. Historie ti zůstane, ale nové zprávy už nedostaneš a zpět tě musí někdo pozvat.", "@groupsLeaveConfirmBody": { "description": "Obsah potvrzovacího dialogu opuštění skupiny. POZOR: adjacentní literály přes 2 řádky (558-559) — sloučit do jednoho klíče; gender ('odešel')" }, "groupsLeaveAction": "Opustit", "@groupsLeaveAction": { "description": "Destruktivní potvrzovací tlačítko dialogu opuštění skupiny" }, "groupsLeaveFailed": "Odchod selhal: {error}", "@groupsLeaveFailed": { "description": "SnackBar při selhání opuštění skupiny", "placeholders": { "error": { "type": "String" } } }, "chatBlockedBanner": "Kontakt je zablokovaný. Nedostáváš od něj zprávy a nemůžeš mu psát.", "@chatBlockedBanner": { "description": "Banner místo input baru u blokovaného kontaktu" }, "chatUnblock": "Odblokovat", "@chatUnblock": { "description": "Tlačítko v banneru blokovaného kontaktu" }, "chatContactBlocked": "Kontakt {name} je zablokovaný", "@chatContactBlocked": { "description": "SnackBar po zablokování kontaktu; POZOR gender ('byl') — přeformulovat neutrálně nebo ICU select", "placeholders": { "name": { "type": "String" } } }, "chatContactUnblocked": "Kontakt {name} je odblokovaný", "@chatContactUnblocked": { "description": "SnackBar po odblokování kontaktu; POZOR gender", "placeholders": { "name": { "type": "String" } } }, "reportAndBlockBody": "Kontakt {name} zablokujeme a přestaneš od něj dostávat zprávy. Pak ti nabídneme formulář, kterým nám dáš vědět, co se stalo — obsah zpráv nevidíme, takže bez tvého popisu o tom nevíme.", "@reportAndBlockBody": { "description": "Obsah dialogu nahlášení kontaktu. POZOR: adjacentní literály přes 3 řádky (639-641) — sloučit do jednoho klíče; gender ('bude zablokován')", "placeholders": { "name": { "type": "String" } } }, "chatEmptyEncrypted": "Zprávy jsou end-to-end šifrované.", "@chatEmptyEncrypted": { "description": "Prázdný stav chatu (žádné zprávy), první řádek pod E2E badge" }, "chatEmptyNoOneElse": "Nikdo jiný je nemůže číst.", "@chatEmptyNoOneElse": { "description": "Prázdný stav chatu, druhý řádek — navazuje na chatEmptyEncrypted" }, "commonToday": "Dnes", "@commonToday": { "description": "Datumový oddělovač mezi zprávami pro dnešní den — pravděpodobně sdílený i s chat listem" }, "commonYesterday": "Včera", "@commonYesterday": { "description": "Datumový oddělovač mezi zprávami pro včerejší den" }, "chatMessageHint": "Napiš zprávu…", "@chatMessageHint": { "description": "hintText vstupního pole pro psaní zprávy" }, "chatDiscardRecording": "Zahodit", "@chatDiscardRecording": { "description": "Tooltip tlačítka koše v liště nahrávání hlasové zprávy" }, "chatRecording": "Nahrávám…", "@chatRecording": { "description": "Text v liště během nahrávání hlasové zprávy; gender OK (1. os.), ale ověřit pro ru/it" }, "chatMicPermissionMissing": "Chybí oprávnění k mikrofonu", "@chatMicPermissionMissing": { "description": "SnackBar když aplikace nemá oprávnění k mikrofonu při startu nahrávání" }, "chatRecordingFailed": "Nahrávání selhalo: {error}", "@chatRecordingFailed": { "description": "SnackBar při selhání startu nahrávání hlasové zprávy", "placeholders": { "error": { "type": "String" } } }, "chatVoiceSendFailed": "Odeslání hlasové zprávy selhalo: {error}", "@chatVoiceSendFailed": { "description": "SnackBar při selhání odeslání hlasové zprávy", "placeholders": { "error": { "type": "String" } } }, "chatDeletedMessagePreview": "Smazaná zpráva", "@chatDeletedMessagePreview": { "description": "Náhled citované zprávy v compose banneru (odpověď na smazanou zprávu); stejný text v _buildQuote ř. 1486 — jeden klíč | Náhled citované smazané zprávy v quote bloku bubliny — sdílený klíč s ř. 952" }, "chatVoiceMessagePreview": "🎤 Hlasová zpráva", "@chatVoiceMessagePreview": { "description": "Náhled citované hlasové zprávy v compose banneru; stejný text ř. 1488 — jeden klíč | Náhled citované hlasové zprávy v quote bloku bubliny — sdílený klíč s ř. 954 | Náhled poslední zprávy v dlaždici, když je poslední zpráva hlasová (audio příloha); emoji je součást textu" }, "chatPhotoPreview": "📷 Fotka", "@chatPhotoPreview": { "description": "Náhled citovaného obrázku v compose banneru; stejný text ř. 1491 — jeden klíč | Náhled citovaného obrázku v quote bloku bubliny — sdílený klíč s ř. 958 | Náhled poslední zprávy v dlaždici — fotka bez popisku; emoji je součást textu" }, "chatAttachmentPreview": "📎 Příloha", "@chatAttachmentPreview": { "description": "Náhled citované přílohy v compose banneru; stejný text ř. 1491 — jeden klíč | Náhled citované přílohy v quote bloku bubliny — sdílený klíč s ř. 959" }, "chatEditingMessage": "Úprava zprávy", "@chatEditingMessage": { "description": "Titulek compose banneru v režimu úpravy zprávy" }, "chatReply": "Odpověď", "@chatReply": { "description": "Titulek compose banneru v režimu odpovědi" }, "chatActionReply": "Odpovědět", "@chatActionReply": { "description": "Položka akčního bottom sheetu zprávy (long-press)" }, "commonCopy": "Kopírovat", "@commonCopy": { "description": "Položka akčního bottom sheetu zprávy — kopírování textu do schránky | Popisek OutlinedButton.icon pro zkopírování Šepot ID do schránky" }, "commonEdit": "Upravit", "@commonEdit": { "description": "Položka akčního bottom sheetu vlastní textové zprávy" }, "chatDeleteForMe": "Smazat u mě", "@chatDeleteForMe": { "description": "Položka akčního bottom sheetu — lokální smazání zprávy" }, "chatDeleteForEveryone": "Smazat pro všechny", "@chatDeleteForEveryone": { "description": "Položka akčního bottom sheetu vlastní zprávy (červená) — smazání u obou stran" }, "commonOff": "Vypnuto", "@commonOff": { "description": "Volba v dialogu mizících zpráv (TTL vypnuto); text se používá i v potvrzovacím SnackBaru přes placeholder ř. 1167 | Label volby 'off' v dialogu výběru režimu pushů. Stejný text jako subtitle ListTile pro vypnutý stav (ř. 168) → stejný klíč. | Subtitle ListTile v nastavení, když jsou pushe vypnuté — stejný text a klíč jako label volby v dialogu (ř. 46)" }, "chatDisappearing30s": "30 sekund", "@chatDisappearing30s": { "description": "Volba TTL v dialogu mizících zpráv; české skloňování zapečené ve fixním labelu — samostatný klíč, ne ICU" }, "chatDisappearing5m": "5 minut", "@chatDisappearing5m": { "description": "Volba TTL v dialogu mizících zpráv" }, "chatDisappearing1h": "1 hodina", "@chatDisappearing1h": { "description": "Volba TTL v dialogu mizících zpráv" }, "chatDisappearing1d": "1 den", "@chatDisappearing1d": { "description": "Volba TTL v dialogu mizících zpráv" }, "chatDisappearing1w": "1 týden", "@chatDisappearing1w": { "description": "Volba TTL v dialogu mizících zpráv" }, "chatDisappearingDescription": "Nové zprávy se po uplynutí doby smažou u tebe i u protistrany.", "@chatDisappearingDescription": { "description": "Vysvětlující text v dialogu mizících zpráv" }, "chatDisappearingDisabled": "Mizící zprávy vypnuty", "@chatDisappearingDisabled": { "description": "SnackBar po vypnutí mizících zpráv" }, "chatDisappearingEnabled": "Nové zprávy zmizí po: {duration}", "@chatDisappearingEnabled": { "description": "SnackBar po nastavení TTL mizících zpráv. POZOR: adjacentní literály (1166-1167) + placeholder je lokalizovaný label volby (chatDisappearing*) — v kódu dosazovat už přeložený string", "placeholders": { "duration": { "type": "String" } } }, "attachmentGallery": "Fotka z galerie", "@attachmentGallery": { "description": "Položka bottom sheetu výběru přílohy" }, "attachmentTakePhoto": "Vyfotit", "@attachmentTakePhoto": { "description": "Položka bottom sheetu výběru přílohy — kamera" }, "attachmentDocument": "Dokument", "@attachmentDocument": { "description": "Položka bottom sheetu výběru přílohy — file picker" }, "attachmentTooLarge": "Soubor je příliš velký (max {maxMb} MB)", "@attachmentTooLarge": { "description": "SnackBar (_showError) když vybraný dokument překročí limit velikosti. POZOR: adjacentní literály (1227-1228) — sloučit", "placeholders": { "maxMb": { "type": "int" } } }, "attachmentPickFailed": "Výběr přílohy selhal: {error}", "@attachmentPickFailed": { "description": "SnackBar (_showError) při selhání výběru přílohy", "placeholders": { "error": { "type": "String" } } }, "attachmentSendFailed": "Odeslání přílohy selhalo: {error}", "@attachmentSendFailed": { "description": "SnackBar (_showError) při selhání odeslání přílohy", "placeholders": { "error": { "type": "String" } } }, "chatSendFailed": "Odeslání selhalo: {error}", "@chatSendFailed": { "description": "SnackBar při selhání odeslání/úpravy textové zprávy", "placeholders": { "error": { "type": "String" } } }, "chatMessageDeleted": "Zpráva smazána", "@chatMessageDeleted": { "description": "Text v bublině smazané zprávy (kurzíva s ikonou block) | Náhled poslední zprávy v dlaždici, když byla poslední zpráva smazána" }, "chatEdited": "upraveno", "@chatEdited": { "description": "Malý štítek v patičce bubliny upravené zprávy, vedle času" }, "errorTrustRootChanged": "Trust root relaye se změnil! Odmítám komunikovat.", "@errorTrustRootChanged": { "description": "StateError z _refreshSenderCert při neshodě pinovaného trust rootu (možný MITM/jiný relay); propaguje se přes _senderCertificate do sendText/sendAttachment — chybu zobrazuje chat UI (SnackBar / failed stav zprávy)." }, "errorRelayUnavailable": "Relay nedostupný (sender certificate)", "@errorRelayUnavailable": { "description": "StateError z _senderCertificate, když se nepodařilo získat sender certificate (offline relay); propaguje se do odesílací cesty, zobrazuje chat UI při selhání odeslání." }, "errorNotYetRegistered": "Šepot se ještě připojuje k relayi — zkus zprávu poslat za chvíli.", "@errorNotYetRegistered": { "description": "NotYetRegisteredError z _sendContent, když vlastní registrace na relay ještě nedoběhla (čerstvá instalace). 'Šepot' je značka, nepřekládat." }, "errorContactLinkIncomplete": "Odkaz je neúplný — protistrana ho vytvořila dřív, než se stihla připojit. Požádej ji o nový sepot:// odkaz.", "@errorContactLinkIncomplete": { "description": "ContactLinkIncompleteError při přidání kontaktu z odkazu/QR bez routingu (aid+da). 'sepot://' je schéma odkazu, zachovat." }, "errorAttachmentTooLarge": "Příloha je příliš velká (max {maxMb} MB)", "@errorAttachmentTooLarge": { "description": "StateError z _prepareAttachment při překročení limitu velikosti přílohy; zobrazuje UI výběru/odeslání přílohy. POZOR: v kódu jde o dva adjacentní literály 'Příloha je příliš velká ' (ř. 448) + '(max ${…} MB)' (ř. 449) — sloučit do jednoho klíče.", "placeholders": { "maxMb": { "type": "int" } } }, "errorGroupNeedsMember": "Skupina potřebuje aspoň 1 člena", "@errorGroupNeedsMember": { "description": "StateError z createGroup při prázdném seznamu členů; zobrazuje UI zakládání skupiny." }, "errorGroupMaxMembers": "Skupina může mít nejvýš {maxMembers} členů", "@errorGroupMaxMembers": { "description": "StateError z createGroup při překročení max. počtu členů; zobrazuje UI zakládání skupiny. Počet v textu + české skloňování (člen/členové/členů) → ICU plural. | StateError z addGroupMembers — identický text jako v createGroup (ř. 583), stejný klíč. ICU plural.", "placeholders": { "maxMembers": { "type": "int" } } }, "errorMemberNoDeliveryAddress": "{displayName} nemá doručovací adresu — požádej o nový odkaz", "@errorMemberNoDeliveryAddress": { "description": "StateError z createGroup pro člena bez routingu (aid/da); zobrazuje UI zakládání skupiny. Víceřádkový throw, literál na ř. 589. | StateError z addGroupMembers — identický text jako v createGroup (ř. 589), stejný klíč.", "placeholders": { "displayName": { "type": "String" } } }, "errorContactNoDeliveryAddress": "Kontakt nemá doručovací adresu — požádej ho o nový sepot:// odkaz", "@errorContactNoDeliveryAddress": { "description": "StateError z _sendContent, když protějšek nemá accountId/deliveryAddress; propaguje se do sendText/sendAttachment/fanoutu — zobrazuje chat UI při selhání odeslání. 'sepot://' je schéma odkazu, v překladu zachovat." }, "errorIdentityKeyMismatch": "Identity klíč z relaye NESEDÍ s kontaktem — možný MITM! Zpráva neodeslána.", "@errorIdentityKeyMismatch": { "description": "StateError z _sendContent při X3DH bootstrapu, když identity klíč z bundle relaye nesedí s klíčem kontaktu (anti-MITM); zobrazuje chat UI. POZOR: dva adjacentní literály 'Identity klíč z relaye NESEDÍ s kontaktem — možný MITM! ' (ř. 1013) + 'Zpráva neodeslána.' (ř. 1014) — sloučit do jednoho klíče." }, "settingsTitle": "Nastavení", "@settingsTitle": { "description": "Titulek AppBaru obrazovky Nastavení" }, "settingsSectionGeneral": "Obecné", "@settingsSectionGeneral": { "description": "Hlavička sekce v nastavení (jazyk)" }, "settingsSectionSecurity": "Zabezpečení", "@settingsSectionSecurity": { "description": "Hlavička sekce v nastavení (PIN, biometrie, zámek)" }, "settingsChangePinTitle": "Změnit PIN", "@settingsChangePinTitle": { "description": "Titulek dlaždice — otevře změnu PINu | Titulek AppBaru obrazovky změny PINu (vstup z dlaždice v Nastavení)" }, "settingsChangePinSubtitle": "6místný PIN pro odemknutí", "@settingsChangePinSubtitle": { "description": "Podtitulek dlaždice Změnit PIN" }, "settingsAutoLockTitle": "Automatický zámek", "@settingsAutoLockTitle": { "description": "Titulek dlaždice auto-zámku; STEJNÝ text i jako title SimpleDialogu na ř. 263 — jeden klíč | Title SimpleDialogu s výběrem intervalu auto-zámku — stejný klíč jako dlaždice ř. 67" }, "settingsAutoLock5min": "Po 5 minutách", "@settingsAutoLock5min": { "description": "Fallback podtitulek dlaždice auto-zámku, když mapa AutoLockNotifier.moznosti nemá hodnotu — mapa samotná je v settings_provider.dart a musí se lokalizovat tam, stejný text tam nejspíš existuje → sdílet klíč | Volba automatického zámku (300 s, výchozí) v nastavení" }, "settingsDecoyPinTitle": "Nátlakový PIN", "@settingsDecoyPinTitle": { "description": "Titulek dlaždice nátlakového PINu; STEJNÝ text jako title AlertDialogu ř. 445 a labelText TextFieldu ř. 461 — jeden klíč | Title AlertDialogu nastavení nátlakového PINu — stejný klíč jako dlaždice ř. 75 | labelText prvního TextFieldu (zadání decoy PINu) — stejný klíč" }, "settingsDecoyPinSetSubtitle": "Nastaven — otevře prázdnou aplikaci", "@settingsDecoyPinSetSubtitle": { "description": "Podtitulek dlaždice, když nátlakový PIN JE nastaven" }, "settingsDecoyPinUnsetSubtitle": "Druhý PIN, který otevře prázdnou aplikaci", "@settingsDecoyPinUnsetSubtitle": { "description": "Podtitulek dlaždice, když nátlakový PIN NENÍ nastaven" }, "settingsSectionNotifications": "Notifikace", "@settingsSectionNotifications": { "description": "Hlavička sekce v nastavení (push)" }, "settingsSectionConnection": "Připojení", "@settingsSectionConnection": { "description": "Hlavička sekce v nastavení (Tor) — jen Android" }, "settingsSectionPrivacy": "Soukromí", "@settingsSectionPrivacy": { "description": "Hlavička sekce v nastavení (potvrzení přečtení, screen security)" }, "settingsReadReceiptsTitle": "Potvrzení přečtení", "@settingsReadReceiptsTitle": { "description": "Titulek dlaždice se switchem" }, "settingsReadReceiptsSubtitle": "Ukazovat protistraně přečtení zpráv (výchozí vypnuto)", "@settingsReadReceiptsSubtitle": { "description": "Podtitulek dlaždice Potvrzení přečtení; tykání, mužský rod ('přečetl') — v překladu volit genderově neutrální formulaci" }, "settingsScreenSecurityTitle": "Zabezpečení obrazovky", "@settingsScreenSecurityTitle": { "description": "Titulek dlaždice se switchem (FLAG_SECURE)" }, "settingsScreenSecuritySubtitle": "Blokovat screenshoty a skrýt obsah v přepínači aplikací", "@settingsScreenSecuritySubtitle": { "description": "Podtitulek dlaždice Zabezpečení obrazovky" }, "settingsSectionBackup": "Záloha klíčů", "@settingsSectionBackup": { "description": "Hlavička sekce v nastavení (seed fráze, export/import)" }, "settingsSeedPhraseTitle": "Zálohovací fráze", "@settingsSeedPhraseTitle": { "description": "Titulek dlaždice; STEJNÝ text jako title AlertDialogu ř. 542 — jeden klíč | Title AlertDialogu se seed frází — stejný klíč jako dlaždice ř. 138 | Nadpis sekce se seed frází po vygenerování klíčů" }, "settingsSeedPhraseSubtitle": "24 slov pro obnovu identity", "@settingsSeedPhraseSubtitle": { "description": "Podtitulek dlaždice Zálohovací fráze" }, "settingsBackupExportTitle": "Zálohovat historii", "@settingsBackupExportTitle": { "description": "Titulek dlaždice exportu zálohy" }, "settingsBackupExportSubtitle": "Šifrovaný soubor s kontakty a zprávami", "@settingsBackupExportSubtitle": { "description": "Podtitulek dlaždice Zálohovat historii" }, "settingsBackupImportTitle": "Obnovit ze zálohy", "@settingsBackupImportTitle": { "description": "Titulek dlaždice importu zálohy" }, "settingsBackupImportSubtitle": "Načíst zálohu (jen s tvojí identitou)", "@settingsBackupImportSubtitle": { "description": "Podtitulek dlaždice Obnovit ze zálohy" }, "settingsSectionSafety": "Bezpečnost", "@settingsSectionSafety": { "description": "Hlavička sekce v nastavení (nahlášení zneužití, ochrana dětí) — odlišit od settingsSectionSecurity ('Zabezpečení')" }, "settingsReportAbuseTitle": "Nahlásit zneužití", "@settingsReportAbuseTitle": { "description": "Titulek dlaždice — otevře /report" }, "settingsReportAbuseSubtitle": "Obtěžování, podvod, ohrožení dítěte", "@settingsReportAbuseSubtitle": { "description": "Podtitulek dlaždice Nahlásit zneužití" }, "settingsChildSafetyTitle": "Standardy ochrany dětí", "@settingsChildSafetyTitle": { "description": "Titulek dlaždice — otevře externí URL childSafetyUrl | TextButton dole na formuláři — otevírá AppConstants.childSafetyUrl v externím prohlížeči" }, "settingsChildSafetySubtitle": "Jak postupujeme proti zneužívání dětí", "@settingsChildSafetySubtitle": { "description": "Podtitulek dlaždice Standardy ochrany dětí" }, "settingsSectionAbout": "O aplikaci", "@settingsSectionAbout": { "description": "Hlavička sekce v nastavení" }, "commonAppName": "Šepot", "@commonAppName": { "description": "Titulek dlaždice O aplikaci — název produktu; napříč jazyky pravděpodobně zůstává 'Šepot' (brand), ale klíč založit, ať jde rozhodnout centrálně | Titulek AppBaru hlavní obrazovky — název aplikace (brand; zvážit nepřekládat) | Titulek lokální notifikace (showMessageNotification). Je to název aplikace/brand — rozhodnout, zda zůstává 'Šepot' ve všech jazycích; doporučeno nepřekládat, ale klíč zavést kvůli konzistenci. Duplicitně na řádcích 60 a 83." }, "settingsVersion": "Verze {version}", "@settingsVersion": { "description": "Podtitulek dlaždice O aplikaci; STEJNÝ text i v about dialogu ř. 596 — jeden klíč | Verze v about dialogu — stejný klíč jako ř. 181", "placeholders": { "version": { "type": "String" } } }, "settingsLicenseTitle": "Licence", "@settingsLicenseTitle": { "description": "Titulek dlaždice; STEJNÝ text jako title AlertDialogu ř. 241 — jeden klíč" }, "settingsLicenseSubtitle": "AGPL-3.0", "@settingsLicenseSubtitle": { "description": "Podtitulek dlaždice Licence — název licence, ve všech jazycích stejný; klíč založit kvůli konzistenci extrakce (nebo ponechat literál — rozhodnutí orchestrátora)" }, "settingsPrivacyPolicyTitle": "Zásady ochrany soukromí", "@settingsPrivacyPolicyTitle": { "description": "Titulek dlaždice — otevře privacyUrl" }, "settingsPrivacyPolicySubtitle": "Co o tobě víme (a co ne)", "@settingsPrivacyPolicySubtitle": { "description": "Podtitulek dlaždice Zásady ochrany soukromí; tykání" }, "settingsTermsTitle": "Podmínky použití", "@settingsTermsTitle": { "description": "Titulek dlaždice — otevře termsUrl" }, "settingsTermsSubtitle": "sepot.cz/podminky", "@settingsTermsSubtitle": { "description": "Podtitulek dlaždice Podmínky použití — zobrazená lidsky čitelná URL; POZOR: cesta /podminky je česká, pro en/de/ru/it zvážit lokalizované URL nebo neutrální text" }, "settingsDataDeletionTitle": "Smazání dat", "@settingsDataDeletionTitle": { "description": "Titulek dlaždice — otevře deletionUrl" }, "settingsDataDeletionSubtitle": "Jak požádat o výmaz", "@settingsDataDeletionSubtitle": { "description": "Podtitulek dlaždice Smazání dat" }, "settingsDeleteAllDataButton": "Smazat všechna data", "@settingsDeleteAllDataButton": { "description": "Červené OutlinedButton dole na obrazovce — otevře potvrzovací dialog smazání účtu" }, "settingsLicenseBody": "Šepot je šířen pod licencí GNU Affero General Public License verze 3 (AGPL-3.0). Používá knihovnu libsignal, rovněž AGPL-3.0.\n\nO zdrojový kód odpovídající této verzi si můžeš napsat na {supportEmail} a pošleme ti ho.", "@settingsLicenseBody": { "description": "Obsah AlertDialogu Licence (plní nabídku zdrojáku dle AGPL § 6); v kódu 3 adjacentní literály přes ř. 243-246 — sloučit do jednoho klíče s placeholder supportEmail", "placeholders": { "supportEmail": { "type": "String" } } }, "commonClose": "Zavřít", "@commonClose": { "description": "Tlačítko zavření dialogu Licence; stejný text ř. 574 (seed fráze) a ř. 619 (about) — jeden common klíč | Tlačítko zavření dialogu seed fráze — společný klíč | Tlačítko zavření about dialogu — společný klíč" }, "settingsIdCopied": "ID zkopírováno", "@settingsIdCopied": { "description": "SnackBar po tapnutí na Šepot ID v profilové kartě (kopie do schránky)" }, "settingsFingerprint": "Otisk: {fingerprint}", "@settingsFingerprint": { "description": "Kryptografický otisk identity v profilové kartě nahoře | Řádek s bezpečnostním otiskem (fingerprint) identity v potvrzovacím dialogu nového kontaktu. | Popisek kryptografického otisku pod jménem uživatele (monospace styl)", "placeholders": { "fingerprint": { "type": "String" } } }, "backupShareSubject": "Šepot — šifrovaná záloha", "@backupShareSubject": { "description": "Subject share_plus při sdílení souboru zálohy — vidí uživatel v systémovém share sheetu / e-mailu" }, "backupExportFailed": "Záloha selhala: {error}", "@backupExportFailed": { "description": "SnackBar při chybě exportu zálohy", "placeholders": { "error": { "type": "String" } } }, "backupRestoredCount": "{count, plural, one{Obnovena 1 konverzace ze zálohy} few{Obnoveny {count} konverzace ze zálohy} many{Obnoveno {count} konverzace ze zálohy} other{Obnoveno {count} konverzací ze zálohy}}", "@backupRestoredCount": { "description": "SnackBar po úspěšném importu zálohy historie.", "placeholders": { "count": { "type": "int" } } }, "backupImportFailed": "Obnova ze zálohy selhala: {error}", "@backupImportFailed": { "description": "SnackBar při chybě importu zálohy", "placeholders": { "error": { "type": "String" } } }, "settingsDecoyPinExplain": "Zadáním tohoto PINu se aplikace otevře prázdná — bez tvých kontaktů a zpráv. Musí být jiný než běžný PIN.", "@settingsDecoyPinExplain": { "description": "Vysvětlující text v dialogu nastavení nátlakového PINu; v kódu 2 adjacentní literály ř. 450-451 — sloučit" }, "commonConfirm": "Potvrdit", "@commonConfirm": { "description": "labelText druhého TextFieldu (potvrzení decoy PINu)" }, "commonSet": "Nastavit", "@commonSet": { "description": "Potvrzovací tlačítko dialogu nátlakového PINu (uloží PIN)" }, "settingsDecoyPinEnabled": "Nátlakový PIN nastaven", "@settingsDecoyPinEnabled": { "description": "SnackBar po úspěšném nastavení nátlakového PINu" }, "settingsDecoyPinConflict": "Nátlakový PIN musí být jiný než běžný", "@settingsDecoyPinConflict": { "description": "SnackBar při DecoyPinConflict (decoy PIN == hlavní PIN); výjimka sama je v secure_storage.dart, hláška ale vzniká tady v UI" }, "settingsDecoyPinDisabled": "Nátlakový PIN zrušen", "@settingsDecoyPinDisabled": { "description": "SnackBar po deaktivaci nátlakového PINu" }, "settingsSeedPhraseNotFound": "Zálohovací fráze nebyla nalezena", "@settingsSeedPhraseNotFound": { "description": "SnackBar, když storage nevrátí seed frázi" }, "settingsSeedPhraseWarning": "Tato slova jsou jedinou zálohou tvé identity. Nikomu je neukazuj!", "@settingsSeedPhraseWarning": { "description": "Varování v dialogu seed fráze; 2 adjacentní literály ř. 547-548 — sloučit; POZOR gramatická chyba v originálu: správně 'Tato slova' — v cs ARB opravit" }, "settingsSeedWordChip": "{index}. {word}", "@settingsSeedWordChip": { "description": "Label Chipu s jedním slovem seed fráze ve formátu '1. slovo'; formát je jazykově neutrální — možno ponechat i bez ARB, ale pro RU/DE typografii raději klíč s placeholders", "placeholders": { "index": { "type": "int" }, "word": { "type": "String" } } }, "settingsAboutTagline": "Šepot — Soukromý Messenger", "@settingsAboutTagline": { "description": "Nadpis v about dialogu; 'Šepot' je brand, podtitul 'Soukromý Messenger' se překládá" }, "settingsAboutBody": "E2E šifrovaný messenger s otevřeným zdrojovým kódem.\n\nKryptografie:\n• X25519 (výměna klíčů)\n• XChaCha20-Poly1305 (šifrování)\n• Ed25519 (podpisy)\n\n© 2026 ajtak.it", "@settingsAboutBody": { "description": "Tělo about dialogu; 6 adjacentních literálů ř. 601-606 — sloučit do jednoho víceřádkového klíče; názvy algoritmů a copyright zůstávají, překládají se jen popisky v závorkách a úvodní věta" }, "settingsDeleteAccountTitle": "Smazat účet a všechna data?", "@settingsDeleteAccountTitle": { "description": "Title potvrzovacího AlertDialogu smazání účtu" }, "settingsDeleteAccountBody": "Tato akce je nevratná. Všechny zprávy, kontakty a klíče budou smazány z tohoto zařízení a účet bude odregistrován ze serveru. Pokud nemáš zálohovací frázi, přijdeš o svou identitu.", "@settingsDeleteAccountBody": { "description": "Tělo potvrzovacího dialogu smazání účtu; 3 adjacentní literály ř. 632-634 — sloučit; tykání" }, "settingsDeleteAccountServerOffline": "Server je teď nedostupný — data v zařízení jsou smazaná, registrace na serveru zůstala. Zbytek smažeme na podpora@sepot.cz.", "@settingsDeleteAccountServerOffline": { "description": "SnackBar (8 s) po smazání dat, když serverová deregistrace selhala; 3 adjacentní literály ř. 657-659 — sloučit; obsahuje natvrdo e-mail podpora@sepot.cz — zvážit placeholder z AppConstants.supportEmail místo literálu" }, "settingsDeleteAllConfirm": "Smazat vše", "@settingsDeleteAllConfirm": { "description": "Červené potvrzovací tlačítko dialogu smazání účtu — provede nevratné smazání" }, "groupsCreateFailed": "Skupinu se nepovedlo založit: {error}", "@groupsCreateFailed": { "description": "SnackBar po neúspěšném založení skupiny (výjimka z createGroup) — $e je surová výjimka, překladatel překládá jen úvod věty", "placeholders": { "error": { "type": "String" } } }, "groupsNewGroupTitle": "Nová skupina", "@groupsNewGroupTitle": { "description": "Titulek AppBaru obrazovky založení skupiny | Tooltip ikony (group_add) v AppBaru — otevře vytvoření skupiny" }, "groupsCreateAction": "Založit", "@groupsCreateAction": { "description": "Akční tlačítko v AppBaru — potvrzení založení skupiny (sloveso, krátké)" }, "groupsMembersCounter": "Členové ({selectedCount}/{maxMembers})", "@groupsMembersCounter": { "description": "Nadpis sekce seznamu kontaktů s počítadlem vybraných členů vs. maxima, formát 'Členové (3/15)'. Počet je jen v závorce jako poměr — slovo 'Členové' se neskloňuje podle počtu, ICU plural není nutný, stačí dva placeholdery.", "placeholders": { "selectedCount": { "type": "int" }, "maxMembers": { "type": "int" } } }, "groupsEmptyContactsHint": "Nejdřív si přidej kontakty — skupina se skládá z lidí, se kterými si už můžeš psát.", "@groupsEmptyContactsHint": { "description": "Prázdný stav — uživatel nemá žádné (neblokované) kontakty, ze kterých by šlo skupinu složit. POZOR: v kódu dva adjacentní literály na řádcích 121–122, sloučit do jednoho klíče (text zde už sloučený, mezera je na konci prvního literálu)." }, "groupsMemberMissingAddress": "Chybí doručovací adresa — požádej o nový odkaz", "@groupsMemberMissingAddress": { "description": "Podtitulek zašedlého (nevybratelného) kontaktu v seznamu — kontakt nemá routing (accountId/deliveryAddress), nelze ho přidat do skupiny" }, "attachmentSizeBytes": "{bytes} B", "@attachmentSizeBytes": { "description": "Velikost přílohy-dokumentu na kartě v chatu, varianta pod 1 kB (např. '512 B')", "placeholders": { "bytes": { "type": "int" } } }, "attachmentSizeKb": "{kilobytes} kB", "@attachmentSizeKb": { "description": "Velikost přílohy-dokumentu na kartě v chatu, varianta kB (např. '38 kB'). Ruština používá 'КБ'.", "placeholders": { "kilobytes": { "type": "String" } } }, "attachmentSizeMb": "{megabytes} MB", "@attachmentSizeMb": { "description": "Velikost přílohy-dokumentu na kartě v chatu, varianta MB (např. '2.3 MB'). Ruština používá 'МБ'; desetinný oddělovač by měl respektovat locale.", "placeholders": { "megabytes": { "type": "String" } } }, "attachmentDownloadFailedTapToRetry": "Stažení selhalo — klepni pro opakování", "@attachmentDownloadFailedTapToRetry": { "description": "Overlay přes thumbnail obrázkové přílohy, když stažení blobu selhalo; klepnutí spustí retry. STEJNÝ text i na ř. 464 (karta dokumentu) → jeden klíč. | Podtitulek karty dokumentu ve stavu failed (jinak se zobrazuje velikost formatBytes). Duplikát textu z ř. 134 → stejný klíč." }, "attachmentDownloadFailed": "Stažení selhalo", "@attachmentDownloadFailed": { "description": "Řádek hlasové zprávy v bublině, když stažení audio blobu selhalo (stav failed)" }, "attachmentDownloading": "Stahuji…", "@attachmentDownloading": { "description": "Řádek hlasové zprávy v bublině během stahování blobu (stav pending/downloading), vedle spinneru" }, "attachmentSharedFileFallbackName": "soubor", "@attachmentSharedFileFallbackName": { "description": "Fallback název souboru (malé písmeno) předaný do XFile.fromData při sdílení dokumentu přes systémový share sheet (share_plus) — uživatel ho vidí jako název sdíleného souboru" }, "attachmentOpenFailed": "Otevření přílohy selhalo: {error}", "@attachmentOpenFailed": { "description": "SnackBar při výjimce během dešifrování/sdílení dokumentové přílohy", "placeholders": { "error": { "type": "String" } } }, "commonFile": "Soubor", "@commonFile": { "description": "Fallback názvu dokumentu na kartě přílohy, když meta.name je null. Stejný text jako fallback v chat_list_tile.dart ř. 169 → sdílený common klíč. | Fallback názvu souboru vnořený v interpolaci na ř. 169, když msg.fileName je null. Stejný text jako attachment_content.dart ř. 452 → sdílený common klíč." }, "chatListNewConversation": "Nová konverzace", "@chatListNewConversation": { "description": "Náhled poslední zprávy v dlaždici seznamu chatů, když konverzace zatím nemá žádnou zprávu" }, "chatListPhotoWithCaptionPreview": "📷 {caption}", "@chatListPhotoWithCaptionPreview": { "description": "Náhled poslední zprávy v dlaždici — fotka s popiskem; emoji je součást textu", "placeholders": { "caption": { "type": "String" } } }, "chatListFilePreview": "📎 {fileName}", "@chatListFilePreview": { "description": "Náhled poslední zprávy v dlaždici — soubor; emoji je součást textu. Skládaný literál: obsahuje vnořený fallback \"Soubor\" (viz samostatný záznam) — při lokalizaci předat placeholderu už vyřešenou hodnotu msg.fileName ?? commonFile.", "placeholders": { "fileName": { "type": "String" } } }, "chatListReadReceiptPreview": "Přečteno", "@chatListReadReceiptPreview": { "description": "Náhled poslední zprávy v dlaždici pro zprávu typu readReceipt (potvrzení o přečtení)" }, "chatListTimeNow": "teď", "@chatListTimeNow": { "description": "Relativní čas poslední zprávy v dlaždici, méně než 1 minuta" }, "chatListTimeMinutes": "{minutes} min", "@chatListTimeMinutes": { "description": "Relativní čas poslední zprávy v dlaždici, méně než hodina (např. '12 min'). Zkratka 'min' se česky neskloňuje, ale doporučuji ICU plural pro jistotu jiných jazyků (ru).", "placeholders": { "minutes": { "type": "int" } } }, "qrScanTitle": "Skenovat QR kód", "@qrScanTitle": { "description": "Titulek AppBaru obrazovky QR skeneru pro přidání kontaktu. | Tooltip ikony QR skeneru v AppBaru kontaktů" }, "qrScanInstruction": "Namiř kameru na QR kód kontaktu", "@qrScanInstruction": { "description": "Hlavní instrukce ve spodním panelu skeneru (tykání — sjednotit tón napříč appkou)." }, "qrScanHint": "QR kód obsahuje veřejný klíč kontaktu", "@qrScanHint": { "description": "Sekundární vysvětlující text pod instrukcí ve spodním panelu skeneru." }, "qrNewContactTitle": "Nový kontakt", "@qrNewContactTitle": { "description": "Titulek potvrzovacího AlertDialogu po naskenování platného QR kódu kontaktu." }, "qrContactAdded": "{name} přidán/a", "@qrContactAdded": { "description": "SnackBar po úspěšném přidání kontaktu z QR. POZOR: gender tvar „přidán/a“ — v EN/DE/RU/IT přeformulovat neutrálně (např. „Kontakt {name} přidán“ / „{name} added“).", "placeholders": { "name": { "type": "String" } } }, "commonAdd": "Přidat", "@commonAdd": { "description": "Potvrzovací tlačítko (ElevatedButton) v dialogu nového kontaktu — obecné „Přidat“, vhodný common klíč. | Potvrzovací ElevatedButton dialogu Přidat kontakt — obecné 'Přidat', kandidát na common klíč" }, "onboardingWelcomeTitle": "Vítej v Šepotu", "@onboardingWelcomeTitle": { "description": "Nadpis 1. onboarding stránky (uvítání) pod logem" }, "onboardingWelcomeSubtitle": "Soukromý messenger s end-to-end šifrováním.\nŽádné telefonní číslo. Žádný email.\nJen tvoje klíče.", "@onboardingWelcomeSubtitle": { "description": "Podtitulek 1. onboarding stránky; v kódu 3 adjacentní literály s \\n (ř. 97–99), sloučit do jednoho klíče" }, "onboardingStart": "Začít", "@onboardingStart": { "description": "Hlavní tlačítko na 1. onboarding stránce — přejde na stránku o šifrování" }, "onboardingRestoreExisting": "Už mám účet — obnovit ze zálohovací fráze", "@onboardingRestoreExisting": { "description": "TextButton pod Začít, vede na /restore (obnova účtu ze seed fráze)" }, "onboardingEncryptionTitle": "Tvoje zprávy, tvoje klíče", "@onboardingEncryptionTitle": { "description": "Nadpis 2. onboarding stránky (vysvětlení šifrování)" }, "onboardingFeatureSignalTitle": "Signal protokol", "@onboardingFeatureSignalTitle": { "description": "Titulek feature řádku 1 na stránce o šifrování" }, "onboardingFeatureSignalSubtitle": "X3DH + Double Ratchet, forward secrecy", "@onboardingFeatureSignalSubtitle": { "description": "Podtitulek feature řádku 1 (technické termíny, částečně nepřekládat)" }, "onboardingFeaturePqTitle": "Post-kvantová ochrana", "@onboardingFeaturePqTitle": { "description": "Titulek feature řádku 2" }, "onboardingFeaturePqSubtitle": "Kyber (PQXDH) od první zprávy", "@onboardingFeaturePqSubtitle": { "description": "Podtitulek feature řádku 2" }, "onboardingFeatureLocalKeysTitle": "Klíče jen na tvém zařízení", "@onboardingFeatureLocalKeysTitle": { "description": "Titulek feature řádku 3" }, "onboardingFeatureLocalKeysSubtitle": "Žádný server je nemá", "@onboardingFeatureLocalKeysSubtitle": { "description": "Podtitulek feature řádku 3 (odkazuje na klíče z titulku)" }, "onboardingFeatureDisappearingSubtitle": "Automaticky se smaží", "@onboardingFeatureDisappearingSubtitle": { "description": "Podtitulek feature řádku 4 (podmět = zprávy z titulku)" }, "commonContinue": "Pokračovat", "@commonContinue": { "description": "Tlačítko na 2. onboarding stránce; stejný text i na ř. 351 — sdílený common klíč | Tlačítko po potvrzení uložení seed fráze — pokračuje na /pin-setup; sdílené s ř. 185" }, "onboardingIdentityTitle": "Vytvoř svoji identitu", "@onboardingIdentityTitle": { "description": "Nadpis 3. onboarding stránky (vytvoření identity)" }, "onboardingIdentitySubtitle": "Žádný email ani telefon. Jen jméno a kryptografické klíče.", "@onboardingIdentitySubtitle": { "description": "Podtitulek 3. onboarding stránky" }, "onboardingDisplayNameLabel": "Zobrazované jméno", "@onboardingDisplayNameLabel": { "description": "labelText TextFieldu pro jméno uživatele při vytváření identity | labelText pole pro jméno na obrazovce obnovy. Pravděpodobně stejný text i na setup obrazovce — kandidát na common klíč (commonDisplayName), sjednotit s inventurou onboardingu." }, "onboardingDisplayNameHint": "Např. Jan", "@onboardingDisplayNameHint": { "description": "hintText TextFieldu pro jméno — lokalizovat na typické místní jméno | hintText pole pro jméno (příklad jména — pro každý jazyk zvolit lokální jméno, např. 'e.g. John')" }, "onboardingSeedPhraseWarning": "Zapiš si těchto {count} slov. Jsou jedinou zálohou tvých klíčů!", "@onboardingSeedPhraseWarning": { "description": "Varování nad mřížkou seed slov; adjacentní literály ř. 281–282 sloučit; počet slov se česky skloňuje (slovo/slova/slov)", "placeholders": { "count": { "type": "int" } } }, "onboardingSeedSavedConfirm": "Potvrzuji, že jsem si frázi bezpečně uložil/a", "@onboardingSeedSavedConfirm": { "description": "Titulek CheckboxListTile — potvrzení uložení seed fráze; gender-neutrální tvar uložil/a, řešit i v překladech" }, "onboardingGenerateKeys": "Vygenerovat klíče", "@onboardingGenerateKeys": { "description": "Tlačítko generování identity (disabled dokud není jméno); text tlačítka referencován i v komentáři ř. 265" }, "verifyMismatchTitle": "Čísla NESOUHLASÍ", "@verifyMismatchTitle": { "description": "Titulek AlertDialogu po skenu QR, když čísla nesouhlasí (varování, CAPS záměrně)" }, "verifyMatchBody": "Klíče si odpovídají. {contactName} je ověřený kontakt.", "@verifyMatchBody": { "description": "Obsah dialogu při shodě bezpečnostních čísel", "placeholders": { "contactName": { "type": "String" } } }, "verifyMismatchBody": "Bezpečnostní čísla nesedí. Někdo může odposlouchávat spojení (MITM), nebo skenuješ kód jiného kontaktu. NEposílej citlivé zprávy a ověřte se znovu jiným kanálem.", "@verifyMismatchBody": { "description": "Obsah dialogu při neshodě — varování před MITM; adjacentní literály ř. 91–93 sloučit do jednoho klíče" }, "commonUnderstood": "Rozumím", "@commonUnderstood": { "description": "Potvrzovací tlačítko dialogu s výsledkem ověření (shoda i neshoda)" }, "verifyManualConfirmTitle": "Označit jako ověřené?", "@verifyManualConfirmTitle": { "description": "Titulek potvrzovacího dialogu při ručním označení kontaktu jako ověřeného" }, "verifyManualConfirmBody": "Potvrď jen v případě, že sis číslice porovnal/a s protistranou jiným důvěryhodným kanálem (osobně, hovorem…) a souhlasí.", "@verifyManualConfirmBody": { "description": "Obsah potvrzovacího dialogu ručního ověření; adjacentní literály ř. 111–112 sloučit; gender tvar porovnal/a" }, "verifyManualConfirmAction": "Souhlasí, ověřit", "@verifyManualConfirmAction": { "description": "Potvrzovací FilledButton dialogu ručního ověření" }, "verifyTitle": "Ověření kontaktu", "@verifyTitle": { "description": "AppBar titulek obrazovky ověření kontaktu (loading fallback stav) | AppBar titulek hlavního stavu obrazovky — stejný klíč jako ř. 140" }, "verifyContactVerifiedBanner": "Kontakt je ověřený", "@verifyContactVerifiedBanner": { "description": "Zelený banner nahoře na obrazovce, když je kontakt už ověřený" }, "verifyIntro": "Porovnej toto číslo s {contactName}. Když souhlasí, vaše šifrování nikdo neodposlouchává. Nejrychlejší je vzájemně si naskenovat QR kódy.", "@verifyIntro": { "description": "Úvodní vysvětlující text obrazovky nad QR kódem; adjacentní literály ř. 177–179 sloučit", "placeholders": { "contactName": { "type": "String" } } }, "verifyScanButton": "Naskenovat kód protistrany", "@verifyScanButton": { "description": "FilledButton — otevře skener QR kódu protistrany" }, "verifyManualButton": "Číslice souhlasí — označit ručně", "@verifyManualButton": { "description": "OutlinedButton — otevře dialog ručního potvrzení shody číslic" }, "verifyUnverifyButton": "Zrušit ověření", "@verifyUnverifyButton": { "description": "TextButton viditelný jen u ověřeného kontaktu — zruší stav ověření" }, "verifyScanScreenTitle": "Naskenuj ověřovací QR", "@verifyScanScreenTitle": { "description": "AppBar titulek minimalistické skener obrazovky (_VerifyScanScreen)" }, "reportTitle": "Nahlásit", "@reportTitle": { "description": "Titulek AppBaru obrazovky nahlášení zneužití" }, "reportSubmitted": "Hlášení odesláno", "@reportSubmitted": { "description": "Nadpis úspěšné obrazovky po odeslání hlášení" }, "reportSubmittedChildSafety": "Hlášení řešíme přednostně. Pokud je dítě v bezprostředním ohrožení, zavolej 158 nebo linku 116 111.", "@reportSubmittedChildSafety": { "description": "Text pod nadpisem úspěchu, jen pro kategorii ohrožení dítěte; obsahuje česká čísla tísňových linek (158, 116 111) — překladatel musí zvážit lokální ekvivalenty" }, "reportSubmittedThanks": "Díky. Podíváme se na to co nejdřív.", "@reportSubmittedThanks": { "description": "Text pod nadpisem úspěchu pro běžné kategorie hlášení" }, "commonDone": "Hotovo", "@commonDone": { "description": "Tlačítko zavírající úspěšnou obrazovku hlášení; obecný text, pravděpodobně sdílený s dalšími obrazovkami" }, "reportPanelE2eNotice": "Zprávy jsou end-to-end šifrované, takže jejich obsah nevidíme ani teď. Popiš prosím vlastními slovy, co se stalo. Nevkládej sem obsah zpráv ani odkazy na něj — nesmíme ho držet a k posouzení ho nepotřebujeme.", "@reportPanelE2eNotice": { "description": "Informační panel nahoře ve formuláři hlášení — vysvětluje, že provozovatel obsah zpráv nevidí; adjacentní literály ř. 133-136" }, "reportPanelCsamWarning": "Materiál zobrazující zneužívání dítěte nám NEPOSÍLEJ. Jeho držení je trestné i pro nás a pro nahlášení ho nepotřebujeme. Materiál patří přímo na STOPonline.cz nebo Policii ČR (158). Nám napiš jen to, co se stalo — zablokujeme účet a předáme věc dál.", "@reportPanelCsamWarning": { "description": "Varovný panel zobrazený jen při kategorii ohrožení dítěte; odkazuje na české instituce (STOPonline.cz, Policie ČR 158) — překladatel musí zvážit lokalizaci hotline; adjacentní literály ř. 143-147" }, "reportPanelIpNotice": "Hlášení nejde přes relay, ale na náš webový server. Ten se při odeslání dozví tvou IP adresu.", "@reportPanelIpNotice": { "description": "Panel upozorňující, že odeslání hlášení odhalí IP adresu (jde mimo relay); adjacentní literály ř. 154-155" }, "reportCategoryHeading": "Čeho se hlášení týká", "@reportCategoryHeading": { "description": "Nadpis sekce s výběrem kategorie hlášení (radio volby)" }, "reportDescriptionHeading": "Co se stalo", "@reportDescriptionHeading": { "description": "Nadpis sekce nad textovým polem popisu incidentu" }, "reportAttachContactId": "Přiložit ID nahlášeného kontaktu", "@reportAttachContactId": { "description": "Titulek přepínače SwitchListTile — varianta bez jména kontaktu (reportedName == null)" }, "reportAttachContactIdNamed": "Přiložit ID kontaktu {contactName}", "@reportAttachContactIdNamed": { "description": "Titulek přepínače SwitchListTile — varianta se jménem nahlášeného kontaktu; společně s reportAttachContactId tvoří pár, v ARB dva samostatné klíče", "placeholders": { "contactName": { "type": "String" } } }, "reportReplyToHeading": "Kontakt na tebe (nepovinné)", "@reportReplyToHeading": { "description": "Nadpis sekce nad nepovinným polem pro kontaktní e-mail oznamovatele" }, "reportReplyToHint": "e-mail, kdybychom se potřebovali doptat", "@reportReplyToHint": { "description": "hintText TextFieldu pro kontaktní e-mail oznamovatele" }, "reportSubmitButton": "Odeslat hlášení", "@reportSubmitButton": { "description": "Hlavní FilledButton odesílající formulář hlášení" }, "contactsTitle": "Kontakty", "@contactsTitle": { "description": "Titulek AppBaru obrazovky kontaktů" }, "contactsAddContact": "Přidat kontakt", "@contactsAddContact": { "description": "Tooltip ikony person_add v AppBaru; STEJNÝ text je i titulek dialogu na ř. 210 — použít jeden klíč | Titulek AlertDialogu pro ruční přidání kontaktu — stejný klíč jako tooltip na ř. 49" }, "contactsSearchHint": "Hledat kontakt...", "@contactsSearchHint": { "description": "hintText vyhledávacího TextFieldu nad seznamem kontaktů" }, "contactsEmpty": "Zatím žádné kontakty", "@contactsEmpty": { "description": "Prázdný stav seznamu, když uživatel nemá žádné kontakty (a nehledá)" }, "contactsNoResults": "Žádné výsledky", "@contactsNoResults": { "description": "Prázdný stav při aktivním vyhledávání bez shody" }, "contactsShareCardTitle": "Sdílej svůj Šepot ID", "@contactsShareCardTitle": { "description": "Titulek karty nad seznamem kontaktů — proklik na sdílení vlastního QR. Pozor: 'Šepot' je název aplikace, v překladech zůstává 'Šepot ID'" }, "contactsShareCardSubtitle": "Ukaž QR kód nebo pošli odkaz", "@contactsShareCardSubtitle": { "description": "Podtitulek karty sdílení vlastního Šepot ID" }, "contactsAddDialogPrompt": "Vlož sdílený řetězec (share string) kontaktu:", "@contactsAddDialogPrompt": { "description": "Instrukční text v těle dialogu Přidat kontakt" }, "contactsShareStringHint": "Vložit share string...", "@contactsShareStringHint": { "description": "hintText TextFieldu v dialogu Přidat kontakt (vkládá se share string)" }, "contactsInvalidShareString": "Neplatný share string", "@contactsInvalidShareString": { "description": "SnackBar, když se vložený text nepodaří parsovat jako PublicIdentity share string" }, "contactsAdded": "Kontakt {name} přidán", "@contactsAdded": { "description": "SnackBar po úspěšném přidání kontaktu. Pozor pro překladatele: 'přidán' je mužský rod od slova kontakt (ne gender osoby) — v en/de/ru/it bez problému", "placeholders": { "name": { "type": "String" } } }, "verifyContactSubtitle": "Porovnání bezpečnostního čísla", "@verifyContactSubtitle": { "description": "Podtitulek položky Ověřit kontakt v bottom sheetu" }, "contactsDeleteContact": "Smazat kontakt", "@contactsDeleteContact": { "description": "Destruktivní položka v bottom sheetu (long-press na kontakt) — smaže kontakt bez potvrzení" }, "pinConfirmTitle": "Potvrď PIN", "@pinConfirmTitle": { "description": "Titulek obrazovky nastavení PINu ve fázi potvrzení (druhé zadání PINu při onboardingu)" }, "pinSetupTitle": "Nastav si PIN", "@pinSetupTitle": { "description": "Titulek obrazovky nastavení PINu při prvním zadání (onboarding)" }, "pinConfirmSubtitle": "Zadej PIN znovu pro potvrzení", "@pinConfirmSubtitle": { "description": "Podtitulek pod titulkem ve fázi potvrzení PINu" }, "pinSetupSubtitle": "6-místný PIN pro odemknutí aplikace", "@pinSetupSubtitle": { "description": "Podtitulek při prvním zadání PINu — vysvětluje účel (odemknutí aplikace, 6 číslic)" }, "pinSetupFailed": "Nastavení PINu selhalo. Zkus to znovu.", "@pinSetupFailed": { "description": "Červená chybová hláška pod PIN tečkami, když enablePin() (Argon2id wrap DEK) vyhodí výjimku" }, "pinMismatchRetry": "PINy se neshodují. Zkus to znovu.", "@pinMismatchRetry": { "description": "Červená chybová hláška pod PIN tečkami, když se potvrzovací PIN liší od prvního zadání (onboarding). Pozor: change_pin_screen má kratší variantu 'PINy se neshodují.' — jiný klíč." }, "pinChangeCurrentTitle": "Zadej současný PIN", "@pinChangeCurrentTitle": { "description": "Titulek kroku 1 změny PINu (ověření starého PINu) — z konstantní mapy _titulky, record (titulek, popis)" }, "pinChangeCurrentSubtitle": "Ověříme ho odemčením klíče", "@pinChangeCurrentSubtitle": { "description": "Podtitulek kroku 1 změny PINu — vysvětluje, že se PIN ověřuje unwrapem DEK, ne hashem" }, "pinChangeNewTitle": "Zadej nový PIN", "@pinChangeNewTitle": { "description": "Titulek kroku 2 změny PINu (zadání nového PINu)" }, "pinChangeNewSubtitle": "6 číslic", "@pinChangeNewSubtitle": { "description": "Podtitulek kroku 2 změny PINu — délka PINu. Pozn.: obsahuje číslovku 6 napevno v textu (není interpolovaná), česky '6 číslic' — ICU plural není nutný, číslo je fixní." }, "pinChangeConfirmTitle": "Potvrď nový PIN", "@pinChangeConfirmTitle": { "description": "Titulek kroku 3 změny PINu (potvrzení nového PINu)" }, "pinChangeConfirmSubtitle": "Zadej ho ještě jednou", "@pinChangeConfirmSubtitle": { "description": "Podtitulek kroku 3 změny PINu" }, "pinWrong": "Špatný PIN.", "@pinWrong": { "description": "Červená chybová hláška, když verifyPin() (krok 1) selže — starý PIN neodemkl klíč. Stejný text i na řádku 119 (WrongPinException při changePin) — jeden klíč. | Duplicitní výskyt — WrongPinException při changePin(); stejný klíč jako řádek 76." }, "pinChangeMustDiffer": "Nový PIN se musí lišit od současného.", "@pinChangeMustDiffer": { "description": "Červená chybová hláška v kroku 2, když nový PIN == starý PIN" }, "pinMismatch": "PINy se neshodují.", "@pinMismatch": { "description": "Červená chybová hláška v kroku 3, když potvrzení != nový PIN. Pozor: pin_setup_screen má delší variantu 'PINy se neshodují. Zkus to znovu.' (pinMismatchRetry) — jiný klíč." }, "pinDecoyConflict": "Tenhle PIN už patří nátlakovému režimu. Zvol jiný.", "@pinDecoyConflict": { "description": "Červená chybová hláška při DecoyPinConflict — nový PIN koliduje s decoy/nátlakovým PINem. Citlivá formulace (bezpečnostní funkce), překlad musí zachovat význam 'duress/decoy mode'." }, "pinChangeFailed": "Změna PINu selhala. Zkus to znovu.", "@pinChangeFailed": { "description": "Červená chybová hláška při obecné výjimce z changePin()" }, "pinChanged": "PIN změněn", "@pinChanged": { "description": "SnackBar po úspěšné změně PINu, těsně před context.pop()" }, "errorCryptoInitTitle": "Šifrovací jádro se nespustilo", "@errorCryptoInitTitle": { "description": "Titulek celoobrazovkové chybové obrazovky (_ChybaApp), když selže init libsignal při startu" }, "errorStartupTitle": "Šepot se nespustil", "@errorStartupTitle": { "description": "Titulek celoobrazovkové chybové obrazovky (_ChybaApp) při neodchycené chybě startu" }, "errorScreenNotRenderedTitle": "Tahle obrazovka se nevykreslila", "@errorScreenNotRenderedTitle": { "description": "Nadpis náhradní ErrorWidget plochy (_ChybovaPlocha) v release buildu, když build() nějakého widgetu spadne" }, "errorStartupBody": "Něco se pokazilo hned při startu. Pošli mi prosím tenhle text (podrž prst a zkopíruj) — pomůže mi to najít chybu.", "@errorStartupBody": { "description": "Vysvětlující text pod titulkem chybové obrazovky _ChybaApp; žádá uživatele o zkopírování detailu chyby. POZOR: v kódu jsou to DVA adjacentní literály (ř. 209–210: '…tenhle text ' + '(podrž prst…') — sloučit do jednoho klíče." }, "errorContactFooter": "sepot.cz · napiš mi na kontakt", "@errorContactFooter": { "description": "Patička chybové obrazovky _ChybaApp s kontaktem; 'sepot.cz' je doména — v překladech ponechat, přeložit jen výzvu" }, "pinUnlockTitle": "Odemkni Šepot", "@pinUnlockTitle": { "description": "localizedReason systémové biometrické výzvy (local_auth) — zobrazuje OS v nativním dialogu otisku/Face. Stejný text jako nadpis obrazovky (ř. 63) → stejný klíč. | Nadpis odemykací obrazovky s PINem" }, "pinEnterPin": "Zadej PIN", "@pinEnterPin": { "description": "Podtitulek odemykací obrazovky pod nadpisem" }, "pinUnlockWithBiometrics": "Odemknout biometrií", "@pinUnlockWithBiometrics": { "description": "Label TextButton pod numpadem — ruční znovuvyvolání biometrické výzvy (viditelné jen se zapnutou biometrií)" }, "pinWrong2": "Špatný PIN", "@pinWrong2": { "description": "Červená chybová hláška na odemykací obrazovce po zadání špatného PINu (WrongPinException)" }, "pinUnlockError": "Chyba odemčení", "@pinUnlockError": { "description": "Červená chybová hláška na odemykací obrazovce při jiné chybě odemčení než špatný PIN" }, "pushTitle": "Push notifikace", "@pushTitle": { "description": "Titulek SimpleDialog výběru režimu pushů. Stejný text jako title ListTile v nastavení (ř. 184) → stejný klíč. | Title ListTile v nastavení — stejný text a klíč jako titulek dialogu (ř. 44)" }, "pushModeOffDesc": "Zprávy se stáhnou až po otevření appky.", "@pushModeOffDesc": { "description": "Popisek volby 'Vypnuto' v dialogu výběru režimu pushů" }, "pushModeUp": "UnifiedPush (doporučeno)", "@pushModeUp": { "description": "Label volby 'up' v dialogu výběru režimu pushů ('UnifiedPush' je název technologie — nepřekládat, přeložit jen '(doporučeno)')" }, "pushModeUpDesc": "Degooglované — potřebuje aplikaci ntfy (F-Droid/Play).", "@pushModeUpDesc": { "description": "Popisek volby UnifiedPush v dialogu výběru režimu pushů ('ntfy', 'F-Droid', 'Play' jsou názvy — nepřekládat)" }, "pushModeFcm": "Google (FCM)", "@pushModeFcm": { "description": "Label volby 'fcm' v dialogu výběru režimu pushů (vlastní název — pravděpodobně shodný ve všech jazycích, ale klíč mít)" }, "pushModeFcmDesc": "Spolehlivé bez další aplikace. Push token zařízení jde Googlu; obsah zpráv nikdy.", "@pushModeFcmDesc": { "description": "Popisek volby Google (FCM) v dialogu výběru režimu pushů. POZOR: v kódu DVA adjacentní literály (ř. 51–52: '…jde ' + 'Googlu; obsah…') — sloučit do jednoho klíče." }, "pushSetupFailed": "Nastavení pushů selhalo: {error}", "@pushSetupFailed": { "description": "SnackBar v nastavení, když přepnutí režimu pushů skončí výjimkou", "placeholders": { "error": { "type": "String" } } }, "pushHintOff": "Zprávy ti přijdou, až Šepot otevřeš — budíčky nejsou nastavené.", "@pushHintOff": { "description": "Proužek nad seznamem chatů, když push není vůbec zapnutý." }, "pushHintFailed": "Budíčky nefungují, zprávy uvidíš až po otevření Šepotu.", "@pushHintFailed": { "description": "Proužek nad seznamem chatů, když distributor registraci odmítl." }, "pushRegistrationFailed": "Budíčky nechodí — distributor registraci odmítl. Zkus push vypnout a znovu zapnout.", "@pushRegistrationFailed": { "description": "Podtitulek dlaždice Push v Nastavení, když distributor odmítl registraci. Bez téhle hlášky uživatel vidí push jako zapnutý, ale zprávy mu chodí až po otevření appky." }, "pushNoDistributorTitle": "Žádný distributor", "@pushNoDistributorTitle": { "description": "Titulek AlertDialog, když v systému není nainstalovaný žádný UnifiedPush distributor" }, "pushNoDistributorBody": "Pro degooglované notifikace nainstaluj UnifiedPush distributor, např. ntfy (F-Droid nebo Play). Pak push zapni znovu.", "@pushNoDistributorBody": { "description": "Obsah AlertDialog 'Žádný distributor'. POZOR: v kódu DVA adjacentní literály (ř. 131–132) — sloučit do jednoho klíče. Názvy ntfy/UnifiedPush/F-Droid/Play nepřekládat." }, "commonOk": "OK", "@commonOk": { "description": "Potvrzovací tlačítko AlertDialog 'Žádný distributor' — obecné, sdílet napříč appkou" }, "pushPickDistributorTitle": "Vyber distributora", "@pushPickDistributorTitle": { "description": "Titulek SimpleDialog výběru UnifiedPush distributora (položky jsou názvy balíčků z systému — nelokalizují se)" }, "pushSubtitleUnifiedPush": "UnifiedPush · {distributor}", "@pushSubtitleUnifiedPush": { "description": "Subtitle ListTile v nastavení, když je aktivní režim UnifiedPush. SKLÁDANÝ TEXT: interpolace s vnořeným fallback literálem — placeholder distributor, fallback řešit buď předvyhodnocením (distributor ?? l10n.pushNoDistributorFallback) nebo ICU select. Nutné sloučení do jednoho klíče + samostatný klíč pro fallback.", "placeholders": { "distributor": { "type": "String" } } }, "pushNoDistributorFallback": "bez distributora", "@pushNoDistributorFallback": { "description": "Vnořený fallback literál uvnitř subtitle 'UnifiedPush · …', když není vybraný žádný distributor — vyhodnotit před dosazením do pushSubtitleUnifiedPush" }, "pushSubtitleFcm": "Google (FCM) — rychlé, opt-in", "@pushSubtitleFcm": { "description": "Subtitle ListTile v nastavení, když je aktivní režim FCM" }, "restoreErrorNameRequired": "Zadej zobrazované jméno.", "@restoreErrorNameRequired": { "description": "Validační chyba pod formulářem obnovy účtu, když je jméno prázdné" }, "restoreErrorWordCount": "{wordCount, plural, one{Fráze má 1 slovo, potřebuji {requiredWords}.} few{Fráze má {wordCount} slova, potřebuji {requiredWords}.} many{Fráze má {wordCount} slova, potřebuji {requiredWords}.} other{Fráze má {wordCount} slov, potřebuji {requiredWords}.}}", "@restoreErrorWordCount": { "description": "Chyba při obnově účtu: špatný počet slov v zadané frázi.", "placeholders": { "wordCount": { "type": "int" }, "requiredWords": { "type": "int" } } }, "restoreErrorInvalidPhrase": "Fráze není platná — zkontroluj slova i jejich pořadí.", "@restoreErrorInvalidPhrase": { "description": "Validační chyba obnovy účtu — mnemonic checksum nesedí" }, "restoreErrorFailed": "Obnova selhala: {error}", "@restoreErrorFailed": { "description": "Chyba zobrazená pod formulářem, když recoverIdentity vyhodí výjimku", "placeholders": { "error": { "type": "String" } } }, "restoreTitle": "Obnovit účet", "@restoreTitle": { "description": "Titulek AppBaru obrazovky obnovy účtu (stejný text jako tlačítko na ř. 193 — sdílet jeden klíč) | Text hlavního tlačítka obnovy (identický s AppBar titulkem na ř. 87 — jeden klíč)" }, "restoreHeading": "Zadej svoji zálohovací frázi", "@restoreHeading": { "description": "Hlavní nadpis obrazovky obnovy účtu" }, "restoreIntro": "{wordCount} slov, ze zálohy vytvořené při zakládání účtu. Obnoví tvoji identitu (stejný SEP kód, kontakty tě dál poznají).", "@restoreIntro": { "description": "Podnadpis pod nadpisem obrazovky obnovy. Adjacentní literály přes 3 řádky (104-106). Pozor na mužský rod 'sis uložil' — přeformulovat neutrálně.", "placeholders": { "wordCount": { "type": "int" } } }, "restoreHistoryWarning": "Historie zpráv se neobnoví — je uložená jen na původním zařízení.", "@restoreHistoryWarning": { "description": "Žlutý varovný box na obrazovce obnovy účtu. Adjacentní literály přes 2 řádky (130-131)." }, "restorePhraseHint": "slovo1 slovo2 slovo3 …", "@restorePhraseHint": { "description": "hintText pole zálohovací fráze — ukázkový formát zadání" }, "restoreWordCountHelper": "{wordCount} / {requiredWords} slov", "@restoreWordCountHelper": { "description": "helperText pod polem fráze — průběžné počítadlo zadaných slov (mění barvu při dosažení 24)", "placeholders": { "wordCount": { "type": "int" }, "requiredWords": { "type": "int" } } }, "chatListArchivedCount": "Archivované ({count})", "@chatListArchivedCount": { "description": "První řádek seznamu konverzací — odkaz na archiv s počtem archivovaných konverzací", "placeholders": { "count": { "type": "int" } } }, "chatListEmptyTitle": "Zatím žádné konverzace", "@chatListEmptyTitle": { "description": "Nadpis empty state, když uživatel nemá žádné konverzace" }, "chatListEmptySubtitle": "Přidej kontakt a začni šeptat!", "@chatListEmptySubtitle": { "description": "Podnadpis empty state — 'šeptat' je slovní hříčka s názvem appky, v překladu volit ekvivalent (whisper/flüstern…)" }, "chatListUnmute": "Zrušit ztlumení", "@chatListUnmute": { "description": "Položka bottom sheetu akcí konverzace (long-press), zobrazí se když je konverzace ztlumená. Ternár na jednom řádku se 'Ztlumit'." }, "chatListMute": "Ztlumit", "@chatListMute": { "description": "Položka bottom sheetu akcí konverzace (long-press), zobrazí se když konverzace ztlumená není" }, "chatListArchive": "Archivovat", "@chatListArchive": { "description": "Položka bottom sheetu akcí konverzace (long-press) — přesune konverzaci do archivu; kandidát na sdílení s archive feature (archiveAction)" }, "qrShareTitle": "Můj Šepot ID", "@qrShareTitle": { "description": "AppBar titulek obrazovky sdílení vlastního QR/Šepot ID" }, "qrShareConnectingTitle": "Připojuji k relayi…", "@qrShareConnectingTitle": { "description": "Titulek na QR obrazovce, když vlastní registrace na relay ještě nedoběhla — routing (aid+da) není hotový, QR by byl neúplný." }, "qrShareConnectingBody": "Až se Šepot poprvé připojí, objeví se tvůj QR kód a odkaz. Chvilku strpení — stačí pár sekund.", "@qrShareConnectingBody": { "description": "Vysvětlení pod titulkem qrShareConnectingTitle. 'Šepot' je značka, nepřekládat." }, "qrIdentityNotFound": "Identita nebyla nalezena", "@qrIdentityNotFound": { "description": "Text uprostřed obrazovky, když identityProvider vrátí null (nemělo by běžně nastat)" }, "commonCopiedToClipboard": "Zkopírováno do schránky", "@commonCopiedToClipboard": { "description": "SnackBar po stisku tlačítka Kopírovat (zkopírování share stringu) — pravděpodobně sdílené i jinde v appce" }, "qrShareInviteMessage": "Přidej mě na Šepotu!\n\n{shareString}", "@qrShareInviteMessage": { "description": "Text sdílený přes share_plus (Share.share) — pozvánka s identitním řetězcem; obsahuje dva \\n", "placeholders": { "shareString": { "type": "String" } } }, "commonShare": "Sdílet", "@commonShare": { "description": "Popisek ElevatedButton.icon, který otevře systémový share sheet" }, "qrShareInfo": "Kontakt naskenuje tvůj QR kód nebo vloží sdílený řetězec do aplikace.", "@qrShareInfo": { "description": "Informační box (ikona info) pod tlačítky — vysvětluje, jak protistrana kontakt přidá" }, "reportCategoryChildSafety": "Ohrožení dítěte", "@reportCategoryChildSafety": { "description": "Label kategorie nahlášení — zobrazuje report screen ve výběru kategorií (ReportCategory.label)" }, "reportCategoryChildSafetyHint": "Popiš situaci vlastními slovy. Nevkládej obsah zpráv ani odkazy na materiál.", "@reportCategoryChildSafetyHint": { "description": "Hint kategorie Ohrožení dítěte — zobrazuje report screen; právně citlivý text (CSAM — odrazuje od vkládání obsahu, viz komentář § 192), překlad musí zachovat význam" }, "reportCategoryHarassment": "Obtěžování nebo výhrůžky", "@reportCategoryHarassment": { "description": "Label kategorie nahlášení — zobrazuje report screen" }, "reportCategoryHarassmentHint": "Někdo tě zastrašuje, vyhrožuje nebo obtěžuje.", "@reportCategoryHarassmentHint": { "description": "Hint kategorie Obtěžování — zobrazuje report screen" }, "reportCategorySpam": "Spam", "@reportCategorySpam": { "description": "Label kategorie nahlášení — zobrazuje report screen" }, "reportCategorySpamHint": "Nevyžádané zprávy, hromadné rozesílání.", "@reportCategorySpamHint": { "description": "Hint kategorie Spam — zobrazuje report screen" }, "reportCategoryFraud": "Podvod", "@reportCategoryFraud": { "description": "Label kategorie nahlášení — zobrazuje report screen" }, "reportCategoryFraudHint": "Pokus vylákat peníze, klíče nebo osobní údaje.", "@reportCategoryFraudHint": { "description": "Hint kategorie Podvod — zobrazuje report screen" }, "reportCategoryOther": "Jiné", "@reportCategoryOther": { "description": "Label kategorie nahlášení — zobrazuje report screen" }, "reportCategoryOtherHint": "Něco jiného, co bychom měli vědět.", "@reportCategoryOtherHint": { "description": "Hint kategorie Jiné — zobrazuje report screen" }, "reportErrorEmptyDescription": "Napiš prosím, co se stalo.", "@reportErrorEmptyDescription": { "description": "ReportFailure při prázdném popisu — UI (report screen) zobrazuje message jako chybu/SnackBar" }, "reportErrorConnection": "Nepodařilo se spojit se serverem. Zkus to znovu, nebo napiš na {supportEmail}.", "@reportErrorConnection": { "description": "ReportFailure při síťové chybě/timeoutu odesílání hlášení — zobrazuje report screen", "placeholders": { "supportEmail": { "type": "String" } } }, "reportErrorRateLimited": "Z tvé sítě přišlo příliš mnoho hlášení. Zkus to za hodinu, nebo napiš na {supportEmail}.", "@reportErrorRateLimited": { "description": "ReportFailure při HTTP 429 (rate limit) — zobrazuje report screen", "placeholders": { "supportEmail": { "type": "String" } } }, "reportErrorServer": "Odeslání selhalo (kód {statusCode}). Napiš prosím na {supportEmail}.", "@reportErrorServer": { "description": "ReportFailure při jiném HTTP kódu — zobrazuje report screen", "placeholders": { "statusCode": { "type": "int" }, "supportEmail": { "type": "String" } } }, "settingsAutoLockNever": "Nikdy", "@settingsAutoLockNever": { "description": "Volba automatického zámku (0 s) v nastavení — popisek v nabídce AutoLockNotifier.moznosti, zobrazuje settings UI" }, "settingsAutoLock1min": "Po 1 minutě", "@settingsAutoLock1min": { "description": "Volba automatického zámku (60 s) v nastavení; v EN/DE/RU/IT zvážit jednotný vzor 'After X minutes' — česky je tvar minutě/minutách nepravidelný, proto samostatné klíče místo ICU pluralu s pevnými hodnotami" }, "settingsAutoLock15min": "Po 15 minutách", "@settingsAutoLock15min": { "description": "Volba automatického zámku (900 s) v nastavení" }, "torToggleFailed": "Přepnutí Toru selhalo: {error}", "@torToggleFailed": { "description": "SnackBar když selže zapnutí/vypnutí Toru (výjimka z torProvider.set); $e je výjimka", "placeholders": { "error": { "type": "String" } } }, "torConnectionTitle": "Připojení přes Tor", "@torConnectionTitle": { "description": "Titulek potvrzovacího AlertDialogu před zapnutím Toru; STEJNÝ text i jako title ListTile na ř. 101 — sdílet jeden klíč" }, "torDialogBody": "Provoz na server půjde přes síť Tor (skryje tvou IP adresu). Vyžaduje nainstalovanou a spuštěnou aplikaci Orbot s aktivním SOCKS proxy na portu 9050.\n\nBez běžícího Orbotu se zprávy neodešlou ani nepřijmou. Spojení bývá pomalejší.", "@torDialogBody": { "description": "Obsah potvrzovacího dialogu před zapnutím Toru — vysvětluje závislost na Orbotu. POZOR: ve zdrojáku 4 adjacentní literály (ř. 47–51) slepené kompilátorem, mezi 'portu 9050.' a 'Bez běžícího' je \\n\\n; přeložit jako jeden celek. 'Orbot', 'Tor', 'SOCKS' a port 9050 jsou vlastní jména/konstanty — nepřekládat" }, "commonTurnOn": "Zapnout", "@commonTurnOn": { "description": "Potvrzovací tlačítko dialogu (zapne Tor) — obecné 'Zapnout', kandidát na sdílený klíč pro jiné přepínače" }, "torSubtitleOff": "Přímé šifrované spojení (WSS). Zapni pro skrytí IP přes Tor.", "@torSubtitleOff": { "description": "Subtitle dlaždice v nastavení když je Tor VYPNUTÝ" }, "torStatusConnected": "Připojeno přes Tor (.onion).", "@torStatusConnected": { "description": "Subtitle dlaždice když je Tor zapnutý a relay spojení navázané (RelayConnectionState.connected)" }, "torStatusConnecting": "Připojuji přes Tor… (běží Orbot?)", "@torStatusConnecting": { "description": "Subtitle dlaždice když je Tor zapnutý a spojení se navazuje — nápověda, že možná neběží Orbot; obsahuje výpustku …" }, "torStatusWaiting": "Přes Tor — čekám na Orbot (SOCKS 9050).", "@torStatusWaiting": { "description": "Subtitle dlaždice když je Tor zapnutý a spojení není navázané ani se nenavazuje (default větev switch) — čeká se na Orbot" }, "biometricsPinRequiredFirst": "Nejdřív nastav PIN — biometrie ho jen doplňuje.", "@biometricsPinRequiredFirst": { "description": "SnackBar v nastavení při pokusu zapnout biometrii bez nastaveného PINu" }, "biometricsStorageLocked": "Úložiště je zamčené — odemkni appku PINem.", "@biometricsStorageLocked": { "description": "SnackBar v nastavení při pokusu zapnout biometrii se zamčeným úložištěm; NENÍ to devInternal StateError, je to věta pro uživatele" }, "biometricsNotAvailable": "Zařízení nemá nastavenou biometrii.", "@biometricsNotAvailable": { "description": "SnackBar když LocalAuthentication.isDeviceSupported() vrátí false" }, "biometricsEnrollPromptReason": "Potvrď zapnutí biometrického odemčení", "@biometricsEnrollPromptReason": { "description": "localizedReason systémové biometrické výzvy (local_auth) při zapínání biometrie — zobrazí OS v nativním dialogu" }, "biometricsSetupFailed": "Biometrii se nepodařilo nastavit: {error}", "@biometricsSetupFailed": { "description": "SnackBar v catch bloku při selhání zapnutí/vypnutí biometrie; $e je zachycená výjimka", "placeholders": { "error": { "type": "String" } } }, "biometricsTileTitle": "Biometrie", "@biometricsTileTitle": { "description": "Titulek ListTile přepínače biometrie v nastavení" }, "biometricsTileSubtitle": "Odemknutí otiskem prstu / obličejem (PIN zůstává záloha)", "@biometricsTileSubtitle": { "description": "Podtitulek ListTile přepínače biometrie v nastavení" }, "backupErrorCorruptedFile": "Poškozený soubor zálohy", "@backupErrorCorruptedFile": { "description": "FormatException z BackupService.import() při příliš krátkém souboru — zobrazí obrazovka obnovy zálohy (SnackBar/dialog)" }, "backupErrorUnknownFormat": "Nerozpoznaný formát zálohy", "@backupErrorUnknownFormat": { "description": "FormatException z BackupService.import() při chybějícím magic headeru SEPOTBK1 — zobrazí obrazovka obnovy zálohy" }, "backupErrorWrongIdentity": "Zálohu nelze dešifrovat — patří k jiné identitě?", "@backupErrorWrongIdentity": { "description": "FormatException z BackupService.import() při selhání GCM autentizace (klíč odvozený z jiné identity) — zobrazí obrazovka obnovy zálohy" }, "attachmentSharedImageFilename": "sepot-obrazek.{ext}", "@attachmentSharedImageFilename": { "description": "Název souboru předaný do XFile.fromData při sdílení obrázku přes systémový share sheet — uživatel jej vidí v cíli sdílení; držet bez diakritiky a mezer (je to filename)", "placeholders": { "ext": { "type": "String" } } }, "attachmentDecryptFailed": "Přílohu se nepodařilo dešifrovat", "@attachmentDecryptFailed": { "description": "Chybový text uprostřed fullscreen prohlížeče obrázku, když se přílohu nepodaří načíst/dešifrovat" }, "pushActionOpen": "Otevřít", "@pushActionOpen": { "description": "Výchozí název akce lokální notifikace na Linuxu (LinuxInitializationSettings.defaultActionName)" }, "pushChannelMessagesName": "Zprávy", "@pushChannelMessagesName": { "description": "Název Android notifikačního kanálu — uživatel ho vidí v systémovém nastavení notifikací. Duplicitně na řádcích 50 a 73 (showMessageNotification i showWakeNotification) — sloučit do jednoho klíče. Pozor: channel name se překládá podle jazyka při PRVNÍM vytvoření kanálu. | Druhý výskyt názvu kanálu (showWakeNotification) — stejný klíč jako řádek 50." }, "pushChannelMessagesDescription": "Upozornění na nové zprávy (bez obsahu)", "@pushChannelMessagesDescription": { "description": "Popis Android notifikačního kanálu v systémovém nastavení. Duplicitně na řádcích 51 a 74 — sloučit do jednoho klíče. | Druhý výskyt popisu kanálu (showWakeNotification) — stejný klíč jako řádek 51." }, "pushNewMessageFrom": "Nová zpráva od {senderName}", "@pushNewMessageFrom": { "description": "Tělo notifikace o přijaté zprávě, když appka běží na pozadí — zobrazuje jen jméno odesílatele, nikdy obsah zprávy.", "placeholders": { "senderName": { "type": "String" } } }, "pushNewMessages": "Máš nové zprávy", "@pushNewMessages": { "description": "Tělo generické wake notifikace po push budíčku v killed-state — DB je zamčená, obsah nelze dešifrovat, proto záměrně bez detailů. Neformální tykání ('Máš') — držet tón i v překladech." }, "archiveTitle": "Archivované", "@archiveTitle": { "description": "Titulek AppBaru obrazovky archivovaných konverzací." }, "archiveEmpty": "Žádné archivované konverzace", "@archiveEmpty": { "description": "Empty state uprostřed obrazovky, když nejsou žádné archivované konverzace." }, "archiveUnarchive": "Zrušit archivaci", "@archiveUnarchive": { "description": "Položka v modal bottom sheetu po long-pressu na archivovanou konverzaci — odarchivuje ji." }, "restoreErrorMnemonicWordCount": "Fráze má {count} slov, očekávám {expected}", "@restoreErrorMnemonicWordCount": { "description": "FormatException z SepotMnemonic.decode() při špatném počtu slov — zobrazuje obnovovací obrazovka (restore flow) jako chybovou hlášku při zadání mnemonic fráze.", "placeholders": { "count": { "type": "int" }, "expected": { "type": "int" } } }, "restoreErrorInvalidMnemonic": "Neplatná fráze: {message}", "@restoreErrorInvalidMnemonic": { "description": "FormatException z SepotMnemonic.decode() při neznámém slovu / špatném checksumu (ArgumentError větev z bip39) — zobrazuje restore UI. POZOR: ${e.message} je interní anglická hláška knihovny bip39 — zvážit, zda ji vůbec zobrazovat, nebo nahradit generickou lokalizovanou hláškou. | Identický text jako řádek 53, jen StateError větev (bip39 hlásí chyby dvěma typy výjimek). Stejný ARB klíč restoreErrorInvalidMnemonic — sloučit.", "placeholders": { "message": { "type": "String" } } }, "contactsErrorAlreadyExists": "Kontakt již existuje", "@contactsErrorAlreadyExists": { "description": "Exception z ContactsNotifier.addContact() při pokusu přidat duplicitní kontakt (stejná identita) — zachytává a zobrazuje UI přidávání kontaktu (typicky SnackBar po skenu QR / zadání Šepot ID)." }, "commonAppTagline": "Soukromý messenger", "@commonAppTagline": { "description": "Tagline pod názvem aplikace v logu (splash/onboarding obrazovky, showText=true)." }, "commonE2eBadgeCompact": "E2E", "@commonE2eBadgeCompact": { "description": "Kompaktní varianta badge šifrování (ikona zámku + 'E2E'). Zkratka end-to-end — ve většině jazyků zůstane 'E2E'." }, "commonE2eBadgeFull": "End-to-end šifrováno", "@commonE2eBadgeFull": { "description": "Plná varianta badge šifrování (ikona zámku + text), zobrazuje se např. v hlavičce chatu / onboardingu." }, "photoPreviewCaptionHint": "Přidat popisek…", "@photoPreviewCaptionHint": { "description": "hintText pole popisku na obrazovce náhledu fotky před odesláním" }, "photoPreviewDraw": "Kreslit", "@photoPreviewDraw": { "description": "Tooltip nástroje kreslení prstem na náhledu fotky" }, "photoPreviewAddText": "Přidat text", "@photoPreviewAddText": { "description": "Tooltip nástroje přidání textu na fotku" }, "photoPreviewRotate": "Otočit", "@photoPreviewRotate": { "description": "Tooltip otočení fotky o 90°" }, "photoPreviewUndo": "Zpět", "@photoPreviewUndo": { "description": "Tooltip vrácení posledního tahu kreslení" }, "photoPreviewSend": "Poslat", "@photoPreviewSend": { "description": "Tooltip tlačítka odeslání fotky z náhledu" }, "photoPreviewTextDialogTitle": "Text na fotce", "@photoPreviewTextDialogTitle": { "description": "Titulek dialogu pro zadání/úpravu textu na fotce" }, "photoPreviewRemoveText": "Odebrat", "@photoPreviewRemoveText": { "description": "Tlačítko odebrání textu z fotky v dialogu úpravy" }, "photoPreviewDecodeFailed": "Fotku se nepodařilo načíst", "@photoPreviewDecodeFailed": { "description": "SnackBar, když se vybraná fotka nedá dekódovat — náhled se zavře bez odeslání" } }