cautpartener / client / src / app / locales / ro.ts
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
/** Romanian — the source of truth for translation keys (see i18n.ts). */
export const ro = {
  appName: "Caut Partener",
  tabFeed: "Feed",
  tabChats: "Conversații",
  tabContacts: "Contacte",
  tabProfile: "Profil",
  statusChecking: "se verifică conexiunea…",
  statusOnline: "conectat",
  statusOffline: "offline",
  comingSoonTitle: "În curând",
  comingSoonBody: "Această secțiune sosește într-o etapă viitoare.",
  panelFeedHint: "Aici vor apărea postările publice și ale contactelor tale.",
  panelChatsHint: "Aici vor apărea conversațiile tale criptate integral.",
  panelContactsHint: "Aici vor apărea contactele tale verificate.",
  panelProfileHint: "Aici îți vei crea și administra profilul.",
  backHome: "Înapoi la început",
  updateReady: "O versiune nouă ({version}) este gata — atinge pentru actualizare",
  updateReadyGeneric: "O versiune nouă este gata — atinge pentru actualizare",
  updating: "se actualizează…",
  versionLabel: "versiunea {version}",
  langToggle: "Schimbă limba",

  // identity onboarding
  onbTitle: "Identitatea ta",
  onbIntro:
    "Caut Partener nu are conturi și nici servere centrale. Identitatea ta este o cheie secretă păstrată doar pe dispozitivele tale — o creezi acum sau o aduci de pe alt dispozitiv.",
  onbCreate: "Creează identitate",
  onbImport: "Am deja o identitate",
  onbCreateImportHint:
    "Ai mai folosit Caut Partener pe acest dispozitiv? Importă-ți identitatea în loc să creezi una nouă.",
  onbPersistWarn:
    "Browserul poate șterge datele acestei aplicații după o perioadă de neutilizare — cheia secretă salvată este singura cale de recuperare.",
  onbSeedTitle: "Cheia ta secretă",
  onbSeedExplain:
    "Această cheie ESTE identitatea ta. Salveaz-o acum într-un manager de parole sau scrie-o pe hârtie — dacă pierzi dispozitivul, cheia este singura cale de a-ți recupera identitatea. Nimeni nu o poate reseta.",
  onbFingerprintHint: "amprenta identității tale — cei 4 emoji te identifică vizual",
  copySeed: "Copiază cheia",
  copied: "Copiat",
  copyFailed: "Copierea a eșuat — copiaz-o manual",
  onbSavedCheck: "Am salvat cheia într-un loc sigur",
  onbLast4Label: "Scrie ultimele 4 caractere ale cheii",
  onbLast4Bad: "Caracterele nu corespund cheii de mai sus",
  onbContinue: "Continuă",
  onbPersistFailed: "Salvarea a eșuat — încearcă din nou",
  onbImportTitle: "Importă identitatea",
  onbImportExplain:
    "Lipește cheia de 43 de caractere salvată pe celălalt dispozitiv sau scanează codul ei QR. Verifică apoi că amprenta emoji este cea așteptată.",
  onbImportPlaceholder: "cheia identității (43 de caractere)…",
  onbImportInvalid: "Aceasta nu este o cheie validă — are exact 43 de caractere (litere, cifre, - și _).",
  onbImportConfirm: "Folosește această identitate",
  onbScanQr: "Scanează cod QR",
  onbScanFail: "Camera nu a putut fi pornită",
  back: "Înapoi",

  // wiped-storage recovery
  recTitle: "Stocarea a fost ștearsă",
  recBody:
    "Browserul a șters datele acestei aplicații — pe iOS se întâmplă după o perioadă de neutilizare. Identitatea ta NU este pierdută dacă ți-ai salvat cheia secretă: importă cheia și totul se resincronizează.",
  recImport: "Importă cheia salvată",
  recStartOver: "Nu mai am cheia — încep o identitate nouă",
  recStartOverConfirm:
    "Fără cheie, vechea identitate, contactele și profilul ei nu mai pot fi recuperate. Sigur vrei să începi de la zero?",
  recStartOverYes: "Da, încep de la zero",
  cancel: "Anulează",
  closeSheet: "Închide",

  // profile tab
  profIdentityTitle: "Identitatea ta",
  profNoIdentity: "Nicio identitate pe acest dispozitiv.",
  profPub: "Cheie publică",
  profLink: "Linkul profilului tău",
  copyLink: "Copiază linkul",
  linkCopied: "Link copiat",
  profExport: "Exportă identitatea",
  profExportWarn:
    "Cheia secretă va fi afișată pe ecran (text și cod QR). Ferește ecranul de priviri străine — oricine vede cheia devine tu.",
  profExportShow: "Arată cheia",
  profLang: "Limba",
  profSync: "Sincronizare între dispozitive",
  syncStarting: "sincronizarea pornește…",
  syncNoMailbox: "serviciul de sincronizare nu este disponibil",
  syncQueued: "{n} operații în așteptare",
  syncUpToDate: "totul trimis",
  syncLastReplay: "ultima primire: {n} operații la {time}",
  syncNoReplayYet: "nimic primit încă de pe alte dispozitive",
  syncGap: "Istoric incomplet — unele date de pe alte dispozitive au expirat înainte de a fi sincronizate.",
  syncPersistOn: "stocare persistentă activă",
  syncPersistOff: "stocare persistentă refuzată de browser",
  syncPersistUnknown: "stocare persistentă necunoscută",

  // contacts tab (M2)
  ctStarting: "contactele se încarcă — sincronizarea pornește…",
  ctSearchPh: "caută în contacte…",
  ctEmpty: "Niciun contact încă. Invită pe cineva sau acceptă o invitație primită.",
  ctNoMatch: "Niciun contact nu se potrivește căutării.",
  ctInvite: "Invită un contact",
  ctReceived: "Am primit o invitație",
  ctPendingTitle: "Invitații în așteptare",
  ctPendingHint: "Cine deschide linkul apare aici pentru confirmare.",
  ctPendingExpires: "expiră în {time}",
  ctExpDh: "{d}z {h}h",
  ctExpH: "{h}h",
  ctExpSoon: "sub o oră",
  ctInviteNameLabel: "Numele tău, așa cum îl va vedea contactul",
  ctInviteNamePh: "numele tău…",
  ctInviteTitle: "Invitație de contact",
  ctInviteExplain:
    "Trimite acest link contactului tău (sau arată-i codul QR). Poate fi acceptat de mai multe persoane și expiră în {hours} de ore.",
  ctInviteFailed: "Invitația nu a putut fi publicată — verifică conexiunea și încearcă din nou.",
  ctPasteTitle: "Acceptă o invitație",
  ctPasteExplain: "Lipește linkul de invitație primit sau scanează codul QR al contactului.",
  ctPastePh: "https://cautpartener.ro/#/add/…",
  ctPasteInvalid: "Acesta nu este un link de invitație valid.",
  ctOpenInvite: "Deschide invitația",
  ctGroupsTitle: "Grupuri",
  ctGroupCreate: "Grup nou",
  ctGroupNamePh: "numele grupului…",
  ctGroupMembers: "{n} membri",
  ctGroupRename: "Redenumește",
  ctGroupDelete: "Șterge grupul",
  ctGroupDeleteConfirm: "Grupul „{name}” va fi șters. Contactele lui rămân în agenda ta.",
  ctGroupEmpty: "Fără membri încă — bifează grupul în fișa unui contact.",
  ctNoGroups: "Niciun grup încă. Grupurile te ajută să împarți profilul și postările selectiv.",
  ctDetailGroups: "Grupurile contactului",
  ctAllContactsChip: "automat",
  ctAllContactsAuto: "grup automat — urmează agenda de contacte; fără bifă manuală",
  ctAllContactsNote:
    "„Toate contactele” este întreținut automat: urmează agenda de contacte și nu poate fi redenumit sau șters. Un contact adăugat ulterior primește și conținutul deja publicat pentru contacte, iar unul șters păstrează ce a văzut — cheia se schimbă doar pentru conținutul viitor. Dacă vrei, poți exclude manual un contact din grupul automat — excluderea este respectată (nu este re-înscris automat) și schimbă cheia pentru conținutul viitor.",
  ctAllContactsExclude: "Exclude din grupul automat",
  ctAllContactsExcluded: "exclus manual din grupul automat",
  ctRenamePh: "nume local…",
  ctRemove: "Șterge contactul",
  ctRemoveConfirm: "„{name}” va fi șters din contactele tale, pe toate dispozitivele tale.",
  ctDetailLink: "Link profil",
  ctSave: "Salvează",
  ctAdded: "Contact adăugat",
  ctRemovedToast: "Contact șters",

  // accept-invite flow (#/add/…)
  addLoading: "se caută invitația…",
  addCompareTitle: "Verifică amprenta",
  addCompareBody:
    "Compară cele 4 emoji cu ale contactului — la el apar în fila Profil. Confirmă doar dacă sunt identice; așa te asiguri că nimeni nu s-a strecurat între voi.",
  addConfirm: "Confirm — emoji identice",
  addOwnLink: "Acesta este propriul tău link de invitație — trimite-l unui contact; nu îl poți accepta tu.",
  addKnown: "{name} este deja în contactele tale.",
  addBadLink: "Link de invitație invalid.",
  addNotFound:
    "Invitația nu a fost găsită — poate a expirat (după {hours} de ore) sau nu s-a sincronizat încă. Încearcă din nou în câteva momente.",
  addRetry: "Caută din nou",
  addDepositFailed: "Cartea ta de contact nu a putut fi trimisă — verifică conexiunea și încearcă din nou.",
  addSuccess: "{name} a fost adăugat în contactele tale.",
  addGoContacts: "Vezi contactele",

  // ambiguous rendezvous identity (≥2 xPubs for the same pub in one room)
  addAmbiguous:
    "Invitația conține chei contradictorii pentru aceeași identitate — linkul ar putea fi compromis. Cere-i persoanei un link de invitație nou, pe alt canal.",
  ctAmbiguousWarn:
    "O invitație a primit chei contradictorii pentru aceeași identitate ({n}) — linkul ar putea fi compromis. Cere-i persoanei un link nou.",
  ctPartialSync: "sincronizare incompletă — unele cereri pot lipsi; reîncearcă mai târziu",

  // creator-side pending-invite confirmation
  inviteJoined: "{name} a acceptat invitația ta",
  ctQueuedTitle: "Cereri în așteptare",
  ctQueuedHint: "Prea multe cereri deodată — verifică-le pe rând, cu amprenta fiecăreia.",
  ctQueuedReview: "Verifică",
  ctQueuedDismiss: "Respinge",

  // conversations (M3)
  chatStarting: "conversațiile se încarcă — sincronizarea pornește…",
  chatEmpty: "Nicio conversație încă. Fiecare contact verificat este o conversație — adaugă contacte din fila Contacte.",
  chatStartHint: "începe conversația",
  chatYou: "eu",
  chatNewGroup: "Grup nou",
  chatGroupPick: "Alege membrii (cel mult {n} în total, cu tine)",
  chatGroupTooMany: "Prea mulți membri — cel mult {n}, inclusiv tu.",
  chatGroupNeedMembers: "Ai nevoie de cel puțin un contact verificat pentru un grup.",
  chatGroupCreate: "Creează grupul",
  chatGroupCreated: "Grup creat",
  chatGroupFailed: "Grupul nu a putut fi creat — încearcă din nou.",
  chatMembers: "{n} membri",
  chatGroupEvictNote:
    "Grupurile au membri ficși în această versiune: cine a primit cheia camerei o păstrează. Ca să excluzi pe cineva, creează un grup nou fără persoana respectivă.",
  chatOpening: "conversația se deschide…",
  chatUnknownConv: "Conversația nu a fost găsită.",
  chatNoMessages: "Niciun mesaj încă — scrie primul.",
  chatMsgPh: "scrie un mesaj…",
  chatSend: "Trimite",
  chatToday: "azi",
  chatYesterday: "ieri",
  chatHideTitle: "Șterge mesajul local",
  chatHideBody:
    "Mesajul dispare doar de pe acest dispozitiv — ceilalți membri își păstrează copia. O rețea fără servere nu poate retrage un mesaj deja trimis.",
  chatHide: "Șterge local",

  // media messages (M3b)
  chatAttach: "Trimite o fotografie",
  chatMic: "Mesaj vocal",
  chatImgPreviewTitle: "Trimiți fotografia?",
  chatImgFailed: "Fotografia nu a putut fi citită — formatul nu este suportat de acest browser.",
  chatImgTooBig: "Fotografia nu a putut fi comprimată suficient — încearcă alta.",
  chatImgLoading: "se încarcă…",
  chatImgUnavailable: "fotografia nu este disponibilă încă — se aduce de la ceilalți membri",
  chatVoiceUnsupported: "Înregistrarea audio nu este disponibilă în acest browser.",
  chatMicDenied: "Microfonul nu a putut fi pornit — verifică permisiunea din browser.",
  chatVoiceUnavailable: "mesajul vocal nu este disponibil încă",
  chatRecording: "înregistrare…",
  chatOnlineNow: "online acum",

  // activity categories (public profiles, M4; feed shards, M5)
  catGeneral: "General",
  catSport: "Sport",
  catDrumetii: "Drumeții",
  catCalatorii: "Călătorii",
  catDans: "Dans",
  catArta: "Artă & cultură",
  catJocuri: "Jocuri",
  catGastronomie: "Gastronomie",
  catInvatare: "Învățare",
  catMuzica: "Muzică",
  catAfaceri: "Afaceri",
  catTech: "IT & tech",
  catFilmeSeriale: "Filme & seriale",
  catCarti: "Cărți",
  catVoluntariat: "Voluntariat",
  catParinti: "Părinți",
  catAnimale: "Animale",
  catFoto: "Foto",
  catPartenerViata: "Partener de viață",

  // country-wide location (the counties themselves are proper nouns in geo.ts)
  countyRomania: "Toată România",

  // public profile editor (Profil tab, M4)
  pfTitle: "Profilul tău public",
  pfHint:
    "Profilul este semnat cu identitatea ta și poate fi citit de oricine are linkul, chiar când ești offline. Rămâne vizibil {hours} de ore de la ultima vizită — aplicația îl republică automat la fiecare deschidere.",
  pfName: "Nume afișat",
  pfBio: "Descriere",
  pfBioPh: "câteva rânduri despre tine și ce activități cauți…",
  pfCounty: "Județ",
  pfCountyNone: "alege județul…",
  pfCats: "Categorii de activități",
  pfCatsMax: "Poți alege cel mult 8 categorii.",
  pfPolicy: "Comentarii pe profil",
  pfPolicyOpen: "deschise",
  pfPolicyOff: "oprite",
  pfAvatar: "Fotografie de profil",
  pfAvatarPick: "Alege fotografia",
  pfAvatarRemove: "Șterge",
  pfAvatarBad: "Fotografia nu a putut fi folosită — formatul nu este suportat sau este prea mare.",
  pfPublish: "Publică profilul",
  pfPublishing: "se publică…",
  pfPublished: "Profil publicat",
  pfPublishInvalid: "Completează numele și județul înainte de publicare.",
  pfPublishFailed: "Profilul a fost salvat local, dar nu a putut fi publicat — verifică conexiunea.",
  pfLastPublished: "publicat: {time}",
  pfNeverPublished: "nepublicat încă",
  pfRepublished: "republicat automat la deschidere",
  pfPreview: "Vezi ca vizitator",

  // public profile view (#/u/…, M4)
  upLoading: "se caută profilul…",
  upInvalid: "Link de profil invalid.",
  upUnavailable:
    "Profil indisponibil — nepublicat încă, sau datele au expirat: fereastra publică este de {hours} de ore și se reînnoiește doar cât timp profilul are vizitatori sau proprietarul deschide aplicația.",
  upSpam: "Profil indisponibil — camera conține un volum suspect de date (posibil spam).",
  upNet: "Serviciul nu poate fi contactat — verifică conexiunea și încearcă din nou.",
  upRetry: "Încearcă din nou",
  upStale: "afișat din cache — posibil vechi",
  upOwn: "Acesta este profilul tău public, așa cum îl văd ceilalți.",
  upEdit: "Editează profilul",
  upMessage: "Trimite mesaj",
  upCreq: "Cere contact",
  upCreqSent: "cerere trimisă",
  upCreqTitle: "Cere contact",
  upCreqExplain:
    "Cererea ta (nume + mesaj) se depune semnată în cutia publică a persoanei. Dacă acceptă, veți deveni contacte verificate — cu confirmarea amprentei pe ambele părți.",
  upCreqMsg: "Mesaj (opțional)",
  upCreqMsgPh: "de ce vrei să luați legătura…",
  upCreqSend: "Trimite cererea",
  upCreqOk: "Cerere trimisă",
  upCreqFailed: "Cererea nu a putut fi trimisă — verifică conexiunea.",
  upNoIdentity: "Creează-ți o identitate în aplicație pentru a comenta sau a cere contact.",
  upComments: "Comentarii",
  upNoComments: "Niciun comentariu încă.",
  upCommentsOff: "Proprietarul profilului a oprit comentariile.",
  upCommentPh: "scrie un comentariu…",
  upCommentSend: "Comentează",
  upCommentPosted: "Comentariu publicat",
  upCommentFailed: "Comentariul nu a putut fi publicat — verifică conexiunea.",
  upCommentsTruncated: "istoric trunchiat — comentariile mai vechi nu au mai putut fi citite",
  upHide: "Ascunde",
  upBlock: "Blochează autorul",
  upModDone: "Moderare publicată — conținutul ascuns nu va mai fi reînnoit de tine",
  upModFailed: "Moderarea nu a putut fi publicată — verifică conexiunea.",
  upModNote:
    "Ascunderea nu poate retrage copiile deja descărcate de alții — profilul tău doar încetează să le mai reînnoiască.",

  // contact requests (creq/cack, M4)
  crTitle: "Cereri de contact",
  crHint: "Cereri primite prin profilul tău public. Verifică amprenta cu persoana înainte de a accepta.",
  crAcceptTitle: "{name} vrea să fie contactul tău",
  crAckTitle: "{name} a acceptat cererea ta de contact",
  crAckFailed: "Confirmarea nu a putut fi trimisă — încearcă din nou.",
  crMore: "…și altele — sunt afișate doar cele mai noi cereri.",

  // feed (M5)
  feedLoading: "se încarcă postările…",
  feedEmpty: "Nicio postare încă în această zonă — fii primul care publică!",
  feedRefresh: "Reîmprospătează",
  feedWindowNote:
    "fereastra publică este de {hours} de ore — postările trăiesc doar cât timp cineva le reînnoiește prin vizite",
  feedWindowEdge: "începutul ferestrei publice — nu există postări mai vechi",
  feedTruncated: "istoric trunchiat — volum suspect de date (posibil spam); postările mai vechi nu au mai fost citite",
  feedGap: "istoric incomplet — unele postări au expirat înainte de a putea fi citite",
  feedCapped: "…și altele — se afișează cel mult {n} postări pe zi de la același autor",
  feedLike: "Apreciază",
  feedLiked: "ai apreciat",
  feedLikedNote: "ai apreciat — aprecierile sunt semnate și definitive (nu pot fi retrase)",
  feedLikeFailed: "Aprecierea nu a putut fi publicată — verifică conexiunea.",
  feedImgUnavailable: "fotografia nu mai este disponibilă — a expirat din fereastra publică",
  feedShare: "Copiază linkul postării",
  feedHideForeign: "Ascunde (local)",
  feedDeleteLocal: "Șterge local",
  feedDeleteNote:
    "Șters local — copiile descărcate de alții pot persista până la expirarea ferestrei ({hours} de ore); o rețea fără servere nu poate retrage o postare publicată.",
  feedCompose: "Postare nouă",
  feedComposeTextPh: "ce activitate cauți sau propui…",
  feedComposeImgs: "Fotografii (cel mult 4)",
  feedComposeAddImg: "Adaugă fotografii",
  feedComposeShard: "Se publică în",
  feedComposeSecond: "Publică și într-o a doua categorie (opțional)",
  feedComposeNone: "— doar categoria curentă —",
  feedPublish: "Publică",
  feedPublishing: "se publică… {done}/{total}",
  feedPublished: "Postare publicată",
  feedPublishInvalid: "Scrie ceva sau adaugă o fotografie.",
  feedPublishFailed: "Postarea nu a putut fi publicată — verifică conexiunea.",

  // post permalink (#/p/…, M5)
  pvLoading: "se caută postarea…",
  pvNotFound:
    "Postarea nu a fost găsită — poate a expirat (fereastra publică este de {hours} de ore) sau linkul este greșit.",

  // profile posts grid (M5)
  upPosts: "Postări",
  upNoPosts: "Nicio postare regăsită.",
  upGridNote:
    "se afișează doar postările regăsite în categoriile declarate ale profilului, în fereastra publică de {hours} de ore",
  upGridPartial: "unele camere nu au putut fi citite — grila poate fi incompletă",

  // audience restriction (M5b) — profile editor
  pfRestrictedTitle: "Secțiuni restricționate",
  pfRestrictedHint:
    "Fiecare secțiune se criptează cu cheia unui grup de contacte înainte de publicare — doar membrii grupului o pot citi. Prezența unei secțiuni restricționate este vizibilă public; conținutul ei nu.",
  pfRestrictedHonesty:
    "Sinceritate: cine a fost în grup păstrează ce a primit deja. Scoaterea din grup schimbă cheia pentru conținutul viitor și resigilează profilul curent, dar nu poate retrage nimic deja văzut. Membrii actuali dețin cheia curentă a grupului.",
  pfRestrictedAdd: "Adaugă secțiune restricționată",
  pfRestrictedNoGroups: "Creează mai întâi un grup de contacte (fila Contacte) pentru a putea restricționa secțiuni.",
  pfRestrictedGroup: "Vizibilă grupului",
  pfRestrictedAbout: "Despre mine (doar pentru grup)",
  pfRestrictedAboutPh: "detalii vizibile doar grupului…",
  pfRestrictedContact: "Date de contact (doar pentru grup)",
  pfRestrictedContactPh: "telefon, e-mail…",
  pfRestrictedCustomAdd: "Adaugă câmp",
  pfRestrictedCustomLabelPh: "etichetă…",
  pfRestrictedCustomValPh: "valoare…",
  pfRestrictedRemove: "Șterge secțiunea",

  // audience restriction (M5b) — public profile + feed
  upSealedTitle: "Conținut restricționat",
  upSealedLocked: "conținut restricționat — vizibil doar unui grup ales de autor",
  upSealedNote:
    "Conținutul restricționat este criptat cu chei de grup. Cine a fost în grup păstrează ce a primit — excluderea oprește accesul la conținutul viitor, nu îl retrage pe cel deja văzut.",
  audVisibleToYou: "restricționat — vizibil pentru tine",
  feedAudLabel: "Cine vede postarea",
  feedAudPublic: "Public",
  feedAudNote:
    "Postarea se criptează cu cheia grupului: doar membrii îi văd textul. Existența postării, aprecierile și comentariile rămân publice, iar fotografiile nu sunt disponibile la postările restricționate.",
  feedLockedPost: "postare restricționată — vizibilă doar unui grup ales de autor",
  audPublicMetaNote: "postare restricționată: aprecierile și comentariile ei rămân publice",

  // activities (P1)
  feedSegPosts: "Postări",
  feedSegActs: "Activități",
  feedSegMatch: "Potriviri",

  // matching (P2) — pool cards + anonymous likes
  mtLoading: "se caută cărți…",
  mtNet: "Bazinul nu a putut fi citit — verifică conexiunea.",
  mtMyCardTitle: "Cartea mea de căutare",
  mtMyCardNone: "Nu ești vizibil în acest bazin. Activează o carte ca să apari în stiva celorlalți.",
  mtMyCardActive: "Cartea ta este activă în acest bazin — oricine îl răsfoiește o poate vedea.",
  mtMyCardRetired: "Cartea ta a fost retrasă din acest bazin.",
  mtBlurbLabel: "Descriere scurtă",
  mtBlurbPh: "ce cauți, când, la ce nivel…",
  mtActivate: "Activează cartea",
  mtEdit: "Editează",
  mtRetire: "Retrage cartea",
  mtCardSaved: "Carte publicată",
  mtCardRetiredToast: "Carte retrasă",
  mtCardFailed: "Cartea nu a putut fi publicată — verifică conexiunea.",
  mtNeedName: "Setează-ți mai întâi numele (în Profil) — el apare pe carte.",
  mtCardPublicNote:
    "Cartea este publică în bazinul ales (categorie + județ) și trăiește {hours} de ore de la ultima deschidere a aplicației.",
  mtLikedMeOne: "1 persoană te-a apreciat",
  mtLikedMeMany: "{n} persoane te-au apreciat",
  mtLikedMeNote:
    "Aprecierile sunt anonime până devin reciproce — nu se poate vedea de la cine sunt. Numărul contorizează jetoane, nu persoane: oricine poate fabrica asemenea depuneri, deci el poate fi umflat artificial.",
  mtSentPendingOne: "1 apreciere trimisă, încă fără răspuns",
  mtSentPending: "{n} aprecieri trimise, încă fără răspuns",
  mtInboxPartial: "căsuța nu a fost scanată complet — pot exista aprecieri încă necontorizate (posibil spam)",
  mtStackEmpty: "Nicio carte de arătat în acest bazin deocamdată — revino mai târziu.",
  mtStackPartial: "vedere parțială — bazinul conține prea multe depuneri (posibil spam)",
  mtLike: "Îmi place",
  mtSkip: "Sari",
  mtNoUndoNote: "O apreciere trimisă nu poate fi retrasă; săriturile sunt doar locale, fără „înapoi”.",
  mtLikeFailed: "Aprecierea nu a putut fi trimisă — verifică conexiunea.",
  mtLikeSent: "Apreciere trimisă — rămâne anonimă până la reciprocitate.",
  mtMutualToast: "Potrivire! Puteți vorbi acum.",
  mtMatchesTitle: "Potrivirile tale",
  mtNoMatches: "Nicio potrivire încă.",
  mtOpenChat: "Deschide conversația",
  mtMatchBadge: "potrivire",
  mtHonestNote:
    "Momentul depunerii unei aprecieri rămâne vizibil operatorului nodului, iar cine îți poate enumera cartea poate testa în forță potrivirea cu propria cheie. Cheia conversației unei potriviri provine din material creat de una dintre părți — confidențialitatea ei înseamnă încredere în celălalt, ca în orice conversație privată — iar operatorul nodului poate deduce că o potrivire a avut loc atunci când ambele părți se alătură în același timp unei camere noi.",

  // match chat (P3)
  mcAddContact: "Adaugă în contacte",
  mcAddIntro:
    "Îi trimiți cartea ta de vizită prin conversația criptată. Contactul se stabilește abia după ce amândoi comparați amprentele emoji.",
  mcCardSent: "Cartea de vizită a fost trimisă.",
  mcCardSendFailed: "Cartea de vizită nu a putut fi trimisă.",
  mcCardOffer: "{name} ți-a trimis cartea de vizită.",
  mcCardReview: "Verifică și adaugă",
  mcAlreadyContact: "Sunteți contacte.",
  actEmpty: "Nicio activitate viitoare în această zonă — propune una!",
  actLoadMore: "Mai multe activități",
  actCompose: "Activitate nouă",
  actEditTitle: "Editează activitatea",
  actTitleLabel: "Titlu",
  actTitlePh: "ce activitate propui…",
  actDescLabel: "Descriere",
  actDescPh: "detalii: nivel, cost, ce trebuie adus…",
  actStartLabel: "Începe la",
  actEndLabel: "Se termină la",
  actLocLabel: "Loc (opțional)",
  actLocPh: "unde vă întâlniți…",
  actVisLabel: "Cine vede activitatea",
  actVisPublic: "Public",
  actVisContacts: "Doar contactele mele",
  actContactsNote:
    "„Doar contactele mele” este un grup întreținut automat: un contact adăugat ulterior vede și activitățile deja publicate pentru contacte, iar un contact șters păstrează ce a văzut — cheia se schimbă doar pentru conținutul viitor.",
  actAudNote:
    "Titlul rămâne public; descrierea și locul se criptează cu cheia grupului. Participările (cine vine) rămân publice.",
  actPublish: "Publică activitatea",
  actSave: "Salvează modificările",
  actPublishInvalid: "Completează titlul și un interval valid (începutul înaintea sfârșitului, în viitor).",
  actPublishFailed: "Activitatea nu a putut fi publicată — verifică conexiunea.",
  actPublished: "Activitate publicată",
  actSaved: "Activitate actualizată",
  actJoin: "Particip",
  actLeave: "Nu mai particip",
  actJoinFailed: "Participarea nu a putut fi publicată — verifică conexiunea.",
  actGoingCount: "{n} participă",
  actGoingNone: "niciun participant încă",
  actCancelledBadge: "anulată",
  actLockedNote: "activitate restricționată — detaliile sunt vizibile doar unui grup ales de organizator",
  actJoinPublicNote: "activitate restricționată: participările (cine vine) rămân publice",
  actOrganizer: "organizator",
  actEdit: "Editează",
  actCancelAct: "Anulează activitatea",
  actCancelConfirm: "Activitatea „{title}” va fi marcată ca anulată pentru toți. Participările rămân vizibile.",
  actCancelYes: "Da, anuleaz-o",
  actCancelledToast: "Activitate anulată",
  actDetailGoing: "Participanți",
  actGoingMore: "…și încă {n}",
  actShare: "Copiază linkul activității",
  actWhen: "Când",
  actWhere: "Unde",

  // activity permalink (#/a/…, P1)
  avLoading: "se caută activitatea…",
  avNotFound:
    "Activitatea nu a fost găsită — poate a expirat (fereastra publică este de {hours} de ore) sau linkul este greșit.",

  // profile upcoming-activities strip (P1)
  upActs: "Activități viitoare",
  upNoActs: "Nicio activitate viitoare regăsită.",

  // about + honest limits (#/despre, M6)
  aboutLink: "Despre aplicație și limitele ei",
  aboutTitle: "Despre Caut Partener",
  aboutWhatTitle: "Ce este",
  aboutIntro:
    "Caut Partener este o rețea socială peer-to-peer fără servere de aplicație: profilurile, postările și mesajele circulă direct între dispozitivele membrilor sau printr-o cutie poștală temporară de retransmisie, care nu poate citi conversațiile private. Nu există conturi și nici o bază de date centrală — nimic nu este stocat permanent pe serverele cuiva, iar codul sursă este public.",
  aboutLimitsTitle: "Limitele oneste",
  aboutLimitsIntro:
    "O rețea fără servere face compromisuri pe care aplicațiile clasice le ascund. Acestea sunt ale noastre, pe față:",
  aboutLimWindow:
    "Fereastra publică este de {hours} de ore: profilurile și postările publice trăiesc doar cât timp cineva le reînnoiește prin vizite — nu există o arhivă permanentă.",
  aboutLimFeeds:
    "Feedurile sunt „best-effort”: nu sunt globale și nici consistente — vezi ce au reînnoit vizitatorii recenți, nu „tot ce există”.",
  aboutLimRetract:
    "Ștergerea nu este retragere: o postare sau un mesaj deja descărcat de alții nu poate fi retras; ștergerea oprește doar reînnoirea din partea ta.",
  aboutLimSpam:
    "Camerele publice sunt deschise, deci apărarea anti-spam există doar în aplicația ta: limite de afișare, liste de blocare locale și moderarea propriului profil.",
  aboutLimOperator:
    "Operatorul nodului de retransmisie poate citi conținutul public (semnat, dar necriptat) și poate asocia camerele publice cu identități. Camerele private rămân opace: nodul vede doar mărimi și momente.",
  aboutLimSybil:
    "Identitățile sunt gratuite și nelimitate (atac „Sybil” posibil) — încrederea vine din compararea amprentelor emoji, din regula „prima cheie rămâne” (TOFU) și din contactele verificate, nu de la o autoritate.",
  aboutLimForward:
    "Fără „forward secrecy” în conversațiile 1:1 și în interiorul unei epoci de grup: o cheie compromisă expune istoricul acelei camere sau epoci.",
  aboutLimRestricted:
    "La postările restricționate, existența postării, aprecierile și comentariile rămân publice — doar conținutul este criptat pentru grupul ales.",
  aboutLimMatching:
    "La potriviri, cartea ta de căutare este publică în bazinul ales. O apreciere trimisă este criptată și anonimă până la reciprocitate, dar nu poate fi retrasă, momentul depunerii rămâne vizibil operatorului, iar cine îți poate enumera cartea poate testa în forță, cu propria cheie, dacă tu l-ai apreciat.",
  aboutLimActivities:
    "La activitățile restricționate, titlul, intervalul orar și participările (cine vine) rămân publice — doar descrierea și locul sunt criptate. „Doar contactele mele” este un grup întreținut automat: un contact adăugat ulterior vede și activitățile deja publicate, iar unul șters păstrează ce a văzut.",
  aboutLimCalls:
    "Apelurile audio/video sunt doar 1-la-1 și merg doar când amândoi sunteți online în același timp — nu există apeluri de grup și nici mesagerie vocală. Sunetul și imaginea circulă criptate direct între dispozitive (sau printr-un releu TURN, care nu le poate citi, dar vede adresele IP și volumul de date). Un apel ratat lasă doar un marcaj în conversație.",
  aboutUpdatesTitle: "Versiune și actualizări",
  aboutUpdateHint:
    "Aplicația caută automat versiuni noi din când în când și la revenirea în aplicație; când una este gata, apare bannerul de actualizare.",
  aboutCheckUpdates: "Caută actualizări",
  aboutCheckStarted: "Se verifică — dacă există o versiune nouă, apare bannerul de actualizare.",
  aboutSourceTitle: "Cod sursă",
  aboutSourceBody: "Aplicația este open source (licență MIT). Codul complet poate fi citit și clonat de la:",

  // calls (P4)
  callAudio: "Apel audio",
  callVideo: "Apel video",
  callNeedOnline: "Apelurile funcționează doar când amândoi sunteți online în același timp — contactul nu este online acum.",
  callIncoming: "{name} te sună",
  callIncomingVideo: "{name} te sună cu video",
  callAcceptAudio: "Răspunde",
  callAcceptVideo: "Răspunde cu video",
  callDecline: "Respinge",
  callRinging: "Sună…",
  callConnecting: "Se conectează…",
  callDeclinedToast: "Apel respins.",
  callBusyToast: "Ocupat — este deja într-un apel.",
  callMissedToast: "Niciun răspuns.",
  callEndedToast: "Apel încheiat.",
  callFailedToast: "Apelul nu s-a putut conecta — verificați amândoi conexiunea.",
  callPermDenied: "Acces la microfon/cameră refuzat — apelul are nevoie de această permisiune.",
  callNoDevice: "Niciun microfon sau cameră de găsit pe acest dispozitiv.",
  callDeviceBusy: "Microfonul sau camera este folosită de altă aplicație.",
  callRecoverFailed: "Microfonul/camera nu au putut fi repornite — celălalt nu te mai aude. Închide și sună din nou.",
  callHangup: "Închide apelul",
  callMicToggle: "Microfon",
  callCamToggle: "Cameră",
  callFlip: "Schimbă camera",
  callMissedLine: "Apel ratat",
  callEndedLine: "Apel încheiat",
  callEndedLineDur: "Apel încheiat · {dur}",
  callP2PNote: "Apelul circulă direct între voi (criptat); un releu TURN poate vedea doar adresele IP și volumul de date.",

  // TOFU key-change warning
  tofuTitle: "Atenție: cheia contactului s-a schimbat",
  tofuBody:
    "Cheia de criptare a lui {name} diferă de cea pe care o ai salvată. Se întâmplă dacă și-a recreat identitatea — dar poate însemna și că altcineva încearcă să se dea drept el. Verifică direct cu contactul, pe alt canal, înainte să accepți.",
  tofuAccept: "Accept cheia nouă",
  tofuReject: "Resping",
  tofuRejected: "Cheia nouă a fost respinsă — contactul rămâne neschimbat.",
};

static mirror of HEAD · about · clone: git clone https://cod-sursa.cautpartener.ro/cautpartener.git