feat(app): redesigned interface, polls, drafts, forwarding and mentions
A new look across the app and a set of everyday messaging features. Interface - Home screen with Chats, Contacts and Settings tabs, a large title, search across chats and message text (diacritics-insensitive), filters and pinned chats. - Conversation view with a translucent header and composer, grouped bubbles, author avatars and colours in groups, swipe to reply, an "N new messages" marker, a jump-to-latest button and in-chat search. - Contact and group profiles: verification, shared photos, groups in common, disappearing messages, mute, block; members, admin badges, adding people, rename and leave for groups. - Full-screen photo viewer that pages through the whole conversation. - A stable avatar colour per person and a clearly visible read state. Messaging - Polls in chats and groups, single or multiple choice, with votes that can be changed or withdrawn; older clients see them as text. - Drafts survive leaving a chat and show in the chat list. - Forwarding of messages, photos, files and voice messages. - Notes to self: a local-only, encrypted chat that never reaches the relay. - @mentions in groups that notify even when the group is muted. - Typing indicators sent as ephemeral messages, opt-in and mutual like read receipts. - Delivery and read times per message and per group member. - Profile photos, cropped, resized and stripped of metadata, delivered encrypted to contacts. - Voice message playback at 1.5x and 2x. - Call buttons in 1:1 chats and call log entries. Fixes - Muted groups no longer notify: muting was checked against the author's chat instead of the group. - A blocked contact could unblock itself by changing its delivery address. - Read receipts no longer regress to delivered when a late delivery receipt arrives. - A message marked as failed corrects itself once it is delivered. - Double ticks in groups now mean delivered to every member.
This commit is contained in:
+128
-7
@@ -18,9 +18,23 @@
|
||||
"groupsRename": "Gruppe umbenennen",
|
||||
"groupsLeave": "Gruppe verlassen",
|
||||
"groupsLeftBanner": "Du bist nicht mehr in der Gruppe. Der Verlauf bleibt, neue Nachrichten kommen nicht mehr an.",
|
||||
"groupsMembersWithCount": "Mitglieder ({count})",
|
||||
"groupsYou": "Du",
|
||||
"groupsFounder": "Hat die Gruppe gegründet",
|
||||
"groupsAdmin": "Admin",
|
||||
"groupsMakeAdmin": "Zum Admin machen",
|
||||
"groupsDismissAdmin": "Adminrolle entziehen",
|
||||
"groupsRemoveMember": "Aus der Gruppe entfernen",
|
||||
"groupsRemoveMemberConfirmTitle": "{name} aus der Gruppe entfernen?",
|
||||
"groupsRemoveMemberConfirmBody": "Neue Nachrichten der Gruppe kommen dann nicht mehr an. Der bisherige Verlauf bleibt erhalten.",
|
||||
"groupsRemoveAction": "Entfernen",
|
||||
"groupsViewContact": "Kontakt anzeigen",
|
||||
"groupsAdminOnlyHint": "Nur Admins können Namen, Mitglieder und Admins der Gruppe ändern.",
|
||||
"groupsAdminOnlyCompatHint": "Nur Admins können die Gruppe umbenennen oder Admins ändern. Personen hinzufügen kann vorerst jeder, weil jemand in der Gruppe eine ältere Šepot-Version hat.",
|
||||
"groupsAdminActionFailed": "Änderung fehlgeschlagen: {error}",
|
||||
"groupsResyncNotice": "Die Gruppe gleicht sich mit dem Admin ab. Änderungen an Mitgliedern können sich kurz verzögern.",
|
||||
"groupsRejectedChangeNotice": "Jemand ohne Berechtigung hat versucht, die Gruppe zu ändern. Die Änderung wurde nicht übernommen.",
|
||||
"errorGroupNotAdmin": "Das kann nur ein Admin der Gruppe.",
|
||||
"errorGroupLastAdmin": "Du bist der einzige Admin. Mach zuerst jemand anderen zum Admin.",
|
||||
"groupsNameHint": "Gruppenname",
|
||||
"commonCancel": "Abbrechen",
|
||||
"commonSave": "Speichern",
|
||||
@@ -51,6 +65,12 @@
|
||||
"chatEditingMessage": "Nachricht bearbeiten",
|
||||
"chatReply": "Antwort",
|
||||
"chatActionReply": "Antworten",
|
||||
"chatActionForward": "Weiterleiten",
|
||||
"forwardTitle": "Weiterleiten an…",
|
||||
"forwardSearchHint": "Kontakt oder Gruppe suchen",
|
||||
"forwardEmpty": "Nichts gefunden",
|
||||
"forwardDone": "Weitergeleitet an {name}",
|
||||
"forwardFailed": "Weiterleiten fehlgeschlagen: {error}",
|
||||
"commonCopy": "Kopieren",
|
||||
"commonEdit": "Bearbeiten",
|
||||
"chatDeleteForMe": "Für mich löschen",
|
||||
@@ -68,6 +88,9 @@
|
||||
"attachmentTakePhoto": "Foto aufnehmen",
|
||||
"attachmentDocument": "Dokument",
|
||||
"attachmentTooLarge": "Datei ist zu groß (max. {maxMb} MB)",
|
||||
"attachmentKeepsMetadataTitle": "Foto enthält den Standort",
|
||||
"attachmentKeepsMetadataBody": "Aus diesem Fotoformat (z. B. HEIC) kann ich die Metadaten nicht entfernen. Es würde im Original gesendet, einschließlich Aufnahmeort und Angaben zum Telefon. Sicherer ist das Senden über die Galerie, dort werden die Metadaten entfernt.",
|
||||
"attachmentSendOriginal": "Original senden",
|
||||
"attachmentPickFailed": "Auswahl des Anhangs fehlgeschlagen: {error}",
|
||||
"attachmentSendFailed": "Senden des Anhangs fehlgeschlagen: {error}",
|
||||
"chatSendFailed": "Senden fehlgeschlagen: {error}",
|
||||
@@ -79,6 +102,7 @@
|
||||
"errorContactLinkIncomplete": "Dieser Link ist unvollständig — die andere Person hat ihn erstellt, bevor sie verbunden war. Bitte sie um einen neuen sepot://-Link.",
|
||||
"errorAttachmentTooLarge": "Anhang ist zu groß (max. {maxMb} MB)",
|
||||
"errorGroupNeedsMember": "Die Gruppe braucht mindestens 1 Mitglied",
|
||||
"errorAttachmentUnavailable": "Der Anhang ist nicht mehr auf diesem Telefon",
|
||||
"errorGroupMaxMembers": "Die Gruppe kann höchstens {maxMembers} Mitglieder haben",
|
||||
"errorMemberNoDeliveryAddress": "{displayName} hat keine Zustelladresse — frag nach einem neuen Link",
|
||||
"errorContactNoDeliveryAddress": "Der Kontakt hat keine Zustelladresse — bitte ihn um einen neuen sepot://-Link",
|
||||
@@ -163,9 +187,36 @@
|
||||
"attachmentOpenFailed": "Öffnen des Anhangs fehlgeschlagen: {error}",
|
||||
"commonFile": "Datei",
|
||||
"chatListNewConversation": "Neue Unterhaltung",
|
||||
"chatListPhotoWithCaptionPreview": "📷 {caption}",
|
||||
"chatListFilePreview": "📎 {fileName}",
|
||||
"chatListReadReceiptPreview": "Gelesen",
|
||||
"chatListDraft": "Entwurf",
|
||||
"notesTitle": "Notizen für mich",
|
||||
"notesSubtitle": "Nur auf diesem Telefon, verschlüsselt",
|
||||
"callVoice": "Anrufen",
|
||||
"callVideo": "Videoanruf",
|
||||
"callStatusRinging": "Klingelt…",
|
||||
"callIncomingVoice": "Eingehender Anruf",
|
||||
"callIncomingVideo": "Eingehender Videoanruf",
|
||||
"callStatusConnecting": "Verbinde…",
|
||||
"callEnded": "Anruf beendet",
|
||||
"callEndedBusy": "Besetzt",
|
||||
"callEndedRejected": "Anruf abgelehnt",
|
||||
"callEndedUnanswered": "Keine Antwort",
|
||||
"callEndedFailed": "Verbindung fehlgeschlagen",
|
||||
"callEncrypted": "Ende-zu-Ende-verschlüsselt",
|
||||
"callAccept": "Annehmen",
|
||||
"callReject": "Ablehnen",
|
||||
"callMute": "Stummschalten",
|
||||
"callSpeaker": "Lautsprecher",
|
||||
"callCamera": "Kamera aus",
|
||||
"callSwitchCamera": "Kamera wechseln",
|
||||
"callHangUp": "Auflegen",
|
||||
"callLogMissed": "Verpasster Anruf",
|
||||
"callLogUnanswered": "Unbeantworteter Anruf",
|
||||
"callLogRejected": "Abgelehnter Anruf",
|
||||
"callLogBusy": "Besetzt",
|
||||
"callLogFailed": "Anruf fehlgeschlagen",
|
||||
"callLogVoice": "Anruf · {duration}",
|
||||
"callLogVideo": "Videoanruf · {duration}",
|
||||
"chatListTimeNow": "jetzt",
|
||||
"chatListTimeMinutes": "{minutes} Min.",
|
||||
"qrScanTitle": "QR-Code scannen",
|
||||
@@ -266,9 +317,9 @@
|
||||
"pinUnlockError": "Fehler beim Entsperren",
|
||||
"pushTitle": "Push-Benachrichtigungen",
|
||||
"pushModeOffDesc": "Nachrichten werden erst beim Öffnen der App abgerufen.",
|
||||
"pushModeUp": "UnifiedPush (empfohlen)",
|
||||
"pushModeUp": "UnifiedPush (ohne Google)",
|
||||
"pushModeUpDesc": "Google-frei — braucht die App ntfy (F-Droid/Play).",
|
||||
"pushModeFcm": "Google (FCM)",
|
||||
"pushModeFcm": "Google (FCM, Standard)",
|
||||
"pushModeFcmDesc": "Zuverlässig ohne zusätzliche App. Der Push-Token des Geräts geht an Google; der Inhalt der Nachrichten nie.",
|
||||
"pushSetupFailed": "Einrichtung der Push-Benachrichtigungen fehlgeschlagen: {error}",
|
||||
"pushHintOff": "Nachrichten kommen erst an, wenn du Šepot öffnest — keine Weckrufe eingerichtet.",
|
||||
@@ -280,7 +331,7 @@
|
||||
"pushPickDistributorTitle": "Distributor wählen",
|
||||
"pushSubtitleUnifiedPush": "UnifiedPush · {distributor}",
|
||||
"pushNoDistributorFallback": "kein Distributor",
|
||||
"pushSubtitleFcm": "Google (FCM) — schnell, opt-in",
|
||||
"pushSubtitleFcm": "Google (FCM)",
|
||||
"restoreErrorNameRequired": "Gib einen Anzeigenamen ein.",
|
||||
"restoreErrorWordCount": "{wordCount, plural, one{Die Phrase hat 1 Wort, benötigt werden {requiredWords}.} other{Die Phrase hat {wordCount} Wörter, benötigt werden {requiredWords}.}}",
|
||||
"restoreErrorInvalidPhrase": "Die Phrase ist ungültig — prüfe die Wörter und ihre Reihenfolge.",
|
||||
@@ -364,5 +415,75 @@
|
||||
"photoPreviewSend": "Senden",
|
||||
"photoPreviewTextDialogTitle": "Text auf dem Foto",
|
||||
"photoPreviewRemoveText": "Entfernen",
|
||||
"photoPreviewDecodeFailed": "Foto konnte nicht geladen werden"
|
||||
"photoPreviewDecodeFailed": "Foto konnte nicht geladen werden",
|
||||
"chatActionInfo": "Nachrichteninfo",
|
||||
"messageInfoSent": "Gesendet",
|
||||
"messageInfoDelivered": "Zugestellt",
|
||||
"messageInfoRead": "Gelesen",
|
||||
"messageInfoPending": "noch nicht",
|
||||
"messageInfoReadReceiptsOff": "Wann deine Nachrichten gelesen wurden, siehst du nur, wenn du selbst Lesebestätigungen teilst (Einstellungen).",
|
||||
"chatStatusReadAt": "Gelesen {time}",
|
||||
"chatStatusDeliveredAt": "Zugestellt {time}",
|
||||
"groupsAddMembers": "Mitglieder hinzufügen",
|
||||
"groupsAddMembersAction": "Hinzufügen",
|
||||
"groupsAddMembersFailed": "Hinzufügen fehlgeschlagen: {error}",
|
||||
"groupsNoContactsToAdd": "Alle deine Kontakte sind schon in der Gruppe. Füge neue Personen zuerst per QR-Code zu deinen Kontakten hinzu.",
|
||||
"navChats": "Chats",
|
||||
"chatListNewChat": "Neuer Chat",
|
||||
"chatListSearchHint": "Chats und Nachrichten durchsuchen",
|
||||
"chatFilterAll": "Alle",
|
||||
"chatFilterUnread": "Ungelesen",
|
||||
"chatFilterGroups": "Gruppen",
|
||||
"chatFilterArchive": "Archiv",
|
||||
"chatListNoResults": "Nichts gefunden.",
|
||||
"chatListFilterEmpty": "Hier ist noch nichts.",
|
||||
"chatListPin": "Anheften",
|
||||
"chatListUnpin": "Lösen",
|
||||
"chatOpenProfile": "Profil anzeigen",
|
||||
"groupsProfile": "Gruppeninfo",
|
||||
"chatSearchHint": "Im Chat suchen",
|
||||
"chatSearchNoMatches": "Keine",
|
||||
"chatSearchCounter": "{current} von {total}",
|
||||
"chatSearchOlder": "Ältere Treffer",
|
||||
"chatSearchNewer": "Neuerer Treffer",
|
||||
"chatUnreadDivider": "{count, plural, one{1 neue Nachricht} other{{count} neue Nachrichten}}",
|
||||
"chatJumpToLatest": "Zu den neuesten",
|
||||
"chatAttach": "Anhängen",
|
||||
"chatSend": "Senden",
|
||||
"chatRecordVoice": "Sprachnachricht aufnehmen",
|
||||
"profileSharedMedia": "Geteilte Medien",
|
||||
"profileMessage": "Nachricht",
|
||||
"profileSearch": "Suchen",
|
||||
"profileUnmute": "Ton an",
|
||||
"profileDisappearing": "Verschwinden",
|
||||
"profileCommonGroups": "Gemeinsame Gruppen",
|
||||
"profileSafetyNumber": "Sicherheitsnummer",
|
||||
"profileSafetyNumberHint": "Persönlich oder per QR-Code vergleichen",
|
||||
"profileVerifiedInPerson": "Persönlich verifiziert",
|
||||
"profileVerifyNow": "Kontakt verifizieren",
|
||||
"profileAdd": "Hinzufügen",
|
||||
"profileGroupSubtitle": "Gruppe · {members} · erstellt am {date}",
|
||||
"profileMembersOfMax": "{count} von {max}",
|
||||
"chatTyping": "schreibt…",
|
||||
"chatTypingNamed": "{name} schreibt…",
|
||||
"chatTypingSeveral": "Mehrere schreiben…",
|
||||
"settingsTypingTitle": "Tippindikator",
|
||||
"settingsTypingSubtitle": "Gegenseitig — wer nicht teilt, sieht nichts (standardmäßig aus)",
|
||||
"pollAttach": "Umfrage",
|
||||
"pollCreateTitle": "Neue Umfrage",
|
||||
"pollQuestion": "Frage",
|
||||
"pollOptionHint": "Option {number}",
|
||||
"pollAddOption": "Option hinzufügen",
|
||||
"pollRemoveOption": "Option entfernen",
|
||||
"pollAllowMultiple": "Mehrere Antworten erlauben",
|
||||
"pollSingle": "Umfrage",
|
||||
"pollMulti": "Umfrage, Mehrfachauswahl",
|
||||
"pollVoters": "{count, plural, =0{noch keine Stimmen} one{1 Stimme} other{{count} Stimmen}}",
|
||||
"pollFallback": "Umfrage: {question}",
|
||||
"pollFallbackUpdate": "Zum Abstimmen Šepot aktualisieren.",
|
||||
"profilePhotoEdit": "Profilbild ändern",
|
||||
"profilePhotoPick": "Foto auswählen",
|
||||
"profilePhotoRemove": "Foto entfernen",
|
||||
"profilePhotoHint": "Nur deine Chatpartner sehen es — Ende-zu-Ende-verschlüsselt wie Nachrichten. Standort und Fotodaten werden nicht gesendet.",
|
||||
"profilePhotoFailed": "Foto konnte nicht gesetzt werden: {error}"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user