Compare commits

...

9 Commits
main ... 5.43.x

Author SHA1 Message Date
Scott Nonnenberg 2270c97435 v5.43.0 2022-05-12 12:55:11 -07:00
Scott Nonnenberg d6b6257c8b Update strings 2022-05-12 12:27:56 -07:00
automated-signal 7706f8c695
Timeline: Use messageChangeCounter to mark messages read less often
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2022-05-11 16:02:21 -07:00
automated-signal 01a9d3d3ff
Update electron to 18.2.2
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2022-05-11 14:59:25 -07:00
automated-signal f416155186
Timeline: When scrolling far into history, discard newest messages
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2022-05-10 18:08:01 -07:00
automated-signal 19fe677d52
Ensure source is not required for incoming sync messages
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2022-05-09 12:10:33 -07:00
automated-signal 0997b27e1c
Update to RingRTC v2.20.5
Co-authored-by: Jim Gustafson <jim@signal.org>
2022-05-06 11:58:20 -07:00
automated-signal 307b6976ad
JobQueue: If job data does not parse, delete it from database
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2022-05-05 15:19:28 -07:00
automated-signal 8614638eb9
sendNormalMessage: Only send just sync message in Note to Self, groups
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2022-05-05 09:59:56 -07:00
19 changed files with 583 additions and 207 deletions

View File

