90a1390716
Fixes reported by testers and found in an app review: - First message right after install no longer fails. Before the app finished registering with the relay, the outgoing message could crash on a null delivery address. The profile field is now optional and the send path throws a clear "still connecting, try again shortly" error while registration completes in the background. - The QR code and share link now appear only once the delivery address is ready. Previously a link generated before the first connection lacked routing, so the other side could not send the first message. The screen now shows a connecting state and reactively swaps in the QR when ready. - Incomplete contact links are rejected on import instead of failing at first send, with a clear prompt to ask for a fresh link. - Auto-lock no longer silences the app: after locking and unlocking, messaging is restarted (it previously stayed dead until app restart). - Group messages are marked failed on a non-per-member send error instead of hanging in the "sending" state forever. - Hardened the relay client against a rare duplicate connection when toggling Tor or locking mid-connect, and fromShareString now rejects a delivery address of the wrong length. - Pin unifiedpush below 6.2.0 to drop the webcrypto dependency (its native framework lacks LC_ENCRYPTION_INFO and blocked the iOS upload). - Skip Android release lint (network dependency check hangs on the build host and adds no value for a Flutter app).
2319 lines
93 KiB
Dart
2319 lines
93 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter/widgets.dart';
|
||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||
import 'package:intl/intl.dart' as intl;
|
||
|
||
import 'app_localizations_cs.dart';
|
||
import 'app_localizations_de.dart';
|
||
import 'app_localizations_en.dart';
|
||
import 'app_localizations_it.dart';
|
||
import 'app_localizations_ru.dart';
|
||
|
||
// ignore_for_file: type=lint
|
||
|
||
/// Callers can lookup localized strings with an instance of AppLocalizations
|
||
/// returned by `AppLocalizations.of(context)`.
|
||
///
|
||
/// Applications need to include `AppLocalizations.delegate()` in their app's
|
||
/// `localizationDelegates` list, and the locales they support in the app's
|
||
/// `supportedLocales` list. For example:
|
||
///
|
||
/// ```dart
|
||
/// import 'generated/app_localizations.dart';
|
||
///
|
||
/// return MaterialApp(
|
||
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||
/// supportedLocales: AppLocalizations.supportedLocales,
|
||
/// home: MyApplicationHome(),
|
||
/// );
|
||
/// ```
|
||
///
|
||
/// ## Update pubspec.yaml
|
||
///
|
||
/// Please make sure to update your pubspec.yaml to include the following
|
||
/// packages:
|
||
///
|
||
/// ```yaml
|
||
/// dependencies:
|
||
/// # Internationalization support.
|
||
/// flutter_localizations:
|
||
/// sdk: flutter
|
||
/// intl: any # Use the pinned version from flutter_localizations
|
||
///
|
||
/// # Rest of dependencies
|
||
/// ```
|
||
///
|
||
/// ## iOS Applications
|
||
///
|
||
/// iOS applications define key application metadata, including supported
|
||
/// locales, in an Info.plist file that is built into the application bundle.
|
||
/// To configure the locales supported by your app, you’ll need to edit this
|
||
/// file.
|
||
///
|
||
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
|
||
/// Then, in the Project Navigator, open the Info.plist file under the Runner
|
||
/// project’s Runner folder.
|
||
///
|
||
/// Next, select the Information Property List item, select Add Item from the
|
||
/// Editor menu, then select Localizations from the pop-up menu.
|
||
///
|
||
/// Select and expand the newly-created Localizations item then, for each
|
||
/// locale your application supports, add a new item and select the locale
|
||
/// you wish to add from the pop-up menu in the Value field. This list should
|
||
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
|
||
/// property.
|
||
abstract class AppLocalizations {
|
||
AppLocalizations(String locale)
|
||
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
||
|
||
final String localeName;
|
||
|
||
static AppLocalizations of(BuildContext context) {
|
||
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
|
||
}
|
||
|
||
static const LocalizationsDelegate<AppLocalizations> delegate =
|
||
_AppLocalizationsDelegate();
|
||
|
||
/// A list of this localizations delegate along with the default localizations
|
||
/// delegates.
|
||
///
|
||
/// Returns a list of localizations delegates containing this delegate along with
|
||
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
|
||
/// and GlobalWidgetsLocalizations.delegate.
|
||
///
|
||
/// Additional delegates can be added by appending to this list in
|
||
/// MaterialApp. This list does not have to be used at all if a custom list
|
||
/// of delegates is preferred or required.
|
||
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
|
||
<LocalizationsDelegate<dynamic>>[
|
||
delegate,
|
||
GlobalMaterialLocalizations.delegate,
|
||
GlobalCupertinoLocalizations.delegate,
|
||
GlobalWidgetsLocalizations.delegate,
|
||
];
|
||
|
||
/// A list of this localizations delegate's supported locales.
|
||
static const List<Locale> supportedLocales = <Locale>[
|
||
Locale('cs'),
|
||
Locale('de'),
|
||
Locale('en'),
|
||
Locale('it'),
|
||
Locale('ru'),
|
||
];
|
||
|
||
/// Název aplikace — značka, nepřekládá se.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot'**
|
||
String get appTitle;
|
||
|
||
/// Nastavení: titulek dlaždice a dialogu pro volbu jazyka rozhraní.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Jazyk aplikace'**
|
||
String get settingsLanguage;
|
||
|
||
/// Volba jazyka: řídit se jazykem zařízení.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Podle systému'**
|
||
String get languageSystem;
|
||
|
||
/// 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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Neznámý'**
|
||
String get commonUnknownContact;
|
||
|
||
/// 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í
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ověřeno'**
|
||
String get verifyVerified;
|
||
|
||
/// Stav ověření kontaktu pod jménem v AppBar chatu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Neověřeno'**
|
||
String get verifyUnverified;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ověřit kontakt'**
|
||
String get chatMenuVerifyContact;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Mizící zprávy'**
|
||
String get chatDisappearingMessages;
|
||
|
||
/// Položka popup menu chatu, když je kontakt blokovaný
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odblokovat kontakt'**
|
||
String get chatMenuUnblockContact;
|
||
|
||
/// Položka popup menu chatu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Blokovat kontakt'**
|
||
String get chatMenuBlockContact;
|
||
|
||
/// 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íč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nahlásit a zablokovat'**
|
||
String get reportAndBlock;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Chyba: {error}'**
|
||
String errorGeneric(String error);
|
||
|
||
/// Podtitulek AppBar skupinového chatu po opuštění skupiny; POZOR gender (opustil/opustila)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Už nejsi ve skupině'**
|
||
String get groupsYouLeftGroup;
|
||
|
||
/// Podtitulek AppBar skupinového chatu — počet členů, klepnutí otevře seznam.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{count, plural, one{1 člen} few{{count} členové} many{{count} člena} other{{count} členů}}'**
|
||
String groupsMemberCount(int count);
|
||
|
||
/// Položka popup menu skupinového chatu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Členové'**
|
||
String get groupsMembers;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přejmenovat skupinu'**
|
||
String get groupsRename;
|
||
|
||
/// Položka popup menu skupiny (červená)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Opustit skupinu'**
|
||
String get groupsLeave;
|
||
|
||
/// Banner místo input baru ve skupině, kterou uživatel opustil; POZOR gender
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Už nejsi ve skupině. Historie zůstává, nové zprávy nedorazí.'**
|
||
String get groupsLeftBanner;
|
||
|
||
/// Nadpis bottom sheetu se seznamem členů skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Členové ({count})'**
|
||
String groupsMembersWithCount(int count);
|
||
|
||
/// Fallback jména vlastního avataru v seznamu členů skupiny | Titulek ListTile vlastní osoby v seznamu členů skupiny — stejný klíč jako ř. 486
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ty'**
|
||
String get groupsYou;
|
||
|
||
/// Subtitle člena, který skupinu založil, v seznamu členů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zakladatel'**
|
||
String get groupsFounder;
|
||
|
||
/// hintText TextFieldu v dialogu přejmenování skupiny | labelText textového pole pro jméno skupiny (max 64 znaků)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Název skupiny'**
|
||
String get groupsNameHint;
|
||
|
||
/// 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íč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zrušit'**
|
||
String get commonCancel;
|
||
|
||
/// Potvrzovací tlačítko dialogu přejmenování skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Uložit'**
|
||
String get commonSave;
|
||
|
||
/// SnackBar při selhání přejmenování skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přejmenování selhalo: {error}'**
|
||
String groupsRenameFailed(String error);
|
||
|
||
/// Titulek potvrzovacího AlertDialogu opuštění skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Opustit skupinu?'**
|
||
String get groupsLeaveConfirmTitle;
|
||
|
||
/// 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')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get groupsLeaveConfirmBody;
|
||
|
||
/// Destruktivní potvrzovací tlačítko dialogu opuštění skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Opustit'**
|
||
String get groupsLeaveAction;
|
||
|
||
/// SnackBar při selhání opuštění skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odchod selhal: {error}'**
|
||
String groupsLeaveFailed(String error);
|
||
|
||
/// Banner místo input baru u blokovaného kontaktu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt je zablokovaný. Nedostáváš od něj zprávy a nemůžeš mu psát.'**
|
||
String get chatBlockedBanner;
|
||
|
||
/// Tlačítko v banneru blokovaného kontaktu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odblokovat'**
|
||
String get chatUnblock;
|
||
|
||
/// SnackBar po zablokování kontaktu; POZOR gender ('byl') — přeformulovat neutrálně nebo ICU select
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt {name} je zablokovaný'**
|
||
String chatContactBlocked(String name);
|
||
|
||
/// SnackBar po odblokování kontaktu; POZOR gender
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt {name} je odblokovaný'**
|
||
String chatContactUnblocked(String name);
|
||
|
||
/// 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')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String reportAndBlockBody(String name);
|
||
|
||
/// Prázdný stav chatu (žádné zprávy), první řádek pod E2E badge
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zprávy jsou end-to-end šifrované.'**
|
||
String get chatEmptyEncrypted;
|
||
|
||
/// Prázdný stav chatu, druhý řádek — navazuje na chatEmptyEncrypted
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nikdo jiný je nemůže číst.'**
|
||
String get chatEmptyNoOneElse;
|
||
|
||
/// Datumový oddělovač mezi zprávami pro dnešní den — pravděpodobně sdílený i s chat listem
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Dnes'**
|
||
String get commonToday;
|
||
|
||
/// Datumový oddělovač mezi zprávami pro včerejší den
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Včera'**
|
||
String get commonYesterday;
|
||
|
||
/// hintText vstupního pole pro psaní zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Napiš zprávu…'**
|
||
String get chatMessageHint;
|
||
|
||
/// Tooltip tlačítka koše v liště nahrávání hlasové zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zahodit'**
|
||
String get chatDiscardRecording;
|
||
|
||
/// Text v liště během nahrávání hlasové zprávy; gender OK (1. os.), ale ověřit pro ru/it
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nahrávám…'**
|
||
String get chatRecording;
|
||
|
||
/// SnackBar když aplikace nemá oprávnění k mikrofonu při startu nahrávání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Chybí oprávnění k mikrofonu'**
|
||
String get chatMicPermissionMissing;
|
||
|
||
/// SnackBar při selhání startu nahrávání hlasové zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nahrávání selhalo: {error}'**
|
||
String chatRecordingFailed(String error);
|
||
|
||
/// SnackBar při selhání odeslání hlasové zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odeslání hlasové zprávy selhalo: {error}'**
|
||
String chatVoiceSendFailed(String error);
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazaná zpráva'**
|
||
String get chatDeletedMessagePreview;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'🎤 Hlasová zpráva'**
|
||
String get chatVoiceMessagePreview;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'📷 Fotka'**
|
||
String get chatPhotoPreview;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'📎 Příloha'**
|
||
String get chatAttachmentPreview;
|
||
|
||
/// Titulek compose banneru v režimu úpravy zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Úprava zprávy'**
|
||
String get chatEditingMessage;
|
||
|
||
/// Titulek compose banneru v režimu odpovědi
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odpověď'**
|
||
String get chatReply;
|
||
|
||
/// Položka akčního bottom sheetu zprávy (long-press)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odpovědět'**
|
||
String get chatActionReply;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kopírovat'**
|
||
String get commonCopy;
|
||
|
||
/// Položka akčního bottom sheetu vlastní textové zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Upravit'**
|
||
String get commonEdit;
|
||
|
||
/// Položka akčního bottom sheetu — lokální smazání zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat u mě'**
|
||
String get chatDeleteForMe;
|
||
|
||
/// Položka akčního bottom sheetu vlastní zprávy (červená) — smazání u obou stran
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat pro všechny'**
|
||
String get chatDeleteForEveryone;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vypnuto'**
|
||
String get commonOff;
|
||
|
||
/// Volba TTL v dialogu mizících zpráv; české skloňování zapečené ve fixním labelu — samostatný klíč, ne ICU
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'30 sekund'**
|
||
String get chatDisappearing30s;
|
||
|
||
/// Volba TTL v dialogu mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'5 minut'**
|
||
String get chatDisappearing5m;
|
||
|
||
/// Volba TTL v dialogu mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'1 hodina'**
|
||
String get chatDisappearing1h;
|
||
|
||
/// Volba TTL v dialogu mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'1 den'**
|
||
String get chatDisappearing1d;
|
||
|
||
/// Volba TTL v dialogu mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'1 týden'**
|
||
String get chatDisappearing1w;
|
||
|
||
/// Vysvětlující text v dialogu mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nové zprávy se po uplynutí doby smažou u tebe i u protistrany.'**
|
||
String get chatDisappearingDescription;
|
||
|
||
/// SnackBar po vypnutí mizících zpráv
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Mizící zprávy vypnuty'**
|
||
String get chatDisappearingDisabled;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nové zprávy zmizí po: {duration}'**
|
||
String chatDisappearingEnabled(String duration);
|
||
|
||
/// Položka bottom sheetu výběru přílohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Fotka z galerie'**
|
||
String get attachmentGallery;
|
||
|
||
/// Položka bottom sheetu výběru přílohy — kamera
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vyfotit'**
|
||
String get attachmentTakePhoto;
|
||
|
||
/// Položka bottom sheetu výběru přílohy — file picker
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Dokument'**
|
||
String get attachmentDocument;
|
||
|
||
/// SnackBar (_showError) když vybraný dokument překročí limit velikosti. POZOR: adjacentní literály (1227-1228) — sloučit
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Soubor je příliš velký (max {maxMb} MB)'**
|
||
String attachmentTooLarge(int maxMb);
|
||
|
||
/// SnackBar (_showError) při selhání výběru přílohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Výběr přílohy selhal: {error}'**
|
||
String attachmentPickFailed(String error);
|
||
|
||
/// SnackBar (_showError) při selhání odeslání přílohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odeslání přílohy selhalo: {error}'**
|
||
String attachmentSendFailed(String error);
|
||
|
||
/// SnackBar při selhání odeslání/úpravy textové zprávy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odeslání selhalo: {error}'**
|
||
String chatSendFailed(String error);
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zpráva smazána'**
|
||
String get chatMessageDeleted;
|
||
|
||
/// Malý štítek v patičce bubliny upravené zprávy, vedle času
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'upraveno'**
|
||
String get chatEdited;
|
||
|
||
/// 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).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Trust root relaye se změnil! Odmítám komunikovat.'**
|
||
String get errorTrustRootChanged;
|
||
|
||
/// 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í.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Relay nedostupný (sender certificate)'**
|
||
String get errorRelayUnavailable;
|
||
|
||
/// NotYetRegisteredError z _sendContent, když vlastní registrace na relay ještě nedoběhla (čerstvá instalace). 'Šepot' je značka, nepřekládat.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot se ještě připojuje k relayi — zkus zprávu poslat za chvíli.'**
|
||
String get errorNotYetRegistered;
|
||
|
||
/// ContactLinkIncompleteError při přidání kontaktu z odkazu/QR bez routingu (aid+da). 'sepot://' je schéma odkazu, zachovat.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odkaz je neúplný — protistrana ho vytvořila dřív, než se stihla připojit. Požádej ji o nový sepot:// odkaz.'**
|
||
String get errorContactLinkIncomplete;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Příloha je příliš velká (max {maxMb} MB)'**
|
||
String errorAttachmentTooLarge(int maxMb);
|
||
|
||
/// StateError z createGroup při prázdném seznamu členů; zobrazuje UI zakládání skupiny.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Skupina potřebuje aspoň 1 člena'**
|
||
String get errorGroupNeedsMember;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Skupina může mít nejvýš {maxMembers} členů'**
|
||
String errorGroupMaxMembers(int maxMembers);
|
||
|
||
/// 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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{displayName} nemá doručovací adresu — požádej o nový odkaz'**
|
||
String errorMemberNoDeliveryAddress(String displayName);
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt nemá doručovací adresu — požádej ho o nový sepot:// odkaz'**
|
||
String get errorContactNoDeliveryAddress;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Identity klíč z relaye NESEDÍ s kontaktem — možný MITM! Zpráva neodeslána.'**
|
||
String get errorIdentityKeyMismatch;
|
||
|
||
/// Titulek AppBaru obrazovky Nastavení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastavení'**
|
||
String get settingsTitle;
|
||
|
||
/// Hlavička sekce v nastavení (jazyk)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obecné'**
|
||
String get settingsSectionGeneral;
|
||
|
||
/// Hlavička sekce v nastavení (PIN, biometrie, zámek)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zabezpečení'**
|
||
String get settingsSectionSecurity;
|
||
|
||
/// Titulek dlaždice — otevře změnu PINu | Titulek AppBaru obrazovky změny PINu (vstup z dlaždice v Nastavení)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Změnit PIN'**
|
||
String get settingsChangePinTitle;
|
||
|
||
/// Podtitulek dlaždice Změnit PIN
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'6místný PIN pro odemknutí'**
|
||
String get settingsChangePinSubtitle;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Automatický zámek'**
|
||
String get settingsAutoLockTitle;
|
||
|
||
/// 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í
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Po 5 minutách'**
|
||
String get settingsAutoLock5min;
|
||
|
||
/// 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íč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nátlakový PIN'**
|
||
String get settingsDecoyPinTitle;
|
||
|
||
/// Podtitulek dlaždice, když nátlakový PIN JE nastaven
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastaven — otevře prázdnou aplikaci'**
|
||
String get settingsDecoyPinSetSubtitle;
|
||
|
||
/// Podtitulek dlaždice, když nátlakový PIN NENÍ nastaven
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Druhý PIN, který otevře prázdnou aplikaci'**
|
||
String get settingsDecoyPinUnsetSubtitle;
|
||
|
||
/// Hlavička sekce v nastavení (push)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Notifikace'**
|
||
String get settingsSectionNotifications;
|
||
|
||
/// Hlavička sekce v nastavení (Tor) — jen Android
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Připojení'**
|
||
String get settingsSectionConnection;
|
||
|
||
/// Hlavička sekce v nastavení (potvrzení přečtení, screen security)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Soukromí'**
|
||
String get settingsSectionPrivacy;
|
||
|
||
/// Titulek dlaždice se switchem
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrzení přečtení'**
|
||
String get settingsReadReceiptsTitle;
|
||
|
||
/// Podtitulek dlaždice Potvrzení přečtení; tykání, mužský rod ('přečetl') — v překladu volit genderově neutrální formulaci
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ukazovat protistraně přečtení zpráv (výchozí vypnuto)'**
|
||
String get settingsReadReceiptsSubtitle;
|
||
|
||
/// Titulek dlaždice se switchem (FLAG_SECURE)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zabezpečení obrazovky'**
|
||
String get settingsScreenSecurityTitle;
|
||
|
||
/// Podtitulek dlaždice Zabezpečení obrazovky
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Blokovat screenshoty a skrýt obsah v přepínači aplikací'**
|
||
String get settingsScreenSecuritySubtitle;
|
||
|
||
/// Hlavička sekce v nastavení (seed fráze, export/import)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Záloha klíčů'**
|
||
String get settingsSectionBackup;
|
||
|
||
/// 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íčů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zálohovací fráze'**
|
||
String get settingsSeedPhraseTitle;
|
||
|
||
/// Podtitulek dlaždice Zálohovací fráze
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'24 slov pro obnovu identity'**
|
||
String get settingsSeedPhraseSubtitle;
|
||
|
||
/// Titulek dlaždice exportu zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zálohovat historii'**
|
||
String get settingsBackupExportTitle;
|
||
|
||
/// Podtitulek dlaždice Zálohovat historii
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šifrovaný soubor s kontakty a zprávami'**
|
||
String get settingsBackupExportSubtitle;
|
||
|
||
/// Titulek dlaždice importu zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obnovit ze zálohy'**
|
||
String get settingsBackupImportTitle;
|
||
|
||
/// Podtitulek dlaždice Obnovit ze zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Načíst zálohu (jen s tvojí identitou)'**
|
||
String get settingsBackupImportSubtitle;
|
||
|
||
/// Hlavička sekce v nastavení (nahlášení zneužití, ochrana dětí) — odlišit od settingsSectionSecurity ('Zabezpečení')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Bezpečnost'**
|
||
String get settingsSectionSafety;
|
||
|
||
/// Titulek dlaždice — otevře /report
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nahlásit zneužití'**
|
||
String get settingsReportAbuseTitle;
|
||
|
||
/// Podtitulek dlaždice Nahlásit zneužití
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obtěžování, podvod, ohrožení dítěte'**
|
||
String get settingsReportAbuseSubtitle;
|
||
|
||
/// Titulek dlaždice — otevře externí URL childSafetyUrl | TextButton dole na formuláři — otevírá AppConstants.childSafetyUrl v externím prohlížeči
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Standardy ochrany dětí'**
|
||
String get settingsChildSafetyTitle;
|
||
|
||
/// Podtitulek dlaždice Standardy ochrany dětí
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Jak postupujeme proti zneužívání dětí'**
|
||
String get settingsChildSafetySubtitle;
|
||
|
||
/// Hlavička sekce v nastavení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'O aplikaci'**
|
||
String get settingsSectionAbout;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot'**
|
||
String get commonAppName;
|
||
|
||
/// Podtitulek dlaždice O aplikaci; STEJNÝ text i v about dialogu ř. 596 — jeden klíč | Verze v about dialogu — stejný klíč jako ř. 181
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Verze {version}'**
|
||
String settingsVersion(String version);
|
||
|
||
/// Titulek dlaždice; STEJNÝ text jako title AlertDialogu ř. 241 — jeden klíč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Licence'**
|
||
String get settingsLicenseTitle;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'AGPL-3.0'**
|
||
String get settingsLicenseSubtitle;
|
||
|
||
/// Titulek dlaždice — otevře privacyUrl
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zásady ochrany soukromí'**
|
||
String get settingsPrivacyPolicyTitle;
|
||
|
||
/// Podtitulek dlaždice Zásady ochrany soukromí; tykání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Co o tobě víme (a co ne)'**
|
||
String get settingsPrivacyPolicySubtitle;
|
||
|
||
/// Titulek dlaždice — otevře termsUrl
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Podmínky použití'**
|
||
String get settingsTermsTitle;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'sepot.cz/podminky'**
|
||
String get settingsTermsSubtitle;
|
||
|
||
/// Titulek dlaždice — otevře deletionUrl
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazání dat'**
|
||
String get settingsDataDeletionTitle;
|
||
|
||
/// Podtitulek dlaždice Smazání dat
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Jak požádat o výmaz'**
|
||
String get settingsDataDeletionSubtitle;
|
||
|
||
/// Červené OutlinedButton dole na obrazovce — otevře potvrzovací dialog smazání účtu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat všechna data'**
|
||
String get settingsDeleteAllDataButton;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Š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.'**
|
||
String settingsLicenseBody(String supportEmail);
|
||
|
||
/// 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íč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zavřít'**
|
||
String get commonClose;
|
||
|
||
/// SnackBar po tapnutí na Šepot ID v profilové kartě (kopie do schránky)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'ID zkopírováno'**
|
||
String get settingsIdCopied;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Otisk: {fingerprint}'**
|
||
String settingsFingerprint(String fingerprint);
|
||
|
||
/// Subject share_plus při sdílení souboru zálohy — vidí uživatel v systémovém share sheetu / e-mailu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot — šifrovaná záloha'**
|
||
String get backupShareSubject;
|
||
|
||
/// SnackBar při chybě exportu zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Záloha selhala: {error}'**
|
||
String backupExportFailed(String error);
|
||
|
||
/// SnackBar po úspěšném importu zálohy historie.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{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}}'**
|
||
String backupRestoredCount(int count);
|
||
|
||
/// SnackBar při chybě importu zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obnova ze zálohy selhala: {error}'**
|
||
String backupImportFailed(String error);
|
||
|
||
/// Vysvětlující text v dialogu nastavení nátlakového PINu; v kódu 2 adjacentní literály ř. 450-451 — sloučit
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get settingsDecoyPinExplain;
|
||
|
||
/// labelText druhého TextFieldu (potvrzení decoy PINu)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrdit'**
|
||
String get commonConfirm;
|
||
|
||
/// Potvrzovací tlačítko dialogu nátlakového PINu (uloží PIN)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastavit'**
|
||
String get commonSet;
|
||
|
||
/// SnackBar po úspěšném nastavení nátlakového PINu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nátlakový PIN nastaven'**
|
||
String get settingsDecoyPinEnabled;
|
||
|
||
/// SnackBar při DecoyPinConflict (decoy PIN == hlavní PIN); výjimka sama je v secure_storage.dart, hláška ale vzniká tady v UI
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nátlakový PIN musí být jiný než běžný'**
|
||
String get settingsDecoyPinConflict;
|
||
|
||
/// SnackBar po deaktivaci nátlakového PINu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nátlakový PIN zrušen'**
|
||
String get settingsDecoyPinDisabled;
|
||
|
||
/// SnackBar, když storage nevrátí seed frázi
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zálohovací fráze nebyla nalezena'**
|
||
String get settingsSeedPhraseNotFound;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Tato slova jsou jedinou zálohou tvé identity. Nikomu je neukazuj!'**
|
||
String get settingsSeedPhraseWarning;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{index}. {word}'**
|
||
String settingsSeedWordChip(int index, String word);
|
||
|
||
/// Nadpis v about dialogu; 'Šepot' je brand, podtitul 'Soukromý Messenger' se překládá
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot — Soukromý Messenger'**
|
||
String get settingsAboutTagline;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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'**
|
||
String get settingsAboutBody;
|
||
|
||
/// Title potvrzovacího AlertDialogu smazání účtu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat účet a všechna data?'**
|
||
String get settingsDeleteAccountTitle;
|
||
|
||
/// Tělo potvrzovacího dialogu smazání účtu; 3 adjacentní literály ř. 632-634 — sloučit; tykání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get settingsDeleteAccountBody;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Server je teď nedostupný — data v zařízení jsou smazaná, registrace na serveru zůstala. Zbytek smažeme na podpora@sepot.cz.'**
|
||
String get settingsDeleteAccountServerOffline;
|
||
|
||
/// Červené potvrzovací tlačítko dialogu smazání účtu — provede nevratné smazání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat vše'**
|
||
String get settingsDeleteAllConfirm;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Skupinu se nepovedlo založit: {error}'**
|
||
String groupsCreateFailed(String error);
|
||
|
||
/// Titulek AppBaru obrazovky založení skupiny | Tooltip ikony (group_add) v AppBaru — otevře vytvoření skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nová skupina'**
|
||
String get groupsNewGroupTitle;
|
||
|
||
/// Akční tlačítko v AppBaru — potvrzení založení skupiny (sloveso, krátké)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Založit'**
|
||
String get groupsCreateAction;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Členové ({selectedCount}/{maxMembers})'**
|
||
String groupsMembersCounter(int selectedCount, int maxMembers);
|
||
|
||
/// 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).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nejdřív si přidej kontakty — skupina se skládá z lidí, se kterými si už můžeš psát.'**
|
||
String get groupsEmptyContactsHint;
|
||
|
||
/// Podtitulek zašedlého (nevybratelného) kontaktu v seznamu — kontakt nemá routing (accountId/deliveryAddress), nelze ho přidat do skupiny
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Chybí doručovací adresa — požádej o nový odkaz'**
|
||
String get groupsMemberMissingAddress;
|
||
|
||
/// Velikost přílohy-dokumentu na kartě v chatu, varianta pod 1 kB (např. '512 B')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{bytes} B'**
|
||
String attachmentSizeBytes(int bytes);
|
||
|
||
/// Velikost přílohy-dokumentu na kartě v chatu, varianta kB (např. '38 kB'). Ruština používá 'КБ'.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{kilobytes} kB'**
|
||
String attachmentSizeKb(String kilobytes);
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{megabytes} MB'**
|
||
String attachmentSizeMb(String megabytes);
|
||
|
||
/// 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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Stažení selhalo — klepni pro opakování'**
|
||
String get attachmentDownloadFailedTapToRetry;
|
||
|
||
/// Řádek hlasové zprávy v bublině, když stažení audio blobu selhalo (stav failed)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Stažení selhalo'**
|
||
String get attachmentDownloadFailed;
|
||
|
||
/// Řádek hlasové zprávy v bublině během stahování blobu (stav pending/downloading), vedle spinneru
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Stahuji…'**
|
||
String get attachmentDownloading;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'soubor'**
|
||
String get attachmentSharedFileFallbackName;
|
||
|
||
/// SnackBar při výjimce během dešifrování/sdílení dokumentové přílohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Otevření přílohy selhalo: {error}'**
|
||
String attachmentOpenFailed(String error);
|
||
|
||
/// 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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Soubor'**
|
||
String get commonFile;
|
||
|
||
/// Náhled poslední zprávy v dlaždici seznamu chatů, když konverzace zatím nemá žádnou zprávu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nová konverzace'**
|
||
String get chatListNewConversation;
|
||
|
||
/// Náhled poslední zprávy v dlaždici — fotka s popiskem; emoji je součást textu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'📷 {caption}'**
|
||
String chatListPhotoWithCaptionPreview(String caption);
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'📎 {fileName}'**
|
||
String chatListFilePreview(String fileName);
|
||
|
||
/// Náhled poslední zprávy v dlaždici pro zprávu typu readReceipt (potvrzení o přečtení)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přečteno'**
|
||
String get chatListReadReceiptPreview;
|
||
|
||
/// Relativní čas poslední zprávy v dlaždici, méně než 1 minuta
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'teď'**
|
||
String get chatListTimeNow;
|
||
|
||
/// 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).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{minutes} min'**
|
||
String chatListTimeMinutes(int minutes);
|
||
|
||
/// Titulek AppBaru obrazovky QR skeneru pro přidání kontaktu. | Tooltip ikony QR skeneru v AppBaru kontaktů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Skenovat QR kód'**
|
||
String get qrScanTitle;
|
||
|
||
/// Hlavní instrukce ve spodním panelu skeneru (tykání — sjednotit tón napříč appkou).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Namiř kameru na QR kód kontaktu'**
|
||
String get qrScanInstruction;
|
||
|
||
/// Sekundární vysvětlující text pod instrukcí ve spodním panelu skeneru.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'QR kód obsahuje veřejný klíč kontaktu'**
|
||
String get qrScanHint;
|
||
|
||
/// Titulek potvrzovacího AlertDialogu po naskenování platného QR kódu kontaktu.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nový kontakt'**
|
||
String get qrNewContactTitle;
|
||
|
||
/// 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“).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{name} přidán/a'**
|
||
String qrContactAdded(String name);
|
||
|
||
/// 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íč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidat'**
|
||
String get commonAdd;
|
||
|
||
/// Nadpis 1. onboarding stránky (uvítání) pod logem
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vítej v Šepotu'**
|
||
String get onboardingWelcomeTitle;
|
||
|
||
/// Podtitulek 1. onboarding stránky; v kódu 3 adjacentní literály s \n (ř. 97–99), sloučit do jednoho klíče
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Soukromý messenger s end-to-end šifrováním.\nŽádné telefonní číslo. Žádný email.\nJen tvoje klíče.'**
|
||
String get onboardingWelcomeSubtitle;
|
||
|
||
/// Hlavní tlačítko na 1. onboarding stránce — přejde na stránku o šifrování
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Začít'**
|
||
String get onboardingStart;
|
||
|
||
/// TextButton pod Začít, vede na /restore (obnova účtu ze seed fráze)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Už mám účet — obnovit ze zálohovací fráze'**
|
||
String get onboardingRestoreExisting;
|
||
|
||
/// Nadpis 2. onboarding stránky (vysvětlení šifrování)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Tvoje zprávy, tvoje klíče'**
|
||
String get onboardingEncryptionTitle;
|
||
|
||
/// Titulek feature řádku 1 na stránce o šifrování
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Signal protokol'**
|
||
String get onboardingFeatureSignalTitle;
|
||
|
||
/// Podtitulek feature řádku 1 (technické termíny, částečně nepřekládat)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'X3DH + Double Ratchet, forward secrecy'**
|
||
String get onboardingFeatureSignalSubtitle;
|
||
|
||
/// Titulek feature řádku 2
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Post-kvantová ochrana'**
|
||
String get onboardingFeaturePqTitle;
|
||
|
||
/// Podtitulek feature řádku 2
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kyber (PQXDH) od první zprávy'**
|
||
String get onboardingFeaturePqSubtitle;
|
||
|
||
/// Titulek feature řádku 3
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Klíče jen na tvém zařízení'**
|
||
String get onboardingFeatureLocalKeysTitle;
|
||
|
||
/// Podtitulek feature řádku 3 (odkazuje na klíče z titulku)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Žádný server je nemá'**
|
||
String get onboardingFeatureLocalKeysSubtitle;
|
||
|
||
/// Podtitulek feature řádku 4 (podmět = zprávy z titulku)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Automaticky se smaží'**
|
||
String get onboardingFeatureDisappearingSubtitle;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Pokračovat'**
|
||
String get commonContinue;
|
||
|
||
/// Nadpis 3. onboarding stránky (vytvoření identity)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vytvoř svoji identitu'**
|
||
String get onboardingIdentityTitle;
|
||
|
||
/// Podtitulek 3. onboarding stránky
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Žádný email ani telefon. Jen jméno a kryptografické klíče.'**
|
||
String get onboardingIdentitySubtitle;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zobrazované jméno'**
|
||
String get onboardingDisplayNameLabel;
|
||
|
||
/// 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')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Např. Jan'**
|
||
String get onboardingDisplayNameHint;
|
||
|
||
/// Varování nad mřížkou seed slov; adjacentní literály ř. 281–282 sloučit; počet slov se česky skloňuje (slovo/slova/slov)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zapiš si těchto {count} slov. Jsou jedinou zálohou tvých klíčů!'**
|
||
String onboardingSeedPhraseWarning(int count);
|
||
|
||
/// Titulek CheckboxListTile — potvrzení uložení seed fráze; gender-neutrální tvar uložil/a, řešit i v překladech
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrzuji, že jsem si frázi bezpečně uložil/a'**
|
||
String get onboardingSeedSavedConfirm;
|
||
|
||
/// Tlačítko generování identity (disabled dokud není jméno); text tlačítka referencován i v komentáři ř. 265
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vygenerovat klíče'**
|
||
String get onboardingGenerateKeys;
|
||
|
||
/// Titulek AlertDialogu po skenu QR, když čísla nesouhlasí (varování, CAPS záměrně)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Čísla NESOUHLASÍ'**
|
||
String get verifyMismatchTitle;
|
||
|
||
/// Obsah dialogu při shodě bezpečnostních čísel
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Klíče si odpovídají. {contactName} je ověřený kontakt.'**
|
||
String verifyMatchBody(String contactName);
|
||
|
||
/// Obsah dialogu při neshodě — varování před MITM; adjacentní literály ř. 91–93 sloučit do jednoho klíče
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get verifyMismatchBody;
|
||
|
||
/// Potvrzovací tlačítko dialogu s výsledkem ověření (shoda i neshoda)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Rozumím'**
|
||
String get commonUnderstood;
|
||
|
||
/// Titulek potvrzovacího dialogu při ručním označení kontaktu jako ověřeného
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Označit jako ověřené?'**
|
||
String get verifyManualConfirmTitle;
|
||
|
||
/// Obsah potvrzovacího dialogu ručního ověření; adjacentní literály ř. 111–112 sloučit; gender tvar porovnal/a
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrď jen v případě, že sis číslice porovnal/a s protistranou jiným důvěryhodným kanálem (osobně, hovorem…) a souhlasí.'**
|
||
String get verifyManualConfirmBody;
|
||
|
||
/// Potvrzovací FilledButton dialogu ručního ověření
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Souhlasí, ověřit'**
|
||
String get verifyManualConfirmAction;
|
||
|
||
/// AppBar titulek obrazovky ověření kontaktu (loading fallback stav) | AppBar titulek hlavního stavu obrazovky — stejný klíč jako ř. 140
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ověření kontaktu'**
|
||
String get verifyTitle;
|
||
|
||
/// Zelený banner nahoře na obrazovce, když je kontakt už ověřený
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt je ověřený'**
|
||
String get verifyContactVerifiedBanner;
|
||
|
||
/// Úvodní vysvětlující text obrazovky nad QR kódem; adjacentní literály ř. 177–179 sloučit
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Porovnej toto číslo s {contactName}. Když souhlasí, vaše šifrování nikdo neodposlouchává. Nejrychlejší je vzájemně si naskenovat QR kódy.'**
|
||
String verifyIntro(String contactName);
|
||
|
||
/// FilledButton — otevře skener QR kódu protistrany
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Naskenovat kód protistrany'**
|
||
String get verifyScanButton;
|
||
|
||
/// OutlinedButton — otevře dialog ručního potvrzení shody číslic
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Číslice souhlasí — označit ručně'**
|
||
String get verifyManualButton;
|
||
|
||
/// TextButton viditelný jen u ověřeného kontaktu — zruší stav ověření
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zrušit ověření'**
|
||
String get verifyUnverifyButton;
|
||
|
||
/// AppBar titulek minimalistické skener obrazovky (_VerifyScanScreen)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Naskenuj ověřovací QR'**
|
||
String get verifyScanScreenTitle;
|
||
|
||
/// Titulek AppBaru obrazovky nahlášení zneužití
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nahlásit'**
|
||
String get reportTitle;
|
||
|
||
/// Nadpis úspěšné obrazovky po odeslání hlášení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Hlášení odesláno'**
|
||
String get reportSubmitted;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Hlášení řešíme přednostně. Pokud je dítě v bezprostředním ohrožení, zavolej 158 nebo linku 116 111.'**
|
||
String get reportSubmittedChildSafety;
|
||
|
||
/// Text pod nadpisem úspěchu pro běžné kategorie hlášení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Díky. Podíváme se na to co nejdřív.'**
|
||
String get reportSubmittedThanks;
|
||
|
||
/// Tlačítko zavírající úspěšnou obrazovku hlášení; obecný text, pravděpodobně sdílený s dalšími obrazovkami
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Hotovo'**
|
||
String get commonDone;
|
||
|
||
/// Informační panel nahoře ve formuláři hlášení — vysvětluje, že provozovatel obsah zpráv nevidí; adjacentní literály ř. 133-136
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get reportPanelE2eNotice;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get reportPanelCsamWarning;
|
||
|
||
/// Panel upozorňující, že odeslání hlášení odhalí IP adresu (jde mimo relay); adjacentní literály ř. 154-155
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Hlášení nejde přes relay, ale na náš webový server. Ten se při odeslání dozví tvou IP adresu.'**
|
||
String get reportPanelIpNotice;
|
||
|
||
/// Nadpis sekce s výběrem kategorie hlášení (radio volby)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Čeho se hlášení týká'**
|
||
String get reportCategoryHeading;
|
||
|
||
/// Nadpis sekce nad textovým polem popisu incidentu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Co se stalo'**
|
||
String get reportDescriptionHeading;
|
||
|
||
/// Titulek přepínače SwitchListTile — varianta bez jména kontaktu (reportedName == null)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přiložit ID nahlášeného kontaktu'**
|
||
String get reportAttachContactId;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přiložit ID kontaktu {contactName}'**
|
||
String reportAttachContactIdNamed(String contactName);
|
||
|
||
/// Nadpis sekce nad nepovinným polem pro kontaktní e-mail oznamovatele
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt na tebe (nepovinné)'**
|
||
String get reportReplyToHeading;
|
||
|
||
/// hintText TextFieldu pro kontaktní e-mail oznamovatele
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'e-mail, kdybychom se potřebovali doptat'**
|
||
String get reportReplyToHint;
|
||
|
||
/// Hlavní FilledButton odesílající formulář hlášení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odeslat hlášení'**
|
||
String get reportSubmitButton;
|
||
|
||
/// Titulek AppBaru obrazovky kontaktů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakty'**
|
||
String get contactsTitle;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidat kontakt'**
|
||
String get contactsAddContact;
|
||
|
||
/// hintText vyhledávacího TextFieldu nad seznamem kontaktů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Hledat kontakt...'**
|
||
String get contactsSearchHint;
|
||
|
||
/// Prázdný stav seznamu, když uživatel nemá žádné kontakty (a nehledá)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zatím žádné kontakty'**
|
||
String get contactsEmpty;
|
||
|
||
/// Prázdný stav při aktivním vyhledávání bez shody
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Žádné výsledky'**
|
||
String get contactsNoResults;
|
||
|
||
/// 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'
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Sdílej svůj Šepot ID'**
|
||
String get contactsShareCardTitle;
|
||
|
||
/// Podtitulek karty sdílení vlastního Šepot ID
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ukaž QR kód nebo pošli odkaz'**
|
||
String get contactsShareCardSubtitle;
|
||
|
||
/// Instrukční text v těle dialogu Přidat kontakt
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vlož sdílený řetězec (share string) kontaktu:'**
|
||
String get contactsAddDialogPrompt;
|
||
|
||
/// hintText TextFieldu v dialogu Přidat kontakt (vkládá se share string)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vložit share string...'**
|
||
String get contactsShareStringHint;
|
||
|
||
/// SnackBar, když se vložený text nepodaří parsovat jako PublicIdentity share string
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Neplatný share string'**
|
||
String get contactsInvalidShareString;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt {name} přidán'**
|
||
String contactsAdded(String name);
|
||
|
||
/// Podtitulek položky Ověřit kontakt v bottom sheetu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Porovnání bezpečnostního čísla'**
|
||
String get verifyContactSubtitle;
|
||
|
||
/// Destruktivní položka v bottom sheetu (long-press na kontakt) — smaže kontakt bez potvrzení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Smazat kontakt'**
|
||
String get contactsDeleteContact;
|
||
|
||
/// Titulek obrazovky nastavení PINu ve fázi potvrzení (druhé zadání PINu při onboardingu)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrď PIN'**
|
||
String get pinConfirmTitle;
|
||
|
||
/// Titulek obrazovky nastavení PINu při prvním zadání (onboarding)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastav si PIN'**
|
||
String get pinSetupTitle;
|
||
|
||
/// Podtitulek pod titulkem ve fázi potvrzení PINu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej PIN znovu pro potvrzení'**
|
||
String get pinConfirmSubtitle;
|
||
|
||
/// Podtitulek při prvním zadání PINu — vysvětluje účel (odemknutí aplikace, 6 číslic)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'6-místný PIN pro odemknutí aplikace'**
|
||
String get pinSetupSubtitle;
|
||
|
||
/// Červená chybová hláška pod PIN tečkami, když enablePin() (Argon2id wrap DEK) vyhodí výjimku
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastavení PINu selhalo. Zkus to znovu.'**
|
||
String get pinSetupFailed;
|
||
|
||
/// Č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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'PINy se neshodují. Zkus to znovu.'**
|
||
String get pinMismatchRetry;
|
||
|
||
/// Titulek kroku 1 změny PINu (ověření starého PINu) — z konstantní mapy _titulky, record (titulek, popis)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej současný PIN'**
|
||
String get pinChangeCurrentTitle;
|
||
|
||
/// Podtitulek kroku 1 změny PINu — vysvětluje, že se PIN ověřuje unwrapem DEK, ne hashem
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ověříme ho odemčením klíče'**
|
||
String get pinChangeCurrentSubtitle;
|
||
|
||
/// Titulek kroku 2 změny PINu (zadání nového PINu)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej nový PIN'**
|
||
String get pinChangeNewTitle;
|
||
|
||
/// 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í.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'6 číslic'**
|
||
String get pinChangeNewSubtitle;
|
||
|
||
/// Titulek kroku 3 změny PINu (potvrzení nového PINu)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrď nový PIN'**
|
||
String get pinChangeConfirmTitle;
|
||
|
||
/// Podtitulek kroku 3 změny PINu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej ho ještě jednou'**
|
||
String get pinChangeConfirmSubtitle;
|
||
|
||
/// Č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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Špatný PIN.'**
|
||
String get pinWrong;
|
||
|
||
/// Červená chybová hláška v kroku 2, když nový PIN == starý PIN
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nový PIN se musí lišit od současného.'**
|
||
String get pinChangeMustDiffer;
|
||
|
||
/// Č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íč.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'PINy se neshodují.'**
|
||
String get pinMismatch;
|
||
|
||
/// Č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'.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Tenhle PIN už patří nátlakovému režimu. Zvol jiný.'**
|
||
String get pinDecoyConflict;
|
||
|
||
/// Červená chybová hláška při obecné výjimce z changePin()
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Změna PINu selhala. Zkus to znovu.'**
|
||
String get pinChangeFailed;
|
||
|
||
/// SnackBar po úspěšné změně PINu, těsně před context.pop()
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'PIN změněn'**
|
||
String get pinChanged;
|
||
|
||
/// Titulek celoobrazovkové chybové obrazovky (_ChybaApp), když selže init libsignal při startu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šifrovací jádro se nespustilo'**
|
||
String get errorCryptoInitTitle;
|
||
|
||
/// Titulek celoobrazovkové chybové obrazovky (_ChybaApp) při neodchycené chybě startu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Šepot se nespustil'**
|
||
String get errorStartupTitle;
|
||
|
||
/// Nadpis náhradní ErrorWidget plochy (_ChybovaPlocha) v release buildu, když build() nějakého widgetu spadne
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Tahle obrazovka se nevykreslila'**
|
||
String get errorScreenNotRenderedTitle;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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.'**
|
||
String get errorStartupBody;
|
||
|
||
/// Patička chybové obrazovky _ChybaApp s kontaktem; 'sepot.cz' je doména — v překladech ponechat, přeložit jen výzvu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'sepot.cz · napiš mi na kontakt'**
|
||
String get errorContactFooter;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odemkni Šepot'**
|
||
String get pinUnlockTitle;
|
||
|
||
/// Podtitulek odemykací obrazovky pod nadpisem
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej PIN'**
|
||
String get pinEnterPin;
|
||
|
||
/// Label TextButton pod numpadem — ruční znovuvyvolání biometrické výzvy (viditelné jen se zapnutou biometrií)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odemknout biometrií'**
|
||
String get pinUnlockWithBiometrics;
|
||
|
||
/// Červená chybová hláška na odemykací obrazovce po zadání špatného PINu (WrongPinException)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Špatný PIN'**
|
||
String get pinWrong2;
|
||
|
||
/// Červená chybová hláška na odemykací obrazovce při jiné chybě odemčení než špatný PIN
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Chyba odemčení'**
|
||
String get pinUnlockError;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Push notifikace'**
|
||
String get pushTitle;
|
||
|
||
/// Popisek volby 'Vypnuto' v dialogu výběru režimu pushů
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zprávy se stáhnou až po otevření appky.'**
|
||
String get pushModeOffDesc;
|
||
|
||
/// 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)')
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'UnifiedPush (doporučeno)'**
|
||
String get pushModeUp;
|
||
|
||
/// Popisek volby UnifiedPush v dialogu výběru režimu pushů ('ntfy', 'F-Droid', 'Play' jsou názvy — nepřekládat)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Degooglované — potřebuje aplikaci ntfy (F-Droid/Play).'**
|
||
String get pushModeUpDesc;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Google (FCM)'**
|
||
String get pushModeFcm;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Spolehlivé bez další aplikace. Push token zařízení jde Googlu; obsah zpráv nikdy.'**
|
||
String get pushModeFcmDesc;
|
||
|
||
/// SnackBar v nastavení, když přepnutí režimu pushů skončí výjimkou
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nastavení pushů selhalo: {error}'**
|
||
String pushSetupFailed(String error);
|
||
|
||
/// Titulek AlertDialog, když v systému není nainstalovaný žádný UnifiedPush distributor
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Žádný distributor'**
|
||
String get pushNoDistributorTitle;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Pro degooglované notifikace nainstaluj UnifiedPush distributor, např. ntfy (F-Droid nebo Play). Pak push zapni znovu.'**
|
||
String get pushNoDistributorBody;
|
||
|
||
/// Potvrzovací tlačítko AlertDialog 'Žádný distributor' — obecné, sdílet napříč appkou
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'OK'**
|
||
String get commonOk;
|
||
|
||
/// Titulek SimpleDialog výběru UnifiedPush distributora (položky jsou názvy balíčků z systému — nelokalizují se)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Vyber distributora'**
|
||
String get pushPickDistributorTitle;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'UnifiedPush · {distributor}'**
|
||
String pushSubtitleUnifiedPush(String distributor);
|
||
|
||
/// Vnořený fallback literál uvnitř subtitle 'UnifiedPush · …', když není vybraný žádný distributor — vyhodnotit před dosazením do pushSubtitleUnifiedPush
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'bez distributora'**
|
||
String get pushNoDistributorFallback;
|
||
|
||
/// Subtitle ListTile v nastavení, když je aktivní režim FCM
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Google (FCM) — rychlé, opt-in'**
|
||
String get pushSubtitleFcm;
|
||
|
||
/// Validační chyba pod formulářem obnovy účtu, když je jméno prázdné
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej zobrazované jméno.'**
|
||
String get restoreErrorNameRequired;
|
||
|
||
/// Chyba při obnově účtu: špatný počet slov v zadané frázi.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{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}.}}'**
|
||
String restoreErrorWordCount(int wordCount, int requiredWords);
|
||
|
||
/// Validační chyba obnovy účtu — mnemonic checksum nesedí
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Fráze není platná — zkontroluj slova i jejich pořadí.'**
|
||
String get restoreErrorInvalidPhrase;
|
||
|
||
/// Chyba zobrazená pod formulářem, když recoverIdentity vyhodí výjimku
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obnova selhala: {error}'**
|
||
String restoreErrorFailed(String error);
|
||
|
||
/// 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íč)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obnovit účet'**
|
||
String get restoreTitle;
|
||
|
||
/// Hlavní nadpis obrazovky obnovy účtu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zadej svoji zálohovací frázi'**
|
||
String get restoreHeading;
|
||
|
||
/// 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ě.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{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í).'**
|
||
String restoreIntro(int wordCount);
|
||
|
||
/// Žlutý varovný box na obrazovce obnovy účtu. Adjacentní literály přes 2 řádky (130-131).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Historie zpráv se neobnoví — je uložená jen na původním zařízení.'**
|
||
String get restoreHistoryWarning;
|
||
|
||
/// hintText pole zálohovací fráze — ukázkový formát zadání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'slovo1 slovo2 slovo3 …'**
|
||
String get restorePhraseHint;
|
||
|
||
/// helperText pod polem fráze — průběžné počítadlo zadaných slov (mění barvu při dosažení 24)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'{wordCount} / {requiredWords} slov'**
|
||
String restoreWordCountHelper(int wordCount, int requiredWords);
|
||
|
||
/// První řádek seznamu konverzací — odkaz na archiv s počtem archivovaných konverzací
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Archivované ({count})'**
|
||
String chatListArchivedCount(int count);
|
||
|
||
/// Nadpis empty state, když uživatel nemá žádné konverzace
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zatím žádné konverzace'**
|
||
String get chatListEmptyTitle;
|
||
|
||
/// Podnadpis empty state — 'šeptat' je slovní hříčka s názvem appky, v překladu volit ekvivalent (whisper/flüstern…)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidej kontakt a začni šeptat!'**
|
||
String get chatListEmptySubtitle;
|
||
|
||
/// Položka bottom sheetu akcí konverzace (long-press), zobrazí se když je konverzace ztlumená. Ternár na jednom řádku se 'Ztlumit'.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zrušit ztlumení'**
|
||
String get chatListUnmute;
|
||
|
||
/// Položka bottom sheetu akcí konverzace (long-press), zobrazí se když konverzace ztlumená není
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ztlumit'**
|
||
String get chatListMute;
|
||
|
||
/// Položka bottom sheetu akcí konverzace (long-press) — přesune konverzaci do archivu; kandidát na sdílení s archive feature (archiveAction)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Archivovat'**
|
||
String get chatListArchive;
|
||
|
||
/// AppBar titulek obrazovky sdílení vlastního QR/Šepot ID
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Můj Šepot ID'**
|
||
String get qrShareTitle;
|
||
|
||
/// Titulek na QR obrazovce, když vlastní registrace na relay ještě nedoběhla — routing (aid+da) není hotový, QR by byl neúplný.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Připojuji k relayi…'**
|
||
String get qrShareConnectingTitle;
|
||
|
||
/// Vysvětlení pod titulkem qrShareConnectingTitle. 'Šepot' je značka, nepřekládat.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Až se Šepot poprvé připojí, objeví se tvůj QR kód a odkaz. Chvilku strpení — stačí pár sekund.'**
|
||
String get qrShareConnectingBody;
|
||
|
||
/// Text uprostřed obrazovky, když identityProvider vrátí null (nemělo by běžně nastat)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Identita nebyla nalezena'**
|
||
String get qrIdentityNotFound;
|
||
|
||
/// SnackBar po stisku tlačítka Kopírovat (zkopírování share stringu) — pravděpodobně sdílené i jinde v appce
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zkopírováno do schránky'**
|
||
String get commonCopiedToClipboard;
|
||
|
||
/// Text sdílený přes share_plus (Share.share) — pozvánka s identitním řetězcem; obsahuje dva \n
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidej mě na Šepotu!\n\n{shareString}'**
|
||
String qrShareInviteMessage(String shareString);
|
||
|
||
/// Popisek ElevatedButton.icon, který otevře systémový share sheet
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Sdílet'**
|
||
String get commonShare;
|
||
|
||
/// Informační box (ikona info) pod tlačítky — vysvětluje, jak protistrana kontakt přidá
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt naskenuje tvůj QR kód nebo vloží sdílený řetězec do aplikace.'**
|
||
String get qrShareInfo;
|
||
|
||
/// Label kategorie nahlášení — zobrazuje report screen ve výběru kategorií (ReportCategory.label)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Ohrožení dítěte'**
|
||
String get reportCategoryChildSafety;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Popiš situaci vlastními slovy. Nevkládej obsah zpráv ani odkazy na materiál.'**
|
||
String get reportCategoryChildSafetyHint;
|
||
|
||
/// Label kategorie nahlášení — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Obtěžování nebo výhrůžky'**
|
||
String get reportCategoryHarassment;
|
||
|
||
/// Hint kategorie Obtěžování — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Někdo tě zastrašuje, vyhrožuje nebo obtěžuje.'**
|
||
String get reportCategoryHarassmentHint;
|
||
|
||
/// Label kategorie nahlášení — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Spam'**
|
||
String get reportCategorySpam;
|
||
|
||
/// Hint kategorie Spam — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nevyžádané zprávy, hromadné rozesílání.'**
|
||
String get reportCategorySpamHint;
|
||
|
||
/// Label kategorie nahlášení — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Podvod'**
|
||
String get reportCategoryFraud;
|
||
|
||
/// Hint kategorie Podvod — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Pokus vylákat peníze, klíče nebo osobní údaje.'**
|
||
String get reportCategoryFraudHint;
|
||
|
||
/// Label kategorie nahlášení — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Jiné'**
|
||
String get reportCategoryOther;
|
||
|
||
/// Hint kategorie Jiné — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Něco jiného, co bychom měli vědět.'**
|
||
String get reportCategoryOtherHint;
|
||
|
||
/// ReportFailure při prázdném popisu — UI (report screen) zobrazuje message jako chybu/SnackBar
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Napiš prosím, co se stalo.'**
|
||
String get reportErrorEmptyDescription;
|
||
|
||
/// ReportFailure při síťové chybě/timeoutu odesílání hlášení — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nepodařilo se spojit se serverem. Zkus to znovu, nebo napiš na {supportEmail}.'**
|
||
String reportErrorConnection(String supportEmail);
|
||
|
||
/// ReportFailure při HTTP 429 (rate limit) — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Z tvé sítě přišlo příliš mnoho hlášení. Zkus to za hodinu, nebo napiš na {supportEmail}.'**
|
||
String reportErrorRateLimited(String supportEmail);
|
||
|
||
/// ReportFailure při jiném HTTP kódu — zobrazuje report screen
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odeslání selhalo (kód {statusCode}). Napiš prosím na {supportEmail}.'**
|
||
String reportErrorServer(int statusCode, String supportEmail);
|
||
|
||
/// Volba automatického zámku (0 s) v nastavení — popisek v nabídce AutoLockNotifier.moznosti, zobrazuje settings UI
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nikdy'**
|
||
String get settingsAutoLockNever;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Po 1 minutě'**
|
||
String get settingsAutoLock1min;
|
||
|
||
/// Volba automatického zámku (900 s) v nastavení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Po 15 minutách'**
|
||
String get settingsAutoLock15min;
|
||
|
||
/// SnackBar když selže zapnutí/vypnutí Toru (výjimka z torProvider.set); $e je výjimka
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přepnutí Toru selhalo: {error}'**
|
||
String torToggleFailed(String error);
|
||
|
||
/// Titulek potvrzovacího AlertDialogu před zapnutím Toru; STEJNÝ text i jako title ListTile na ř. 101 — sdílet jeden klíč
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Připojení přes Tor'**
|
||
String get torConnectionTitle;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'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ší.'**
|
||
String get torDialogBody;
|
||
|
||
/// Potvrzovací tlačítko dialogu (zapne Tor) — obecné 'Zapnout', kandidát na sdílený klíč pro jiné přepínače
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zapnout'**
|
||
String get commonTurnOn;
|
||
|
||
/// Subtitle dlaždice v nastavení když je Tor VYPNUTÝ
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přímé šifrované spojení (WSS). Zapni pro skrytí IP přes Tor.'**
|
||
String get torSubtitleOff;
|
||
|
||
/// Subtitle dlaždice když je Tor zapnutý a relay spojení navázané (RelayConnectionState.connected)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Připojeno přes Tor (.onion).'**
|
||
String get torStatusConnected;
|
||
|
||
/// Subtitle dlaždice když je Tor zapnutý a spojení se navazuje — nápověda, že možná neběží Orbot; obsahuje výpustku …
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Připojuji přes Tor… (běží Orbot?)'**
|
||
String get torStatusConnecting;
|
||
|
||
/// Subtitle dlaždice když je Tor zapnutý a spojení není navázané ani se nenavazuje (default větev switch) — čeká se na Orbot
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přes Tor — čekám na Orbot (SOCKS 9050).'**
|
||
String get torStatusWaiting;
|
||
|
||
/// SnackBar v nastavení při pokusu zapnout biometrii bez nastaveného PINu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nejdřív nastav PIN — biometrie ho jen doplňuje.'**
|
||
String get biometricsPinRequiredFirst;
|
||
|
||
/// 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
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Úložiště je zamčené — odemkni appku PINem.'**
|
||
String get biometricsStorageLocked;
|
||
|
||
/// SnackBar když LocalAuthentication.isDeviceSupported() vrátí false
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zařízení nemá nastavenou biometrii.'**
|
||
String get biometricsNotAvailable;
|
||
|
||
/// localizedReason systémové biometrické výzvy (local_auth) při zapínání biometrie — zobrazí OS v nativním dialogu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Potvrď zapnutí biometrického odemčení'**
|
||
String get biometricsEnrollPromptReason;
|
||
|
||
/// SnackBar v catch bloku při selhání zapnutí/vypnutí biometrie; $e je zachycená výjimka
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Biometrii se nepodařilo nastavit: {error}'**
|
||
String biometricsSetupFailed(String error);
|
||
|
||
/// Titulek ListTile přepínače biometrie v nastavení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Biometrie'**
|
||
String get biometricsTileTitle;
|
||
|
||
/// Podtitulek ListTile přepínače biometrie v nastavení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odemknutí otiskem prstu / obličejem (PIN zůstává záloha)'**
|
||
String get biometricsTileSubtitle;
|
||
|
||
/// FormatException z BackupService.import() při příliš krátkém souboru — zobrazí obrazovka obnovy zálohy (SnackBar/dialog)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Poškozený soubor zálohy'**
|
||
String get backupErrorCorruptedFile;
|
||
|
||
/// FormatException z BackupService.import() při chybějícím magic headeru SEPOTBK1 — zobrazí obrazovka obnovy zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nerozpoznaný formát zálohy'**
|
||
String get backupErrorUnknownFormat;
|
||
|
||
/// FormatException z BackupService.import() při selhání GCM autentizace (klíč odvozený z jiné identity) — zobrazí obrazovka obnovy zálohy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zálohu nelze dešifrovat — patří k jiné identitě?'**
|
||
String get backupErrorWrongIdentity;
|
||
|
||
/// 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)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'sepot-obrazek.{ext}'**
|
||
String attachmentSharedImageFilename(String ext);
|
||
|
||
/// Chybový text uprostřed fullscreen prohlížeče obrázku, když se přílohu nepodaří načíst/dešifrovat
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přílohu se nepodařilo dešifrovat'**
|
||
String get attachmentDecryptFailed;
|
||
|
||
/// Výchozí název akce lokální notifikace na Linuxu (LinuxInitializationSettings.defaultActionName)
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Otevřít'**
|
||
String get pushActionOpen;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zprávy'**
|
||
String get pushChannelMessagesName;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Upozornění na nové zprávy (bez obsahu)'**
|
||
String get pushChannelMessagesDescription;
|
||
|
||
/// Tělo notifikace o přijaté zprávě, když appka běží na pozadí — zobrazuje jen jméno odesílatele, nikdy obsah zprávy.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Nová zpráva od {senderName}'**
|
||
String pushNewMessageFrom(String senderName);
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Máš nové zprávy'**
|
||
String get pushNewMessages;
|
||
|
||
/// Titulek AppBaru obrazovky archivovaných konverzací.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Archivované'**
|
||
String get archiveTitle;
|
||
|
||
/// Empty state uprostřed obrazovky, když nejsou žádné archivované konverzace.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Žádné archivované konverzace'**
|
||
String get archiveEmpty;
|
||
|
||
/// Položka v modal bottom sheetu po long-pressu na archivovanou konverzaci — odarchivuje ji.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zrušit archivaci'**
|
||
String get archiveUnarchive;
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Fráze má {count} slov, očekávám {expected}'**
|
||
String restoreErrorMnemonicWordCount(int count, int expected);
|
||
|
||
/// 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.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Neplatná fráze: {message}'**
|
||
String restoreErrorInvalidMnemonic(String message);
|
||
|
||
/// 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).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kontakt již existuje'**
|
||
String get contactsErrorAlreadyExists;
|
||
|
||
/// Tagline pod názvem aplikace v logu (splash/onboarding obrazovky, showText=true).
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Soukromý messenger'**
|
||
String get commonAppTagline;
|
||
|
||
/// Kompaktní varianta badge šifrování (ikona zámku + 'E2E'). Zkratka end-to-end — ve většině jazyků zůstane 'E2E'.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'E2E'**
|
||
String get commonE2eBadgeCompact;
|
||
|
||
/// Plná varianta badge šifrování (ikona zámku + text), zobrazuje se např. v hlavičce chatu / onboardingu.
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'End-to-end šifrováno'**
|
||
String get commonE2eBadgeFull;
|
||
|
||
/// hintText pole popisku na obrazovce náhledu fotky před odesláním
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidat popisek…'**
|
||
String get photoPreviewCaptionHint;
|
||
|
||
/// Tooltip nástroje kreslení prstem na náhledu fotky
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Kreslit'**
|
||
String get photoPreviewDraw;
|
||
|
||
/// Tooltip nástroje přidání textu na fotku
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Přidat text'**
|
||
String get photoPreviewAddText;
|
||
|
||
/// Tooltip otočení fotky o 90°
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Otočit'**
|
||
String get photoPreviewRotate;
|
||
|
||
/// Tooltip vrácení posledního tahu kreslení
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Zpět'**
|
||
String get photoPreviewUndo;
|
||
|
||
/// Tooltip tlačítka odeslání fotky z náhledu
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Poslat'**
|
||
String get photoPreviewSend;
|
||
|
||
/// Titulek dialogu pro zadání/úpravu textu na fotce
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Text na fotce'**
|
||
String get photoPreviewTextDialogTitle;
|
||
|
||
/// Tlačítko odebrání textu z fotky v dialogu úpravy
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Odebrat'**
|
||
String get photoPreviewRemoveText;
|
||
|
||
/// SnackBar, když se vybraná fotka nedá dekódovat — náhled se zavře bez odeslání
|
||
///
|
||
/// In cs, this message translates to:
|
||
/// **'Fotku se nepodařilo načíst'**
|
||
String get photoPreviewDecodeFailed;
|
||
}
|
||
|
||
class _AppLocalizationsDelegate
|
||
extends LocalizationsDelegate<AppLocalizations> {
|
||
const _AppLocalizationsDelegate();
|
||
|
||
@override
|
||
Future<AppLocalizations> load(Locale locale) {
|
||
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
|
||
}
|
||
|
||
@override
|
||
bool isSupported(Locale locale) =>
|
||
<String>['cs', 'de', 'en', 'it', 'ru'].contains(locale.languageCode);
|
||
|
||
@override
|
||
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
||
}
|
||
|
||
AppLocalizations lookupAppLocalizations(Locale locale) {
|
||
// Lookup logic when only language code is specified.
|
||
switch (locale.languageCode) {
|
||
case 'cs':
|
||
return AppLocalizationsCs();
|
||
case 'de':
|
||
return AppLocalizationsDe();
|
||
case 'en':
|
||
return AppLocalizationsEn();
|
||
case 'it':
|
||
return AppLocalizationsIt();
|
||
case 'ru':
|
||
return AppLocalizationsRu();
|
||
}
|
||
|
||
throw FlutterError(
|
||
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
|
||
'an issue with the localizations generation tool. Please file an issue '
|
||
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
||
'that was used.',
|
||
);
|
||
}
|