@ -974,7 +974,7 @@
"description": "Confirmation dialog message for when the voice recording is interrupted due to app losing focus"
},
"voiceNoteLimit": {
"message": "Τα φωνητικά μηνύματα έχουν περιορισμό μίας ώρας. Η καταγραφή θα σταματήσει αν μεταβείτε σε άλλη εφαρμογή.",
"message": "Τα φωνητικά μηνύματα έχουν περιορισμό μίας ώρας. Η καταγραφή θα σταματήσει αν μεταβείς σε άλλη εφαρμογή.",
"description": "Shown in toast to warn user about limited time and that window must be in focus"
},
"voiceNoteMustBeOnlyAttachment": {
@ -1074,7 +1074,7 @@
}
},
"cannotUpdateRequireManualDetail": {
"message": "Το Signal δεν μπόρεσε να ενημερωθεί. Επισκεφτείτε το $url$ για να το εγκαταστήσετε χειροκίνητα. Έπειτα,$support$ γι' αυτό το πρόβλημα.",
"message": "Το Signal δεν μπόρεσε να ενημερωθεί. Πήγαινε στο $url$ για να το εγκαταστήσεις χειροκίνητα. Έπειτα,$support$ γι' αυτό το πρόβλημα.",
"description": "Shown if a general error happened while trying to install update package and manual update is required",
"placeholders": {
"url": {
@ -2406,7 +2406,7 @@
"description": "Shown if request to Signal servers to find username fails"
},
"Toast--failed-to-fetch-phone-number": {
"message": "Αποτυχία λήψης του τηλεφωνικού αριθμού. Ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.",
"message": "Αποτυχία λήψης του τηλεφωνικού αριθμού. Έλεγξε τη σύνδεσή σου και προσπάθησε ξανά.",
"description": "Shown if request to Signal servers to find phone number fails"
},
"startConversation--username-not-found": {
@ -6362,7 +6362,7 @@
"description": "aria-label for the number select box"
},
"DisappearingTimeDialog__label--units": {
"message": "Χρονική μονάδα",
"message": "Μονάδα χρόνου",
"description": "aria-label for the units of time select box"
},
"DisappearingTimeDialog__title": {
@ -6812,7 +6812,7 @@
"description": "Second line of the dialog displayed when Windows installer can't close application automatically and needs user intervention to complete the installation."
},
"NSIS__appRunning": {
"message": "Το $appName$ εκτελείται ήδη. \nΚάντε κλικ στο ΟΚ για κλείσιμο.\nΑν δεν κλείνει, δοκιμάστε να το κλείσετε εσείς.",
"message": "Το $appName$ εκτελείται ήδη. \nΠάτα ΟΚ για κλείσιμο.\nΑν δεν κλείνει, δοκίμασε να το κλείσεις χειροκίνητα.",
"description": "The contents of a dialog displayed when Windows installer detect that the application is running and asks user to close it. Note: please keep the line breaks so that the text occupies three separate lines",
"placeholders": {
"appName": {
@ -6822,11 +6822,11 @@
}
},
"NSIS__decompressionFailed": {
"message": "Αποτυχία αποσυμπίεσης των αρχείων. Παρακαλούμε ξαναπροσπαθήστε την εγκατάσταση.",
"message": "Αποτυχία αποσυμπίεσης των αρχείων. Παρακαλούμε προσπάθησε να εγκαταστήσεις ξανά.",
"description": "Displayed when Windows installer cannot decompress application files"
},
"NSIS__uninstallFailed": {
"message": "Δεν ήταν δυνατή η απεγκατάσταση των παλιών αρχείων εφαρμογής. Ξαναπροσπαθήστε την απεγκατάσταση αργότερα.",
"message": "Δεν ήταν δυνατή η απεγκατάσταση των παλιών αρχείων εφαρμογής. Προσπάθησε την απεγκατάσταση ξανά αργότερα.",
"description": "Displayed when Windows installer cannot uninstall the old application"
},
"CrashReportDialog__title": {
@ -7072,7 +7072,7 @@
"description": "aria-label for the story list button"
},
"StoryListItem__unhide": {
"message": "Show stories",
"message": "Εμφάνιση ιστοριών",
"description": "Label for menu item to un-hide the story"
},
"StoryListItem__hide": {
@ -7112,7 +7112,7 @@
"description": "Release notes for v5.40"
},
"WhatsNew__v5.40--2": {
"message": "Ευχαριστούμε τους συμμετέχοντες πάνω στον ανοιχτό κώδικα, $dsanders11$ και $yusufsahinhamza$, για τη συνεισφορά τους στις βελτιώσεις αυτές.",
"message": "Ευχαριστούμε τους συνεισφέροντες στον ανοιχτού κώδικα, $dsanders11$ και $yusufsahinhamza$, για τη συνεισφορά τους στις βελτιώσεις αυτές.",
"description": "Release notes for v5.40",
"placeholders": {
"dsanders11": {

View File

@ -221,6 +221,10 @@
"message": "این مکالمه‌ها بایگانی شده‌اند و فقط درصورت دریافت پیام جدید در جعبه دریافت نمایش داده می‌شوند.",
"description": "Shown at the top of the archived conversations list in the left pane"
},
"noArchivedConversations": {
"message": "No archived conversations.",
"description": "Shown at the top of the archived conversations list in the left pane if there is no any archived conversation"
},
"archiveConversation": {
"message": "بایگانی",
"description": "Shown in menu for conversation, and moves conversation out of main conversation list"
@ -5892,7 +5896,7 @@
"description": "Information shown below the invite list"
},
"PendingRequests--block--button": {
"message": "Block request",
"message": "مسدود کردن درخواست",
"description": "Shown in timeline if users cancel their request to join a group via a group link"
},
"PendingRequests--block--title": {
@ -6353,6 +6357,14 @@
"message": "زمان سفارشی",
"description": "Text for an option in Conversation Details Disappearing Messages setting when user previously selected custom time"
},
"DisappearingTimeDialog__label--value": {
"message": "Number",
"description": "aria-label for the number select box"
},
"DisappearingTimeDialog__label--units": {
"message": "Unit of time",
"description": "aria-label for the units of time select box"
},
"DisappearingTimeDialog__title": {
"message": "زمان سفارشی",
"description": "Title for the custom disappearing message timeout dialog"
@ -6799,6 +6811,24 @@
"message": "لطفاً آن را بصورت دستی ببندید و برای ادامه روی تلاش مجدد کلیک کنید",
"description": "Second line of the dialog displayed when Windows installer can't close application automatically and needs user intervention to complete the installation."
},
"NSIS__appRunning": {
"message": "$appName$ is running.\nClick OK to close it.\nIf it doesn't close, try closing it manually.",
"description": "The contents of a dialog displayed when Windows installer detect that the application is running and asks user to close it. Note: please keep the line breaks so that the text occupies three separate lines",
"placeholders": {
"appName": {
"content": "$1",
"example": "Signal"
}
}
},
"NSIS__decompressionFailed": {
"message": "Failed to decompress files. Please try running the installer again.",
"description": "Displayed when Windows installer cannot decompress application files"
},
"NSIS__uninstallFailed": {
"message": "Failed to uninstall old application files. Please try running the installer again.",
"description": "Displayed when Windows installer cannot uninstall the old application"
},
"CrashReportDialog__title": {
"message": "برنامه خراب شد",
"description": "A title of the dialog displayed when starting an application after a recent crash"
@ -6983,6 +7013,10 @@
"message": "Add a story",
"description": "Description hint to add a story"
},
"Stories__hidden-stories": {
"message": "Hidden stories",
"description": "Button label to go to hidden stories pane"
},
"Stories__list-empty": {
"message": "No recent stories to show right now",
"description": "Description for when there are no stories to show"
@ -7013,6 +7047,10 @@
"message": "Type a reply...",
"description": "Placeholder text for the story reply modal"
},
"StoryViewsNRepliesModal__no-replies": {
"message": "No replies yet",
"description": "Placeholder text for when there are no replies"
},
"StoryViewsNRepliesModal__tab--views": {
"message": "Views",
"description": "Title for views tab"
@ -7033,6 +7071,10 @@
"message": "Story",
"description": "aria-label for the story list button"
},
"StoryListItem__unhide": {
"message": "Show stories",
"description": "Label for menu item to un-hide the story"
},
"StoryListItem__hide": {
"message": "Hide story",
"description": "Label for menu item to hide the story"
@ -7065,28 +7107,22 @@
"message": "این نسخه شامل شماری از بهینه سازی های کوچک و رفع عیب برای تداوم اجرای راحت سیگنال می باشد",
"description": "Release notes for releases that only include bug fixes"
},
"WhatsNew__v5.36--1": {
"message": "Quickly scanning that group chat? There's more room for more messages on the screen at once. We now group sender's messages together if they're close together in time.",
"description": "Release notes for v5.36"
"WhatsNew__v5.40--1": {
"message": "Bug fixes including a fix to an issue that would sometimes make it difficult to click on menus. ",
"description": "Release notes for v5.40"
},
"WhatsNew__v5.36--2": {
"message": "When you perform a Delete for Everyone you'll now see a progress spinner letting you know whether it's been successfully sent or not. If it fails for some reason, you'll be able to retry too!",
"description": "Release notes for v5.36"
},
"WhatsNew__v5.37--1": {
"message": "We're keeping short messages short, by putting stuff like timestamps on the same line as the text. Now you've got more space on the screen for that quick 'hey' to check in on a friend.",
"description": "Release notes for v5.37"
},
"WhatsNew__v5.37--2": {
"message": "Missing sticker packs begone! Desktop should now be able to handle all sticker packs that your phone can!",
"description": "Release notes for v5.37"
},
"WhatsNew__v5.39--1": {
"message": "You can now add people to groups using just their phone number.",
"description": "Release notes for v5.39"
},
"WhatsNew__v5.39--2": {
"message": "Your favorite contacts are now just a few keystrokes away. Contact search now supports non-Latin alphabets like Cyrillic.",
"description": "Release notes for v5.39"
"WhatsNew__v5.40--2": {
"message": "Thanks to our open source contributors $dsanders11$ and $yusufsahinhamza$ for contributing to these improvements.",
"description": "Release notes for v5.40",
"placeholders": {
"dsanders11": {
"content": "$1",
"example": "dsanders11"
},
"yusufsahinhamza": {
"content": "$2",
"example": "yusufsahinhamza"
}
}
}
}

View File

@ -3508,7 +3508,7 @@
}
},
"MessageRequests--unblock-direct-confirm-body": {
"message": "תוכלו להתכתב ולהתקשר אחד לשני.",
"message": "תוכלו להתכתב ולהתקשר זה עם זה.",
"description": "Shown as the body in the confirmation modal for unblocking a private message request"
},
"MessageRequests--unblock-group-confirm-body": {

View File

@ -221,6 +221,10 @@
"message": "Ovi razgovori su arhivirani i prikazuju se na početnoj stranici samo ako primite nove poruke.",
"description": "Shown at the top of the archived conversations list in the left pane"
},
"noArchivedConversations": {
"message": "No archived conversations.",
"description": "Shown at the top of the archived conversations list in the left pane if there is no any archived conversation"
},
"archiveConversation": {
"message": "Arhiviraj",
"description": "Shown in menu for conversation, and moves conversation out of main conversation list"
@ -2382,7 +2386,7 @@
"description": "Label for header when starting a new conversation"
},
"stories": {
"message": "Stories",
"message": "Priče",
"description": "Label for header to go to stories view"
},
"contactSearchPlaceholder": {
@ -2916,7 +2920,7 @@
"description": "Appears on the cancel button in confirmation dialogs."
},
"MessageBody--read-more": {
"message": "Read more",
"message": "Pročitaj više",
"description": "When a message is too long this is the affordance to expand the message"
},
"Message--unsupported-message": {
@ -4154,7 +4158,7 @@
"description": "Shown if you click a group link and you have been forbidden from joining via the link"
},
"GroupV2--join--link-forbidden": {
"message": "You can't join this group via the group link because an admin removed you.",
"message": "Ne možete se pridružiti ovoj grupi putem veze grupe jer vas je administrator uklonio.",
"description": "Shown if you click a group link and you have been forbidden from joining via the link"
},
"GroupV2--join--prompt-with-approval": {
@ -6353,6 +6357,14 @@
"message": "Prilagođeno vrijeme",
"description": "Text for an option in Conversation Details Disappearing Messages setting when user previously selected custom time"
},
"DisappearingTimeDialog__label--value": {
"message": "Number",
"description": "aria-label for the number select box"
},
"DisappearingTimeDialog__label--units": {
"message": "Unit of time",
"description": "aria-label for the units of time select box"
},
"DisappearingTimeDialog__title": {
"message": "Prilagođeno vrijeme",
"description": "Title for the custom disappearing message timeout dialog"
@ -6799,6 +6811,24 @@
"message": "Please close it manually and click Retry to continue.",
"description": "Second line of the dialog displayed when Windows installer can't close application automatically and needs user intervention to complete the installation."
},
"NSIS__appRunning": {
"message": "$appName$ is running.\nClick OK to close it.\nIf it doesn't close, try closing it manually.",
"description": "The contents of a dialog displayed when Windows installer detect that the application is running and asks user to close it. Note: please keep the line breaks so that the text occupies three separate lines",
"placeholders": {
"appName": {
"content": "$1",
"example": "Signal"
}
}
},
"NSIS__decompressionFailed": {
"message": "Failed to decompress files. Please try running the installer again.",
"description": "Displayed when Windows installer cannot decompress application files"
},
"NSIS__uninstallFailed": {
"message": "Failed to uninstall old application files. Please try running the installer again.",
"description": "Displayed when Windows installer cannot uninstall the old application"
},
"CrashReportDialog__title": {
"message": "Application crashed",
"description": "A title of the dialog displayed when starting an application after a recent crash"
@ -6972,7 +7002,7 @@
"description": "Confirmation dialog description text for deleting a story"
},
"Stories__title": {
"message": "Stories",
"message": "Priče",
"description": "Title for the stories list"
},
"Stories__mine": {
@ -6983,6 +7013,10 @@
"message": "Add a story",
"description": "Description hint to add a story"
},
"Stories__hidden-stories": {
"message": "Hidden stories",
"description": "Button label to go to hidden stories pane"
},
"Stories__list-empty": {
"message": "No recent stories to show right now",
"description": "Description for when there are no stories to show"
@ -7013,6 +7047,10 @@
"message": "Type a reply...",
"description": "Placeholder text for the story reply modal"
},
"StoryViewsNRepliesModal__no-replies": {
"message": "Još nema odgovora",
"description": "Placeholder text for when there are no replies"
},
"StoryViewsNRepliesModal__tab--views": {
"message": "Views",
"description": "Title for views tab"
@ -7026,13 +7064,17 @@
"description": "aria-label for reaction button"
},
"StoryViewsNRepliesModal__reacted": {
"message": "Reacted to the story",
"message": "Reakcija na priču",
"description": "Description of someone reacting to a story"
},
"StoryListItem__label": {
"message": "Story",
"description": "aria-label for the story list button"
},
"StoryListItem__unhide": {
"message": "Show stories",
"description": "Label for menu item to un-hide the story"
},
"StoryListItem__hide": {
"message": "Hide story",
"description": "Label for menu item to hide the story"
@ -7054,7 +7096,7 @@
"description": "aria-label for image errors"
},
"TextAttachment__preview__link": {
"message": "Visit link",
"message": "Posjetite link",
"description": "Title for the link preview tooltip"
},
"WhatsNew__modal-title": {
@ -7065,28 +7107,22 @@
"message": "This version contains a number of small tweaks and bug fixes to keep Signal running smoothly.",
"description": "Release notes for releases that only include bug fixes"
},
"WhatsNew__v5.36--1": {
"message": "Quickly scanning that group chat? There's more room for more messages on the screen at once. We now group sender's messages together if they're close together in time.",
"description": "Release notes for v5.36"
"WhatsNew__v5.40--1": {
"message": "Bug fixes including a fix to an issue that would sometimes make it difficult to click on menus. ",
"description": "Release notes for v5.40"
},
"WhatsNew__v5.36--2": {
"message": "When you perform a Delete for Everyone you'll now see a progress spinner letting you know whether it's been successfully sent or not. If it fails for some reason, you'll be able to retry too!",
"description": "Release notes for v5.36"
},
"WhatsNew__v5.37--1": {
"message": "We're keeping short messages short, by putting stuff like timestamps on the same line as the text. Now you've got more space on the screen for that quick 'hey' to check in on a friend.",
"description": "Release notes for v5.37"
},
"WhatsNew__v5.37--2": {
"message": "Missing sticker packs begone! Desktop should now be able to handle all sticker packs that your phone can!",
"description": "Release notes for v5.37"
},
"WhatsNew__v5.39--1": {
"message": "You can now add people to groups using just their phone number.",
"description": "Release notes for v5.39"
},
"WhatsNew__v5.39--2": {
"message": "Your favorite contacts are now just a few keystrokes away. Contact search now supports non-Latin alphabets like Cyrillic.",
"description": "Release notes for v5.39"
"WhatsNew__v5.40--2": {
"message": "Thanks to our open source contributors $dsanders11$ and $yusufsahinhamza$ for contributing to these improvements.",
"description": "Release notes for v5.40",
"placeholders": {
"dsanders11": {
"content": "$1",
"example": "dsanders11"
},
"yusufsahinhamza": {
"content": "$2",
"example": "yusufsahinhamza"
}
}
}
}

View File

@ -7010,11 +7010,11 @@
"description": "Label for your stories"
},
"Stories__add": {
"message": "Add a story",
"message": "Tambahkan sebuah cerita",
"description": "Description hint to add a story"
},
"Stories__hidden-stories": {
"message": "Hidden stories",
"message": "Cerita tersembunyi",
"description": "Button label to go to hidden stories pane"
},
"Stories__list-empty": {
@ -7076,11 +7076,11 @@
"description": "Label for menu item to un-hide the story"
},
"StoryListItem__hide": {
"message": "Hide story",
"message": "Sembunyikan cerita",
"description": "Label for menu item to hide the story"
},
"StoryListItem__go-to-chat": {
"message": "Go to chat",
"message": "Pergi ke chat",
"description": "Label for menu item to go to conversation"
},
"StoryListItem__hide-modal--body": {

View File

@ -100,7 +100,7 @@
"description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information"
},
"editMenuDelete": {
"message": "Wissen",
"message": "Geselecteerde tekst wissen",
"description": "Edit menu command to remove the selected text"
},
"editMenuSelectAll": {
@ -1126,7 +1126,7 @@
"description": ""
},
"delete": {
"message": "Wissen",
"message": "Afwijzen",
"description": ""
},
"accept": {
@ -1244,7 +1244,7 @@
"description": "Shown on the drop-down menu for an individual message, deletes single message for everyone"
},
"deleteMessages": {
"message": "Wissen",
"message": "Gesprek wissen",
"description": "Menu item for deleting messages, title case."
},
"deleteConversationConfirmation": {
@ -1534,7 +1534,7 @@
"description": "Button tooltip label for turning on the camera"
},
"calling__button--audio__label": {
"message": "Microfoon dempen",
"message": "Micro­foon dempen",
"description": "Label under the audio button"
},
"calling__button--audio-disabled": {
@ -1896,7 +1896,7 @@
"description": "Details describing the always relay calls setting"
},
"permissions": {
"message": "Toestemmingen",
"message": "Machtigingen",
"description": "Header for permissions section of settings"
},
"mediaPermissionsDescription": {
@ -1924,11 +1924,11 @@
"description": "Shown when the user disables spellcheck to indicate that they must restart Signal."
},
"SystemTraySetting__minimize-to-system-tray": {
"message": "Minimaliseren naar systeemvak",
"message": "Minimaliseer naar systeemvak in plaats van taakbalk",
"description": "In the settings, shown next to the checkbox option for minimizing to the system tray"
},
"SystemTraySetting__minimize-to-and-start-in-system-tray": {
"message": "Geminimaliseerd naar systeemvak starten",
"message": "Houd Signal geminimaliseerd naar systeemvak wanneer het wordt gestart",
"description": "In the settings, shown next to the checkbox option for starting in the system tray"
},
"autoLaunchDescription": {
@ -3472,7 +3472,7 @@
}
},
"MessageRequests--message-direct-blocked": {
"message": "Wil je berichten van $name$ ontvangen, en sta je toe dat hij of zij je profielnaam en -foto kan zien? Je zult geen berichten ontvangen en je profiel zal voor hem of haar niet meer worden bijgewerkt totdat je hem of haar hebt gedeblokkeerd.",
"message": "Wil je berichten van $name$ ontvangen, en sta je toe dat hij of zij je profielnaam en -foto kan zien? Totdat je hem of haar hebt gedeblokkeerd zul je geen berichten of oproepen ontvangen en kan hij of zij veranderingen van je profiel niet zien.",
"description": "Shown as the message for a message request in a direct message with a blocked account",
"placeholders": {
"name": {
@ -3486,7 +3486,7 @@
"description": "Shown as the message for a message request in a group"
},
"MessageRequests--message-group-blocked": {
"message": "Wil je weer berichten van deze groep ontvangen, en sta je toe dat alle leden van de groep je profielnaam en -foto kunnen zien? Je zult geen berichten ontvangen en je profiel zal voor de leden van deze groep niet worden bijgewerkt totdat je de groep hebt gedeblokkeerd.",
"message": "Wil je weer berichten van deze groep ontvangen, en sta je toe dat alle leden van de groep je profielnaam en -foto kunnen zien? Totdat je de groep hebt gedeblokkeerd zul je geen berichten of oproepen ontvangen en kunnen leden van deze groep veranderingen van je profiel niet zien.",
"description": "Shown as the message for a message request in a blocked group"
},
"MessageRequests--block": {
@ -3574,7 +3574,7 @@
}
},
"MessageRequests--delete-direct": {
"message": "Wissen",
"message": "Gesprek wissen",
"description": "Shown as a button to let the user delete a direct message request"
},
"MessageRequests--delete-group": {
@ -4348,7 +4348,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-attributes--admins--other": {
"message": "$adminName$ heeft de instelling voor wie de groepsinformatie kan wijzigen naar Enkel beheerders ingesteld.",
"message": "$adminName$ heeft de instelling voor wie de groepsinformatie kan wijzigen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4358,15 +4358,15 @@
}
},
"GroupV2--access-attributes--admins--you": {
"message": "Je hebt de instelling voor wie de groepsinformatie kan wijzigen naar Enkel beheerders ingesteld.",
"message": "Je hebt de instelling voor wie de groepsinformatie kan wijzigen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-attributes--admins--unknown": {
"message": "Een beheerder heeft de instelling voor wie de groepsinformatie kan wijzigen naar Enkel beheerders ingesteld.",
"message": "Een beheerder heeft de instelling voor wie de groepsinformatie kan wijzigen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-attributes--all--other": {
"message": "$adminName$ heeft de instelling voor wie de groepsinformatie kan wijzigen naar Alle groepsleden ingesteld.",
"message": "$adminName$ heeft de instelling voor wie de groepsinformatie kan wijzigen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4376,15 +4376,15 @@
}
},
"GroupV2--access-attributes--all--you": {
"message": "Je hebt de instelling voor wie de groepsinformatie kan wijzigen naar Alle groepsleden ingesteld.",
"message": "Je hebt de instelling voor wie de groepsinformatie kan wijzigen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-attributes--all--unknown": {
"message": "Een beheerder heeft de instelling voor wie de groepsinformatie kan wijzigen naar Alle groepsleden ingesteld.",
"message": "Een beheerder heeft de instelling voor wie de groepsinformatie kan wijzigen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-members--admins--other": {
"message": "$adminName$ heeft de instelling voor wie de groepsleden kan wijzigen naar Enkel beheerders ingesteld.",
"message": "$adminName$ heeft de instelling voor wie groepslidmaatschap kan aanpassen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4394,15 +4394,15 @@
}
},
"GroupV2--access-members--admins--you": {
"message": "Je hebt de instelling voor wie de groepsleden kan wijzigen naar Enkel beheerders ingesteld.",
"message": "Je hebt de instelling voor wie groepslidmaatschap kan aanpassen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-members--admins--unknown": {
"message": "Een beheerder heeft de instelling voor wie de groepsleden kan wijzigen naar Enkel beheerders ingesteld.",
"message": "Een beheerder heeft de instelling voor wie groepslidmaatschap kan aanpassen op Uitsluitend beheerders ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-members--all--other": {
"message": "$adminName$ heeft de instelling voor wie de groepsleden kan wijzigen naar Alle groepsleden ingesteld.",
"message": "$adminName$ heeft de instelling voor wie groepslidmaatschap kan aanpassen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4412,11 +4412,11 @@
}
},
"GroupV2--access-members--all--you": {
"message": "Je hebt de instelling voor wie de groepsleden kan wijzigen naar Alle groepsleden ingesteld.",
"message": "Je hebt de instelling voor wie groepslidmaatschap kan aanpassen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-members--all--unknown": {
"message": "Een beheerder heeft de instelling voor wie de groepsleden kan wijzigen naar Alle groepsleden ingesteld.",
"message": "Een beheerder heeft de instelling voor wie groepslidmaatschap kan aanpassen op Alle groepsleden ingesteld.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--access-invite-link--disabled--you": {
@ -5328,11 +5328,11 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "Je hebt de groepsinstellingen aangepast om alleen beheerders de mogelijkheid te geven om berichten te verzenden.",
"message": "Je hebt de groepsinstellingen aangepast om uitsluitend beheerders de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
"message": "$memberName$ heeft de groepsinstellingen aangepast om alleen beheerders de mogelijkheid te geven om berichten te verzenden.",
"message": "$memberName$ heeft de groepsinstellingen aangepast om uitsluitend beheerders de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -5342,15 +5342,15 @@
}
},
"GroupV2--announcements--admin--unknown": {
"message": "De groepsinstellingen zijn aangepast om alleen beheerders de mogelijkheid te geven om berichten te verzenden.",
"message": "De groepsinstellingen zijn aangepast om uitsluitend beheerders de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "Je hebt de groepsinstellingen aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden.",
"message": "Je hebt de groepsinstellingen aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
"message": "$memberName$ heeft de groepsinstellingen aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden.",
"message": "$memberName$ heeft de groepsinstellingen aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -5360,7 +5360,7 @@
}
},
"GroupV2--announcements--member--unknown": {
"message": "De groepsinstellingen zijn aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden.",
"message": "De groepsinstellingen zijn aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden en oproepen te beginnen.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV1--Migration--disabled": {
@ -5590,7 +5590,7 @@
"description": "Title for the modal to unmute a chat"
},
"ConversationDetails--group-link": {
"message": "Groepsverwijzing voor deze groep",
"message": "Groepsverwijzing",
"description": "This is the label for the group link management panel"
},
"ConversationDetails--disappearing-messages-label": {
@ -5610,7 +5610,7 @@
"description": "This is the label for notifications in the conversation details screen"
},
"ConversationDetails--group-info-label": {
"message": "Wie de groepsinformatie kan aanpassen",
"message": "Groepsinformatie aanpassen",
"description": "This is the label for the 'who can edit the group' panel"
},
"ConversationDetails--group-info-info": {
@ -5618,19 +5618,19 @@
"description": "This is the additional info for the 'who can edit the group' panel"
},
"ConversationDetails--add-members-label": {
"message": "Wie mag nieuwe leden toevoegen?",
"message": "Groepsleden toevoegen",
"description": "This is the label for the 'who can add members' panel"
},
"ConversationDetails--add-members-info": {
"message": "Kies wie leden mag toevoegen aan deze groep.",
"message": "Kies wie leden mogen toevoegen aan deze groep.",
"description": "This is the additional info for the 'who can add members' panel"
},
"ConversationDetails--announcement-label": {
"message": "Wie berichten kan verzenden",
"message": "Berichten verzenden & oproepen beginnen",
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--announcement-info": {
"message": "Kies wie berichten mag verzenden aan deze groep.",
"message": "Kies wie berichten aan de groep mogen verzenden en oproepen mogen beginnen.",
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--requests-and-invites": {
@ -6236,7 +6236,7 @@
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
"message": "Als je er voor kiest om de verificatie dat je echt een mens bent over te slaan, dan kan het zijn dat je sommige berichten niet ontvangt en dat het niet langer mogelijk is om berichten te verzenden.",
"message": "Als je er voor kiest om de verificatie dat je echt een mens bent over te slaan, dan kan het zijn dat je sommige berichten niet ontvangt en dat het niet langer mogelijk is om berichten te verzenden en oproepen te beginnen.",
"description": "Body of the captcha dialog that can be closed"
},
"CaptchaDialog--can_close__skip-verification": {
@ -6326,7 +6326,7 @@
"description": "Option in the custom color bubble context menu"
},
"ChatColorPicker__context--delete": {
"message": "Wissen",
"message": "Kleur wissen",
"description": "Option in the custom color bubble context menu"
},
"CustomColorEditor__solid": {
@ -6544,7 +6544,7 @@
"description": "Shown in dialog body if user has saved an empty string to delete their username"
},
"ProfileEditor--username--confirm-delete-button": {
"message": "Wissen",
"message": "Gebruikersnaam wissen",
"description": "Shown in dialog button if user has saved an empty string to delete their username"
},
"ProfileEditor--about-placeholder": {
@ -6690,7 +6690,7 @@
}
},
"Preferences--system": {
"message": "Systeemstandaard volgen",
"message": "Systeem",
"description": "Title for system type settings"
},
"Preferences--zoom": {

View File

@ -7112,7 +7112,7 @@
"description": "Release notes for v5.40"
},
"WhatsNew__v5.40--2": {
"message": "Thanks to our open source contributors $dsanders11$ and $yusufsahinhamza$ for contributing to these improvements.",
"message": "Agradecemos aos nossos colaboradores de código aberto $dsanders11$ e $yusufsahinhamza$ por contribuírem para estas melhorias.",
"description": "Release notes for v5.40",
"placeholders": {
"dsanders11": {

View File

@ -222,7 +222,7 @@
"description": "Shown at the top of the archived conversations list in the left pane"
},
"noArchivedConversations": {
"message": "No archived conversations.",
"message": "Arşivlenmiş konuşma yok.",
"description": "Shown at the top of the archived conversations list in the left pane if there is no any archived conversation"
},
"archiveConversation": {
@ -464,7 +464,7 @@
"description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified."
},
"debugLogExplanation": {
"message": "When you click Submit, your log will be posted online for 30 days at a unique, unpublished URL. You may Save it locally first.",
"message": "Gönder'i tıkladığınızda, günlüğünüz benzersiz, yayınlanmamış bir URL'de 30 gün boyunca çevrimiçi olarak yayınlanacaktır. Önce yerel olarak kaydedebilirsiniz.",
"description": "Description of what will happen with your debug log"
},
"debugLogError": {
@ -476,11 +476,11 @@
"description": "Title of the success page for submitting a debug log"
},
"debugLogSuccessNextSteps": {
"message": "Debug log uploaded. When you contact support, copy the URL below and attach it along with a description of the problem you saw and steps to reproduce it.",
"message": "Hata ayıklama günlüğü yüklendi. Destek ekibiyle iletişime geçtiğinizde, aşağıdaki URL'yi kopyalayın ve gördüğünüz sorunun açıklaması ve yeniden oluşturma adımlarıyla birlikte ekleyin.",
"description": "Explanation of next steps to take when submitting debug log"
},
"debugLogLogIsIncomplete": {
"message": "... to see the full log, click Save",
"message": "... tüm günlüğü görmek için, Kaydet'e tıklayın",
"description": "Shown as the text for the copy button on the debug log screen"
},
"debugLogCopy": {
@ -836,11 +836,11 @@
"description": "Shown to separate the types of search results"
},
"findByUsernameHeader": {
"message": "Find by username",
"message": "Kullanıcı adına göre bul",
"description": "Shown when search could be a valid username, with one sub-item that will kick off the search"
},
"findByPhoneNumberHeader": {
"message": "Find by phone number",
"message": "Telefon numarasına göre bul",
"description": "Shown when search could be a valid phone number, with one sub-item that will kick off the search"
},
"at-username": {
@ -974,7 +974,7 @@
"description": "Confirmation dialog message for when the voice recording is interrupted due to app losing focus"
},
"voiceNoteLimit": {
"message": "Voice messages are limited to one hour. Recording will stop if you switch to another app.",
"message": "Sesli iletiler bir saat ile sınırlıdır. Farklı bir uygulamaya geçtiğinizde kayıt durdurulacaktır.",
"description": "Shown in toast to warn user about limited time and that window must be in focus"
},
"voiceNoteMustBeOnlyAttachment": {
@ -1074,7 +1074,7 @@
}
},
"cannotUpdateRequireManualDetail": {
"message": "Signal couldn't update. Visit $url$ to install it manually. Then, $support$ about this problem",
"message": "Signal güncellenemedi. El ile kurmak için $url$ adresini ziyaret edin. Sonra, bu sorun hakkında $support$",
"description": "Shown if a general error happened while trying to install update package and manual update is required",
"placeholders": {
"url": {
@ -1228,7 +1228,7 @@
"description": "Shown on the drop-down menu for an individual message, but only if it is an outgoing message that failed to send"
},
"retryDeleteForEveryone": {
"message": "Retry Delete for Everyone",
"message": "Herkesten Silmeyi Tekrar Dene",
"description": "Shown on the drop-down menu for an individual message, but only if a previous delete for everyone failed to send"
},
"forwardMessage": {
@ -2050,7 +2050,7 @@
"description": "Shown on outgoing message if it fails to send"
},
"deleteFailed": {
"message": "Delete failed",
"message": "Silme başarısız",
"description": "Shown on a message which was deleted for everyone if the delete wasn't successfully sent to anyone"
},
"sendPaused": {
@ -2062,7 +2062,7 @@
"description": "Shown on outgoing message if it is partially sent"
},
"partiallyDeleted": {
"message": "Partially deleted, click to retry",
"message": "Kısmen silindi, tekrar denemek için tıklayın",
"description": "Shown on a message which was deleted for everyone if the delete wasn't successfully sent to everyone"
},
"showMore": {
@ -2406,7 +2406,7 @@
"description": "Shown if request to Signal servers to find username fails"
},
"Toast--failed-to-fetch-phone-number": {
"message": "Failed to fetch phone number. Check your connection and try again.",
"message": "Telefon numarası alınamadı. Bağlantınızı kontrol edip tekrar deneyin.",
"description": "Shown if request to Signal servers to find phone number fails"
},
"startConversation--username-not-found": {
@ -2420,7 +2420,7 @@
}
},
"startConversation--phone-number-not-found": {
"message": "User not found. \"$phoneNumber$\" is not a Signal user.",
"message": "Kullanıcı bulunamadı. \"$phoneNumber$\" bir Signal kullanıcısı değil.",
"description": "Shown in dialog if phone number is not found.",
"placeholders": {
"phoneNumber": {
@ -2430,7 +2430,7 @@
}
},
"startConversation--phone-number-not-valid": {
"message": "User not found. \"$phoneNumber$\" is not a valid phone number.",
"message": "Kullanıcı bulunamadı. \"$phoneNumber$\" geçerli bir telefon numarası değil.",
"description": "Shown in dialog if phone number is not valid.",
"placeholders": {
"phoneNumber": {
@ -4158,7 +4158,7 @@
"description": "Shown if you click a group link and you have been forbidden from joining via the link"
},
"GroupV2--join--link-forbidden": {
"message": "You can't join this group via the group link because an admin removed you.",
"message": "Yönetici tarafından kaldırıldığınız için bu gruba, grup bağlantısı ile katılamazsınız.",
"description": "Shown if you click a group link and you have been forbidden from joining via the link"
},
"GroupV2--join--prompt-with-approval": {
@ -5196,7 +5196,7 @@
}
},
"GroupV2--admin-approval-bounce--one": {
"message": "$joinerName$ requested and cancelled their request to join via the group link",
"message": "$joinerName$, grup bağlantısı aracılığıyla katılma isteğini talep etti ve iptal etti",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"joinerName": {
@ -5206,7 +5206,7 @@
}
},
"GroupV2--admin-approval-bounce": {
"message": "$joinerName$ requested and cancelled $numberOfRequests$ requests to join via the group link",
"message": "$joinerName$, grup bağlantısı aracılığıyla $numberOfRequests$ katılma isteği talep etti ve iptal etti",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"joinerName": {
@ -5796,7 +5796,7 @@
}
},
"PendingRequests--deny-for--with-link": {
"message": "Deny request from \"$name$\"? They will not be able to request to join via the group link again.",
"message": "\"$name$\"den gelen istek reddedilsin mi? Grup bağlantısı üzerinden tekrar katılma talebinde bulunamayacaklar.",
"description": "This is the modal content when confirming denying a group request to join",
"placeholders": {
"name": {
@ -5904,7 +5904,7 @@
"description": "Title of dialog to block a user from requesting to join via the link again"
},
"PendingRequests--block--contents": {
"message": "$name$ will not be able to join or request to join this group via the group link. They can still be added to the group manually.",
"message": "$name$, grup bağlantısı aracılığıyla bu gruba katılamaz veya katılma talebinde bulunamaz. Yine de gruba manuel olarak eklenebilir.",
"description": "Details of dialog to block a user from requesting to join via the link again",
"placeholders": {
"name": {
@ -5914,7 +5914,7 @@
}
},
"PendingRequests--block--confirm": {
"message": "Block Request",
"message": "İsteği Engelle",
"description": "Confirmation button of dialog to block a user from requesting to join via the link again"
},
"AvatarInput--no-photo-label--group": {
@ -6210,7 +6210,7 @@
}
},
"RemoveGroupMemberConfirmation__description__with-link": {
"message": "Remove \"$name$\" from the group? They will not be able to rejoin via the group link.",
"message": "\"$name$\" gruptan kaldırılsın mı? Grup bağlantısı üzerinden tekrar katılamayacaktır.",
"description": "When confirming the removal of a group member, show this text in the dialog",
"placeholders": {
"name": {
@ -6358,11 +6358,11 @@
"description": "Text for an option in Conversation Details Disappearing Messages setting when user previously selected custom time"
},
"DisappearingTimeDialog__label--value": {
"message": "Number",
"message": "Numara",
"description": "aria-label for the number select box"
},
"DisappearingTimeDialog__label--units": {
"message": "Unit of time",
"message": "Zaman birimi",
"description": "aria-label for the units of time select box"
},
"DisappearingTimeDialog__title": {
@ -6812,7 +6812,7 @@
"description": "Second line of the dialog displayed when Windows installer can't close application automatically and needs user intervention to complete the installation."
},
"NSIS__appRunning": {
"message": "$appName$ is running.\nClick OK to close it.\nIf it doesn't close, try closing it manually.",
"message": "$appName$ çalışıyor.\nKapatmak için Tamam'a tıklayın.\nKapanmazsa, manuel olarak kapatmayı deneyin.",
"description": "The contents of a dialog displayed when Windows installer detect that the application is running and asks user to close it. Note: please keep the line breaks so that the text occupies three separate lines",
"placeholders": {
"appName": {
@ -6822,11 +6822,11 @@
}
},
"NSIS__decompressionFailed": {
"message": "Failed to decompress files. Please try running the installer again.",
"message": "Dosyaların sıkıştırmasıılamadı. Lütfen yükleyiciyi yeniden çalıştırmayı deneyin.",
"description": "Displayed when Windows installer cannot decompress application files"
},
"NSIS__uninstallFailed": {
"message": "Failed to uninstall old application files. Please try running the installer again.",
"message": "Eski uygulama dosyaları kaldırılamadı. Lütfen yükleyiciyi yeniden çalıştırmayı deneyin.",
"description": "Displayed when Windows installer cannot uninstall the old application"
},
"CrashReportDialog__title": {
@ -6946,19 +6946,19 @@
"description": "Title for the my stories list"
},
"MyStories__story": {
"message": "Your story",
"message": "Hikayeniz",
"description": "aria-label for each one of your stories"
},
"MyStories__download": {
"message": "Download story",
"message": "Hikayeyi indir",
"description": "aria-label for the download button"
},
"MyStories__more": {
"message": "More options",
"message": "Daha fazla seçenek",
"description": "aria-label for the more button"
},
"MyStories__views--singular": {
"message": "$num$ view",
"message": "$num$ görüntüleme",
"description": "Number of views your story has",
"placeholders": {
"num": {
@ -6968,7 +6968,7 @@
}
},
"MyStories__views--plural": {
"message": "$num$ views",
"message": "$num$ görüntüleme",
"description": "Number of views your story has",
"placeholders": {
"num": {
@ -6978,7 +6978,7 @@
}
},
"MyStories__replies--singular": {
"message": "$num$ reply",
"message": "$num$ yanıt",
"description": "Number of replies your story has",
"placeholders": {
"num": {
@ -6988,7 +6988,7 @@
}
},
"MyStories__replies--plural": {
"message": "$num$ replies",
"message": "$num$ yanıt",
"description": "Number of replies your story has",
"placeholders": {
"num": {
@ -6998,7 +6998,7 @@
}
},
"MyStories__delete": {
"message": "Delete this story? It will also be deleted for everyone who received it.",
"message": "Bu hikaye silinsin mi? Aynı zamanda tüm alıcılardan silinecektir.",
"description": "Confirmation dialog description text for deleting a story"
},
"Stories__title": {
@ -7018,15 +7018,15 @@
"description": "Button label to go to hidden stories pane"
},
"Stories__list-empty": {
"message": "No recent stories to show right now",
"message": "Şu anda gösterilecek yeni hikaye yok",
"description": "Description for when there are no stories to show"
},
"Stories__placeholder--text": {
"message": "Click to view a story",
"message": "Bir hikayeyi görüntülemek için tıkla",
"description": "Placeholder label for the story view"
},
"Stories__from-to-group": {
"message": "$name$ to $group$",
"message": "$group$ grubunda $name$",
"description": "Title for someone sending a story to a group",
"placeholders": {
"name": {
@ -7044,7 +7044,7 @@
"description": "Button label to reply to a story"
},
"StoryViewsNRepliesModal__placeholder": {
"message": "Type a reply...",
"message": "Bir yanıt yaz...",
"description": "Placeholder text for the story reply modal"
},
"StoryViewsNRepliesModal__no-replies": {
@ -7060,19 +7060,19 @@
"description": "Title for replies tab"
},
"StoryViewsNRepliesModal__react": {
"message": "React to story",
"message": "Hikayeye tepki ver",
"description": "aria-label for reaction button"
},
"StoryViewsNRepliesModal__reacted": {
"message": "Reacted to the story",
"message": "Hikayeye tepki verildi",
"description": "Description of someone reacting to a story"
},
"StoryListItem__label": {
"message": "Story",
"message": "Hikaye",
"description": "aria-label for the story list button"
},
"StoryListItem__unhide": {
"message": "Show stories",
"message": "Hikayeleri göster",
"description": "Label for menu item to un-hide the story"
},
"StoryListItem__hide": {
@ -7084,7 +7084,7 @@
"description": "Label for menu item to go to conversation"
},
"StoryListItem__hide-modal--body": {
"message": "Hide story? New story updates from $name$ wont appear at the top of the stories list anymore.",
"message": "Hikaye gizlensin mi? $name$'den yeni hikaye güncellemeleri artık hikaye listesinin başında görünmeyecek.",
"description": "Body for the confirmation dialog for hiding a story"
},
"StoryListItem__hide-modal--confirm": {
@ -7092,7 +7092,7 @@
"description": "Action button for the confirmation dialog to hide a story"
},
"StoryImage__error": {
"message": "Error displaying image",
"message": "Resim görüntülenirken hata",
"description": "aria-label for image errors"
},
"TextAttachment__preview__link": {
@ -7108,11 +7108,11 @@
"description": "Release notes for releases that only include bug fixes"
},
"WhatsNew__v5.40--1": {
"message": "Bug fixes including a fix to an issue that would sometimes make it difficult to click on menus. ",
"message": "Bazen menülere tıklamayı zorlaştıran bir soruna yönelik düzeltme de dahil olmak üzere hata düzeltmeleri içerir.",
"description": "Release notes for v5.40"
},
"WhatsNew__v5.40--2": {
"message": "Thanks to our open source contributors $dsanders11$ and $yusufsahinhamza$ for contributing to these improvements.",
"message": "Bu iyileştirmelere katkıda bulundukları için açık kaynak katılımcılarımız $dsanders11$ ve $yusufsahinhamza$'ya teşekkür ederiz.",
"description": "Release notes for v5.40",
"placeholders": {
"dsanders11": {

View File

@ -4,7 +4,7 @@
"description": "Private messaging from your desktop",
"desktopName": "signal.desktop",
"repository": "https://github.com/signalapp/Signal-Desktop.git",
"version": "5.43.0-beta.1",
"version": "5.43.0",
"license": "AGPL-3.0-only",
"author": {
"name": "Signal Messenger, LLC",
@ -164,7 +164,7 @@
"redux-ts-utils": "3.2.2",
"reselect": "4.1.2",
"rimraf": "2.6.2",
"ringrtc": "https://github.com/signalapp/signal-ringrtc-node.git#ccb71f118a8f8962addc53333730c77b287d7e43",
"ringrtc": "https://github.com/signalapp/signal-ringrtc-node.git#89a47c3ae7730fa8e08accc163a201493740e0ef",
"rotating-file-stream": "2.1.5",
"sanitize.css": "11.0.0",
"semver": "5.4.1",
@ -264,7 +264,7 @@
"cross-env": "5.2.0",
"css-loader": "3.2.0",
"debug": "4.3.3",
"electron": "18.1.0",
"electron": "18.2.2",
"electron-builder": "23.0.8",
"electron-mocha": "11.0.2",
"electron-notarize": "1.2.1",

View File

@ -3435,7 +3435,6 @@ export async function startApp(): Promise<void> {
const { source, sourceUuid, timestamp } = ev;
log.info(`view once open sync ${source} ${timestamp}`);
strictAssert(source, 'ViewOnceOpen without source');
strictAssert(sourceUuid, 'ViewOnceOpen without sourceUuid');
strictAssert(timestamp, 'ViewOnceOpen without timestamp');

View File

@ -533,6 +533,7 @@ const useProps = (overrideProps: Partial<PropsType> = {}): PropsType => ({
overrideProps.isIncomingMessageRequest === true
),
items: overrideProps.items || Object.keys(items),
messageChangeCounter: 0,
scrollToIndex: overrideProps.scrollToIndex,
scrollToIndexCounter: 0,
totalUnseen: number('totalUnseen', overrideProps.totalUnseen || 0),

View File

@ -33,12 +33,12 @@ import type { PropsType as SmartContactSpoofingReviewDialogPropsType } from '../
import type { GroupNameCollisionsWithIdsByTitle } from '../../util/groupMemberNameCollisions';
import { hasUnacknowledgedCollisions } from '../../util/groupMemberNameCollisions';
import { TimelineFloatingHeader } from './TimelineFloatingHeader';
import type { TimelineMessageLoadingState } from '../../util/timelineUtil';
import {
ScrollAnchor,
UnreadIndicatorPlacement,
getScrollAnchorBeforeUpdate,
getWidthBreakpoint,
ScrollAnchor,
TimelineMessageLoadingState,
UnreadIndicatorPlacement,
} from '../../util/timelineUtil';
import {
getScrollBottom,
@ -53,6 +53,7 @@ const AT_BOTTOM_DETECTOR_STYLE = { height: AT_BOTTOM_THRESHOLD };
const MIN_ROW_HEIGHT = 18;
const SCROLL_DOWN_BUTTON_THRESHOLD = 8;
const LOAD_NEWER_THRESHOLD = 5;
export type WarningType =
| {
@ -85,6 +86,7 @@ export type ContactSpoofingReviewPropType =
export type PropsDataType = {
haveNewest: boolean;
haveOldest: boolean;
messageChangeCounter: number;
messageLoadingState?: TimelineMessageLoadingState;
isNearBottom?: boolean;
items: ReadonlyArray<string>;
@ -109,7 +111,13 @@ type PropsHousekeepingType = {
contactSpoofingReview?: ContactSpoofingReviewPropType;
discardMessages: (
_: Readonly<{ conversationId: string; numberToKeepAtBottom: number }>
_: Readonly<
| {
conversationId: string;
numberToKeepAtBottom: number;
}
| { conversationId: string; numberToKeepAtTop: number }
>
) => void;
getTimestampForMessage: (messageId: string) => undefined | number;
getPreferredBadge: PreferredBadgeSelectorType;
@ -487,10 +495,15 @@ export class Timeline extends React.Component<
if (newestBottomVisibleMessageId) {
this.markNewestBottomVisibleMessageRead();
const rowIndex = getRowIndexFromElement(newestBottomVisible);
const maxRowIndex = items.length - 1;
if (
!messageLoadingState &&
!haveNewest &&
newestBottomVisibleMessageId === last(items)
isNumber(rowIndex) &&
maxRowIndex >= 0 &&
rowIndex >= maxRowIndex - LOAD_NEWER_THRESHOLD
) {
loadNewerMessages(newestBottomVisibleMessageId);
}
@ -633,8 +646,18 @@ export class Timeline extends React.Component<
_prevState: Readonly<StateType>,
snapshot: Readonly<SnapshotType>
): void {
const { items: oldItems } = prevProps;
const { discardMessages, id, items: newItems } = this.props;
const {
items: oldItems,
messageChangeCounter: previousMessageChangeCounter,
messageLoadingState: previousMessageLoadingState,
} = prevProps;
const {
discardMessages,
id,
items: newItems,
messageChangeCounter,
messageLoadingState,
} = this.props;
const containerEl = this.containerRef.current;
if (containerEl && snapshot) {
@ -662,15 +685,37 @@ export class Timeline extends React.Component<
this.updateIntersectionObserver();
// This condition is somewhat arbitrary.
const numberToKeepAtBottom = this.maxVisibleRows * 2;
const shouldDiscardOlderMessages: boolean =
this.isAtBottom() && newItems.length >= this.maxVisibleRows * 1.5;
this.isAtBottom() && newItems.length > numberToKeepAtBottom;
if (shouldDiscardOlderMessages) {
discardMessages({
conversationId: id,
numberToKeepAtBottom: this.maxVisibleRows,
numberToKeepAtBottom,
});
}
} else {
const loadingStateThatJustFinished:
| undefined
| TimelineMessageLoadingState =
!messageLoadingState && previousMessageLoadingState
? previousMessageLoadingState
: undefined;
const numberToKeepAtTop = this.maxVisibleRows * 5;
const shouldDiscardNewerMessages: boolean =
!this.isAtBottom() &&
loadingStateThatJustFinished ===
TimelineMessageLoadingState.LoadingOlderMessages &&
newItems.length > numberToKeepAtTop;
if (shouldDiscardNewerMessages) {
discardMessages({
conversationId: id,
numberToKeepAtTop,
});
}
}
if (previousMessageChangeCounter !== messageChangeCounter) {
this.markNewestBottomVisibleMessageRead();
}
}
@ -1195,6 +1240,14 @@ function getMessageIdFromElement(
return element instanceof HTMLElement ? element.dataset.messageId : undefined;
}
function getRowIndexFromElement(
element: undefined | Element
): undefined | number {
return element instanceof HTMLElement && element.dataset.itemIndex
? parseInt(element.dataset.itemIndex, 10)
: undefined;
}
function showDebugLog() {
window.showDebugLog();
}

View File

@ -93,7 +93,7 @@ export abstract class JobQueue<T> {
* takes a single number, `parseData` should throw if `data` is a number and should
* return the number otherwise.
*
* If it throws, the job will be deleted from the store and the job will not be run.
* If it throws, the job will be deleted from the database and the job will not be run.
*
* Will only be called once per job, even if `maxAttempts > 1`.
*/
@ -205,9 +205,10 @@ export abstract class JobQueue<T> {
parsedData = this.parseData(storedJob.data);
} catch (err) {
log.error(
`${this.logPrefix} failed to parse data for job ${storedJob.id}`,
`${this.logPrefix} failed to parse data for job ${storedJob.id}, created ${storedJob.timestamp}. Deleting job. Parse error:`,
Errors.toLogFormat(err)
);
await this.store.delete(storedJob.id);
reject(
new Error(
'Failed to parse job data. Was unexpected data loaded from the database?'

View File

@ -7,7 +7,7 @@ import * as Errors from '../../types/errors';
import type { MessageModel } from '../../models/messages';
import { getMessageById } from '../../messages/getMessageById';
import type { ConversationModel } from '../../models/conversations';
import { isGroupV2, isMe } from '../../util/whatTypeOfConversation';
import { isGroup, isGroupV2, isMe } from '../../util/whatTypeOfConversation';
import { getSendOptions } from '../../util/getSendOptions';
import { SignalService as Proto } from '../../protobuf';
import { handleMessageSend } from '../../util/handleMessageSend';
@ -148,6 +148,15 @@ export async function sendNormalMessage(
let messageSendPromise: Promise<CallbackResultType | void>;
if (recipientIdentifiersWithoutMe.length === 0) {
if (!isMe(conversation.attributes) && !isGroup(conversation.attributes)) {
log.info(
'No recipients, but we are not sending to ourselves or to group. Failing job.'
);
markMessageFailed(message, [new Error('No valid recipients')]);
return;
}
// We're sending to Note to Self or a 'lonely group' with just us in it
log.info('sending sync message only');
const dataMessage = await window.textsecure.messaging.getDataMessage({
attachments,

View File

@ -80,6 +80,7 @@ import type { NoopActionType } from './noop';
import { conversationJobQueue } from '../../jobs/conversationJobQueue';
import type { TimelineMessageLoadingState } from '../../util/timelineUtil';
import { isGroup } from '../../util/whatTypeOfConversation';
import { missingCaseError } from '../../util/missingCaseError';
// State
@ -243,6 +244,7 @@ export type MessageLookupType = {
};
export type ConversationMessageType = {
isNearBottom?: boolean;
messageChangeCounter: number;
messageIds: Array<string>;
messageLoadingState?: undefined | TimelineMessageLoadingState;
metrics: MessageMetricsType;
@ -465,7 +467,13 @@ type CustomColorRemovedActionType = {
};
type DiscardMessagesActionType = {
type: typeof DISCARD_MESSAGES;
payload: { conversationId: string; numberToKeepAtBottom: number };
payload: Readonly<
| {
conversationId: string;
numberToKeepAtBottom: number;
}
| { conversationId: string; numberToKeepAtTop: number }
>;
};
type SetPreJoinConversationActionType = {
type: 'SET_PRE_JOIN_CONVERSATION';
@ -2195,35 +2203,70 @@ export function reducer(
}
if (action.type === DISCARD_MESSAGES) {
const { conversationId, numberToKeepAtBottom } = action.payload;
const { conversationId } = action.payload;
if ('numberToKeepAtBottom' in action.payload) {
const { numberToKeepAtBottom } = action.payload;
const conversationMessages = getOwn(
state.messagesByConversation,
conversationId
);
if (!conversationMessages) {
return state;
}
const conversationMessages = getOwn(
state.messagesByConversation,
conversationId
);
if (!conversationMessages) {
return state;
}
const { messageIds: oldMessageIds } = conversationMessages;
if (oldMessageIds.length <= numberToKeepAtBottom) {
return state;
}
const { messageIds: oldMessageIds } = conversationMessages;
if (oldMessageIds.length <= numberToKeepAtBottom) {
return state;
}
const messageIdsToRemove = oldMessageIds.slice(0, -numberToKeepAtBottom);
const messageIdsToKeep = oldMessageIds.slice(-numberToKeepAtBottom);
const messageIdsToRemove = oldMessageIds.slice(0, -numberToKeepAtBottom);
const messageIdsToKeep = oldMessageIds.slice(-numberToKeepAtBottom);
return {
...state,
messagesLookup: omit(state.messagesLookup, messageIdsToRemove),
messagesByConversation: {
...state.messagesByConversation,
[conversationId]: {
...conversationMessages,
messageIds: messageIdsToKeep,
return {
...state,
messagesLookup: omit(state.messagesLookup, messageIdsToRemove),
messagesByConversation: {
...state.messagesByConversation,
[conversationId]: {
...conversationMessages,
messageIds: messageIdsToKeep,
},
},
},
};
};
}
if ('numberToKeepAtTop' in action.payload) {
const { numberToKeepAtTop } = action.payload;
const conversationMessages = getOwn(
state.messagesByConversation,
conversationId
);
if (!conversationMessages) {
return state;
}
const { messageIds: oldMessageIds } = conversationMessages;
if (oldMessageIds.length <= numberToKeepAtTop) {
return state;
}
const messageIdsToRemove = oldMessageIds.slice(numberToKeepAtTop);
const messageIdsToKeep = oldMessageIds.slice(0, numberToKeepAtTop);
return {
...state,
messagesLookup: omit(state.messagesLookup, messageIdsToRemove),
messagesByConversation: {
...state.messagesByConversation,
[conversationId]: {
...conversationMessages,
messageIds: messageIdsToKeep,
},
},
};
}
throw missingCaseError(action.payload);
}
if (action.type === 'SET_PRE_JOIN_CONVERSATION') {
@ -2460,8 +2503,18 @@ export function reducer(
return state;
}
const toIncrement = data.reactions?.length ? 1 : 0;
return {
...state,
messagesByConversation: {
...state.messagesByConversation,
[conversationId]: {
...existingConversation,
messageChangeCounter:
(existingConversation.messageChangeCounter || 0) + toIncrement,
},
},
messagesLookup: {
...state.messagesLookup,
[id]: {
@ -2540,6 +2593,7 @@ export function reducer(
messagesByConversation: {
...messagesByConversation,
[conversationId]: {
messageChangeCounter: 0,
scrollToMessageId,
scrollToMessageCounter: existingConversation
? existingConversation.scrollToMessageCounter + 1

View File

@ -828,6 +828,7 @@ export function _conversationMessagesSelector(
): TimelinePropsType {
const {
isNearBottom,
messageChangeCounter,
messageIds,
messageLoadingState,
metrics,
@ -860,6 +861,7 @@ export function _conversationMessagesSelector(
haveOldest,
isNearBottom,
items,
messageChangeCounter,
messageLoadingState,
oldestUnseenIndex:
isNumber(oldestUnseenIndex) && oldestUnseenIndex >= 0
@ -899,6 +901,7 @@ export const getConversationMessagesSelector = createSelector(
return {
haveNewest: false,
haveOldest: false,
messageChangeCounter: 0,
messageLoadingState: TimelineMessageLoadingState.DoingInitialLoad,
scrollToIndexCounter: 0,
totalUnseen: 0,

View File

@ -54,21 +54,23 @@ const {
closeRecommendedGroupSizeModal,
conversationStoppedByMissingVerification,
createGroup,
discardMessages,
messageChanged,
openConversationInternal,
repairNewestMessage,
repairOldestMessage,
resetAllChatColors,
reviewGroupMemberNameCollision,
reviewMessageRequestNameCollision,
setComposeGroupAvatar,
setComposeGroupName,
setComposeSearchTerm,
setPreJoinConversation,
showArchivedConversations,
showChooseGroupMembers,
showInbox,
startComposing,
showChooseGroupMembers,
startSettingGroupMetadata,
resetAllChatColors,
reviewGroupMemberNameCollision,
reviewMessageRequestNameCollision,
toggleConversationInChooseMembers,
} = actions;
@ -316,7 +318,7 @@ describe('both/state/ducks/conversations', () => {
function getDefaultMessage(id: string): MessageType {
return {
attachments: [],
conversationId: 'conversationId',
conversationId,
id,
received_at: previousTime,
sent_at: previousTime,
@ -330,6 +332,7 @@ describe('both/state/ducks/conversations', () => {
function getDefaultConversationMessage(): ConversationMessageType {
return {
messageChangeCounter: 0,
messageIds: [],
metrics: {
totalUnseen: 0,
@ -1306,6 +1309,53 @@ describe('both/state/ducks/conversations', () => {
});
});
describe('DISCARD_MESSAGES', () => {
const startState: ConversationsStateType = {
...getEmptyState(),
messagesLookup: {
[messageId]: getDefaultMessage(messageId),
[messageIdTwo]: getDefaultMessage(messageIdTwo),
[messageIdThree]: getDefaultMessage(messageIdThree),
},
messagesByConversation: {
[conversationId]: {
messageChangeCounter: 0,
metrics: {
totalUnseen: 0,
},
scrollToMessageCounter: 0,
messageIds: [messageId, messageIdTwo, messageIdThree],
},
},
};
it('eliminates older messages', () => {
const toDiscard = {
conversationId,
numberToKeepAtBottom: 2,
};
const state = reducer(startState, discardMessages(toDiscard));
assert.deepEqual(
state.messagesByConversation[conversationId]?.messageIds,
[messageIdTwo, messageIdThree]
);
});
it('eliminates newer messages', () => {
const toDiscard = {
conversationId,
numberToKeepAtTop: 2,
};
const state = reducer(startState, discardMessages(toDiscard));
assert.deepEqual(
state.messagesByConversation[conversationId]?.messageIds,
[messageId, messageIdTwo]
);
});
});
describe('SET_PRE_JOIN_CONVERSATION', () => {
const startState = {
...getEmptyState(),
@ -1340,6 +1390,139 @@ describe('both/state/ducks/conversations', () => {
});
});
describe('MESSAGE_CHANGED', () => {
const startState: ConversationsStateType = {
...getEmptyState(),
conversationLookup: {
[conversationId]: {
...getDefaultConversation(),
id: conversationId,
groupVersion: 2,
groupId: 'dGhpc2lzYWdyb3VwaWR0aGlzaXNhZ3JvdXBpZHRoaXM=',
},
},
messagesByConversation: {
[conversationId]: {
messageChangeCounter: 0,
messageIds: [messageId, messageIdTwo, messageIdThree],
metrics: {
totalUnseen: 0,
},
scrollToMessageCounter: 0,
},
},
messagesLookup: {
[messageId]: {
...getDefaultMessage(messageId),
displayLimit: undefined,
},
[messageIdTwo]: {
...getDefaultMessage(messageIdTwo),
displayLimit: undefined,
},
[messageIdThree]: {
...getDefaultMessage(messageIdThree),
displayLimit: undefined,
},
},
};
const changedMessage = {
...getDefaultMessage(messageId),
body: 'changed',
displayLimit: undefined,
};
it('updates message data', () => {
const state = reducer(
startState,
messageChanged(messageId, conversationId, changedMessage)
);
assert.deepEqual(state.messagesLookup[messageId], changedMessage);
assert.strictEqual(
state.messagesByConversation[conversationId]?.messageChangeCounter,
0
);
});
it('does not update lookup if it is a story reply', () => {
const state = reducer(
startState,
messageChanged(messageId, conversationId, {
...changedMessage,
storyId: 'story-id',
})
);
assert.deepEqual(
state.messagesLookup[messageId],
startState.messagesLookup[messageId]
);
assert.strictEqual(
state.messagesByConversation[conversationId]?.messageChangeCounter,
0
);
});
it('increments message change counter if new message has reactions', () => {
const changedMessageWithReaction: MessageType = {
...changedMessage,
reactions: [
{
emoji: '🎁',
fromId: 'some-other-id',
timestamp: 2222,
targetTimestamp: 1111,
targetAuthorUuid: 'author-uuid',
},
],
};
const state = reducer(
startState,
messageChanged(messageId, conversationId, changedMessageWithReaction)
);
assert.deepEqual(
state.messagesLookup[messageId],
changedMessageWithReaction
);
assert.strictEqual(
state.messagesByConversation[conversationId]?.messageChangeCounter,
1
);
});
it('does not increment message change counter if only old message had reactions', () => {
const updatedStartState = {
...startState,
messagesLookup: {
[messageId]: {
...startState.messagesLookup[messageId],
reactions: [
{
emoji: '🎁',
fromId: 'some-other-id',
timestamp: 2222,
targetTimestamp: 1111,
targetAuthorUuid: 'author-uuid',
},
],
},
},
};
const state = reducer(
updatedStartState,
messageChanged(messageId, conversationId, changedMessage)
);
assert.deepEqual(state.messagesLookup[messageId], changedMessage);
assert.strictEqual(
state.messagesByConversation[conversationId]?.messageChangeCounter,
0
);
});
});
describe('SHOW_ARCHIVED_CONVERSATIONS', () => {
it('is a no-op when already at the archive', () => {
const state = {

View File

@ -513,7 +513,7 @@ describe('JobQueue', () => {
sinon.assert.calledWithMatch(run, { data: 'valid' });
});
it('keeps jobs in the storage if parseData throws', async () => {
it('deletes jobs from storage if parseData throws', async () => {
const store = new TestJobQueueStore();
class TestQueue extends JobQueue<string> {
@ -539,9 +539,10 @@ describe('JobQueue', () => {
await (await queue.add('invalid 1')).completion.catch(noop);
await (await queue.add('invalid 2')).completion.catch(noop);
await queue.add('valid');
const datas = store.storedJobs.map(job => job.data);
assert.sameMembers(datas, ['invalid 1', 'invalid 2']);
assert.sameMembers(datas, ['valid']);
});
it('adding the job resolves AFTER inserting the job into the database', async () => {

View File

@ -6183,10 +6183,10 @@ electron-window@^0.8.0:
dependencies:
is-electron-renderer "^2.0.0"
electron@18.1.0:
version "18.1.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-18.1.0.tgz#d92b76f301af1a8728adff8d6eeb42382e218fe8"
integrity sha512-P55wdHNTRMo7a/agC84ZEZDYEK/pTBcQdlp8lFbHcx3mO4Kr+Im/J5p2uQgiuXtown31HqNh2paL3V0p+E6rpQ==
electron@18.2.2:
version "18.2.2"
resolved "https://registry.yarnpkg.com/electron/-/electron-18.2.2.tgz#5b1cd0efb14302fe3b658ec88f5624c1e9c3e1b4"
integrity sha512-o9/9+ntxZ0RoVtllH1e9FDLiCLVg00EO8AJZoCR1cVt7l7AVpRgynZdSczaUtTb9XJpWv7U02R6hoWALl55opQ==
dependencies:
"@electron/get" "^1.13.0"
"@types/node" "^16.11.26"
@ -13356,9 +13356,9 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
"ringrtc@https://github.com/signalapp/signal-ringrtc-node.git#ccb71f118a8f8962addc53333730c77b287d7e43":
version "2.20.4"
resolved "https://github.com/signalapp/signal-ringrtc-node.git#ccb71f118a8f8962addc53333730c77b287d7e43"
"ringrtc@https://github.com/signalapp/signal-ringrtc-node.git#89a47c3ae7730fa8e08accc163a201493740e0ef":
version "2.20.5"
resolved "https://github.com/signalapp/signal-ringrtc-node.git#89a47c3ae7730fa8e08accc163a201493740e0ef"
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.1"